diff --git a/.autom4te.cfg b/.autom4te.cfg index 3872ddb4400..d386cef175a 100644 --- a/.autom4te.cfg +++ b/.autom4te.cfg @@ -3,7 +3,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/.gitattributes b/.gitattributes index b03dddfc95d..7e37bf00fee 100644 --- a/.gitattributes +++ b/.gitattributes @@ -72,7 +72,6 @@ hl/tools/gif2h5/testfiles/ex_image2.h5 -text hl/tools/gif2h5/testfiles/h52giftst.h5 -text hl/tools/gif2h5/testfiles/image1.gif -text java/CMakeLists.txt -text -java/COPYING -text java/Makefile.am -text java/examples/CMakeLists.txt -text java/examples/Makefile.am -text diff --git a/.github/workflows/abi-report.yml b/.github/workflows/abi-report.yml index 5faa1f297b2..2fa63d1bd0d 100644 --- a/.github/workflows/abi-report.yml +++ b/.github/workflows/abi-report.yml @@ -51,7 +51,7 @@ jobs: - name: Get published binary (Linux) uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: tgz-ubuntu-2204_gcc-binary + name: tgz-ubuntu-2404_gcc-binary path: ${{ github.workspace }} - name: List files for the space (Linux) @@ -59,7 +59,7 @@ jobs: ls -l ${{ github.workspace }} - name: Uncompress gh binary (Linux) - run: tar -zxvf ${{ github.workspace }}/${{ inputs.file_base }}-ubuntu-2204_gcc.tar.gz + run: tar -zxvf ${{ github.workspace }}/${{ inputs.file_base }}-ubuntu-2404_gcc.tar.gz - name: Uncompress hdf5 binary (Linux) run: | @@ -84,8 +84,8 @@ jobs: run: | mkdir "${{ github.workspace }}/hdf5R" cd "${{ github.workspace }}/hdf5R" - wget -q https://github.com/HDFGroup/hdf5/releases/download/hdf5_${{ inputs.file_ref }}/hdf5-${{ steps.convert-hdf5lib-refname.outputs.HDF5R_DOTS }}-ubuntu-2204_gcc.tar.gz - tar zxf hdf5-${{ steps.convert-hdf5lib-refname.outputs.HDF5R_DOTS }}-ubuntu-2204_gcc.tar.gz + wget -q https://github.com/HDFGroup/hdf5/releases/download/hdf5_${{ inputs.file_ref }}/hdf5-${{ steps.convert-hdf5lib-refname.outputs.HDF5R_DOTS }}-ubuntu-2404_gcc.tar.gz + tar zxf hdf5-${{ steps.convert-hdf5lib-refname.outputs.HDF5R_DOTS }}-ubuntu-2404_gcc.tar.gz - name: List files for the space (Linux) run: | diff --git a/.github/workflows/autotools.yml b/.github/workflows/autotools.yml index a202076005a..f32c4bce759 100644 --- a/.github/workflows/autotools.yml +++ b/.github/workflows/autotools.yml @@ -12,7 +12,7 @@ on: - 'doc/**' - 'release_docs/**' - 'ACKNOWLEDGEMENTS' - - 'COPYING**' + - 'LICENSE**' - '**.md' # Using concurrency to cancel any in-progress job or run @@ -90,21 +90,15 @@ jobs: with: build_mode: "production" - call-release-auto-cygwin: - name: "Autotools Cygwin Workflows" - uses: ./.github/workflows/cygwin-auto.yml - with: - build_mode: "production" - call-release-auto-xpr: name: "Autotools TestExpress Workflows" uses: ./.github/workflows/testxpr-auto.yml - call-release-auto-julia: - name: "Autotools Julia Workflows" - uses: ./.github/workflows/julia-auto.yml - with: - build_mode: "production" +# call-release-auto-julia: +# name: "Autotools Julia Workflows" +# uses: ./.github/workflows/julia-auto.yml +# with: +# build_mode: "production" # workflow-msys2-autotools: # name: "CMake msys2 Workflows" diff --git a/.github/workflows/build_mpich_source.yml b/.github/workflows/build_mpich_source.yml new file mode 100644 index 00000000000..422bd43502f --- /dev/null +++ b/.github/workflows/build_mpich_source.yml @@ -0,0 +1,95 @@ +# Build MPICH from source using the latest commit on the +# 'main' branch and cache the results. The result is compressed +# into a 'mpich.tar' archive to preserve permissions and +# then is uploaded as the artifact 'mpich' which can later +# be downloaded with 'actions/download-artifact' and then +# uncompressed with 'tar xvf mpich.tar -C ' + +# Triggers the workflow on a call from another workflow +on: + workflow_call: + inputs: + build_mode: + description: "Release vs. Debug build" + required: true + type: string + +permissions: + contents: read + +jobs: + ubuntu_gcc_build_and_test: + name: "Build MPICH ${{ inputs.build_mode }} (GCC)" + + runs-on: ubuntu-latest + + steps: + - name: Install Linux dependencies + run: | + sudo apt-get update + sudo apt-get install build-essential libtool libtool-bin + + - name: Get MPICH source + uses: actions/checkout@v4.1.7 + with: + repository: 'pmodels/mpich' + path: 'mpich' + submodules: recursive + + - name: Get MPICH commit hash + shell: bash + id: get-sha + run: | + cd $GITHUB_WORKSPACE/mpich + export MPICH_SHA=$(git rev-parse HEAD) + echo "MPICH_SHA=$MPICH_SHA" >> $GITHUB_ENV + echo "sha=$MPICH_SHA" >> $GITHUB_OUTPUT + # Output SHA for debugging + echo "MPICH_SHA=$MPICH_SHA" + + - name: Cache MPICH (GCC) installation + id: cache-mpich-ubuntu-gcc + uses: actions/cache@v4 + with: + path: ${{ runner.workspace }}/mpich + key: ${{ runner.os }}-${{ runner.arch }}-gcc-mpich-${{ steps.get-sha.outputs.sha }}-${{ inputs.build_mode }} + + # Enable threads=multiple for testing with Subfiling and + # VOL connectors that require MPI_THREAD_MULTIPLE + - name: Install MPICH (GCC) (Release) + if: ${{ steps.cache-mpich-ubuntu-gcc.outputs.cache-hit != 'true' && (inputs.build_mode == 'Release') }} + run: | + cd $GITHUB_WORKSPACE/mpich + ./autogen.sh + ./configure \ + CC=gcc \ + --prefix=${{ runner.workspace }}/mpich \ + --enable-threads=multiple + make -j2 + make install + + # Enable threads=multiple for testing with Subfiling and + # VOL connectors that require MPI_THREAD_MULTIPLE + - name: Install MPICH (GCC) (Debug) + if: ${{ steps.cache-mpich-ubuntu-gcc.outputs.cache-hit != 'true' && (inputs.build_mode == 'Debug') }} + run: | + cd $GITHUB_WORKSPACE/mpich + ./autogen.sh + ./configure \ + CC=gcc \ + --prefix=${{ runner.workspace }}/mpich \ + --enable-g=most \ + --enable-debuginfo \ + --enable-threads=multiple + make -j2 + make install + + - name: Tar MPICH installation to preserve permissions for artifact + run: tar -cvf mpich.tar -C ${{ runner.workspace }} mpich + + - name: Save MPICH installation artifact + uses: actions/upload-artifact@v4 + with: + name: mpich + path: mpich.tar + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` diff --git a/.github/workflows/build_openmpi_source.yml b/.github/workflows/build_openmpi_source.yml new file mode 100644 index 00000000000..0e144a0f300 --- /dev/null +++ b/.github/workflows/build_openmpi_source.yml @@ -0,0 +1,88 @@ +# Build OpenMPI from source using the latest commit on the +# 'main' branch and cache the results. The result is compressed +# into a 'openmpi.tar' archive to preserve permissions and +# then is uploaded as the artifact 'openmpi' which can later +# be downloaded with 'actions/download-artifact' and then +# uncompressed with 'tar xvf openmpi.tar -C ' + +# Triggers the workflow on a call from another workflow +on: + workflow_call: + inputs: + build_mode: + description: "Release vs. Debug build" + required: true + type: string + +permissions: + contents: read + +jobs: + ubuntu_gcc_build_and_test: + name: "Build OpenMPI ${{ inputs.build_mode }} (GCC)" + + runs-on: ubuntu-latest + + steps: + - name: Install Linux dependencies + run: | + sudo apt-get update + sudo apt-get install build-essential libtool libtool-bin + + - name: Get OpenMPI source + uses: actions/checkout@v4.1.7 + with: + repository: 'open-mpi/ompi' + path: 'ompi' + submodules: recursive + + - name: Get OpenMPI commit hash + shell: bash + id: get-sha + run: | + cd $GITHUB_WORKSPACE/ompi + export OPENMPI_SHA=$(git rev-parse HEAD) + echo "OPENMPI_SHA=$OPENMPI_SHA" >> $GITHUB_ENV + echo "sha=$OPENMPI_SHA" >> $GITHUB_OUTPUT + # Output SHA for debugging + echo "OPENMPI_SHA=$OPENMPI_SHA" + + - name: Cache OpenMPI (GCC) installation + id: cache-openmpi-ubuntu-gcc + uses: actions/cache@v4 + with: + path: ${{ runner.workspace }}/openmpi + key: ${{ runner.os }}-${{ runner.arch }}-gcc-openmpi-${{ steps.get-sha.outputs.sha }}-${{ inputs.build_mode }} + + - name: Install OpenMPI (GCC) (Release) + if: ${{ steps.cache-openmpi-ubuntu-gcc.outputs.cache-hit != 'true' && (inputs.build_mode == 'Release') }} + run: | + cd $GITHUB_WORKSPACE/ompi + ./autogen.pl + ./configure \ + CC=gcc \ + --prefix=${{ runner.workspace }}/openmpi + make -j2 + make install + + - name: Install OpenMPI (GCC) (Debug) + if: ${{ steps.cache-openmpi-ubuntu-gcc.outputs.cache-hit != 'true' && (inputs.build_mode == 'Debug') }} + run: | + cd $GITHUB_WORKSPACE/ompi + ./autogen.pl + ./configure \ + CC=gcc \ + --prefix=${{ runner.workspace }}/openmpi \ + --enable-debug + make -j2 + make install + + - name: Tar OpenMPI installation to preserve permissions for artifact + run: tar -cvf openmpi.tar -C ${{ runner.workspace }} openmpi + + - name: Save OpenMPI installation artifact + uses: actions/upload-artifact@v4 + with: + name: openmpi + path: openmpi.tar + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` diff --git a/.github/workflows/cmake-analysis.yml b/.github/workflows/cmake-analysis.yml new file mode 100644 index 00000000000..aeddcc245a5 --- /dev/null +++ b/.github/workflows/cmake-analysis.yml @@ -0,0 +1,419 @@ +name: hdf5 dev ctest analysis runs + +# Triggers the workflow on a call from another workflow +on: + workflow_call: + inputs: + snap_name: + description: 'The name in the source tarballs' + type: string + required: false + default: hdfsrc + file_base: + description: "The common base name of the source tarballs" + required: true + type: string + use_environ: + description: 'Environment to locate files' + type: string + required: true + default: snapshots + +permissions: + contents: read + +jobs: + coverage_test_linux_GCC: + # Linux (Ubuntu) w/ gcc + coverage + # + name: "Ubuntu GCC Coverage" + runs-on: ubuntu-latest + steps: + - name: Install CMake Dependencies (Linux_coverage) + run: | + sudo apt update + sudo apt-get install ninja-build doxygen graphviz curl libncurses5 build-essential + sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt-get install lcov -q -y + + - name: Set file base name (Linux_coverage) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + + # Get files created by release script + - name: Get tgz-tarball (Linux_coverage) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (Linux_coverage) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (Linux_coverage) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (Linux_coverage) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (Linux_coverage) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (Linux_coverage) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (LOCAL_COVERAGE_TEST "TRUE") + set (LOCAL_USE_GCOV "TRUE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_STATIC_LIBS:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_COVERAGE:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCODE_COVERAGE:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_PACK_EXAMPLES:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_PACKAGE_EXTLIBS:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_NO_PACKAGES:BOOL=ON") + + - name: Run ctest (Linux_coverage) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=${{ github.event.repository.full_name }}_COV,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Debug -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (Linux_coverage) + uses: actions/upload-artifact@v4 + with: + name: clang-coverage-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` + + build_and_test_linux_LeakSanitizer: + # Linux (Ubuntu) w/ clang + LeakSanitizer + # + name: "Ubuntu Clang LeakSanitizer" + runs-on: ubuntu-latest + steps: + - name: Install CMake Dependencies (Linux_Leak) + run: | + sudo apt update + sudo apt-get install ninja-build doxygen graphviz curl libncurses5 + + - name: add clang to env + uses: KyleMayes/install-llvm-action@v2.0.5 + id: setup-clang + with: + env: true + version: '18' + + - name: Set file base name (Linux_Leak) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + + # Get files created by release script + - name: Get tgz-tarball (Linux_Leak) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (Linux_Leak) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (Linux_Leak) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (Linux_Leak) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (Linux_Leak) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (Linux_Leak) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (MODEL "Sanitize") + set (GROUP "Sanitize") + set (LOCAL_MEMCHECK_TEST "TRUE") + set (CTEST_MEMORYCHECK_TYPE "LeakSanitizer") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_STATIC_LIBS:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SANITIZERS:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_USE_SANITIZER:STRING=Leak") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest (Linux_Leak) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=${{ github.event.repository.full_name }}-LEAK,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Debug -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (Linux_Leak) + uses: actions/upload-artifact@v4 + with: + name: leak-ubuntu-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` + + build_and_test_linux_AddressSanitizer: + # Linux (Ubuntu) w/ clang + AddressSanitizer + # + name: "Ubuntu Clang AddressSanitizer" + runs-on: ubuntu-latest + steps: + - name: Install CMake Dependencies (Linux_Address) + run: | + sudo apt update + sudo apt-get install ninja-build doxygen graphviz curl libncurses5 + + - name: add clang to env + uses: KyleMayes/install-llvm-action@v2.0.5 + id: setup-clang + with: + env: true + version: '18' + + - name: Set file base name (Linux_Address) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + + # Get files created by release script + - name: Get tgz-tarball (Linux_Address) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (Linux_Address) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (Linux_Address) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (Linux_Address) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (Linux_Address) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (Linux_Address) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (MODEL "Sanitize") + set (GROUP "Sanitize") + set (LOCAL_MEMCHECK_TEST "TRUE") + set (CTEST_MEMORYCHECK_TYPE "AddressSanitizer") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_STATIC_LIBS:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SANITIZERS:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_USE_SANITIZER:STRING=Address") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest (Linux_Address) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=${{ github.event.repository.full_name }}-ADDR,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Debug -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (Linux_Address) + uses: actions/upload-artifact@v4 + with: + name: address-ubuntu-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` + + build_and_test_linux_UndefinedBehaviorSanitizer: + # Linux (Ubuntu) w/ clang + UndefinedBehaviorSanitizer + # + name: "Ubuntu Clang UndefinedBehaviorSanitizer" + runs-on: ubuntu-latest + steps: + - name: Install CMake Dependencies (Linux_UndefinedBehavior) + run: | + sudo apt update + sudo apt-get install ninja-build doxygen graphviz curl libncurses5 + + - name: add clang to env + uses: KyleMayes/install-llvm-action@v2.0.5 + id: setup-clang + with: + env: true + version: '18' + + - name: Set file base name (Linux_UndefinedBehavior) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + + # Get files created by release script + - name: Get tgz-tarball (Linux_UndefinedBehavior) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (Linux_UndefinedBehavior) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (Linux_UndefinedBehavior) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (Linux_UndefinedBehavior) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (Linux_UndefinedBehavior) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (Linux_UndefinedBehavior) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (MODEL "Sanitize") + set (GROUP "Sanitize") + set (LOCAL_MEMCHECK_TEST "TRUE") + set (CTEST_MEMORYCHECK_TYPE "UndefinedBehaviorSanitizer") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_STATIC_LIBS:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SANITIZERS:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_USE_SANITIZER:STRING=Undefined") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest (Linux_UndefinedBehavior) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=${{ github.event.repository.full_name }}-UNDEF,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Debug -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (Linux_UndefinedBehavior) + uses: actions/upload-artifact@v4 + with: + name: undefined-ubuntu-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` diff --git a/.github/workflows/cmake-bintest.yml b/.github/workflows/cmake-bintest.yml index 3952cf80fa8..df681b4af9c 100644 --- a/.github/workflows/cmake-bintest.yml +++ b/.github/workflows/cmake-bintest.yml @@ -109,7 +109,7 @@ jobs: - name: Get published binary (Linux) uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: tgz-ubuntu-2204_gcc-${{ inputs.build_mode }}-binary + name: tgz-ubuntu-2404_gcc-${{ inputs.build_mode }}-binary path: ${{ github.workspace }} - name: Uncompress hdf5 binary (Linux) diff --git a/.github/workflows/cmake-ctest.yml b/.github/workflows/cmake-ctest.yml index b927b3ce403..cb67868305c 100644 --- a/.github/workflows/cmake-ctest.yml +++ b/.github/workflows/cmake-ctest.yml @@ -149,7 +149,7 @@ jobs: shell: bash - name: Sign files with Trusted Signing - uses: azure/trusted-signing-action@v0.4.0 + uses: azure/trusted-signing-action@v0.5.0 with: azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} @@ -169,8 +169,8 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" mkdir "${{ runner.workspace }}/build/hdf5" - Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING -Destination ${{ runner.workspace }}/build/hdf5/ - Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING_LBNL_HDF5 -Destination ${{ runner.workspace }}/build/hdf5/ + Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE -Destination ${{ runner.workspace }}/build/hdf5/ + Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE_LBNL_HDF5 -Destination ${{ runner.workspace }}/build/hdf5/ Copy-Item -Path ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-MSVC/README.md -Destination ${{ runner.workspace }}/build/hdf5/ Copy-Item -Path ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-MSVC/* -Destination ${{ runner.workspace }}/build/hdf5/ -Include *.zip cd "${{ runner.workspace }}/build" @@ -261,26 +261,26 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" mkdir "${{ runner.workspace }}/build/hdf5" - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING ${{ runner.workspace }}/build/hdf5 - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC/README.md ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC/*.tar.gz ${{ runner.workspace }}/build/hdf5 cd "${{ runner.workspace }}/build" - tar -zcvf ${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.tar.gz hdf5 + tar -zcvf ${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.tar.gz hdf5 shell: bash - name: Publish deb binary (Linux) id: publish-ctest-deb-binary run: | mkdir "${{ runner.workspace }}/builddeb" - cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC/*.deb ${{ runner.workspace }}/builddeb/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.deb + cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC/*.deb ${{ runner.workspace }}/builddeb/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.deb shell: bash - name: Publish rpm binary (Linux) id: publish-ctest-rpm-binary run: | mkdir "${{ runner.workspace }}/buildrpm" - cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC/*.rpm ${{ runner.workspace }}/buildrpm/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.rpm + cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC/*.rpm ${{ runner.workspace }}/buildrpm/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.rpm shell: bash - name: List files in the space (Linux) @@ -292,22 +292,22 @@ jobs: - name: Save published binary (Linux) uses: actions/upload-artifact@v4 with: - name: tgz-ubuntu-2204_gcc-binary - path: ${{ runner.workspace }}/build/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.tar.gz + name: tgz-ubuntu-2404_gcc-binary + path: ${{ runner.workspace }}/build/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.tar.gz if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` - name: Save published binary deb (Linux) uses: actions/upload-artifact@v4 with: - name: deb-ubuntu-2204_gcc-binary - path: ${{ runner.workspace }}/builddeb/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.deb + name: deb-ubuntu-2404_gcc-binary + path: ${{ runner.workspace }}/builddeb/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.deb if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` - name: Save published binary rpm (Linux) uses: actions/upload-artifact@v4 with: - name: rpm-ubuntu-2204_gcc-binary - path: ${{ runner.workspace }}/buildrpm/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.rpm + name: rpm-ubuntu-2404_gcc-binary + path: ${{ runner.workspace }}/buildrpm/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.rpm if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` # Save doxygen files created by ctest script @@ -498,8 +498,8 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" mkdir "${{ runner.workspace }}/build/hdf5" - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING ${{ runner.workspace }}/build/hdf5 - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-macos-Clang/README.md ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-macos-Clang/*.tar.gz ${{ runner.workspace }}/build/hdf5 cd "${{ runner.workspace }}/build" @@ -584,12 +584,12 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" mkdir "${{ runner.workspace }}/build/hdf5" - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING ${{ runner.workspace }}/build/hdf5 - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC-S3/README.md ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-GNUC-S3/*.tar.gz ${{ runner.workspace }}/build/hdf5 cd "${{ runner.workspace }}/build" - tar -zcvf ${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc_s3.tar.gz hdf5 + tar -zcvf ${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc_s3.tar.gz hdf5 shell: bash - name: List files in the space (Linux S3) @@ -601,8 +601,8 @@ jobs: - name: Save published binary (Linux S3) uses: actions/upload-artifact@v4 with: - name: tgz-ubuntu-2204_gcc_s3-binary - path: ${{ runner.workspace }}/build/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc_s3.tar.gz + name: tgz-ubuntu-2404_gcc_s3-binary + path: ${{ runner.workspace }}/build/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc_s3.tar.gz if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` ####### intel builds @@ -689,7 +689,7 @@ jobs: shell: pwsh - name: Sign files with Trusted Signing (Windows_intel) - uses: azure/trusted-signing-action@v0.4.0 + uses: azure/trusted-signing-action@v0.5.0 with: azure-tenant-id: ${{ secrets.AZURE_TENANT_ID }} azure-client-id: ${{ secrets.AZURE_CLIENT_ID }} @@ -709,8 +709,8 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" mkdir "${{ runner.workspace }}/build/hdf5" - Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING -Destination ${{ runner.workspace }}/build/hdf5/ - Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING_LBNL_HDF5 -Destination ${{ runner.workspace }}/build/hdf5/ + Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE -Destination ${{ runner.workspace }}/build/hdf5/ + Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE_LBNL_HDF5 -Destination ${{ runner.workspace }}/build/hdf5/ Copy-Item -Path ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-Intel/README.md -Destination ${{ runner.workspace }}/build/hdf5/ Copy-Item -Path ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-Intel/* -Destination ${{ runner.workspace }}/build/hdf5/ -Include *.zip cd "${{ runner.workspace }}/build" @@ -807,12 +807,12 @@ jobs: run: | mkdir "${{ runner.workspace }}/build" mkdir "${{ runner.workspace }}/build/hdf5" - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING ${{ runner.workspace }}/build/hdf5 - cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/COPYING_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE ${{ runner.workspace }}/build/hdf5 + cp ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/LICENSE_LBNL_HDF5 ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-Intel/README.md ${{ runner.workspace }}/build/hdf5 cp ${{ runner.workspace }}/hdf5/build/${{ inputs.preset_name }}-Intel/*.tar.gz ${{ runner.workspace }}/build/hdf5 cd "${{ runner.workspace }}/build" - tar -zcvf ${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_intel.tar.gz hdf5 + tar -zcvf ${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_intel.tar.gz hdf5 shell: bash - name: List files in the space (Linux_intel) @@ -824,6 +824,6 @@ jobs: - name: Save published binary (Linux_intel) uses: actions/upload-artifact@v4 with: - name: tgz-ubuntu-2204_intel-binary - path: ${{ runner.workspace }}/build/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2204_intel.tar.gz + name: tgz-ubuntu-2404_intel-binary + path: ${{ runner.workspace }}/build/${{ steps.set-file-base.outputs.FILE_BASE }}-ubuntu-2404_intel.tar.gz if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` diff --git a/.github/workflows/cmake-par-script.yml b/.github/workflows/cmake-par-script.yml new file mode 100644 index 00000000000..c47b89e89d9 --- /dev/null +++ b/.github/workflows/cmake-par-script.yml @@ -0,0 +1,372 @@ +name: hdf5 callable parallel report to cdash + +# Triggers hdf5 dev parallel ctest script the workflow on a call from another workflow +on: + workflow_call: + inputs: + snap_name: + description: 'The name in the source tarballs' + type: string + required: false + default: hdfsrc + file_base: + description: "The common base name of the source tarballs" + required: true + type: string + use_environ: + description: 'Environment to locate files' + type: string + required: true + default: snapshots + build_mode: + description: "release vs. debug build" + required: true + type: string + +permissions: + contents: read + +jobs: + CMake_build_parallel_windows: + runs-on: windows-latest + strategy: + matrix: + mpi: [ 'msmpi', 'intelmpi'] + name: "Parallel ${{ matrix.mpi }} Windows-${{ inputs.build_mode }}" + steps: + - uses: actions/checkout@v4.1.7 + + - name: Install Dependencies (Windows) + run: choco install ninja + + - name: Install Dependencies + uses: ssciwr/doxygen-install@v1 + with: + version: "1.9.7" + + - name: Enable Developer Command Prompt + uses: ilammy/msvc-dev-cmd@v1.13.0 + + - name: Setup MPI (${{ matrix.mpi }}) + id: setup-mpi + uses: mpi4py/setup-mpi@v1 + with: + mpi: ${{ matrix.mpi }} + + - name: Set MPI Environment Variables (${{ matrix.mpi }}) + run: | + echo "CC=mpicc" >> $GITHUB_ENV + echo "FC=mpif90" >> $GITHUB_ENV + + - name: Set file base name (${{ matrix.mpi }}) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + shell: bash + + # Get files created by release script + - name: Get zip-tarball (Windows) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: zip-tarball + path: ${{ github.workspace }} + + - name: using powershell + shell: pwsh + run: Get-Location + + - name: List files for the space (Windows) + run: | + Get-ChildItem -Path ${{ github.workspace }} + Get-ChildItem -Path ${{ runner.workspace }} + shell: pwsh + + - name: Uncompress source (Windows) + working-directory: ${{ github.workspace }} + run: 7z x ${{ steps.set-file-base.outputs.FILE_BASE }}.zip + shell: bash + + - name: Copy script files for the space (${{ matrix.mpi }}) + run: | + Copy-Item -Path ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake -Destination ${{ runner.workspace }}/hdf5 + Copy-Item -Path ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake -Destination ${{ runner.workspace }}/hdf5 + shell: pwsh + + - name: List files for the hdf5 (${{ matrix.mpi }}) + run: | + Get-ChildItem -Path ${{ runner.workspace }}/hdf5 + shell: pwsh + + - name: Create options file (${{ matrix.mpi }}) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (ctest_test_args INCLUDE MPI_TEST) + set (CTEST_TEST_TIMEOUT 300 CACHE STRING "Maximum test time allowed.") + set (MODEL "MPI") + set (GROUP "MPI") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }}") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_NUMPROC_FLAG:STRING=-n") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_MAX_NUMPROCS:STRING=2") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PARALLEL:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SUBFILING_VFD:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest script (${{ matrix.mpi }}) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-${{ matrix.mpi }},LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=VS202264,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C ${{ inputs.build_mode }} -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (${{ matrix.mpi }}) + uses: actions/upload-artifact@v4 + with: + name: windows-${{ matrix.mpi }}-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + + CMake_build_parallel_linux: + runs-on: ubuntu-latest + strategy: + matrix: + mpi: [ 'mpich', 'openmpi', 'intelmpi'] + name: "Parallel ${{ matrix.mpi }} Linux-${{ inputs.build_mode }}" + steps: + - name: Install CMake Dependencies (${{ matrix.mpi }}) + run: | + sudo apt-get update + sudo apt-get install ninja-build graphviz curl + sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt install gcc-12 g++-12 gfortran-12 + sudo apt install libaec0 libaec-dev + + - name: Install Dependencies + uses: ssciwr/doxygen-install@v1 + with: + version: "1.9.7" + + - name: Setup MPI (${{ matrix.mpi }}) + id: setup-mpi + uses: mpi4py/setup-mpi@v1 + with: + mpi: ${{ matrix.mpi }} + + - name: Set MPI Environment Variables (${{ matrix.mpi }}) + run: | + echo "CC=mpicc" >> $GITHUB_ENV + echo "FC=mpif90" >> $GITHUB_ENV + + - name: Set file base name (${{ matrix.mpi }}) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + shell: bash + + # Get files created by release script + - name: Get tgz-tarball (${{ matrix.mpi }}) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (Linux) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (Linux) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (${{ matrix.mpi }}) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (${{ matrix.mpi }}) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (${{ matrix.mpi }}) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (ctest_test_args INCLUDE MPI_TEST) + set (CTEST_TEST_TIMEOUT 600 CACHE STRING "Maximum test time allowed.") + set (MODEL "MPI") + set (GROUP "MPI") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }}") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_NUMPROC_FLAG:STRING=-n") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_MAX_NUMPROCS:STRING=2") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PARALLEL:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SUBFILING_VFD:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest script (${{ matrix.mpi }}) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-${{ matrix.mpi }},LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C ${{ inputs.build_mode }} -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (${{ matrix.mpi }}) + uses: actions/upload-artifact@v4 + with: + name: linux-${{ matrix.mpi }}-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + + CMake_build_parallel_intelmpi_macos: + runs-on: macos-latest + strategy: + matrix: + mpi: [ 'mpich', 'openmpi'] + name: "Parallel ${{ matrix.mpi }} macos-${{ inputs.build_mode }}" + steps: + - uses: actions/checkout@v4.1.7 + + - name: Install Dependencies (MacOS_latest) + run: brew install ninja + + - name: Install Dependencies + uses: ssciwr/doxygen-install@v1 + with: + version: "1.9.7" + + - name: Setup MPI (${{ matrix.mpi }}) + id: setup-mpi + uses: mpi4py/setup-mpi@v1 + with: + mpi: ${{ matrix.mpi }} + + - name: Set MPI Environment Variables (${{ matrix.mpi }}) + run: | + echo "CC=mpicc" >> $GITHUB_ENV + echo "FC=mpif90" >> $GITHUB_ENV + + - name: Set file base name (${{ matrix.mpi }}) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + + # Get files created by release script + - name: Get tgz-tarball (${{ matrix.mpi }}) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (${{ matrix.mpi }}) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (${{ matrix.mpi }}) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (${{ matrix.mpi }}) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (${{ matrix.mpi }}) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (${{ matrix.mpi }}) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (ctest_test_args INCLUDE MPI_TEST) + set (CTEST_TEST_TIMEOUT 600 CACHE STRING "Maximum test time allowed.") + set (MODEL "MPI") + set (GROUP "MPI") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }}") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_NUMPROC_FLAG:STRING=-n") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_MAX_NUMPROCS:STRING=2") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PARALLEL:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SUBFILING_VFD:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest script (${{ matrix.mpi }}) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-${{ matrix.mpi }},LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C ${{ inputs.build_mode }} -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (${{ matrix.mpi }}) + uses: actions/upload-artifact@v4 + with: + name: macos-${{ matrix.mpi }}-log + path: ${{ runner.workspace }}/hdf5/hdf5.log diff --git a/.github/workflows/cmake-par-source.yml b/.github/workflows/cmake-par-source.yml new file mode 100644 index 00000000000..04e2cb1764f --- /dev/null +++ b/.github/workflows/cmake-par-source.yml @@ -0,0 +1,268 @@ +name: hdf5 dev parallel from source ctest script runs + +# Triggers the workflow on a call from another workflow +on: + workflow_call: + inputs: + snap_name: + description: 'The name in the source tarballs' + type: string + required: false + default: hdfsrc + file_base: + description: "The common base name of the source tarballs" + required: true + type: string + use_environ: + description: 'Environment to locate files' + type: string + required: true + default: snapshots + build_mode: + description: "release vs. debug build" + required: true + type: string + +permissions: + contents: read + +jobs: + Build_openmpi_source: + name: Build OpenMPI from source + uses: ./.github/workflows/build_openmpi_source.yml + with: + build_mode: ${{ inputs.build_mode }} + + Build_mpich_source: + name: Build MPICH from source + uses: ./.github/workflows/build_mpich_source.yml + with: + build_mode: ${{ inputs.build_mode }} + + CMake_build_parallel_src_openmpi: + needs: Build_openmpi_source + name: "Parallel OpenMPI GCC-${{ inputs.build_mode }}" + runs-on: ubuntu-latest + steps: + - name: Install Linux Dependencies (OpenMPI) + run: | + sudo apt-get update + sudo apt-get install ninja-build + sudo apt install libaec0 libaec-dev + + - name: Get MPI installation (OpenMPI) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: openmpi + + - name: Untar MPI installation (OpenMPI) + run: | + tar xvf openmpi.tar -C ${{ runner.workspace }} + + - name: Set path (OpenMPI) + shell: bash + run: | + echo "${{ runner.workspace }}/openmpi/bin" >> $GITHUB_PATH + echo "LD_LIBRARY_PATH=${{ runner.workspace }}/openmpi/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV + echo "CC=${{ runner.workspace }}/openmpi/bin/mpicc" >> $GITHUB_ENV + echo "FC=${{ runner.workspace }}/openmpi/bin/mpif90" >> $GITHUB_ENV + + - name: Install Doxygen + uses: ssciwr/doxygen-install@v1 + with: + version: "1.9.7" + + - name: Set file base name (OpenMPI) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + + # Get files created by release script + - name: Get tgz-tarball (OpenMPI) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (OpenMPI) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (OpenMPI) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (OpenMPI) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (OpenMPI) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (OpenMPI) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (ctest_test_args INCLUDE MPI_TEST) + set (MODEL "MPI") + set (GROUP "MPI") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_NUMPROC_FLAG:STRING=-n") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_MAX_NUMPROCS:STRING=2") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PARALLEL:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SUBFILING_VFD:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest script (OpenMPI) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-OpenMPI-source,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C ${{ inputs.build_mode }} -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (OpenMPI) + uses: actions/upload-artifact@v4 + with: + name: openmpi-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` + + CMake_build_parallel_src_mpich: + needs: Build_mpich_source + name: "Parallel Mpich GCC-${{ inputs.build_mode }}" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.7 + + - name: Install Linux Dependencies (MPICH) + run: | + sudo apt-get update + sudo apt-get install ninja-build + sudo apt install libaec0 libaec-dev + + - name: Get MPI installation (MPICH) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: mpich + + - name: Untar MPI installation (MPICH) + run: | + tar xvf mpich.tar -C ${{ runner.workspace }} + + - name: Set path (MPICH) + shell: bash + run: | + echo "${{ runner.workspace }}/mpich/bin" >> $GITHUB_PATH + echo "LD_LIBRARY_PATH=${{ runner.workspace }}/mpich/lib:$LD_LIBRARY_PATH" >> $GITHUB_ENV + echo "CC=${{ runner.workspace }}/mpich/bin/mpicc" >> $GITHUB_ENV + echo "FC=${{ runner.workspace }}/mpich/bin/mpif90" >> $GITHUB_ENV + + - name: Install Doxygen + uses: ssciwr/doxygen-install@v1 + with: + version: "1.9.7" + + - name: Set file base name (MPICH) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT + + # Get files created by release script + - name: Get tgz-tarball (MPICH) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: tgz-tarball + path: ${{ github.workspace }} + + - name: List files for the space (MPICH) + run: | + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} + + - name: Uncompress source (MPICH) + run: tar -zxvf ${{ github.workspace }}/${{ steps.set-file-base.outputs.FILE_BASE }}.tar.gz + + - name: Copy script files for the space (MPICH) + run: | + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (MPICH) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (MPICH) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (ctest_test_args INCLUDE MPI_TEST) + set (MODEL "MPI") + set (GROUP "MPI") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_NUMPROC_FLAG:STRING=-n") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DMPIEXEC_MAX_NUMPROCS:STRING=2") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PARALLEL:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SUBFILING_VFD:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") + + - name: Run ctest script (MPICH) + run: | + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-MPICH-source,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C ${{ inputs.build_mode }} -VV -O hdf5.log + shell: bash + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (MPICH) + uses: actions/upload-artifact@v4 + with: + name: mpich-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` diff --git a/.github/workflows/cmake-script.yml b/.github/workflows/cmake-script.yml index 35541279595..4b76dfc0ce8 100644 --- a/.github/workflows/cmake-script.yml +++ b/.github/workflows/cmake-script.yml @@ -96,12 +96,14 @@ jobs: set (CTEST_DROP_SITE_INIT "my.cdash.org") # Change following line to submit to your CDash dashboard to a different CDash project #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (MODEL "GHDaily") + set (GROUP "GHDaily") set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") @@ -111,7 +113,7 @@ jobs: - name: Run ctest script (Windows) run: | cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=VS202264,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }},LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=VS202264,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log shell: bash continue-on-error: true @@ -185,12 +187,14 @@ jobs: set (CTEST_DROP_SITE_INIT "my.cdash.org") # Change following line to submit to your CDash dashboard to a different CDash project #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (MODEL "GHDaily") + set (GROUP "GHDaily") set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") @@ -200,7 +204,7 @@ jobs: - name: Run ctest (Linux) run: | cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-GCC,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-GCC,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log shell: bash continue-on-error: true @@ -287,11 +291,13 @@ jobs: # Change following line to submit to your CDash dashboard to a different CDash project #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (MODEL "GHDaily") + set (GROUP "GHDaily") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") @@ -302,7 +308,7 @@ jobs: id: run-ctest run: | cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-Clang,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-Clang,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log shell: bash continue-on-error: true @@ -373,11 +379,13 @@ jobs: # Change following line to submit to your CDash dashboard to a different CDash project #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (MODEL "GHDaily") + set (GROUP "GHDaily") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") @@ -387,7 +395,7 @@ jobs: - name: Run ctest (Linux S3) run: | cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-S3,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-S3,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log shell: bash continue-on-error: true @@ -474,12 +482,14 @@ jobs: #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") #set (CMAKE_GENERATOR_TOOLSET "Intel C++ Compiler 2024,fortran=ifx") set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (MODEL "GHDaily") + set (GROUP "GHDaily") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_TOOLCHAIN_FILE:STRING=config/toolchain/intel.cmake") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") @@ -490,12 +500,10 @@ jobs: env: FC: ${{ steps.setup-fortran.outputs.fc }} CC: ${{ steps.setup-fortran.outputs.cc }} - CXX: ${{ steps.setup-fortran.outputs.cxx }} - BINSIGN: ${{ needs.check-secret.outputs.sign-state }} - SIGNTOOLDIR: ${{ github.workspace }}/Microsoft.Windows.SDK.BuildTools/bin/10.0.22621.0/x64 + CXX: ${{ steps.setup-fortran.outputs.cc }} run: | cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-Intel,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=VS202264,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-Intel,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=VS202264,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log shell: pwsh continue-on-error: true @@ -572,11 +580,13 @@ jobs: # Change following line to submit to your CDash dashboard to a different CDash project #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (MODEL "GHDaily") + set (GROUP "GHDaily") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") @@ -590,7 +600,7 @@ jobs: CXX: ${{ steps.setup-fortran.outputs.cxx }} run: | cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-Intel,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-Intel,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log shell: bash continue-on-error: true @@ -603,110 +613,6 @@ jobs: if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` ####### clang builds - build_and_test_win_clang: - # Windows w/ clang + CMake - # - name: "Windows ClangCL CTest" - runs-on: windows-latest - steps: - - name: Install Dependencies (Windows_clang) - run: choco install ninja - - - name: add clang to env - uses: KyleMayes/install-llvm-action@v2.0.5 - id: setup-clang - with: - env: true - version: '18' - - - name: Set file base name (Windows_clang) - id: set-file-base - run: | - FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") - echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT - if [[ '${{ inputs.use_environ }}' == 'release' ]] - then - SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") - else - SOURCE_NAME_BASE=$(echo "hdfsrc") - fi - echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT - shell: bash - - # Get files created by release script - - name: Get zip-tarball (Windows_clang) - uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 - with: - name: zip-tarball - path: ${{ github.workspace }} - - - name: using powershell - shell: pwsh - run: Get-Location - - - name: List files for the space (Windows_clang) - run: | - Get-ChildItem -Path ${{ github.workspace }} - Get-ChildItem -Path ${{ runner.workspace }} - shell: pwsh - - - name: Uncompress source (Windows_clang) - working-directory: ${{ github.workspace }} - run: 7z x ${{ steps.set-file-base.outputs.FILE_BASE }}.zip - shell: bash - - - name: Copy script files for the space (Windows_clang) - run: | - Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake -Destination ${{ runner.workspace }}/hdf5/ - Copy-Item -Path ${{ runner.workspace }}/hdf5/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake -Destination ${{ runner.workspace }}/hdf5/ - shell: pwsh - - - name: List files for the hdf5 (Windows_clang) - run: | - Get-ChildItem -Path ${{ runner.workspace }}/hdf5 - shell: pwsh - - - name: Create options file (Windows_clang) - uses: "DamianReeves/write-file-action@master" - with: - path: ${{ runner.workspace }}/hdf5/HDF5options.cmake - write-mode: overwrite - contents: | - set (CTEST_DROP_SITE_INIT "my.cdash.org") - # Change following line to submit to your CDash dashboard to a different CDash project - #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") - set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") - #set (CMAKE_GENERATOR_TOOLSET "ClangCL") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") - #set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_TOOLCHAIN_FILE:STRING=config/toolchain/clang.cmake") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") - - - name: Run ctest (Windows_clang) with clang - env: - BINSIGN: ${{ needs.check-secret.outputs.sign-state }} - SIGNTOOLDIR: ${{ github.workspace }}/Microsoft.Windows.SDK.BuildTools/bin/10.0.22621.0/x64 - run: | - cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-Clang,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=VS202264,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log - shell: pwsh - continue-on-error: true - - # Save log files created by ctest script - - name: Save log (Windows_clang) - uses: actions/upload-artifact@v4 - with: - name: clang-win-log - path: ${{ runner.workspace }}/hdf5/hdf5.log - if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` - build_and_test_linux_clang: # Linux (Ubuntu) w/ clang + CMake # @@ -771,6 +677,8 @@ jobs: set (CTEST_DROP_SITE_INIT "my.cdash.org") # Change following line to submit to your CDash dashboard to a different CDash project set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (MODEL "GHDaily") + set (GROUP "GHDaily") #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") #set (CMAKE_GENERATOR_TOOLSET "clang") @@ -778,7 +686,7 @@ jobs: set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") - set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") @@ -788,7 +696,7 @@ jobs: - name: Run ctest (Linux_clang) run: | cd "${{ runner.workspace }}/hdf5" - ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-Clang,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-Clang,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log shell: bash continue-on-error: true diff --git a/.github/workflows/cmake.yml b/.github/workflows/cmake.yml index 7fe99c2f3cb..0305d10c530 100644 --- a/.github/workflows/cmake.yml +++ b/.github/workflows/cmake.yml @@ -12,7 +12,7 @@ on: - 'doc/**' - 'release_docs/**' - 'ACKNOWLEDGEMENTS' - - 'COPYING**' + - 'LICENSE**' - '**.md' # Using concurrency to cancel any in-progress job or run @@ -75,6 +75,18 @@ jobs: with: build_mode: "Debug" + call-release-special-par: + name: "CMake Parallel Release Special Workflows" + uses: ./.github/workflows/main-cmake-par-spc.yml + with: + build_mode: "Release" + + call-debug-special-par: + name: "CMake Parallel Debug Special Workflows" + uses: ./.github/workflows/main-cmake-par-spc.yml + with: + build_mode: "Debug" + call-release-cmake-intel: name: "CMake Intel Workflows" uses: ./.github/workflows/intel-cmake.yml @@ -93,18 +105,24 @@ jobs: with: build_mode: "Release" - call-release-cmake-cygwin: - name: "CMake Cygwin Workflows" - uses: ./.github/workflows/cygwin-cmake.yml - with: - build_mode: "Release" - call-release-cmake-xpr: name: "CMake TestExpress Workflows" uses: ./.github/workflows/testxpr-cmake.yml - call-release-cmake-julia: - name: "CMake Julia Workflows" - uses: ./.github/workflows/julia-cmake.yml +# call-release-cmake-julia: +# name: "CMake Julia Workflows" +# uses: ./.github/workflows/julia-cmake.yml +# with: +# build_mode: "Release" + + call-release-cmake-msys2: + name: "CMake Msys2 Workflows" + uses: ./.github/workflows/msys2-cmake.yml with: - build_mode: "Release" + build_mode: "Release" + + call-release-cmake-i386: + name: "CMake i386 Workflows" + uses: ./.github/workflows/i386-cmake.yml + with: + build_mode: "Release" diff --git a/.github/workflows/cve.yml b/.github/workflows/cve.yml index a3abb664897..8562bce6d66 100644 --- a/.github/workflows/cve.yml +++ b/.github/workflows/cve.yml @@ -12,7 +12,7 @@ on: - 'doc/**' - 'release_docs/**' - 'ACKNOWLEDGEMENTS' - - 'COPYING**' + - 'LICENSE**' - '**.md' # Using concurrency to cancel any in-progress job or run diff --git a/.github/workflows/cygwin-cmake.yml b/.github/workflows/cygwin-cmake.yml index 57674acbbe0..73f13f30569 100644 --- a/.github/workflows/cygwin-cmake.yml +++ b/.github/workflows/cygwin-cmake.yml @@ -4,10 +4,20 @@ name: hdf5 dev CMake cygwin on: workflow_call: inputs: - build_mode: - description: "release vs. debug build" + snap_name: + description: 'The name in the source tarballs' + type: string + required: false + default: hdfsrc + file_base: + description: "The common base name of the source tarballs" required: true type: string + use_environ: + description: 'Environment to locate files' + type: string + required: true + default: snapshots permissions: contents: read @@ -30,36 +40,82 @@ jobs: with: packages: cmake gcc-fortran make ninja zlib-devel flex bison perl - - name: CMake Configure + - name: Set file base name (Cygwin) + id: set-file-base + run: | + FILE_NAME_BASE=$(echo "${{ inputs.file_base }}") + echo "FILE_BASE=$FILE_NAME_BASE" >> $GITHUB_OUTPUT + if [[ '${{ inputs.use_environ }}' == 'release' ]] + then + SOURCE_NAME_BASE=$(echo "${{ inputs.snap_name }}") + else + SOURCE_NAME_BASE=$(echo "hdfsrc") + fi + echo "SOURCE_BASE=$SOURCE_NAME_BASE" >> $GITHUB_OUTPUT shell: C:\cygwin\bin\bash.exe -eo pipefail -o igncr '{0}' + + # Get files created by release script + - name: Get zip-tarball (Cygwin) + uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 + with: + name: zip-tarball + path: ${{ github.workspace }} + + - name: List files for the space (Cygwin) run: | - export PATH=/usr/bin:$PATH - mkdir build - cd build - cmake -C ../config/cmake/cacheinit.cmake \ - -G Ninja \ - --log-level=VERBOSE \ - -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ - -DBUILD_SHARED_LIBS:BOOL=OFF \ - -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ - -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ - -DLIBAEC_USE_LOCALCONTENT=OFF \ - -DZLIB_USE_LOCALCONTENT=OFF \ - -DHDF5_BUILD_FORTRAN:BOOL=ON \ - -DHDF5_BUILD_JAVA:BOOL=OFF \ - .. + ls -l ${{ github.workspace }} + ls ${{ runner.workspace }} - - name: CMake Build + - name: Uncompress source (Cygwin) + working-directory: ${{ github.workspace }} + run: 7z x ${{ steps.set-file-base.outputs.FILE_BASE }}.zip shell: C:\cygwin\bin\bash.exe -eo pipefail -o igncr '{0}' + + - name: Copy script files for the space (Cygwin) run: | - export PATH=/usr/bin:$PATH - cd build - cmake --build . --parallel 3 --config ${{ inputs.build_mode }} + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/CTestScript.cmake ${{ runner.workspace }}/hdf5 + cp ${{ github.workspace }}/${{ steps.set-file-base.outputs.SOURCE_BASE }}/config/cmake/scripts/HDF5config.cmake ${{ runner.workspace }}/hdf5 + + - name: List files for the hdf5 (Cygwin) + run: | + ls ${{ runner.workspace }}/hdf5 + + - name: Create options file (Cygwin) + uses: "DamianReeves/write-file-action@master" + with: + path: ${{ runner.workspace }}/hdf5/HDF5options.cmake + write-mode: overwrite + contents: | + set (CTEST_DROP_SITE_INIT "my.cdash.org") + # Change following line to submit to your CDash dashboard to a different CDash project + #set (CTEST_DROP_LOCATION_INIT "/submit.php?project=HDF5") + set (MODEL "GHDaily") + set (GROUP "GHDaily") + set (SITE_BUILDNAME_SUFFIX "${{ steps.set-file-base.outputs.FILE_BASE }}") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} --log-level=VERBOSE") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_GENERATE_HEADERS:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_JAVA:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_CPP_LIB:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_BUILD_FORTRAN:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=ON") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF") + set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DZLIB_USE_LOCALCONTENT:BOOL=OFF") - - name: CMake Run Tests + - name: Run ctest (Cygwin) shell: C:\cygwin\bin\bash.exe -eo pipefail -o igncr '{0}' run: | - export PATH=/usr/bin:$PATH - cd build - ctest . --parallel 2 -C ${{ inputs.build_mode }} -V -# ctest . --parallel 2 -C ${{ inputs.build_mode }} -V -R "FORTRAN|H5TEST" + export PATH=/usr/bin:$PATH + cd "${{ runner.workspace }}/hdf5" + ctest -S HDF5config.cmake,CTEST_SITE_EXT=GH-${{ github.event.repository.full_name }}-CYG,LOCAL_SUBMIT=ON,NINJA=TRUE,BUILD_GENERATOR=Unix,CTEST_SOURCE_NAME=${{ steps.set-file-base.outputs.SOURCE_BASE }} -C Release -VV -O hdf5.log + continue-on-error: true + + # Save log files created by ctest script + - name: Save log (Cygwin) + uses: actions/upload-artifact@v4 + with: + name: gcc-cygwin-log + path: ${{ runner.workspace }}/hdf5/hdf5.log + if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` diff --git a/.github/workflows/daily-build.yml b/.github/workflows/daily-build.yml index ef98e353ab2..4355fd3d4fa 100644 --- a/.github/workflows/daily-build.yml +++ b/.github/workflows/daily-build.yml @@ -1,6 +1,7 @@ name: hdf5 dev daily build -# Triggers the workflow on a schedule or on demand +# Triggers the workflow on demand or on a call from another workflow +# NOTE: inputs must be duplicated between triggers on: workflow_dispatch: inputs: @@ -9,8 +10,13 @@ on: type: string required: false default: check - schedule: - - cron: "6 0 * * *" + workflow_call: + inputs: + use_ignore: + description: 'Ignore has_changes check' + type: string + required: false + default: check permissions: contents: read @@ -53,6 +59,15 @@ jobs: use_tag: snapshot use_environ: snapshots + call-release-cmake-cygwin: + needs: [get-old-names, call-workflow-tarball] + name: "CMake Cygwin Workflows" + uses: ./.github/workflows/cygwin-cmake.yml + with: + file_base: ${{ needs.call-workflow-tarball.outputs.file_base }} + use_environ: snapshots + if: ${{ ((needs.call-workflow-tarball.outputs.has_changes == 'true') || (needs.get-old-names.outputs.run-ignore == 'ignore')) }} + call-workflow-c-script: needs: [get-old-names, call-workflow-tarball] uses: ./.github/workflows/cmake-script.yml @@ -61,6 +76,32 @@ jobs: use_environ: snapshots if: ${{ ((needs.call-workflow-tarball.outputs.has_changes == 'true') || (needs.get-old-names.outputs.run-ignore == 'ignore')) }} + call-workflow-par-script: + needs: [get-old-names, call-workflow-tarball] + uses: ./.github/workflows/cmake-par-script.yml + with: + file_base: ${{ needs.call-workflow-tarball.outputs.file_base }} + use_environ: snapshots + build_mode: "Release" + if: ${{ ((needs.call-workflow-tarball.outputs.has_changes == 'true') || (needs.get-old-names.outputs.run-ignore == 'ignore')) }} + + call-workflow-par-source: + needs: [get-old-names, call-workflow-tarball] + uses: ./.github/workflows/cmake-par-source.yml + with: + file_base: ${{ needs.call-workflow-tarball.outputs.file_base }} + use_environ: snapshots + build_mode: "Release" + if: ${{ ((needs.call-workflow-tarball.outputs.has_changes == 'true') || (needs.get-old-names.outputs.run-ignore == 'ignore')) }} + + call-workflow-sanitizers: + needs: [get-old-names, call-workflow-tarball] + uses: ./.github/workflows/cmake-analysis.yml + with: + file_base: ${{ needs.call-workflow-tarball.outputs.file_base }} + use_environ: snapshots + if: ${{ ((needs.call-workflow-tarball.outputs.has_changes == 'true') || (needs.get-old-names.outputs.run-ignore == 'ignore')) }} + call-workflow-ctest: needs: [get-old-names, call-workflow-tarball] uses: ./.github/workflows/cmake-ctest.yml diff --git a/.github/workflows/daily-schedule.yml b/.github/workflows/daily-schedule.yml new file mode 100644 index 00000000000..c2b7a77b608 --- /dev/null +++ b/.github/workflows/daily-schedule.yml @@ -0,0 +1,17 @@ +name: hdf5 dev daily build on schedule + +# Triggers the workflow on a schedule or on demand +on: + workflow_dispatch: + schedule: + - cron: "6 0 * * *" + +permissions: + contents: write # In order to allow tag creation and file deletion + +jobs: + daily-build: + uses: ./.github/workflows/daily-build.yml + with: + use_ignore: check + if: "github.repository_owner == 'HDFGroup'" diff --git a/.github/workflows/h5py.yml b/.github/workflows/h5py.yml index a0c39d67f59..dd9d2fb2084 100644 --- a/.github/workflows/h5py.yml +++ b/.github/workflows/h5py.yml @@ -21,15 +21,16 @@ jobs: - name: Run a multi-line script run: | - sed -i 's/hdf5@1.10.4:1.14/hdf5@1.10.4:/g' \ + sed -i 's/hdf5@1.10.6:1.14/hdf5@1.10.6:/g' \ ./spack/var/spack/repos/builtin/packages/py-h5py/package.py . ./spack/share/spack/setup-env.sh - ./spack/bin/spack spec py-h5py@master+mpi ^hdf5@develop-1.17 - ./spack/bin/spack install py-h5py@master+mpi ^hdf5@develop-1.17 + ./spack/bin/spack spec py-h5py@master+mpi ^hdf5@develop-2.0 + ./spack/bin/spack install py-h5py@master+mpi ^hdf5@develop-2.0 ./spack/bin/spack install py-pytest ./spack/bin/spack install py-ipython + ./spack/bin/spack install py-pytest-mpi spack load py-h5py spack load py-pytest spack load py-ipython - pip install pytest-mpi + spack load py-pytest-mpi python -c "import h5py; h5py.run_tests(); print(h5py.version.info);" diff --git a/.github/workflows/hdfeos5.yml b/.github/workflows/hdfeos5.yml index 0d5cf969382..01dad32f529 100644 --- a/.github/workflows/hdfeos5.yml +++ b/.github/workflows/hdfeos5.yml @@ -12,34 +12,62 @@ on: - 'doc/**' - 'release_docs/**' - 'ACKNOWLEDGEMENTS' - - 'COPYING**' + - 'LICENSE**' - '**.md' +permissions: + contents: read + # Using concurrency to cancel any in-progress job or run concurrency: group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }} cancel-in-progress: true -permissions: - contents: read - jobs: build: name: Build hdfeos5 runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4.1.7 + - name: Install System dependencies + run: | + sudo apt-get update + sudo apt-get install ninja-build + sudo apt install libssl3 libssl-dev libcurl4 + sudo apt install -y libaec-dev zlib1g-dev automake autoconf libcurl4-openssl-dev libjpeg-dev wget curl bzip2 m4 flex bison cmake libzip-dev doxygen openssl libtool libtool-bin - - name: Install Autotools Dependencies (Linux) + - name: Checkout HDF5 + uses: actions/checkout@v4.1.7 + + - name: CMake Configure run: | - sudo apt update - sudo apt install automake autoconf libtool libtool-bin + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DHDF5_ENABLE_PARALLEL:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ + -DHDF5_BUILD_FORTRAN=OFF \ + -DHDF5_BUILD_JAVA=OFF \ + -DHDF5_BUILD_DOC=OFF \ + -DLIBAEC_USE_LOCALCONTENT=OFF \ + -DZLIB_USE_LOCALCONTENT=OFF \ + -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ + -DBUILD_TESTING:BOOL=OFF \ + -DDEFAULT_API_VERSION:STRING=v16 \ + -DCMAKE_INSTALL_PREFIX:PATH=/usr/local \ + $GITHUB_WORKSPACE + shell: bash + + - name: CMake Build + run: cmake --build . --parallel 3 --config Release + working-directory: ${{ runner.workspace }}/build + - name: Install HDF5 run: | - ./autogen.sh - ./configure --prefix=/usr/local --disable-tests --with-default-api-version=v16 - make - sudo make install + sudo cmake --install . --config Release --prefix="/usr/local" + working-directory: ${{ runner.workspace }}/build + - name: Install HDF-EOS5 run: | wget -O HDF-EOS5.2.0.tar.gz "https://git.earthdata.nasa.gov/projects/DAS/repos/hdfeos5/raw/hdf-eos5-2.0-src.tar.gz?at=refs%2Fheads%2FHDFEOS5_2.0" @@ -47,5 +75,6 @@ jobs: cd hdf-eos5-2.0 ./configure CC=/usr/local/bin/h5cc --prefix=/usr/local/ --enable-install-include make - make check + LD_LIBRARY_PATH="/usr/local/lib:${LD_LIBRARY_PATH}" + LD_LIBRARY_PATH=${LD_LIBRARY_PATH} make check sudo make install diff --git a/.github/workflows/i386-cmake.yml b/.github/workflows/i386-cmake.yml new file mode 100644 index 00000000000..b7aa4cd3417 --- /dev/null +++ b/.github/workflows/i386-cmake.yml @@ -0,0 +1,67 @@ +name: hdf5 dev CMake i386 + +# Triggers the workflow on a call from another workflow +on: + workflow_call: + inputs: + build_mode: + description: "release vs. debug build" + required: true + type: string + +permissions: + contents: read + +jobs: + i386_build_and_test: + name: "i386 ${{ inputs.build_mode }}" + runs-on: ubuntu-latest + steps: + - name: Get Sources + uses: actions/checkout@v4.2.1 + + - name: setup alpine + uses: jirutka/setup-alpine@v1 + with: + arch: x86 + packages: > + build-base + libaec-dev + libgit2-dev + cmake + + - name: CMake Configure + shell: alpine.sh --root {0} + run: | + mkdir build + cd build + cmake -C ../config/cmake/cacheinit.cmake -G "Unix Makefiles" \ + --log-level=VERBOSE \ + -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ + -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ + -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF \ + -DZLIB_USE_LOCALCONTENT:BOOL=OFF \ + -DHDF5_BUILD_FORTRAN:BOOL=OFF \ + -DHDF5_BUILD_JAVA:BOOL=OFF \ + -DHDF5_ENABLE_PLUGIN_SUPPORT:BOOL=OFF \ + .. + + - name: CMake Build + shell: alpine.sh --root {0} + run: | + cmake --build . --parallel 3 --config ${{ inputs.build_mode }} + working-directory: build + + - name: CMake Run Tests + shell: alpine.sh --root {0} + run: | + ctest . -E H5_H5DUMP-h5ex_table_11 --parallel 2 -C ${{ inputs.build_mode }} -VV + working-directory: build + + - name: CMake Run Expected To Fail Tests + shell: alpine.sh --root {0} + run: | + ctest . -R H5_H5DUMP-h5ex_table_11 --parallel 2 -C ${{ inputs.build_mode }} -V + working-directory: build + continue-on-error: true diff --git a/.github/workflows/intel-cmake.yml b/.github/workflows/intel-cmake.yml index 2816fa95a25..8cfdcdc1e86 100644 --- a/.github/workflows/intel-cmake.yml +++ b/.github/workflows/intel-cmake.yml @@ -47,8 +47,8 @@ jobs: -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ -DHDF5_BUILD_FORTRAN:BOOL=ON \ -DHDF5_BUILD_CPP_LIB:BOOL=ON \ - -DLIBAEC_USE_LOCALCONTENT=OFF \ - -DZLIB_USE_LOCALCONTENT=OFF \ + -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF \ + -DZLIB_USE_LOCALCONTENT:BOOL=OFF \ ${{ github.workspace }} - name: CMake Build (Linux) diff --git a/.github/workflows/julia-auto.yml b/.github/workflows/julia-auto.yml index f21fd659413..f31063e1665 100644 --- a/.github/workflows/julia-auto.yml +++ b/.github/workflows/julia-auto.yml @@ -16,7 +16,7 @@ jobs: name: "julia ${{ inputs.build_mode }}" runs-on: ubuntu-latest steps: - - name: Get Sources + - name: Get HDF5 source uses: actions/checkout@v4.1.7 - name: Install Dependencies diff --git a/.github/workflows/julia-cmake.yml b/.github/workflows/julia-cmake.yml index 113b81bd70c..1d7791b310d 100644 --- a/.github/workflows/julia-cmake.yml +++ b/.github/workflows/julia-cmake.yml @@ -16,7 +16,7 @@ jobs: name: "julia ${{ inputs.build_mode }}" runs-on: ubuntu-latest steps: - - name: Get Sources + - name: Get HDF5 source uses: actions/checkout@v4.1.7 - name: Install Dependencies diff --git a/.github/workflows/linkchecker.yml b/.github/workflows/linkchecker.yml new file mode 100644 index 00000000000..681ceaf4dbf --- /dev/null +++ b/.github/workflows/linkchecker.yml @@ -0,0 +1,47 @@ +name: linkchecker + +on: + workflow_dispatch: + push: + pull_request: + branches: [ develop ] + +concurrency: + group: ${{ github.workflow }}-${{ github.head_ref && github.ref || github.run_id }} + cancel-in-progress: true + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: get + uses: actions/checkout@v4 + + - name: install + run: | + sudo apt update -y + sudo apt install -y libunwind-dev + sudo apt install -y graphviz + sudo apt install -y --no-install-recommends doxygen + sudo apt install -y cmake + sudo apt install -y texlive-full + sudo apt install -y texlive-fonts-extra + sudo apt install -y texlive-latex-extra + pip3 install linkchecker + + - name: build + run: | + mkdir build + cd build + cmake -DHDF5_BUILD_DOC:BOOL=ON .. + make doxygen + + - name: check + run: | + cd build/hdf5lib_docs/html + linkchecker --check-extern ./index.html + continue-on-error: true + diff --git a/.github/workflows/main-cmake-par-spc.yml b/.github/workflows/main-cmake-par-spc.yml new file mode 100644 index 00000000000..6e16a52add8 --- /dev/null +++ b/.github/workflows/main-cmake-par-spc.yml @@ -0,0 +1,79 @@ +name: hdf5 dev parallel special CMake CI + +on: + workflow_call: + inputs: + build_mode: + description: "release vs. debug build" + required: true + type: string + +permissions: + contents: read + +jobs: + # + # The GitHub runners are inadequate for running parallel HDF5 tests, + # so we catch most issues in daily testing. What we have here is just + # a compile check to make sure nothing obvious is broken. + # A workflow that builds the library + # Parallel Linux (Ubuntu) w/ gcc + CMake + # + CMake_build_parallel_werror: + name: "Parallel GCC-${{ inputs.build_mode }}" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4.1.7 + + - name: Install Linux Dependencies + run: | + sudo apt-get update + sudo apt-get install ninja-build doxygen graphviz + sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt install gcc-12 g++-12 gfortran-12 + sudo apt install libaec0 libaec-dev + sudo apt install openmpi-bin openmpi-common mpi-default-dev + echo "CC=mpicc" >> $GITHUB_ENV + echo "FC=mpif90" >> $GITHUB_ENV + + - name: CMake Configure + shell: bash + run: | + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + CC=mpicc cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + --log-level=VERBOSE \ + -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ + -DBUILD_SHARED_LIBS=ON \ + -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DHDF5_ENABLE_WARNINGS_AS_ERRORS=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=ON \ + -DMPIEXEC_NUMPROC_FLAG:STRING=-n \ + -DMPIEXEC_MAX_NUMPROCS:STRING=2 \ + -DHDF5_ENABLE_SUBFILING_VFD:BOOL=ON \ + -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ + -DHDF5_BUILD_FORTRAN=OFF \ + -DHDF5_BUILD_JAVA=OFF \ + -DLIBAEC_USE_LOCALCONTENT=OFF \ + -DZLIB_USE_LOCALCONTENT=OFF \ + -DHDF5_ENABLE_MIRROR_VFD:BOOL=OFF \ + -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ + -DHDF5_ENABLE_ROS3_VFD:BOOL=OFF \ + -DHDF5_PACK_EXAMPLES:BOOL=OFF \ + $GITHUB_WORKSPACE + + # BUILD + - name: CMake Build + run: cmake --build . --parallel 3 --config ${{ inputs.build_mode }} + working-directory: ${{ runner.workspace }}/build + + # RUN TESTS + - name: CMake Run Tests + run: ctest . -E MPI_TEST --parallel 2 -C ${{ inputs.build_mode }} -V + working-directory: ${{ runner.workspace }}/build + if: ${{ matrix.run_tests && (inputs.thread_safety != 'TS') }} + + - name: CMake Run Parallel Tests + run: ctest . -R MPI_TEST -C ${{ inputs.build_mode }} -V + working-directory: ${{ runner.workspace }}/build + if: ${{ matrix.run_tests && (inputs.thread_safety != 'TS') }} diff --git a/.github/workflows/main-cmake-par.yml b/.github/workflows/main-cmake-par.yml index c00caa713c9..278855e9737 100644 --- a/.github/workflows/main-cmake-par.yml +++ b/.github/workflows/main-cmake-par.yml @@ -1,4 +1,4 @@ -name: hdf5 dev PAR CMake CI +name: hdf5 dev parallel CMake CI on: workflow_call: @@ -17,7 +17,7 @@ jobs: # so we catch most issues in daily testing. What we have here is just # a compile check to make sure nothing obvious is broken. # A workflow that builds the library - # Parallel Linux (Ubuntu) w/ gcc + Autotools + # Parallel Linux (Ubuntu) w/ gcc + CMake # CMake_build_parallel: name: "Parallel GCC-${{ inputs.build_mode }}" @@ -47,6 +47,8 @@ jobs: -DBUILD_SHARED_LIBS=ON \ -DHDF5_ENABLE_ALL_WARNINGS=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=ON \ + -DMPIEXEC_NUMPROC_FLAG:STRING=-n \ + -DMPIEXEC_MAX_NUMPROCS:STRING=2 \ -DHDF5_ENABLE_SUBFILING_VFD:BOOL=ON \ -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ -DHDF5_BUILD_FORTRAN=ON \ diff --git a/.github/workflows/main-cmake-spc.yml b/.github/workflows/main-cmake-spc.yml index b83c80beb9f..5c2af3e7d34 100644 --- a/.github/workflows/main-cmake-spc.yml +++ b/.github/workflows/main-cmake-spc.yml @@ -38,9 +38,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -61,23 +59,26 @@ jobs: -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ - -DDEFAULT_API_VERSION:STRING=v16 \ + -DHDF5_DEFAULT_API_VERSION:STRING=v16 \ $GITHUB_WORKSPACE shell: bash - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config Debug working-directory: ${{ runner.workspace }}/build - # - # RUN TESTS - disable until some tests are fixed - # -# - name: CMake Run Tests -# run: ctest . --parallel 2 -C Debug -V -# working-directory: ${{ runner.workspace }}/build + # RUN TESTS + - name: CMake Run Tests + run: | + ctest . --parallel 2 -C Debug -V -E "testhdf5-base|cache_api|dt_arith|H5TEST-dtypes|err_compat" + working-directory: ${{ runner.workspace }}/build + + - name: CMake Run Expected to Fail Tests + run: | + ctest . --parallel 2 -C Debug -V -R "testhdf5-base|cache_api|dt_arith|H5TEST-dtypes|err_compat" + working-directory: ${{ runner.workspace }}/build + continue-on-error: true build_v1_8: name: "gcc DBG v1.8 default API" @@ -98,9 +99,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -121,23 +120,21 @@ jobs: -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ - -DDEFAULT_API_VERSION:STRING=v18 \ + -DHDF5_DEFAULT_API_VERSION:STRING=v18 \ $GITHUB_WORKSPACE shell: bash - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config Debug working-directory: ${{ runner.workspace }}/build # - # RUN TESTS - disable until some tests are fixed + # RUN TESTS # -# - name: CMake Run Tests -# run: ctest . --parallel 2 -C Debug -V -# working-directory: ${{ runner.workspace }}/build + - name: CMake Run Tests + run: ctest . --parallel 2 -C Debug -V + working-directory: ${{ runner.workspace }}/build build_v1_10: name: "gcc DBG v1.10 default API" @@ -158,9 +155,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -181,13 +176,11 @@ jobs: -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ - -DDEFAULT_API_VERSION:STRING=v110 \ + -DHDF5_DEFAULT_API_VERSION:STRING=v110 \ $GITHUB_WORKSPACE shell: bash - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config Debug working-directory: ${{ runner.workspace }}/build @@ -218,9 +211,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -241,20 +232,16 @@ jobs: -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ - -DDEFAULT_API_VERSION:STRING=v112 \ + -DHDF5_DEFAULT_API_VERSION:STRING=v112 \ $GITHUB_WORKSPACE shell: bash - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config Debug working-directory: ${{ runner.workspace }}/build - # # RUN TESTS - # - name: CMake Run Tests run: ctest . --parallel 2 -C Debug -V working-directory: ${{ runner.workspace }}/build @@ -278,9 +265,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -301,26 +286,22 @@ jobs: -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ - -DDEFAULT_API_VERSION:STRING=v114 \ + -DHDF5_DEFAULT_API_VERSION:STRING=v114 \ $GITHUB_WORKSPACE shell: bash - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config Debug working-directory: ${{ runner.workspace }}/build - # # RUN TESTS - # - name: CMake Run Tests run: ctest . --parallel 2 -C Debug -V working-directory: ${{ runner.workspace }}/build - build_v1_16: - name: "gcc DBG v1.16 default API" + build_v2_0: + name: "gcc DBG v2.0.0 default API" runs-on: ubuntu-latest steps: # SETUP @@ -338,9 +319,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -361,20 +340,16 @@ jobs: -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ - -DDEFAULT_API_VERSION:STRING=v116 \ + -DHDF5_DEFAULT_API_VERSION:STRING=v200 \ $GITHUB_WORKSPACE shell: bash - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config Debug working-directory: ${{ runner.workspace }}/build - # # RUN TESTS - # - name: CMake Run Tests run: ctest . --parallel 2 -C Debug -V working-directory: ${{ runner.workspace }}/build @@ -398,9 +373,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -425,16 +398,216 @@ jobs: $GITHUB_WORKSPACE shell: bash - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config Release working-directory: ${{ runner.workspace }}/build - # # RUN TESTS - # - name: CMake Run Tests run: ctest . --parallel 2 -C Release -V working-directory: ${{ runner.workspace }}/build + + build_nofilter: + name: "gcc no filters" + runs-on: ubuntu-latest + steps: + # SETUP + - name: Install Linux Dependencies + run: | + sudo apt-get update + sudo apt-get install ninja-build doxygen graphviz + sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt install gcc-12 g++-12 gfortran-12 + echo "CC=gcc-12" >> $GITHUB_ENV + echo "CXX=g++-12" >> $GITHUB_ENV + echo "FC=gfortran-12" >> $GITHUB_ENV + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Get Sources + uses: actions/checkout@v4.1.7 + + # CMAKE CONFIGURE + - name: CMake Configure + run: | + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + -G Ninja \ + --log-level=VERBOSE \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=ON \ + -DHDF5_BUILD_FORTRAN=ON \ + -DHDF5_BUILD_JAVA=ON \ + -DHDF5_BUILD_DOC=OFF \ + -DHDF5_ENABLE_MIRROR_VFD:BOOL=ON \ + -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ + -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ + -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF \ + -DHDF5_ENABLE_SZIP_SUPPORT:=BOOL=OFF \ + -DHDF5_ENABLE_SZIP_ENCODING:=BOOL=OFF \ + $GITHUB_WORKSPACE + shell: bash + + # BUILD + - name: CMake Build + run: cmake --build . --parallel 3 --config Release + working-directory: ${{ runner.workspace }}/build + + # RUN TESTS + - name: CMake Run Tests + run: ctest . --parallel 2 -C Release -V + working-directory: ${{ runner.workspace }}/build + + build_debug_werror: + name: "gcc DBG -Werror (build only)" + runs-on: ubuntu-latest + steps: + # SETUP + - name: Install Linux Dependencies + run: | + sudo apt-get update + sudo apt-get install ninja-build doxygen graphviz + sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt install gcc-12 g++-12 gfortran-12 + echo "CC=gcc-12" >> $GITHUB_ENV + echo "CXX=g++-12" >> $GITHUB_ENV + echo "FC=gfortran-12" >> $GITHUB_ENV + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Get Sources + uses: actions/checkout@v4.1.7 + + # CMAKE CONFIGURE + - name: CMake Configure + run: | + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + -G Ninja \ + --log-level=VERBOSE \ + -DCMAKE_BUILD_TYPE=Debug \ + -DBUILD_SHARED_LIBS=ON \ + -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DHDF5_ENABLE_WARNINGS_AS_ERRORS=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=ON \ + -DHDF5_BUILD_FORTRAN=OFF \ + -DHDF5_BUILD_JAVA=ON \ + -DHDF5_BUILD_DOC=OFF \ + -DLIBAEC_USE_LOCALCONTENT=OFF \ + -DZLIB_USE_LOCALCONTENT=OFF \ + -DHDF5_ENABLE_MIRROR_VFD:BOOL=ON \ + -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ + -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ + $GITHUB_WORKSPACE + shell: bash + + # BUILD + - name: CMake Build + run: cmake --build . --parallel 3 --config Release + working-directory: ${{ runner.workspace }}/build + + build_release_werror: + name: "gcc REL -Werror (build only)" + runs-on: ubuntu-latest + steps: + # SETUP + - name: Install Linux Dependencies + run: | + sudo apt-get update + sudo apt-get install ninja-build doxygen graphviz + sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt install gcc-12 g++-12 gfortran-12 + echo "CC=gcc-12" >> $GITHUB_ENV + echo "CXX=g++-12" >> $GITHUB_ENV + echo "FC=gfortran-12" >> $GITHUB_ENV + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Get Sources + uses: actions/checkout@v4.1.7 + + # CMAKE CONFIGURE + - name: CMake Configure + run: | + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + -G Ninja \ + --log-level=VERBOSE \ + -DCMAKE_BUILD_TYPE=Release \ + -DBUILD_SHARED_LIBS=ON \ + -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DHDF5_ENABLE_WARNINGS_AS_ERRORS=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=ON \ + -DHDF5_BUILD_FORTRAN=ON \ + -DHDF5_BUILD_JAVA=ON \ + -DHDF5_BUILD_DOC=OFF \ + -DLIBAEC_USE_LOCALCONTENT=OFF \ + -DZLIB_USE_LOCALCONTENT=OFF \ + -DHDF5_ENABLE_MIRROR_VFD:BOOL=ON \ + -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ + -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ + $GITHUB_WORKSPACE + shell: bash + + # BUILD + - name: CMake Build + run: cmake --build . --parallel 3 --config Release + working-directory: ${{ runner.workspace }}/build + + test-cmake-minimum: + runs-on: ubuntu-latest + steps: + - name: Install Linux Dependencies + run: | + sudo apt-get update + sudo apt-get install ninja-build doxygen graphviz + sudo apt install libssl3 libssl-dev libcurl4 libcurl4-openssl-dev + sudo apt install gcc-12 g++-12 gfortran-12 + echo "CC=gcc-12" >> $GITHUB_ENV + echo "CXX=g++-12" >> $GITHUB_ENV + echo "FC=gfortran-12" >> $GITHUB_ENV + + - uses: lukka/get-cmake@latest + with: + cmakeVersion: 3.18 + + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it + - name: Get Sources + uses: actions/checkout@v4.1.7 + + # CMAKE CONFIGURE + - name: CMake Configure + run: | + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + -G Ninja \ + --log-level=VERBOSE \ + -DCMAKE_BUILD_TYPE=Debug \ + -DBUILD_SHARED_LIBS=ON \ + -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DHDF5_ENABLE_WARNINGS_AS_ERRORS=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=ON \ + -DHDF5_BUILD_FORTRAN=OFF \ + -DHDF5_BUILD_JAVA=ON \ + -DHDF5_BUILD_DOC=OFF \ + -DLIBAEC_USE_LOCALCONTENT=OFF \ + -DZLIB_USE_LOCALCONTENT=OFF \ + -DHDF5_ENABLE_MIRROR_VFD:BOOL=ON \ + -DHDF5_ENABLE_DIRECT_VFD:BOOL=ON \ + -DHDF5_ENABLE_ROS3_VFD:BOOL=ON \ + $GITHUB_WORKSPACE + shell: bash + + # BUILD + - name: CMake Build + run: cmake --build . --parallel 3 --config Release + working-directory: ${{ runner.workspace }}/build + diff --git a/.github/workflows/main-cmake.yml b/.github/workflows/main-cmake.yml index 9c58f0ba8e2..c59167ea6ac 100644 --- a/.github/workflows/main-cmake.yml +++ b/.github/workflows/main-cmake.yml @@ -8,7 +8,6 @@ on: description: "TS or empty" required: true type: string - build_mode: description: "release vs. debug build" required: true @@ -160,9 +159,7 @@ jobs: - name: Get Sources uses: actions/checkout@v4.1.7 - # # CMAKE CONFIGURE - # - name: CMake Configure run: | mkdir "${{ runner.workspace }}/build" @@ -171,21 +168,22 @@ jobs: ${{ matrix.generator }} \ --log-level=VERBOSE \ -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ - -DBUILD_SHARED_LIBS=ON \ - -DHDF5_ENABLE_ALL_WARNINGS=ON \ - -DHDF5_ENABLE_DOXY_WARNINGS=ON \ + -DBUILD_SHARED_LIBS:BOOL=ON \ + -DHDF5_ENABLE_ALL_WARNINGS:BOOL=ON \ + -DHDF5_ENABLE_DOXY_WARNINGS:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} \ -DHDF5_BUILD_CPP_LIB:BOOL=${{ matrix.cpp }} \ - -DHDF5_BUILD_FORTRAN=${{ matrix.fortran }} \ - -DHDF5_BUILD_JAVA=${{ matrix.java }} \ - -DHDF5_BUILD_DOC=${{ matrix.docs }} \ - -DLIBAEC_USE_LOCALCONTENT=${{ matrix.localaec }} \ - -DZLIB_USE_LOCALCONTENT=${{ matrix.localzlib }} \ + -DHDF5_BUILD_FORTRAN:BOOL=${{ matrix.fortran }} \ + -DHDF5_BUILD_JAVA:BOOL=${{ matrix.java }} \ + -DHDF5_BUILD_DOC:BOOL=${{ matrix.docs }} \ + -DLIBAEC_USE_LOCALCONTENT:BOOL=${{ matrix.localaec }} \ + -DZLIB_USE_LOCALCONTENT:BOOL=${{ matrix.localzlib }} \ -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} \ -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} \ -DHDF5_ENABLE_ROS3_VFD:BOOL=${{ matrix.ros3_vfd }} \ -DHDF5_PACK_EXAMPLES:BOOL=ON \ -DHDF5_PACKAGE_EXTLIBS:BOOL=ON \ + -DHDF5_PACK_MACOSX_DMG:BOOL=OFF \ $GITHUB_WORKSPACE shell: bash if: ${{ inputs.thread_safety != 'TS' }} @@ -197,36 +195,33 @@ jobs: cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ ${{ matrix.generator }} \ -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ - -DBUILD_SHARED_LIBS=ON \ - -DBUILD_STATIC_LIBS=${{ (matrix.os != 'windows-latest') }} \ - -DHDF5_ENABLE_ALL_WARNINGS=ON \ + -DBUILD_SHARED_LIBS:BOOL=ON \ + -DBUILD_STATIC_LIBS:BOOL=${{ (matrix.os != 'windows-latest') }} \ + -DHDF5_ENABLE_ALL_WARNINGS:BOOL=ON \ -DHDF5_ENABLE_THREADSAFE:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=${{ matrix.parallel }} \ -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ -DHDF5_BUILD_FORTRAN:BOOL=OFF \ -DHDF5_BUILD_JAVA:BOOL=OFF \ -DHDF5_BUILD_HL_LIB:BOOL=OFF \ - -DHDF5_BUILD_DOC=OFF \ - -DLIBAEC_USE_LOCALCONTENT=${{ matrix.localaec }} \ - -DZLIB_USE_LOCALCONTENT=${{ matrix.localzlib }} \ + -DHDF5_BUILD_DOC:BOOL=OFF \ + -DLIBAEC_USE_LOCALCONTENT:BOOL=${{ matrix.localaec }} \ + -DZLIB_USE_LOCALCONTENT:BOOL=${{ matrix.localzlib }} \ -DHDF5_ENABLE_MIRROR_VFD:BOOL=${{ matrix.mirror_vfd }} \ -DHDF5_ENABLE_DIRECT_VFD:BOOL=${{ matrix.direct_vfd }} \ -DHDF5_ENABLE_ROS3_VFD:BOOL=${{ matrix.ros3_vfd }} \ -DHDF5_PACK_EXAMPLES:BOOL=ON \ + -DHDF5_PACK_MACOSX_DMG:BOOL=OFF \ $GITHUB_WORKSPACE shell: bash if: ${{ inputs.thread_safety == 'TS' }} - # # BUILD - # - name: CMake Build run: cmake --build . --parallel 3 --config ${{ inputs.build_mode }} working-directory: ${{ runner.workspace }}/build - # # RUN TESTS - # - name: CMake Run Tests run: ctest . --parallel 2 -C ${{ inputs.build_mode }} -V working-directory: ${{ runner.workspace }}/build @@ -241,6 +236,11 @@ jobs: - name: CMake Run Package run: cpack -C ${{ inputs.build_mode }} -V working-directory: ${{ runner.workspace }}/build +# if: ${{ (matrix.os != 'macos-latest') && (inputs.build_mode != 'Debug') }} + +# - name: CMake Run Package (Mac_latest) +# run: cpack -C ${{ inputs.build_mode }} -G STGZ -V +# if: ${{ (matrix.os == 'macos-latest') }} - name: List files in the space run: | @@ -253,15 +253,15 @@ jobs: name: zip-vs2022_cl-${{ inputs.build_mode }}-binary path: ${{ runner.workspace }}/build/HDF5-*-win64.zip if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` - if: ${{ (matrix.os == 'windows-latest') && (inputs.thread_safety != 'TS') }} + if: ${{ (matrix.os == 'windows-latest') && (inputs.thread_safety != 'TS') && ( inputs.build_mode != 'Debug') }} - name: Save published binary (linux) uses: actions/upload-artifact@v4 with: - name: tgz-ubuntu-2204_gcc-${{ inputs.build_mode }}-binary + name: tgz-ubuntu-2404_gcc-${{ inputs.build_mode }}-binary path: ${{ runner.workspace }}/build/HDF5-*-Linux.tar.gz if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` - if: ${{ (matrix.os == 'ubuntu-latest') && (inputs.thread_safety != 'TS') }} + if: ${{ (matrix.os == 'ubuntu-latest') && (inputs.thread_safety != 'TS') && ( inputs.build_mode != 'Debug') }} - name: Save published binary (Mac_latest) uses: actions/upload-artifact@v4 @@ -269,12 +269,4 @@ jobs: name: tgz-macos14_clang-${{ inputs.build_mode }}-binary path: ${{ runner.workspace }}/build/HDF5-*-Darwin.tar.gz if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` - if: ${{ (matrix.os == 'macos-latest') && (inputs.thread_safety != 'TS') }} - - - name: Save published dmg binary (Mac_latest) - uses: actions/upload-artifact@v4 - with: - name: tgz-macos14_clang-${{ inputs.build_mode }}-dmg-binary - path: ${{ runner.workspace }}/build/HDF5-*-Darwin.dmg - if-no-files-found: error # 'warn' or 'ignore' are also available, defaults to `warn` - if: ${{ (matrix.os == 'macos-latest') && (inputs.thread_safety != 'TS') }} + if: ${{ (matrix.os == 'macos-latest') && (inputs.thread_safety != 'TS') && ( inputs.build_mode != 'Debug') }} diff --git a/.github/workflows/msys2-cmake.yml b/.github/workflows/msys2-cmake.yml new file mode 100644 index 00000000000..363146c85d5 --- /dev/null +++ b/.github/workflows/msys2-cmake.yml @@ -0,0 +1,91 @@ +name: hdf5 dev CMake MSys2 CI + +# Triggers the workflow on a call from another workflow +on: + workflow_call: + inputs: + build_mode: + description: "release vs. debug build" + required: true + type: string + +permissions: + contents: read + +jobs: + + CMake_build_and_test: + + # The type of runner that the job will run on + runs-on: windows-latest + strategy: + matrix: + include: + - { icon: '⬛', sys: mingw32 } + - { icon: '🟦', sys: mingw64 } + - { icon: '🟨', sys: ucrt64 } + - { icon: '🟧', sys: clang64 } + name: ${{ matrix.icon }} MSYS2-${{ matrix.sys }}-${{ inputs.build_mode }} + defaults: + run: + shell: msys2 {0} + + steps: + - name: '${{ matrix.icon }} Setup MSYS2' + uses: msys2/setup-msys2@v2 + with: + msystem: ${{matrix.sys}} + update: true + install: >- + base-devel + git + gcc + make + development + pacboy: >- + toolchain:p + cmake:p + ninja:p + + - name: Set git to use LF + run: | + git config --global core.autocrlf input + + - name: Get Sources + uses: actions/checkout@v4.1.1 + + - name: CMake Configure + run: | + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ + -DCMAKE_TOOLCHAIN_FILE="" \ + -DHDF5_GENERATE_HEADERS:BOOL=OFF \ + -DBUILD_SHARED_LIBS:BOOL=ON \ + -DHDF5_ENABLE_ALL_WARNINGS:BOOL=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ + -DHDF5_BUILD_FORTRAN:BOOL=OFF \ + -DHDF5_BUILD_JAVA:BOOL=OFF \ + -DHDF5_BUILD_DOC:BOOL=OFF \ + -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF \ + -DZLIB_USE_LOCALCONTENT:BOOL=OFF \ + $GITHUB_WORKSPACE + + - name: CMake Build + run: | + cmake --build . --parallel 3 --config ${{ inputs.build_mode }} + working-directory: ${{ runner.workspace }}/build + + - name: CMake Run Tests + run: | + ctest . --parallel 2 -C ${{ inputs.build_mode }} -V -E "testhdf5-base|cache_api|dt_arith|H5TEST-dtypes|err_compat" + working-directory: ${{ runner.workspace }}/build + + - name: CMake Run Expected to Fail Tests + run: | + ctest . --parallel 2 -C ${{ inputs.build_mode }} -V -R "testhdf5-base|cache_api|dt_arith|H5TEST-dtypes|err_compat" + working-directory: ${{ runner.workspace }}/build + continue-on-error: true diff --git a/.github/workflows/netcdf.yml b/.github/workflows/netcdf.yml index 963f9dce673..e23e45fea4b 100644 --- a/.github/workflows/netcdf.yml +++ b/.github/workflows/netcdf.yml @@ -12,7 +12,7 @@ on: - 'doc/**' - 'release_docs/**' - 'ACKNOWLEDGEMENTS' - - 'COPYING**' + - 'LICENSE**' - '**.md' permissions: @@ -29,26 +29,56 @@ jobs: steps: - name: Install System dependencies run: | - sudo apt update + sudo apt-get update + sudo apt-get install ninja-build + sudo apt install libssl3 libssl-dev libcurl4 sudo apt install -y libaec-dev zlib1g-dev automake autoconf libcurl4-openssl-dev libjpeg-dev wget curl bzip2 m4 flex bison cmake libzip-dev doxygen openssl libtool libtool-bin + - name: Checkout HDF5 uses: actions/checkout@v4.1.7 + + - name: CMake Configure + run: | + mkdir "${{ runner.workspace }}/build" + cd "${{ runner.workspace }}/build" + cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake \ + -G Ninja \ + -DCMAKE_BUILD_TYPE=Release \ + -DONLY_SHARED_LIBS:BOOL=ON \ + -DHDF5_ENABLE_PARALLEL:BOOL=OFF \ + -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ + -DHDF5_BUILD_FORTRAN:BOOL=OFF \ + -DHDF5_BUILD_JAVA:BOOL=OFF \ + -DHDF5_BUILD_DOC:BOOL=OFF \ + -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF \ + -DZLIB_USE_LOCALCONTENT:BOOL=OFF \ + -DH5_NO_DEPRECATED_SYMBOLS:BOOL=OFF \ + -DBUILD_TESTING:BOOL=OFF \ + -DCMAKE_INSTALL_PREFIX:PATH=/usr/local \ + $GITHUB_WORKSPACE + shell: bash + + - name: CMake Build + run: cmake --build . --parallel 3 --config Release + working-directory: ${{ runner.workspace }}/build + - name: Install HDF5 run: | - ./autogen.sh - ./configure --prefix=/usr/local --disable-tests --disable-static --enable-shared --enable-hl --with-szlib - make -j - sudo make install -j + sudo cmake --install . --config Release --prefix="/usr/local" + working-directory: ${{ runner.workspace }}/build + - name: Checkout netCDF uses: actions/checkout@v4.1.7 with: repository: unidata/netcdf-c path: netcdf-c + - name: Test netCDF run: | cd netcdf-c autoreconf -if - CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./configure --enable-hdf5 --enable-dap --disable-dap-remote-tests --enable-external-server-tests + # NOTE: --disable-byterange should be removed when the HTTP VFD has been updated + CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} ./configure --enable-hdf5 --enable-dap --disable-dap-remote-tests --disable-byterange --enable-external-server-tests cat config.log cat libnetcdf.settings CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} LD_LIBRARY_PATH=${LD_LIBRARY_PATH} make -j diff --git a/.github/workflows/nvhpc-auto.yml b/.github/workflows/nvhpc-auto.yml index bca490485d7..33c03f86f28 100644 --- a/.github/workflows/nvhpc-auto.yml +++ b/.github/workflows/nvhpc-auto.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Get Sources - uses: actions/checkout@v4.1.7 + uses: actions/checkout@v4.2.1 - name: Install Dependencies shell: bash @@ -35,21 +35,21 @@ jobs: curl https://developer.download.nvidia.com/hpc-sdk/ubuntu/DEB-GPG-KEY-NVIDIA-HPC-SDK | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg echo 'deb [signed-by=/usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg] https://developer.download.nvidia.com/hpc-sdk/ubuntu/amd64 /' | sudo tee /etc/apt/sources.list.d/nvhpc.list sudo apt-get update -y - sudo apt-get install -y nvhpc-24-7 + sudo apt-get install -y nvhpc-24-11 echo "NVHPCSDK=/opt/nvidia/hpc_sdk" >> $GITHUB_ENV - echo "OMPI_CXX=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin/nvc++" >> $GITHUB_ENV - echo "OMPI_CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin/nvc" >> $GITHUB_ENV - echo "OMPI_FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin/nvfortran" >> $GITHUB_ENV - echo "CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin/mpicc" >> $GITHUB_ENV - echo "FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin/mpifort" >> $GITHUB_ENV - echo "LD_LIBRARY_PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/lib" >> $GITHUB_ENV + echo "OMPI_CXX=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin/nvc++" >> $GITHUB_ENV + echo "OMPI_CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin/nvc" >> $GITHUB_ENV + echo "OMPI_FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin/nvfortran" >> $GITHUB_ENV + echo "CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin/mpicc" >> $GITHUB_ENV + echo "FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin/mpifort" >> $GITHUB_ENV + echo "LD_LIBRARY_PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/lib" >> $GITHUB_ENV echo "DESTDIR=/tmp" >> $GITHUB_ENV - name: Autotools Configure shell: bash run: | export RUNPARALLEL="mpiexec -np 2" - export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin:$PATH + export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin:$PATH sh ./autogen.sh mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" @@ -63,7 +63,7 @@ jobs: - name: Autotools Build shell: bash run: | - export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin:$PATH + export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin:$PATH make -j3 working-directory: ${{ runner.workspace }}/build @@ -73,7 +73,7 @@ jobs: env: NPROCS: 2 run: | - export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin:$PATH + export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin:$PATH cd tools && make check -j2 && cd .. cd hl && make check -j2 && cd .. cd fortran && make check -j2 && cd .. @@ -83,13 +83,13 @@ jobs: env: NPROCS: 2 run: | - export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin:$PATH + export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin:$PATH cd testpar && make check && cd .. working-directory: ${{ runner.workspace }}/build - name: Autotools Install shell: bash run: | - export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin:$PATH + export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin:$PATH make install working-directory: ${{ runner.workspace }}/build diff --git a/.github/workflows/nvhpc-cmake.yml b/.github/workflows/nvhpc-cmake.yml index 3dbefa22861..dbd0e36f4b2 100644 --- a/.github/workflows/nvhpc-cmake.yml +++ b/.github/workflows/nvhpc-cmake.yml @@ -18,7 +18,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Get Sources - uses: actions/checkout@v4.1.7 + uses: actions/checkout@v4.2.1 - name: Install Dependencies shell: bash @@ -34,29 +34,31 @@ jobs: curl https://developer.download.nvidia.com/hpc-sdk/ubuntu/DEB-GPG-KEY-NVIDIA-HPC-SDK | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg echo 'deb [signed-by=/usr/share/keyrings/nvidia-hpcsdk-archive-keyring.gpg] https://developer.download.nvidia.com/hpc-sdk/ubuntu/amd64 /' | sudo tee /etc/apt/sources.list.d/nvhpc.list sudo apt-get update -y - sudo apt-get install -y nvhpc-24-7 + sudo apt-get install -y nvhpc-24-11 echo "NVHPCSDK=/opt/nvidia/hpc_sdk" >> $GITHUB_ENV - echo "OMPI_CXX=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin/nvc++" >> $GITHUB_ENV - echo "OMPI_CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin/nvc" >> $GITHUB_ENV - echo "OMPI_FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin/nvfortran" >> $GITHUB_ENV - echo "CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin/mpicc" >> $GITHUB_ENV - echo "FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin/mpifort" >> $GITHUB_ENV - echo "LD_LIBRARY_PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/cuda/12.3/lib64:/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/lib" >> $GITHUB_ENV + echo "OMPI_CXX=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin/nvc++" >> $GITHUB_ENV + echo "OMPI_CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin/nvc" >> $GITHUB_ENV + echo "OMPI_FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin/nvfortran" >> $GITHUB_ENV + echo "CC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin/mpicc" >> $GITHUB_ENV + echo "FC=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin/mpifort" >> $GITHUB_ENV + echo "LD_LIBRARY_PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/cuda/12.3/lib64:/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/lib" >> $GITHUB_ENV echo "DESTDIR=/tmp" >> $GITHUB_ENV - name: CMake Configure shell: bash run: | - export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.7/compilers/bin:$PATH + export PATH=/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/comm_libs/openmpi4/bin:/opt/nvidia/hpc_sdk/Linux_x86_64/24.11/compilers/bin:$PATH mkdir "${{ runner.workspace }}/build" cd "${{ runner.workspace }}/build" cmake -C $GITHUB_WORKSPACE/config/cmake/cacheinit.cmake -G Ninja \ -DCMAKE_BUILD_TYPE=${{ inputs.build_mode }} \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ -DHDF5_ENABLE_PARALLEL:BOOL=ON \ + -DMPIEXEC_NUMPROC_FLAG:STRING=-np \ + -DMPIEXEC_MAX_NUMPROCS:STRING=2 \ -DHDF5_BUILD_CPP_LIB:BOOL=OFF \ - -DLIBAEC_USE_LOCALCONTENT=OFF \ - -DZLIB_USE_LOCALCONTENT=OFF \ + -DLIBAEC_USE_LOCALCONTENT:BOOL=OFF \ + -DZLIB_USE_LOCALCONTENT:BOOL=OFF \ -DHDF5_BUILD_FORTRAN:BOOL=ON \ -DHDF5_BUILD_JAVA:BOOL=OFF \ -DMPIEXEC_MAX_NUMPROCS:STRING="2" \ @@ -76,6 +78,13 @@ jobs: ctest . -E "MPI_TEST|H5TEST-dt_arith|H5TEST-dtransform" --parallel 2 -C ${{ inputs.build_mode }} -V working-directory: ${{ runner.workspace }}/build + - name: CMake Run Expected To Fail Tests + shell: bash + run: | + ctest . -R "H5TEST-dt_arith|H5TEST-dtransform" --parallel 2 -C ${{ inputs.build_mode }} -V + working-directory: ${{ runner.workspace }}/build + continue-on-error: true + - name: CMake Run Parallel Tests shell: bash run: | diff --git a/.github/workflows/release-files.yml b/.github/workflows/release-files.yml index af5f98ba6c6..a0e1e367b07 100644 --- a/.github/workflows/release-files.yml +++ b/.github/workflows/release-files.yml @@ -121,25 +121,25 @@ jobs: - name: Get published binary (Linux) uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: tgz-ubuntu-2204_gcc-binary + name: tgz-ubuntu-2404_gcc-binary path: ${{ github.workspace }} - name: Get published deb binary (Linux) uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: deb-ubuntu-2204_gcc-binary + name: deb-ubuntu-2404_gcc-binary path: ${{ github.workspace }} - name: Get published rpm binary (Linux) uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: rpm-ubuntu-2204_gcc-binary + name: rpm-ubuntu-2404_gcc-binary path: ${{ github.workspace }} - name: Get published binary (Linux S3) uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: tgz-ubuntu-2204_gcc_s3-binary + name: tgz-ubuntu-2404_gcc_s3-binary path: ${{ github.workspace }} - name: Get published binary (Windows_intel) @@ -157,7 +157,7 @@ jobs: - name: Get published binary (Linux_intel) uses: actions/download-artifact@fa0a91b85d4f404e444e00e005971372dc801d16 # v4.1.8 with: - name: tgz-ubuntu-2204_intel-binary + name: tgz-ubuntu-2404_intel-binary path: ${{ github.workspace }} - name: Get published abi reports (Linux) @@ -187,13 +187,13 @@ jobs: sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}.zip >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.dmg >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt - sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt - sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.deb >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt - sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.rpm >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt - sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc_s3.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt + sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt + sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.deb >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt + sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.rpm >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt + sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc_s3.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.zip >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.msi >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt - sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_intel.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt + sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_intel.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.zip >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.msi >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt sha256sum ${{ steps.get-file-base.outputs.FILE_BASE }}.html.abi.reports.tar.gz >> ${{ steps.get-file-base.outputs.FILE_BASE }}.sha256sums.txt @@ -221,7 +221,7 @@ jobs: - name: PreRelease tag id: create_prerelease if: ${{ (inputs.use_environ == 'snapshots') }} - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 with: tag_name: "${{ inputs.use_tag }}" prerelease: true @@ -233,13 +233,13 @@ jobs: ${{ steps.get-file-base.outputs.FILE_BASE }}.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.dmg - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.tar.gz - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.deb - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.rpm - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc_s3.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.deb + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.rpm + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc_s3.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.msi - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_intel.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_intel.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.msi ${{ steps.get-file-base.outputs.FILE_BASE }}.html.abi.reports.tar.gz @@ -249,7 +249,7 @@ jobs: - name: Release tag id: create_release if: ${{ (inputs.use_environ == 'release') }} - uses: softprops/action-gh-release@c062e08bd532815e2082a85e87e3ef29c3e6d191 # v2.0.8 + uses: softprops/action-gh-release@e7a8f85e1c67a31e6ed99a94b41bd0b71bbee6b8 # v2.0.9 with: tag_name: "${{ inputs.use_tag }}" prerelease: false @@ -262,13 +262,13 @@ jobs: hdf5.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.dmg - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.tar.gz - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.deb - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.rpm - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc_s3.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.deb + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.rpm + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc_s3.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.msi - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_intel.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_intel.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.msi ${{ steps.get-file-base.outputs.FILE_BASE }}.html.abi.reports.tar.gz diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index e41b30c4d37..5f750a08f7e 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,7 +55,7 @@ jobs: needs: [log-the-inputs, call-workflow-tarball, call-workflow-ctest] uses: ./.github/workflows/abi-report.yml with: - file_ref: '1.14.4.3' + file_ref: '1.14.5' file_base: ${{ needs.call-workflow-tarball.outputs.file_base }} use_tag: ${{ needs.log-the-inputs.outputs.rel_tag }} use_environ: release diff --git a/.github/workflows/remove-files.yml b/.github/workflows/remove-files.yml index 418065c8e00..8567c00c485 100644 --- a/.github/workflows/remove-files.yml +++ b/.github/workflows/remove-files.yml @@ -52,12 +52,12 @@ jobs: ${{ steps.get-file-base.outputs.FILE_BASE }}.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-macos14_clang.dmg - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.tar.gz - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.deb - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc.rpm - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_gcc_s3.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.deb + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc.rpm + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_gcc_s3.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_cl.msi - ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2204_intel.tar.gz + ${{ steps.get-file-base.outputs.FILE_BASE }}-ubuntu-2404_intel.tar.gz ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.zip ${{ steps.get-file-base.outputs.FILE_BASE }}-win-vs2022_intel.msi diff --git a/.github/workflows/scorecard.yml b/.github/workflows/scorecard.yml index d3f9fa0f986..a90240dd273 100644 --- a/.github/workflows/scorecard.yml +++ b/.github/workflows/scorecard.yml @@ -67,6 +67,6 @@ jobs: # Upload the results to GitHub's code scanning dashboard. - name: "Upload to code-scanning" - uses: github/codeql-action/upload-sarif@e2b3eafc8d227b0241d48be5f425d47c2d750a13 # v3.26.10 + uses: github/codeql-action/upload-sarif@662472033e021d55d94146f66f6058822b0b39fd # v3.27.0 with: sarif_file: results.sarif diff --git a/.github/workflows/testxpr-cmake.yml b/.github/workflows/testxpr-cmake.yml index b03a67c53cd..47f2d4768d8 100644 --- a/.github/workflows/testxpr-cmake.yml +++ b/.github/workflows/testxpr-cmake.yml @@ -65,4 +65,3 @@ jobs: HDF5TestExpress: 0 run: ctest . --parallel 2 -C ${{ matrix.build_mode }} -V -R H5TESTXPR working-directory: ${{ runner.workspace }}/build - diff --git a/.github/workflows/vol_adios2.yml b/.github/workflows/vol_adios2.yml index d05d35427d5..ad781c10a28 100644 --- a/.github/workflows/vol_adios2.yml +++ b/.github/workflows/vol_adios2.yml @@ -42,7 +42,7 @@ jobs: -DHDF5_TEST_API_ENABLE_ASYNC:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=ON \ -DHDF5_ENABLE_THREADSAFE:BOOL=ON \ - -DALLOW_UNSUPPORTED:BOOL=ON \ + -DHDF5_ALLOW_UNSUPPORTED:BOOL=ON \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ ${{ github.workspace }}/hdf5 cat src/libhdf5.settings diff --git a/.github/workflows/vol_async.yml b/.github/workflows/vol_async.yml index 1d6861ac503..cd631ff4def 100644 --- a/.github/workflows/vol_async.yml +++ b/.github/workflows/vol_async.yml @@ -54,7 +54,7 @@ jobs: -DHDF5_TEST_API_ENABLE_ASYNC:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=ON \ -DHDF5_ENABLE_THREADSAFE:BOOL=ON \ - -DALLOW_UNSUPPORTED:BOOL=ON \ + -DHDF5_ALLOW_UNSUPPORTED:BOOL=ON \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ -DHDF5_VOL_ALLOW_EXTERNAL:STRING="GIT" \ -DHDF5_VOL_URL01:STRING="https://github.com/HDFGroup/vol-async.git" \ diff --git a/.github/workflows/vol_cache.yml b/.github/workflows/vol_cache.yml index 70f325ca2dd..4f6a55ad04a 100644 --- a/.github/workflows/vol_cache.yml +++ b/.github/workflows/vol_cache.yml @@ -82,7 +82,7 @@ jobs: -DHDF5_TEST_API_ENABLE_ASYNC:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=ON \ -DHDF5_ENABLE_THREADSAFE:BOOL=ON \ - -DALLOW_UNSUPPORTED:BOOL=ON \ + -DHDF5_ALLOW_UNSUPPORTED:BOOL=ON \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ -DHDF5_VOL_ALLOW_EXTERNAL:STRING="GIT" \ -DHDF5_VOL_URL01:STRING="https://github.com/HDFGroup/vol-async.git" \ diff --git a/.github/workflows/vol_log.yml b/.github/workflows/vol_log.yml index a7becfd4830..20c4a816ed9 100644 --- a/.github/workflows/vol_log.yml +++ b/.github/workflows/vol_log.yml @@ -40,7 +40,7 @@ jobs: -DHDF5_TEST_API_ENABLE_ASYNC:BOOL=ON \ -DHDF5_ENABLE_PARALLEL:BOOL=ON \ -DHDF5_ENABLE_THREADSAFE:BOOL=ON \ - -DALLOW_UNSUPPORTED:BOOL=ON \ + -DHDF5_ALLOW_UNSUPPORTED:BOOL=ON \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ ${{ github.workspace }}/hdf5 cat src/libhdf5.settings diff --git a/.github/workflows/vol_rest.yml b/.github/workflows/vol_rest.yml index 487f854e9f1..fe964453a4c 100644 --- a/.github/workflows/vol_rest.yml +++ b/.github/workflows/vol_rest.yml @@ -56,9 +56,9 @@ jobs: -DBUILD_STATIC_LIBS=OFF \ -DHDF5_BUILD_HL_LIB:BOOL=ON \ -DHDF5_TEST_API:BOOL=ON \ - -DALLOW_UNSUPPORTED:BOOL=ON \ + -DHDF5_ALLOW_UNSUPPORTED:BOOL=ON \ -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF \ - -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF \ + -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF \ -DHDF5_VOL_ALLOW_EXTERNAL:STRING="GIT" \ -DHDF5_VOL_URL01:STRING="https://github.com/HDFGroup/vol-rest.git" \ -DHDF5_VOL_VOL-REST_BRANCH:STRING="master" \ diff --git a/.gitignore b/.gitignore index d6b8b714dcb..3acf4fd1e36 100644 --- a/.gitignore +++ b/.gitignore @@ -32,15 +32,7 @@ m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 m4/lt~obsolete.m4 -src/H5Edefin.h -src/H5Einit.h -src/H5Emajdef.h -src/H5Emindef.h -src/H5Epubgen.h -src/H5Eterm.h src/H5config.h.in -src/H5overflow.h -src/H5version.h /.classpath /CMakeUserPresets.json diff --git a/.h5chkright.ini b/.h5chkright.ini index 02d3cadd48f..77eb740cfff 100644 --- a/.h5chkright.ini +++ b/.h5chkright.ini @@ -3,7 +3,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -17,8 +17,8 @@ # with the same name. E.g., # "prune test" skips test, fortran/test, c++/test, ... -# Skip COPYING since it is the detail Copyright notice. -skip COPYING +# Skip LICENSE since it is the detail Copyright notice. +skip LICENSE # Sort of strange to have a copyright notice in README skip README diff --git a/CMakeFilters.cmake b/CMakeFilters.cmake index 52d65e59e47..7bf152aa357 100644 --- a/CMakeFilters.cmake +++ b/CMakeFilters.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -55,7 +55,7 @@ if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MAT endif () if (ZLIB_USE_LOCALCONTENT) if (NOT EXISTS "${ZLIB_URL}") - set (HDF5_ENABLE_Z_LIB_SUPPORT OFF CACHE BOOL "" FORCE) + set (HDF5_ENABLE_ZLIB_SUPPORT OFF CACHE BOOL "" FORCE) message (VERBOSE "Filter ZLIB file ${ZLIB_URL} not found") endif () endif () @@ -66,7 +66,7 @@ if (HDF5_ALLOW_EXTERNAL_SUPPORT MATCHES "GIT" OR HDF5_ALLOW_EXTERNAL_SUPPORT MAT endif () endif () else () - set (HDF5_ENABLE_Z_LIB_SUPPORT OFF CACHE BOOL "" FORCE) + set (HDF5_ENABLE_ZLIB_SUPPORT OFF CACHE BOOL "" FORCE) set (ZLIB_USE_EXTERNAL OFF CACHE BOOL "Use External Library Building for ZLIB else search") set (HDF5_ENABLE_SZIP_SUPPORT OFF CACHE BOOL "" FORCE) set (SZIP_USE_EXTERNAL OFF CACHE BOOL "Use External Library Building for SZIP else search") @@ -77,8 +77,8 @@ endif () # Option for ZLib support #----------------------------------------------------------------------------- set(H5_ZLIB_FOUND FALSE) -option (HDF5_ENABLE_Z_LIB_SUPPORT "Enable Zlib Filters" ON) -if (HDF5_ENABLE_Z_LIB_SUPPORT) +option (HDF5_ENABLE_ZLIB_SUPPORT "Enable Zlib Filters" ON) +if (HDF5_ENABLE_ZLIB_SUPPORT) if (NOT H5_ZLIB_HEADER) if (NOT ZLIB_USE_EXTERNAL) if (HDF5_USE_ZLIB_NG) @@ -101,14 +101,18 @@ if (HDF5_ENABLE_Z_LIB_SUPPORT) endif () set(H5_ZLIB_FOUND ${ZLIB_FOUND}) if (H5_ZLIB_FOUND) - set (H5_ZLIB_HEADER "zlib.h") + if (HDF5_USE_ZLIB_NG) + set (H5_ZLIB_HEADER "zlib-ng.h") + else () + set (H5_ZLIB_HEADER "zlib.h") + endif () set (H5_ZLIB_INCLUDE_DIR_GEN ${ZLIB_INCLUDE_DIR}) set (H5_ZLIB_INCLUDE_DIRS ${H5_ZLIB_INCLUDE_DIRS} ${ZLIB_INCLUDE_DIR}) # The FindZLIB.cmake module does not set an OUTPUT_NAME # on the target. The target returned is: ZLIB::ZLIB get_filename_component (libname ${ZLIB_LIBRARIES} NAME_WLE) string (REGEX REPLACE "^lib" "" libname ${libname}) - set_target_properties (ZLIB::ZLIB PROPERTIES OUTPUT_NAME zlib-static) + set_target_properties (ZLIB::ZLIB PROPERTIES OUTPUT_NAME ${libname}) set (LINK_COMP_LIBS ${LINK_COMP_LIBS} ZLIB::ZLIB) endif () else () @@ -125,6 +129,9 @@ if (HDF5_ENABLE_Z_LIB_SUPPORT) if (H5_ZLIB_FOUND) set (H5_HAVE_FILTER_DEFLATE 1) set (H5_HAVE_ZLIB_H 1) + if (HDF5_USE_ZLIB_NG) + set (H5_HAVE_ZLIBNG_H 1) + endif () set (H5_HAVE_LIBZ 1) if (H5_HAVE_FILTER_DEFLATE) set (EXTERNAL_FILTERS "${EXTERNAL_FILTERS} DEFLATE") @@ -132,9 +139,10 @@ if (HDF5_ENABLE_Z_LIB_SUPPORT) set (HDF5_COMP_INCLUDE_DIRECTORIES "${HDF5_COMP_INCLUDE_DIRECTORIES};${H5_ZLIB_INCLUDE_DIRS}") message (VERBOSE "Filter HDF5_ZLIB is ON") else () - set (HDF5_ENABLE_Z_LIB_SUPPORT OFF CACHE BOOL "" FORCE) + set (HDF5_ENABLE_ZLIB_SUPPORT OFF CACHE BOOL "" FORCE) message (WARNING " ZLib support in HDF5 was enabled but not found") endif () + message(STATUS "H5_ZLIB_HEADER=${H5_ZLIB_HEADER}") endif () #----------------------------------------------------------------------------- @@ -146,13 +154,13 @@ if (HDF5_ENABLE_SZIP_SUPPORT) option (HDF5_ENABLE_SZIP_ENCODING "Use SZip Encoding" ON) if (NOT SZIP_USE_EXTERNAL) if (HDF5_USE_LIBAEC_STATIC) - set(LIBAEC_SEACH_TYPE static) + set(LIBAEC_SEARCH_TYPE static) else () - set(LIBAEC_SEACH_TYPE shared) + set(LIBAEC_SEARCH_TYPE shared) endif () set(libaec_USE_STATIC_LIBS ${HDF5_USE_LIBAEC_STATIC}) set(SZIP_FOUND FALSE) - find_package (SZIP NAMES ${LIBAEC_PACKAGE_NAME}${HDF_PACKAGE_EXT} COMPONENTS ${LIBAEC_SEACH_TYPE}) + find_package (SZIP NAMES ${LIBAEC_PACKAGE_NAME}${HDF_PACKAGE_EXT} COMPONENTS ${LIBAEC_SEARCH_TYPE}) if (NOT SZIP_FOUND) find_package (SZIP) # Legacy find endif () diff --git a/CMakeInstallation.cmake b/CMakeInstallation.cmake index a2564e68ad5..6211c959e99 100644 --- a/CMakeInstallation.cmake +++ b/CMakeInstallation.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -180,10 +180,10 @@ endif () HDF_README_PROPERTIES(HDF5_BUILD_FORTRAN) #----------------------------------------------------------------------------- -# Configure the COPYING.txt file for the windows binary package +# Configure the LICENSE.txt file for the windows binary package #----------------------------------------------------------------------------- if (WIN32) - configure_file (${HDF5_SOURCE_DIR}/COPYING ${HDF5_BINARY_DIR}/COPYING.txt @ONLY) + configure_file (${HDF5_SOURCE_DIR}/LICENSE ${HDF5_BINARY_DIR}/LICENSE.txt @ONLY) endif () #----------------------------------------------------------------------------- @@ -191,7 +191,7 @@ endif () #----------------------------------------------------------------------------- if (NOT HDF5_EXTERNALLY_CONFIGURED) install ( - FILES ${HDF5_SOURCE_DIR}/COPYING + FILES ${HDF5_SOURCE_DIR}/LICENSE DESTINATION ${HDF5_INSTALL_DATA_DIR} COMPONENT hdfdocuments ) @@ -255,7 +255,7 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES) set (CPACK_PACKAGE_VERSION_MAJOR "${HDF5_PACKAGE_VERSION_MAJOR}") set (CPACK_PACKAGE_VERSION_MINOR "${HDF5_PACKAGE_VERSION_MINOR}") set (CPACK_PACKAGE_VERSION_PATCH "") - set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/COPYING") + set (CPACK_RESOURCE_FILE_LICENSE "${CMAKE_CURRENT_SOURCE_DIR}/LICENSE") if (EXISTS "${HDF5_SOURCE_DIR}/release_docs") set (CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/RELEASE.txt") set (CPACK_RESOURCE_FILE_README "${CMAKE_CURRENT_SOURCE_DIR}/release_docs/RELEASE.txt") @@ -321,7 +321,7 @@ if (NOT HDF5_EXTERNALLY_CONFIGURED AND NOT HDF5_NO_PACKAGES) # With CPACK_WIX_LICENSE_RTF you can override the license file used by the # WiX Generator in case CPACK_RESOURCE_FILE_LICENSE is in an unsupported # format or the .txt -> .rtf conversion does not work as expected. - set (CPACK_RESOURCE_FILE_LICENSE "${HDF5_BINARY_DIR}/COPYING.txt") + set (CPACK_RESOURCE_FILE_LICENSE "${HDF5_BINARY_DIR}/LICENSE.txt") # .. variable:: CPACK_WIX_PRODUCT_ICON # The Icon shown next to the program name in Add/Remove programs. set(CPACK_WIX_PRODUCT_ICON "${HDF_RESOURCES_DIR}\\\\hdf.ico") diff --git a/CMakeLists.txt b/CMakeLists.txt index 2dc3af4a8ef..4c8366d8393 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -114,7 +114,7 @@ mark_as_advanced (HDF5_EXTERNAL_LIB_SUFFIX) # # # Setup all necessary overrides for zlib so that HDF5 uses our # # internally compiled zlib rather than any other version -# if (HDF5_ENABLE_Z_LIB_SUPPORT) +# if (HDF5_ENABLE_ZLIB_SUPPORT) # # We must tell the main HDF5 library that it depends on our zlib # set (HDF5_LIB_DEPENDENCIES vtkzlib) # # Override the zlib header file @@ -147,8 +147,8 @@ if (HDF5_USE_FOLDERS) endif () option (HDF5_NO_PACKAGES "CPACK - Disable packaging" OFF) mark_as_advanced (HDF5_NO_PACKAGES) -option (ALLOW_UNSUPPORTED "Allow unsupported combinations of configure options" OFF) -mark_as_advanced (ALLOW_UNSUPPORTED) +option (HDF5_ALLOW_UNSUPPORTED "Allow unsupported combinations of configure options" OFF) +mark_as_advanced (HDF5_ALLOW_UNSUPPORTED) #----------------------------------------------------------------------------- # Set the core names of all the libraries CORENAME is the base library name @@ -259,15 +259,16 @@ set (HDF5_TEST_SRC_DIR ${HDF5_SOURCE_DIR}/test) set (HDF5_TEST_PAR_DIR ${HDF5_SOURCE_DIR}/testpar) set (HDF5_TEST_API_SRC_DIR ${HDF5_SOURCE_DIR}/test/API) set (HDF5_TEST_API_PAR_SRC_DIR ${HDF5_SOURCE_DIR}/testpar/API) -set (HDF5_CPP_SRC_DIR ${HDF5_SOURCE_DIR}/c++) +set (HDF5_CPP_SRC_DIR ${HDF5_SOURCE_DIR}/c++/src) set (HDF5_CPP_TST_DIR ${HDF5_SOURCE_DIR}/c++/test) -set (HDF5_HL_SRC_DIR ${HDF5_SOURCE_DIR}/hl) -set (HDF5_HL_CPP_SRC_DIR ${HDF5_SOURCE_DIR}/hl/c++) +set (HDF5_HL_SRC_DIR ${HDF5_SOURCE_DIR}/hl/src) +set (HDF5_HL_TST_DIR ${HDF5_SOURCE_DIR}/hl/test) +set (HDF5_HL_CPP_SRC_DIR ${HDF5_SOURCE_DIR}/hl/c++/src) +set (HDF5_HL_CPP_TST_DIR ${HDF5_SOURCE_DIR}/hl/c++/test) set (HDF5_HL_TOOLS_DIR ${HDF5_SOURCE_DIR}/hl/tools) set (HDF5_TOOLS_ROOT_DIR ${HDF5_SOURCE_DIR}/tools) set (HDF5_TOOLS_SRC_DIR ${HDF5_SOURCE_DIR}/tools/src) set (HDF5_TOOLS_TST_DIR ${HDF5_SOURCE_DIR}/tools/test) -set (HDF5_PERFORM_SRC_DIR ${HDF5_SOURCE_DIR}/tools/src/perform) set (HDF5_UTILS_DIR ${HDF5_SOURCE_DIR}/utils) set (HDF5_F90_SRC_DIR ${HDF5_SOURCE_DIR}/fortran) set (HDF5_JAVA_JNI_SRC_DIR ${HDF5_SOURCE_DIR}/java/src/jni) @@ -519,8 +520,8 @@ endif () #----------------------------------------------------------------------------- # Option to Build Shared and Static libs, default is both #----------------------------------------------------------------------------- -option (ONLY_SHARED_LIBS "Only Build Shared Libraries" OFF) -mark_as_advanced (ONLY_SHARED_LIBS) +option (HDF5_ONLY_SHARED_LIBS "Only Build Shared Libraries" OFF) +mark_as_advanced (HDF5_ONLY_SHARED_LIBS) option (BUILD_STATIC_LIBS "Build Static Libraries" ON) set (H5_ENABLE_STATIC_LIB NO) option (BUILD_SHARED_LIBS "Build Shared Libraries" ON) @@ -530,11 +531,11 @@ option (HDF5_BUILD_STATIC_TOOLS "Build Static Tools NOT Shared Tools" OFF) # only shared libraries/tools is true if user forces static OFF if (NOT BUILD_STATIC_LIBS) - set (ONLY_SHARED_LIBS ON CACHE BOOL "Only Build Shared Libraries" FORCE) + set (HDF5_ONLY_SHARED_LIBS ON CACHE BOOL "Only Build Shared Libraries" FORCE) endif () # only shared libraries is set ON by user then force settings -if (ONLY_SHARED_LIBS) +if (HDF5_ONLY_SHARED_LIBS) set (H5_ENABLE_STATIC_LIB NO) set (BUILD_SHARED_LIBS ON CACHE BOOL "Build Shared Libraries" FORCE) set (BUILD_STATIC_LIBS OFF CACHE BOOL "Build Static Libraries" FORCE) @@ -600,8 +601,10 @@ option (HDF5_ENABLE_COVERAGE "Enable code coverage for Libraries and Programs" O if (HDF5_ENABLE_COVERAGE) include (${HDF5_SOURCE_DIR}/config/sanitizer/code-coverage.cmake) if(CODE_COVERAGE AND CODE_COVERAGE_ADDED) + message(VERBOSE "Add instrumentation to all targets") add_code_coverage () # Adds instrumentation to all targets else () + message(VERBOSE "Use --coverage option") set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 --coverage -fprofile-arcs -ftest-coverage") set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g --coverage -O0 -fprofile-arcs -ftest-coverage") if (CMAKE_C_COMPILER_ID STREQUAL "GNU") @@ -856,13 +859,13 @@ if (HDF5_ENABLE_SUBFILING_VFD) endif() -set (DEFAULT_API_VERSION "v118" CACHE STRING "Enable v1.16 API (v16, v18, v110, v112, v114, v116, v118)") -set_property (CACHE DEFAULT_API_VERSION PROPERTY STRINGS v16 v18 v110 v112 v114 v116 v118) +set (HDF5_DEFAULT_API_VERSION "v200" CACHE STRING "Enable v2.0 API (v16, v18, v110, v112, v114, v200)") +set_property (CACHE HDF5_DEFAULT_API_VERSION PROPERTY STRINGS v16 v18 v110 v112 v114 v200) #----------------------------------------------------------------------------- # Option to use 1.6.x API #----------------------------------------------------------------------------- set (H5_USE_16_API_DEFAULT 0) -if (DEFAULT_API_VERSION MATCHES "v16") +if (HDF5_DEFAULT_API_VERSION MATCHES "v16") set (H5_USE_16_API_DEFAULT 1) endif () @@ -870,7 +873,7 @@ endif () # Option to use 1.8.x API #----------------------------------------------------------------------------- set (H5_USE_18_API_DEFAULT 0) -if (DEFAULT_API_VERSION MATCHES "v18") +if (HDF5_DEFAULT_API_VERSION MATCHES "v18") set (H5_USE_18_API_DEFAULT 1) endif () @@ -878,7 +881,7 @@ endif () # Option to use 1.10.x API #----------------------------------------------------------------------------- set (H5_USE_110_API_DEFAULT 0) -if (DEFAULT_API_VERSION MATCHES "v110") +if (HDF5_DEFAULT_API_VERSION MATCHES "v110") set (H5_USE_110_API_DEFAULT 1) endif () @@ -886,7 +889,7 @@ endif () # Option to use 1.12.x API #----------------------------------------------------------------------------- set (H5_USE_112_API_DEFAULT 0) -if (DEFAULT_API_VERSION MATCHES "v112") +if (HDF5_DEFAULT_API_VERSION MATCHES "v112") set (H5_USE_112_API_DEFAULT 1) endif () @@ -894,27 +897,19 @@ endif () # Option to use 1.14.x API #----------------------------------------------------------------------------- set (H5_USE_114_API_DEFAULT 0) -if (DEFAULT_API_VERSION MATCHES "v114") +if (HDF5_DEFAULT_API_VERSION MATCHES "v114") set (H5_USE_114_API_DEFAULT 1) endif () #----------------------------------------------------------------------------- -# Option to use 1.16.x API +# Option to use 2.x.y API #----------------------------------------------------------------------------- -set (H5_USE_116_API_DEFAULT 0) -if (DEFAULT_API_VERSION MATCHES "v116") - set (H5_USE_116_API_DEFAULT 1) +set (H5_USE_200_API_DEFAULT 0) +if (NOT HDF5_DEFAULT_API_VERSION) + set (HDF5_DEFAULT_API_VERSION "v200") endif () - -#----------------------------------------------------------------------------- -# Option to use 1.18.x API -#----------------------------------------------------------------------------- -if (NOT DEFAULT_API_VERSION) - set (DEFAULT_API_VERSION "v118") -endif () -set (H5_USE_118_API_DEFAULT 0) -if (DEFAULT_API_VERSION MATCHES "v118") - set (H5_USE_118_API_DEFAULT 1) +if (DEFAULT_API_VERSION MATCHES "v200") + set (H5_USE_200_API_DEFAULT 1) endif () #----------------------------------------------------------------------------- @@ -954,29 +949,29 @@ if (HDF5_ENABLE_THREADSAFE) endif () endif () if (HDF_ENABLE_PARALLEL) - if (NOT ALLOW_UNSUPPORTED) - message (FATAL_ERROR " **** Parallel and thread-safety options are not supported, override with ALLOW_UNSUPPORTED option **** ") + if (NOT HDF5_ALLOW_UNSUPPORTED) + message (FATAL_ERROR " **** Parallel and thread-safety options are not supported, override with HDF5_ALLOW_UNSUPPORTED option **** ") else () message (VERBOSE " **** Allowing unsupported parallel and thread-safety options **** ") endif () endif () if (HDF5_BUILD_FORTRAN) - if (NOT ALLOW_UNSUPPORTED) - message (FATAL_ERROR " **** Fortran and thread-safety options are not supported, override with ALLOW_UNSUPPORTED option **** ") + if (NOT HDF5_ALLOW_UNSUPPORTED) + message (FATAL_ERROR " **** Fortran and thread-safety options are not supported, override with HDF5_ALLOW_UNSUPPORTED option **** ") else () message (VERBOSE " **** Allowing unsupported Fortran and thread-safety options **** ") endif () endif () if (HDF5_BUILD_CPP_LIB) - if (NOT ALLOW_UNSUPPORTED) - message (FATAL_ERROR " **** C++ and thread-safety options are not supported, override with ALLOW_UNSUPPORTED option **** ") + if (NOT HDF5_ALLOW_UNSUPPORTED) + message (FATAL_ERROR " **** C++ and thread-safety options are not supported, override with HDF5_ALLOW_UNSUPPORTED option **** ") else () message (VERBOSE " **** Allowing unsupported C++ and thread-safety options **** ") endif () endif () if (HDF5_BUILD_HL_LIB) - if (NOT ALLOW_UNSUPPORTED) - message (FATAL_ERROR " **** HL and thread-safety options are not supported, override with ALLOW_UNSUPPORTED option **** ") + if (NOT HDF5_ALLOW_UNSUPPORTED) + message (FATAL_ERROR " **** HL and thread-safety options are not supported, override with HDF5_ALLOW_UNSUPPORTED option **** ") else () message (VERBOSE " **** Allowing unsupported HL and thread-safety options **** ") endif () @@ -1091,7 +1086,7 @@ endif () #----------------------------------------------------------------------------- # Include filter plugins #----------------------------------------------------------------------------- -if (${H5_LIBVER_DIR} EQUAL 16 OR DEFAULT_API_VERSION MATCHES "v16") +if (${H5_LIBVER_DIR} EQUAL 16 OR HDF5_DEFAULT_API_VERSION MATCHES "v16") set (HDF5_ENABLE_PLUGIN_SUPPORT OFF CACHE BOOL "" FORCE) message (VERBOSE "Filter PLUGINs cannot be used with 1.6 API") else () @@ -1131,7 +1126,7 @@ if (EXISTS "${HDF5_SOURCE_DIR}/fortran" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/for option (HDF5_BUILD_FORTRAN "Build FORTRAN support" OFF) if (HDF5_BUILD_FORTRAN) message (VERBOSE "Fortran compiler ID is ${CMAKE_Fortran_COMPILER_ID}") - include (${HDF_RESOURCES_DIR}/HDFFortranCompilerFlags.cmake) + include (${HDF_RESOURCES_DIR}/HDFCompilerFortranFlags.cmake) include (${HDF_RESOURCES_DIR}/HDF5UseFortran.cmake) set (LINK_Fortran_LIBS ${LINK_LIBS}) @@ -1184,14 +1179,14 @@ if (EXISTS "${HDF5_SOURCE_DIR}/c++" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/c++") if (HDF5_BUILD_CPP_LIB) # check for unsupported options if (HDF5_ENABLE_PARALLEL) - if (NOT ALLOW_UNSUPPORTED) - message (FATAL_ERROR " **** Parallel and C++ options are mutually exclusive, override with ALLOW_UNSUPPORTED option **** ") + if (NOT HDF5_ALLOW_UNSUPPORTED) + message (FATAL_ERROR " **** Parallel and C++ options are mutually exclusive, override with HDF5_ALLOW_UNSUPPORTED option **** ") else () message (VERBOSE " **** Allowing unsupported Parallel and C++ options **** ") endif () endif () - include (${HDF_RESOURCES_DIR}/HDFCXXCompilerFlags.cmake) + include (${HDF_RESOURCES_DIR}/HDFCompilerCXXFlags.cmake) add_subdirectory (c++) if (HDF5_BUILD_HL_LIB) @@ -1227,7 +1222,7 @@ configure_file (${HDF_RESOURCES_DIR}/H5pubconf.h.in ${HDF5_SRC_BINARY_DIR}/H5pub #----------------------------------------------------------------------------- if (EXISTS "${HDF5_SOURCE_DIR}/HDF5Examples" AND IS_DIRECTORY "${HDF5_SOURCE_DIR}/HDF5Examples") option (HDF5_BUILD_EXAMPLES "Build HDF5 Library Examples" ON) - if (HDF5_BUILD_EXAMPLES AND NOT USE_SANITIZER) + if (HDF5_BUILD_EXAMPLES AND NOT HDF5_USE_SANITIZER) include (${HDF_RESOURCES_DIR}/HDF5ExampleCache.cmake) set (HDF5_VERSION ${HDF5_PACKAGE_VERSION}) add_subdirectory (HDF5Examples) diff --git a/CMakePlugins.cmake b/CMakePlugins.cmake index f607c2cfb39..5fccb375224 100644 --- a/CMakePlugins.cmake +++ b/CMakePlugins.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/CMakePresets.json b/CMakePresets.json index 472a33df0b6..18ae431dbbe 100644 --- a/CMakePresets.json +++ b/CMakePresets.json @@ -18,11 +18,11 @@ "hidden": true, "cacheVariables": { "ZLIB_PACKAGE_NAME": {"type": "STRING", "value": "zlib"}, - "ZLIB_TGZ_ORIGPATH": {"type": "STRING", "value": "https://github.com/madler/zlib/releases/download/v1.3"}, - "ZLIB_TGZ_NAME": {"type": "STRING", "value": "zlib-1.3.tar.gz"}, + "ZLIB_TGZ_ORIGPATH": {"type": "STRING", "value": "https://github.com/madler/zlib/releases/download/v1.3.1"}, + "ZLIB_TGZ_NAME": {"type": "STRING", "value": "zlib-1.3.1.tar.gz"}, "ZLIBNG_PACKAGE_NAME": {"type": "STRING", "value": "zlib-ng"}, "ZLIBNG_TGZ_ORIGPATH": {"type": "STRING", "value": "https://github.com/zlib-ng/zlib-ng/archive/refs/tags"}, - "ZLIBNG_TGZ_NAME": {"type": "STRING", "value": "2.1.6.tar.gz"}, + "ZLIBNG_TGZ_NAME": {"type": "STRING", "value": "2.2.2.tar.gz"}, "LIBAEC_PACKAGE_NAME": {"type": "STRING", "value": "libaec"}, "LIBAEC_TGZ_ORIGPATH": {"type": "STRING", "value": "https://github.com/MathisRosenhauer/libaec/releases/download/v1.1.3"}, "LIBAEC_TGZ_NAME": {"type": "STRING", "value": "libaec-1.1.3.tar.gz"} @@ -47,11 +47,11 @@ "cacheVariables": { "BSHUF_TGZ_NAME": {"type": "STRING", "value": "bitshuffle-0.5.1.tar.gz"}, "BSHUF_PACKAGE_NAME": {"type": "STRING", "value": "bshuf"}, - "BLOSC_TGZ_NAME": {"type": "STRING", "value": "c-blosc-1.21.5.tar.gz"}, + "BLOSC_TGZ_NAME": {"type": "STRING", "value": "c-blosc-1.21.6.tar.gz"}, "BLOSC_PACKAGE_NAME": {"type": "STRING", "value": "blosc"}, "BLOSC_ZLIB_TGZ_NAME": {"type": "STRING", "value": "zlib-1.3.tar.gz"}, "BLOSC_ZLIB_PACKAGE_NAME": {"type": "STRING", "value": "zlib"}, - "BLOSC2_TGZ_NAME": {"type": "STRING", "value": "c-blosc2-2.14.4.tar.gz"}, + "BLOSC2_TGZ_NAME": {"type": "STRING", "value": "c-blosc2-2.15.1.tar.gz"}, "BLOSC2_PACKAGE_NAME": {"type": "STRING", "value": "blosc2"}, "BLOSC2_ZLIB_TGZ_NAME": {"type": "STRING", "value": "zlib-1.3.tar.gz"}, "BLOSC2_ZLIB_PACKAGE_NAME": {"type": "STRING", "value": "zlib"}, @@ -62,15 +62,15 @@ "JPEG_TGZ_NAME": {"type": "STRING", "value": "jpegsrc.v9e.tar.gz"}, "JPEG_PACKAGE_NAME": {"type": "STRING", "value": "jpeg"}, "BUILD_LZ4_LIBRARY_SOURCE": "ON", - "LZ4_TGZ_NAME": {"type": "STRING", "value": "lz4-1.9.4.tar.gz"}, + "LZ4_TGZ_NAME": {"type": "STRING", "value": "lz4-1.10.0.tar.gz"}, "LZ4_PACKAGE_NAME": {"type": "STRING", "value": "lz4"}, "LZF_TGZ_NAME": {"type": "STRING", "value": "liblzf-3.6.tar.gz"}, "LZF_PACKAGE_NAME": {"type": "STRING", "value": "lzf"}, "SZ_TGZ_NAME": {"type": "STRING", "value": "SZ-2.1.12.5.tar.gz"}, "SZ_PACKAGE_NAME": {"type": "STRING", "value": "SZ"}, - "ZFP_TGZ_NAME": {"type": "STRING", "value": "zfp-1.0.0.tar.gz"}, + "ZFP_TGZ_NAME": {"type": "STRING", "value": "zfp-1.0.1.tar.gz"}, "ZFP_PACKAGE_NAME": {"type": "STRING", "value": "zfp"}, - "ZSTD_TGZ_NAME": {"type": "STRING", "value": "zstd-1.5.5.tar.gz"}, + "ZSTD_TGZ_NAME": {"type": "STRING", "value": "zstd-1.5.6.tar.gz"}, "ZSTD_PACKAGE_NAME": {"type": "STRING", "value": "zstd"} } }, @@ -274,12 +274,7 @@ "configurePreset": "ci-StdShar-MSVC", "inherits": [ "ci-x64-Release-MSVC" - ], - "filter": { - "exclude": { - "name": "H5DUMP-tfloatsattrs" - } - } + ] }, { "name": "ci-StdShar-Clang", @@ -327,11 +322,6 @@ "inherits": [ "ci-x64-Release-Intel" ], - "filter": { - "exclude": { - "name": "H5DUMP-tfloatsattrs" - } - }, "condition": { "type": "equals", "lhs": "${hostSystemName}", diff --git a/CMakeTests.cmake b/CMakeTests.cmake index 66199010680..6b83d5652c1 100644 --- a/CMakeTests.cmake +++ b/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/CMakeVOL.cmake b/CMakeVOL.cmake index a6bd3b4adca..17550a49147 100644 --- a/CMakeVOL.cmake +++ b/CMakeVOL.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 8810c9282b9..5770b65670a 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -7,7 +7,7 @@ process enjoyable and straightforward. This document describes guiding principles for the HDF5 code contributors and does not pretend to address any possible contribution. If in doubt, please do not hesitate to ask us for guidance. ***Note that no contribution may be accepted unless the donor agrees with the HDF Group software license terms -found in the COPYING file in every branch's top source directory.*** +found in the LICENSE file in every branch's top source directory.*** > We will assume that you are familiar with `git` and `GitHub`. If not, you may go through the GitHub tutorial found at diff --git a/CTestConfig.cmake b/CTestConfig.cmake index 62beafc0c12..ec018229b40 100644 --- a/CTestConfig.cmake +++ b/CTestConfig.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/CMakeLists.txt b/HDF5Examples/C/CMakeLists.txt index b394212150e..e30ac6212ef 100644 --- a/HDF5Examples/C/CMakeLists.txt +++ b/HDF5Examples/C/CMakeLists.txt @@ -20,6 +20,12 @@ if (${H5_LIBVER_DIR} GREATER 110) add_subdirectory (${PROJECT_SOURCE_DIR}/H5VDS) endif () -if (H5_HAVE_PARALLEL AND HDF5_ENABLE_PARALLEL) +if (H5EX_ENABLE_PARALLEL AND H5_HAVE_PARALLEL AND HDF5_ENABLE_PARALLEL) add_subdirectory (${PROJECT_SOURCE_DIR}/H5PAR) endif () + +#-- Add High Level Examples +if (H5EX_BUILD_HL AND HDF5_BUILD_HL_LIB) + add_subdirectory (HL) +endif () + diff --git a/HDF5Examples/C/H5D/16/h5ex_d_alloc.c b/HDF5Examples/C/H5D/16/h5ex_d_alloc.c index 78f0ce8c6e4..bc6d2b61bf4 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_alloc.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_alloc.c @@ -16,7 +16,7 @@ #include #include -#define FILE "h5ex_d_alloc.h5" +#define FILENAME "h5ex_d_alloc.h5" #define DATASET1 "DS1" #define DATASET2 "DS2" #define DIM0 4 @@ -49,7 +49,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum diff --git a/HDF5Examples/C/H5D/16/h5ex_d_checksum.c b/HDF5Examples/C/H5D/16/h5ex_d_checksum.c index a03e004aa82..dad5d788832 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_checksum.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_checksum.c @@ -17,12 +17,12 @@ #include #include -#define FILE "h5ex_d_checksum.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_checksum.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -72,7 +72,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -113,7 +113,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_chunk.c b/HDF5Examples/C/H5D/16/h5ex_d_chunk.c index 4697261f5e9..7f27791b1a3 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_chunk.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_chunk.c @@ -17,12 +17,12 @@ #include #include -#define FILE "h5ex_d_chunk.h5" -#define DATASET "DS1" -#define DIM0 6 -#define DIM1 8 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_chunk.h5" +#define DATASET "DS1" +#define DIM0 6 +#define DIM1 8 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -64,7 +64,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -126,7 +126,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_compact.c b/HDF5Examples/C/H5D/16/h5ex_d_compact.c index 0c10a87d5c5..aad1ee239db 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_compact.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_compact.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_d_compact.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_d_compact.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -43,7 +43,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -84,7 +84,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_extern.c b/HDF5Examples/C/H5D/16/h5ex_d_extern.c index 6291c3c398a..bb6f1323c35 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_extern.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_extern.c @@ -15,7 +15,7 @@ #include #include -#define FILE "h5ex_d_extern.h5" +#define FILENAME "h5ex_d_extern.h5" #define EXTERNAL "h5ex_d_extern.data" #define DATASET "DS1" #define DIM0 4 @@ -46,7 +46,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -86,7 +86,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_fillval.c b/HDF5Examples/C/H5D/16/h5ex_d_fillval.c index 4f6eee3ad20..bb400475b26 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_fillval.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_fillval.c @@ -17,15 +17,15 @@ #include #include -#define FILE "h5ex_d_fillval.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 -#define FILLVAL 99 +#define FILENAME "h5ex_d_fillval.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 +#define FILLVAL 99 int main(void) @@ -55,7 +55,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. diff --git a/HDF5Examples/C/H5D/16/h5ex_d_gzip.c b/HDF5Examples/C/H5D/16/h5ex_d_gzip.c index 2b35559adfd..ed4a002c1a9 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_gzip.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_gzip.c @@ -16,12 +16,12 @@ #include #include -#define FILE "h5ex_d_gzip.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_gzip.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -72,7 +72,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -113,7 +113,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_hyper.c b/HDF5Examples/C/H5D/16/h5ex_d_hyper.c index 1d81ec2d714..b304067eb1f 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_hyper.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_hyper.c @@ -17,10 +17,10 @@ #include #include -#define FILE "h5ex_d_hyper.h5" -#define DATASET "DS1" -#define DIM0 6 -#define DIM1 8 +#define FILENAME "h5ex_d_hyper.h5" +#define DATASET "DS1" +#define DIM0 6 +#define DIM1 8 int main(void) @@ -59,7 +59,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -114,7 +114,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_rdwr.c b/HDF5Examples/C/H5D/16/h5ex_d_rdwr.c index fbdc18097a8..88f5ec0f6d7 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_rdwr.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_rdwr.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_d_rdwr.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_d_rdwr.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -41,7 +41,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -74,7 +74,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_shuffle.c b/HDF5Examples/C/H5D/16/h5ex_d_shuffle.c index 137b4b8f713..ca4872ec578 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_shuffle.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_shuffle.c @@ -17,12 +17,12 @@ #include #include -#define FILE "h5ex_d_shuffle.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_shuffle.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -88,7 +88,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -135,7 +135,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_szip.c b/HDF5Examples/C/H5D/16/h5ex_d_szip.c index cf2f639c888..4e134ddedc3 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_szip.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_szip.c @@ -16,12 +16,12 @@ #include #include -#define FILE "h5ex_d_szip.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_szip.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -73,7 +73,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -114,7 +114,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_unlimadd.c b/HDF5Examples/C/H5D/16/h5ex_d_unlimadd.c index 6f855ea2f05..6a9560b0e28 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_unlimadd.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_unlimadd.c @@ -17,14 +17,14 @@ #include #include -#define FILE "h5ex_d_unlimadd.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_unlimadd.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -56,7 +56,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. @@ -98,7 +98,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* @@ -197,7 +197,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_unlimgzip.c b/HDF5Examples/C/H5D/16/h5ex_d_unlimgzip.c index 227b3aaa139..6b80ee5f902 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_unlimgzip.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_unlimgzip.c @@ -18,14 +18,14 @@ #include #include -#define FILE "h5ex_d_unlimgzip.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_unlimgzip.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -80,7 +80,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. @@ -123,7 +123,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* @@ -222,7 +222,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/16/h5ex_d_unlimmod.c b/HDF5Examples/C/H5D/16/h5ex_d_unlimmod.c index f06a1ff5b21..081972f75c1 100644 --- a/HDF5Examples/C/H5D/16/h5ex_d_unlimmod.c +++ b/HDF5Examples/C/H5D/16/h5ex_d_unlimmod.c @@ -17,14 +17,14 @@ #include #include -#define FILE "h5ex_d_unlimmod.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_unlimmod.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -54,7 +54,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. @@ -96,7 +96,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* @@ -172,7 +172,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5D/CMakeLists.txt b/HDF5Examples/C/H5D/CMakeLists.txt index d88aa4551b1..4ebeb086c38 100644 --- a/HDF5Examples/C/H5D/CMakeLists.txt +++ b/HDF5Examples/C/H5D/CMakeLists.txt @@ -19,7 +19,7 @@ foreach (example_name ${common_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -45,7 +45,7 @@ if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.8") "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -72,7 +72,7 @@ endif () # "$<$:-DH5_USE_110_API>" # "$<$:-DH5_USE_112_API>" # "$<$:-DH5_USE_114_API>" -# "$<$:-DH5_USE_116_API>" +# "$<$:-DH5_USE_200_API>" # ) # if (H5_HAVE_PARALLEL) # target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -112,14 +112,14 @@ endif () # endif () # endforeach () #endif () -#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") -# foreach (example_name ${1_16_examples}) +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) # if (H5EX_BUILD_TESTING) # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} -# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst # ) # endif () # endforeach () @@ -192,12 +192,12 @@ if (HDF5_BUILD_TOOLS) # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () - #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} - # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () endif () @@ -209,7 +209,7 @@ if (HDF5_BUILD_TOOLS) # endforeach () # foreach (example_name ${1_14_examples}) # endforeach () -# foreach (example_name ${1_16_examples}) +# foreach (example_name ${2_0_examples}) # endforeach () endif () diff --git a/HDF5Examples/C/H5D/C_sourcefiles.cmake b/HDF5Examples/C/H5D/C_sourcefiles.cmake index 971993f1e95..2d78eaa6b2d 100644 --- a/HDF5Examples/C/H5D/C_sourcefiles.cmake +++ b/HDF5Examples/C/H5D/C_sourcefiles.cmake @@ -16,7 +16,7 @@ set (common_examples h5ex_d_unlimmod ) -if (HDF5_ENABLE_Z_LIB_SUPPORT) +if (HDF5_ENABLE_ZLIB_SUPPORT) set (common_examples ${common_examples} h5ex_d_gzip h5ex_d_shuffle diff --git a/HDF5Examples/C/H5D/Makefile.am b/HDF5Examples/C/H5D/Makefile.am index dfccb4b72f9..a0298e0d239 100644 --- a/HDF5Examples/C/H5D/Makefile.am +++ b/HDF5Examples/C/H5D/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5D/h5ex_d_alloc.c b/HDF5Examples/C/H5D/h5ex_d_alloc.c index 37d2b8c4608..4559ba7efaa 100644 --- a/HDF5Examples/C/H5D/h5ex_d_alloc.c +++ b/HDF5Examples/C/H5D/h5ex_d_alloc.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_d_alloc.h5" +#define FILENAME "h5ex_d_alloc.h5" #define DATASET1 "DS1" #define DATASET2 "DS2" #define DIM0 4 @@ -47,7 +47,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum diff --git a/HDF5Examples/C/H5D/h5ex_d_checksum.c b/HDF5Examples/C/H5D/h5ex_d_checksum.c index 8eb9bd6df53..872bd774aa2 100644 --- a/HDF5Examples/C/H5D/h5ex_d_checksum.c +++ b/HDF5Examples/C/H5D/h5ex_d_checksum.c @@ -15,12 +15,12 @@ #include #include -#define FILE "h5ex_d_checksum.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_checksum.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -70,7 +70,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -111,7 +111,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_chunk.c b/HDF5Examples/C/H5D/h5ex_d_chunk.c index df6d235e797..eaec17b1095 100644 --- a/HDF5Examples/C/H5D/h5ex_d_chunk.c +++ b/HDF5Examples/C/H5D/h5ex_d_chunk.c @@ -15,12 +15,12 @@ #include #include -#define FILE "h5ex_d_chunk.h5" -#define DATASET "DS1" -#define DIM0 6 -#define DIM1 8 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_chunk.h5" +#define DATASET "DS1" +#define DIM0 6 +#define DIM1 8 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -62,7 +62,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -124,7 +124,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_compact.c b/HDF5Examples/C/H5D/h5ex_d_compact.c index 241cdfe3315..de0952a43e5 100644 --- a/HDF5Examples/C/H5D/h5ex_d_compact.c +++ b/HDF5Examples/C/H5D/h5ex_d_compact.c @@ -12,10 +12,10 @@ #include #include -#define FILE "h5ex_d_compact.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_d_compact.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -41,7 +41,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -82,7 +82,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_extern.c b/HDF5Examples/C/H5D/h5ex_d_extern.c index ac78fd0f0b4..5e853f34478 100644 --- a/HDF5Examples/C/H5D/h5ex_d_extern.c +++ b/HDF5Examples/C/H5D/h5ex_d_extern.c @@ -13,7 +13,7 @@ #include #include -#define FILE "h5ex_d_extern.h5" +#define FILENAME "h5ex_d_extern.h5" #define EXTERNAL "h5ex_d_extern.data" #define DATASET "DS1" #define DIM0 4 @@ -44,7 +44,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -84,7 +84,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_fillval.c b/HDF5Examples/C/H5D/h5ex_d_fillval.c index 15069d2758f..b711e0d4795 100644 --- a/HDF5Examples/C/H5D/h5ex_d_fillval.c +++ b/HDF5Examples/C/H5D/h5ex_d_fillval.c @@ -15,15 +15,15 @@ #include #include -#define FILE "h5ex_d_fillval.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 -#define FILLVAL 99 +#define FILENAME "h5ex_d_fillval.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 +#define FILLVAL 99 int main(void) @@ -53,7 +53,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. diff --git a/HDF5Examples/C/H5D/h5ex_d_gzip.c b/HDF5Examples/C/H5D/h5ex_d_gzip.c index 6edc72d3060..576553409d4 100644 --- a/HDF5Examples/C/H5D/h5ex_d_gzip.c +++ b/HDF5Examples/C/H5D/h5ex_d_gzip.c @@ -14,12 +14,12 @@ #include #include -#define FILE "h5ex_d_gzip.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_gzip.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -70,7 +70,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -111,7 +111,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_hyper.c b/HDF5Examples/C/H5D/h5ex_d_hyper.c index 078a2b4f6e2..9a24c6234d2 100644 --- a/HDF5Examples/C/H5D/h5ex_d_hyper.c +++ b/HDF5Examples/C/H5D/h5ex_d_hyper.c @@ -15,10 +15,10 @@ #include #include -#define FILE "h5ex_d_hyper.h5" -#define DATASET "DS1" -#define DIM0 6 -#define DIM1 8 +#define FILENAME "h5ex_d_hyper.h5" +#define DATASET "DS1" +#define DIM0 6 +#define DIM1 8 int main(void) @@ -57,7 +57,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -112,7 +112,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_nbit.c b/HDF5Examples/C/H5D/h5ex_d_nbit.c index f747d3d64bb..02a3afb29a7 100644 --- a/HDF5Examples/C/H5D/h5ex_d_nbit.c +++ b/HDF5Examples/C/H5D/h5ex_d_nbit.c @@ -14,12 +14,12 @@ #include #include -#define FILE "h5ex_d_nbit.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_nbit.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -72,7 +72,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -123,7 +123,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_rdwr.c b/HDF5Examples/C/H5D/h5ex_d_rdwr.c index 4ee8d256895..93824a1160c 100644 --- a/HDF5Examples/C/H5D/h5ex_d_rdwr.c +++ b/HDF5Examples/C/H5D/h5ex_d_rdwr.c @@ -12,10 +12,10 @@ #include #include -#define FILE "h5ex_d_rdwr.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_d_rdwr.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -39,7 +39,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -72,7 +72,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_shuffle.c b/HDF5Examples/C/H5D/h5ex_d_shuffle.c index 6e2fb5c9fce..5c4b9941741 100644 --- a/HDF5Examples/C/H5D/h5ex_d_shuffle.c +++ b/HDF5Examples/C/H5D/h5ex_d_shuffle.c @@ -17,12 +17,12 @@ #include #include -#define FILE "h5ex_d_shuffle.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_shuffle.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -88,7 +88,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -135,7 +135,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_sofloat.c b/HDF5Examples/C/H5D/h5ex_d_sofloat.c index 7299407a2db..ccf5481038a 100644 --- a/HDF5Examples/C/H5D/h5ex_d_sofloat.c +++ b/HDF5Examples/C/H5D/h5ex_d_sofloat.c @@ -14,12 +14,12 @@ #include #include -#define FILE "h5ex_d_sofloat.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_sofloat.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -91,7 +91,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -132,7 +132,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_soint.c b/HDF5Examples/C/H5D/h5ex_d_soint.c index 43832dde1bc..460451b8aed 100644 --- a/HDF5Examples/C/H5D/h5ex_d_soint.c +++ b/HDF5Examples/C/H5D/h5ex_d_soint.c @@ -14,12 +14,12 @@ #include #include -#define FILE "h5ex_d_soint.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_soint.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -71,7 +71,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -112,7 +112,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_szip.c b/HDF5Examples/C/H5D/h5ex_d_szip.c index 1ab829c1ca4..3f50d3ef9c0 100644 --- a/HDF5Examples/C/H5D/h5ex_d_szip.c +++ b/HDF5Examples/C/H5D/h5ex_d_szip.c @@ -14,12 +14,12 @@ #include #include -#define FILE "h5ex_d_szip.h5" -#define DATASET "DS1" -#define DIM0 32 -#define DIM1 64 -#define CHUNK0 4 -#define CHUNK1 8 +#define FILENAME "h5ex_d_szip.h5" +#define DATASET "DS1" +#define DIM0 32 +#define DIM1 64 +#define CHUNK0 4 +#define CHUNK1 8 int main(void) @@ -71,7 +71,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -112,7 +112,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_transform.c b/HDF5Examples/C/H5D/h5ex_d_transform.c index 2d48051804b..32627096831 100644 --- a/HDF5Examples/C/H5D/h5ex_d_transform.c +++ b/HDF5Examples/C/H5D/h5ex_d_transform.c @@ -15,7 +15,7 @@ #include #include -#define FILE "h5ex_d_transform.h5" +#define FILENAME "h5ex_d_transform.h5" #define DATASET "DS1" #define DIM0 4 #define DIM1 7 @@ -57,7 +57,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -100,7 +100,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_unlimadd.c b/HDF5Examples/C/H5D/h5ex_d_unlimadd.c index c0d23e4a697..ff5c311fa4a 100644 --- a/HDF5Examples/C/H5D/h5ex_d_unlimadd.c +++ b/HDF5Examples/C/H5D/h5ex_d_unlimadd.c @@ -15,14 +15,14 @@ #include #include -#define FILE "h5ex_d_unlimadd.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_unlimadd.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -54,7 +54,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. @@ -96,7 +96,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* @@ -195,7 +195,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_unlimgzip.c b/HDF5Examples/C/H5D/h5ex_d_unlimgzip.c index ac5a3870b43..f276dd1b6ec 100644 --- a/HDF5Examples/C/H5D/h5ex_d_unlimgzip.c +++ b/HDF5Examples/C/H5D/h5ex_d_unlimgzip.c @@ -16,14 +16,14 @@ #include #include -#define FILE "h5ex_d_unlimgzip.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_unlimgzip.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -78,7 +78,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. @@ -121,7 +121,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* @@ -220,7 +220,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/h5ex_d_unlimmod.c b/HDF5Examples/C/H5D/h5ex_d_unlimmod.c index 7c76ff91b05..89b70897fe4 100644 --- a/HDF5Examples/C/H5D/h5ex_d_unlimmod.c +++ b/HDF5Examples/C/H5D/h5ex_d_unlimmod.c @@ -15,14 +15,14 @@ #include #include -#define FILE "h5ex_d_unlimmod.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 -#define EDIM0 6 -#define EDIM1 10 -#define CHUNK0 4 -#define CHUNK1 4 +#define FILENAME "h5ex_d_unlimmod.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 +#define EDIM0 6 +#define EDIM1 10 +#define CHUNK0 4 +#define CHUNK1 4 int main(void) @@ -52,7 +52,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace with unlimited dimensions. @@ -94,7 +94,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* @@ -170,7 +170,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5D/test-pc.sh b/HDF5Examples/C/H5D/test-pc.sh index e0cda25152a..e0a03223c8f 100755 --- a/HDF5Examples/C/H5D/test-pc.sh +++ b/HDF5Examples/C/H5D/test-pc.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5D/test.sh.in b/HDF5Examples/C/H5D/test.sh.in index ece230353e1..0dfd8b82993 100755 --- a/HDF5Examples/C/H5D/test.sh.in +++ b/HDF5Examples/C/H5D/test.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5FLT/CMakeLists.txt b/HDF5Examples/C/H5FLT/CMakeLists.txt index 3bebf30025e..2cd5ea0077c 100644 --- a/HDF5Examples/C/H5FLT/CMakeLists.txt +++ b/HDF5Examples/C/H5FLT/CMakeLists.txt @@ -165,7 +165,7 @@ foreach (example ${dyn_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example} PUBLIC ${MPI_C_INCLUDE_DIRS}) diff --git a/HDF5Examples/C/H5FLT/h5ex_d_blosc.c b/HDF5Examples/C/H5FLT/h5ex_d_blosc.c index 3fc13654c15..85d94e9c96d 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_blosc.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_blosc.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 BLOSC filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the BLOSC source code * + * the file LICENSE, which can be found at the root of the BLOSC source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_blosc.h5" +#define FILENAME "h5ex_d_blosc.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_blosc2.c b/HDF5Examples/C/H5FLT/h5ex_d_blosc2.c index dae0becb4a2..395bf4d9c91 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_blosc2.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_blosc2.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 BLOSC2 filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the BLOSC2 source code * + * the file LICENSE, which can be found at the root of the BLOSC2 source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_blosc2.h5" +#define FILENAME "h5ex_d_blosc2.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c b/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c index 7b666da094c..c51d5d7fe4c 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 BSHUF filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the BSHUF source code * + * the file LICENSE, which can be found at the root of the BSHUF source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_bshuf.h5" +#define FILENAME "h5ex_d_bshuf.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c b/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c index 421a1bf954e..751e7a5b08b 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 BZIP2 filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the BZIP2 source code * + * the file LICENSE, which can be found at the root of the BZIP2 source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_bzip2.h5" +#define FILENAME "h5ex_d_bzip2.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c b/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c index a3931bb32e0..d0fe0e54203 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 JPEG filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the JPEG source code * + * the file LICENSE, which can be found at the root of the JPEG source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_jpeg.h5" +#define FILENAME "h5ex_d_jpeg.h5" #define DATASET "DS1" #define DIM0 512 #define DIM1 1024 @@ -75,7 +75,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -163,7 +163,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_lz4.c b/HDF5Examples/C/H5FLT/h5ex_d_lz4.c index 0bcfc876cf3..d86e34e65fa 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_lz4.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_lz4.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 LZ4 filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the LZ4 source code * + * the file LICENSE, which can be found at the root of the LZ4 source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_lz4.h5" +#define FILENAME "h5ex_d_lz4.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_lzf.c b/HDF5Examples/C/H5FLT/h5ex_d_lzf.c index a860d67e16c..010518b03c7 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_lzf.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_lzf.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 LZF filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the LZF source code * + * the file LICENSE, which can be found at the root of the LZF source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_lzf.h5" +#define FILENAME "h5ex_d_lzf.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c b/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c index 5cee4a07ce0..fbc6dfa80ec 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 MAFISC filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the MAFISC source code * + * the file LICENSE, which can be found at the root of the MAFISC source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_mafisc.h5" +#define FILENAME "h5ex_d_mafisc.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_zfp.c b/HDF5Examples/C/H5FLT/h5ex_d_zfp.c index dd0a9366da9..55e39bc22b2 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_zfp.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_zfp.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 ZFP filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the ZFP source code * + * the file LICENSE, which can be found at the root of the ZFP source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_zfp.h5" +#define FILENAME "h5ex_d_zfp.h5" #define DATASET "DS1" #define DIM0 32 #define DIM1 64 @@ -65,7 +65,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -151,7 +151,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_zstd.c b/HDF5Examples/C/H5FLT/h5ex_d_zstd.c index 28f084d90dd..b3d2dfb8937 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_zstd.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_zstd.c @@ -5,7 +5,7 @@ * This file is part of the HDF5 ZSTD filter plugin source. The full * * copyright notice, including terms governing use, modification, and * * terms governing use, modification, and redistribution, is contained in * - * the file COPYING, which can be found at the root of the ZSTD source code * + * the file LICENSE, which can be found at the root of the ZSTD source code * * distribution tree. If you do not have access to this file, you may * * request a copy from help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -24,7 +24,7 @@ #include #include -#define FILE "h5ex_d_zstd.h5" +#define FILENAME "h5ex_d_zstd.h5" #define DATASET "DS1" #define DIM0 512 #define DIM1 1024 @@ -72,7 +72,7 @@ main(void) /* * Create a new file using the default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file_id < 0) goto done; @@ -158,7 +158,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file_id = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file_id < 0) goto done; diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.ddl b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.ddl index a8e66c08054..8dadf939143 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.ddl +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.ddl @@ -10,7 +10,7 @@ GROUP "/" { FILTERS { USER_DEFINED_FILTER { FILTER_ID 32013 - COMMENT H5Z-ZFP-1.1.1 (ZFP-1.0.0) github.com/LLNL/H5Z-ZFP + COMMENT H5Z-ZFP-1.1.1 (ZFP-1.0.1) github.com/LLNL/H5Z-ZFP PARAMS { XXXX } } } diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.tst b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.tst index dd7197cda78..8b95b6e205b 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.tst +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zfp.tst @@ -4,8 +4,8 @@ zfp filter is available for encoding and decoding. ....Close the file and reopen for reading ........ Filter info is available from the dataset creation property Filter identifier is 32013 - Number of parameters is 6 with the value 268456209 - To find more about the filter check H5Z-ZFP-1.1.1 (ZFP-1.0.0) github.com/LLNL/H5Z-ZFP + Number of parameters is 6 with the value 269504785 + To find more about the filter check H5Z-ZFP-1.1.1 (ZFP-1.0.1) github.com/LLNL/H5Z-ZFP ....Reading zfp compressed data ................ Maximum value in DS1 is 1890.0000 zfp filter is available now since H5Dread triggered loading of the filter. diff --git a/HDF5Examples/C/H5G/16/h5ex_g_create.c b/HDF5Examples/C/H5G/16/h5ex_g_create.c index 901a0ce6931..9dd52842cb6 100644 --- a/HDF5Examples/C/H5G/16/h5ex_g_create.c +++ b/HDF5Examples/C/H5G/16/h5ex_g_create.c @@ -8,7 +8,7 @@ #include "hdf5.h" -#define FILE "h5ex_g_create.h5" +#define FILENAME "h5ex_g_create.h5" int main(void) @@ -19,7 +19,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a group named "G1" in the file. diff --git a/HDF5Examples/C/H5G/16/h5ex_g_iterate.c b/HDF5Examples/C/H5G/16/h5ex_g_iterate.c index be4c45fc447..2d4dff06b28 100644 --- a/HDF5Examples/C/H5G/16/h5ex_g_iterate.c +++ b/HDF5Examples/C/H5G/16/h5ex_g_iterate.c @@ -10,7 +10,7 @@ #include "hdf5.h" #include -#define FILE "h5ex_g_iterate.h5" +#define FILENAME "h5ex_g_iterate.h5" /* * Operator function to be called by H5Giterate. @@ -26,7 +26,7 @@ main(void) /* * Open file. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Begin iteration. diff --git a/HDF5Examples/C/H5G/16/h5ex_g_traverse.c b/HDF5Examples/C/H5G/16/h5ex_g_traverse.c index 2be47e0b75d..3685de7fa50 100644 --- a/HDF5Examples/C/H5G/16/h5ex_g_traverse.c +++ b/HDF5Examples/C/H5G/16/h5ex_g_traverse.c @@ -16,7 +16,7 @@ #include "hdf5.h" #include -#define FILE "h5ex_g_traverse.h5" +#define FILENAME "h5ex_g_traverse.h5" /* * Define operator data structure type for H5Giterate callback. @@ -51,7 +51,7 @@ main(void) /* * Open file and initialize the operator data structure. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); status = H5Gget_objinfo(file, "/", 0, &statbuf); od.recurs = 0; od.prev = NULL; diff --git a/HDF5Examples/C/H5G/CMakeLists.txt b/HDF5Examples/C/H5G/CMakeLists.txt index 14a16861a34..c9a734f9d01 100644 --- a/HDF5Examples/C/H5G/CMakeLists.txt +++ b/HDF5Examples/C/H5G/CMakeLists.txt @@ -19,7 +19,7 @@ foreach (example_name ${common_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -47,7 +47,7 @@ if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.8" AND NOT ${EXAMPLE_VARNAME}_US "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -74,7 +74,7 @@ endif () # "$<$:-DH5_USE_110_API>" # "$<$:-DH5_USE_112_API>" # "$<$:-DH5_USE_114_API>" -# "$<$:-DH5_USE_116_API>" +# "$<$:-DH5_USE_200_API>" # ) # if (H5_HAVE_PARALLEL) # target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -114,14 +114,14 @@ endif () # endif () # endforeach () #endif () -#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") -# foreach (example_name ${1_16_examples}) +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) # if (H5EX_BUILD_TESTING) # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} -# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst # ) # endif () # endforeach () @@ -187,12 +187,12 @@ if (HDF5_BUILD_TOOLS) # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () - #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} - # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () # endforeach () @@ -203,7 +203,7 @@ if (HDF5_BUILD_TOOLS) # endforeach () # foreach (example_name ${1_14_examples}) # endforeach () -# foreach (example_name ${1_16_examples}) +# foreach (example_name ${2_0_examples}) # endforeach () endif () diff --git a/HDF5Examples/C/H5G/Makefile.am b/HDF5Examples/C/H5G/Makefile.am index 8ab2b8ac047..cc87d860a6f 100644 --- a/HDF5Examples/C/H5G/Makefile.am +++ b/HDF5Examples/C/H5G/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5G/h5ex_g_compact.c b/HDF5Examples/C/H5G/h5ex_g_compact.c index 673361208e1..35cd6df885b 100644 --- a/HDF5Examples/C/H5G/h5ex_g_compact.c +++ b/HDF5Examples/C/H5G/h5ex_g_compact.c @@ -14,9 +14,9 @@ #include "hdf5.h" #include -#define FILE1 "h5ex_g_compact1.h5" -#define FILE2 "h5ex_g_compact2.h5" -#define GROUP "G1" +#define FILENAME1 "h5ex_g_compact1.h5" +#define FILENAME2 "h5ex_g_compact2.h5" +#define GROUP "G1" int main(void) @@ -31,14 +31,14 @@ main(void) /* * Create file 1. This file will use original format groups. */ - file = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); group = H5Gcreate(file, GROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Obtain the group info and print the group storage type. */ status = H5Gget_info(group, &ginfo); - printf("Group storage type for %s is: ", FILE1); + printf("Group storage type for %s is: ", FILENAME1); switch (ginfo.storage_type) { case H5G_STORAGE_TYPE_COMPACT: printf("H5G_STORAGE_TYPE_COMPACT\n"); /* New compact format */ @@ -58,13 +58,13 @@ main(void) */ status = H5Gclose(group); status = H5Fclose(file); - file = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME1, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Obtain and print the file size. */ status = H5Fget_filesize(file, &size); - printf("File size for %s is: %d bytes\n\n", FILE1, (int)size); + printf("File size for %s is: %d bytes\n\n", FILENAME1, (int)size); /* * Close FILE1. @@ -81,14 +81,14 @@ main(void) /* * Create file 2 using the new file access property list. */ - file = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); + file = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); group = H5Gcreate(file, GROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* * Obtain the group info and print the group storage type. */ status = H5Gget_info(group, &ginfo); - printf("Group storage type for %s is: ", FILE2); + printf("Group storage type for %s is: ", FILENAME2); switch (ginfo.storage_type) { case H5G_STORAGE_TYPE_COMPACT: printf("H5G_STORAGE_TYPE_COMPACT\n"); /* New compact format */ @@ -108,13 +108,13 @@ main(void) */ status = H5Gclose(group); status = H5Fclose(file); - file = H5Fopen(FILE2, H5F_ACC_RDONLY, fapl); + file = H5Fopen(FILENAME2, H5F_ACC_RDONLY, fapl); /* * Obtain and print the file size. */ status = H5Fget_filesize(file, &size); - printf("File size for %s is: %d bytes\n", FILE2, (int)size); + printf("File size for %s is: %d bytes\n", FILENAME2, (int)size); printf("\n"); /* diff --git a/HDF5Examples/C/H5G/h5ex_g_corder.c b/HDF5Examples/C/H5G/h5ex_g_corder.c index aa7a1af6474..b19727f723e 100644 --- a/HDF5Examples/C/H5G/h5ex_g_corder.c +++ b/HDF5Examples/C/H5G/h5ex_g_corder.c @@ -13,7 +13,7 @@ #include #include -#define FILE "h5ex_g_corder.h5" +#define FILENAME "h5ex_g_corder.h5" int main(void) @@ -31,7 +31,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create group creation property list and enable link creation diff --git a/HDF5Examples/C/H5G/h5ex_g_create.c b/HDF5Examples/C/H5G/h5ex_g_create.c index d7bb1568ad7..2634d41b29d 100644 --- a/HDF5Examples/C/H5G/h5ex_g_create.c +++ b/HDF5Examples/C/H5G/h5ex_g_create.c @@ -8,7 +8,7 @@ #include "hdf5.h" -#define FILE "h5ex_g_create.h5" +#define FILENAME "h5ex_g_create.h5" int main(void) @@ -20,7 +20,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a group named "G1" in the file. diff --git a/HDF5Examples/C/H5G/h5ex_g_intermediate.c b/HDF5Examples/C/H5G/h5ex_g_intermediate.c index 55c8c64b4c5..a026165bb67 100644 --- a/HDF5Examples/C/H5G/h5ex_g_intermediate.c +++ b/HDF5Examples/C/H5G/h5ex_g_intermediate.c @@ -7,7 +7,7 @@ #include "hdf5.h" -#define FILE "h5ex_g_intermediate.h5" +#define FILENAME "h5ex_g_intermediate.h5" /* * Operator function to be called by H5Ovisit. @@ -25,7 +25,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create group creation property list and set it to allow creation diff --git a/HDF5Examples/C/H5G/h5ex_g_iterate.c b/HDF5Examples/C/H5G/h5ex_g_iterate.c index 1d9d3d5a0a1..b0b8adb82c8 100644 --- a/HDF5Examples/C/H5G/h5ex_g_iterate.c +++ b/HDF5Examples/C/H5G/h5ex_g_iterate.c @@ -8,7 +8,7 @@ #include "hdf5.h" #include -#define FILE "h5ex_g_iterate.h5" +#define FILENAME "h5ex_g_iterate.h5" /* * Operator function to be called by H5Literate. @@ -24,7 +24,7 @@ main(void) /* * Open file. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Begin iteration. diff --git a/HDF5Examples/C/H5G/h5ex_g_phase.c b/HDF5Examples/C/H5G/h5ex_g_phase.c index b87c0a43189..e02b69dde5b 100644 --- a/HDF5Examples/C/H5G/h5ex_g_phase.c +++ b/HDF5Examples/C/H5G/h5ex_g_phase.c @@ -10,7 +10,7 @@ #include "hdf5.h" #include -#define FILE "h5ex_g_phase.h5" +#define FILENAME "h5ex_g_phase.h5" #define MAX_GROUPS 7 #define MAX_COMPACT 5 #define MIN_DENSE 3 @@ -42,7 +42,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); /* * Create primary group. diff --git a/HDF5Examples/C/H5G/h5ex_g_traverse.c b/HDF5Examples/C/H5G/h5ex_g_traverse.c index e1099c8936d..65713e453ea 100644 --- a/HDF5Examples/C/H5G/h5ex_g_traverse.c +++ b/HDF5Examples/C/H5G/h5ex_g_traverse.c @@ -14,7 +14,7 @@ #include "hdf5.h" #include -#define FILE "h5ex_g_traverse.h5" +#define FILENAME "h5ex_g_traverse.h5" /* * Define operator data structure type for H5Literate callback. @@ -57,7 +57,7 @@ main(void) /* * Open file and initialize the operator data structure. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); #if H5_VERSION_GE(1, 12, 0) && !defined(H5_USE_110_API) && !defined(H5_USE_18_API) && !defined(H5_USE_16_API) status = H5Oget_info2(file, &infobuf, H5O_INFO_ALL); #else diff --git a/HDF5Examples/C/H5G/h5ex_g_visit.c b/HDF5Examples/C/H5G/h5ex_g_visit.c index 6f645203fa5..6937f4bd07e 100644 --- a/HDF5Examples/C/H5G/h5ex_g_visit.c +++ b/HDF5Examples/C/H5G/h5ex_g_visit.c @@ -12,7 +12,7 @@ #include "hdf5.h" #include -#define FILE "h5ex_g_visit.h5" +#define FILENAME "h5ex_g_visit.h5" /* * Operator function to be called by H5Ovisit. @@ -33,7 +33,7 @@ main(void) /* * Open file */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Begin iteration using H5Ovisit diff --git a/HDF5Examples/C/H5G/test-pc.sh b/HDF5Examples/C/H5G/test-pc.sh index 4cff7780fe7..b8af1cffa16 100755 --- a/HDF5Examples/C/H5G/test-pc.sh +++ b/HDF5Examples/C/H5G/test-pc.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5G/test.sh.in b/HDF5Examples/C/H5G/test.sh.in index ea05ca3bd2b..a461d66eb68 100755 --- a/HDF5Examples/C/H5G/test.sh.in +++ b/HDF5Examples/C/H5G/test.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5PAR/CMakeLists.txt b/HDF5Examples/C/H5PAR/CMakeLists.txt index 662cd70d295..8cd296d7f08 100644 --- a/HDF5Examples/C/H5PAR/CMakeLists.txt +++ b/HDF5Examples/C/H5PAR/CMakeLists.txt @@ -15,7 +15,7 @@ foreach (example_name ${examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) target_link_libraries (${EXAMPLE_VARNAME}_${example_name} ${H5EX_HDF5_LINK_LIBS}) diff --git a/HDF5Examples/C/H5PAR/ph5_filtered_writes.c b/HDF5Examples/C/H5PAR/ph5_filtered_writes.c index 34ed2fbb0cf..c631696c82c 100644 --- a/HDF5Examples/C/H5PAR/ph5_filtered_writes.c +++ b/HDF5Examples/C/H5PAR/ph5_filtered_writes.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c b/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c index d4f171ff1f8..280df1c42d6 100644 --- a/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c +++ b/HDF5Examples/C/H5PAR/ph5_filtered_writes_no_sel.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/H5PAR/ph5_subfiling.c b/HDF5Examples/C/H5PAR/ph5_subfiling.c index 7d7244878b8..b2a40f6612d 100644 --- a/HDF5Examples/C/H5PAR/ph5_subfiling.c +++ b/HDF5Examples/C/H5PAR/ph5_subfiling.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/H5PAR/ph5example.c b/HDF5Examples/C/H5PAR/ph5example.c index 37d5d68ed72..7a694ad933a 100644 --- a/HDF5Examples/C/H5PAR/ph5example.c +++ b/HDF5Examples/C/H5PAR/ph5example.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/H5T/16/h5ex_t_array.c b/HDF5Examples/C/H5T/16/h5ex_t_array.c index 0537352d552..c45838308d4 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_array.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_array.c @@ -14,11 +14,11 @@ #include #include -#define FILE "h5ex_t_array.h5" -#define DATASET "DS1" -#define DIM0 4 -#define ADIM0 3 -#define ADIM1 5 +#define FILENAME "h5ex_t_array.h5" +#define DATASET "DS1" +#define DIM0 4 +#define ADIM0 3 +#define ADIM1 5 int main(void) @@ -43,7 +43,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create array datatypes for file and memory. @@ -82,7 +82,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_arrayatt.c b/HDF5Examples/C/H5T/16/h5ex_t_arrayatt.c index 0750cc22f46..2f8e36ccc07 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_arrayatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_arrayatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_arrayatt.h5" +#define FILENAME "h5ex_t_arrayatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -44,7 +44,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create array datatypes for file and memory. @@ -91,7 +91,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_bit.c b/HDF5Examples/C/H5T/16/h5ex_t_bit.c index 39f0566ca7d..a5c284749e3 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_bit.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_bit.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_t_bit.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_t_bit.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -45,7 +45,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -76,7 +76,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_bitatt.c b/HDF5Examples/C/H5T/16/h5ex_t_bitatt.c index be19a2894af..f591d5b4a14 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_bitatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_bitatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_bitatt.h5" +#define FILENAME "h5ex_t_bitatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -46,7 +46,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a scalar dataspace. @@ -85,7 +85,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_cmpd.c b/HDF5Examples/C/H5T/16/h5ex_t_cmpd.c index 4870857a569..c509fe6c029 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_cmpd.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_cmpd.c @@ -14,9 +14,9 @@ #include #include -#define FILE "h5ex_t_cmpd.h5" -#define DATASET "DS1" -#define DIM0 4 +#define FILENAME "h5ex_t_cmpd.h5" +#define DATASET "DS1" +#define DIM0 4 typedef struct { int serial_no; @@ -59,7 +59,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length string datatype. @@ -118,7 +118,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_cmpdatt.c b/HDF5Examples/C/H5T/16/h5ex_t_cmpdatt.c index c9f9b7e0ad9..498c11a5574 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_cmpdatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_cmpdatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_cmpdatt.h5" +#define FILENAME "h5ex_t_cmpdatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -60,7 +60,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length string datatype. @@ -127,7 +127,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_commit.c b/HDF5Examples/C/H5T/16/h5ex_t_commit.c index eab8793a97b..0deca044de4 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_commit.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_commit.c @@ -15,7 +15,7 @@ #include #include -#define FILE "h5ex_t_commit.h5" +#define FILENAME "h5ex_t_commit.h5" #define DATATYPE "Sensor_Type" int @@ -31,7 +31,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length string datatype. @@ -70,7 +70,7 @@ main(void) /* * Open file. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Open the named datatype. diff --git a/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpd.c b/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpd.c index d2fabe9435b..c593c03f5be 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpd.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpd.c @@ -29,9 +29,9 @@ #include #include -#define FILE "h5ex_t_cpxcmpd.h5" -#define DATASET "DS1" -#define DIM0 2 +#define FILENAME "h5ex_t_cpxcmpd.h5" +#define DATASET "DS1" +#define DIM0 2 typedef struct { int serial_no; @@ -75,7 +75,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset to use for region references. @@ -245,7 +245,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpdatt.c b/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpdatt.c index 5932e1efa15..e0d4adee5f3 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpdatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_cpxcmpdatt.c @@ -29,7 +29,7 @@ #include #include -#define FILE "h5ex_t_cpxcmpdatt.h5" +#define FILENAME "h5ex_t_cpxcmpdatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 2 @@ -76,7 +76,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset to use for region references. @@ -255,7 +255,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_enum.c b/HDF5Examples/C/H5T/16/h5ex_t_enum.c index 108182bd988..ad8c09d99ec 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_enum.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_enum.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_enum.h5" +#define FILENAME "h5ex_t_enum.h5" #define DATASET "DS1" #define DIM0 4 #define DIM1 7 @@ -47,7 +47,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create the enumerated datatypes for file and memory. This @@ -101,7 +101,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_enumatt.c b/HDF5Examples/C/H5T/16/h5ex_t_enumatt.c index ae6c087a171..70a80df6fc5 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_enumatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_enumatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_enumatt.h5" +#define FILENAME "h5ex_t_enumatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -48,7 +48,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create the enumerated datatypes for file and memory. This @@ -110,7 +110,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_float.c b/HDF5Examples/C/H5T/16/h5ex_t_float.c index 70e2249343e..21ac5d4542e 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_float.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_float.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_t_float.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_t_float.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -39,7 +39,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -74,7 +74,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_floatatt.c b/HDF5Examples/C/H5T/16/h5ex_t_floatatt.c index f0a4404ffbf..625505f3088 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_floatatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_floatatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_floatatt.h5" +#define FILENAME "h5ex_t_floatatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -41,7 +41,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a scalar dataspace. @@ -84,7 +84,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_int.c b/HDF5Examples/C/H5T/16/h5ex_t_int.c index 8534025cee9..f05d6f807bc 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_int.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_int.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_t_int.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_t_int.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -39,7 +39,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -73,7 +73,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_intatt.c b/HDF5Examples/C/H5T/16/h5ex_t_intatt.c index d7a43d64e48..8cb172a1d0a 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_intatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_intatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_intatt.h5" +#define FILENAME "h5ex_t_intatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -40,7 +40,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a scalar dataspace. @@ -82,7 +82,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_objref.c b/HDF5Examples/C/H5T/16/h5ex_t_objref.c index 4c35239f608..ce3414cc3a7 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_objref.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_objref.c @@ -15,9 +15,9 @@ #include #include -#define FILE "h5ex_t_objref.h5" -#define DATASET "DS1" -#define DIM0 2 +#define FILENAME "h5ex_t_objref.h5" +#define DATASET "DS1" +#define DIM0 2 int main(void) @@ -35,7 +35,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a dataset with a scalar dataspace. @@ -88,7 +88,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_objrefatt.c b/HDF5Examples/C/H5T/16/h5ex_t_objrefatt.c index 85c044838c1..9a2004c9074 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_objrefatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_objrefatt.c @@ -15,7 +15,7 @@ #include #include -#define FILE "h5ex_t_objrefatt.h5" +#define FILENAME "h5ex_t_objrefatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 2 @@ -41,7 +41,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a dataset with a scalar dataspace. @@ -103,7 +103,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_opaque.c b/HDF5Examples/C/H5T/16/h5ex_t_opaque.c index 8755ccc02b9..3764a63d456 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_opaque.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_opaque.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_t_opaque.h5" -#define DATASET "DS1" -#define DIM0 4 -#define LEN 7 +#define FILENAME "h5ex_t_opaque.h5" +#define DATASET "DS1" +#define DIM0 4 +#define LEN 7 int main(void) @@ -48,7 +48,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create opaque datatype and set the tag to something appropriate. @@ -88,7 +88,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_opaqueatt.c b/HDF5Examples/C/H5T/16/h5ex_t_opaqueatt.c index 4a54fbb2621..c60140d062f 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_opaqueatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_opaqueatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_opaqueatt.h5" +#define FILENAME "h5ex_t_opaqueatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -49,7 +49,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a scalar dataspace. @@ -97,7 +97,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_regref.c b/HDF5Examples/C/H5T/16/h5ex_t_regref.c index 50b3ff04d5f..6e2280fb0d1 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_regref.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_regref.c @@ -16,7 +16,7 @@ #include #include -#define FILE "h5ex_t_regref.h5" +#define FILENAME "h5ex_t_regref.h5" #define DATASET "DS1" #define DATASET2 "DS2" #define DIM0 2 @@ -41,7 +41,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a dataset with character data. @@ -93,7 +93,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_regrefatt.c b/HDF5Examples/C/H5T/16/h5ex_t_regrefatt.c index 1f993fb79cd..29429d7f150 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_regrefatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_regrefatt.c @@ -16,7 +16,7 @@ #include #include -#define FILE "h5ex_t_regrefatt.h5" +#define FILENAME "h5ex_t_regrefatt.h5" #define DATASET "DS1" #define DATASET2 "DS2" #define ATTRIBUTE "A1" @@ -42,7 +42,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a dataset with character data. @@ -103,7 +103,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_string.c b/HDF5Examples/C/H5T/16/h5ex_t_string.c index 532e664f781..58863ed307e 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_string.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_string.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_t_string.h5" -#define DATASET "DS1" -#define DIM0 4 -#define SDIM 8 +#define FILENAME "h5ex_t_string.h5" +#define DATASET "DS1" +#define DIM0 4 +#define SDIM 8 int main(void) @@ -35,7 +35,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -78,7 +78,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_stringatt.c b/HDF5Examples/C/H5T/16/h5ex_t_stringatt.c index 7aa0af21f51..ef481b88eaa 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_stringatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_stringatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_stringatt.h5" +#define FILENAME "h5ex_t_stringatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -36,7 +36,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -87,7 +87,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_vlen.c b/HDF5Examples/C/H5T/16/h5ex_t_vlen.c index ab0e1786174..791256bb31b 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_vlen.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_vlen.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_t_vlen.h5" -#define DATASET "DS1" -#define LEN0 3 -#define LEN1 12 +#define FILENAME "h5ex_t_vlen.h5" +#define DATASET "DS1" +#define LEN0 3 +#define LEN1 12 int main(void) @@ -51,7 +51,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length datatype for file and memory. @@ -93,7 +93,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_vlenatt.c b/HDF5Examples/C/H5T/16/h5ex_t_vlenatt.c index 084596c0b5e..775895d1f94 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_vlenatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_vlenatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_vlenatt.h5" +#define FILENAME "h5ex_t_vlenatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define LEN0 3 @@ -52,7 +52,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length datatype for file and memory. @@ -102,7 +102,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/16/h5ex_t_vlstring.c b/HDF5Examples/C/H5T/16/h5ex_t_vlstring.c index f7904246f2a..2cf6be1c512 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_vlstring.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_vlstring.c @@ -14,9 +14,9 @@ #include #include -#define FILE "h5ex_t_vlstring.h5" -#define DATASET "DS1" -#define DIM0 4 +#define FILENAME "h5ex_t_vlstring.h5" +#define DATASET "DS1" +#define DIM0 4 int main(void) @@ -33,7 +33,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -76,7 +76,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); /* diff --git a/HDF5Examples/C/H5T/16/h5ex_t_vlstringatt.c b/HDF5Examples/C/H5T/16/h5ex_t_vlstringatt.c index 6ee3118a5aa..90e529c3e84 100644 --- a/HDF5Examples/C/H5T/16/h5ex_t_vlstringatt.c +++ b/HDF5Examples/C/H5T/16/h5ex_t_vlstringatt.c @@ -15,7 +15,7 @@ #include #include -#define FILE "h5ex_t_vlstringatt.h5" +#define FILENAME "h5ex_t_vlstringatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -35,7 +35,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -86,7 +86,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET); attr = H5Aopen_name(dset, ATTRIBUTE); diff --git a/HDF5Examples/C/H5T/200/h5ex_t_complex.c b/HDF5Examples/C/H5T/200/h5ex_t_complex.c new file mode 100644 index 00000000000..543c5086f42 --- /dev/null +++ b/HDF5Examples/C/H5T/200/h5ex_t_complex.c @@ -0,0 +1,137 @@ +/************************************************************ + + This example shows how to read and write complex number + datatypes to a dataset. The program first writes float + complex values to a dataset with a dataspace of DIM0xDIM1, + then closes the file. Next, it reopens the file, reads + back the data, and outputs it to the screen. This example + assumes the C99 complex number types are supported. For an + example that uses MSVC's complex number types, see the + h5ex_t_complex_msvc.c example file. + + ************************************************************/ + +#include "hdf5.h" +#include +#include +#include + +#define FILENAME "h5ex_t_complex.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 + +int +main(void) +{ + float _Complex wdata[DIM0][DIM1]; /* Write buffer */ + float _Complex **rdata; /* Read buffer */ + hid_t file, space, dset; /* Handles */ + herr_t status; + hsize_t dims[2] = {DIM0, DIM1}; + int ndims; + hsize_t i, j; + + /* + * Initialize data. + */ + for (i = 0; i < DIM0; i++) + for (j = 0; j < DIM1; j++) { + float real = (float)i / (j + 0.5) + j; + float imaginary = (float)i / (j + 0.5) + j + 1; + wdata[i][j] = real + imaginary * I; + } + + /* + * Create a new file using the default properties. + */ + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create dataspace. Setting maximum size to NULL sets the maximum + * size to be the current size. + */ + space = H5Screate_simple(2, dims, NULL); + + /* + * Create the dataset and write the complex number data to it. In + * this example we will save the data as complex numbers of 2 64-bit + * little endian IEEE floating point numbers, regardless of the native + * type. The HDF5 library automatically converts between different + * complex number types. + */ + dset = H5Dcreate(file, DATASET, H5T_COMPLEX_IEEE_F64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Dwrite(dset, H5T_NATIVE_FLOAT_COMPLEX, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]); + + /* + * Close and release resources. + */ + status = H5Dclose(dset); + status = H5Sclose(space); + status = H5Fclose(file); + + /* + * Now we begin the read section of this example. Here we assume + * the dataset has the same name and rank, but can have any size. + * Therefore we must allocate a new array to read in data using + * malloc(). + */ + + /* + * Open file and dataset. + */ + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); + dset = H5Dopen(file, DATASET, H5P_DEFAULT); + + /* + * Get dataspace and allocate memory for read buffer. This is a + * two dimensional dataset so the dynamic allocation must be done + * in steps. + */ + space = H5Dget_space(dset); + ndims = H5Sget_simple_extent_dims(space, dims, NULL); + + /* + * Allocate array of pointers to rows. + */ + rdata = malloc(dims[0] * sizeof(float _Complex *)); + + /* + * Allocate space for complex number data. + */ + rdata[0] = malloc(dims[0] * dims[1] * sizeof(float _Complex)); + + /* + * Set the rest of the pointers to rows to the correct addresses. + */ + for (i = 1; i < dims[0]; i++) + rdata[i] = rdata[0] + i * dims[1]; + + /* + * Read the data. + */ + status = H5Dread(dset, H5T_NATIVE_FLOAT_COMPLEX, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]); + + /* + * Output the data to the screen. + */ + printf("%s:\n", DATASET); + for (i = 0; i < dims[0]; i++) { + printf(" ["); + for (j = 0; j < dims[1]; j++) { + printf(" %6.4f%+6.4fi", crealf(rdata[i][j]), cimagf(rdata[i][j])); + } + printf("]\n"); + } + + /* + * Close and release resources. + */ + free(rdata[0]); + free(rdata); + status = H5Dclose(dset); + status = H5Sclose(space); + status = H5Fclose(file); + + return 0; +} diff --git a/HDF5Examples/C/H5T/200/h5ex_t_complex_custom.c b/HDF5Examples/C/H5T/200/h5ex_t_complex_custom.c new file mode 100644 index 00000000000..1acba0da423 --- /dev/null +++ b/HDF5Examples/C/H5T/200/h5ex_t_complex_custom.c @@ -0,0 +1,145 @@ +/************************************************************ + + This example shows how to read and write complex number + datatypes to a dataset. The program first writes float + complex values to a dataset with a dataspace of DIM0xDIM1, + then closes the file. Next, it reopens the file, reads + back the data, and outputs it to the screen. This example + assumes the C99 complex number types are supported. For an + example that uses MSVC's complex number types, see the + h5ex_t_complex_msvc.c example file. + + ************************************************************/ + +#include "hdf5.h" +#include +#include +#include + +#define FILENAME "h5ex_t_complex_custom.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 + +int +main(void) +{ + float _Complex wdata[DIM0][DIM1]; /* Write buffer */ + float _Complex **rdata; /* Read buffer */ + hid_t file, space, dset, dtype; /* Handles */ + herr_t status; + hsize_t dims[2] = {DIM0, DIM1}; + int ndims; + hsize_t i, j; + + /* + * Initialize data. + */ + for (i = 0; i < DIM0; i++) + for (j = 0; j < DIM1; j++) { + float real = (float)i / (j + 0.5) + j; + float imaginary = (float)i / (j + 0.5) + j + 1; + wdata[i][j] = real + imaginary * I; + } + + /* + * Create a new file using the default properties. + */ + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create dataspace. Setting maximum size to NULL sets the maximum + * size to be the current size. + */ + space = H5Screate_simple(2, dims, NULL); + + /* + * Create the dataset and write the complex number data to it. In + * this example we will save the data as complex numbers of 2 64-bit + * little endian IEEE floating point numbers, regardless of the native + * type. The HDF5 library automatically converts between different + * complex number types. + */ + dset = H5Dcreate(file, DATASET, H5T_COMPLEX_IEEE_F64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create a datatype for writing to the dataset. This datatype is a + * complex number equivalent to the H5T_NATIVE_FLOAT_COMPLEX type. + */ + dtype = H5Tcomplex_create(H5T_NATIVE_FLOAT); + + status = H5Dwrite(dset, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]); + + /* + * Close and release resources. + */ + status = H5Dclose(dset); + status = H5Sclose(space); + status = H5Fclose(file); + + /* + * Now we begin the read section of this example. Here we assume + * the dataset has the same name and rank, but can have any size. + * Therefore we must allocate a new array to read in data using + * malloc(). + */ + + /* + * Open file and dataset. + */ + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); + dset = H5Dopen(file, DATASET, H5P_DEFAULT); + + /* + * Get dataspace and allocate memory for read buffer. This is a + * two dimensional dataset so the dynamic allocation must be done + * in steps. + */ + space = H5Dget_space(dset); + ndims = H5Sget_simple_extent_dims(space, dims, NULL); + + /* + * Allocate array of pointers to rows. + */ + rdata = malloc(dims[0] * sizeof(float _Complex *)); + + /* + * Allocate space for complex number data. + */ + rdata[0] = malloc(dims[0] * dims[1] * sizeof(float _Complex)); + + /* + * Set the rest of the pointers to rows to the correct addresses. + */ + for (i = 1; i < dims[0]; i++) + rdata[i] = rdata[0] + i * dims[1]; + + /* + * Read the data. + */ + status = H5Dread(dset, dtype, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]); + + /* + * Output the data to the screen. + */ + printf("%s:\n", DATASET); + for (i = 0; i < dims[0]; i++) { + printf(" ["); + for (j = 0; j < dims[1]; j++) { + printf(" %6.4f%+6.4fi", crealf(rdata[i][j]), cimagf(rdata[i][j])); + } + printf("]\n"); + } + + /* + * Close and release resources. + */ + free(rdata[0]); + free(rdata); + status = H5Dclose(dset); + status = H5Sclose(space); + status = H5Tclose(dtype); + status = H5Fclose(file); + + return 0; +} diff --git a/HDF5Examples/C/H5T/200/h5ex_t_complex_msvc.c b/HDF5Examples/C/H5T/200/h5ex_t_complex_msvc.c new file mode 100644 index 00000000000..55a7e207a74 --- /dev/null +++ b/HDF5Examples/C/H5T/200/h5ex_t_complex_msvc.c @@ -0,0 +1,138 @@ +/************************************************************ + + This example shows how to read and write complex number + datatypes to a dataset. The program first writes float + complex values to a dataset with a dataspace of DIM0xDIM1, + then closes the file. Next, it reopens the file, reads + back the data, and outputs it to the screen. This example + assumes MSVC's complex number types are supported rather + than the C99 complex number types. For an example that uses + the C99 complex number types, see the h5ex_t_complex.c + example file. + + ************************************************************/ + +#include "hdf5.h" +#include +#include +#include + +#define FILENAME "h5ex_t_complex_msvc.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 + +int +main(void) +{ + _Fcomplex wdata[DIM0][DIM1]; /* Write buffer */ + _Fcomplex **rdata; /* Read buffer */ + hid_t file, space, dset; /* Handles */ + herr_t status; + hsize_t dims[2] = {DIM0, DIM1}; + int ndims; + hsize_t i, j; + + /* + * Initialize data. + */ + for (i = 0; i < DIM0; i++) + for (j = 0; j < DIM1; j++) { + float real = (float)i / (j + 0.5) + j; + float imaginary = (float)i / (j + 0.5) + j + 1; + wdata[i][j] = _FCbuild(real, imaginary); + } + + /* + * Create a new file using the default properties. + */ + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create dataspace. Setting maximum size to NULL sets the maximum + * size to be the current size. + */ + space = H5Screate_simple(2, dims, NULL); + + /* + * Create the dataset and write the complex number data to it. In + * this example we will save the data as complex numbers of 2 64-bit + * little endian IEEE floating point numbers, regardless of the native + * type. The HDF5 library automatically converts between different + * complex number types. + */ + dset = H5Dcreate(file, DATASET, H5T_COMPLEX_IEEE_F64LE, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + status = H5Dwrite(dset, H5T_NATIVE_FLOAT_COMPLEX, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]); + + /* + * Close and release resources. + */ + status = H5Dclose(dset); + status = H5Sclose(space); + status = H5Fclose(file); + + /* + * Now we begin the read section of this example. Here we assume + * the dataset has the same name and rank, but can have any size. + * Therefore we must allocate a new array to read in data using + * malloc(). + */ + + /* + * Open file and dataset. + */ + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); + dset = H5Dopen(file, DATASET, H5P_DEFAULT); + + /* + * Get dataspace and allocate memory for read buffer. This is a + * two dimensional dataset so the dynamic allocation must be done + * in steps. + */ + space = H5Dget_space(dset); + ndims = H5Sget_simple_extent_dims(space, dims, NULL); + + /* + * Allocate array of pointers to rows. + */ + rdata = malloc(dims[0] * sizeof(_Fcomplex *)); + + /* + * Allocate space for complex number data. + */ + rdata[0] = malloc(dims[0] * dims[1] * sizeof(_Fcomplex)); + + /* + * Set the rest of the pointers to rows to the correct addresses. + */ + for (i = 1; i < dims[0]; i++) + rdata[i] = rdata[0] + i * dims[1]; + + /* + * Read the data. + */ + status = H5Dread(dset, H5T_NATIVE_FLOAT_COMPLEX, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]); + + /* + * Output the data to the screen. + */ + printf("%s:\n", DATASET); + for (i = 0; i < dims[0]; i++) { + printf(" ["); + for (j = 0; j < dims[1]; j++) { + printf(" %6.4f%+6.4fi", crealf(rdata[i][j]), cimagf(rdata[i][j])); + } + printf("]\n"); + } + + /* + * Close and release resources. + */ + free(rdata[0]); + free(rdata); + status = H5Dclose(dset); + status = H5Sclose(space); + status = H5Fclose(file); + + return 0; +} diff --git a/HDF5Examples/C/H5T/CMakeLists.txt b/HDF5Examples/C/H5T/CMakeLists.txt index b95958fb9b5..ee216190ddc 100644 --- a/HDF5Examples/C/H5T/CMakeLists.txt +++ b/HDF5Examples/C/H5T/CMakeLists.txt @@ -19,7 +19,7 @@ foreach (example_name ${common_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -45,7 +45,7 @@ endforeach () # "$<$:-DH5_USE_110_API>" # "$<$:-DH5_USE_112_API>" # "$<$:-DH5_USE_114_API>" -# "$<$:-DH5_USE_116_API>" +# "$<$:-DH5_USE_200_API>" # ) # if (H5_HAVE_PARALLEL) # target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -97,18 +97,18 @@ endforeach () # endif () # endforeach () #endif () -#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") -# foreach (example_name ${1_16_examples}) -# if (H5EX_BUILD_TESTING) +if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") + foreach (example_name ${2_0_examples}) + if (H5EX_BUILD_TESTING) # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} -# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst # ) -# endif () -# endforeach () -#endif () + endif () + endforeach () +endif () if (HDF5_BUILD_TOOLS) foreach (example_name ${common_examples}) @@ -321,12 +321,12 @@ if (HDF5_BUILD_TOOLS) # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () - #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} - # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () # endforeach () @@ -336,7 +336,13 @@ if (HDF5_BUILD_TOOLS) # endforeach () # foreach (example_name ${1_14_examples}) # endforeach () -# foreach (example_name ${1_16_examples}) +# foreach (example_name ${2_0_examples}) + # add_custom_command ( + # TARGET ${EXAMPLE_VARNAME}_${example_name} + # POST_BUILD + # COMMAND ${CMAKE_COMMAND} + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ) # endforeach () endif () @@ -422,4 +428,8 @@ if (H5EX_BUILD_TESTING) ADD_H5_TEST (${example_name}) endif () endforeach () + +# foreach (example_name ${2_0_examples}) +# ADD_H5_TEST (${example_name}) +# endforeach () endif () diff --git a/HDF5Examples/C/H5T/C_sourcefiles.cmake b/HDF5Examples/C/H5T/C_sourcefiles.cmake index 8c51b3327b4..dd537fb7849 100644 --- a/HDF5Examples/C/H5T/C_sourcefiles.cmake +++ b/HDF5Examples/C/H5T/C_sourcefiles.cmake @@ -31,3 +31,9 @@ set (common_examples h5ex_t_commit h5ex_t_convert ) + +set (2_0_examples + h5ex_t_complex + h5ex_t_complex_custom + h5ex_t_complex_msvc +) diff --git a/HDF5Examples/C/H5T/Makefile.am b/HDF5Examples/C/H5T/Makefile.am index bc0d5d5392d..1d08dcb7a45 100644 --- a/HDF5Examples/C/H5T/Makefile.am +++ b/HDF5Examples/C/H5T/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5T/h5ex_t_array.c b/HDF5Examples/C/H5T/h5ex_t_array.c index a29ac455c98..27e43cfcaef 100644 --- a/HDF5Examples/C/H5T/h5ex_t_array.c +++ b/HDF5Examples/C/H5T/h5ex_t_array.c @@ -12,11 +12,11 @@ #include #include -#define FILE "h5ex_t_array.h5" -#define DATASET "DS1" -#define DIM0 4 -#define ADIM0 3 -#define ADIM1 5 +#define FILENAME "h5ex_t_array.h5" +#define DATASET "DS1" +#define DIM0 4 +#define ADIM0 3 +#define ADIM1 5 int main(void) @@ -47,7 +47,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create array datatypes for file and memory. @@ -86,7 +86,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_arrayatt.c b/HDF5Examples/C/H5T/h5ex_t_arrayatt.c index f0711286160..47e5c4f2321 100644 --- a/HDF5Examples/C/H5T/h5ex_t_arrayatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_arrayatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_arrayatt.h5" +#define FILENAME "h5ex_t_arrayatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -49,7 +49,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create array datatypes for file and memory. @@ -96,7 +96,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_bit.c b/HDF5Examples/C/H5T/h5ex_t_bit.c index 015c7e8299a..744b329a9a3 100644 --- a/HDF5Examples/C/H5T/h5ex_t_bit.c +++ b/HDF5Examples/C/H5T/h5ex_t_bit.c @@ -12,10 +12,10 @@ #include #include -#define FILE "h5ex_t_bit.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_t_bit.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -44,7 +44,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -75,7 +75,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_bitatt.c b/HDF5Examples/C/H5T/h5ex_t_bitatt.c index e4f81c3b7ee..8a01d5e5553 100644 --- a/HDF5Examples/C/H5T/h5ex_t_bitatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_bitatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_bitatt.h5" +#define FILENAME "h5ex_t_bitatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -45,7 +45,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a null dataspace. @@ -84,7 +84,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_cmpd.c b/HDF5Examples/C/H5T/h5ex_t_cmpd.c index 44f15523fba..d91df913adc 100644 --- a/HDF5Examples/C/H5T/h5ex_t_cmpd.c +++ b/HDF5Examples/C/H5T/h5ex_t_cmpd.c @@ -12,9 +12,9 @@ #include #include -#define FILE "h5ex_t_cmpd.h5" -#define DATASET "DS1" -#define DIM0 4 +#define FILENAME "h5ex_t_cmpd.h5" +#define DATASET "DS1" +#define DIM0 4 typedef struct { int serial_no; @@ -58,7 +58,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length string datatype. @@ -117,7 +117,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_cmpdatt.c b/HDF5Examples/C/H5T/h5ex_t_cmpdatt.c index 04c72a510e2..9acaaf4a011 100644 --- a/HDF5Examples/C/H5T/h5ex_t_cmpdatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_cmpdatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_cmpdatt.h5" +#define FILENAME "h5ex_t_cmpdatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -59,7 +59,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length string datatype. @@ -126,7 +126,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_commit.c b/HDF5Examples/C/H5T/h5ex_t_commit.c index b120656b1fb..ce8f17cc9b3 100644 --- a/HDF5Examples/C/H5T/h5ex_t_commit.c +++ b/HDF5Examples/C/H5T/h5ex_t_commit.c @@ -13,7 +13,7 @@ #include #include -#define FILE "h5ex_t_commit.h5" +#define FILENAME "h5ex_t_commit.h5" #define DATATYPE "Sensor_Type" int @@ -29,7 +29,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length string datatype. @@ -68,7 +68,7 @@ main(void) /* * Open file. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Open the named datatype. diff --git a/HDF5Examples/C/H5T/h5ex_t_cpxcmpd.c b/HDF5Examples/C/H5T/h5ex_t_cpxcmpd.c index 370f7819bb4..be0ee1a7ce2 100644 --- a/HDF5Examples/C/H5T/h5ex_t_cpxcmpd.c +++ b/HDF5Examples/C/H5T/h5ex_t_cpxcmpd.c @@ -27,9 +27,9 @@ #include #include -#define FILE "h5ex_t_cpxcmpd.h5" -#define DATASET "DS1" -#define DIM0 2 +#define FILENAME "h5ex_t_cpxcmpd.h5" +#define DATASET "DS1" +#define DIM0 2 typedef struct { int serial_no; @@ -74,7 +74,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset to use for region references. @@ -245,7 +245,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_cpxcmpdatt.c b/HDF5Examples/C/H5T/h5ex_t_cpxcmpdatt.c index a55fb76f765..bc90514199f 100644 --- a/HDF5Examples/C/H5T/h5ex_t_cpxcmpdatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_cpxcmpdatt.c @@ -27,7 +27,7 @@ #include #include -#define FILE "h5ex_t_cpxcmpdatt.h5" +#define FILENAME "h5ex_t_cpxcmpdatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 2 @@ -75,7 +75,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset to use for region references. @@ -255,7 +255,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_enum.c b/HDF5Examples/C/H5T/h5ex_t_enum.c index d7da67c0ce4..8b3db908910 100644 --- a/HDF5Examples/C/H5T/h5ex_t_enum.c +++ b/HDF5Examples/C/H5T/h5ex_t_enum.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_enum.h5" +#define FILENAME "h5ex_t_enum.h5" #define DATASET "DS1" #define DIM0 4 #define DIM1 7 @@ -46,7 +46,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create the enumerated datatypes for file and memory. This @@ -100,7 +100,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_enumatt.c b/HDF5Examples/C/H5T/h5ex_t_enumatt.c index 0da07d252a6..a07e0ca135a 100644 --- a/HDF5Examples/C/H5T/h5ex_t_enumatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_enumatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_enumatt.h5" +#define FILENAME "h5ex_t_enumatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -47,7 +47,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create the enumerated datatypes for file and memory. This @@ -109,7 +109,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_float.c b/HDF5Examples/C/H5T/h5ex_t_float.c index 1295448af51..1d772d17168 100644 --- a/HDF5Examples/C/H5T/h5ex_t_float.c +++ b/HDF5Examples/C/H5T/h5ex_t_float.c @@ -12,10 +12,10 @@ #include #include -#define FILE "h5ex_t_float.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_t_float.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -38,7 +38,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -73,7 +73,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_floatatt.c b/HDF5Examples/C/H5T/h5ex_t_floatatt.c index d8f9f7cd053..5424b574355 100644 --- a/HDF5Examples/C/H5T/h5ex_t_floatatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_floatatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_floatatt.h5" +#define FILENAME "h5ex_t_floatatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -40,7 +40,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a null dataspace. @@ -83,7 +83,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_int.c b/HDF5Examples/C/H5T/h5ex_t_int.c index b5728307402..265c5ee7551 100644 --- a/HDF5Examples/C/H5T/h5ex_t_int.c +++ b/HDF5Examples/C/H5T/h5ex_t_int.c @@ -12,10 +12,10 @@ #include #include -#define FILE "h5ex_t_int.h5" -#define DATASET "DS1" -#define DIM0 4 -#define DIM1 7 +#define FILENAME "h5ex_t_int.h5" +#define DATASET "DS1" +#define DIM0 4 +#define DIM1 7 int main(void) @@ -38,7 +38,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataspace. Setting maximum size to NULL sets the maximum @@ -72,7 +72,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_intatt.c b/HDF5Examples/C/H5T/h5ex_t_intatt.c index a7cc41818ea..f3cb1f3b749 100644 --- a/HDF5Examples/C/H5T/h5ex_t_intatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_intatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_intatt.h5" +#define FILENAME "h5ex_t_intatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -39,7 +39,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a null dataspace. @@ -81,7 +81,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_objref.c b/HDF5Examples/C/H5T/h5ex_t_objref.c index db20bc0eb11..d09a489c223 100644 --- a/HDF5Examples/C/H5T/h5ex_t_objref.c +++ b/HDF5Examples/C/H5T/h5ex_t_objref.c @@ -13,10 +13,10 @@ #include #include -#define FILE "h5ex_t_objref.h5" -#define DATASET "DS1" -#define DIM0 2 -#define RANK 1 +#define FILENAME "h5ex_t_objref.h5" +#define DATASET "DS1" +#define DIM0 2 +#define RANK 1 int main(void) @@ -47,7 +47,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a dataset with a null dataspace. @@ -112,7 +112,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_objrefatt.c b/HDF5Examples/C/H5T/h5ex_t_objrefatt.c index 9489bcb2f11..959b41bbb47 100644 --- a/HDF5Examples/C/H5T/h5ex_t_objrefatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_objrefatt.c @@ -13,7 +13,7 @@ #include #include -#define FILE "h5ex_t_objrefatt.h5" +#define FILENAME "h5ex_t_objrefatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 2 @@ -49,7 +49,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create a dataset with a null dataspace. @@ -123,7 +123,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_opaque.c b/HDF5Examples/C/H5T/h5ex_t_opaque.c index 11a58aea2e0..a48c1272627 100644 --- a/HDF5Examples/C/H5T/h5ex_t_opaque.c +++ b/HDF5Examples/C/H5T/h5ex_t_opaque.c @@ -12,10 +12,10 @@ #include #include -#define FILE "h5ex_t_opaque.h5" -#define DATASET "DS1" -#define DIM0 4 -#define LEN 7 +#define FILENAME "h5ex_t_opaque.h5" +#define DATASET "DS1" +#define DIM0 4 +#define LEN 7 int main(void) @@ -42,7 +42,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create opaque datatype and set the tag to something appropriate. @@ -82,7 +82,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_opaqueatt.c b/HDF5Examples/C/H5T/h5ex_t_opaqueatt.c index 67294921ae3..0a229f418e5 100644 --- a/HDF5Examples/C/H5T/h5ex_t_opaqueatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_opaqueatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_opaqueatt.h5" +#define FILENAME "h5ex_t_opaqueatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -43,7 +43,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create dataset with a null dataspace. @@ -91,7 +91,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_regref.c b/HDF5Examples/C/H5T/h5ex_t_regref.c index 6766198cee6..881d054d4a2 100644 --- a/HDF5Examples/C/H5T/h5ex_t_regref.c +++ b/HDF5Examples/C/H5T/h5ex_t_regref.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_regref.h5" +#define FILENAME "h5ex_t_regref.h5" #define DATASET "DS1" #define DATASET2 "DS2" #define DIM0 2 @@ -60,7 +60,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file < 0) goto done; @@ -137,7 +137,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file < 0) goto done; diff --git a/HDF5Examples/C/H5T/h5ex_t_regrefatt.c b/HDF5Examples/C/H5T/h5ex_t_regrefatt.c index dab4e28cbaf..665edcaf226 100644 --- a/HDF5Examples/C/H5T/h5ex_t_regrefatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_regrefatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_regrefatt.h5" +#define FILENAME "h5ex_t_regrefatt.h5" #define DATASET "DS1" #define DATASET2 "DS2" #define ATTRIBUTE "A1" @@ -62,7 +62,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); if (file < 0) goto done; @@ -148,7 +148,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); if (file < 0) goto done; diff --git a/HDF5Examples/C/H5T/h5ex_t_string.c b/HDF5Examples/C/H5T/h5ex_t_string.c index 33a54387966..de4e4bd2f00 100644 --- a/HDF5Examples/C/H5T/h5ex_t_string.c +++ b/HDF5Examples/C/H5T/h5ex_t_string.c @@ -14,10 +14,10 @@ #include #include -#define FILE "h5ex_t_string.h5" -#define DATASET "DS1" -#define DIM0 4 -#define SDIM 8 +#define FILENAME "h5ex_t_string.h5" +#define DATASET "DS1" +#define DIM0 4 +#define SDIM 8 int main(void) @@ -35,7 +35,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -78,7 +78,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_stringatt.c b/HDF5Examples/C/H5T/h5ex_t_stringatt.c index 26e86d2f77d..c025702a6bd 100644 --- a/HDF5Examples/C/H5T/h5ex_t_stringatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_stringatt.c @@ -14,7 +14,7 @@ #include #include -#define FILE "h5ex_t_stringatt.h5" +#define FILENAME "h5ex_t_stringatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -36,7 +36,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -87,7 +87,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_vlen.c b/HDF5Examples/C/H5T/h5ex_t_vlen.c index b5649729c9b..ef7678f4b86 100644 --- a/HDF5Examples/C/H5T/h5ex_t_vlen.c +++ b/HDF5Examples/C/H5T/h5ex_t_vlen.c @@ -12,10 +12,10 @@ #include #include -#define FILE "h5ex_t_vlen.h5" -#define DATASET "DS1" -#define LEN0 3 -#define LEN1 12 +#define FILENAME "h5ex_t_vlen.h5" +#define DATASET "DS1" +#define LEN0 3 +#define LEN1 12 int main(void) @@ -50,7 +50,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length datatype for file and memory. @@ -92,7 +92,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_vlenatt.c b/HDF5Examples/C/H5T/h5ex_t_vlenatt.c index e173a20f3bc..d4649f0c79e 100644 --- a/HDF5Examples/C/H5T/h5ex_t_vlenatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_vlenatt.c @@ -12,7 +12,7 @@ #include #include -#define FILE "h5ex_t_vlenatt.h5" +#define FILENAME "h5ex_t_vlenatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define LEN0 3 @@ -51,7 +51,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create variable-length datatype for file and memory. @@ -101,7 +101,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/h5ex_t_vlstring.c b/HDF5Examples/C/H5T/h5ex_t_vlstring.c index 48647c1bdd6..38968b89b6d 100644 --- a/HDF5Examples/C/H5T/h5ex_t_vlstring.c +++ b/HDF5Examples/C/H5T/h5ex_t_vlstring.c @@ -14,9 +14,9 @@ #include #include -#define FILE "h5ex_t_vlstring.h5" -#define DATASET "DS1" -#define DIM0 4 +#define FILENAME "h5ex_t_vlstring.h5" +#define DATASET "DS1" +#define DIM0 4 int main(void) @@ -33,7 +33,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -76,7 +76,7 @@ main(void) /* * Open file and dataset. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5T/h5ex_t_vlstringatt.c b/HDF5Examples/C/H5T/h5ex_t_vlstringatt.c index 443c0a2d42b..6df498cd164 100644 --- a/HDF5Examples/C/H5T/h5ex_t_vlstringatt.c +++ b/HDF5Examples/C/H5T/h5ex_t_vlstringatt.c @@ -15,7 +15,7 @@ #include #include -#define FILE "h5ex_t_vlstringatt.h5" +#define FILENAME "h5ex_t_vlstringatt.h5" #define DATASET "DS1" #define ATTRIBUTE "A1" #define DIM0 4 @@ -35,7 +35,7 @@ main(void) /* * Create a new file using the default properties. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* * Create file and memory datatypes. For this example we will save @@ -86,7 +86,7 @@ main(void) /* * Open file, dataset, and attribute. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen(file, DATASET, H5P_DEFAULT); attr = H5Aopen(dset, ATTRIBUTE, H5P_DEFAULT); diff --git a/HDF5Examples/C/H5T/test-pc.sh b/HDF5Examples/C/H5T/test-pc.sh index 69c948759d2..5b43873fb1d 100755 --- a/HDF5Examples/C/H5T/test-pc.sh +++ b/HDF5Examples/C/H5T/test-pc.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5T/test.sh.in b/HDF5Examples/C/H5T/test.sh.in index d5c453b5010..7da139cfc20 100755 --- a/HDF5Examples/C/H5T/test.sh.in +++ b/HDF5Examples/C/H5T/test.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5VDS/CMakeLists.txt b/HDF5Examples/C/H5VDS/CMakeLists.txt index 3ad3cb9ad89..bc27acfd9d9 100644 --- a/HDF5Examples/C/H5VDS/CMakeLists.txt +++ b/HDF5Examples/C/H5VDS/CMakeLists.txt @@ -19,7 +19,7 @@ if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.10") "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -60,14 +60,14 @@ endif () # endif () # endforeach () #endif () -#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") -# foreach (example_name ${1_16_examples}) +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) # if (H5EX_BUILD_TESTING) # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} -# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst # ) # endif () # endforeach () @@ -102,12 +102,12 @@ if (HDF5_BUILD_TOOLS) # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () - #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} - # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () endforeach () @@ -116,7 +116,7 @@ if (HDF5_BUILD_TOOLS) # endforeach () # foreach (example_name ${1_14_examples}) # endforeach () -# foreach (example_name ${1_16_examples}) +# foreach (example_name ${2_0_examples}) # endforeach () endif () diff --git a/HDF5Examples/C/H5VDS/Makefile.am b/HDF5Examples/C/H5VDS/Makefile.am index d9a5116afc7..acc69f8b8b1 100644 --- a/HDF5Examples/C/H5VDS/Makefile.am +++ b/HDF5Examples/C/H5VDS/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5VDS/h5ex_vds-eiger.c b/HDF5Examples/C/H5VDS/h5ex_vds-eiger.c index 8a41de6f269..85c19e5110a 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds-eiger.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds-eiger.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,15 +22,15 @@ #include #include -#define FILE "h5ex_vds-eiger.h5" -#define DATASET "VDS-Eiger" -#define VDSDIM0 5 -#define VDSDIM1 10 -#define VDSDIM2 10 -#define DIM0 5 -#define DIM1 10 -#define DIM2 10 -#define RANK 3 +#define FILENAME "h5ex_vds-eiger.h5" +#define DATASET "VDS-Eiger" +#define VDSDIM0 5 +#define VDSDIM1 10 +#define VDSDIM2 10 +#define DIM0 5 +#define DIM1 10 +#define DIM2 10 +#define RANK 3 int main(void) @@ -55,7 +55,7 @@ main(void) char *filename = NULL; char *dsetname = NULL; - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create VDS dataspace. */ vspace = H5Screate_simple(RANK, vdsdims, vdsdims_max); @@ -102,7 +102,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen2(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5VDS/h5ex_vds-exc.c b/HDF5Examples/C/H5VDS/h5ex_vds-exc.c index de26911b342..587b5a3a1b8 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds-exc.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds-exc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -21,18 +21,18 @@ #include #include -#define FILE "h5ex_vds-exc.h5" -#define DATASET "VDS-Excalibur" -#define VDSDIM0 0 -#define VDSDIM1 15 -#define VDSDIM2 6 -#define LDIM0 0 -#define LDIM1 2 -#define LDIM2 6 -#define NDIM0 0 -#define NDIM1 3 -#define NDIM2 6 -#define RANK 3 +#define FILENAME "h5ex_vds-exc.h5" +#define DATASET "VDS-Excalibur" +#define VDSDIM0 0 +#define VDSDIM1 15 +#define VDSDIM2 6 +#define LDIM0 0 +#define LDIM1 2 +#define LDIM2 6 +#define NDIM0 0 +#define NDIM1 3 +#define NDIM2 6 +#define RANK 3 const char *SRC_FILE[] = {"ae.h5", "be.h5", "ce.h5", "de.h5", "ee.h5", "fe.h5"}; @@ -68,7 +68,7 @@ main(void) char *filename = NULL; char *dsetname = NULL; - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create VDS dataspace. */ space = H5Screate_simple(RANK, vdsdims, vdsdims_max); @@ -134,7 +134,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen2(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5VDS/h5ex_vds-exclim.c b/HDF5Examples/C/H5VDS/h5ex_vds-exclim.c index 61b3078cdbc..13df3b41f5c 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds-exclim.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds-exclim.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,18 +22,18 @@ #include #include -#define FILE "h5ex_vds-exclim.h5" -#define DATASET "VDS-Excaliburlim" -#define VDSDIM0 3 -#define VDSDIM1 15 -#define VDSDIM2 6 -#define LDIM0 3 -#define LDIM1 2 -#define LDIM2 6 -#define NDIM0 3 -#define NDIM1 3 -#define NDIM2 6 -#define RANK 3 +#define FILENAME "h5ex_vds-exclim.h5" +#define DATASET "VDS-Excaliburlim" +#define VDSDIM0 3 +#define VDSDIM1 15 +#define VDSDIM2 6 +#define LDIM0 3 +#define LDIM1 2 +#define LDIM2 6 +#define NDIM0 3 +#define NDIM1 3 +#define NDIM2 6 +#define RANK 3 const char *SRC_FILE[] = {"ael.h5", "bel.h5", "cel.h5", "del.h5", "eel.h5", "fel.h5"}; @@ -66,7 +66,7 @@ main(void) char *filename = NULL; char *dsetname = NULL; - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create VDS dataspace. */ space = H5Screate_simple(RANK, vdsdims, NULL); @@ -128,7 +128,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen2(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim-maxmin.c b/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim-maxmin.c index 9ca030a4052..82b953c4fbf 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim-maxmin.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim-maxmin.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim.c b/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim.c index 71a8ddaac9a..e205b1463d6 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds-percival-unlim.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/H5VDS/h5ex_vds-percival.c b/HDF5Examples/C/H5VDS/h5ex_vds-percival.c index 75e1653da95..32a75ff45ca 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds-percival.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds-percival.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -23,7 +23,7 @@ #include #include -#define FILE "h5ex_vds-percival.h5" +#define FILENAME "h5ex_vds-percival.h5" #define DATASET "VDS-Percival" #define VDSDIM0 40 #define VDSDIM1 10 @@ -88,7 +88,7 @@ main(void) status = H5Fclose(file); } - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create VDS dataspace. */ vspace = H5Screate_simple(RANK, vdsdims, vdsdims_max); @@ -143,7 +143,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen2(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5VDS/h5ex_vds-simpleIO.c b/HDF5Examples/C/H5VDS/h5ex_vds-simpleIO.c index 52be8f5da77..cb586ae80ca 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds-simpleIO.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds-simpleIO.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,11 +26,11 @@ #include #include -#define FILE "h5ex_vds-simpleIO.h5" -#define DATASET "VDS" -#define DIM1 6 -#define DIM0 4 -#define RANK 2 +#define FILENAME "h5ex_vds-simpleIO.h5" +#define DATASET "VDS" +#define DIM1 6 +#define DIM0 4 +#define RANK 2 #define SRC_FILE "as.h5" #define SRC_DATASET "/A" @@ -76,7 +76,7 @@ main(void) status = H5Fclose(file); /* Create file in which virtual dataset will be stored. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create VDS dataspace. */ vspace = H5Screate_simple(RANK, vdsdims, NULL); @@ -107,7 +107,7 @@ main(void) /* * Open the file and virtual dataset */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen2(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5VDS/h5ex_vds.c b/HDF5Examples/C/H5VDS/h5ex_vds.c index 77219e87f03..badd5af68c6 100644 --- a/HDF5Examples/C/H5VDS/h5ex_vds.c +++ b/HDF5Examples/C/H5VDS/h5ex_vds.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -32,13 +32,13 @@ #include #include -#define FILE "h5ex_vds.h5" -#define DATASET "VDS" -#define VDSDIM1 6 -#define VDSDIM0 4 -#define DIM0 6 -#define RANK1 1 -#define RANK2 2 +#define FILENAME "h5ex_vds.h5" +#define DATASET "VDS" +#define VDSDIM1 6 +#define VDSDIM0 4 +#define DIM0 6 +#define RANK1 1 +#define RANK2 2 const char *SRC_FILE[] = {"h5ex_vds_a.h5", "h5ex_vds_b.h5", "h5ex_vds_c.h5"}; @@ -95,7 +95,7 @@ main(void) } /* Create file in which virtual dataset will be stored. */ - file = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create VDS dataspace. */ space = H5Screate_simple(RANK2, vdsdims, NULL); @@ -140,7 +140,7 @@ main(void) /* * Open file and dataset using the default properties. */ - file = H5Fopen(FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + file = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen2(file, DATASET, H5P_DEFAULT); /* diff --git a/HDF5Examples/C/H5VDS/test-pc.sh b/HDF5Examples/C/H5VDS/test-pc.sh index e0ee85eab53..d323473ebee 100644 --- a/HDF5Examples/C/H5VDS/test-pc.sh +++ b/HDF5Examples/C/H5VDS/test-pc.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/H5VDS/test.sh.in b/HDF5Examples/C/H5VDS/test.sh.in index 983ef426d1c..5e2a061996e 100644 --- a/HDF5Examples/C/H5VDS/test.sh.in +++ b/HDF5Examples/C/H5VDS/test.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/HL/CMakeLists.txt b/HDF5Examples/C/HL/CMakeLists.txt new file mode 100644 index 00000000000..3b01b56d07c --- /dev/null +++ b/HDF5Examples/C/HL/CMakeLists.txt @@ -0,0 +1,325 @@ +cmake_minimum_required (VERSION 3.18) +project (HDF5Examples_C_HL C) + +#----------------------------------------------------------------------------- +# Define Sources +#----------------------------------------------------------------------------- +include (C_sourcefiles.cmake) + +foreach (example_name ${common_examples}) + add_executable (${EXAMPLE_VARNAME}_${example_name} ${PROJECT_SOURCE_DIR}/${example_name}.c) + target_compile_options(${EXAMPLE_VARNAME}_${example_name} + PRIVATE + "$<$:-DH5_USE_16_API>" + "$<$:-DH5_USE_18_API>" + "$<$:-DH5_USE_110_API>" + "$<$:-DH5_USE_112_API>" + "$<$:-DH5_USE_114_API>" + "$<$:-DH5_USE_200_API>" + ) + if (H5_HAVE_PARALLEL) + target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) + endif () + target_link_libraries (${EXAMPLE_VARNAME}_${example_name} ${H5EX_HDF5_LINK_LIBS}) + if (H5EX_BUILD_TESTING) + add_custom_command ( + TARGET ${EXAMPLE_VARNAME}_${example_name} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst + ) + endif () +endforeach () + +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.8") +# foreach (example_name ${1_8_examples}) +# add_executable (${EXAMPLE_VARNAME}_${example_name} ${PROJECT_SOURCE_DIR}/${example_name}.c) +# target_compile_options(${EXAMPLE_VARNAME}_${example_name} +# PRIVATE +# "$<$:-DH5_USE_16_API>" +# "$<$:-DH5_USE_18_API>" +# "$<$:-DH5_USE_110_API>" +# "$<$:-DH5_USE_112_API>" +# "$<$:-DH5_USE_114_API>" +# "$<$:-DH5_USE_200_API>" +# ) +# if (H5_HAVE_PARALLEL) +# target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) +# endif () +# target_link_libraries (${EXAMPLE_VARNAME}_${example_name} ${H5EX_HDF5_LINK_LIBS}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/18/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.10") +# foreach (example_name ${1_10_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/110/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.12") +# foreach (example_name ${1_12_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/112/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.14") +# foreach (example_name ${1_14_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () + +if (HDF5_BUILD_TOOLS) + add_custom_command ( + TARGET ${EXAMPLE_VARNAME}_h5ex_image2 + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/image8.txt ${PROJECT_BINARY_DIR}/image8.txt + ) + add_custom_command ( + TARGET ${EXAMPLE_VARNAME}_h5ex_image2 + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/image24pixel.txt ${PROJECT_BINARY_DIR}/image24pixel.txt + ) + foreach (example_name ${common_examples}) + if (NOT ${example_name} STREQUAL "h5ex_lite1" AND NOT ${example_name} STREQUAL "h5ex_lite2") + add_custom_command ( + TARGET ${EXAMPLE_VARNAME}_${example_name} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + ) + endif () + endforeach () + +# foreach (example_name ${1_8_examples}) + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.8") + # add_custom_command ( + # TARGET ${EXAMPLE_VARNAME}_${example_name} + # POST_BUILD + # COMMAND ${CMAKE_COMMAND} + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/18/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ) + #endif () + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.10") + # add_custom_command ( + # TARGET ${EXAMPLE_VARNAME}_${example_name} + # POST_BUILD + # COMMAND ${CMAKE_COMMAND} + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/110/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ) + #endif () + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.12") + # add_custom_command ( + # TARGET ${EXAMPLE_VARNAME}_${example_name} + # POST_BUILD + # COMMAND ${CMAKE_COMMAND} + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/112/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ) + #endif () + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.14") + # add_custom_command ( + # TARGET ${EXAMPLE_VARNAME}_${example_name} + # POST_BUILD + # COMMAND ${CMAKE_COMMAND} + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ) + #endif () + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") + # add_custom_command ( + # TARGET ${EXAMPLE_VARNAME}_${example_name} + # POST_BUILD + # COMMAND ${CMAKE_COMMAND} + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ) + #endif () +# endforeach () +# foreach (example_name ${1_10_examples}) +# endforeach () +# foreach (example_name ${1_12_examples}) +# endforeach () +# foreach (example_name ${1_14_examples}) +# endforeach () +# foreach (example_name ${2_0_examples}) +# endforeach () +endif () + +if (H5EX_BUILD_TESTING) + macro (ADD_H5_TEST testname) + add_test ( + NAME ${EXAMPLE_VARNAME}_${testname}-clearall + COMMAND ${CMAKE_COMMAND} + -E remove + ${testname}.h5 + ) + if (HDF5_ENABLE_USING_MEMCHECKER) + add_test (NAME ${EXAMPLE_VARNAME}_${testname} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + set_tests_properties (${EXAMPLE_VARNAME}_${testname} PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_${testname}-clearall) + else () + add_test ( + NAME ${EXAMPLE_VARNAME}_${testname} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$" + -D "TEST_ARGS:STRING=" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_EXPECT=0" + -D "TEST_OUTPUT=${testname}.out" + -D "TEST_REFERENCE=${testname}.tst" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + set_tests_properties (${EXAMPLE_VARNAME}_${testname} PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_${testname}-clearall) + if (HDF5_BUILD_TOOLS) + add_test ( + NAME ${EXAMPLE_VARNAME}_H5DUMP-${testname} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=${H5EX_HDF5_DUMP_EXECUTABLE}" + -D "TEST_ARGS:STRING=${ARGN};${testname}.h5" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_OUTPUT=${testname}.ddl.out" + -D "TEST_EXPECT=0" + -D "TEST_REFERENCE=${testname}.ddl" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + set_tests_properties (${EXAMPLE_VARNAME}_H5DUMP-${testname} PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_${testname}) + endif () + endif () + endmacro () + + macro (ADD_H5_NOCMP_TEST testname) + add_test ( + NAME ${EXAMPLE_VARNAME}_${testname}-clearall + COMMAND ${CMAKE_COMMAND} + -E remove + ${testname}.h5 + ) + if (HDF5_ENABLE_USING_MEMCHECKER) + add_test (NAME ${EXAMPLE_VARNAME}_${testname} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + set_tests_properties (${EXAMPLE_VARNAME}_${testname} PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_${testname}-clearall) + else () + add_test ( + NAME ${EXAMPLE_VARNAME}_${testname} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$" + -D "TEST_ARGS:STRING=${ARGN}" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_EXPECT=0" + -D "TEST_OUTPUT=${testname}.out" + -D "TEST_REFERENCE=${testname}.tst" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + set_tests_properties (${EXAMPLE_VARNAME}_${testname} PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_${testname}-clearall) + if (HDF5_BUILD_TOOLS) + add_test ( + NAME ${EXAMPLE_VARNAME}_H5DUMP-${testname} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=${H5EX_HDF5_DUMP_EXECUTABLE}" + -D "TEST_ARGS:STRING=${ARGN};${testname}.h5" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_OUTPUT=${testname}.ddl.out" + -D "TEST_EXPECT=0" + -D "TEST_SKIP_COMPARE=TRUE" + #-D "TEST_REFERENCE=${testname}.ddl" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + set_tests_properties (${EXAMPLE_VARNAME}_H5DUMP-${testname} PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_${testname}) + endif () + endif () + endmacro () + + foreach (example_name ${common_examples}) + if (${example_name} STREQUAL "h5ex_ds1") + ADD_H5_NOCMP_TEST (${example_name}) + elseif (NOT ${example_name} STREQUAL "h5ex_lite1" AND NOT ${example_name} STREQUAL "h5ex_lite2") + ADD_H5_TEST (${example_name}) + endif () + endforeach () + + # special test for h5ex_lite1 and h5ex_lite2 + add_test ( + NAME ${EXAMPLE_VARNAME}_h5ex_lite-clearall + COMMAND ${CMAKE_COMMAND} + -E remove + h5ex_lite1.h5 + ) + if (HDF5_ENABLE_USING_MEMCHECKER) + add_test (NAME ${EXAMPLE_VARNAME}_h5ex_lite1 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + set_tests_properties (${EXAMPLE_VARNAME}_h5ex_lite1 PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_h5ex_lite-clearall) + add_test (NAME ${EXAMPLE_VARNAME}_h5ex_lite2 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + set_tests_properties (${EXAMPLE_VARNAME}_h5ex_lite2 PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_h5ex_lite1) + else () + add_test ( + NAME ${EXAMPLE_VARNAME}_h5ex_lite1 + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$" + -D "TEST_ARGS:STRING=" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_EXPECT=0" + -D "TEST_OUTPUT=h5ex_lite1.out" + -D "TEST_REFERENCE=h5ex_lite1.tst" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + set_tests_properties (${EXAMPLE_VARNAME}_h5ex_lite1 PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_h5ex_lite-clearall) + add_test ( + NAME ${EXAMPLE_VARNAME}_h5ex_lite2 + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$" + -D "TEST_ARGS:STRING=" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_EXPECT=0" + -D "TEST_OUTPUT=h5ex_lite2.out" + -D "TEST_REFERENCE=h5ex_lite2.tst" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + set_tests_properties (${EXAMPLE_VARNAME}_h5ex_lite2 PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_h5ex_lite1) + endif () +endif () diff --git a/HDF5Examples/C/HL/C_sourcefiles.cmake b/HDF5Examples/C/HL/C_sourcefiles.cmake new file mode 100644 index 00000000000..8da83fa4b77 --- /dev/null +++ b/HDF5Examples/C/HL/C_sourcefiles.cmake @@ -0,0 +1,11 @@ +#----------------------------------------------------------------------------- +# Define Sources, one file per application +#----------------------------------------------------------------------------- +set (common_examples + h5ex_lite1 h5ex_lite2 h5ex_lite3 h5ex_packet_table_FL + h5ex_image1 h5ex_image2 + h5ex_table_01 h5ex_table_02 h5ex_table_03 h5ex_table_04 + h5ex_table_05 h5ex_table_06 h5ex_table_07 h5ex_table_08 + h5ex_table_09 h5ex_table_10 h5ex_table_11 h5ex_table_12 + h5ex_ds1 +) diff --git a/HDF5Examples/C/HL/Makefile.am b/HDF5Examples/C/HL/Makefile.am new file mode 100644 index 00000000000..74778464403 --- /dev/null +++ b/HDF5Examples/C/HL/Makefile.am @@ -0,0 +1,53 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the LICENSE file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +## +## Makefile.am +## Run automake to generate a Makefile.in from this file. +## + +noinst_PROGRAMS = h5ex_lite1 h5ex_lite2 h5ex_lite3 h5ex_ptExampleFL \ + h5ex_image1 h5ex_image2 \ + h5ex_table_01 h5ex_table_02 h5ex_table_03 h5ex_table_04 \ + h5ex_table_05 h5ex_table_06 h5ex_table_07 h5ex_table_08 \ + h5ex_table_09 h5ex_table_10 h5ex_table_11 h5ex_table_12 \ + h5ex_ds1 + +# ex_lite2 uses a file created by ex_lite1 +ex_lite2.chkexe_: ex_lite1.chkexe_ + +# List dependencies for each program. Normally, automake would take +# care of this for us, but if we tell automake about the programs it +# will try to build them with the normal C compiler, not h5cc. This is +# an inelegant way of solving the problem. +# All programs share the same build rule and a dependency on the main hdf5 +# library above. +ex_lite1: $(srcdir)/ex_lite1.c +ex_lite2: $(srcdir)/ex_lite2.c +ex_lite3: $(srcdir)/ex_lite3.c +ptExampleFL: $(srcdir)/ptExampleFL.c +ex_image1: $(srcdir)/ex_image1.c +ex_image2: $(srcdir)/ex_image2.c +ex_table01: $(srcdir)/ex_table01.c +ex_table02: $(srcdir)/ex_table02.c +ex_table03: $(srcdir)/ex_table03.c +ex_table04: $(srcdir)/ex_table04.c +ex_table05: $(srcdir)/ex_table05.c +ex_table06: $(srcdir)/ex_table06.c +ex_table07: $(srcdir)/ex_table07.c +ex_table08: $(srcdir)/ex_table08.c +ex_table09: $(srcdir)/ex_table09.c +ex_table10: $(srcdir)/ex_table10.c +ex_table11: $(srcdir)/ex_table11.c +ex_table12: $(srcdir)/ex_table12.c + +TESTS = test.sh + +CLEANFILES = Makefile test.sh diff --git a/hl/examples/ex_ds1.c b/HDF5Examples/C/HL/h5ex_ds1.c similarity index 95% rename from hl/examples/ex_ds1.c rename to HDF5Examples/C/HL/h5ex_ds1.c index 7371f82f3d9..3d5e6f175f6 100644 --- a/hl/examples/ex_ds1.c +++ b/HDF5Examples/C/HL/h5ex_ds1.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -20,6 +20,7 @@ #define DIM0 0 #define DIM1 1 +#define FILENAME "h5ex_ds1.h5" #define DSET_NAME "Mydata" #define DS_1_NAME "Yaxis" #define DS_2_NAME "Xaxis" @@ -41,7 +42,7 @@ main(void) int s2_wbuf[DIM2_SIZE] = {10, 20, 50, 100}; /* data of DS 2 dataset */ /* create a file using default properties */ - if ((fid = H5Fcreate("ex_ds1.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) goto out; /* make a dataset */ diff --git a/hl/examples/ex_image1.c b/HDF5Examples/C/HL/h5ex_image1.c similarity index 93% rename from hl/examples/ex_image1.c rename to HDF5Examples/C/HL/h5ex_image1.c index 49a90936e99..00c072dbaf4 100644 --- a/hl/examples/ex_image1.c +++ b/HDF5Examples/C/HL/h5ex_image1.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -13,6 +13,7 @@ #include "hdf5.h" #include "hdf5_hl.h" +#define FILENAME "h5ex_image1.h5" #define WIDTH 400 #define HEIGHT 200 #define PAL_ENTRIES 9 @@ -49,7 +50,7 @@ main(void) } /* create a new HDF5 file using default properties. */ - file_id = H5Fcreate("ex_image1.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* make the image */ H5IMmake_image_8bit(file_id, "image1", (hsize_t)WIDTH, (hsize_t)HEIGHT, buf); diff --git a/hl/examples/ex_image2.c b/HDF5Examples/C/HL/h5ex_image2.c similarity index 96% rename from hl/examples/ex_image2.c rename to HDF5Examples/C/HL/h5ex_image2.c index 9ce1746f702..cfed4d7c1f4 100644 --- a/hl/examples/ex_image2.c +++ b/HDF5Examples/C/HL/h5ex_image2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -15,6 +15,7 @@ #include #include +#define FILENAME "h5ex_image2.h5" #define DATA_FILE1 "image8.txt" #define DATA_FILE2 "image24pixel.txt" #define IMAGE1_NAME "image8bit" @@ -36,7 +37,7 @@ main(void) herr_t i, n; /* create a new HDF5 file using default properties. */ - file_id = H5Fcreate("ex_image2.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* read first data file */ if (read_data(DATA_FILE1, &width, &height) < 0) diff --git a/hl/examples/ex_lite1.c b/HDF5Examples/C/HL/h5ex_lite1.c similarity index 86% rename from hl/examples/ex_lite1.c rename to HDF5Examples/C/HL/h5ex_lite1.c index a23bd296091..8926fb00145 100644 --- a/hl/examples/ex_lite1.c +++ b/HDF5Examples/C/HL/h5ex_lite1.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -13,7 +13,8 @@ #include "hdf5.h" #include "hdf5_hl.h" -#define RANK 2 +#define FILENAME "h5ex_lite1.h5" +#define RANK 2 int main(void) @@ -23,7 +24,7 @@ main(void) int data[6] = {1, 2, 3, 4, 5, 6}; /* create a HDF5 file */ - file_id = H5Fcreate("ex_lite1.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* create and write an integer type dataset named "dset" */ H5LTmake_dataset(file_id, "/dset", RANK, dims, H5T_NATIVE_INT, data); diff --git a/hl/examples/ex_lite2.c b/HDF5Examples/C/HL/h5ex_lite2.c similarity index 90% rename from hl/examples/ex_lite2.c rename to HDF5Examples/C/HL/h5ex_lite2.c index aa6a47f3146..a3f33c0585f 100644 --- a/hl/examples/ex_lite2.c +++ b/HDF5Examples/C/HL/h5ex_lite2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -13,6 +13,8 @@ #include "hdf5.h" #include "hdf5_hl.h" +#define FILENAME "h5ex_lite1.h5" + int main(void) { @@ -22,7 +24,7 @@ main(void) size_t i, j, nrow, n_values; /* open file from ex_lite1.c */ - file_id = H5Fopen("ex_lite1.h5", H5F_ACC_RDONLY, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); /* read dataset */ H5LTread_dataset_int(file_id, "/dset", data); diff --git a/hl/examples/ex_lite3.c b/HDF5Examples/C/HL/h5ex_lite3.c similarity index 92% rename from hl/examples/ex_lite3.c rename to HDF5Examples/C/HL/h5ex_lite3.c index 8b774de92f9..82af8952ab7 100644 --- a/hl/examples/ex_lite3.c +++ b/HDF5Examples/C/HL/h5ex_lite3.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -14,6 +14,7 @@ #include "hdf5_hl.h" #include +#define FILENAME "h5ex_lite3.h5" #define ATTR_SIZE 5 int @@ -27,7 +28,7 @@ main(void) int i; /* create a file */ - file_id = H5Fcreate("ex_lite3.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* create a data space */ space_id = H5Screate_simple(1, dims, NULL); diff --git a/hl/examples/ptExampleFL.c b/HDF5Examples/C/HL/h5ex_packet_table_FL.c similarity index 94% rename from hl/examples/ptExampleFL.c rename to HDF5Examples/C/HL/h5ex_packet_table_FL.c index b3b4f726769..dc022497a2d 100644 --- a/hl/examples/ptExampleFL.c +++ b/HDF5Examples/C/HL/h5ex_packet_table_FL.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,6 +22,7 @@ *------------------------------------------------------------------------- */ +#define FILENAME "h5ex_packet_table_FL.h5" int main(void) { @@ -44,7 +45,7 @@ main(void) } /* Create a file using default properties */ - fid = H5Fcreate("packet_table_FLexample.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create a fixed-length packet table within the file */ /* This table's "packets" will be simple integers and it will use compression diff --git a/hl/examples/ex_table_01.c b/HDF5Examples/C/HL/h5ex_table_01.c similarity index 95% rename from hl/examples/ex_table_01.c rename to HDF5Examples/C/HL/h5ex_table_01.c index 582cdc701f9..c35332734ab 100644 --- a/hl/examples/ex_table_01.c +++ b/HDF5Examples/C/HL/h5ex_table_01.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,6 +26,7 @@ #define NFIELDS (hsize_t)5 #define NRECORDS (hsize_t)8 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_01.h5" int main(void) @@ -74,7 +75,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_01.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /*------------------------------------------------------------------------- * H5TBmake_table diff --git a/hl/examples/ex_table_02.c b/HDF5Examples/C/HL/h5ex_table_02.c similarity index 95% rename from hl/examples/ex_table_02.c rename to HDF5Examples/C/HL/h5ex_table_02.c index 5b4fe31daca..21ab24400c4 100644 --- a/hl/examples/ex_table_02.c +++ b/HDF5Examples/C/HL/h5ex_table_02.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,6 +26,7 @@ #define NRECORDS (hsize_t)8 #define NRECORDS_ADD (hsize_t)2 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_02.h5" int main(void) @@ -77,7 +78,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_02.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* make a table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_03.c b/HDF5Examples/C/HL/h5ex_table_03.c similarity index 95% rename from hl/examples/ex_table_03.c rename to HDF5Examples/C/HL/h5ex_table_03.c index 280c6a4f571..ba426716d9b 100644 --- a/hl/examples/ex_table_03.c +++ b/HDF5Examples/C/HL/h5ex_table_03.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,6 +26,7 @@ #define NRECORDS (hsize_t)8 #define NRECORDS_WRITE (hsize_t)2 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_03.h5" int main(void) @@ -74,7 +75,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_03.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make the table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_04.c b/HDF5Examples/C/HL/h5ex_table_04.c similarity index 96% rename from hl/examples/ex_table_04.c rename to HDF5Examples/C/HL/h5ex_table_04.c index ba7b4363557..6d01bdb8187 100644 --- a/hl/examples/ex_table_04.c +++ b/HDF5Examples/C/HL/h5ex_table_04.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,6 +26,7 @@ #define NRECORDS (hsize_t)8 #define NRECORDS_ADD (hsize_t)3 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_04.h5" int main(void) @@ -95,7 +96,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_04.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make the table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_05.c b/HDF5Examples/C/HL/h5ex_table_05.c similarity index 96% rename from hl/examples/ex_table_05.c rename to HDF5Examples/C/HL/h5ex_table_05.c index d7cecaf6959..26cc36fab3d 100644 --- a/hl/examples/ex_table_05.c +++ b/HDF5Examples/C/HL/h5ex_table_05.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,6 +26,7 @@ #define NRECORDS (hsize_t)8 #define NRECORDS_ADD (hsize_t)3 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_05.h5" int main(void) @@ -92,7 +93,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_05.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make the table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_06.c b/HDF5Examples/C/HL/h5ex_table_06.c similarity index 94% rename from hl/examples/ex_table_06.c rename to HDF5Examples/C/HL/h5ex_table_06.c index b53216fb46f..71c126ace02 100644 --- a/hl/examples/ex_table_06.c +++ b/HDF5Examples/C/HL/h5ex_table_06.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -25,6 +25,7 @@ #define NFIELDS (hsize_t)5 #define NRECORDS (hsize_t)8 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_06.h5" int main(void) @@ -63,7 +64,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_06.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make a table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_07.c b/HDF5Examples/C/HL/h5ex_table_07.c similarity index 95% rename from hl/examples/ex_table_07.c rename to HDF5Examples/C/HL/h5ex_table_07.c index e99d2347c26..90ed4c0b47e 100644 --- a/hl/examples/ex_table_07.c +++ b/HDF5Examples/C/HL/h5ex_table_07.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -25,6 +25,7 @@ #define NFIELDS (hsize_t)5 #define NRECORDS (hsize_t)8 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_07.h5" int main(void) @@ -71,7 +72,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_07.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make the table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_08.c b/HDF5Examples/C/HL/h5ex_table_08.c similarity index 96% rename from hl/examples/ex_table_08.c rename to HDF5Examples/C/HL/h5ex_table_08.c index d66a1b9e4d1..886d60b52db 100644 --- a/hl/examples/ex_table_08.c +++ b/HDF5Examples/C/HL/h5ex_table_08.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -25,6 +25,7 @@ #define NRECORDS (hsize_t)8 #define NRECORDS_INS (hsize_t)2 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_08.h5" int main(void) @@ -79,7 +80,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_08.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make the table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_09.c b/HDF5Examples/C/HL/h5ex_table_09.c similarity index 96% rename from hl/examples/ex_table_09.c rename to HDF5Examples/C/HL/h5ex_table_09.c index ba515ee188a..5c605613e9f 100644 --- a/hl/examples/ex_table_09.c +++ b/HDF5Examples/C/HL/h5ex_table_09.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,6 +26,7 @@ #define NRECORDS_INS (hsize_t)2 #define TABLE1_NAME "table1" #define TABLE2_NAME "table2" +#define FILENAME "h5ex_table_09.h5" int main(void) @@ -78,7 +79,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_09.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make 2 tables: TABLE2_NAME is empty */ H5TBmake_table("Table Title", file_id, TABLE1_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_10.c b/HDF5Examples/C/HL/h5ex_table_10.c similarity index 96% rename from hl/examples/ex_table_10.c rename to HDF5Examples/C/HL/h5ex_table_10.c index d462f7f020f..5cdb97cf6b6 100644 --- a/hl/examples/ex_table_10.c +++ b/HDF5Examples/C/HL/h5ex_table_10.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,6 +26,7 @@ #define TABLE1_NAME "table1" #define TABLE2_NAME "table2" #define TABLE3_NAME "table3" +#define FILENAME "h5ex_table_10.h5" int main(void) @@ -74,7 +75,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_10.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make two tables */ H5TBmake_table("Table Title", file_id, TABLE1_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/ex_table_11.c b/HDF5Examples/C/HL/h5ex_table_11.c similarity index 95% rename from hl/examples/ex_table_11.c rename to HDF5Examples/C/HL/h5ex_table_11.c index 725c26c8e5c..fb172c9a52e 100644 --- a/hl/examples/ex_table_11.c +++ b/HDF5Examples/C/HL/h5ex_table_11.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -24,6 +24,7 @@ #define NFIELDS (hsize_t)5 #define NRECORDS (hsize_t)8 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_11.h5" int main(void) @@ -75,7 +76,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_11.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make the table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size1, field_names, dst_offset1, diff --git a/hl/examples/ex_table_12.c b/HDF5Examples/C/HL/h5ex_table_12.c similarity index 95% rename from hl/examples/ex_table_12.c rename to HDF5Examples/C/HL/h5ex_table_12.c index 35175d0841f..7b57ed2768a 100644 --- a/hl/examples/ex_table_12.c +++ b/HDF5Examples/C/HL/h5ex_table_12.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -25,6 +25,7 @@ #define NFIELDS (hsize_t)5 #define NRECORDS (hsize_t)8 #define TABLE_NAME "table" +#define FILENAME "h5ex_table_12.h5" int main(void) @@ -69,7 +70,7 @@ main(void) field_type[4] = H5T_NATIVE_DOUBLE; /* Create a new file using default properties. */ - file_id = H5Fcreate("ex_table_12.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Make a table */ H5TBmake_table("Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, field_names, dst_offset, diff --git a/hl/examples/pal_rgb.h b/HDF5Examples/C/HL/pal_rgb.h similarity index 98% rename from hl/examples/pal_rgb.h rename to HDF5Examples/C/HL/pal_rgb.h index 8409f7ed696..af2e2320569 100644 --- a/hl/examples/pal_rgb.h +++ b/HDF5Examples/C/HL/pal_rgb.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/HL/test-pc.sh b/HDF5Examples/C/HL/test-pc.sh new file mode 100755 index 00000000000..b496b58b830 --- /dev/null +++ b/HDF5Examples/C/HL/test-pc.sh @@ -0,0 +1,152 @@ +#! /bin/sh +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the LICENSE file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. + +# This file is for use of h5cc created with the CMake process +# HDF5_HOME is expected to be set + +srcdir=.. +builddir=. +verbose=yes +nerrors=0 + +# HDF5 compile commands, assuming they are in your $PATH. +H5CC=$HDF5_HOME/bin/h5cc +LD_LIBRARY_PATH=$HDF5_HOME/lib +export LD_LIBRARY_PATH + +if ! test -f $H5CC; then + echo "Set paths for H5CC and LD_LIBRARY_PATH in test.sh" + echo "Set environment variable HDF5_HOME to the hdf5 install dir" + echo "h5cc was not found at $H5CC" + exit $EXIT_FAILURE +fi + +H5DUMP=`echo $H5CC | sed -e 's/\/[^/]*$/\/h5dump/'`; +H5_LIBVER=$($H5CC -showconfig | grep -i "HDF5 Version:" | sed 's/^.* //g' | sed 's/[-].*//g') +H5_APIVER=$($H5CC -showconfig | grep -i "Default API mapping:" | sed 's/^.* //g' | sed 's/v//g' | sed 's/1/1_/') + +H5_MAJORVER=$(echo $H5_LIBVER | cut -f1 -d'.' | sed -E 's/\./_/g') +H5_MINORVER=$(echo $H5_LIBVER | cut -f2 -d'.' | sed -E 's/\./_/g') +H5_RELEASEVER=$(echo $H5_LIBVER | cut -f3 -d'.' | sed -E 's/\./_/g') +H5_LIBVER_DIR=$H5_MAJORVER$H5_MINORVER + +# Shell commands used in Makefiles +RM="rm -rf" +DIFF="diff -c" +CMP="cmp -s" +GREP='grep' +CP="cp -p" # Use -p to preserve mode,ownership,timestamps +DIRNAME='dirname' +LS='ls' +AWK='awk' + +# setup plugin path +ENVCMD="env HDF5_PLUGIN_PATH=$LD_LIBRARY_PATH/plugin" + +TESTDIR=$builddir + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ;; + *c*,* ) ECHO_N=-n ECHO_C= ;; + *) ECHO_N= ECHO_C='\c' ;; +esac +ECHO_N="echo $ECHO_N" + + +exout() { + $* +} + +dumpout() { + $H5DUMP $* +} + +# compare current version, required version. +# returns if cur_ver < req_ver is true. +version_compare() { + version_lt=0 + if [ ! "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$2" ]; then + version_lt=1 + fi +} + + +topics="h5ex_lite3 h5ex_packet_table_FL \ + h5ex_image1 h5ex_image2 \ + h5ex_table_01 h5ex_table_02 h5ex_table_03 h5ex_table_04 \ + h5ex_table_05 h5ex_table_06 h5ex_table_07 h5ex_table_08 \ + h5ex_table_09 h5ex_table_10 h5ex_table_11 h5ex_table_12 \ + h5ex_ds1" + +return_val=0 + +for topic in $topics +do + $H5CC $srcdir/$topic.c -o $topic +done + +for topic in $topics +do + fname=$topic + $ECHO_N "Testing C/HL/$fname...$ECHO_C" + exout ./$fname >tmp.test + cmp -s tmp.test $srcdir/tfiles/$fname.tst + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + dumpout $fname.h5 >tmp.test + rm -f $fname.h5 + cmp -s tmp.test $srcdir/tfiles/$fname.ddl + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + echo " Passed" + fi + fi + return_val=`expr $status + $return_val` +done + + +$H5CC $srcdir/h5ex_lite1.c -o h5ex_lite1 +$H5CC $srcdir/h5ex_lite2.c -o h5ex_lite2 + +$ECHO_N "Testing C/HL/h5ex_lite1...$ECHO_C" +exout ./h5ex_lite1 >tmp.test +cmp -s tmp.test $srcdir/tfiles/h5ex_lite1.tst +status=$? +if test $status -ne 0 +then + echo " FAILED!" +else + $ECHO_N "Testing C/HL/h5ex_lite2...$ECHO_C" + exout ./h5ex_lite2 >tmp.test + cmp -s tmp.test $srcdir/tfiles/h5ex_lite2.tst + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + echo " Passed" + fi +fi +return_val=`expr $status + $return_val` + + +rm -f tmp.test +echo "$return_val tests failed in C/HL/" +exit $return_val diff --git a/HDF5Examples/C/HL/test.sh.in b/HDF5Examples/C/HL/test.sh.in new file mode 100755 index 00000000000..67d11fdd5e8 --- /dev/null +++ b/HDF5Examples/C/HL/test.sh.in @@ -0,0 +1,111 @@ +#! /bin/sh +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the LICENSE file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. + +srcdir=@srcdir@ + + +case $CC in +*/*) H5DUMP=`echo $CC | sed -e 's/\/[^/]*$/\/h5dump/'`; + test -x $H5DUMP || H5DUMP=h5dump;; +*) H5DUMP=h5dump;; +esac + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ;; + *c*,* ) ECHO_N=-n ECHO_C= ;; + *) ECHO_N= ECHO_C='\c' ;; +esac +ECHO_N="echo $ECHO_N" + + +exout() { + $* +} + +dumpout() { + $H5DUMP $* +} + +# compare current version, required version. +# returns if cur_ver < req_ver is true. +version_compare() { + version_lt=0 + if [ ! "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$2" ]; then + version_lt=1 + fi +} + +H5_LIBVER=@H5_LIBVER@ +H5_LIBVER_DIR=@H5_LIBVER_DIR@ + +topics="h5ex_lite3 h5ex_packet_table_FL \ + h5ex_image1 h5ex_image2 \ + h5ex_table_01 h5ex_table_02 h5ex_table_03 h5ex_table_04 \ + h5ex_table_05 h5ex_table_06 h5ex_table_07 h5ex_table_08 \ + h5ex_table_09 h5ex_table_10 h5ex_table_11 h5ex_table_12 \ + h5ex_ds1" + +return_val=0 + +for topic in $topics +do + fname=$topic + $ECHO_N "Testing C/H5T/$fname...$ECHO_C" + exout ./$fname >tmp.test + cmp -s tmp.test $srcdir/tfiles/16/$fname.tst + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + dumpout $targ $fname.h5 >tmp.test + rm -f $fname.h5 + cmp -s tmp.test $srcdir/tfiles/18/$fname.ddl + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + echo " Passed" + fi + fi + return_val=`expr $status + $return_val` +done + + +$ECHO_N "Testing C/HL/h5ex_lite1...$ECHO_C" +exout ./h5ex_lite1 >tmp.test +cmp -s tmp.test $srcdir/tfiles/h5ex_lite1.tst +status=$? +if test $status -ne 0 +then + echo " FAILED!" +else + $ECHO_N "Testing C/HL/h5ex_lite2...$ECHO_C" + exout ./h5ex_lite2 >tmp.test + cmp -s tmp.test $srcdir/tfiles/h5ex_lite2.tst + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + echo " Passed" + fi +fi +return_val=`expr $status + $return_val` + + +rm -f tmp.test +echo "$return_val tests failed in C/H5T/" +exit $return_val diff --git a/HDF5Examples/C/HL/tfiles/h5ex_ds1.ddl b/HDF5Examples/C/HL/tfiles/h5ex_ds1.ddl new file mode 100644 index 00000000000..31f3e570642 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_ds1.ddl @@ -0,0 +1,84 @@ +HDF5 "h5ex_ds1.h5" { +GROUP "/" { + DATASET "Mydata" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 3, 4 ) / ( 3, 4 ) } + DATA { + (0,0): 1, 2, 3, 4, + (1,0): 5, 6, 7, 8, + (2,0): 9, 10, 11, 12 + } + ATTRIBUTE "DIMENSION_LIST" { + DATATYPE H5T_VLEN { H5T_REFERENCE { H5T_STD_REF_OBJECT } } + DATASPACE SIMPLE { ( 2 ) / ( 2 ) } + DATA { + (0): (DATASET 228467808 "/Yaxis"), (DATASET 228463248 "/Xaxis") + } + } + } + DATASET "Xaxis" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 4 ) / ( 4 ) } + DATA { + (0): 10, 20, 50, 100 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "DIMENSION_SCALE" + } + } + ATTRIBUTE "REFERENCE_LIST" { + DATATYPE H5T_COMPOUND { + H5T_REFERENCE { H5T_STD_REF_OBJECT } "dataset"; + H5T_STD_U32LE "dimension"; + } + DATASPACE SIMPLE { ( 1 ) / ( 1 ) } + DATA { + (0): { + DATASET 228478416 "/Mydata", + 1 + } + } + } + } + DATASET "Yaxis" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SIMPLE { ( 3 ) / ( 3 ) } + DATA { + (0): 10, 20, 30 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "DIMENSION_SCALE" + } + } + ATTRIBUTE "REFERENCE_LIST" { + DATATYPE H5T_COMPOUND { + H5T_REFERENCE { H5T_STD_REF_OBJECT } "dataset"; + H5T_STD_U32LE "dimension"; + } + DATASPACE SIMPLE { ( 1 ) / ( 1 ) } + DATA { + (0): { + DATASET 228464864 "/Mydata", + 0 + } + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_ds1.tst b/HDF5Examples/C/HL/tfiles/h5ex_ds1.tst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/HDF5Examples/C/HL/tfiles/h5ex_image1.ddl b/HDF5Examples/C/HL/tfiles/h5ex_image1.ddl new file mode 100644 index 00000000000..b02137791bc --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_image1.ddl @@ -0,0 +1,4103 @@ +HDF5 "h5ex_image1.h5" { +GROUP "/" { + DATASET "image1" { + DATATYPE H5T_STD_U8LE + DATASPACE SIMPLE { ( 200, 400 ) / ( 200, 400 ) } + DATA { + (0,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (0,399): 0, + (1,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (1,399): 0, + (2,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (2,399): 0, + (3,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (3,399): 0, + (4,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (4,399): 0, + (5,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (5,399): 0, + (6,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (6,399): 0, + (7,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (7,399): 0, + (8,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (8,399): 0, + (9,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,126): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,147): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,168): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,189): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,210): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,231): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,252): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,273): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,294): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,315): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,336): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,357): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,378): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (9,399): 0, + (10,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (10,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (11,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (12,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (13,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (14,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (15,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (16,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (17,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (18,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (19,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (20,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,84): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,105): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,125): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,145): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,165): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,185): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,205): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,225): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,245): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,265): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,285): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,305): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,325): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,345): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,365): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (21,385): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (22,0): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (22,21): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (22,42): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (22,63): 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + (22,84): 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,305): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,325): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,345): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,365): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,385): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + (44,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (44,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (45,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (46,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (47,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (48,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (49,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (50,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (51,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (52,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (53,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (54,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (55,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (56,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (57,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (58,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (59,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (60,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (61,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (62,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (63,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (64,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,265): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,285): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,305): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,325): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,345): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,365): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (65,385): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,0): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,21): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,42): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,63): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,84): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,105): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,125): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,145): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,165): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,185): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,205): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,225): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,245): 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + (66,265): 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (66,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (66,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (66,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (66,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (66,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (66,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (67,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (68,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (69,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (70,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (71,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (72,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (73,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (74,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (75,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (76,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (77,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (78,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (79,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (80,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (81,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (82,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (83,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (84,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (85,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (86,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,365): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (87,385): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,0): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,21): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,42): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,63): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,84): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,105): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,125): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,145): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,165): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,185): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,205): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,225): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,245): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,265): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,285): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,305): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,325): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + (88,345): 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, + (88,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (88,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (89,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (90,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (91,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (92,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (93,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (94,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (95,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (96,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (97,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (98,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,42): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,63): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,84): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,105): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,125): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,145): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,165): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,185): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,205): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,225): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,245): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,265): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,285): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,305): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,325): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,345): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,365): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (99,385): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (100,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (101,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (102,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (103,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (104,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (105,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (106,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (107,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (108,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (109,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,41): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,61): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,81): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,101): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,121): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,141): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,161): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,181): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,201): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,221): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,241): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,261): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,281): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,301): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,321): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,341): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,361): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (110,381): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (111,0): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (111,21): 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, + (111,41): 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (111,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (112,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (113,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (114,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (115,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (116,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (117,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (118,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (119,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (120,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (121,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (122,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (123,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (124,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (125,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (126,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (127,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (128,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (129,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (130,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (131,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,141): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,161): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,181): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,201): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,221): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,241): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,261): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,281): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,301): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,321): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,341): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,361): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (132,381): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (133,0): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (133,21): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (133,41): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (133,61): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (133,81): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (133,101): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + (133,121): 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, + (133,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (133,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (134,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (135,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (136,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (137,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (138,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (139,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (140,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (141,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (142,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (143,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (144,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (145,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (146,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (147,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (148,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (149,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (150,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (151,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (152,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (153,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,221): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,241): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,261): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,281): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,301): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,321): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,341): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,361): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (154,381): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,0): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,21): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,41): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,61): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,81): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,101): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,121): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,141): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,161): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,181): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,201): 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + (155,221): 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (155,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (156,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (157,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (158,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (159,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (160,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (161,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (162,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (163,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (164,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (165,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (166,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (167,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (168,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (169,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (170,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (171,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (172,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (173,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (174,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (175,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,321): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,341): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,361): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (176,381): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,0): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,21): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,41): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,61): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,81): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,101): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,121): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,141): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,161): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,181): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,201): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,221): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,241): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,261): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,281): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + (177,301): 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, + (177,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (177,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (177,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (177,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (178,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (179,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (180,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (181,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (182,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (183,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (184,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (185,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (186,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (187,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (188,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (189,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (190,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (191,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (192,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (193,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (194,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (195,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (196,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (197,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (198,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,0): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,21): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,41): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,61): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,81): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,101): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,121): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,141): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,161): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,181): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,201): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,221): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,241): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,261): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,281): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,301): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,321): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,341): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,361): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, + (199,381): 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "IMAGE" + } + } + ATTRIBUTE "IMAGE_SUBCLASS" { + DATATYPE H5T_STRING { + STRSIZE 14; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "IMAGE_INDEXED" + } + } + ATTRIBUTE "IMAGE_VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "1.2" + } + } + ATTRIBUTE "PALETTE" { + DATATYPE H5T_REFERENCE { H5T_STD_REF_OBJECT } + DATASPACE SCALAR + DATA { + DATASET "h5ex_image1.h5/palette" + DATA { + (0,0): 0, 0, 168, + (1,0): 0, 0, 252, + (2,0): 0, 168, 252, + (3,0): 84, 252, 252, + (4,0): 168, 252, 168, + (5,0): 0, 252, 168, + (6,0): 252, 252, 84, + (7,0): 252, 168, 0, + (8,0): 252, 0, 0 + } + } + } + } + DATASET "palette" { + DATATYPE H5T_STD_U8LE + DATASPACE SIMPLE { ( 9, 3 ) / ( 9, 3 ) } + DATA { + (0,0): 0, 0, 168, + (1,0): 0, 0, 252, + (2,0): 0, 168, 252, + (3,0): 84, 252, 252, + (4,0): 168, 252, 168, + (5,0): 0, 252, 168, + (6,0): 252, 252, 84, + (7,0): 252, 168, 0, + (8,0): 252, 0, 0 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 8; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "PALETTE" + } + } + ATTRIBUTE "PAL_VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "1.2" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_image1.tst b/HDF5Examples/C/HL/tfiles/h5ex_image1.tst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/HDF5Examples/C/HL/tfiles/h5ex_image2.ddl b/HDF5Examples/C/HL/tfiles/h5ex_image2.ddl new file mode 100644 index 00000000000..6b0483e7172 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_image2.ddl @@ -0,0 +1,41686 @@ +HDF5 "h5ex_image2.h5" { +GROUP "/" { + DATASET "image24bitpixel" { + DATATYPE H5T_STD_U8LE + DATASPACE SIMPLE { ( 149, 227, 3 ) / ( 149, 227, 3 ) } + DATA { + (0,0,0): 48, 47, 45, + (0,1,0): 48, 47, 45, + (0,2,0): 49, 48, 46, + (0,3,0): 50, 49, 47, + (0,4,0): 53, 49, 46, + (0,5,0): 53, 49, 46, + (0,6,0): 54, 50, 47, + (0,7,0): 54, 50, 47, + (0,8,0): 56, 51, 47, + (0,9,0): 56, 51, 47, + (0,10,0): 58, 51, 45, + (0,11,0): 58, 51, 45, + (0,12,0): 58, 51, 45, + (0,13,0): 58, 51, 45, + (0,14,0): 58, 51, 45, + (0,15,0): 58, 51, 45, + (0,16,0): 58, 50, 47, + (0,17,0): 57, 49, 46, + (0,18,0): 57, 49, 46, + (0,19,0): 56, 48, 45, + (0,20,0): 56, 48, 45, + (0,21,0): 57, 49, 46, + (0,22,0): 57, 49, 46, + (0,23,0): 58, 50, 47, + (0,24,0): 56, 48, 45, + (0,25,0): 56, 48, 45, + (0,26,0): 56, 48, 45, + (0,27,0): 56, 48, 45, + (0,28,0): 56, 48, 45, + (0,29,0): 56, 48, 45, + (0,30,0): 56, 48, 45, + (0,31,0): 56, 48, 45, + (0,32,0): 54, 46, 43, + (0,33,0): 54, 46, 43, + (0,34,0): 54, 46, 43, + (0,35,0): 53, 45, 42, + (0,36,0): 53, 45, 42, + (0,37,0): 52, 44, 41, + (0,38,0): 52, 44, 41, + (0,39,0): 52, 44, 41, + (0,40,0): 52, 44, 41, + (0,41,0): 52, 44, 41, + (0,42,0): 52, 44, 41, + (0,43,0): 52, 44, 41, + (0,44,0): 52, 44, 41, + (0,45,0): 52, 44, 41, + (0,46,0): 52, 44, 41, + (0,47,0): 50, 45, 41, + (0,48,0): 47, 42, 36, + (0,49,0): 47, 44, 37, + (0,50,0): 47, 44, 37, + (0,51,0): 48, 45, 38, + (0,52,0): 49, 46, 39, + (0,53,0): 50, 47, 40, + (0,54,0): 51, 48, 41, + (0,55,0): 51, 48, 41, + (0,56,0): 54, 51, 44, + (0,57,0): 54, 51, 44, + (0,58,0): 55, 52, 45, + (0,59,0): 56, 53, 46, + (0,60,0): 56, 53, 46, + (0,61,0): 57, 54, 47, + (0,62,0): 58, 55, 48, + (0,63,0): 58, 55, 46, + (0,64,0): 65, 58, 48, + (0,65,0): 66, 60, 48, + (0,66,0): 68, 62, 50, + (0,67,0): 70, 64, 52, + (0,68,0): 73, 65, 52, + (0,69,0): 74, 66, 53, + (0,70,0): 75, 67, 54, + (0,71,0): 75, 67, 54, + (0,72,0): 77, 68, 53, + (0,73,0): 77, 68, 53, + (0,74,0): 79, 67, 51, + (0,75,0): 78, 66, 50, + (0,76,0): 79, 67, 51, + (0,77,0): 79, 67, 51, + (0,78,0): 80, 68, 52, + (0,79,0): 82, 69, 53, + (0,80,0): 82, 63, 49, + (0,81,0): 89, 63, 50, + (0,82,0): 98, 64, 52, + (0,83,0): 110, 66, 53, + (0,84,0): 125, 69, 54, + (0,85,0): 139, 72, 56, + (0,86,0): 153, 71, 57, + (0,87,0): 163, 70, 55, + (0,88,0): 175, 71, 58, + (0,89,0): 184, 71, 57, + (0,90,0): 190, 69, 58, + (0,91,0): 197, 71, 59, + (0,92,0): 199, 71, 62, + (0,93,0): 202, 71, 63, + (0,94,0): 203, 72, 64, + (0,95,0): 208, 69, 64, + (0,96,0): 231, 70, 76, + (0,97,0): 237, 67, 76, + (0,98,0): 235, 68, 75, + (0,99,0): 235, 69, 73, + (0,100,0): 238, 67, 73, + (0,101,0): 239, 66, 68, + (0,102,0): 241, 62, 66, + (0,103,0): 244, 61, 65, + (0,104,0): 248, 59, 65, + (0,105,0): 247, 58, 64, + (0,106,0): 244, 58, 63, + (0,107,0): 240, 60, 63, + (0,108,0): 233, 63, 64, + (0,109,0): 226, 64, 62, + (0,110,0): 215, 63, 60, + (0,111,0): 203, 65, 55, + (0,112,0): 187, 61, 47, + (0,113,0): 181, 64, 46, + (0,114,0): 181, 64, 46, + (0,115,0): 180, 63, 45, + (0,116,0): 180, 63, 45, + (0,117,0): 179, 64, 45, + (0,118,0): 178, 63, 45, + (0,119,0): 175, 64, 45, + (0,120,0): 173, 64, 44, + (0,121,0): 170, 65, 44, + (0,122,0): 166, 65, 45, + (0,123,0): 162, 66, 44, + (0,124,0): 159, 64, 42, + (0,125,0): 155, 65, 41, + (0,126,0): 152, 64, 42, + (0,127,0): 150, 65, 44, + (0,128,0): 148, 62, 45, + (0,129,0): 146, 63, 47, + (0,130,0): 146, 63, 47, + (0,131,0): 145, 62, 46, + (0,132,0): 145, 62, 44, + (0,133,0): 144, 61, 43, + (0,134,0): 146, 60, 43, + (0,135,0): 146, 60, 43, + (0,136,0): 148, 63, 43, + (0,137,0): 148, 63, 43, + (0,138,0): 148, 61, 42, + (0,139,0): 148, 61, 42, + (0,140,0): 148, 61, 42, + (0,141,0): 149, 62, 43, + (0,142,0): 150, 63, 44, + (0,143,0): 150, 64, 47, + (0,144,0): 150, 63, 54, + (0,145,0): 149, 62, 53, + (0,146,0): 151, 61, 50, + (0,147,0): 159, 63, 49, + (0,148,0): 169, 66, 51, + (0,149,0): 179, 68, 51, + (0,150,0): 188, 68, 52, + (0,151,0): 191, 68, 52, + (0,152,0): 185, 63, 48, + (0,153,0): 181, 65, 50, + (0,154,0): 172, 70, 56, + (0,155,0): 158, 72, 59, + (0,156,0): 135, 72, 57, + (0,157,0): 111, 65, 50, + (0,158,0): 84, 56, 42, + (0,159,0): 67, 51, 38, + (0,160,0): 61, 53, 50, + (0,161,0): 57, 53, 52, + (0,162,0): 57, 53, 52, + (0,163,0): 55, 51, 50, + (0,164,0): 55, 49, 49, + (0,165,0): 54, 48, 48, + (0,166,0): 53, 48, 45, + (0,167,0): 53, 48, 45, + (0,168,0): 55, 50, 47, + (0,169,0): 55, 50, 47, + (0,170,0): 55, 50, 47, + (0,171,0): 54, 49, 46, + (0,172,0): 54, 49, 45, + (0,173,0): 53, 48, 44, + (0,174,0): 53, 48, 44, + (0,175,0): 52, 49, 44, + (0,176,0): 47, 47, 45, + (0,177,0): 46, 48, 45, + (0,178,0): 47, 47, 45, + (0,179,0): 47, 47, 45, + (0,180,0): 48, 47, 45, + (0,181,0): 48, 47, 45, + (0,182,0): 50, 46, 45, + (0,183,0): 50, 46, 45, + (0,184,0): 53, 44, 45, + (0,185,0): 52, 43, 44, + (0,186,0): 52, 42, 43, + (0,187,0): 51, 41, 42, + (0,188,0): 55, 40, 43, + (0,189,0): 61, 46, 49, + (0,190,0): 69, 54, 57, + (0,191,0): 80, 58, 60, + (0,192,0): 106, 66, 67, + (0,193,0): 124, 73, 72, + (0,194,0): 141, 77, 77, + (0,195,0): 149, 79, 79, + (0,196,0): 159, 87, 91, + (0,197,0): 170, 100, 110, + (0,198,0): 170, 111, 131, + (0,199,0): 159, 116, 144, + (0,200,0): 148, 123, 163, + (0,201,0): 135, 127, 174, + (0,202,0): 128, 134, 186, + (0,203,0): 126, 136, 189, + (0,204,0): 115, 121, 173, + (0,205,0): 96, 97, 145, + (0,206,0): 84, 75, 118, + (0,207,0): 80, 68, 104, + (0,208,0): 83, 74, 103, + (0,209,0): 79, 71, 94, + (0,210,0): 77, 72, 94, + (0,211,0): 84, 81, 98, + (0,212,0): 102, 100, 111, + (0,213,0): 124, 125, 130, + (0,214,0): 141, 145, 144, + (0,215,0): 153, 158, 152, + (0,216,0): 163, 169, 159, + (0,217,0): 162, 168, 154, + (0,218,0): 158, 160, 147, + (0,219,0): 143, 146, 129, + (0,220,0): 123, 124, 108, + (0,221,0): 102, 103, 85, + (0,222,0): 88, 87, 69, + (0,223,0): 81, 78, 69, + (0,224,0): 85, 82, 91, + (0,225,0): 85, 81, 98, + (0,226,0): 85, 81, 98, + (1,0,0): 48, 47, 45, + (1,1,0): 48, 47, 45, + (1,2,0): 49, 48, 46, + (1,3,0): 49, 48, 46, + (1,4,0): 52, 48, 45, + (1,5,0): 53, 49, 46, + (1,6,0): 54, 50, 47, + (1,7,0): 54, 50, 47, + (1,8,0): 56, 51, 47, + (1,9,0): 56, 51, 47, + (1,10,0): 58, 51, 45, + (1,11,0): 58, 51, 45, + (1,12,0): 58, 51, 45, + (1,13,0): 58, 51, 45, + (1,14,0): 58, 51, 45, + (1,15,0): 58, 51, 45, + (1,16,0): 57, 49, 46, + (1,17,0): 57, 49, 46, + (1,18,0): 56, 48, 45, + (1,19,0): 56, 48, 45, + (1,20,0): 56, 48, 45, + (1,21,0): 56, 48, 45, + (1,22,0): 57, 49, 46, + (1,23,0): 57, 49, 46, + (1,24,0): 56, 48, 45, + (1,25,0): 56, 48, 45, + (1,26,0): 56, 48, 45, + (1,27,0): 56, 48, 45, + (1,28,0): 56, 48, 45, + (1,29,0): 56, 48, 45, + (1,30,0): 56, 48, 45, + (1,31,0): 56, 48, 45, + (1,32,0): 54, 46, 43, + (1,33,0): 54, 46, 43, + (1,34,0): 53, 45, 42, + (1,35,0): 53, 45, 42, + (1,36,0): 53, 45, 42, + (1,37,0): 52, 44, 41, + (1,38,0): 52, 44, 41, + (1,39,0): 52, 44, 41, + (1,40,0): 53, 45, 42, + (1,41,0): 53, 45, 42, + (1,42,0): 53, 45, 42, + (1,43,0): 53, 45, 42, + (1,44,0): 53, 45, 42, + (1,45,0): 53, 45, 42, + (1,46,0): 53, 45, 42, + (1,47,0): 51, 46, 42, + (1,48,0): 48, 43, 37, + (1,49,0): 48, 45, 38, + (1,50,0): 48, 45, 38, + (1,51,0): 49, 46, 39, + (1,52,0): 50, 47, 40, + (1,53,0): 51, 48, 41, + (1,54,0): 52, 49, 42, + (1,55,0): 52, 49, 42, + (1,56,0): 54, 51, 44, + (1,57,0): 54, 51, 44, + (1,58,0): 55, 52, 45, + (1,59,0): 55, 52, 45, + (1,60,0): 56, 53, 46, + (1,61,0): 57, 54, 47, + (1,62,0): 58, 55, 48, + (1,63,0): 58, 55, 46, + (1,64,0): 64, 57, 47, + (1,65,0): 65, 59, 47, + (1,66,0): 67, 61, 49, + (1,67,0): 69, 63, 51, + (1,68,0): 72, 64, 51, + (1,69,0): 73, 65, 52, + (1,70,0): 74, 66, 53, + (1,71,0): 74, 66, 53, + (1,72,0): 76, 67, 52, + (1,73,0): 76, 67, 52, + (1,74,0): 77, 65, 49, + (1,75,0): 77, 65, 49, + (1,76,0): 77, 65, 49, + (1,77,0): 78, 66, 50, + (1,78,0): 79, 67, 51, + (1,79,0): 81, 68, 52, + (1,80,0): 80, 62, 48, + (1,81,0): 85, 63, 49, + (1,82,0): 94, 65, 51, + (1,83,0): 106, 67, 52, + (1,84,0): 120, 68, 54, + (1,85,0): 132, 69, 52, + (1,86,0): 146, 69, 53, + (1,87,0): 156, 67, 51, + (1,88,0): 167, 67, 52, + (1,89,0): 175, 65, 52, + (1,90,0): 181, 65, 52, + (1,91,0): 188, 66, 55, + (1,92,0): 192, 68, 58, + (1,93,0): 196, 69, 60, + (1,94,0): 197, 70, 61, + (1,95,0): 205, 67, 64, + (1,96,0): 225, 69, 73, + (1,97,0): 231, 66, 73, + (1,98,0): 232, 67, 73, + (1,99,0): 234, 68, 72, + (1,100,0): 237, 68, 71, + (1,101,0): 239, 66, 68, + (1,102,0): 243, 64, 67, + (1,103,0): 246, 63, 67, + (1,104,0): 248, 59, 65, + (1,105,0): 247, 58, 64, + (1,106,0): 244, 58, 63, + (1,107,0): 240, 60, 63, + (1,108,0): 233, 63, 64, + (1,109,0): 224, 65, 62, + (1,110,0): 213, 64, 60, + (1,111,0): 202, 64, 54, + (1,112,0): 185, 62, 47, + (1,113,0): 181, 64, 46, + (1,114,0): 180, 63, 45, + (1,115,0): 180, 63, 45, + (1,116,0): 180, 63, 45, + (1,117,0): 178, 63, 44, + (1,118,0): 176, 63, 45, + (1,119,0): 175, 64, 45, + (1,120,0): 173, 64, 44, + (1,121,0): 169, 64, 43, + (1,122,0): 166, 65, 45, + (1,123,0): 161, 65, 43, + (1,124,0): 159, 64, 42, + (1,125,0): 155, 65, 41, + (1,126,0): 152, 64, 42, + (1,127,0): 150, 65, 44, + (1,128,0): 148, 62, 45, + (1,129,0): 146, 63, 47, + (1,130,0): 145, 62, 46, + (1,131,0): 145, 62, 46, + (1,132,0): 145, 62, 44, + (1,133,0): 144, 61, 43, + (1,134,0): 146, 60, 43, + (1,135,0): 146, 60, 43, + (1,136,0): 148, 63, 43, + (1,137,0): 147, 62, 42, + (1,138,0): 148, 61, 42, + (1,139,0): 148, 61, 42, + (1,140,0): 148, 61, 42, + (1,141,0): 149, 62, 43, + (1,142,0): 150, 63, 44, + (1,143,0): 150, 64, 47, + (1,144,0): 148, 64, 53, + (1,145,0): 149, 62, 53, + (1,146,0): 152, 62, 51, + (1,147,0): 160, 62, 49, + (1,148,0): 171, 65, 51, + (1,149,0): 181, 68, 52, + (1,150,0): 189, 67, 52, + (1,151,0): 191, 68, 53, + (1,152,0): 187, 65, 50, + (1,153,0): 183, 67, 54, + (1,154,0): 172, 70, 56, + (1,155,0): 156, 73, 59, + (1,156,0): 133, 71, 58, + (1,157,0): 108, 64, 51, + (1,158,0): 83, 57, 42, + (1,159,0): 66, 52, 41, + (1,160,0): 62, 54, 51, + (1,161,0): 58, 54, 53, + (1,162,0): 57, 53, 52, + (1,163,0): 56, 52, 51, + (1,164,0): 56, 50, 50, + (1,165,0): 55, 49, 49, + (1,166,0): 54, 49, 46, + (1,167,0): 54, 49, 46, + (1,168,0): 55, 50, 47, + (1,169,0): 55, 50, 47, + (1,170,0): 55, 50, 47, + (1,171,0): 54, 49, 46, + (1,172,0): 54, 49, 45, + (1,173,0): 53, 48, 44, + (1,174,0): 53, 48, 44, + (1,175,0): 52, 49, 44, + (1,176,0): 47, 47, 45, + (1,177,0): 46, 48, 45, + (1,178,0): 47, 47, 45, + (1,179,0): 47, 47, 45, + (1,180,0): 48, 47, 45, + (1,181,0): 48, 47, 45, + (1,182,0): 50, 46, 45, + (1,183,0): 50, 46, 45, + (1,184,0): 51, 45, 45, + (1,185,0): 53, 44, 45, + (1,186,0): 52, 42, 43, + (1,187,0): 51, 41, 42, + (1,188,0): 53, 41, 43, + (1,189,0): 60, 45, 48, + (1,190,0): 67, 52, 55, + (1,191,0): 78, 56, 58, + (1,192,0): 100, 62, 61, + (1,193,0): 118, 69, 65, + (1,194,0): 134, 74, 73, + (1,195,0): 143, 78, 76, + (1,196,0): 154, 84, 86, + (1,197,0): 164, 97, 106, + (1,198,0): 165, 108, 125, + (1,199,0): 157, 114, 142, + (1,200,0): 145, 123, 162, + (1,201,0): 134, 128, 174, + (1,202,0): 127, 133, 185, + (1,203,0): 123, 132, 187, + (1,204,0): 111, 117, 169, + (1,205,0): 91, 91, 141, + (1,206,0): 81, 72, 117, + (1,207,0): 79, 67, 105, + (1,208,0): 79, 70, 101, + (1,209,0): 79, 71, 95, + (1,210,0): 80, 72, 95, + (1,211,0): 82, 78, 95, + (1,212,0): 91, 89, 102, + (1,213,0): 110, 111, 116, + (1,214,0): 131, 135, 136, + (1,215,0): 148, 153, 149, + (1,216,0): 153, 158, 151, + (1,217,0): 154, 160, 148, + (1,218,0): 153, 157, 143, + (1,219,0): 143, 145, 131, + (1,220,0): 126, 127, 111, + (1,221,0): 106, 107, 89, + (1,222,0): 93, 91, 76, + (1,223,0): 86, 83, 74, + (1,224,0): 88, 83, 90, + (1,225,0): 86, 82, 97, + (1,226,0): 88, 81, 97, + (2,0,0): 47, 46, 44, + (2,1,0): 47, 46, 44, + (2,2,0): 48, 47, 45, + (2,3,0): 49, 48, 46, + (2,4,0): 52, 48, 45, + (2,5,0): 52, 48, 45, + (2,6,0): 53, 49, 46, + (2,7,0): 53, 49, 46, + (2,8,0): 55, 50, 46, + (2,9,0): 55, 50, 46, + (2,10,0): 55, 50, 46, + (2,11,0): 55, 50, 46, + (2,12,0): 57, 50, 44, + (2,13,0): 57, 50, 44, + (2,14,0): 57, 50, 44, + (2,15,0): 57, 50, 44, + (2,16,0): 57, 49, 46, + (2,17,0): 56, 48, 46, + (2,18,0): 55, 47, 45, + (2,19,0): 55, 47, 45, + (2,20,0): 55, 47, 45, + (2,21,0): 55, 47, 45, + (2,22,0): 56, 48, 46, + (2,23,0): 57, 49, 47, + (2,24,0): 56, 48, 46, + (2,25,0): 56, 48, 46, + (2,26,0): 56, 48, 46, + (2,27,0): 56, 48, 46, + (2,28,0): 56, 48, 46, + (2,29,0): 56, 48, 46, + (2,30,0): 56, 48, 46, + (2,31,0): 56, 48, 46, + (2,32,0): 54, 46, 44, + (2,33,0): 53, 45, 43, + (2,34,0): 53, 45, 43, + (2,35,0): 53, 45, 43, + (2,36,0): 52, 44, 42, + (2,37,0): 52, 44, 42, + (2,38,0): 52, 44, 42, + (2,39,0): 52, 44, 42, + (2,40,0): 53, 45, 43, + (2,41,0): 53, 45, 43, + (2,42,0): 53, 45, 43, + (2,43,0): 53, 45, 43, + (2,44,0): 53, 45, 43, + (2,45,0): 53, 45, 43, + (2,46,0): 53, 45, 43, + (2,47,0): 51, 46, 42, + (2,48,0): 50, 45, 39, + (2,49,0): 49, 46, 39, + (2,50,0): 50, 47, 40, + (2,51,0): 51, 48, 41, + (2,52,0): 51, 48, 41, + (2,53,0): 52, 49, 42, + (2,54,0): 52, 49, 42, + (2,55,0): 53, 50, 43, + (2,56,0): 54, 51, 44, + (2,57,0): 54, 51, 44, + (2,58,0): 54, 51, 44, + (2,59,0): 55, 52, 45, + (2,60,0): 56, 53, 46, + (2,61,0): 57, 54, 47, + (2,62,0): 57, 54, 47, + (2,63,0): 58, 55, 46, + (2,64,0): 63, 56, 46, + (2,65,0): 64, 58, 46, + (2,66,0): 66, 60, 48, + (2,67,0): 68, 62, 50, + (2,68,0): 71, 63, 52, + (2,69,0): 72, 64, 53, + (2,70,0): 72, 64, 51, + (2,71,0): 72, 64, 51, + (2,72,0): 73, 64, 49, + (2,73,0): 73, 64, 49, + (2,74,0): 75, 63, 49, + (2,75,0): 75, 63, 49, + (2,76,0): 75, 63, 47, + (2,77,0): 76, 64, 48, + (2,78,0): 77, 65, 49, + (2,79,0): 78, 66, 50, + (2,80,0): 77, 65, 49, + (2,81,0): 81, 65, 49, + (2,82,0): 89, 66, 50, + (2,83,0): 100, 67, 50, + (2,84,0): 113, 67, 51, + (2,85,0): 124, 67, 50, + (2,86,0): 135, 66, 50, + (2,87,0): 146, 65, 48, + (2,88,0): 152, 60, 45, + (2,89,0): 160, 58, 43, + (2,90,0): 167, 59, 46, + (2,91,0): 175, 61, 50, + (2,92,0): 181, 64, 54, + (2,93,0): 186, 68, 58, + (2,94,0): 191, 70, 61, + (2,95,0): 197, 68, 62, + (2,96,0): 217, 67, 69, + (2,97,0): 225, 64, 70, + (2,98,0): 227, 66, 71, + (2,99,0): 231, 66, 70, + (2,100,0): 234, 68, 70, + (2,101,0): 240, 67, 69, + (2,102,0): 244, 65, 68, + (2,103,0): 248, 63, 68, + (2,104,0): 250, 59, 64, + (2,105,0): 249, 58, 63, + (2,106,0): 245, 59, 64, + (2,107,0): 240, 61, 64, + (2,108,0): 232, 64, 64, + (2,109,0): 220, 65, 61, + (2,110,0): 209, 64, 59, + (2,111,0): 198, 64, 53, + (2,112,0): 183, 61, 46, + (2,113,0): 179, 64, 45, + (2,114,0): 179, 64, 45, + (2,115,0): 178, 63, 44, + (2,116,0): 178, 63, 45, + (2,117,0): 176, 63, 45, + (2,118,0): 175, 62, 44, + (2,119,0): 173, 64, 44, + (2,120,0): 170, 63, 45, + (2,121,0): 167, 64, 45, + (2,122,0): 165, 64, 44, + (2,123,0): 161, 65, 43, + (2,124,0): 157, 65, 44, + (2,125,0): 154, 63, 42, + (2,126,0): 152, 64, 42, + (2,127,0): 149, 64, 43, + (2,128,0): 148, 62, 45, + (2,129,0): 145, 62, 46, + (2,130,0): 145, 62, 46, + (2,131,0): 145, 62, 46, + (2,132,0): 144, 61, 43, + (2,133,0): 144, 61, 43, + (2,134,0): 144, 61, 43, + (2,135,0): 144, 61, 43, + (2,136,0): 145, 62, 44, + (2,137,0): 145, 62, 44, + (2,138,0): 146, 60, 43, + (2,139,0): 146, 60, 43, + (2,140,0): 147, 61, 44, + (2,141,0): 147, 61, 44, + (2,142,0): 148, 63, 43, + (2,143,0): 149, 63, 46, + (2,144,0): 149, 65, 54, + (2,145,0): 150, 63, 53, + (2,146,0): 154, 62, 51, + (2,147,0): 163, 62, 50, + (2,148,0): 175, 65, 52, + (2,149,0): 185, 67, 53, + (2,150,0): 191, 68, 53, + (2,151,0): 193, 67, 53, + (2,152,0): 192, 68, 56, + (2,153,0): 184, 70, 59, + (2,154,0): 174, 73, 61, + (2,155,0): 153, 74, 61, + (2,156,0): 129, 71, 59, + (2,157,0): 104, 64, 52, + (2,158,0): 81, 58, 44, + (2,159,0): 66, 53, 44, + (2,160,0): 63, 55, 52, + (2,161,0): 61, 55, 55, + (2,162,0): 60, 54, 54, + (2,163,0): 58, 52, 52, + (2,164,0): 57, 52, 49, + (2,165,0): 56, 51, 48, + (2,166,0): 55, 50, 47, + (2,167,0): 55, 50, 47, + (2,168,0): 54, 50, 47, + (2,169,0): 54, 50, 47, + (2,170,0): 54, 50, 47, + (2,171,0): 53, 49, 46, + (2,172,0): 53, 50, 45, + (2,173,0): 52, 49, 44, + (2,174,0): 52, 49, 44, + (2,175,0): 50, 49, 44, + (2,176,0): 46, 48, 45, + (2,177,0): 44, 49, 45, + (2,178,0): 46, 48, 45, + (2,179,0): 46, 48, 45, + (2,180,0): 47, 47, 45, + (2,181,0): 47, 47, 45, + (2,182,0): 48, 47, 45, + (2,183,0): 50, 46, 45, + (2,184,0): 53, 47, 47, + (2,185,0): 52, 46, 46, + (2,186,0): 53, 44, 45, + (2,187,0): 52, 42, 43, + (2,188,0): 52, 42, 43, + (2,189,0): 57, 45, 47, + (2,190,0): 62, 50, 52, + (2,191,0): 73, 53, 54, + (2,192,0): 91, 57, 55, + (2,193,0): 108, 63, 57, + (2,194,0): 124, 69, 64, + (2,195,0): 134, 73, 68, + (2,196,0): 144, 79, 77, + (2,197,0): 152, 91, 96, + (2,198,0): 155, 102, 118, + (2,199,0): 148, 109, 136, + (2,200,0): 140, 119, 158, + (2,201,0): 131, 125, 173, + (2,202,0): 125, 130, 185, + (2,203,0): 117, 126, 183, + (2,204,0): 102, 109, 164, + (2,205,0): 84, 86, 137, + (2,206,0): 77, 69, 118, + (2,207,0): 76, 65, 107, + (2,208,0): 77, 65, 101, + (2,209,0): 79, 70, 99, + (2,210,0): 81, 72, 99, + (2,211,0): 77, 72, 94, + (2,212,0): 78, 75, 92, + (2,213,0): 91, 91, 101, + (2,214,0): 113, 116, 121, + (2,215,0): 133, 137, 136, + (2,216,0): 135, 140, 134, + (2,217,0): 138, 143, 136, + (2,218,0): 141, 144, 133, + (2,219,0): 134, 138, 124, + (2,220,0): 120, 122, 108, + (2,221,0): 102, 105, 88, + (2,222,0): 90, 91, 77, + (2,223,0): 86, 83, 76, + (2,224,0): 90, 85, 91, + (2,225,0): 90, 84, 96, + (2,226,0): 91, 83, 96, + (3,0,0): 46, 45, 43, + (3,1,0): 47, 46, 44, + (3,2,0): 47, 46, 44, + (3,3,0): 48, 47, 45, + (3,4,0): 51, 47, 44, + (3,5,0): 52, 48, 45, + (3,6,0): 52, 48, 45, + (3,7,0): 52, 48, 45, + (3,8,0): 54, 49, 45, + (3,9,0): 54, 49, 45, + (3,10,0): 54, 49, 45, + (3,11,0): 54, 49, 45, + (3,12,0): 56, 49, 43, + (3,13,0): 56, 49, 43, + (3,14,0): 56, 49, 43, + (3,15,0): 56, 49, 43, + (3,16,0): 55, 47, 45, + (3,17,0): 55, 47, 45, + (3,18,0): 54, 46, 44, + (3,19,0): 54, 46, 44, + (3,20,0): 54, 46, 44, + (3,21,0): 54, 46, 44, + (3,22,0): 55, 47, 45, + (3,23,0): 55, 47, 45, + (3,24,0): 56, 48, 46, + (3,25,0): 56, 48, 46, + (3,26,0): 56, 48, 46, + (3,27,0): 56, 48, 46, + (3,28,0): 56, 48, 46, + (3,29,0): 56, 48, 46, + (3,30,0): 56, 48, 46, + (3,31,0): 56, 48, 46, + (3,32,0): 53, 45, 43, + (3,33,0): 53, 45, 43, + (3,34,0): 53, 45, 43, + (3,35,0): 52, 44, 42, + (3,36,0): 52, 44, 42, + (3,37,0): 52, 44, 42, + (3,38,0): 51, 43, 41, + (3,39,0): 51, 43, 41, + (3,40,0): 54, 46, 44, + (3,41,0): 54, 46, 44, + (3,42,0): 54, 46, 44, + (3,43,0): 54, 46, 44, + (3,44,0): 54, 46, 44, + (3,45,0): 54, 46, 44, + (3,46,0): 54, 46, 44, + (3,47,0): 52, 47, 44, + (3,48,0): 51, 48, 43, + (3,49,0): 51, 48, 41, + (3,50,0): 51, 48, 41, + (3,51,0): 52, 49, 42, + (3,52,0): 52, 49, 42, + (3,53,0): 53, 50, 43, + (3,54,0): 53, 50, 43, + (3,55,0): 53, 50, 43, + (3,56,0): 53, 50, 43, + (3,57,0): 53, 50, 43, + (3,58,0): 54, 51, 44, + (3,59,0): 55, 52, 45, + (3,60,0): 56, 53, 46, + (3,61,0): 56, 53, 46, + (3,62,0): 57, 54, 47, + (3,63,0): 57, 54, 45, + (3,64,0): 62, 55, 45, + (3,65,0): 63, 57, 45, + (3,66,0): 64, 58, 46, + (3,67,0): 66, 60, 48, + (3,68,0): 69, 61, 50, + (3,69,0): 69, 61, 50, + (3,70,0): 70, 62, 49, + (3,71,0): 70, 62, 49, + (3,72,0): 71, 61, 49, + (3,73,0): 71, 62, 47, + (3,74,0): 72, 60, 46, + (3,75,0): 73, 61, 47, + (3,76,0): 73, 61, 47, + (3,77,0): 74, 62, 46, + (3,78,0): 76, 64, 48, + (3,79,0): 74, 65, 48, + (3,80,0): 75, 68, 50, + (3,81,0): 78, 69, 52, + (3,82,0): 85, 68, 52, + (3,83,0): 94, 68, 51, + (3,84,0): 105, 68, 50, + (3,85,0): 115, 66, 49, + (3,86,0): 126, 65, 47, + (3,87,0): 134, 63, 45, + (3,88,0): 140, 57, 41, + (3,89,0): 148, 57, 39, + (3,90,0): 157, 57, 42, + (3,91,0): 163, 60, 45, + (3,92,0): 172, 64, 51, + (3,93,0): 179, 69, 56, + (3,94,0): 184, 72, 60, + (3,95,0): 193, 70, 62, + (3,96,0): 210, 68, 67, + (3,97,0): 218, 65, 67, + (3,98,0): 222, 66, 67, + (3,99,0): 226, 68, 67, + (3,100,0): 231, 67, 68, + (3,101,0): 236, 66, 67, + (3,102,0): 243, 64, 67, + (3,103,0): 247, 63, 65, + (3,104,0): 250, 59, 64, + (3,105,0): 249, 58, 63, + (3,106,0): 245, 59, 64, + (3,107,0): 238, 62, 64, + (3,108,0): 229, 65, 64, + (3,109,0): 218, 66, 61, + (3,110,0): 205, 64, 57, + (3,111,0): 194, 64, 51, + (3,112,0): 181, 61, 45, + (3,113,0): 176, 64, 44, + (3,114,0): 176, 64, 44, + (3,115,0): 176, 64, 44, + (3,116,0): 175, 62, 44, + (3,117,0): 174, 63, 44, + (3,118,0): 174, 63, 44, + (3,119,0): 172, 63, 43, + (3,120,0): 169, 64, 45, + (3,121,0): 166, 63, 44, + (3,122,0): 163, 64, 43, + (3,123,0): 160, 64, 42, + (3,124,0): 156, 64, 43, + (3,125,0): 152, 64, 42, + (3,126,0): 150, 64, 41, + (3,127,0): 148, 63, 42, + (3,128,0): 145, 62, 44, + (3,129,0): 145, 62, 46, + (3,130,0): 145, 62, 46, + (3,131,0): 144, 61, 45, + (3,132,0): 144, 61, 43, + (3,133,0): 144, 61, 43, + (3,134,0): 143, 60, 42, + (3,135,0): 143, 60, 42, + (3,136,0): 144, 61, 43, + (3,137,0): 144, 61, 43, + (3,138,0): 143, 60, 42, + (3,139,0): 143, 60, 42, + (3,140,0): 146, 60, 43, + (3,141,0): 145, 62, 44, + (3,142,0): 148, 62, 45, + (3,143,0): 146, 63, 45, + (3,144,0): 149, 65, 54, + (3,145,0): 150, 63, 53, + (3,146,0): 156, 62, 50, + (3,147,0): 166, 64, 52, + (3,148,0): 178, 66, 54, + (3,149,0): 188, 67, 56, + (3,150,0): 193, 67, 55, + (3,151,0): 194, 66, 55, + (3,152,0): 194, 70, 60, + (3,153,0): 186, 74, 63, + (3,154,0): 172, 76, 64, + (3,155,0): 151, 75, 62, + (3,156,0): 124, 70, 58, + (3,157,0): 98, 64, 52, + (3,158,0): 76, 58, 46, + (3,159,0): 65, 55, 45, + (3,160,0): 64, 56, 53, + (3,161,0): 62, 57, 54, + (3,162,0): 61, 55, 55, + (3,163,0): 60, 55, 52, + (3,164,0): 58, 53, 50, + (3,165,0): 57, 52, 49, + (3,166,0): 56, 51, 48, + (3,167,0): 56, 51, 48, + (3,168,0): 54, 50, 47, + (3,169,0): 54, 50, 47, + (3,170,0): 54, 50, 47, + (3,171,0): 51, 50, 46, + (3,172,0): 53, 50, 45, + (3,173,0): 50, 49, 44, + (3,174,0): 50, 49, 44, + (3,175,0): 49, 50, 45, + (3,176,0): 45, 50, 46, + (3,177,0): 45, 50, 46, + (3,178,0): 47, 49, 46, + (3,179,0): 47, 49, 46, + (3,180,0): 48, 48, 46, + (3,181,0): 48, 48, 46, + (3,182,0): 49, 48, 46, + (3,183,0): 49, 48, 46, + (3,184,0): 53, 49, 48, + (3,185,0): 54, 48, 48, + (3,186,0): 53, 47, 47, + (3,187,0): 53, 44, 45, + (3,188,0): 52, 43, 44, + (3,189,0): 54, 44, 45, + (3,190,0): 58, 48, 49, + (3,191,0): 68, 50, 50, + (3,192,0): 84, 55, 49, + (3,193,0): 99, 59, 51, + (3,194,0): 113, 65, 55, + (3,195,0): 123, 69, 59, + (3,196,0): 130, 72, 68, + (3,197,0): 137, 82, 85, + (3,198,0): 141, 95, 108, + (3,199,0): 139, 105, 130, + (3,200,0): 131, 115, 152, + (3,201,0): 125, 121, 171, + (3,202,0): 120, 125, 181, + (3,203,0): 111, 119, 181, + (3,204,0): 96, 102, 162, + (3,205,0): 81, 82, 139, + (3,206,0): 76, 69, 121, + (3,207,0): 76, 64, 112, + (3,208,0): 76, 64, 104, + (3,209,0): 80, 69, 103, + (3,210,0): 81, 70, 102, + (3,211,0): 76, 67, 94, + (3,212,0): 71, 66, 86, + (3,213,0): 77, 76, 90, + (3,214,0): 94, 94, 102, + (3,215,0): 106, 110, 113, + (3,216,0): 117, 121, 120, + (3,217,0): 120, 125, 119, + (3,218,0): 122, 128, 118, + (3,219,0): 119, 122, 111, + (3,220,0): 107, 111, 97, + (3,221,0): 96, 98, 84, + (3,222,0): 87, 89, 76, + (3,223,0): 84, 84, 76, + (3,224,0): 93, 87, 89, + (3,225,0): 93, 86, 93, + (3,226,0): 93, 86, 94, + (4,0,0): 45, 45, 45, + (4,1,0): 45, 45, 45, + (4,2,0): 46, 45, 43, + (4,3,0): 47, 46, 44, + (4,4,0): 48, 47, 45, + (4,5,0): 49, 48, 46, + (4,6,0): 51, 47, 44, + (4,7,0): 52, 48, 45, + (4,8,0): 51, 47, 44, + (4,9,0): 51, 47, 44, + (4,10,0): 52, 47, 43, + (4,11,0): 52, 47, 43, + (4,12,0): 52, 47, 43, + (4,13,0): 52, 47, 43, + (4,14,0): 54, 47, 41, + (4,15,0): 54, 47, 41, + (4,16,0): 52, 47, 44, + (4,17,0): 52, 47, 44, + (4,18,0): 51, 46, 43, + (4,19,0): 51, 46, 43, + (4,20,0): 51, 46, 43, + (4,21,0): 51, 46, 43, + (4,22,0): 52, 47, 44, + (4,23,0): 52, 47, 44, + (4,24,0): 53, 48, 45, + (4,25,0): 53, 48, 45, + (4,26,0): 53, 48, 45, + (4,27,0): 53, 48, 45, + (4,28,0): 53, 48, 45, + (4,29,0): 53, 48, 45, + (4,30,0): 53, 48, 45, + (4,31,0): 53, 48, 45, + (4,32,0): 51, 46, 43, + (4,33,0): 51, 46, 43, + (4,34,0): 50, 45, 42, + (4,35,0): 50, 45, 42, + (4,36,0): 50, 45, 42, + (4,37,0): 49, 44, 41, + (4,38,0): 49, 44, 41, + (4,39,0): 49, 44, 41, + (4,40,0): 52, 47, 44, + (4,41,0): 52, 47, 44, + (4,42,0): 52, 47, 44, + (4,43,0): 52, 47, 44, + (4,44,0): 52, 47, 44, + (4,45,0): 52, 47, 44, + (4,46,0): 52, 47, 44, + (4,47,0): 52, 47, 44, + (4,48,0): 52, 49, 44, + (4,49,0): 52, 49, 44, + (4,50,0): 52, 49, 44, + (4,51,0): 52, 49, 44, + (4,52,0): 52, 49, 44, + (4,53,0): 53, 50, 45, + (4,54,0): 53, 50, 45, + (4,55,0): 53, 50, 45, + (4,56,0): 53, 50, 45, + (4,57,0): 53, 50, 45, + (4,58,0): 54, 51, 46, + (4,59,0): 54, 51, 46, + (4,60,0): 55, 52, 47, + (4,61,0): 56, 53, 48, + (4,62,0): 57, 54, 49, + (4,63,0): 57, 54, 47, + (4,64,0): 60, 53, 45, + (4,65,0): 61, 54, 44, + (4,66,0): 63, 56, 46, + (4,67,0): 64, 57, 47, + (4,68,0): 66, 58, 47, + (4,69,0): 67, 59, 48, + (4,70,0): 67, 59, 48, + (4,71,0): 67, 59, 46, + (4,72,0): 68, 58, 46, + (4,73,0): 68, 58, 46, + (4,74,0): 70, 58, 46, + (4,75,0): 71, 59, 45, + (4,76,0): 72, 60, 46, + (4,77,0): 73, 61, 47, + (4,78,0): 74, 62, 48, + (4,79,0): 73, 64, 49, + (4,80,0): 74, 71, 54, + (4,81,0): 77, 72, 53, + (4,82,0): 82, 71, 53, + (4,83,0): 89, 70, 53, + (4,84,0): 98, 69, 51, + (4,85,0): 106, 68, 49, + (4,86,0): 117, 66, 47, + (4,87,0): 125, 62, 44, + (4,88,0): 130, 59, 41, + (4,89,0): 139, 58, 41, + (4,90,0): 147, 58, 42, + (4,91,0): 154, 61, 44, + (4,92,0): 163, 66, 50, + (4,93,0): 172, 70, 56, + (4,94,0): 178, 74, 61, + (4,95,0): 187, 73, 63, + (4,96,0): 204, 71, 66, + (4,97,0): 212, 68, 67, + (4,98,0): 216, 68, 66, + (4,99,0): 221, 69, 66, + (4,100,0): 226, 66, 66, + (4,101,0): 233, 65, 65, + (4,102,0): 240, 61, 64, + (4,103,0): 244, 60, 62, + (4,104,0): 249, 58, 63, + (4,105,0): 248, 58, 60, + (4,106,0): 244, 60, 62, + (4,107,0): 237, 63, 62, + (4,108,0): 225, 66, 62, + (4,109,0): 211, 67, 58, + (4,110,0): 197, 65, 53, + (4,111,0): 185, 63, 48, + (4,112,0): 178, 63, 45, + (4,113,0): 174, 63, 44, + (4,114,0): 174, 63, 44, + (4,115,0): 174, 63, 44, + (4,116,0): 173, 62, 45, + (4,117,0): 172, 62, 45, + (4,118,0): 172, 62, 45, + (4,119,0): 170, 63, 45, + (4,120,0): 168, 62, 46, + (4,121,0): 164, 63, 45, + (4,122,0): 160, 63, 44, + (4,123,0): 158, 63, 43, + (4,124,0): 154, 63, 44, + (4,125,0): 151, 63, 43, + (4,126,0): 149, 62, 42, + (4,127,0): 147, 62, 42, + (4,128,0): 145, 62, 44, + (4,129,0): 144, 63, 46, + (4,130,0): 143, 62, 45, + (4,131,0): 143, 62, 45, + (4,132,0): 143, 62, 45, + (4,133,0): 142, 61, 44, + (4,134,0): 142, 61, 44, + (4,135,0): 142, 61, 44, + (4,136,0): 142, 61, 44, + (4,137,0): 142, 61, 44, + (4,138,0): 142, 61, 44, + (4,139,0): 142, 61, 44, + (4,140,0): 143, 60, 44, + (4,141,0): 143, 62, 45, + (4,142,0): 145, 62, 46, + (4,143,0): 144, 63, 46, + (4,144,0): 148, 66, 52, + (4,145,0): 151, 65, 52, + (4,146,0): 157, 64, 49, + (4,147,0): 168, 64, 51, + (4,148,0): 182, 65, 55, + (4,149,0): 191, 67, 57, + (4,150,0): 197, 66, 56, + (4,151,0): 196, 65, 55, + (4,152,0): 190, 67, 59, + (4,153,0): 183, 72, 63, + (4,154,0): 166, 76, 67, + (4,155,0): 144, 74, 64, + (4,156,0): 116, 69, 59, + (4,157,0): 90, 62, 50, + (4,158,0): 69, 57, 45, + (4,159,0): 60, 53, 43, + (4,160,0): 64, 57, 51, + (4,161,0): 64, 56, 53, + (4,162,0): 63, 55, 53, + (4,163,0): 62, 54, 51, + (4,164,0): 61, 53, 50, + (4,165,0): 60, 52, 49, + (4,166,0): 57, 52, 48, + (4,167,0): 56, 51, 47, + (4,168,0): 54, 50, 47, + (4,169,0): 52, 51, 47, + (4,170,0): 52, 51, 47, + (4,171,0): 50, 51, 46, + (4,172,0): 51, 50, 46, + (4,173,0): 49, 50, 45, + (4,174,0): 49, 50, 45, + (4,175,0): 48, 50, 45, + (4,176,0): 45, 50, 46, + (4,177,0): 44, 50, 46, + (4,178,0): 45, 50, 46, + (4,179,0): 45, 50, 46, + (4,180,0): 47, 49, 46, + (4,181,0): 47, 49, 46, + (4,182,0): 48, 48, 46, + (4,183,0): 49, 48, 46, + (4,184,0): 51, 50, 48, + (4,185,0): 53, 49, 48, + (4,186,0): 53, 49, 48, + (4,187,0): 52, 46, 46, + (4,188,0): 50, 44, 44, + (4,189,0): 52, 43, 44, + (4,190,0): 55, 46, 47, + (4,191,0): 61, 47, 46, + (4,192,0): 78, 53, 46, + (4,193,0): 89, 57, 46, + (4,194,0): 101, 61, 49, + (4,195,0): 110, 64, 51, + (4,196,0): 115, 66, 59, + (4,197,0): 121, 75, 75, + (4,198,0): 128, 90, 101, + (4,199,0): 131, 103, 128, + (4,200,0): 127, 112, 151, + (4,201,0): 122, 120, 170, + (4,202,0): 117, 123, 183, + (4,203,0): 107, 115, 180, + (4,204,0): 95, 100, 166, + (4,205,0): 84, 84, 148, + (4,206,0): 79, 71, 131, + (4,207,0): 76, 66, 119, + (4,208,0): 78, 65, 109, + (4,209,0): 78, 66, 104, + (4,210,0): 77, 65, 101, + (4,211,0): 74, 65, 96, + (4,212,0): 71, 66, 89, + (4,213,0): 71, 70, 88, + (4,214,0): 75, 75, 87, + (4,215,0): 77, 80, 85, + (4,216,0): 93, 99, 99, + (4,217,0): 96, 102, 98, + (4,218,0): 98, 105, 97, + (4,219,0): 96, 102, 92, + (4,220,0): 90, 96, 84, + (4,221,0): 87, 91, 77, + (4,222,0): 85, 88, 77, + (4,223,0): 88, 88, 80, + (4,224,0): 94, 89, 86, + (4,225,0): 96, 87, 88, + (4,226,0): 96, 87, 90, + (5,0,0): 44, 44, 44, + (5,1,0): 44, 44, 44, + (5,2,0): 46, 45, 43, + (5,3,0): 46, 45, 43, + (5,4,0): 47, 46, 44, + (5,5,0): 48, 47, 45, + (5,6,0): 51, 47, 44, + (5,7,0): 51, 47, 44, + (5,8,0): 50, 46, 43, + (5,9,0): 50, 46, 43, + (5,10,0): 51, 46, 42, + (5,11,0): 51, 46, 42, + (5,12,0): 51, 46, 42, + (5,13,0): 51, 46, 42, + (5,14,0): 53, 46, 40, + (5,15,0): 53, 45, 42, + (5,16,0): 51, 46, 43, + (5,17,0): 51, 46, 43, + (5,18,0): 50, 45, 42, + (5,19,0): 49, 44, 41, + (5,20,0): 49, 44, 41, + (5,21,0): 50, 45, 42, + (5,22,0): 51, 46, 43, + (5,23,0): 51, 46, 43, + (5,24,0): 51, 46, 43, + (5,25,0): 51, 46, 43, + (5,26,0): 51, 46, 43, + (5,27,0): 51, 46, 43, + (5,28,0): 51, 46, 43, + (5,29,0): 51, 46, 43, + (5,30,0): 51, 46, 43, + (5,31,0): 51, 46, 43, + (5,32,0): 50, 45, 42, + (5,33,0): 50, 45, 42, + (5,34,0): 50, 45, 42, + (5,35,0): 50, 45, 42, + (5,36,0): 49, 44, 41, + (5,37,0): 49, 44, 41, + (5,38,0): 49, 44, 41, + (5,39,0): 48, 43, 40, + (5,40,0): 51, 46, 43, + (5,41,0): 51, 46, 43, + (5,42,0): 51, 46, 43, + (5,43,0): 51, 46, 43, + (5,44,0): 51, 46, 43, + (5,45,0): 51, 46, 43, + (5,46,0): 51, 46, 43, + (5,47,0): 51, 46, 43, + (5,48,0): 52, 49, 44, + (5,49,0): 52, 49, 44, + (5,50,0): 52, 49, 44, + (5,51,0): 52, 49, 44, + (5,52,0): 52, 49, 44, + (5,53,0): 52, 49, 44, + (5,54,0): 52, 49, 44, + (5,55,0): 52, 49, 44, + (5,56,0): 52, 49, 44, + (5,57,0): 53, 50, 45, + (5,58,0): 53, 50, 45, + (5,59,0): 54, 51, 46, + (5,60,0): 55, 52, 47, + (5,61,0): 56, 53, 48, + (5,62,0): 56, 53, 48, + (5,63,0): 56, 53, 46, + (5,64,0): 59, 52, 44, + (5,65,0): 60, 53, 43, + (5,66,0): 61, 54, 44, + (5,67,0): 62, 55, 45, + (5,68,0): 64, 55, 46, + (5,69,0): 65, 57, 46, + (5,70,0): 65, 57, 46, + (5,71,0): 65, 57, 46, + (5,72,0): 67, 57, 47, + (5,73,0): 67, 57, 45, + (5,74,0): 69, 57, 45, + (5,75,0): 70, 58, 46, + (5,76,0): 71, 59, 47, + (5,77,0): 72, 60, 46, + (5,78,0): 74, 62, 48, + (5,79,0): 72, 65, 49, + (5,80,0): 74, 71, 54, + (5,81,0): 73, 72, 54, + (5,82,0): 78, 71, 53, + (5,83,0): 86, 70, 54, + (5,84,0): 92, 69, 51, + (5,85,0): 100, 67, 50, + (5,86,0): 110, 64, 48, + (5,87,0): 118, 62, 45, + (5,88,0): 123, 60, 43, + (5,89,0): 130, 59, 41, + (5,90,0): 140, 59, 42, + (5,91,0): 148, 61, 44, + (5,92,0): 156, 64, 49, + (5,93,0): 163, 70, 53, + (5,94,0): 170, 74, 58, + (5,95,0): 180, 74, 61, + (5,96,0): 196, 72, 64, + (5,97,0): 204, 69, 65, + (5,98,0): 209, 70, 65, + (5,99,0): 214, 69, 64, + (5,100,0): 222, 67, 65, + (5,101,0): 228, 64, 62, + (5,102,0): 236, 62, 63, + (5,103,0): 241, 58, 60, + (5,104,0): 247, 59, 60, + (5,105,0): 244, 58, 59, + (5,106,0): 240, 60, 61, + (5,107,0): 233, 64, 61, + (5,108,0): 220, 67, 61, + (5,109,0): 205, 67, 56, + (5,110,0): 190, 64, 50, + (5,111,0): 177, 62, 44, + (5,112,0): 174, 63, 44, + (5,113,0): 171, 64, 44, + (5,114,0): 170, 63, 43, + (5,115,0): 170, 63, 43, + (5,116,0): 170, 63, 45, + (5,117,0): 169, 62, 44, + (5,118,0): 169, 62, 44, + (5,119,0): 168, 63, 44, + (5,120,0): 165, 62, 45, + (5,121,0): 162, 63, 44, + (5,122,0): 160, 63, 44, + (5,123,0): 155, 62, 44, + (5,124,0): 151, 63, 43, + (5,125,0): 149, 62, 42, + (5,126,0): 147, 62, 41, + (5,127,0): 145, 63, 42, + (5,128,0): 143, 62, 43, + (5,129,0): 143, 62, 45, + (5,130,0): 143, 62, 45, + (5,131,0): 143, 62, 45, + (5,132,0): 142, 61, 44, + (5,133,0): 142, 61, 44, + (5,134,0): 142, 61, 44, + (5,135,0): 141, 60, 43, + (5,136,0): 142, 61, 44, + (5,137,0): 139, 60, 43, + (5,138,0): 141, 60, 43, + (5,139,0): 139, 60, 43, + (5,140,0): 139, 60, 45, + (5,141,0): 140, 61, 44, + (5,142,0): 141, 62, 47, + (5,143,0): 142, 63, 46, + (5,144,0): 148, 66, 52, + (5,145,0): 151, 65, 50, + (5,146,0): 160, 64, 50, + (5,147,0): 172, 66, 53, + (5,148,0): 185, 67, 57, + (5,149,0): 194, 67, 58, + (5,150,0): 197, 66, 58, + (5,151,0): 194, 65, 59, + (5,152,0): 186, 65, 57, + (5,153,0): 177, 73, 64, + (5,154,0): 163, 78, 71, + (5,155,0): 141, 78, 69, + (5,156,0): 111, 71, 61, + (5,157,0): 83, 63, 52, + (5,158,0): 65, 59, 47, + (5,159,0): 57, 54, 45, + (5,160,0): 64, 57, 51, + (5,161,0): 65, 55, 53, + (5,162,0): 63, 55, 52, + (5,163,0): 62, 54, 51, + (5,164,0): 60, 52, 49, + (5,165,0): 57, 52, 48, + (5,166,0): 56, 51, 47, + (5,167,0): 55, 52, 47, + (5,168,0): 52, 51, 47, + (5,169,0): 52, 51, 47, + (5,170,0): 51, 52, 47, + (5,171,0): 50, 51, 46, + (5,172,0): 50, 51, 46, + (5,173,0): 48, 50, 45, + (5,174,0): 48, 50, 45, + (5,175,0): 46, 51, 45, + (5,176,0): 45, 51, 47, + (5,177,0): 45, 51, 47, + (5,178,0): 46, 51, 47, + (5,179,0): 46, 51, 47, + (5,180,0): 48, 50, 47, + (5,181,0): 48, 50, 47, + (5,182,0): 49, 49, 47, + (5,183,0): 49, 49, 47, + (5,184,0): 50, 49, 47, + (5,185,0): 51, 50, 48, + (5,186,0): 51, 50, 48, + (5,187,0): 52, 48, 47, + (5,188,0): 50, 46, 45, + (5,189,0): 49, 45, 44, + (5,190,0): 52, 46, 46, + (5,191,0): 56, 46, 44, + (5,192,0): 71, 52, 45, + (5,193,0): 79, 52, 41, + (5,194,0): 88, 56, 43, + (5,195,0): 96, 60, 48, + (5,196,0): 101, 63, 54, + (5,197,0): 109, 71, 70, + (5,198,0): 121, 89, 100, + (5,199,0): 130, 107, 133, + (5,200,0): 128, 117, 159, + (5,201,0): 124, 124, 178, + (5,202,0): 119, 124, 188, + (5,203,0): 110, 117, 187, + (5,204,0): 100, 104, 175, + (5,205,0): 91, 91, 161, + (5,206,0): 82, 77, 143, + (5,207,0): 76, 66, 126, + (5,208,0): 79, 65, 114, + (5,209,0): 76, 64, 104, + (5,210,0): 73, 61, 99, + (5,211,0): 72, 62, 96, + (5,212,0): 72, 66, 94, + (5,213,0): 69, 67, 88, + (5,214,0): 64, 66, 79, + (5,215,0): 59, 64, 70, + (5,216,0): 66, 71, 74, + (5,217,0): 68, 77, 74, + (5,218,0): 74, 81, 74, + (5,219,0): 74, 81, 73, + (5,220,0): 73, 81, 70, + (5,221,0): 75, 81, 69, + (5,222,0): 79, 85, 73, + (5,223,0): 86, 87, 79, + (5,224,0): 94, 89, 83, + (5,225,0): 96, 89, 83, + (5,226,0): 96, 88, 85, + (6,0,0): 43, 43, 43, + (6,1,0): 43, 43, 43, + (6,2,0): 44, 44, 44, + (6,3,0): 45, 45, 45, + (6,4,0): 47, 46, 44, + (6,5,0): 47, 46, 44, + (6,6,0): 48, 47, 45, + (6,7,0): 48, 47, 45, + (6,8,0): 49, 45, 42, + (6,9,0): 49, 45, 42, + (6,10,0): 49, 45, 42, + (6,11,0): 49, 45, 42, + (6,12,0): 50, 45, 41, + (6,13,0): 50, 45, 41, + (6,14,0): 50, 45, 41, + (6,15,0): 50, 45, 41, + (6,16,0): 50, 45, 42, + (6,17,0): 50, 44, 44, + (6,18,0): 49, 43, 43, + (6,19,0): 49, 43, 43, + (6,20,0): 49, 43, 43, + (6,21,0): 49, 43, 43, + (6,22,0): 50, 44, 44, + (6,23,0): 50, 44, 44, + (6,24,0): 49, 43, 43, + (6,25,0): 49, 43, 43, + (6,26,0): 49, 43, 43, + (6,27,0): 49, 43, 43, + (6,28,0): 49, 43, 43, + (6,29,0): 49, 43, 43, + (6,30,0): 49, 43, 43, + (6,31,0): 49, 43, 43, + (6,32,0): 50, 44, 44, + (6,33,0): 50, 44, 44, + (6,34,0): 50, 44, 44, + (6,35,0): 49, 43, 43, + (6,36,0): 49, 43, 43, + (6,37,0): 49, 43, 43, + (6,38,0): 48, 42, 42, + (6,39,0): 48, 42, 42, + (6,40,0): 51, 45, 45, + (6,41,0): 51, 45, 45, + (6,42,0): 51, 45, 45, + (6,43,0): 51, 45, 45, + (6,44,0): 51, 45, 45, + (6,45,0): 51, 45, 45, + (6,46,0): 51, 45, 45, + (6,47,0): 51, 46, 43, + (6,48,0): 52, 49, 44, + (6,49,0): 52, 49, 44, + (6,50,0): 52, 49, 44, + (6,51,0): 51, 48, 43, + (6,52,0): 51, 48, 43, + (6,53,0): 51, 48, 43, + (6,54,0): 51, 48, 43, + (6,55,0): 51, 48, 43, + (6,56,0): 52, 49, 44, + (6,57,0): 52, 49, 44, + (6,58,0): 53, 50, 45, + (6,59,0): 54, 51, 46, + (6,60,0): 55, 52, 47, + (6,61,0): 55, 52, 47, + (6,62,0): 56, 53, 48, + (6,63,0): 56, 53, 46, + (6,64,0): 58, 51, 43, + (6,65,0): 59, 52, 44, + (6,66,0): 60, 53, 45, + (6,67,0): 61, 54, 46, + (6,68,0): 63, 54, 47, + (6,69,0): 63, 54, 45, + (6,70,0): 63, 54, 45, + (6,71,0): 63, 55, 44, + (6,72,0): 66, 56, 46, + (6,73,0): 66, 56, 46, + (6,74,0): 69, 56, 47, + (6,75,0): 69, 57, 45, + (6,76,0): 71, 59, 47, + (6,77,0): 72, 60, 48, + (6,78,0): 74, 62, 50, + (6,79,0): 72, 64, 51, + (6,80,0): 72, 69, 54, + (6,81,0): 71, 70, 52, + (6,82,0): 75, 69, 53, + (6,83,0): 81, 68, 52, + (6,84,0): 88, 67, 50, + (6,85,0): 95, 66, 50, + (6,86,0): 102, 63, 46, + (6,87,0): 110, 61, 44, + (6,88,0): 118, 61, 44, + (6,89,0): 124, 58, 42, + (6,90,0): 133, 57, 41, + (6,91,0): 140, 59, 42, + (6,92,0): 147, 61, 46, + (6,93,0): 155, 66, 50, + (6,94,0): 162, 70, 55, + (6,95,0): 172, 70, 56, + (6,96,0): 187, 70, 60, + (6,97,0): 194, 70, 62, + (6,98,0): 201, 70, 62, + (6,99,0): 208, 69, 62, + (6,100,0): 217, 68, 64, + (6,101,0): 226, 67, 63, + (6,102,0): 234, 64, 64, + (6,103,0): 240, 62, 62, + (6,104,0): 242, 58, 58, + (6,105,0): 241, 59, 58, + (6,106,0): 236, 60, 60, + (6,107,0): 228, 65, 60, + (6,108,0): 214, 67, 59, + (6,109,0): 198, 68, 54, + (6,110,0): 181, 64, 47, + (6,111,0): 170, 61, 41, + (6,112,0): 170, 63, 45, + (6,113,0): 169, 64, 45, + (6,114,0): 169, 64, 45, + (6,115,0): 168, 63, 44, + (6,116,0): 168, 62, 46, + (6,117,0): 168, 62, 46, + (6,118,0): 167, 61, 45, + (6,119,0): 165, 62, 45, + (6,120,0): 163, 61, 46, + (6,121,0): 160, 63, 46, + (6,122,0): 158, 63, 45, + (6,123,0): 154, 63, 45, + (6,124,0): 150, 63, 44, + (6,125,0): 147, 62, 42, + (6,126,0): 145, 63, 42, + (6,127,0): 143, 62, 41, + (6,128,0): 143, 62, 43, + (6,129,0): 141, 62, 45, + (6,130,0): 141, 62, 45, + (6,131,0): 140, 61, 44, + (6,132,0): 140, 61, 46, + (6,133,0): 140, 61, 46, + (6,134,0): 139, 60, 45, + (6,135,0): 139, 60, 45, + (6,136,0): 139, 60, 45, + (6,137,0): 138, 61, 45, + (6,138,0): 138, 59, 44, + (6,139,0): 137, 60, 44, + (6,140,0): 138, 60, 47, + (6,141,0): 139, 62, 46, + (6,142,0): 139, 61, 48, + (6,143,0): 140, 63, 47, + (6,144,0): 146, 67, 50, + (6,145,0): 152, 66, 49, + (6,146,0): 161, 65, 49, + (6,147,0): 174, 66, 54, + (6,148,0): 188, 67, 58, + (6,149,0): 194, 67, 60, + (6,150,0): 196, 67, 61, + (6,151,0): 192, 67, 61, + (6,152,0): 185, 70, 65, + (6,153,0): 178, 81, 74, + (6,154,0): 165, 88, 82, + (6,155,0): 143, 88, 81, + (6,156,0): 115, 82, 73, + (6,157,0): 87, 73, 62, + (6,158,0): 67, 67, 55, + (6,159,0): 60, 63, 54, + (6,160,0): 62, 57, 51, + (6,161,0): 64, 55, 50, + (6,162,0): 62, 55, 49, + (6,163,0): 61, 54, 48, + (6,164,0): 58, 53, 47, + (6,165,0): 57, 52, 46, + (6,166,0): 56, 51, 47, + (6,167,0): 54, 51, 46, + (6,168,0): 52, 51, 46, + (6,169,0): 52, 51, 46, + (6,170,0): 51, 52, 47, + (6,171,0): 49, 51, 46, + (6,172,0): 49, 51, 46, + (6,173,0): 46, 51, 45, + (6,174,0): 46, 51, 45, + (6,175,0): 46, 51, 45, + (6,176,0): 45, 51, 47, + (6,177,0): 45, 51, 47, + (6,178,0): 45, 51, 47, + (6,179,0): 45, 51, 47, + (6,180,0): 46, 51, 47, + (6,181,0): 46, 51, 47, + (6,182,0): 48, 50, 47, + (6,183,0): 48, 50, 47, + (6,184,0): 48, 48, 46, + (6,185,0): 49, 49, 47, + (6,186,0): 50, 50, 48, + (6,187,0): 50, 49, 47, + (6,188,0): 48, 47, 45, + (6,189,0): 47, 46, 44, + (6,190,0): 50, 46, 45, + (6,191,0): 52, 47, 44, + (6,192,0): 63, 48, 43, + (6,193,0): 68, 48, 41, + (6,194,0): 75, 51, 41, + (6,195,0): 84, 56, 45, + (6,196,0): 90, 60, 52, + (6,197,0): 100, 70, 70, + (6,198,0): 117, 93, 106, + (6,199,0): 131, 115, 141, + (6,200,0): 137, 128, 171, + (6,201,0): 133, 132, 190, + (6,202,0): 126, 131, 199, + (6,203,0): 116, 122, 198, + (6,204,0): 109, 112, 189, + (6,205,0): 99, 101, 175, + (6,206,0): 86, 83, 154, + (6,207,0): 76, 67, 130, + (6,208,0): 75, 63, 113, + (6,209,0): 73, 60, 103, + (6,210,0): 71, 59, 99, + (6,211,0): 69, 62, 95, + (6,212,0): 70, 66, 93, + (6,213,0): 68, 66, 87, + (6,214,0): 63, 65, 78, + (6,215,0): 59, 63, 72, + (6,216,0): 58, 66, 69, + (6,217,0): 62, 72, 71, + (6,218,0): 68, 77, 72, + (6,219,0): 71, 81, 73, + (6,220,0): 71, 81, 72, + (6,221,0): 74, 82, 71, + (6,222,0): 78, 86, 75, + (6,223,0): 85, 88, 77, + (6,224,0): 94, 90, 79, + (6,225,0): 97, 89, 78, + (6,226,0): 97, 88, 79, + (7,0,0): 43, 43, 43, + (7,1,0): 43, 43, 43, + (7,2,0): 44, 44, 44, + (7,3,0): 44, 44, 44, + (7,4,0): 46, 44, 45, + (7,5,0): 47, 46, 44, + (7,6,0): 48, 47, 45, + (7,7,0): 48, 47, 45, + (7,8,0): 49, 45, 42, + (7,9,0): 49, 45, 42, + (7,10,0): 49, 45, 42, + (7,11,0): 49, 45, 42, + (7,12,0): 50, 45, 41, + (7,13,0): 50, 45, 41, + (7,14,0): 50, 45, 41, + (7,15,0): 50, 45, 42, + (7,16,0): 50, 44, 44, + (7,17,0): 49, 43, 43, + (7,18,0): 49, 43, 43, + (7,19,0): 48, 42, 42, + (7,20,0): 48, 42, 42, + (7,21,0): 49, 43, 43, + (7,22,0): 49, 43, 43, + (7,23,0): 50, 44, 44, + (7,24,0): 48, 42, 42, + (7,25,0): 48, 42, 42, + (7,26,0): 48, 42, 42, + (7,27,0): 48, 42, 42, + (7,28,0): 48, 42, 42, + (7,29,0): 48, 42, 42, + (7,30,0): 48, 42, 42, + (7,31,0): 48, 42, 42, + (7,32,0): 50, 44, 44, + (7,33,0): 50, 44, 44, + (7,34,0): 50, 44, 44, + (7,35,0): 49, 43, 43, + (7,36,0): 49, 43, 43, + (7,37,0): 48, 42, 42, + (7,38,0): 48, 42, 42, + (7,39,0): 48, 42, 42, + (7,40,0): 50, 44, 44, + (7,41,0): 50, 44, 44, + (7,42,0): 50, 44, 44, + (7,43,0): 50, 44, 44, + (7,44,0): 50, 44, 44, + (7,45,0): 50, 44, 44, + (7,46,0): 50, 44, 44, + (7,47,0): 50, 44, 44, + (7,48,0): 51, 47, 44, + (7,49,0): 51, 48, 43, + (7,50,0): 51, 48, 43, + (7,51,0): 51, 48, 43, + (7,52,0): 51, 48, 43, + (7,53,0): 51, 48, 43, + (7,54,0): 51, 48, 43, + (7,55,0): 51, 48, 43, + (7,56,0): 52, 49, 44, + (7,57,0): 52, 49, 44, + (7,58,0): 53, 50, 45, + (7,59,0): 54, 51, 46, + (7,60,0): 54, 51, 46, + (7,61,0): 55, 52, 47, + (7,62,0): 56, 53, 48, + (7,63,0): 56, 53, 48, + (7,64,0): 57, 50, 44, + (7,65,0): 58, 51, 43, + (7,66,0): 59, 52, 44, + (7,67,0): 60, 53, 45, + (7,68,0): 62, 53, 46, + (7,69,0): 62, 53, 46, + (7,70,0): 62, 53, 46, + (7,71,0): 62, 53, 44, + (7,72,0): 66, 56, 47, + (7,73,0): 66, 56, 46, + (7,74,0): 69, 56, 47, + (7,75,0): 69, 56, 47, + (7,76,0): 71, 58, 49, + (7,77,0): 73, 61, 49, + (7,78,0): 74, 62, 50, + (7,79,0): 73, 63, 51, + (7,80,0): 70, 67, 52, + (7,81,0): 70, 67, 52, + (7,82,0): 74, 66, 53, + (7,83,0): 79, 65, 52, + (7,84,0): 84, 65, 50, + (7,85,0): 92, 64, 50, + (7,86,0): 98, 62, 48, + (7,87,0): 106, 60, 45, + (7,88,0): 113, 60, 46, + (7,89,0): 119, 57, 42, + (7,90,0): 125, 56, 41, + (7,91,0): 133, 56, 40, + (7,92,0): 140, 58, 44, + (7,93,0): 149, 61, 47, + (7,94,0): 155, 66, 52, + (7,95,0): 164, 66, 53, + (7,96,0): 178, 70, 58, + (7,97,0): 186, 69, 59, + (7,98,0): 193, 70, 62, + (7,99,0): 202, 71, 63, + (7,100,0): 212, 71, 64, + (7,101,0): 222, 70, 65, + (7,102,0): 231, 67, 65, + (7,103,0): 238, 66, 64, + (7,104,0): 237, 59, 59, + (7,105,0): 235, 59, 59, + (7,106,0): 231, 62, 59, + (7,107,0): 223, 66, 59, + (7,108,0): 209, 68, 58, + (7,109,0): 191, 68, 52, + (7,110,0): 175, 64, 45, + (7,111,0): 164, 62, 40, + (7,112,0): 166, 65, 45, + (7,113,0): 166, 65, 45, + (7,114,0): 165, 64, 44, + (7,115,0): 165, 64, 46, + (7,116,0): 165, 64, 46, + (7,117,0): 164, 63, 45, + (7,118,0): 164, 63, 45, + (7,119,0): 164, 62, 47, + (7,120,0): 162, 62, 46, + (7,121,0): 159, 64, 46, + (7,122,0): 156, 63, 46, + (7,123,0): 152, 63, 45, + (7,124,0): 149, 62, 43, + (7,125,0): 145, 63, 42, + (7,126,0): 143, 62, 41, + (7,127,0): 143, 62, 43, + (7,128,0): 141, 62, 45, + (7,129,0): 141, 62, 45, + (7,130,0): 141, 62, 45, + (7,131,0): 140, 61, 44, + (7,132,0): 140, 61, 46, + (7,133,0): 139, 60, 45, + (7,134,0): 139, 60, 45, + (7,135,0): 138, 61, 45, + (7,136,0): 138, 61, 45, + (7,137,0): 136, 60, 46, + (7,138,0): 136, 60, 46, + (7,139,0): 136, 60, 46, + (7,140,0): 136, 60, 47, + (7,141,0): 135, 62, 47, + (7,142,0): 136, 62, 49, + (7,143,0): 139, 63, 49, + (7,144,0): 145, 68, 50, + (7,145,0): 150, 67, 49, + (7,146,0): 162, 66, 52, + (7,147,0): 173, 67, 54, + (7,148,0): 186, 67, 59, + (7,149,0): 193, 68, 62, + (7,150,0): 193, 68, 62, + (7,151,0): 187, 69, 65, + (7,152,0): 185, 80, 76, + (7,153,0): 178, 91, 84, + (7,154,0): 165, 101, 92, + (7,155,0): 145, 102, 93, + (7,156,0): 117, 95, 84, + (7,157,0): 91, 85, 73, + (7,158,0): 71, 77, 65, + (7,159,0): 67, 73, 63, + (7,160,0): 60, 57, 50, + (7,161,0): 63, 56, 50, + (7,162,0): 62, 55, 49, + (7,163,0): 59, 54, 48, + (7,164,0): 57, 52, 46, + (7,165,0): 55, 52, 45, + (7,166,0): 54, 51, 46, + (7,167,0): 52, 51, 46, + (7,168,0): 52, 51, 46, + (7,169,0): 51, 52, 46, + (7,170,0): 50, 52, 47, + (7,171,0): 49, 51, 46, + (7,172,0): 47, 52, 46, + (7,173,0): 46, 51, 45, + (7,174,0): 46, 51, 45, + (7,175,0): 46, 51, 45, + (7,176,0): 45, 51, 47, + (7,177,0): 45, 51, 47, + (7,178,0): 45, 51, 47, + (7,179,0): 45, 51, 47, + (7,180,0): 46, 51, 47, + (7,181,0): 46, 51, 47, + (7,182,0): 48, 50, 47, + (7,183,0): 48, 50, 47, + (7,184,0): 47, 47, 45, + (7,185,0): 48, 48, 46, + (7,186,0): 50, 50, 48, + (7,187,0): 50, 50, 48, + (7,188,0): 49, 48, 46, + (7,189,0): 48, 47, 45, + (7,190,0): 48, 47, 45, + (7,191,0): 51, 47, 44, + (7,192,0): 56, 44, 44, + (7,193,0): 59, 44, 41, + (7,194,0): 67, 48, 42, + (7,195,0): 75, 55, 48, + (7,196,0): 83, 60, 54, + (7,197,0): 94, 73, 72, + (7,198,0): 116, 98, 110, + (7,199,0): 135, 122, 148, + (7,200,0): 144, 138, 182, + (7,201,0): 140, 141, 198, + (7,202,0): 132, 136, 207, + (7,203,0): 122, 128, 204, + (7,204,0): 114, 120, 198, + (7,205,0): 105, 107, 182, + (7,206,0): 87, 87, 159, + (7,207,0): 73, 68, 132, + (7,208,0): 69, 61, 110, + (7,209,0): 71, 60, 100, + (7,210,0): 68, 60, 97, + (7,211,0): 67, 62, 94, + (7,212,0): 67, 65, 89, + (7,213,0): 64, 67, 86, + (7,214,0): 64, 68, 80, + (7,215,0): 62, 69, 75, + (7,216,0): 71, 81, 82, + (7,217,0): 75, 87, 85, + (7,218,0): 81, 94, 87, + (7,219,0): 85, 96, 88, + (7,220,0): 83, 95, 85, + (7,221,0): 82, 94, 84, + (7,222,0): 84, 94, 83, + (7,223,0): 89, 95, 83, + (7,224,0): 94, 91, 76, + (7,225,0): 97, 90, 74, + (7,226,0): 97, 90, 74, + (8,0,0): 44, 45, 47, + (8,1,0): 44, 45, 47, + (8,2,0): 44, 45, 47, + (8,3,0): 44, 46, 45, + (8,4,0): 45, 45, 45, + (8,5,0): 45, 45, 45, + (8,6,0): 46, 45, 43, + (8,7,0): 46, 45, 43, + (8,8,0): 47, 46, 44, + (8,9,0): 47, 46, 44, + (8,10,0): 49, 45, 42, + (8,11,0): 48, 44, 41, + (8,12,0): 48, 44, 41, + (8,13,0): 48, 44, 41, + (8,14,0): 47, 43, 40, + (8,15,0): 47, 43, 40, + (8,16,0): 47, 43, 42, + (8,17,0): 47, 43, 42, + (8,18,0): 47, 43, 42, + (8,19,0): 47, 43, 42, + (8,20,0): 47, 43, 42, + (8,21,0): 47, 43, 42, + (8,22,0): 47, 43, 42, + (8,23,0): 48, 44, 43, + (8,24,0): 47, 43, 42, + (8,25,0): 47, 43, 42, + (8,26,0): 47, 43, 42, + (8,27,0): 47, 43, 42, + (8,28,0): 47, 43, 42, + (8,29,0): 47, 43, 42, + (8,30,0): 47, 43, 42, + (8,31,0): 47, 43, 42, + (8,32,0): 47, 43, 42, + (8,33,0): 47, 43, 42, + (8,34,0): 47, 43, 42, + (8,35,0): 48, 44, 43, + (8,36,0): 48, 44, 43, + (8,37,0): 49, 45, 44, + (8,38,0): 49, 45, 44, + (8,39,0): 50, 46, 45, + (8,40,0): 49, 45, 44, + (8,41,0): 49, 45, 44, + (8,42,0): 49, 45, 44, + (8,43,0): 49, 45, 44, + (8,44,0): 49, 45, 44, + (8,45,0): 49, 45, 44, + (8,46,0): 49, 45, 44, + (8,47,0): 49, 45, 44, + (8,48,0): 48, 44, 41, + (8,49,0): 49, 45, 42, + (8,50,0): 50, 46, 43, + (8,51,0): 51, 47, 44, + (8,52,0): 51, 47, 44, + (8,53,0): 51, 47, 44, + (8,54,0): 51, 47, 44, + (8,55,0): 51, 47, 44, + (8,56,0): 51, 47, 44, + (8,57,0): 51, 47, 44, + (8,58,0): 51, 47, 44, + (8,59,0): 51, 47, 44, + (8,60,0): 52, 48, 45, + (8,61,0): 53, 49, 46, + (8,62,0): 54, 50, 47, + (8,63,0): 55, 52, 47, + (8,64,0): 56, 48, 45, + (8,65,0): 57, 50, 44, + (8,66,0): 58, 51, 45, + (8,67,0): 59, 52, 46, + (8,68,0): 61, 52, 47, + (8,69,0): 62, 53, 46, + (8,70,0): 62, 53, 46, + (8,71,0): 62, 53, 46, + (8,72,0): 63, 52, 46, + (8,73,0): 63, 53, 44, + (8,74,0): 66, 53, 45, + (8,75,0): 67, 54, 46, + (8,76,0): 68, 55, 47, + (8,77,0): 70, 57, 48, + (8,78,0): 71, 58, 49, + (8,79,0): 70, 60, 50, + (8,80,0): 71, 63, 52, + (8,81,0): 72, 64, 53, + (8,82,0): 74, 64, 54, + (8,83,0): 80, 63, 53, + (8,84,0): 84, 62, 51, + (8,85,0): 88, 60, 49, + (8,86,0): 94, 57, 48, + (8,87,0): 98, 54, 43, + (8,88,0): 109, 57, 46, + (8,89,0): 116, 56, 45, + (8,90,0): 124, 56, 43, + (8,91,0): 131, 57, 44, + (8,92,0): 141, 59, 47, + (8,93,0): 147, 61, 48, + (8,94,0): 152, 63, 49, + (8,95,0): 158, 62, 48, + (8,96,0): 167, 65, 51, + (8,97,0): 173, 65, 52, + (8,98,0): 181, 67, 56, + (8,99,0): 190, 69, 58, + (8,100,0): 202, 71, 61, + (8,101,0): 212, 71, 62, + (8,102,0): 222, 69, 63, + (8,103,0): 229, 67, 64, + (8,104,0): 232, 64, 63, + (8,105,0): 234, 66, 65, + (8,106,0): 230, 68, 65, + (8,107,0): 218, 69, 62, + (8,108,0): 200, 68, 56, + (8,109,0): 183, 66, 49, + (8,110,0): 170, 65, 46, + (8,111,0): 162, 66, 44, + (8,112,0): 162, 65, 46, + (8,113,0): 161, 64, 45, + (8,114,0): 162, 63, 44, + (8,115,0): 162, 62, 46, + (8,116,0): 161, 61, 45, + (8,117,0): 161, 61, 45, + (8,118,0): 162, 62, 46, + (8,119,0): 160, 63, 47, + (8,120,0): 156, 60, 44, + (8,121,0): 154, 61, 44, + (8,122,0): 152, 60, 45, + (8,123,0): 149, 62, 45, + (8,124,0): 147, 61, 44, + (8,125,0): 144, 61, 43, + (8,126,0): 142, 61, 42, + (8,127,0): 140, 62, 42, + (8,128,0): 139, 60, 43, + (8,129,0): 139, 60, 43, + (8,130,0): 138, 61, 45, + (8,131,0): 137, 60, 44, + (8,132,0): 137, 60, 44, + (8,133,0): 137, 60, 44, + (8,134,0): 136, 58, 45, + (8,135,0): 135, 59, 45, + (8,136,0): 137, 61, 47, + (8,137,0): 134, 60, 47, + (8,138,0): 134, 60, 47, + (8,139,0): 135, 61, 48, + (8,140,0): 136, 62, 51, + (8,141,0): 136, 64, 50, + (8,142,0): 137, 65, 53, + (8,143,0): 139, 65, 52, + (8,144,0): 145, 69, 53, + (8,145,0): 151, 68, 52, + (8,146,0): 163, 69, 57, + (8,147,0): 177, 73, 62, + (8,148,0): 186, 71, 64, + (8,149,0): 187, 68, 62, + (8,150,0): 187, 69, 65, + (8,151,0): 184, 77, 71, + (8,152,0): 180, 90, 82, + (8,153,0): 175, 102, 95, + (8,154,0): 163, 113, 102, + (8,155,0): 145, 115, 104, + (8,156,0): 126, 114, 100, + (8,157,0): 106, 106, 94, + (8,158,0): 86, 94, 83, + (8,159,0): 73, 81, 70, + (8,160,0): 76, 76, 66, + (8,161,0): 74, 70, 61, + (8,162,0): 66, 62, 53, + (8,163,0): 60, 56, 47, + (8,164,0): 57, 53, 44, + (8,165,0): 55, 52, 43, + (8,166,0): 54, 51, 44, + (8,167,0): 51, 51, 43, + (8,168,0): 52, 51, 46, + (8,169,0): 51, 52, 46, + (8,170,0): 49, 52, 45, + (8,171,0): 49, 52, 45, + (8,172,0): 48, 50, 45, + (8,173,0): 47, 49, 44, + (8,174,0): 44, 49, 43, + (8,175,0): 44, 49, 43, + (8,176,0): 45, 50, 46, + (8,177,0): 45, 50, 46, + (8,178,0): 45, 50, 46, + (8,179,0): 45, 50, 46, + (8,180,0): 47, 49, 46, + (8,181,0): 47, 49, 46, + (8,182,0): 47, 49, 46, + (8,183,0): 47, 49, 46, + (8,184,0): 48, 50, 47, + (8,185,0): 48, 50, 47, + (8,186,0): 49, 49, 47, + (8,187,0): 49, 49, 47, + (8,188,0): 49, 49, 47, + (8,189,0): 49, 49, 47, + (8,190,0): 49, 49, 47, + (8,191,0): 52, 48, 47, + (8,192,0): 52, 43, 48, + (8,193,0): 59, 47, 51, + (8,194,0): 65, 51, 50, + (8,195,0): 67, 52, 47, + (8,196,0): 74, 59, 54, + (8,197,0): 93, 79, 79, + (8,198,0): 121, 109, 121, + (8,199,0): 139, 133, 159, + (8,200,0): 147, 144, 187, + (8,201,0): 148, 150, 207, + (8,202,0): 144, 149, 217, + (8,203,0): 131, 137, 211, + (8,204,0): 116, 122, 198, + (8,205,0): 106, 110, 183, + (8,206,0): 95, 98, 167, + (8,207,0): 90, 91, 148, + (8,208,0): 76, 73, 116, + (8,209,0): 72, 66, 100, + (8,210,0): 65, 62, 93, + (8,211,0): 62, 62, 88, + (8,212,0): 63, 66, 85, + (8,213,0): 65, 73, 86, + (8,214,0): 76, 85, 92, + (8,215,0): 85, 96, 98, + (8,216,0): 98, 113, 110, + (8,217,0): 110, 125, 120, + (8,218,0): 118, 134, 124, + (8,219,0): 114, 127, 117, + (8,220,0): 108, 121, 111, + (8,221,0): 103, 117, 104, + (8,222,0): 95, 107, 95, + (8,223,0): 87, 95, 80, + (8,224,0): 91, 90, 70, + (8,225,0): 96, 90, 68, + (8,226,0): 99, 93, 71, + (9,0,0): 44, 45, 47, + (9,1,0): 44, 45, 47, + (9,2,0): 44, 45, 47, + (9,3,0): 44, 45, 47, + (9,4,0): 45, 45, 45, + (9,5,0): 45, 45, 45, + (9,6,0): 46, 44, 45, + (9,7,0): 46, 45, 43, + (9,8,0): 47, 46, 44, + (9,9,0): 46, 45, 43, + (9,10,0): 48, 44, 41, + (9,11,0): 48, 44, 41, + (9,12,0): 47, 43, 40, + (9,13,0): 47, 43, 40, + (9,14,0): 47, 43, 40, + (9,15,0): 47, 43, 40, + (9,16,0): 46, 42, 41, + (9,17,0): 46, 42, 41, + (9,18,0): 46, 42, 41, + (9,19,0): 46, 42, 41, + (9,20,0): 47, 43, 42, + (9,21,0): 47, 43, 42, + (9,22,0): 47, 43, 42, + (9,23,0): 47, 43, 42, + (9,24,0): 47, 43, 42, + (9,25,0): 47, 43, 42, + (9,26,0): 47, 43, 42, + (9,27,0): 47, 43, 42, + (9,28,0): 47, 43, 42, + (9,29,0): 47, 43, 42, + (9,30,0): 47, 43, 42, + (9,31,0): 47, 43, 42, + (9,32,0): 47, 43, 42, + (9,33,0): 47, 43, 42, + (9,34,0): 47, 43, 42, + (9,35,0): 48, 44, 43, + (9,36,0): 48, 44, 43, + (9,37,0): 48, 44, 43, + (9,38,0): 49, 45, 44, + (9,39,0): 49, 45, 44, + (9,40,0): 49, 45, 44, + (9,41,0): 49, 45, 44, + (9,42,0): 49, 45, 44, + (9,43,0): 49, 45, 44, + (9,44,0): 49, 45, 44, + (9,45,0): 49, 45, 44, + (9,46,0): 49, 45, 44, + (9,47,0): 49, 45, 44, + (9,48,0): 48, 44, 43, + (9,49,0): 48, 44, 41, + (9,50,0): 49, 45, 42, + (9,51,0): 50, 46, 43, + (9,52,0): 51, 47, 44, + (9,53,0): 51, 47, 44, + (9,54,0): 50, 46, 43, + (9,55,0): 50, 46, 43, + (9,56,0): 50, 46, 43, + (9,57,0): 50, 46, 43, + (9,58,0): 50, 46, 43, + (9,59,0): 50, 46, 43, + (9,60,0): 51, 47, 44, + (9,61,0): 52, 48, 45, + (9,62,0): 53, 49, 46, + (9,63,0): 54, 50, 47, + (9,64,0): 56, 48, 46, + (9,65,0): 57, 49, 46, + (9,66,0): 58, 50, 47, + (9,67,0): 59, 52, 46, + (9,68,0): 61, 52, 47, + (9,69,0): 62, 53, 48, + (9,70,0): 62, 53, 48, + (9,71,0): 61, 52, 45, + (9,72,0): 63, 52, 46, + (9,73,0): 63, 52, 46, + (9,74,0): 65, 52, 46, + (9,75,0): 66, 53, 45, + (9,76,0): 67, 54, 46, + (9,77,0): 69, 56, 48, + (9,78,0): 71, 58, 50, + (9,79,0): 72, 59, 51, + (9,80,0): 72, 62, 53, + (9,81,0): 72, 62, 53, + (9,82,0): 76, 61, 54, + (9,83,0): 79, 62, 54, + (9,84,0): 81, 61, 52, + (9,85,0): 86, 59, 50, + (9,86,0): 90, 57, 48, + (9,87,0): 95, 55, 47, + (9,88,0): 104, 55, 48, + (9,89,0): 112, 55, 46, + (9,90,0): 119, 55, 45, + (9,91,0): 129, 57, 45, + (9,92,0): 137, 57, 46, + (9,93,0): 144, 60, 49, + (9,94,0): 150, 60, 49, + (9,95,0): 155, 61, 49, + (9,96,0): 162, 64, 51, + (9,97,0): 167, 65, 51, + (9,98,0): 172, 66, 53, + (9,99,0): 180, 68, 56, + (9,100,0): 190, 69, 58, + (9,101,0): 201, 70, 60, + (9,102,0): 212, 69, 61, + (9,103,0): 219, 68, 61, + (9,104,0): 223, 68, 64, + (9,105,0): 224, 69, 64, + (9,106,0): 222, 70, 65, + (9,107,0): 212, 71, 62, + (9,108,0): 196, 70, 56, + (9,109,0): 178, 67, 50, + (9,110,0): 165, 66, 45, + (9,111,0): 158, 66, 45, + (9,112,0): 159, 67, 46, + (9,113,0): 158, 66, 45, + (9,114,0): 159, 64, 46, + (9,115,0): 158, 63, 45, + (9,116,0): 158, 63, 45, + (9,117,0): 158, 63, 45, + (9,118,0): 158, 62, 46, + (9,119,0): 158, 62, 46, + (9,120,0): 154, 61, 44, + (9,121,0): 153, 62, 44, + (9,122,0): 150, 61, 45, + (9,123,0): 148, 61, 44, + (9,124,0): 144, 61, 43, + (9,125,0): 143, 62, 43, + (9,126,0): 140, 62, 42, + (9,127,0): 140, 61, 44, + (9,128,0): 139, 60, 43, + (9,129,0): 138, 61, 43, + (9,130,0): 137, 60, 44, + (9,131,0): 137, 60, 44, + (9,132,0): 137, 60, 44, + (9,133,0): 135, 59, 43, + (9,134,0): 135, 59, 45, + (9,135,0): 133, 60, 45, + (9,136,0): 134, 60, 47, + (9,137,0): 133, 61, 47, + (9,138,0): 133, 61, 49, + (9,139,0): 131, 61, 49, + (9,140,0): 132, 62, 50, + (9,141,0): 134, 64, 54, + (9,142,0): 135, 65, 55, + (9,143,0): 136, 66, 54, + (9,144,0): 147, 71, 57, + (9,145,0): 151, 69, 55, + (9,146,0): 163, 71, 60, + (9,147,0): 175, 74, 64, + (9,148,0): 184, 73, 66, + (9,149,0): 184, 71, 65, + (9,150,0): 183, 76, 70, + (9,151,0): 179, 84, 78, + (9,152,0): 177, 100, 92, + (9,153,0): 170, 113, 102, + (9,154,0): 159, 126, 111, + (9,155,0): 144, 127, 111, + (9,156,0): 127, 124, 109, + (9,157,0): 109, 115, 101, + (9,158,0): 90, 102, 90, + (9,159,0): 78, 88, 77, + (9,160,0): 76, 78, 65, + (9,161,0): 75, 73, 61, + (9,162,0): 69, 67, 55, + (9,163,0): 64, 61, 52, + (9,164,0): 61, 58, 49, + (9,165,0): 56, 56, 46, + (9,166,0): 52, 52, 44, + (9,167,0): 49, 49, 41, + (9,168,0): 50, 51, 45, + (9,169,0): 50, 51, 45, + (9,170,0): 48, 51, 44, + (9,171,0): 47, 50, 43, + (9,172,0): 47, 49, 44, + (9,173,0): 46, 48, 43, + (9,174,0): 46, 48, 43, + (9,175,0): 46, 48, 43, + (9,176,0): 47, 49, 46, + (9,177,0): 45, 50, 46, + (9,178,0): 47, 49, 46, + (9,179,0): 47, 49, 46, + (9,180,0): 47, 49, 46, + (9,181,0): 47, 49, 46, + (9,182,0): 47, 49, 46, + (9,183,0): 47, 49, 46, + (9,184,0): 48, 50, 47, + (9,185,0): 48, 50, 47, + (9,186,0): 49, 49, 47, + (9,187,0): 49, 49, 47, + (9,188,0): 49, 49, 47, + (9,189,0): 49, 49, 47, + (9,190,0): 49, 49, 47, + (9,191,0): 50, 48, 49, + (9,192,0): 53, 43, 52, + (9,193,0): 57, 45, 55, + (9,194,0): 60, 50, 51, + (9,195,0): 63, 53, 51, + (9,196,0): 72, 63, 58, + (9,197,0): 94, 86, 84, + (9,198,0): 120, 114, 124, + (9,199,0): 138, 136, 158, + (9,200,0): 147, 147, 185, + (9,201,0): 148, 151, 202, + (9,202,0): 144, 150, 212, + (9,203,0): 132, 139, 207, + (9,204,0): 121, 129, 194, + (9,205,0): 113, 121, 184, + (9,206,0): 107, 116, 173, + (9,207,0): 104, 110, 158, + (9,208,0): 92, 95, 128, + (9,209,0): 88, 90, 113, + (9,210,0): 83, 85, 106, + (9,211,0): 82, 87, 106, + (9,212,0): 84, 94, 104, + (9,213,0): 90, 103, 109, + (9,214,0): 102, 118, 118, + (9,215,0): 114, 130, 127, + (9,216,0): 116, 136, 127, + (9,217,0): 126, 146, 135, + (9,218,0): 131, 149, 137, + (9,219,0): 126, 142, 129, + (9,220,0): 118, 134, 121, + (9,221,0): 114, 128, 113, + (9,222,0): 102, 116, 101, + (9,223,0): 90, 101, 84, + (9,224,0): 89, 88, 67, + (9,225,0): 94, 88, 62, + (9,226,0): 97, 91, 67, + (10,0,0): 44, 45, 47, + (10,1,0): 44, 45, 47, + (10,2,0): 44, 45, 47, + (10,3,0): 44, 45, 47, + (10,4,0): 44, 45, 47, + (10,5,0): 44, 46, 45, + (10,6,0): 45, 45, 45, + (10,7,0): 45, 45, 45, + (10,8,0): 46, 45, 43, + (10,9,0): 46, 45, 43, + (10,10,0): 46, 45, 43, + (10,11,0): 45, 44, 42, + (10,12,0): 47, 43, 40, + (10,13,0): 46, 42, 39, + (10,14,0): 46, 42, 39, + (10,15,0): 46, 42, 39, + (10,16,0): 44, 43, 41, + (10,17,0): 44, 42, 43, + (10,18,0): 44, 42, 43, + (10,19,0): 44, 42, 43, + (10,20,0): 43, 41, 42, + (10,21,0): 43, 41, 42, + (10,22,0): 43, 41, 42, + (10,23,0): 43, 41, 42, + (10,24,0): 45, 43, 44, + (10,25,0): 45, 43, 44, + (10,26,0): 45, 43, 44, + (10,27,0): 45, 43, 44, + (10,28,0): 45, 43, 44, + (10,29,0): 45, 43, 44, + (10,30,0): 45, 43, 44, + (10,31,0): 45, 43, 44, + (10,32,0): 44, 42, 43, + (10,33,0): 44, 42, 43, + (10,34,0): 45, 43, 44, + (10,35,0): 45, 43, 44, + (10,36,0): 45, 43, 44, + (10,37,0): 46, 44, 45, + (10,38,0): 46, 44, 45, + (10,39,0): 46, 44, 45, + (10,40,0): 46, 44, 45, + (10,41,0): 46, 44, 45, + (10,42,0): 46, 44, 45, + (10,43,0): 47, 45, 46, + (10,44,0): 47, 45, 46, + (10,45,0): 47, 45, 46, + (10,46,0): 47, 45, 46, + (10,47,0): 47, 46, 44, + (10,48,0): 48, 44, 43, + (10,49,0): 48, 44, 43, + (10,50,0): 49, 45, 44, + (10,51,0): 50, 46, 45, + (10,52,0): 50, 46, 45, + (10,53,0): 50, 46, 45, + (10,54,0): 50, 46, 45, + (10,55,0): 49, 45, 44, + (10,56,0): 49, 45, 44, + (10,57,0): 49, 45, 44, + (10,58,0): 49, 45, 44, + (10,59,0): 49, 45, 44, + (10,60,0): 50, 46, 45, + (10,61,0): 51, 47, 46, + (10,62,0): 52, 48, 47, + (10,63,0): 53, 49, 46, + (10,64,0): 56, 48, 46, + (10,65,0): 57, 49, 46, + (10,66,0): 58, 50, 47, + (10,67,0): 59, 51, 48, + (10,68,0): 61, 51, 49, + (10,69,0): 61, 52, 47, + (10,70,0): 61, 52, 47, + (10,71,0): 61, 52, 47, + (10,72,0): 63, 52, 48, + (10,73,0): 63, 52, 46, + (10,74,0): 65, 52, 46, + (10,75,0): 65, 52, 46, + (10,76,0): 67, 54, 48, + (10,77,0): 68, 55, 49, + (10,78,0): 70, 57, 51, + (10,79,0): 71, 58, 52, + (10,80,0): 72, 59, 53, + (10,81,0): 74, 59, 54, + (10,82,0): 75, 60, 55, + (10,83,0): 78, 61, 54, + (10,84,0): 80, 59, 54, + (10,85,0): 83, 58, 53, + (10,86,0): 86, 55, 50, + (10,87,0): 91, 54, 46, + (10,88,0): 99, 54, 48, + (10,89,0): 107, 54, 46, + (10,90,0): 116, 53, 44, + (10,91,0): 125, 55, 47, + (10,92,0): 135, 57, 47, + (10,93,0): 141, 59, 48, + (10,94,0): 148, 60, 48, + (10,95,0): 150, 60, 49, + (10,96,0): 157, 63, 51, + (10,97,0): 160, 64, 52, + (10,98,0): 162, 64, 51, + (10,99,0): 168, 64, 51, + (10,100,0): 177, 67, 54, + (10,101,0): 186, 68, 56, + (10,102,0): 197, 69, 58, + (10,103,0): 205, 68, 58, + (10,104,0): 213, 70, 64, + (10,105,0): 215, 72, 64, + (10,106,0): 212, 73, 66, + (10,107,0): 204, 73, 63, + (10,108,0): 190, 69, 58, + (10,109,0): 174, 67, 51, + (10,110,0): 161, 66, 46, + (10,111,0): 156, 65, 46, + (10,112,0): 157, 66, 47, + (10,113,0): 156, 65, 46, + (10,114,0): 156, 63, 46, + (10,115,0): 155, 62, 45, + (10,116,0): 155, 62, 45, + (10,117,0): 155, 62, 45, + (10,118,0): 155, 62, 47, + (10,119,0): 155, 63, 48, + (10,120,0): 152, 60, 45, + (10,121,0): 150, 61, 45, + (10,122,0): 148, 60, 46, + (10,123,0): 147, 61, 46, + (10,124,0): 143, 62, 45, + (10,125,0): 140, 61, 44, + (10,126,0): 139, 60, 43, + (10,127,0): 138, 61, 43, + (10,128,0): 137, 60, 42, + (10,129,0): 137, 60, 42, + (10,130,0): 137, 60, 44, + (10,131,0): 135, 59, 43, + (10,132,0): 135, 59, 45, + (10,133,0): 133, 60, 45, + (10,134,0): 132, 58, 45, + (10,135,0): 131, 59, 45, + (10,136,0): 132, 60, 48, + (10,137,0): 130, 60, 48, + (10,138,0): 130, 60, 50, + (10,139,0): 130, 62, 51, + (10,140,0): 131, 63, 52, + (10,141,0): 133, 65, 56, + (10,142,0): 135, 67, 58, + (10,143,0): 136, 68, 57, + (10,144,0): 148, 74, 61, + (10,145,0): 151, 72, 59, + (10,146,0): 160, 72, 62, + (10,147,0): 172, 75, 68, + (10,148,0): 178, 75, 70, + (10,149,0): 179, 76, 71, + (10,150,0): 178, 83, 77, + (10,151,0): 174, 96, 86, + (10,152,0): 173, 115, 103, + (10,153,0): 166, 129, 113, + (10,154,0): 157, 140, 122, + (10,155,0): 145, 142, 123, + (10,156,0): 130, 137, 119, + (10,157,0): 115, 128, 111, + (10,158,0): 99, 113, 98, + (10,159,0): 88, 99, 85, + (10,160,0): 78, 82, 68, + (10,161,0): 77, 78, 64, + (10,162,0): 72, 73, 59, + (10,163,0): 68, 68, 56, + (10,164,0): 64, 64, 52, + (10,165,0): 57, 59, 46, + (10,166,0): 52, 54, 43, + (10,167,0): 47, 49, 38, + (10,168,0): 48, 49, 41, + (10,169,0): 48, 49, 41, + (10,170,0): 47, 48, 42, + (10,171,0): 47, 48, 42, + (10,172,0): 46, 47, 42, + (10,173,0): 46, 47, 42, + (10,174,0): 47, 47, 45, + (10,175,0): 47, 47, 45, + (10,176,0): 47, 47, 45, + (10,177,0): 46, 48, 45, + (10,178,0): 47, 47, 45, + (10,179,0): 47, 47, 45, + (10,180,0): 47, 47, 45, + (10,181,0): 47, 47, 45, + (10,182,0): 47, 47, 45, + (10,183,0): 47, 47, 45, + (10,184,0): 48, 48, 46, + (10,185,0): 48, 48, 46, + (10,186,0): 48, 48, 46, + (10,187,0): 48, 48, 46, + (10,188,0): 48, 48, 46, + (10,189,0): 48, 48, 46, + (10,190,0): 48, 48, 46, + (10,191,0): 49, 47, 50, + (10,192,0): 54, 43, 57, + (10,193,0): 55, 43, 57, + (10,194,0): 56, 47, 52, + (10,195,0): 59, 54, 51, + (10,196,0): 72, 69, 62, + (10,197,0): 95, 94, 89, + (10,198,0): 122, 122, 124, + (10,199,0): 139, 141, 154, + (10,200,0): 144, 148, 177, + (10,201,0): 146, 151, 191, + (10,202,0): 143, 149, 199, + (10,203,0): 132, 142, 195, + (10,204,0): 125, 137, 187, + (10,205,0): 123, 137, 182, + (10,206,0): 124, 139, 178, + (10,207,0): 125, 140, 171, + (10,208,0): 125, 136, 154, + (10,209,0): 119, 131, 143, + (10,210,0): 113, 126, 135, + (10,211,0): 110, 125, 130, + (10,212,0): 110, 126, 126, + (10,213,0): 111, 130, 126, + (10,214,0): 121, 142, 133, + (10,215,0): 131, 153, 141, + (10,216,0): 139, 161, 148, + (10,217,0): 145, 168, 152, + (10,218,0): 144, 165, 148, + (10,219,0): 136, 157, 138, + (10,220,0): 131, 150, 131, + (10,221,0): 124, 141, 123, + (10,222,0): 106, 123, 105, + (10,223,0): 92, 104, 84, + (10,224,0): 86, 86, 62, + (10,225,0): 91, 87, 58, + (10,226,0): 93, 89, 62, + (11,0,0): 45, 46, 48, + (11,1,0): 45, 46, 48, + (11,2,0): 45, 46, 48, + (11,3,0): 45, 46, 48, + (11,4,0): 45, 46, 48, + (11,5,0): 45, 46, 48, + (11,6,0): 46, 46, 46, + (11,7,0): 46, 46, 46, + (11,8,0): 46, 45, 43, + (11,9,0): 46, 45, 43, + (11,10,0): 45, 44, 42, + (11,11,0): 45, 44, 42, + (11,12,0): 46, 42, 39, + (11,13,0): 46, 42, 39, + (11,14,0): 46, 42, 39, + (11,15,0): 46, 42, 41, + (11,16,0): 44, 42, 43, + (11,17,0): 43, 41, 42, + (11,18,0): 43, 41, 42, + (11,19,0): 43, 41, 42, + (11,20,0): 43, 41, 42, + (11,21,0): 42, 40, 41, + (11,22,0): 42, 40, 41, + (11,23,0): 42, 40, 41, + (11,24,0): 44, 42, 43, + (11,25,0): 44, 42, 43, + (11,26,0): 44, 42, 43, + (11,27,0): 44, 42, 43, + (11,28,0): 44, 42, 43, + (11,29,0): 44, 42, 43, + (11,30,0): 44, 42, 43, + (11,31,0): 44, 42, 43, + (11,32,0): 44, 42, 43, + (11,33,0): 44, 42, 43, + (11,34,0): 44, 42, 43, + (11,35,0): 44, 42, 43, + (11,36,0): 44, 42, 43, + (11,37,0): 45, 43, 44, + (11,38,0): 45, 43, 44, + (11,39,0): 45, 43, 44, + (11,40,0): 45, 43, 44, + (11,41,0): 46, 44, 45, + (11,42,0): 46, 44, 45, + (11,43,0): 46, 44, 45, + (11,44,0): 46, 44, 45, + (11,45,0): 47, 45, 46, + (11,46,0): 47, 45, 46, + (11,47,0): 47, 45, 46, + (11,48,0): 47, 43, 42, + (11,49,0): 48, 44, 43, + (11,50,0): 49, 45, 44, + (11,51,0): 49, 45, 44, + (11,52,0): 49, 45, 44, + (11,53,0): 49, 45, 44, + (11,54,0): 48, 44, 43, + (11,55,0): 48, 44, 43, + (11,56,0): 48, 44, 43, + (11,57,0): 48, 44, 43, + (11,58,0): 48, 44, 43, + (11,59,0): 48, 44, 43, + (11,60,0): 49, 45, 44, + (11,61,0): 50, 46, 45, + (11,62,0): 51, 47, 46, + (11,63,0): 52, 48, 47, + (11,64,0): 57, 49, 47, + (11,65,0): 58, 50, 48, + (11,66,0): 59, 51, 49, + (11,67,0): 60, 52, 49, + (11,68,0): 61, 51, 49, + (11,69,0): 61, 51, 49, + (11,70,0): 61, 51, 49, + (11,71,0): 61, 52, 47, + (11,72,0): 62, 51, 47, + (11,73,0): 62, 51, 47, + (11,74,0): 64, 50, 47, + (11,75,0): 64, 51, 45, + (11,76,0): 65, 52, 46, + (11,77,0): 67, 54, 48, + (11,78,0): 68, 55, 49, + (11,79,0): 69, 56, 50, + (11,80,0): 70, 57, 51, + (11,81,0): 72, 57, 52, + (11,82,0): 73, 58, 53, + (11,83,0): 74, 59, 54, + (11,84,0): 76, 58, 54, + (11,85,0): 78, 57, 52, + (11,86,0): 81, 56, 51, + (11,87,0): 84, 53, 48, + (11,88,0): 94, 55, 50, + (11,89,0): 101, 54, 48, + (11,90,0): 111, 54, 47, + (11,91,0): 120, 56, 47, + (11,92,0): 130, 57, 48, + (11,93,0): 138, 58, 47, + (11,94,0): 144, 60, 49, + (11,95,0): 148, 62, 49, + (11,96,0): 153, 63, 52, + (11,97,0): 155, 63, 52, + (11,98,0): 155, 63, 50, + (11,99,0): 159, 63, 49, + (11,100,0): 165, 65, 50, + (11,101,0): 174, 66, 53, + (11,102,0): 184, 68, 55, + (11,103,0): 191, 69, 58, + (11,104,0): 199, 71, 62, + (11,105,0): 203, 72, 64, + (11,106,0): 202, 74, 65, + (11,107,0): 195, 73, 62, + (11,108,0): 182, 70, 58, + (11,109,0): 170, 66, 53, + (11,110,0): 158, 65, 48, + (11,111,0): 153, 64, 46, + (11,112,0): 153, 65, 45, + (11,113,0): 153, 65, 45, + (11,114,0): 152, 63, 45, + (11,115,0): 151, 62, 44, + (11,116,0): 151, 62, 44, + (11,117,0): 153, 62, 44, + (11,118,0): 153, 61, 46, + (11,119,0): 151, 62, 46, + (11,120,0): 149, 60, 44, + (11,121,0): 148, 61, 44, + (11,122,0): 147, 61, 46, + (11,123,0): 144, 61, 45, + (11,124,0): 142, 61, 44, + (11,125,0): 138, 61, 43, + (11,126,0): 138, 61, 45, + (11,127,0): 137, 60, 44, + (11,128,0): 136, 59, 41, + (11,129,0): 136, 59, 41, + (11,130,0): 135, 59, 43, + (11,131,0): 135, 59, 43, + (11,132,0): 132, 59, 44, + (11,133,0): 132, 59, 44, + (11,134,0): 131, 59, 45, + (11,135,0): 128, 59, 44, + (11,136,0): 129, 59, 47, + (11,137,0): 128, 60, 49, + (11,138,0): 128, 60, 49, + (11,139,0): 129, 62, 53, + (11,140,0): 131, 64, 55, + (11,141,0): 131, 67, 58, + (11,142,0): 135, 68, 60, + (11,143,0): 136, 69, 60, + (11,144,0): 148, 76, 64, + (11,145,0): 150, 72, 60, + (11,146,0): 158, 71, 62, + (11,147,0): 167, 74, 67, + (11,148,0): 174, 76, 73, + (11,149,0): 174, 81, 76, + (11,150,0): 173, 93, 86, + (11,151,0): 170, 106, 94, + (11,152,0): 167, 128, 111, + (11,153,0): 161, 143, 121, + (11,154,0): 154, 154, 130, + (11,155,0): 143, 155, 131, + (11,156,0): 134, 149, 128, + (11,157,0): 122, 139, 120, + (11,158,0): 109, 123, 106, + (11,159,0): 98, 109, 93, + (11,160,0): 83, 90, 74, + (11,161,0): 81, 85, 70, + (11,162,0): 75, 79, 64, + (11,163,0): 69, 73, 58, + (11,164,0): 64, 68, 54, + (11,165,0): 59, 61, 48, + (11,166,0): 53, 55, 44, + (11,167,0): 49, 51, 40, + (11,168,0): 48, 49, 41, + (11,169,0): 47, 48, 40, + (11,170,0): 46, 47, 41, + (11,171,0): 46, 45, 40, + (11,172,0): 46, 45, 41, + (11,173,0): 46, 45, 41, + (11,174,0): 47, 46, 44, + (11,175,0): 48, 47, 45, + (11,176,0): 47, 46, 44, + (11,177,0): 47, 46, 44, + (11,178,0): 47, 46, 44, + (11,179,0): 47, 46, 44, + (11,180,0): 47, 46, 44, + (11,181,0): 46, 46, 44, + (11,182,0): 47, 46, 44, + (11,183,0): 46, 46, 44, + (11,184,0): 48, 47, 45, + (11,185,0): 47, 47, 45, + (11,186,0): 48, 47, 45, + (11,187,0): 47, 47, 45, + (11,188,0): 47, 47, 45, + (11,189,0): 47, 47, 45, + (11,190,0): 47, 47, 45, + (11,191,0): 50, 45, 49, + (11,192,0): 55, 44, 58, + (11,193,0): 54, 42, 56, + (11,194,0): 51, 45, 49, + (11,195,0): 57, 54, 49, + (11,196,0): 72, 74, 63, + (11,197,0): 98, 102, 88, + (11,198,0): 123, 128, 122, + (11,199,0): 139, 144, 147, + (11,200,0): 141, 147, 163, + (11,201,0): 143, 150, 176, + (11,202,0): 140, 149, 182, + (11,203,0): 131, 144, 178, + (11,204,0): 129, 144, 175, + (11,205,0): 133, 153, 178, + (11,206,0): 141, 164, 182, + (11,207,0): 146, 168, 179, + (11,208,0): 147, 168, 171, + (11,209,0): 144, 164, 163, + (11,210,0): 140, 160, 158, + (11,211,0): 135, 158, 152, + (11,212,0): 130, 153, 143, + (11,213,0): 125, 152, 137, + (11,214,0): 129, 156, 139, + (11,215,0): 136, 163, 144, + (11,216,0): 148, 176, 154, + (11,217,0): 152, 177, 155, + (11,218,0): 148, 173, 151, + (11,219,0): 139, 163, 141, + (11,220,0): 133, 155, 132, + (11,221,0): 127, 146, 124, + (11,222,0): 107, 124, 105, + (11,223,0): 88, 102, 79, + (11,224,0): 83, 86, 59, + (11,225,0): 89, 85, 56, + (11,226,0): 90, 86, 57, + (12,0,0): 43, 47, 50, + (12,1,0): 43, 47, 50, + (12,2,0): 43, 47, 50, + (12,3,0): 43, 47, 50, + (12,4,0): 45, 46, 48, + (12,5,0): 45, 46, 48, + (12,6,0): 46, 46, 46, + (12,7,0): 46, 46, 46, + (12,8,0): 45, 45, 45, + (12,9,0): 45, 45, 45, + (12,10,0): 46, 45, 43, + (12,11,0): 45, 44, 42, + (12,12,0): 45, 44, 42, + (12,13,0): 44, 43, 41, + (12,14,0): 44, 43, 41, + (12,15,0): 44, 43, 41, + (12,16,0): 44, 42, 43, + (12,17,0): 44, 42, 43, + (12,18,0): 44, 42, 43, + (12,19,0): 43, 41, 42, + (12,20,0): 43, 41, 42, + (12,21,0): 42, 40, 41, + (12,22,0): 42, 40, 41, + (12,23,0): 42, 40, 41, + (12,24,0): 44, 42, 43, + (12,25,0): 44, 42, 43, + (12,26,0): 44, 42, 43, + (12,27,0): 44, 42, 43, + (12,28,0): 44, 42, 43, + (12,29,0): 44, 42, 43, + (12,30,0): 44, 42, 43, + (12,31,0): 44, 42, 43, + (12,32,0): 44, 42, 43, + (12,33,0): 44, 42, 43, + (12,34,0): 44, 42, 43, + (12,35,0): 44, 42, 43, + (12,36,0): 44, 42, 43, + (12,37,0): 43, 41, 42, + (12,38,0): 43, 41, 42, + (12,39,0): 43, 41, 42, + (12,40,0): 44, 42, 43, + (12,41,0): 45, 43, 44, + (12,42,0): 45, 43, 44, + (12,43,0): 46, 44, 45, + (12,44,0): 46, 44, 45, + (12,45,0): 47, 45, 46, + (12,46,0): 47, 45, 46, + (12,47,0): 47, 45, 46, + (12,48,0): 47, 43, 42, + (12,49,0): 48, 44, 43, + (12,50,0): 48, 44, 43, + (12,51,0): 48, 44, 43, + (12,52,0): 48, 44, 43, + (12,53,0): 48, 44, 43, + (12,54,0): 47, 43, 42, + (12,55,0): 46, 42, 41, + (12,56,0): 47, 43, 42, + (12,57,0): 47, 43, 42, + (12,58,0): 47, 43, 42, + (12,59,0): 47, 43, 42, + (12,60,0): 48, 44, 43, + (12,61,0): 49, 45, 44, + (12,62,0): 51, 47, 46, + (12,63,0): 52, 48, 47, + (12,64,0): 57, 48, 49, + (12,65,0): 58, 50, 48, + (12,66,0): 59, 51, 49, + (12,67,0): 60, 52, 50, + (12,68,0): 61, 51, 50, + (12,69,0): 61, 51, 49, + (12,70,0): 60, 50, 48, + (12,71,0): 60, 50, 48, + (12,72,0): 61, 50, 48, + (12,73,0): 61, 50, 46, + (12,74,0): 63, 49, 46, + (12,75,0): 63, 49, 46, + (12,76,0): 64, 50, 47, + (12,77,0): 65, 51, 48, + (12,78,0): 66, 53, 47, + (12,79,0): 67, 54, 48, + (12,80,0): 68, 54, 51, + (12,81,0): 67, 56, 52, + (12,82,0): 68, 57, 53, + (12,83,0): 69, 58, 54, + (12,84,0): 71, 57, 54, + (12,85,0): 72, 57, 52, + (12,86,0): 75, 56, 52, + (12,87,0): 78, 53, 48, + (12,88,0): 88, 55, 50, + (12,89,0): 95, 54, 48, + (12,90,0): 105, 55, 48, + (12,91,0): 114, 55, 47, + (12,92,0): 125, 58, 49, + (12,93,0): 134, 60, 49, + (12,94,0): 140, 62, 50, + (12,95,0): 144, 62, 50, + (12,96,0): 151, 64, 54, + (12,97,0): 151, 63, 53, + (12,98,0): 151, 63, 53, + (12,99,0): 151, 63, 51, + (12,100,0): 156, 64, 51, + (12,101,0): 163, 67, 53, + (12,102,0): 171, 67, 54, + (12,103,0): 179, 69, 56, + (12,104,0): 186, 69, 59, + (12,105,0): 189, 71, 61, + (12,106,0): 190, 72, 62, + (12,107,0): 185, 71, 61, + (12,108,0): 176, 68, 56, + (12,109,0): 166, 65, 53, + (12,110,0): 155, 63, 48, + (12,111,0): 151, 64, 47, + (12,112,0): 151, 64, 45, + (12,113,0): 151, 64, 45, + (12,114,0): 150, 63, 46, + (12,115,0): 149, 62, 45, + (12,116,0): 148, 61, 44, + (12,117,0): 149, 60, 44, + (12,118,0): 150, 61, 47, + (12,119,0): 150, 61, 47, + (12,120,0): 149, 60, 46, + (12,121,0): 147, 59, 45, + (12,122,0): 146, 60, 47, + (12,123,0): 142, 60, 46, + (12,124,0): 139, 60, 45, + (12,125,0): 137, 60, 44, + (12,126,0): 137, 60, 44, + (12,127,0): 136, 60, 44, + (12,128,0): 135, 59, 43, + (12,129,0): 134, 58, 42, + (12,130,0): 134, 58, 42, + (12,131,0): 134, 58, 42, + (12,132,0): 131, 58, 43, + (12,133,0): 131, 58, 43, + (12,134,0): 130, 58, 44, + (12,135,0): 128, 58, 46, + (12,136,0): 128, 58, 48, + (12,137,0): 128, 60, 49, + (12,138,0): 128, 61, 52, + (12,139,0): 127, 63, 54, + (12,140,0): 130, 66, 57, + (12,141,0): 131, 68, 61, + (12,142,0): 135, 70, 64, + (12,143,0): 136, 72, 63, + (12,144,0): 145, 75, 65, + (12,145,0): 146, 72, 61, + (12,146,0): 154, 71, 63, + (12,147,0): 163, 76, 69, + (12,148,0): 168, 80, 76, + (12,149,0): 168, 88, 81, + (12,150,0): 169, 102, 93, + (12,151,0): 166, 118, 104, + (12,152,0): 162, 140, 119, + (12,153,0): 155, 153, 128, + (12,154,0): 149, 164, 135, + (12,155,0): 140, 163, 135, + (12,156,0): 134, 157, 131, + (12,157,0): 126, 145, 125, + (12,158,0): 116, 130, 113, + (12,159,0): 106, 117, 101, + (12,160,0): 92, 101, 82, + (12,161,0): 86, 95, 76, + (12,162,0): 78, 85, 67, + (12,163,0): 69, 76, 58, + (12,164,0): 63, 70, 54, + (12,165,0): 60, 64, 50, + (12,166,0): 55, 58, 47, + (12,167,0): 54, 56, 45, + (12,168,0): 48, 49, 41, + (12,169,0): 48, 48, 40, + (12,170,0): 46, 45, 40, + (12,171,0): 47, 44, 39, + (12,172,0): 47, 43, 40, + (12,173,0): 47, 43, 42, + (12,174,0): 49, 45, 44, + (12,175,0): 50, 46, 45, + (12,176,0): 49, 45, 44, + (12,177,0): 49, 45, 44, + (12,178,0): 49, 45, 44, + (12,179,0): 49, 45, 44, + (12,180,0): 49, 45, 44, + (12,181,0): 47, 46, 44, + (12,182,0): 49, 45, 44, + (12,183,0): 47, 46, 44, + (12,184,0): 50, 46, 45, + (12,185,0): 48, 47, 45, + (12,186,0): 50, 46, 45, + (12,187,0): 48, 47, 45, + (12,188,0): 48, 47, 45, + (12,189,0): 48, 47, 45, + (12,190,0): 48, 47, 45, + (12,191,0): 50, 45, 49, + (12,192,0): 56, 44, 58, + (12,193,0): 53, 41, 53, + (12,194,0): 49, 43, 43, + (12,195,0): 54, 54, 44, + (12,196,0): 71, 76, 56, + (12,197,0): 96, 104, 81, + (12,198,0): 122, 131, 112, + (12,199,0): 136, 146, 135, + (12,200,0): 141, 151, 150, + (12,201,0): 143, 154, 160, + (12,202,0): 141, 153, 165, + (12,203,0): 134, 150, 163, + (12,204,0): 135, 155, 162, + (12,205,0): 144, 170, 169, + (12,206,0): 155, 185, 177, + (12,207,0): 160, 192, 179, + (12,208,0): 152, 183, 168, + (12,209,0): 154, 182, 167, + (12,210,0): 155, 183, 168, + (12,211,0): 152, 183, 165, + (12,212,0): 145, 177, 156, + (12,213,0): 137, 171, 146, + (12,214,0): 137, 171, 144, + (12,215,0): 144, 177, 148, + (12,216,0): 146, 179, 150, + (12,217,0): 149, 180, 149, + (12,218,0): 144, 173, 143, + (12,219,0): 136, 162, 133, + (12,220,0): 132, 155, 129, + (12,221,0): 123, 146, 120, + (12,222,0): 103, 122, 100, + (12,223,0): 84, 98, 73, + (12,224,0): 81, 84, 57, + (12,225,0): 85, 84, 56, + (12,226,0): 86, 85, 57, + (13,0,0): 44, 48, 51, + (13,1,0): 44, 48, 51, + (13,2,0): 44, 48, 51, + (13,3,0): 44, 48, 51, + (13,4,0): 46, 47, 49, + (13,5,0): 46, 47, 49, + (13,6,0): 47, 47, 47, + (13,7,0): 47, 47, 47, + (13,8,0): 46, 46, 46, + (13,9,0): 46, 46, 46, + (13,10,0): 47, 46, 44, + (13,11,0): 46, 45, 43, + (13,12,0): 46, 45, 43, + (13,13,0): 46, 45, 43, + (13,14,0): 45, 44, 42, + (13,15,0): 45, 44, 42, + (13,16,0): 45, 43, 44, + (13,17,0): 45, 43, 44, + (13,18,0): 45, 43, 44, + (13,19,0): 44, 42, 43, + (13,20,0): 43, 41, 42, + (13,21,0): 42, 40, 41, + (13,22,0): 42, 40, 41, + (13,23,0): 42, 40, 41, + (13,24,0): 43, 41, 42, + (13,25,0): 43, 41, 42, + (13,26,0): 43, 41, 42, + (13,27,0): 43, 41, 42, + (13,28,0): 43, 41, 42, + (13,29,0): 43, 41, 42, + (13,30,0): 43, 41, 42, + (13,31,0): 43, 41, 42, + (13,32,0): 44, 42, 43, + (13,33,0): 44, 42, 43, + (13,34,0): 43, 41, 42, + (13,35,0): 43, 41, 42, + (13,36,0): 43, 41, 42, + (13,37,0): 42, 40, 41, + (13,38,0): 42, 40, 41, + (13,39,0): 42, 40, 41, + (13,40,0): 44, 42, 43, + (13,41,0): 44, 42, 43, + (13,42,0): 44, 42, 43, + (13,43,0): 45, 43, 44, + (13,44,0): 46, 44, 45, + (13,45,0): 46, 44, 45, + (13,46,0): 47, 45, 46, + (13,47,0): 47, 45, 46, + (13,48,0): 47, 43, 42, + (13,49,0): 47, 43, 42, + (13,50,0): 48, 44, 43, + (13,51,0): 48, 44, 43, + (13,52,0): 47, 43, 42, + (13,53,0): 47, 43, 42, + (13,54,0): 46, 42, 41, + (13,55,0): 45, 41, 40, + (13,56,0): 48, 44, 43, + (13,57,0): 48, 44, 43, + (13,58,0): 47, 43, 42, + (13,59,0): 48, 44, 43, + (13,60,0): 49, 45, 44, + (13,61,0): 50, 46, 45, + (13,62,0): 51, 47, 46, + (13,63,0): 52, 48, 47, + (13,64,0): 58, 49, 50, + (13,65,0): 58, 49, 50, + (13,66,0): 59, 51, 49, + (13,67,0): 60, 52, 50, + (13,68,0): 61, 51, 50, + (13,69,0): 60, 50, 49, + (13,70,0): 60, 50, 48, + (13,71,0): 59, 49, 47, + (13,72,0): 61, 50, 48, + (13,73,0): 60, 49, 47, + (13,74,0): 62, 48, 45, + (13,75,0): 62, 48, 45, + (13,76,0): 63, 49, 46, + (13,77,0): 64, 50, 47, + (13,78,0): 65, 52, 46, + (13,79,0): 63, 52, 46, + (13,80,0): 64, 53, 49, + (13,81,0): 64, 55, 50, + (13,82,0): 64, 57, 51, + (13,83,0): 65, 58, 52, + (13,84,0): 66, 57, 52, + (13,85,0): 67, 56, 52, + (13,86,0): 70, 55, 52, + (13,87,0): 72, 53, 47, + (13,88,0): 81, 53, 49, + (13,89,0): 88, 53, 47, + (13,90,0): 97, 54, 47, + (13,91,0): 108, 56, 45, + (13,92,0): 117, 57, 46, + (13,93,0): 128, 60, 47, + (13,94,0): 134, 62, 48, + (13,95,0): 139, 61, 49, + (13,96,0): 147, 63, 53, + (13,97,0): 149, 62, 53, + (13,98,0): 147, 63, 53, + (13,99,0): 147, 63, 52, + (13,100,0): 149, 66, 52, + (13,101,0): 154, 66, 52, + (13,102,0): 160, 67, 52, + (13,103,0): 165, 68, 52, + (13,104,0): 172, 66, 53, + (13,105,0): 176, 68, 56, + (13,106,0): 180, 69, 58, + (13,107,0): 177, 69, 59, + (13,108,0): 170, 66, 55, + (13,109,0): 161, 63, 52, + (13,110,0): 154, 62, 49, + (13,111,0): 150, 62, 48, + (13,112,0): 149, 63, 46, + (13,113,0): 148, 63, 43, + (13,114,0): 147, 61, 44, + (13,115,0): 147, 61, 44, + (13,116,0): 147, 60, 43, + (13,117,0): 147, 60, 43, + (13,118,0): 148, 60, 46, + (13,119,0): 148, 60, 46, + (13,120,0): 147, 59, 45, + (13,121,0): 146, 60, 45, + (13,122,0): 143, 60, 46, + (13,123,0): 141, 59, 45, + (13,124,0): 138, 59, 44, + (13,125,0): 137, 60, 44, + (13,126,0): 135, 59, 43, + (13,127,0): 135, 59, 43, + (13,128,0): 134, 58, 42, + (13,129,0): 134, 58, 42, + (13,130,0): 133, 57, 41, + (13,131,0): 131, 58, 41, + (13,132,0): 131, 58, 43, + (13,133,0): 129, 57, 42, + (13,134,0): 127, 57, 45, + (13,135,0): 127, 57, 45, + (13,136,0): 128, 60, 49, + (13,137,0): 127, 60, 51, + (13,138,0): 127, 63, 54, + (13,139,0): 128, 65, 56, + (13,140,0): 130, 67, 60, + (13,141,0): 133, 70, 63, + (13,142,0): 136, 73, 66, + (13,143,0): 138, 73, 67, + (13,144,0): 142, 74, 65, + (13,145,0): 144, 71, 62, + (13,146,0): 151, 72, 67, + (13,147,0): 159, 78, 74, + (13,148,0): 167, 86, 82, + (13,149,0): 167, 96, 90, + (13,150,0): 169, 112, 101, + (13,151,0): 164, 131, 114, + (13,152,0): 156, 148, 125, + (13,153,0): 150, 161, 131, + (13,154,0): 143, 168, 138, + (13,155,0): 136, 167, 136, + (13,156,0): 131, 160, 132, + (13,157,0): 126, 150, 126, + (13,158,0): 121, 136, 117, + (13,159,0): 112, 123, 106, + (13,160,0): 100, 112, 92, + (13,161,0): 93, 105, 83, + (13,162,0): 82, 94, 74, + (13,163,0): 74, 83, 64, + (13,164,0): 66, 75, 58, + (13,165,0): 62, 69, 53, + (13,166,0): 58, 64, 50, + (13,167,0): 57, 60, 49, + (13,168,0): 51, 52, 44, + (13,169,0): 50, 50, 42, + (13,170,0): 49, 46, 41, + (13,171,0): 47, 44, 39, + (13,172,0): 47, 41, 41, + (13,173,0): 48, 42, 42, + (13,174,0): 49, 43, 43, + (13,175,0): 50, 44, 44, + (13,176,0): 49, 43, 43, + (13,177,0): 49, 43, 43, + (13,178,0): 49, 43, 43, + (13,179,0): 49, 43, 43, + (13,180,0): 49, 43, 43, + (13,181,0): 48, 44, 43, + (13,182,0): 48, 44, 43, + (13,183,0): 48, 44, 43, + (13,184,0): 49, 45, 44, + (13,185,0): 49, 45, 44, + (13,186,0): 49, 45, 44, + (13,187,0): 49, 45, 44, + (13,188,0): 47, 46, 44, + (13,189,0): 47, 46, 44, + (13,190,0): 47, 46, 44, + (13,191,0): 50, 44, 46, + (13,192,0): 56, 42, 55, + (13,193,0): 53, 40, 49, + (13,194,0): 51, 43, 40, + (13,195,0): 53, 54, 38, + (13,196,0): 69, 75, 49, + (13,197,0): 92, 103, 71, + (13,198,0): 117, 130, 100, + (13,199,0): 134, 147, 121, + (13,200,0): 142, 155, 138, + (13,201,0): 145, 158, 148, + (13,202,0): 144, 159, 154, + (13,203,0): 139, 158, 152, + (13,204,0): 141, 165, 151, + (13,205,0): 151, 180, 158, + (13,206,0): 162, 197, 165, + (13,207,0): 169, 206, 173, + (13,208,0): 165, 201, 173, + (13,209,0): 166, 202, 176, + (13,210,0): 167, 203, 177, + (13,211,0): 164, 200, 172, + (13,212,0): 151, 190, 159, + (13,213,0): 139, 179, 145, + (13,214,0): 136, 176, 141, + (13,215,0): 141, 178, 144, + (13,216,0): 142, 178, 142, + (13,217,0): 144, 178, 143, + (13,218,0): 141, 172, 138, + (13,219,0): 132, 161, 130, + (13,220,0): 128, 153, 123, + (13,221,0): 119, 142, 114, + (13,222,0): 100, 120, 93, + (13,223,0): 81, 95, 69, + (13,224,0): 77, 81, 54, + (13,225,0): 81, 81, 53, + (13,226,0): 82, 81, 53, + (14,0,0): 44, 48, 51, + (14,1,0): 44, 48, 51, + (14,2,0): 44, 48, 51, + (14,3,0): 44, 48, 51, + (14,4,0): 46, 47, 49, + (14,5,0): 46, 47, 49, + (14,6,0): 46, 47, 49, + (14,7,0): 46, 47, 49, + (14,8,0): 47, 47, 47, + (14,9,0): 47, 47, 47, + (14,10,0): 47, 47, 47, + (14,11,0): 47, 47, 47, + (14,12,0): 47, 46, 44, + (14,13,0): 47, 46, 44, + (14,14,0): 46, 45, 43, + (14,15,0): 46, 45, 43, + (14,16,0): 47, 45, 46, + (14,17,0): 46, 44, 45, + (14,18,0): 46, 44, 45, + (14,19,0): 45, 43, 44, + (14,20,0): 44, 42, 43, + (14,21,0): 43, 41, 42, + (14,22,0): 43, 41, 42, + (14,23,0): 42, 40, 41, + (14,24,0): 43, 41, 42, + (14,25,0): 43, 41, 42, + (14,26,0): 43, 41, 42, + (14,27,0): 43, 41, 42, + (14,28,0): 43, 41, 42, + (14,29,0): 43, 41, 42, + (14,30,0): 43, 41, 42, + (14,31,0): 43, 41, 42, + (14,32,0): 43, 41, 42, + (14,33,0): 43, 41, 42, + (14,34,0): 43, 41, 42, + (14,35,0): 42, 40, 41, + (14,36,0): 42, 40, 41, + (14,37,0): 42, 40, 41, + (14,38,0): 41, 39, 40, + (14,39,0): 41, 39, 40, + (14,40,0): 43, 41, 42, + (14,41,0): 43, 41, 42, + (14,42,0): 44, 42, 43, + (14,43,0): 45, 43, 44, + (14,44,0): 46, 44, 45, + (14,45,0): 46, 44, 45, + (14,46,0): 47, 45, 46, + (14,47,0): 47, 45, 46, + (14,48,0): 47, 43, 42, + (14,49,0): 47, 43, 42, + (14,50,0): 47, 43, 42, + (14,51,0): 47, 43, 42, + (14,52,0): 47, 43, 42, + (14,53,0): 46, 42, 41, + (14,54,0): 45, 41, 40, + (14,55,0): 44, 40, 39, + (14,56,0): 48, 44, 43, + (14,57,0): 48, 44, 43, + (14,58,0): 48, 44, 43, + (14,59,0): 48, 44, 43, + (14,60,0): 49, 45, 44, + (14,61,0): 50, 46, 45, + (14,62,0): 52, 48, 47, + (14,63,0): 52, 48, 47, + (14,64,0): 58, 49, 50, + (14,65,0): 59, 50, 51, + (14,66,0): 59, 50, 51, + (14,67,0): 60, 51, 52, + (14,68,0): 61, 51, 50, + (14,69,0): 60, 50, 49, + (14,70,0): 60, 50, 49, + (14,71,0): 59, 49, 48, + (14,72,0): 60, 49, 47, + (14,73,0): 60, 49, 47, + (14,74,0): 62, 48, 47, + (14,75,0): 61, 47, 46, + (14,76,0): 62, 48, 45, + (14,77,0): 62, 48, 45, + (14,78,0): 63, 49, 46, + (14,79,0): 62, 51, 47, + (14,80,0): 61, 54, 48, + (14,81,0): 59, 54, 48, + (14,82,0): 59, 56, 51, + (14,83,0): 60, 57, 52, + (14,84,0): 61, 58, 53, + (14,85,0): 62, 57, 51, + (14,86,0): 64, 55, 50, + (14,87,0): 67, 54, 48, + (14,88,0): 71, 52, 46, + (14,89,0): 79, 52, 43, + (14,90,0): 89, 52, 43, + (14,91,0): 100, 53, 43, + (14,92,0): 110, 56, 44, + (14,93,0): 120, 58, 45, + (14,94,0): 127, 59, 46, + (14,95,0): 133, 59, 46, + (14,96,0): 143, 60, 52, + (14,97,0): 145, 60, 53, + (14,98,0): 144, 62, 51, + (14,99,0): 143, 64, 51, + (14,100,0): 144, 65, 50, + (14,101,0): 147, 66, 49, + (14,102,0): 151, 65, 50, + (14,103,0): 153, 64, 48, + (14,104,0): 160, 62, 49, + (14,105,0): 166, 64, 52, + (14,106,0): 170, 66, 55, + (14,107,0): 170, 66, 57, + (14,108,0): 165, 64, 54, + (14,109,0): 159, 62, 53, + (14,110,0): 151, 61, 50, + (14,111,0): 149, 63, 50, + (14,112,0): 146, 63, 45, + (14,113,0): 146, 63, 45, + (14,114,0): 145, 62, 44, + (14,115,0): 144, 61, 43, + (14,116,0): 145, 59, 42, + (14,117,0): 145, 59, 42, + (14,118,0): 146, 60, 45, + (14,119,0): 146, 60, 45, + (14,120,0): 145, 59, 46, + (14,121,0): 145, 59, 46, + (14,122,0): 142, 59, 45, + (14,123,0): 141, 59, 45, + (14,124,0): 138, 59, 46, + (14,125,0): 136, 58, 45, + (14,126,0): 134, 58, 44, + (14,127,0): 132, 59, 44, + (14,128,0): 133, 57, 41, + (14,129,0): 133, 57, 41, + (14,130,0): 131, 58, 41, + (14,131,0): 130, 57, 40, + (14,132,0): 130, 57, 42, + (14,133,0): 129, 57, 42, + (14,134,0): 126, 56, 44, + (14,135,0): 126, 56, 44, + (14,136,0): 128, 60, 49, + (14,137,0): 128, 61, 52, + (14,138,0): 128, 64, 55, + (14,139,0): 129, 66, 57, + (14,140,0): 132, 69, 62, + (14,141,0): 133, 73, 65, + (14,142,0): 136, 75, 70, + (14,143,0): 140, 77, 70, + (14,144,0): 140, 73, 65, + (14,145,0): 142, 72, 64, + (14,146,0): 152, 74, 70, + (14,147,0): 161, 83, 79, + (14,148,0): 168, 93, 88, + (14,149,0): 169, 104, 98, + (14,150,0): 169, 123, 110, + (14,151,0): 164, 142, 121, + (14,152,0): 153, 156, 129, + (14,153,0): 146, 167, 134, + (14,154,0): 137, 172, 139, + (14,155,0): 130, 170, 136, + (14,156,0): 128, 161, 132, + (14,157,0): 127, 153, 128, + (14,158,0): 126, 139, 119, + (14,159,0): 120, 129, 110, + (14,160,0): 106, 120, 97, + (14,161,0): 100, 114, 91, + (14,162,0): 90, 104, 81, + (14,163,0): 81, 93, 73, + (14,164,0): 73, 84, 67, + (14,165,0): 67, 76, 59, + (14,166,0): 62, 68, 54, + (14,167,0): 60, 63, 52, + (14,168,0): 54, 55, 47, + (14,169,0): 52, 52, 44, + (14,170,0): 51, 48, 43, + (14,171,0): 48, 43, 39, + (14,172,0): 49, 40, 41, + (14,173,0): 49, 40, 41, + (14,174,0): 50, 41, 42, + (14,175,0): 52, 43, 44, + (14,176,0): 50, 41, 42, + (14,177,0): 50, 41, 42, + (14,178,0): 50, 41, 42, + (14,179,0): 50, 41, 42, + (14,180,0): 50, 41, 42, + (14,181,0): 48, 42, 42, + (14,182,0): 48, 42, 42, + (14,183,0): 48, 42, 42, + (14,184,0): 49, 43, 43, + (14,185,0): 49, 43, 43, + (14,186,0): 48, 44, 43, + (14,187,0): 48, 44, 43, + (14,188,0): 48, 44, 43, + (14,189,0): 48, 44, 43, + (14,190,0): 48, 44, 43, + (14,191,0): 49, 43, 45, + (14,192,0): 54, 41, 50, + (14,193,0): 53, 41, 45, + (14,194,0): 52, 45, 37, + (14,195,0): 52, 54, 33, + (14,196,0): 65, 72, 38, + (14,197,0): 87, 99, 59, + (14,198,0): 113, 128, 87, + (14,199,0): 130, 146, 109, + (14,200,0): 141, 156, 125, + (14,201,0): 144, 160, 134, + (14,202,0): 144, 162, 140, + (14,203,0): 139, 161, 138, + (14,204,0): 141, 168, 137, + (14,205,0): 149, 184, 142, + (14,206,0): 160, 200, 148, + (14,207,0): 164, 208, 157, + (14,208,0): 169, 211, 171, + (14,209,0): 168, 210, 174, + (14,210,0): 167, 209, 173, + (14,211,0): 161, 203, 165, + (14,212,0): 147, 189, 151, + (14,213,0): 133, 175, 135, + (14,214,0): 130, 172, 132, + (14,215,0): 135, 176, 134, + (14,216,0): 136, 174, 133, + (14,217,0): 140, 177, 136, + (14,218,0): 139, 171, 134, + (14,219,0): 129, 159, 123, + (14,220,0): 123, 148, 116, + (14,221,0): 113, 136, 107, + (14,222,0): 95, 115, 87, + (14,223,0): 77, 93, 66, + (14,224,0): 73, 79, 51, + (14,225,0): 74, 77, 48, + (14,226,0): 76, 76, 48, + (15,0,0): 46, 47, 49, + (15,1,0): 44, 48, 49, + (15,2,0): 46, 47, 49, + (15,3,0): 46, 47, 49, + (15,4,0): 46, 48, 47, + (15,5,0): 46, 48, 47, + (15,6,0): 46, 48, 47, + (15,7,0): 47, 47, 47, + (15,8,0): 48, 48, 46, + (15,9,0): 48, 48, 46, + (15,10,0): 48, 48, 46, + (15,11,0): 48, 47, 45, + (15,12,0): 48, 47, 45, + (15,13,0): 48, 47, 43, + (15,14,0): 47, 46, 44, + (15,15,0): 49, 45, 44, + (15,16,0): 50, 46, 45, + (15,17,0): 49, 45, 44, + (15,18,0): 49, 45, 44, + (15,19,0): 48, 44, 43, + (15,20,0): 47, 43, 44, + (15,21,0): 44, 42, 43, + (15,22,0): 43, 41, 42, + (15,23,0): 43, 41, 42, + (15,24,0): 43, 41, 42, + (15,25,0): 43, 41, 42, + (15,26,0): 43, 41, 42, + (15,27,0): 43, 41, 42, + (15,28,0): 43, 41, 42, + (15,29,0): 43, 41, 42, + (15,30,0): 43, 41, 44, + (15,31,0): 43, 41, 42, + (15,32,0): 43, 41, 44, + (15,33,0): 43, 41, 42, + (15,34,0): 45, 40, 44, + (15,35,0): 42, 40, 41, + (15,36,0): 44, 40, 41, + (15,37,0): 41, 39, 40, + (15,38,0): 41, 39, 40, + (15,39,0): 40, 38, 39, + (15,40,0): 42, 40, 41, + (15,41,0): 43, 41, 42, + (15,42,0): 44, 42, 43, + (15,43,0): 44, 43, 41, + (15,44,0): 45, 43, 44, + (15,45,0): 46, 45, 43, + (15,46,0): 47, 46, 44, + (15,47,0): 47, 46, 44, + (15,48,0): 45, 44, 42, + (15,49,0): 45, 44, 42, + (15,50,0): 47, 43, 42, + (15,51,0): 47, 43, 42, + (15,52,0): 46, 42, 41, + (15,53,0): 45, 41, 40, + (15,54,0): 44, 40, 39, + (15,55,0): 44, 40, 39, + (15,56,0): 49, 45, 44, + (15,57,0): 50, 45, 42, + (15,58,0): 50, 45, 42, + (15,59,0): 50, 45, 42, + (15,60,0): 51, 46, 43, + (15,61,0): 52, 47, 44, + (15,62,0): 53, 48, 45, + (15,63,0): 54, 49, 46, + (15,64,0): 59, 51, 49, + (15,65,0): 59, 51, 49, + (15,66,0): 60, 52, 50, + (15,67,0): 60, 52, 50, + (15,68,0): 61, 51, 49, + (15,69,0): 60, 50, 48, + (15,70,0): 59, 49, 47, + (15,71,0): 59, 49, 47, + (15,72,0): 60, 49, 47, + (15,73,0): 60, 49, 47, + (15,74,0): 61, 47, 46, + (15,75,0): 61, 47, 46, + (15,76,0): 61, 47, 44, + (15,77,0): 62, 48, 45, + (15,78,0): 63, 49, 46, + (15,79,0): 61, 50, 46, + (15,80,0): 62, 51, 45, + (15,81,0): 61, 54, 46, + (15,82,0): 60, 55, 49, + (15,83,0): 57, 57, 49, + (15,84,0): 57, 58, 50, + (15,85,0): 58, 58, 50, + (15,86,0): 59, 56, 49, + (15,87,0): 63, 54, 47, + (15,88,0): 67, 50, 43, + (15,89,0): 74, 49, 44, + (15,90,0): 84, 50, 41, + (15,91,0): 94, 51, 42, + (15,92,0): 104, 54, 43, + (15,93,0): 111, 57, 45, + (15,94,0): 118, 60, 46, + (15,95,0): 123, 59, 47, + (15,96,0): 135, 61, 50, + (15,97,0): 139, 61, 51, + (15,98,0): 139, 63, 50, + (15,99,0): 140, 64, 50, + (15,100,0): 142, 64, 51, + (15,101,0): 143, 64, 49, + (15,102,0): 146, 63, 49, + (15,103,0): 149, 61, 47, + (15,104,0): 152, 60, 47, + (15,105,0): 156, 62, 50, + (15,106,0): 162, 66, 54, + (15,107,0): 161, 67, 55, + (15,108,0): 158, 66, 55, + (15,109,0): 153, 63, 52, + (15,110,0): 150, 62, 50, + (15,111,0): 148, 62, 49, + (15,112,0): 148, 62, 47, + (15,113,0): 147, 61, 46, + (15,114,0): 144, 61, 45, + (15,115,0): 142, 61, 44, + (15,116,0): 142, 61, 44, + (15,117,0): 140, 61, 44, + (15,118,0): 140, 61, 46, + (15,119,0): 141, 62, 47, + (15,120,0): 142, 60, 46, + (15,121,0): 142, 60, 46, + (15,122,0): 139, 60, 47, + (15,123,0): 138, 59, 46, + (15,124,0): 136, 58, 45, + (15,125,0): 135, 59, 45, + (15,126,0): 132, 59, 44, + (15,127,0): 132, 59, 44, + (15,128,0): 130, 58, 43, + (15,129,0): 128, 59, 43, + (15,130,0): 127, 58, 42, + (15,131,0): 126, 59, 42, + (15,132,0): 126, 59, 43, + (15,133,0): 124, 58, 42, + (15,134,0): 124, 58, 44, + (15,135,0): 124, 58, 46, + (15,136,0): 128, 62, 50, + (15,137,0): 129, 62, 53, + (15,138,0): 128, 64, 54, + (15,139,0): 130, 67, 58, + (15,140,0): 133, 70, 61, + (15,141,0): 133, 74, 66, + (15,142,0): 136, 77, 69, + (15,143,0): 139, 79, 71, + (15,144,0): 140, 73, 67, + (15,145,0): 142, 73, 68, + (15,146,0): 147, 80, 74, + (15,147,0): 152, 92, 84, + (15,148,0): 157, 104, 96, + (15,149,0): 157, 117, 105, + (15,150,0): 158, 135, 117, + (15,151,0): 157, 153, 128, + (15,152,0): 147, 162, 133, + (15,153,0): 143, 170, 137, + (15,154,0): 137, 172, 139, + (15,155,0): 129, 169, 135, + (15,156,0): 127, 162, 132, + (15,157,0): 125, 155, 127, + (15,158,0): 122, 144, 121, + (15,159,0): 116, 136, 111, + (15,160,0): 103, 126, 98, + (15,161,0): 98, 121, 93, + (15,162,0): 92, 112, 85, + (15,163,0): 85, 103, 79, + (15,164,0): 78, 93, 72, + (15,165,0): 71, 82, 65, + (15,166,0): 64, 73, 56, + (15,167,0): 61, 65, 51, + (15,168,0): 56, 56, 46, + (15,169,0): 56, 53, 46, + (15,170,0): 53, 48, 44, + (15,171,0): 51, 43, 41, + (15,172,0): 50, 40, 41, + (15,173,0): 50, 40, 41, + (15,174,0): 51, 41, 42, + (15,175,0): 52, 42, 43, + (15,176,0): 50, 41, 44, + (15,177,0): 48, 42, 42, + (15,178,0): 48, 42, 44, + (15,179,0): 50, 41, 42, + (15,180,0): 50, 41, 44, + (15,181,0): 50, 41, 44, + (15,182,0): 50, 41, 44, + (15,183,0): 50, 41, 44, + (15,184,0): 51, 42, 45, + (15,185,0): 51, 42, 45, + (15,186,0): 49, 43, 45, + (15,187,0): 49, 43, 45, + (15,188,0): 48, 44, 45, + (15,189,0): 48, 44, 45, + (15,190,0): 48, 44, 45, + (15,191,0): 49, 43, 47, + (15,192,0): 52, 41, 47, + (15,193,0): 52, 42, 43, + (15,194,0): 52, 45, 37, + (15,195,0): 52, 54, 33, + (15,196,0): 63, 70, 37, + (15,197,0): 84, 96, 56, + (15,198,0): 109, 124, 81, + (15,199,0): 129, 144, 103, + (15,200,0): 137, 153, 116, + (15,201,0): 141, 158, 122, + (15,202,0): 141, 161, 126, + (15,203,0): 136, 161, 122, + (15,204,0): 138, 167, 123, + (15,205,0): 145, 182, 130, + (15,206,0): 155, 196, 136, + (15,207,0): 159, 203, 144, + (15,208,0): 159, 201, 153, + (15,209,0): 158, 199, 157, + (15,210,0): 157, 198, 154, + (15,211,0): 152, 193, 149, + (15,212,0): 140, 183, 138, + (15,213,0): 130, 173, 128, + (15,214,0): 133, 174, 130, + (15,215,0): 140, 181, 137, + (15,216,0): 132, 171, 127, + (15,217,0): 137, 174, 133, + (15,218,0): 137, 169, 130, + (15,219,0): 126, 156, 120, + (15,220,0): 118, 143, 111, + (15,221,0): 108, 131, 102, + (15,222,0): 90, 110, 83, + (15,223,0): 74, 90, 63, + (15,224,0): 70, 76, 50, + (15,225,0): 70, 74, 47, + (15,226,0): 70, 72, 48, + (16,0,0): 47, 48, 43, + (16,1,0): 46, 48, 43, + (16,2,0): 47, 48, 43, + (16,3,0): 48, 49, 44, + (16,4,0): 48, 49, 44, + (16,5,0): 48, 49, 44, + (16,6,0): 49, 50, 45, + (16,7,0): 50, 49, 45, + (16,8,0): 51, 50, 46, + (16,9,0): 52, 51, 47, + (16,10,0): 52, 51, 47, + (16,11,0): 54, 50, 47, + (16,12,0): 53, 49, 46, + (16,13,0): 52, 49, 44, + (16,14,0): 51, 47, 44, + (16,15,0): 52, 47, 44, + (16,16,0): 53, 48, 45, + (16,17,0): 53, 48, 45, + (16,18,0): 52, 47, 44, + (16,19,0): 51, 46, 43, + (16,20,0): 50, 44, 44, + (16,21,0): 49, 45, 44, + (16,22,0): 48, 44, 43, + (16,23,0): 48, 44, 43, + (16,24,0): 46, 44, 45, + (16,25,0): 46, 44, 45, + (16,26,0): 45, 45, 47, + (16,27,0): 45, 45, 47, + (16,28,0): 44, 44, 46, + (16,29,0): 43, 43, 45, + (16,30,0): 42, 41, 46, + (16,31,0): 41, 41, 43, + (16,32,0): 46, 41, 47, + (16,33,0): 46, 41, 45, + (16,34,0): 47, 40, 47, + (16,35,0): 46, 41, 45, + (16,36,0): 47, 41, 45, + (16,37,0): 46, 41, 45, + (16,38,0): 46, 42, 43, + (16,39,0): 46, 42, 43, + (16,40,0): 47, 43, 42, + (16,41,0): 47, 43, 42, + (16,42,0): 45, 44, 42, + (16,43,0): 46, 45, 41, + (16,44,0): 45, 45, 43, + (16,45,0): 45, 46, 41, + (16,46,0): 46, 47, 42, + (16,47,0): 46, 47, 42, + (16,48,0): 45, 45, 45, + (16,49,0): 45, 45, 45, + (16,50,0): 46, 44, 45, + (16,51,0): 47, 45, 46, + (16,52,0): 47, 46, 44, + (16,53,0): 48, 47, 45, + (16,54,0): 50, 46, 43, + (16,55,0): 50, 46, 43, + (16,56,0): 50, 45, 42, + (16,57,0): 52, 44, 41, + (16,58,0): 53, 45, 42, + (16,59,0): 54, 46, 43, + (16,60,0): 56, 47, 42, + (16,61,0): 58, 49, 44, + (16,62,0): 58, 49, 42, + (16,63,0): 59, 50, 43, + (16,64,0): 61, 52, 45, + (16,65,0): 61, 52, 45, + (16,66,0): 62, 53, 48, + (16,67,0): 62, 53, 48, + (16,68,0): 62, 53, 48, + (16,69,0): 61, 52, 47, + (16,70,0): 60, 51, 46, + (16,71,0): 59, 50, 45, + (16,72,0): 61, 50, 46, + (16,73,0): 60, 49, 45, + (16,74,0): 60, 49, 47, + (16,75,0): 59, 48, 46, + (16,76,0): 61, 47, 46, + (16,77,0): 62, 48, 47, + (16,78,0): 62, 48, 47, + (16,79,0): 64, 49, 46, + (16,80,0): 66, 47, 41, + (16,81,0): 66, 49, 41, + (16,82,0): 60, 51, 42, + (16,83,0): 57, 54, 45, + (16,84,0): 53, 56, 45, + (16,85,0): 52, 55, 46, + (16,86,0): 54, 54, 46, + (16,87,0): 59, 50, 45, + (16,88,0): 64, 45, 41, + (16,89,0): 71, 41, 39, + (16,90,0): 79, 39, 39, + (16,91,0): 86, 41, 38, + (16,92,0): 91, 46, 40, + (16,93,0): 97, 53, 44, + (16,94,0): 102, 60, 48, + (16,95,0): 109, 63, 48, + (16,96,0): 121, 65, 48, + (16,97,0): 127, 64, 47, + (16,98,0): 134, 65, 49, + (16,99,0): 139, 66, 51, + (16,100,0): 143, 64, 51, + (16,101,0): 147, 61, 48, + (16,102,0): 147, 59, 47, + (16,103,0): 146, 56, 45, + (16,104,0): 147, 59, 47, + (16,105,0): 147, 61, 46, + (16,106,0): 148, 65, 49, + (16,107,0): 149, 66, 50, + (16,108,0): 148, 67, 50, + (16,109,0): 146, 65, 48, + (16,110,0): 145, 62, 46, + (16,111,0): 145, 59, 44, + (16,112,0): 151, 59, 48, + (16,113,0): 151, 58, 50, + (16,114,0): 146, 59, 49, + (16,115,0): 140, 61, 48, + (16,116,0): 136, 63, 48, + (16,117,0): 132, 63, 47, + (16,118,0): 130, 63, 46, + (16,119,0): 130, 63, 46, + (16,120,0): 136, 64, 49, + (16,121,0): 136, 63, 48, + (16,122,0): 138, 62, 49, + (16,123,0): 137, 61, 48, + (16,124,0): 136, 60, 47, + (16,125,0): 135, 59, 46, + (16,126,0): 132, 58, 45, + (16,127,0): 131, 59, 45, + (16,128,0): 123, 57, 43, + (16,129,0): 126, 64, 51, + (16,130,0): 118, 60, 46, + (16,131,0): 112, 56, 41, + (16,132,0): 118, 62, 45, + (16,133,0): 118, 62, 45, + (16,134,0): 118, 59, 45, + (16,135,0): 125, 63, 50, + (16,136,0): 125, 59, 47, + (16,137,0): 131, 63, 52, + (16,138,0): 136, 68, 57, + (16,139,0): 139, 72, 63, + (16,140,0): 138, 76, 65, + (16,141,0): 135, 77, 66, + (16,142,0): 133, 79, 67, + (16,143,0): 135, 78, 69, + (16,144,0): 144, 76, 73, + (16,145,0): 149, 84, 80, + (16,146,0): 147, 99, 89, + (16,147,0): 142, 113, 97, + (16,148,0): 138, 125, 106, + (16,149,0): 134, 138, 113, + (16,150,0): 135, 151, 124, + (16,151,0): 136, 159, 130, + (16,152,0): 139, 166, 135, + (16,153,0): 138, 167, 137, + (16,154,0): 139, 168, 138, + (16,155,0): 138, 168, 140, + (16,156,0): 132, 165, 136, + (16,157,0): 124, 161, 130, + (16,158,0): 114, 155, 123, + (16,159,0): 110, 151, 117, + (16,160,0): 104, 142, 105, + (16,161,0): 97, 133, 95, + (16,162,0): 91, 122, 88, + (16,163,0): 89, 116, 85, + (16,164,0): 90, 110, 83, + (16,165,0): 86, 101, 78, + (16,166,0): 79, 88, 69, + (16,167,0): 73, 75, 61, + (16,168,0): 66, 63, 54, + (16,169,0): 64, 57, 51, + (16,170,0): 58, 48, 46, + (16,171,0): 53, 43, 42, + (16,172,0): 51, 39, 41, + (16,173,0): 51, 39, 43, + (16,174,0): 51, 39, 43, + (16,175,0): 49, 38, 42, + (16,176,0): 47, 41, 45, + (16,177,0): 45, 41, 42, + (16,178,0): 45, 40, 44, + (16,179,0): 45, 39, 41, + (16,180,0): 47, 38, 43, + (16,181,0): 49, 38, 44, + (16,182,0): 51, 38, 45, + (16,183,0): 51, 38, 45, + (16,184,0): 52, 39, 46, + (16,185,0): 52, 39, 46, + (16,186,0): 51, 40, 48, + (16,187,0): 50, 40, 48, + (16,188,0): 48, 41, 49, + (16,189,0): 47, 42, 49, + (16,190,0): 47, 42, 49, + (16,191,0): 47, 42, 48, + (16,192,0): 47, 41, 45, + (16,193,0): 49, 43, 43, + (16,194,0): 48, 45, 40, + (16,195,0): 47, 47, 35, + (16,196,0): 60, 63, 42, + (16,197,0): 86, 92, 64, + (16,198,0): 112, 122, 88, + (16,199,0): 127, 139, 103, + (16,200,0): 141, 156, 117, + (16,201,0): 139, 157, 115, + (16,202,0): 140, 161, 118, + (16,203,0): 140, 166, 119, + (16,204,0): 138, 168, 118, + (16,205,0): 137, 170, 117, + (16,206,0): 142, 180, 123, + (16,207,0): 153, 191, 134, + (16,208,0): 159, 193, 143, + (16,209,0): 157, 190, 143, + (16,210,0): 150, 186, 138, + (16,211,0): 143, 179, 131, + (16,212,0): 136, 174, 125, + (16,213,0): 133, 171, 124, + (16,214,0): 131, 170, 123, + (16,215,0): 133, 170, 126, + (16,216,0): 131, 168, 125, + (16,217,0): 131, 166, 126, + (16,218,0): 128, 158, 124, + (16,219,0): 121, 148, 117, + (16,220,0): 114, 137, 109, + (16,221,0): 104, 124, 99, + (16,222,0): 89, 107, 85, + (16,223,0): 77, 90, 70, + (16,224,0): 74, 82, 61, + (16,225,0): 68, 73, 51, + (16,226,0): 62, 65, 46, + (17,0,0): 47, 48, 42, + (17,1,0): 48, 49, 43, + (17,2,0): 48, 49, 43, + (17,3,0): 48, 49, 43, + (17,4,0): 49, 50, 44, + (17,5,0): 49, 50, 44, + (17,6,0): 50, 49, 44, + (17,7,0): 51, 50, 45, + (17,8,0): 52, 51, 46, + (17,9,0): 52, 51, 46, + (17,10,0): 55, 52, 47, + (17,11,0): 55, 52, 47, + (17,12,0): 54, 51, 46, + (17,13,0): 53, 50, 45, + (17,14,0): 53, 48, 44, + (17,15,0): 53, 48, 44, + (17,16,0): 55, 47, 44, + (17,17,0): 55, 47, 44, + (17,18,0): 54, 46, 44, + (17,19,0): 54, 46, 44, + (17,20,0): 51, 46, 43, + (17,21,0): 50, 45, 42, + (17,22,0): 48, 44, 43, + (17,23,0): 48, 44, 43, + (17,24,0): 48, 44, 45, + (17,25,0): 47, 45, 46, + (17,26,0): 47, 45, 48, + (17,27,0): 45, 45, 47, + (17,28,0): 45, 44, 49, + (17,29,0): 43, 42, 47, + (17,30,0): 41, 42, 46, + (17,31,0): 41, 40, 45, + (17,32,0): 46, 41, 47, + (17,33,0): 47, 40, 47, + (17,34,0): 47, 40, 47, + (17,35,0): 47, 40, 47, + (17,36,0): 47, 41, 45, + (17,37,0): 47, 41, 45, + (17,38,0): 46, 42, 43, + (17,39,0): 46, 42, 43, + (17,40,0): 47, 43, 42, + (17,41,0): 47, 43, 42, + (17,42,0): 46, 45, 41, + (17,43,0): 46, 45, 41, + (17,44,0): 46, 47, 42, + (17,45,0): 46, 47, 42, + (17,46,0): 46, 47, 41, + (17,47,0): 46, 47, 42, + (17,48,0): 46, 46, 46, + (17,49,0): 46, 46, 48, + (17,50,0): 46, 46, 46, + (17,51,0): 46, 46, 46, + (17,52,0): 47, 46, 44, + (17,53,0): 47, 46, 44, + (17,54,0): 49, 45, 42, + (17,55,0): 51, 46, 43, + (17,56,0): 53, 45, 42, + (17,57,0): 53, 46, 40, + (17,58,0): 55, 46, 41, + (17,59,0): 56, 47, 40, + (17,60,0): 58, 47, 41, + (17,61,0): 59, 48, 42, + (17,62,0): 60, 50, 41, + (17,63,0): 61, 51, 42, + (17,64,0): 62, 53, 44, + (17,65,0): 62, 53, 44, + (17,66,0): 62, 53, 46, + (17,67,0): 62, 53, 46, + (17,68,0): 62, 53, 46, + (17,69,0): 61, 52, 45, + (17,70,0): 60, 51, 46, + (17,71,0): 60, 51, 46, + (17,72,0): 61, 50, 46, + (17,73,0): 60, 49, 45, + (17,74,0): 59, 48, 46, + (17,75,0): 59, 48, 46, + (17,76,0): 61, 47, 46, + (17,77,0): 61, 47, 46, + (17,78,0): 62, 48, 47, + (17,79,0): 64, 49, 46, + (17,80,0): 68, 47, 42, + (17,81,0): 70, 47, 41, + (17,82,0): 67, 50, 43, + (17,83,0): 64, 51, 43, + (17,84,0): 61, 52, 45, + (17,85,0): 60, 51, 44, + (17,86,0): 59, 50, 45, + (17,87,0): 62, 48, 45, + (17,88,0): 65, 44, 43, + (17,89,0): 70, 42, 41, + (17,90,0): 75, 41, 40, + (17,91,0): 80, 42, 39, + (17,92,0): 86, 45, 41, + (17,93,0): 92, 51, 45, + (17,94,0): 97, 57, 49, + (17,95,0): 103, 61, 47, + (17,96,0): 112, 65, 47, + (17,97,0): 120, 65, 45, + (17,98,0): 128, 65, 48, + (17,99,0): 136, 64, 50, + (17,100,0): 143, 63, 52, + (17,101,0): 145, 61, 51, + (17,102,0): 147, 58, 50, + (17,103,0): 147, 59, 49, + (17,104,0): 141, 57, 46, + (17,105,0): 139, 60, 47, + (17,106,0): 139, 62, 46, + (17,107,0): 140, 64, 48, + (17,108,0): 141, 65, 49, + (17,109,0): 141, 65, 49, + (17,110,0): 142, 65, 47, + (17,111,0): 145, 63, 49, + (17,112,0): 149, 59, 50, + (17,113,0): 149, 59, 50, + (17,114,0): 144, 60, 50, + (17,115,0): 139, 61, 48, + (17,116,0): 134, 62, 48, + (17,117,0): 131, 64, 47, + (17,118,0): 129, 63, 47, + (17,119,0): 129, 64, 46, + (17,120,0): 133, 64, 49, + (17,121,0): 134, 62, 47, + (17,122,0): 135, 61, 48, + (17,123,0): 136, 60, 46, + (17,124,0): 133, 59, 46, + (17,125,0): 132, 59, 44, + (17,126,0): 130, 58, 44, + (17,127,0): 127, 60, 44, + (17,128,0): 119, 57, 44, + (17,129,0): 119, 61, 49, + (17,130,0): 112, 59, 45, + (17,131,0): 109, 57, 43, + (17,132,0): 114, 63, 46, + (17,133,0): 114, 63, 46, + (17,134,0): 113, 57, 42, + (17,135,0): 117, 58, 44, + (17,136,0): 127, 61, 49, + (17,137,0): 132, 64, 53, + (17,138,0): 138, 68, 58, + (17,139,0): 140, 72, 61, + (17,140,0): 138, 74, 64, + (17,141,0): 135, 77, 65, + (17,142,0): 133, 79, 67, + (17,143,0): 136, 77, 69, + (17,144,0): 144, 74, 72, + (17,145,0): 149, 84, 82, + (17,146,0): 145, 102, 93, + (17,147,0): 138, 119, 102, + (17,148,0): 131, 135, 112, + (17,149,0): 127, 147, 119, + (17,150,0): 128, 159, 127, + (17,151,0): 131, 166, 134, + (17,152,0): 134, 167, 136, + (17,153,0): 139, 168, 138, + (17,154,0): 143, 167, 141, + (17,155,0): 143, 167, 141, + (17,156,0): 136, 165, 137, + (17,157,0): 127, 160, 131, + (17,158,0): 117, 156, 125, + (17,159,0): 109, 153, 118, + (17,160,0): 100, 147, 105, + (17,161,0): 94, 139, 96, + (17,162,0): 89, 130, 90, + (17,163,0): 89, 123, 88, + (17,164,0): 90, 119, 88, + (17,165,0): 88, 111, 83, + (17,166,0): 82, 97, 74, + (17,167,0): 77, 86, 67, + (17,168,0): 69, 73, 59, + (17,169,0): 65, 65, 55, + (17,170,0): 59, 56, 51, + (17,171,0): 53, 48, 45, + (17,172,0): 51, 42, 43, + (17,173,0): 50, 41, 42, + (17,174,0): 49, 40, 43, + (17,175,0): 46, 40, 42, + (17,176,0): 49, 40, 43, + (17,177,0): 48, 39, 44, + (17,178,0): 48, 39, 44, + (17,179,0): 48, 39, 44, + (17,180,0): 49, 38, 44, + (17,181,0): 51, 38, 45, + (17,182,0): 52, 39, 48, + (17,183,0): 52, 39, 48, + (17,184,0): 52, 39, 48, + (17,185,0): 51, 40, 48, + (17,186,0): 50, 40, 49, + (17,187,0): 48, 41, 49, + (17,188,0): 47, 42, 49, + (17,189,0): 45, 42, 51, + (17,190,0): 44, 43, 51, + (17,191,0): 44, 43, 49, + (17,192,0): 50, 45, 49, + (17,193,0): 50, 46, 45, + (17,194,0): 48, 44, 41, + (17,195,0): 45, 45, 37, + (17,196,0): 56, 58, 44, + (17,197,0): 83, 88, 66, + (17,198,0): 111, 120, 93, + (17,199,0): 128, 139, 105, + (17,200,0): 135, 150, 111, + (17,201,0): 134, 153, 108, + (17,202,0): 134, 158, 110, + (17,203,0): 136, 163, 112, + (17,204,0): 134, 164, 112, + (17,205,0): 132, 165, 112, + (17,206,0): 138, 173, 119, + (17,207,0): 147, 182, 128, + (17,208,0): 153, 185, 135, + (17,209,0): 150, 182, 132, + (17,210,0): 147, 179, 129, + (17,211,0): 140, 174, 123, + (17,212,0): 134, 171, 120, + (17,213,0): 130, 168, 119, + (17,214,0): 130, 168, 121, + (17,215,0): 131, 168, 124, + (17,216,0): 131, 166, 124, + (17,217,0): 130, 164, 127, + (17,218,0): 127, 157, 123, + (17,219,0): 120, 146, 117, + (17,220,0): 113, 136, 110, + (17,221,0): 104, 123, 101, + (17,222,0): 89, 106, 87, + (17,223,0): 77, 90, 72, + (17,224,0): 70, 77, 59, + (17,225,0): 64, 68, 51, + (17,226,0): 59, 62, 45, + (18,0,0): 49, 50, 44, + (18,1,0): 49, 50, 44, + (18,2,0): 49, 50, 44, + (18,3,0): 49, 50, 44, + (18,4,0): 50, 51, 45, + (18,5,0): 50, 51, 45, + (18,6,0): 52, 51, 46, + (18,7,0): 52, 51, 46, + (18,8,0): 53, 52, 47, + (18,9,0): 53, 52, 47, + (18,10,0): 56, 53, 48, + (18,11,0): 56, 53, 48, + (18,12,0): 56, 53, 48, + (18,13,0): 55, 52, 47, + (18,14,0): 55, 50, 46, + (18,15,0): 54, 49, 45, + (18,16,0): 56, 48, 45, + (18,17,0): 56, 48, 45, + (18,18,0): 55, 47, 44, + (18,19,0): 54, 46, 43, + (18,20,0): 52, 47, 44, + (18,21,0): 51, 46, 43, + (18,22,0): 50, 44, 44, + (18,23,0): 49, 45, 44, + (18,24,0): 49, 45, 46, + (18,25,0): 47, 45, 46, + (18,26,0): 48, 46, 49, + (18,27,0): 47, 45, 48, + (18,28,0): 45, 45, 47, + (18,29,0): 44, 44, 46, + (18,30,0): 43, 42, 47, + (18,31,0): 43, 41, 46, + (18,32,0): 47, 40, 47, + (18,33,0): 49, 39, 47, + (18,34,0): 47, 41, 45, + (18,35,0): 47, 41, 45, + (18,36,0): 47, 41, 45, + (18,37,0): 47, 41, 45, + (18,38,0): 46, 42, 43, + (18,39,0): 46, 42, 43, + (18,40,0): 48, 44, 43, + (18,41,0): 48, 44, 43, + (18,42,0): 47, 46, 42, + (18,43,0): 47, 46, 42, + (18,44,0): 47, 46, 41, + (18,45,0): 48, 47, 42, + (18,46,0): 48, 47, 42, + (18,47,0): 48, 47, 43, + (18,48,0): 47, 47, 45, + (18,49,0): 47, 47, 47, + (18,50,0): 48, 46, 47, + (18,51,0): 48, 46, 47, + (18,52,0): 48, 47, 45, + (18,53,0): 47, 46, 44, + (18,54,0): 49, 45, 42, + (18,55,0): 50, 45, 42, + (18,56,0): 54, 46, 43, + (18,57,0): 55, 48, 42, + (18,58,0): 57, 48, 43, + (18,59,0): 58, 49, 42, + (18,60,0): 60, 49, 43, + (18,61,0): 61, 51, 42, + (18,62,0): 62, 52, 43, + (18,63,0): 63, 53, 44, + (18,64,0): 63, 54, 45, + (18,65,0): 63, 54, 45, + (18,66,0): 64, 55, 46, + (18,67,0): 64, 55, 46, + (18,68,0): 63, 54, 47, + (18,69,0): 62, 53, 46, + (18,70,0): 61, 52, 45, + (18,71,0): 61, 52, 45, + (18,72,0): 61, 50, 46, + (18,73,0): 60, 49, 45, + (18,74,0): 59, 48, 46, + (18,75,0): 59, 48, 46, + (18,76,0): 59, 48, 46, + (18,77,0): 59, 48, 46, + (18,78,0): 60, 49, 47, + (18,79,0): 63, 49, 46, + (18,80,0): 68, 49, 43, + (18,81,0): 71, 47, 43, + (18,82,0): 74, 46, 43, + (18,83,0): 76, 44, 45, + (18,84,0): 79, 43, 47, + (18,85,0): 78, 42, 46, + (18,86,0): 74, 42, 47, + (18,87,0): 71, 42, 46, + (18,88,0): 68, 44, 44, + (18,89,0): 65, 46, 42, + (18,90,0): 66, 45, 40, + (18,91,0): 70, 45, 40, + (18,92,0): 79, 46, 41, + (18,93,0): 89, 48, 42, + (18,94,0): 99, 50, 45, + (18,95,0): 105, 52, 44, + (18,96,0): 107, 58, 44, + (18,97,0): 111, 59, 45, + (18,98,0): 119, 59, 48, + (18,99,0): 129, 61, 52, + (18,100,0): 135, 60, 54, + (18,101,0): 140, 60, 53, + (18,102,0): 141, 58, 52, + (18,103,0): 141, 58, 52, + (18,104,0): 138, 60, 50, + (18,105,0): 135, 61, 50, + (18,106,0): 134, 62, 50, + (18,107,0): 133, 63, 51, + (18,108,0): 134, 65, 50, + (18,109,0): 137, 65, 51, + (18,110,0): 140, 66, 53, + (18,111,0): 143, 67, 53, + (18,112,0): 142, 63, 50, + (18,113,0): 143, 61, 47, + (18,114,0): 140, 62, 49, + (18,115,0): 138, 62, 46, + (18,116,0): 135, 62, 47, + (18,117,0): 133, 62, 44, + (18,118,0): 134, 61, 46, + (18,119,0): 134, 61, 44, + (18,120,0): 137, 59, 46, + (18,121,0): 137, 60, 44, + (18,122,0): 136, 58, 45, + (18,123,0): 134, 58, 42, + (18,124,0): 132, 59, 44, + (18,125,0): 128, 60, 41, + (18,126,0): 126, 61, 43, + (18,127,0): 122, 61, 43, + (18,128,0): 124, 62, 49, + (18,129,0): 120, 60, 49, + (18,130,0): 117, 59, 47, + (18,131,0): 116, 60, 47, + (18,132,0): 118, 65, 49, + (18,133,0): 118, 65, 49, + (18,134,0): 117, 61, 46, + (18,135,0): 118, 59, 45, + (18,136,0): 127, 63, 53, + (18,137,0): 132, 65, 56, + (18,138,0): 138, 70, 61, + (18,139,0): 140, 72, 63, + (18,140,0): 138, 74, 65, + (18,141,0): 137, 74, 65, + (18,142,0): 136, 78, 67, + (18,143,0): 140, 77, 70, + (18,144,0): 147, 73, 72, + (18,145,0): 153, 83, 81, + (18,146,0): 151, 101, 92, + (18,147,0): 146, 117, 101, + (18,148,0): 138, 132, 110, + (18,149,0): 131, 144, 116, + (18,150,0): 129, 156, 123, + (18,151,0): 130, 164, 131, + (18,152,0): 134, 168, 135, + (18,153,0): 138, 169, 137, + (18,154,0): 143, 169, 140, + (18,155,0): 145, 168, 140, + (18,156,0): 144, 164, 137, + (18,157,0): 138, 158, 131, + (18,158,0): 130, 153, 125, + (18,159,0): 122, 151, 120, + (18,160,0): 107, 149, 109, + (18,161,0): 97, 146, 101, + (18,162,0): 92, 139, 97, + (18,163,0): 92, 134, 96, + (18,164,0): 93, 130, 96, + (18,165,0): 91, 124, 93, + (18,166,0): 85, 114, 86, + (18,167,0): 80, 104, 80, + (18,168,0): 70, 89, 69, + (18,169,0): 66, 80, 63, + (18,170,0): 58, 68, 57, + (18,171,0): 51, 58, 50, + (18,172,0): 46, 51, 44, + (18,173,0): 42, 47, 41, + (18,174,0): 40, 45, 41, + (18,175,0): 43, 42, 40, + (18,176,0): 50, 38, 40, + (18,177,0): 53, 36, 42, + (18,178,0): 53, 36, 42, + (18,179,0): 53, 36, 42, + (18,180,0): 52, 37, 42, + (18,181,0): 53, 38, 43, + (18,182,0): 51, 40, 46, + (18,183,0): 51, 42, 47, + (18,184,0): 48, 42, 46, + (18,185,0): 47, 42, 46, + (18,186,0): 44, 43, 48, + (18,187,0): 43, 44, 48, + (18,188,0): 41, 45, 48, + (18,189,0): 40, 45, 49, + (18,190,0): 38, 46, 49, + (18,191,0): 40, 45, 48, + (18,192,0): 49, 47, 50, + (18,193,0): 51, 47, 46, + (18,194,0): 46, 42, 39, + (18,195,0): 42, 42, 34, + (18,196,0): 53, 55, 42, + (18,197,0): 80, 85, 65, + (18,198,0): 109, 118, 91, + (18,199,0): 124, 138, 105, + (18,200,0): 128, 144, 107, + (18,201,0): 126, 147, 106, + (18,202,0): 127, 153, 106, + (18,203,0): 131, 159, 110, + (18,204,0): 128, 160, 110, + (18,205,0): 126, 160, 109, + (18,206,0): 128, 165, 113, + (18,207,0): 135, 172, 120, + (18,208,0): 141, 175, 124, + (18,209,0): 139, 173, 122, + (18,210,0): 136, 170, 120, + (18,211,0): 132, 169, 118, + (18,212,0): 129, 167, 118, + (18,213,0): 127, 167, 117, + (18,214,0): 127, 166, 119, + (18,215,0): 127, 166, 121, + (18,216,0): 127, 164, 121, + (18,217,0): 128, 162, 125, + (18,218,0): 125, 155, 121, + (18,219,0): 119, 145, 116, + (18,220,0): 112, 135, 109, + (18,221,0): 104, 124, 99, + (18,222,0): 89, 107, 85, + (18,223,0): 77, 90, 70, + (18,224,0): 69, 73, 58, + (18,225,0): 62, 64, 50, + (18,226,0): 57, 58, 44, + (19,0,0): 50, 51, 45, + (19,1,0): 50, 51, 45, + (19,2,0): 51, 52, 46, + (19,3,0): 51, 52, 46, + (19,4,0): 51, 52, 46, + (19,5,0): 52, 53, 47, + (19,6,0): 53, 52, 47, + (19,7,0): 53, 52, 47, + (19,8,0): 54, 53, 48, + (19,9,0): 55, 54, 49, + (19,10,0): 57, 54, 49, + (19,11,0): 58, 55, 50, + (19,12,0): 58, 55, 50, + (19,13,0): 57, 54, 49, + (19,14,0): 57, 52, 48, + (19,15,0): 57, 52, 48, + (19,16,0): 58, 50, 47, + (19,17,0): 57, 49, 46, + (19,18,0): 57, 49, 46, + (19,19,0): 56, 48, 45, + (19,20,0): 53, 48, 45, + (19,21,0): 52, 47, 44, + (19,22,0): 52, 46, 46, + (19,23,0): 52, 46, 46, + (19,24,0): 51, 47, 48, + (19,25,0): 51, 47, 48, + (19,26,0): 49, 47, 48, + (19,27,0): 49, 47, 50, + (19,28,0): 48, 46, 49, + (19,29,0): 46, 46, 48, + (19,30,0): 45, 45, 47, + (19,31,0): 45, 43, 46, + (19,32,0): 48, 41, 48, + (19,33,0): 50, 41, 46, + (19,34,0): 48, 42, 46, + (19,35,0): 48, 42, 46, + (19,36,0): 48, 42, 46, + (19,37,0): 48, 42, 44, + (19,38,0): 47, 43, 44, + (19,39,0): 47, 43, 42, + (19,40,0): 49, 45, 44, + (19,41,0): 49, 45, 44, + (19,42,0): 48, 47, 43, + (19,43,0): 48, 47, 43, + (19,44,0): 49, 48, 43, + (19,45,0): 49, 48, 43, + (19,46,0): 49, 48, 43, + (19,47,0): 49, 48, 44, + (19,48,0): 49, 49, 47, + (19,49,0): 49, 49, 49, + (19,50,0): 49, 47, 48, + (19,51,0): 49, 48, 46, + (19,52,0): 49, 48, 46, + (19,53,0): 50, 46, 43, + (19,54,0): 51, 46, 43, + (19,55,0): 51, 46, 42, + (19,56,0): 57, 50, 44, + (19,57,0): 57, 50, 44, + (19,58,0): 59, 50, 43, + (19,59,0): 60, 51, 44, + (19,60,0): 62, 52, 43, + (19,61,0): 64, 54, 45, + (19,62,0): 64, 54, 45, + (19,63,0): 65, 55, 46, + (19,64,0): 66, 56, 47, + (19,65,0): 65, 56, 47, + (19,66,0): 66, 57, 48, + (19,67,0): 65, 56, 47, + (19,68,0): 65, 56, 49, + (19,69,0): 64, 55, 48, + (19,70,0): 62, 53, 46, + (19,71,0): 62, 53, 46, + (19,72,0): 61, 50, 46, + (19,73,0): 61, 50, 46, + (19,74,0): 60, 49, 47, + (19,75,0): 59, 48, 46, + (19,76,0): 59, 48, 46, + (19,77,0): 60, 49, 47, + (19,78,0): 61, 50, 48, + (19,79,0): 63, 49, 46, + (19,80,0): 66, 51, 46, + (19,81,0): 70, 49, 46, + (19,82,0): 77, 45, 46, + (19,83,0): 84, 41, 48, + (19,84,0): 88, 38, 47, + (19,85,0): 87, 37, 46, + (19,86,0): 81, 38, 47, + (19,87,0): 75, 40, 46, + (19,88,0): 68, 47, 46, + (19,89,0): 62, 49, 43, + (19,90,0): 60, 50, 41, + (19,91,0): 64, 50, 41, + (19,92,0): 72, 47, 40, + (19,93,0): 84, 47, 41, + (19,94,0): 96, 45, 42, + (19,95,0): 101, 46, 41, + (19,96,0): 105, 57, 47, + (19,97,0): 107, 59, 47, + (19,98,0): 117, 60, 51, + (19,99,0): 125, 60, 54, + (19,100,0): 133, 59, 56, + (19,101,0): 137, 59, 57, + (19,102,0): 138, 59, 55, + (19,103,0): 136, 58, 54, + (19,104,0): 137, 62, 56, + (19,105,0): 134, 64, 56, + (19,106,0): 134, 66, 57, + (19,107,0): 133, 66, 57, + (19,108,0): 133, 67, 55, + (19,109,0): 134, 66, 55, + (19,110,0): 135, 65, 55, + (19,111,0): 137, 65, 53, + (19,112,0): 137, 64, 49, + (19,113,0): 137, 64, 47, + (19,114,0): 136, 63, 46, + (19,115,0): 136, 63, 46, + (19,116,0): 135, 62, 45, + (19,117,0): 136, 60, 44, + (19,118,0): 136, 59, 43, + (19,119,0): 137, 58, 43, + (19,120,0): 138, 56, 42, + (19,121,0): 138, 56, 42, + (19,122,0): 136, 57, 42, + (19,123,0): 133, 57, 41, + (19,124,0): 130, 59, 41, + (19,125,0): 125, 60, 40, + (19,126,0): 122, 61, 40, + (19,127,0): 120, 62, 42, + (19,128,0): 127, 64, 49, + (19,129,0): 122, 55, 46, + (19,130,0): 120, 56, 46, + (19,131,0): 120, 60, 49, + (19,132,0): 117, 59, 45, + (19,133,0): 118, 62, 47, + (19,134,0): 123, 65, 51, + (19,135,0): 123, 64, 50, + (19,136,0): 128, 66, 55, + (19,137,0): 132, 68, 58, + (19,138,0): 135, 71, 61, + (19,139,0): 137, 73, 63, + (19,140,0): 136, 73, 64, + (19,141,0): 138, 75, 66, + (19,142,0): 138, 78, 68, + (19,143,0): 140, 80, 72, + (19,144,0): 144, 81, 74, + (19,145,0): 147, 90, 81, + (19,146,0): 148, 101, 91, + (19,147,0): 143, 114, 98, + (19,148,0): 137, 125, 103, + (19,149,0): 132, 136, 109, + (19,150,0): 131, 147, 118, + (19,151,0): 131, 156, 124, + (19,152,0): 135, 165, 131, + (19,153,0): 136, 167, 135, + (19,154,0): 139, 168, 137, + (19,155,0): 143, 168, 138, + (19,156,0): 143, 163, 135, + (19,157,0): 139, 158, 130, + (19,158,0): 136, 152, 126, + (19,159,0): 127, 150, 121, + (19,160,0): 114, 148, 111, + (19,161,0): 108, 146, 105, + (19,162,0): 104, 142, 103, + (19,163,0): 102, 140, 101, + (19,164,0): 103, 139, 103, + (19,165,0): 100, 134, 101, + (19,166,0): 96, 125, 95, + (19,167,0): 92, 118, 91, + (19,168,0): 81, 103, 80, + (19,169,0): 76, 93, 74, + (19,170,0): 66, 80, 63, + (19,171,0): 57, 68, 54, + (19,172,0): 50, 58, 47, + (19,173,0): 46, 52, 42, + (19,174,0): 44, 47, 40, + (19,175,0): 45, 42, 37, + (19,176,0): 53, 37, 38, + (19,177,0): 56, 35, 40, + (19,178,0): 56, 35, 40, + (19,179,0): 55, 36, 40, + (19,180,0): 52, 37, 40, + (19,181,0): 51, 39, 43, + (19,182,0): 50, 41, 44, + (19,183,0): 48, 44, 45, + (19,184,0): 44, 42, 43, + (19,185,0): 43, 43, 45, + (19,186,0): 42, 43, 45, + (19,187,0): 40, 44, 45, + (19,188,0): 39, 44, 47, + (19,189,0): 39, 44, 47, + (19,190,0): 37, 45, 47, + (19,191,0): 40, 44, 45, + (19,192,0): 46, 42, 43, + (19,193,0): 49, 43, 43, + (19,194,0): 48, 43, 39, + (19,195,0): 46, 43, 34, + (19,196,0): 56, 56, 44, + (19,197,0): 80, 85, 65, + (19,198,0): 105, 113, 89, + (19,199,0): 118, 132, 99, + (19,200,0): 123, 140, 104, + (19,201,0): 121, 143, 104, + (19,202,0): 124, 150, 105, + (19,203,0): 127, 156, 108, + (19,204,0): 125, 159, 109, + (19,205,0): 121, 158, 107, + (19,206,0): 122, 160, 109, + (19,207,0): 127, 165, 114, + (19,208,0): 130, 167, 116, + (19,209,0): 128, 165, 113, + (19,210,0): 125, 163, 112, + (19,211,0): 125, 163, 112, + (19,212,0): 125, 165, 115, + (19,213,0): 126, 165, 118, + (19,214,0): 126, 165, 120, + (19,215,0): 125, 164, 120, + (19,216,0): 124, 161, 120, + (19,217,0): 125, 159, 122, + (19,218,0): 122, 153, 119, + (19,219,0): 117, 144, 113, + (19,220,0): 110, 135, 106, + (19,221,0): 101, 124, 98, + (19,222,0): 87, 107, 82, + (19,223,0): 78, 91, 71, + (19,224,0): 69, 71, 57, + (19,225,0): 63, 61, 48, + (19,226,0): 57, 55, 42, + (20,0,0): 52, 53, 47, + (20,1,0): 52, 53, 47, + (20,2,0): 52, 53, 47, + (20,3,0): 53, 54, 48, + (20,4,0): 53, 54, 48, + (20,5,0): 53, 54, 48, + (20,6,0): 55, 54, 49, + (20,7,0): 55, 54, 49, + (20,8,0): 56, 55, 50, + (20,9,0): 56, 55, 50, + (20,10,0): 59, 56, 51, + (20,11,0): 60, 57, 52, + (20,12,0): 60, 57, 52, + (20,13,0): 60, 57, 52, + (20,14,0): 60, 55, 51, + (20,15,0): 60, 55, 51, + (20,16,0): 60, 52, 49, + (20,17,0): 60, 52, 49, + (20,18,0): 59, 51, 48, + (20,19,0): 59, 51, 48, + (20,20,0): 56, 51, 48, + (20,21,0): 55, 50, 47, + (20,22,0): 54, 49, 46, + (20,23,0): 54, 49, 46, + (20,24,0): 53, 49, 48, + (20,25,0): 54, 50, 49, + (20,26,0): 54, 50, 49, + (20,27,0): 51, 49, 50, + (20,28,0): 50, 48, 49, + (20,29,0): 49, 47, 48, + (20,30,0): 48, 46, 47, + (20,31,0): 49, 45, 46, + (20,32,0): 50, 44, 48, + (20,33,0): 52, 43, 46, + (20,34,0): 52, 43, 46, + (20,35,0): 52, 43, 46, + (20,36,0): 50, 44, 46, + (20,37,0): 50, 44, 44, + (20,38,0): 50, 44, 44, + (20,39,0): 50, 44, 44, + (20,40,0): 51, 47, 46, + (20,41,0): 51, 47, 44, + (20,42,0): 51, 47, 44, + (20,43,0): 51, 47, 44, + (20,44,0): 50, 49, 44, + (20,45,0): 50, 49, 44, + (20,46,0): 51, 50, 45, + (20,47,0): 51, 50, 46, + (20,48,0): 51, 50, 48, + (20,49,0): 51, 50, 48, + (20,50,0): 51, 50, 48, + (20,51,0): 51, 50, 48, + (20,52,0): 53, 49, 48, + (20,53,0): 53, 49, 46, + (20,54,0): 54, 49, 46, + (20,55,0): 54, 49, 45, + (20,56,0): 59, 52, 46, + (20,57,0): 60, 53, 47, + (20,58,0): 61, 52, 45, + (20,59,0): 63, 54, 45, + (20,60,0): 65, 55, 46, + (20,61,0): 66, 56, 47, + (20,62,0): 69, 56, 47, + (20,63,0): 67, 57, 47, + (20,64,0): 68, 58, 49, + (20,65,0): 68, 58, 49, + (20,66,0): 69, 59, 50, + (20,67,0): 68, 58, 49, + (20,68,0): 67, 57, 48, + (20,69,0): 66, 56, 47, + (20,70,0): 64, 53, 47, + (20,71,0): 64, 53, 47, + (20,72,0): 62, 51, 47, + (20,73,0): 62, 51, 47, + (20,74,0): 61, 50, 46, + (20,75,0): 61, 50, 46, + (20,76,0): 61, 50, 48, + (20,77,0): 61, 50, 48, + (20,78,0): 62, 51, 49, + (20,79,0): 62, 51, 49, + (20,80,0): 66, 52, 49, + (20,81,0): 70, 50, 49, + (20,82,0): 78, 48, 50, + (20,83,0): 85, 44, 52, + (20,84,0): 90, 40, 51, + (20,85,0): 89, 39, 50, + (20,86,0): 83, 40, 49, + (20,87,0): 76, 44, 49, + (20,88,0): 68, 50, 48, + (20,89,0): 60, 53, 45, + (20,90,0): 57, 55, 43, + (20,91,0): 60, 54, 42, + (20,92,0): 68, 51, 41, + (20,93,0): 78, 49, 41, + (20,94,0): 90, 47, 41, + (20,95,0): 94, 47, 41, + (20,96,0): 102, 58, 49, + (20,97,0): 106, 59, 51, + (20,98,0): 115, 60, 55, + (20,99,0): 122, 61, 58, + (20,100,0): 130, 60, 58, + (20,101,0): 134, 60, 59, + (20,102,0): 135, 59, 59, + (20,103,0): 134, 58, 58, + (20,104,0): 130, 59, 55, + (20,105,0): 129, 62, 56, + (20,106,0): 129, 65, 56, + (20,107,0): 129, 66, 57, + (20,108,0): 131, 67, 58, + (20,109,0): 131, 67, 58, + (20,110,0): 133, 64, 57, + (20,111,0): 132, 64, 55, + (20,112,0): 132, 66, 50, + (20,113,0): 132, 67, 49, + (20,114,0): 133, 64, 48, + (20,115,0): 134, 62, 47, + (20,116,0): 136, 60, 46, + (20,117,0): 137, 59, 46, + (20,118,0): 139, 57, 45, + (20,119,0): 140, 56, 45, + (20,120,0): 138, 54, 43, + (20,121,0): 137, 55, 43, + (20,122,0): 135, 56, 43, + (20,123,0): 131, 58, 43, + (20,124,0): 127, 60, 43, + (20,125,0): 122, 61, 42, + (20,126,0): 119, 62, 42, + (20,127,0): 120, 62, 42, + (20,128,0): 127, 57, 45, + (20,129,0): 122, 48, 39, + (20,130,0): 129, 56, 47, + (20,131,0): 131, 63, 52, + (20,132,0): 117, 53, 43, + (20,133,0): 113, 53, 42, + (20,134,0): 124, 66, 54, + (20,135,0): 125, 67, 55, + (20,136,0): 127, 69, 58, + (20,137,0): 129, 71, 60, + (20,138,0): 131, 73, 62, + (20,139,0): 132, 74, 63, + (20,140,0): 133, 74, 66, + (20,141,0): 135, 76, 68, + (20,142,0): 138, 79, 71, + (20,143,0): 137, 85, 74, + (20,144,0): 130, 94, 78, + (20,145,0): 129, 102, 81, + (20,146,0): 134, 109, 89, + (20,147,0): 135, 114, 93, + (20,148,0): 136, 121, 98, + (20,149,0): 137, 131, 105, + (20,150,0): 141, 144, 117, + (20,151,0): 141, 154, 124, + (20,152,0): 138, 159, 126, + (20,153,0): 136, 163, 130, + (20,154,0): 136, 167, 133, + (20,155,0): 137, 168, 134, + (20,156,0): 135, 166, 132, + (20,157,0): 132, 162, 128, + (20,158,0): 129, 156, 125, + (20,159,0): 127, 151, 119, + (20,160,0): 125, 144, 112, + (20,161,0): 125, 142, 108, + (20,162,0): 123, 140, 108, + (20,163,0): 120, 139, 107, + (20,164,0): 120, 139, 109, + (20,165,0): 117, 136, 108, + (20,166,0): 112, 131, 103, + (20,167,0): 108, 126, 100, + (20,168,0): 99, 113, 88, + (20,169,0): 92, 104, 82, + (20,170,0): 83, 90, 72, + (20,171,0): 73, 75, 61, + (20,172,0): 66, 64, 52, + (20,173,0): 61, 54, 44, + (20,174,0): 57, 47, 38, + (20,175,0): 55, 42, 36, + (20,176,0): 57, 39, 39, + (20,177,0): 57, 37, 39, + (20,178,0): 54, 38, 39, + (20,179,0): 52, 38, 38, + (20,180,0): 49, 39, 38, + (20,181,0): 46, 40, 40, + (20,182,0): 44, 43, 41, + (20,183,0): 44, 44, 42, + (20,184,0): 41, 43, 40, + (20,185,0): 41, 43, 42, + (20,186,0): 41, 43, 42, + (20,187,0): 41, 43, 42, + (20,188,0): 42, 42, 44, + (20,189,0): 42, 42, 44, + (20,190,0): 43, 41, 44, + (20,191,0): 45, 41, 42, + (20,192,0): 44, 35, 36, + (20,193,0): 50, 42, 39, + (20,194,0): 53, 48, 42, + (20,195,0): 56, 54, 42, + (20,196,0): 66, 67, 53, + (20,197,0): 85, 90, 70, + (20,198,0): 102, 112, 87, + (20,199,0): 110, 125, 94, + (20,200,0): 116, 136, 101, + (20,201,0): 113, 138, 98, + (20,202,0): 117, 144, 101, + (20,203,0): 120, 152, 105, + (20,204,0): 119, 155, 107, + (20,205,0): 115, 153, 104, + (20,206,0): 116, 154, 105, + (20,207,0): 119, 159, 107, + (20,208,0): 122, 162, 110, + (20,209,0): 120, 160, 108, + (20,210,0): 119, 159, 109, + (20,211,0): 120, 160, 110, + (20,212,0): 121, 163, 115, + (20,213,0): 123, 165, 117, + (20,214,0): 123, 165, 119, + (20,215,0): 124, 163, 119, + (20,216,0): 121, 158, 117, + (20,217,0): 122, 156, 119, + (20,218,0): 119, 150, 116, + (20,219,0): 115, 142, 111, + (20,220,0): 109, 134, 104, + (20,221,0): 100, 123, 95, + (20,222,0): 87, 107, 80, + (20,223,0): 78, 92, 69, + (20,224,0): 68, 69, 55, + (20,225,0): 62, 58, 47, + (20,226,0): 56, 52, 41, + (21,0,0): 53, 54, 48, + (21,1,0): 53, 54, 48, + (21,2,0): 54, 55, 49, + (21,3,0): 54, 55, 49, + (21,4,0): 55, 56, 50, + (21,5,0): 55, 56, 50, + (21,6,0): 56, 55, 50, + (21,7,0): 56, 55, 50, + (21,8,0): 57, 56, 51, + (21,9,0): 58, 57, 52, + (21,10,0): 61, 58, 53, + (21,11,0): 62, 59, 54, + (21,12,0): 62, 59, 54, + (21,13,0): 62, 59, 54, + (21,14,0): 62, 57, 53, + (21,15,0): 62, 57, 53, + (21,16,0): 63, 55, 52, + (21,17,0): 63, 55, 52, + (21,18,0): 62, 54, 51, + (21,19,0): 61, 53, 50, + (21,20,0): 59, 54, 51, + (21,21,0): 58, 53, 50, + (21,22,0): 57, 52, 49, + (21,23,0): 57, 52, 49, + (21,24,0): 56, 52, 49, + (21,25,0): 56, 52, 51, + (21,26,0): 57, 53, 52, + (21,27,0): 56, 52, 51, + (21,28,0): 55, 51, 50, + (21,29,0): 52, 51, 49, + (21,30,0): 53, 49, 50, + (21,31,0): 52, 48, 47, + (21,32,0): 54, 45, 48, + (21,33,0): 54, 45, 46, + (21,34,0): 54, 45, 48, + (21,35,0): 54, 45, 46, + (21,36,0): 52, 46, 46, + (21,37,0): 52, 46, 46, + (21,38,0): 52, 46, 46, + (21,39,0): 52, 47, 44, + (21,40,0): 52, 48, 45, + (21,41,0): 52, 48, 45, + (21,42,0): 52, 48, 45, + (21,43,0): 53, 49, 46, + (21,44,0): 51, 50, 45, + (21,45,0): 51, 50, 45, + (21,46,0): 52, 51, 46, + (21,47,0): 52, 51, 46, + (21,48,0): 52, 51, 47, + (21,49,0): 52, 51, 49, + (21,50,0): 53, 52, 50, + (21,51,0): 53, 52, 48, + (21,52,0): 56, 52, 49, + (21,53,0): 56, 53, 48, + (21,54,0): 57, 52, 48, + (21,55,0): 58, 53, 47, + (21,56,0): 61, 54, 48, + (21,57,0): 62, 55, 47, + (21,58,0): 64, 55, 46, + (21,59,0): 65, 56, 47, + (21,60,0): 67, 57, 48, + (21,61,0): 68, 58, 48, + (21,62,0): 71, 58, 49, + (21,63,0): 72, 59, 50, + (21,64,0): 70, 60, 51, + (21,65,0): 70, 60, 51, + (21,66,0): 70, 60, 51, + (21,67,0): 70, 60, 51, + (21,68,0): 69, 59, 50, + (21,69,0): 67, 57, 48, + (21,70,0): 66, 55, 49, + (21,71,0): 65, 54, 48, + (21,72,0): 64, 53, 49, + (21,73,0): 64, 53, 49, + (21,74,0): 63, 52, 48, + (21,75,0): 62, 51, 47, + (21,76,0): 62, 51, 49, + (21,77,0): 63, 52, 50, + (21,78,0): 64, 53, 51, + (21,79,0): 64, 53, 51, + (21,80,0): 65, 54, 50, + (21,81,0): 68, 53, 50, + (21,82,0): 75, 50, 53, + (21,83,0): 81, 49, 54, + (21,84,0): 86, 46, 54, + (21,85,0): 85, 45, 53, + (21,86,0): 82, 47, 53, + (21,87,0): 75, 49, 50, + (21,88,0): 68, 53, 50, + (21,89,0): 63, 56, 48, + (21,90,0): 61, 57, 45, + (21,91,0): 63, 57, 43, + (21,92,0): 67, 55, 41, + (21,93,0): 73, 54, 40, + (21,94,0): 83, 50, 41, + (21,95,0): 88, 50, 41, + (21,96,0): 93, 50, 43, + (21,97,0): 100, 51, 44, + (21,98,0): 108, 53, 48, + (21,99,0): 118, 54, 52, + (21,100,0): 125, 55, 55, + (21,101,0): 130, 56, 55, + (21,102,0): 131, 55, 55, + (21,103,0): 130, 54, 54, + (21,104,0): 126, 55, 53, + (21,105,0): 125, 58, 52, + (21,106,0): 125, 60, 54, + (21,107,0): 125, 62, 53, + (21,108,0): 128, 63, 57, + (21,109,0): 131, 64, 56, + (21,110,0): 134, 63, 57, + (21,111,0): 133, 65, 56, + (21,112,0): 131, 65, 51, + (21,113,0): 131, 65, 49, + (21,114,0): 132, 65, 49, + (21,115,0): 132, 63, 48, + (21,116,0): 136, 60, 47, + (21,117,0): 136, 58, 46, + (21,118,0): 137, 57, 46, + (21,119,0): 138, 56, 45, + (21,120,0): 135, 55, 44, + (21,121,0): 134, 56, 44, + (21,122,0): 131, 57, 44, + (21,123,0): 128, 59, 44, + (21,124,0): 126, 60, 44, + (21,125,0): 124, 61, 44, + (21,126,0): 121, 62, 44, + (21,127,0): 126, 60, 44, + (21,128,0): 133, 53, 42, + (21,129,0): 138, 51, 44, + (21,130,0): 160, 77, 69, + (21,131,0): 166, 89, 81, + (21,132,0): 138, 65, 56, + (21,133,0): 124, 57, 48, + (21,134,0): 130, 70, 59, + (21,135,0): 128, 75, 61, + (21,136,0): 123, 71, 58, + (21,137,0): 122, 74, 60, + (21,138,0): 124, 76, 62, + (21,139,0): 125, 77, 63, + (21,140,0): 127, 77, 66, + (21,141,0): 130, 80, 69, + (21,142,0): 137, 85, 74, + (21,143,0): 134, 92, 76, + (21,144,0): 119, 105, 79, + (21,145,0): 117, 112, 82, + (21,146,0): 130, 114, 88, + (21,147,0): 141, 117, 93, + (21,148,0): 150, 117, 98, + (21,149,0): 159, 124, 105, + (21,150,0): 166, 135, 115, + (21,151,0): 167, 145, 122, + (21,152,0): 157, 147, 122, + (21,153,0): 150, 153, 124, + (21,154,0): 146, 160, 127, + (21,155,0): 143, 165, 129, + (21,156,0): 139, 165, 130, + (21,157,0): 134, 161, 126, + (21,158,0): 130, 156, 121, + (21,159,0): 131, 150, 118, + (21,160,0): 134, 143, 112, + (21,161,0): 136, 141, 111, + (21,162,0): 134, 140, 112, + (21,163,0): 131, 142, 112, + (21,164,0): 129, 142, 112, + (21,165,0): 126, 141, 112, + (21,166,0): 122, 138, 109, + (21,167,0): 118, 134, 107, + (21,168,0): 109, 125, 98, + (21,169,0): 104, 116, 92, + (21,170,0): 96, 104, 83, + (21,171,0): 87, 90, 71, + (21,172,0): 80, 77, 62, + (21,173,0): 72, 64, 51, + (21,174,0): 66, 54, 42, + (21,175,0): 64, 47, 39, + (21,176,0): 61, 43, 39, + (21,177,0): 60, 42, 40, + (21,178,0): 56, 42, 39, + (21,179,0): 53, 42, 40, + (21,180,0): 50, 42, 39, + (21,181,0): 47, 44, 39, + (21,182,0): 44, 45, 39, + (21,183,0): 43, 45, 40, + (21,184,0): 43, 45, 40, + (21,185,0): 44, 45, 40, + (21,186,0): 45, 44, 42, + (21,187,0): 47, 43, 42, + (21,188,0): 51, 41, 42, + (21,189,0): 52, 40, 42, + (21,190,0): 54, 39, 42, + (21,191,0): 54, 40, 40, + (21,192,0): 51, 40, 36, + (21,193,0): 60, 51, 44, + (21,194,0): 69, 62, 52, + (21,195,0): 73, 71, 56, + (21,196,0): 81, 82, 64, + (21,197,0): 93, 98, 75, + (21,198,0): 103, 113, 86, + (21,199,0): 106, 121, 90, + (21,200,0): 110, 130, 93, + (21,201,0): 107, 132, 92, + (21,202,0): 108, 137, 93, + (21,203,0): 112, 145, 98, + (21,204,0): 113, 149, 101, + (21,205,0): 111, 149, 100, + (21,206,0): 111, 151, 101, + (21,207,0): 114, 154, 102, + (21,208,0): 117, 159, 109, + (21,209,0): 114, 156, 106, + (21,210,0): 113, 155, 105, + (21,211,0): 116, 158, 110, + (21,212,0): 120, 162, 114, + (21,213,0): 122, 164, 118, + (21,214,0): 121, 162, 118, + (21,215,0): 121, 159, 118, + (21,216,0): 118, 154, 116, + (21,217,0): 119, 153, 118, + (21,218,0): 117, 148, 114, + (21,219,0): 111, 141, 107, + (21,220,0): 106, 133, 102, + (21,221,0): 99, 124, 94, + (21,222,0): 85, 108, 79, + (21,223,0): 78, 92, 69, + (21,224,0): 67, 68, 54, + (21,225,0): 64, 57, 47, + (21,226,0): 58, 51, 41, + (22,0,0): 54, 55, 49, + (22,1,0): 55, 56, 50, + (22,2,0): 55, 56, 50, + (22,3,0): 55, 56, 50, + (22,4,0): 56, 57, 51, + (22,5,0): 56, 57, 51, + (22,6,0): 57, 56, 51, + (22,7,0): 58, 57, 52, + (22,8,0): 58, 57, 52, + (22,9,0): 59, 58, 53, + (22,10,0): 62, 59, 54, + (22,11,0): 63, 60, 55, + (22,12,0): 63, 60, 55, + (22,13,0): 63, 60, 55, + (22,14,0): 64, 59, 55, + (22,15,0): 64, 59, 55, + (22,16,0): 66, 58, 55, + (22,17,0): 66, 58, 55, + (22,18,0): 65, 57, 54, + (22,19,0): 64, 56, 53, + (22,20,0): 61, 56, 52, + (22,21,0): 61, 56, 52, + (22,22,0): 60, 55, 51, + (22,23,0): 60, 55, 51, + (22,24,0): 60, 55, 51, + (22,25,0): 60, 55, 52, + (22,26,0): 60, 55, 52, + (22,27,0): 60, 55, 52, + (22,28,0): 59, 54, 51, + (22,29,0): 57, 53, 50, + (22,30,0): 57, 51, 51, + (22,31,0): 56, 51, 48, + (22,32,0): 56, 47, 48, + (22,33,0): 57, 47, 46, + (22,34,0): 56, 47, 48, + (22,35,0): 56, 48, 46, + (22,36,0): 56, 48, 46, + (22,37,0): 56, 48, 46, + (22,38,0): 54, 49, 46, + (22,39,0): 54, 49, 45, + (22,40,0): 54, 49, 45, + (22,41,0): 54, 49, 45, + (22,42,0): 53, 50, 45, + (22,43,0): 53, 50, 45, + (22,44,0): 54, 51, 46, + (22,45,0): 54, 51, 46, + (22,46,0): 55, 52, 47, + (22,47,0): 55, 52, 47, + (22,48,0): 53, 52, 48, + (22,49,0): 53, 52, 48, + (22,50,0): 56, 52, 49, + (22,51,0): 57, 53, 50, + (22,52,0): 58, 54, 51, + (22,53,0): 60, 57, 52, + (22,54,0): 61, 56, 52, + (22,55,0): 64, 57, 51, + (22,56,0): 64, 55, 48, + (22,57,0): 65, 56, 47, + (22,58,0): 67, 57, 48, + (22,59,0): 68, 58, 48, + (22,60,0): 71, 58, 49, + (22,61,0): 72, 60, 48, + (22,62,0): 73, 61, 49, + (22,63,0): 73, 61, 49, + (22,64,0): 74, 61, 52, + (22,65,0): 74, 61, 52, + (22,66,0): 74, 61, 52, + (22,67,0): 73, 60, 51, + (22,68,0): 70, 60, 51, + (22,69,0): 68, 58, 49, + (22,70,0): 66, 56, 47, + (22,71,0): 65, 55, 46, + (22,72,0): 65, 56, 49, + (22,73,0): 64, 55, 48, + (22,74,0): 64, 55, 50, + (22,75,0): 63, 54, 49, + (22,76,0): 63, 54, 49, + (22,77,0): 64, 55, 50, + (22,78,0): 64, 55, 50, + (22,79,0): 65, 56, 51, + (22,80,0): 64, 54, 52, + (22,81,0): 65, 55, 53, + (22,82,0): 67, 56, 54, + (22,83,0): 70, 56, 55, + (22,84,0): 72, 57, 54, + (22,85,0): 74, 56, 54, + (22,86,0): 74, 56, 54, + (22,87,0): 72, 57, 52, + (22,88,0): 69, 56, 48, + (22,89,0): 69, 56, 47, + (22,90,0): 69, 57, 45, + (22,91,0): 70, 56, 43, + (22,92,0): 73, 57, 44, + (22,93,0): 73, 57, 42, + (22,94,0): 76, 57, 43, + (22,95,0): 82, 54, 42, + (22,96,0): 90, 47, 38, + (22,97,0): 100, 47, 39, + (22,98,0): 110, 51, 45, + (22,99,0): 122, 54, 51, + (22,100,0): 131, 57, 56, + (22,101,0): 137, 59, 57, + (22,102,0): 139, 59, 58, + (22,103,0): 139, 61, 59, + (22,104,0): 139, 65, 62, + (22,105,0): 135, 64, 58, + (22,106,0): 130, 61, 54, + (22,107,0): 127, 60, 51, + (22,108,0): 127, 58, 51, + (22,109,0): 130, 60, 52, + (22,110,0): 136, 61, 55, + (22,111,0): 138, 64, 55, + (22,112,0): 133, 63, 53, + (22,113,0): 132, 64, 51, + (22,114,0): 132, 62, 50, + (22,115,0): 134, 62, 50, + (22,116,0): 134, 60, 49, + (22,117,0): 133, 59, 48, + (22,118,0): 132, 58, 47, + (22,119,0): 131, 59, 47, + (22,120,0): 128, 58, 46, + (22,121,0): 127, 59, 46, + (22,122,0): 126, 60, 46, + (22,123,0): 127, 61, 47, + (22,124,0): 127, 61, 47, + (22,125,0): 128, 60, 47, + (22,126,0): 129, 59, 47, + (22,127,0): 135, 57, 47, + (22,128,0): 144, 49, 43, + (22,129,0): 160, 61, 56, + (22,130,0): 203, 108, 102, + (22,131,0): 216, 127, 121, + (22,132,0): 171, 91, 84, + (22,133,0): 138, 68, 60, + (22,134,0): 136, 76, 65, + (22,135,0): 127, 78, 64, + (22,136,0): 117, 73, 60, + (22,137,0): 114, 77, 61, + (22,138,0): 113, 80, 63, + (22,139,0): 114, 81, 64, + (22,140,0): 118, 83, 64, + (22,141,0): 124, 85, 68, + (22,142,0): 132, 90, 74, + (22,143,0): 128, 100, 79, + (22,144,0): 113, 113, 79, + (22,145,0): 116, 120, 85, + (22,146,0): 138, 118, 91, + (22,147,0): 156, 115, 95, + (22,148,0): 173, 109, 99, + (22,149,0): 186, 107, 102, + (22,150,0): 194, 111, 107, + (22,151,0): 195, 116, 111, + (22,152,0): 191, 128, 119, + (22,153,0): 183, 137, 122, + (22,154,0): 173, 148, 126, + (22,155,0): 163, 156, 128, + (22,156,0): 154, 159, 129, + (22,157,0): 145, 159, 126, + (22,158,0): 139, 154, 121, + (22,159,0): 137, 151, 118, + (22,160,0): 140, 143, 114, + (22,161,0): 142, 142, 114, + (22,162,0): 139, 144, 114, + (22,163,0): 135, 146, 114, + (22,164,0): 132, 147, 114, + (22,165,0): 128, 147, 115, + (22,166,0): 122, 146, 112, + (22,167,0): 119, 144, 112, + (22,168,0): 112, 137, 105, + (22,169,0): 107, 130, 101, + (22,170,0): 103, 119, 92, + (22,171,0): 94, 107, 81, + (22,172,0): 88, 93, 71, + (22,173,0): 80, 79, 59, + (22,174,0): 72, 67, 48, + (22,175,0): 67, 58, 43, + (22,176,0): 65, 50, 43, + (22,177,0): 64, 49, 44, + (22,178,0): 59, 48, 42, + (22,179,0): 56, 47, 42, + (22,180,0): 52, 47, 41, + (22,181,0): 50, 47, 40, + (22,182,0): 46, 47, 39, + (22,183,0): 46, 47, 41, + (22,184,0): 48, 47, 42, + (22,185,0): 51, 46, 42, + (22,186,0): 54, 44, 43, + (22,187,0): 58, 42, 43, + (22,188,0): 62, 40, 43, + (22,189,0): 65, 38, 43, + (22,190,0): 69, 36, 43, + (22,191,0): 67, 38, 40, + (22,192,0): 70, 53, 45, + (22,193,0): 76, 67, 52, + (22,194,0): 86, 81, 62, + (22,195,0): 91, 89, 68, + (22,196,0): 96, 98, 74, + (22,197,0): 103, 109, 81, + (22,198,0): 105, 119, 86, + (22,199,0): 106, 123, 87, + (22,200,0): 108, 130, 91, + (22,201,0): 103, 130, 87, + (22,202,0): 102, 134, 87, + (22,203,0): 108, 142, 92, + (22,204,0): 111, 148, 97, + (22,205,0): 110, 148, 97, + (22,206,0): 110, 150, 98, + (22,207,0): 114, 154, 102, + (22,208,0): 115, 157, 107, + (22,209,0): 111, 155, 106, + (22,210,0): 111, 153, 105, + (22,211,0): 114, 156, 110, + (22,212,0): 119, 160, 116, + (22,213,0): 121, 162, 120, + (22,214,0): 120, 158, 119, + (22,215,0): 117, 155, 118, + (22,216,0): 115, 151, 115, + (22,217,0): 117, 151, 118, + (22,218,0): 115, 146, 114, + (22,219,0): 110, 139, 108, + (22,220,0): 105, 132, 99, + (22,221,0): 98, 123, 91, + (22,222,0): 84, 109, 77, + (22,223,0): 77, 93, 67, + (22,224,0): 72, 73, 59, + (22,225,0): 69, 60, 51, + (22,226,0): 63, 54, 45, + (23,0,0): 55, 56, 50, + (23,1,0): 55, 56, 50, + (23,2,0): 56, 57, 51, + (23,3,0): 56, 57, 51, + (23,4,0): 56, 57, 51, + (23,5,0): 57, 58, 52, + (23,6,0): 58, 57, 52, + (23,7,0): 58, 57, 52, + (23,8,0): 59, 58, 53, + (23,9,0): 60, 59, 54, + (23,10,0): 63, 60, 55, + (23,11,0): 64, 61, 56, + (23,12,0): 64, 61, 56, + (23,13,0): 64, 61, 56, + (23,14,0): 65, 60, 56, + (23,15,0): 65, 60, 56, + (23,16,0): 67, 59, 56, + (23,17,0): 67, 59, 56, + (23,18,0): 67, 59, 56, + (23,19,0): 66, 58, 55, + (23,20,0): 63, 58, 54, + (23,21,0): 62, 57, 53, + (23,22,0): 62, 57, 53, + (23,23,0): 61, 56, 52, + (23,24,0): 62, 57, 53, + (23,25,0): 62, 57, 53, + (23,26,0): 62, 57, 53, + (23,27,0): 62, 57, 53, + (23,28,0): 61, 56, 53, + (23,29,0): 60, 55, 51, + (23,30,0): 58, 53, 49, + (23,31,0): 59, 51, 48, + (23,32,0): 58, 48, 46, + (23,33,0): 58, 48, 46, + (23,34,0): 57, 49, 46, + (23,35,0): 57, 49, 46, + (23,36,0): 57, 49, 47, + (23,37,0): 57, 49, 46, + (23,38,0): 57, 49, 46, + (23,39,0): 55, 50, 46, + (23,40,0): 54, 49, 45, + (23,41,0): 54, 49, 45, + (23,42,0): 54, 51, 46, + (23,43,0): 54, 51, 46, + (23,44,0): 54, 51, 46, + (23,45,0): 55, 52, 47, + (23,46,0): 55, 52, 47, + (23,47,0): 55, 52, 47, + (23,48,0): 53, 52, 48, + (23,49,0): 54, 53, 49, + (23,50,0): 57, 53, 50, + (23,51,0): 59, 56, 51, + (23,52,0): 60, 57, 52, + (23,53,0): 63, 58, 52, + (23,54,0): 66, 59, 53, + (23,55,0): 66, 59, 51, + (23,56,0): 65, 56, 47, + (23,57,0): 66, 58, 47, + (23,58,0): 67, 57, 47, + (23,59,0): 69, 59, 47, + (23,60,0): 72, 60, 48, + (23,61,0): 73, 61, 49, + (23,62,0): 74, 62, 50, + (23,63,0): 74, 62, 50, + (23,64,0): 75, 62, 53, + (23,65,0): 75, 62, 53, + (23,66,0): 74, 61, 52, + (23,67,0): 74, 61, 52, + (23,68,0): 70, 60, 51, + (23,69,0): 69, 59, 50, + (23,70,0): 67, 57, 48, + (23,71,0): 66, 56, 47, + (23,72,0): 66, 57, 50, + (23,73,0): 66, 57, 50, + (23,74,0): 65, 56, 51, + (23,75,0): 64, 55, 50, + (23,76,0): 64, 55, 50, + (23,77,0): 65, 56, 51, + (23,78,0): 66, 57, 52, + (23,79,0): 66, 57, 52, + (23,80,0): 63, 56, 50, + (23,81,0): 64, 57, 51, + (23,82,0): 66, 59, 53, + (23,83,0): 69, 60, 55, + (23,84,0): 71, 60, 54, + (23,85,0): 73, 60, 54, + (23,86,0): 77, 60, 53, + (23,87,0): 78, 59, 52, + (23,88,0): 77, 54, 46, + (23,89,0): 78, 54, 44, + (23,90,0): 81, 54, 43, + (23,91,0): 81, 54, 43, + (23,92,0): 81, 55, 42, + (23,93,0): 82, 56, 43, + (23,94,0): 80, 57, 41, + (23,95,0): 86, 54, 39, + (23,96,0): 103, 53, 42, + (23,97,0): 114, 54, 44, + (23,98,0): 126, 59, 51, + (23,99,0): 137, 64, 57, + (23,100,0): 149, 68, 64, + (23,101,0): 155, 72, 68, + (23,102,0): 159, 74, 71, + (23,103,0): 159, 76, 70, + (23,104,0): 160, 81, 74, + (23,105,0): 153, 76, 68, + (23,106,0): 142, 68, 59, + (23,107,0): 133, 59, 48, + (23,108,0): 132, 55, 45, + (23,109,0): 133, 55, 45, + (23,110,0): 140, 57, 49, + (23,111,0): 143, 60, 52, + (23,112,0): 139, 60, 53, + (23,113,0): 138, 61, 55, + (23,114,0): 137, 60, 54, + (23,115,0): 136, 59, 53, + (23,116,0): 136, 59, 53, + (23,117,0): 132, 59, 52, + (23,118,0): 128, 60, 51, + (23,119,0): 125, 61, 51, + (23,120,0): 122, 62, 51, + (23,121,0): 122, 62, 51, + (23,122,0): 122, 62, 51, + (23,123,0): 125, 61, 51, + (23,124,0): 129, 59, 51, + (23,125,0): 134, 57, 51, + (23,126,0): 139, 54, 51, + (23,127,0): 146, 51, 49, + (23,128,0): 150, 41, 38, + (23,129,0): 176, 63, 59, + (23,130,0): 234, 125, 122, + (23,131,0): 252, 150, 146, + (23,132,0): 195, 104, 99, + (23,133,0): 149, 72, 64, + (23,134,0): 137, 75, 64, + (23,135,0): 120, 72, 58, + (23,136,0): 112, 76, 60, + (23,137,0): 106, 81, 61, + (23,138,0): 104, 83, 62, + (23,139,0): 106, 86, 62, + (23,140,0): 111, 86, 64, + (23,141,0): 118, 90, 69, + (23,142,0): 128, 95, 76, + (23,143,0): 130, 102, 80, + (23,144,0): 124, 113, 81, + (23,145,0): 134, 118, 85, + (23,146,0): 160, 115, 92, + (23,147,0): 183, 107, 94, + (23,148,0): 203, 95, 95, + (23,149,0): 214, 84, 92, + (23,150,0): 218, 81, 91, + (23,151,0): 218, 82, 92, + (23,152,0): 230, 111, 117, + (23,153,0): 219, 121, 120, + (23,154,0): 207, 133, 124, + (23,155,0): 195, 142, 126, + (23,156,0): 184, 147, 128, + (23,157,0): 174, 148, 125, + (23,158,0): 165, 145, 120, + (23,159,0): 162, 142, 118, + (23,160,0): 159, 137, 114, + (23,161,0): 159, 137, 116, + (23,162,0): 156, 140, 117, + (23,163,0): 152, 142, 117, + (23,164,0): 148, 144, 117, + (23,165,0): 141, 144, 115, + (23,166,0): 137, 143, 115, + (23,167,0): 133, 144, 114, + (23,168,0): 127, 137, 110, + (23,169,0): 124, 133, 106, + (23,170,0): 119, 121, 97, + (23,171,0): 112, 110, 87, + (23,172,0): 105, 97, 78, + (23,173,0): 98, 82, 66, + (23,174,0): 87, 68, 53, + (23,175,0): 83, 59, 47, + (23,176,0): 79, 52, 45, + (23,177,0): 77, 49, 45, + (23,178,0): 73, 48, 44, + (23,179,0): 68, 47, 42, + (23,180,0): 64, 47, 40, + (23,181,0): 59, 46, 38, + (23,182,0): 55, 46, 39, + (23,183,0): 54, 47, 39, + (23,184,0): 57, 48, 41, + (23,185,0): 58, 47, 41, + (23,186,0): 61, 46, 43, + (23,187,0): 65, 44, 43, + (23,188,0): 70, 41, 43, + (23,189,0): 72, 40, 43, + (23,190,0): 75, 39, 43, + (23,191,0): 72, 41, 39, + (23,192,0): 84, 66, 52, + (23,193,0): 89, 81, 60, + (23,194,0): 100, 94, 70, + (23,195,0): 103, 101, 76, + (23,196,0): 105, 108, 79, + (23,197,0): 110, 117, 86, + (23,198,0): 109, 123, 88, + (23,199,0): 108, 126, 88, + (23,200,0): 107, 132, 90, + (23,201,0): 103, 132, 86, + (23,202,0): 103, 135, 86, + (23,203,0): 109, 143, 93, + (23,204,0): 112, 149, 98, + (23,205,0): 113, 150, 98, + (23,206,0): 114, 153, 100, + (23,207,0): 117, 157, 105, + (23,208,0): 116, 155, 108, + (23,209,0): 111, 153, 107, + (23,210,0): 111, 150, 106, + (23,211,0): 114, 153, 109, + (23,212,0): 119, 157, 118, + (23,213,0): 121, 159, 120, + (23,214,0): 119, 154, 121, + (23,215,0): 116, 150, 117, + (23,216,0): 115, 148, 117, + (23,217,0): 117, 148, 117, + (23,218,0): 115, 144, 113, + (23,219,0): 111, 138, 107, + (23,220,0): 105, 132, 101, + (23,221,0): 97, 124, 91, + (23,222,0): 84, 109, 77, + (23,223,0): 77, 93, 66, + (23,224,0): 78, 79, 63, + (23,225,0): 76, 67, 58, + (23,226,0): 69, 60, 51, + (24,0,0): 57, 58, 52, + (24,1,0): 57, 58, 52, + (24,2,0): 57, 58, 52, + (24,3,0): 57, 58, 52, + (24,4,0): 57, 58, 52, + (24,5,0): 58, 59, 53, + (24,6,0): 61, 60, 55, + (24,7,0): 61, 60, 55, + (24,8,0): 61, 60, 55, + (24,9,0): 61, 60, 55, + (24,10,0): 64, 61, 56, + (24,11,0): 64, 61, 56, + (24,12,0): 65, 62, 57, + (24,13,0): 66, 63, 58, + (24,14,0): 68, 63, 59, + (24,15,0): 68, 63, 59, + (24,16,0): 69, 64, 60, + (24,17,0): 69, 64, 60, + (24,18,0): 69, 64, 58, + (24,19,0): 68, 63, 57, + (24,20,0): 68, 63, 57, + (24,21,0): 67, 62, 56, + (24,22,0): 69, 62, 56, + (24,23,0): 68, 61, 55, + (24,24,0): 66, 59, 53, + (24,25,0): 66, 59, 53, + (24,26,0): 66, 59, 53, + (24,27,0): 66, 59, 53, + (24,28,0): 66, 58, 55, + (24,29,0): 66, 59, 53, + (24,30,0): 65, 58, 52, + (24,31,0): 65, 58, 52, + (24,32,0): 65, 56, 51, + (24,33,0): 65, 56, 51, + (24,34,0): 65, 56, 51, + (24,35,0): 64, 55, 50, + (24,36,0): 64, 54, 52, + (24,37,0): 62, 55, 49, + (24,38,0): 62, 55, 49, + (24,39,0): 62, 55, 49, + (24,40,0): 60, 55, 49, + (24,41,0): 60, 55, 49, + (24,42,0): 59, 54, 48, + (24,43,0): 58, 53, 47, + (24,44,0): 56, 53, 46, + (24,45,0): 56, 53, 46, + (24,46,0): 55, 52, 47, + (24,47,0): 55, 52, 47, + (24,48,0): 57, 54, 49, + (24,49,0): 57, 54, 49, + (24,50,0): 57, 54, 49, + (24,51,0): 58, 55, 48, + (24,52,0): 60, 55, 49, + (24,53,0): 61, 56, 50, + (24,54,0): 65, 58, 50, + (24,55,0): 66, 59, 49, + (24,56,0): 67, 58, 49, + (24,57,0): 68, 60, 49, + (24,58,0): 70, 60, 50, + (24,59,0): 74, 62, 50, + (24,60,0): 75, 63, 51, + (24,61,0): 76, 64, 50, + (24,62,0): 78, 64, 51, + (24,63,0): 78, 64, 53, + (24,64,0): 78, 64, 55, + (24,65,0): 78, 64, 55, + (24,66,0): 76, 63, 54, + (24,67,0): 75, 62, 53, + (24,68,0): 73, 60, 51, + (24,69,0): 72, 59, 50, + (24,70,0): 69, 59, 50, + (24,71,0): 69, 59, 50, + (24,72,0): 66, 57, 48, + (24,73,0): 65, 56, 47, + (24,74,0): 64, 57, 49, + (24,75,0): 63, 56, 48, + (24,76,0): 63, 56, 48, + (24,77,0): 63, 56, 48, + (24,78,0): 64, 57, 51, + (24,79,0): 64, 57, 51, + (24,80,0): 60, 53, 47, + (24,81,0): 77, 68, 61, + (24,82,0): 77, 64, 58, + (24,83,0): 75, 58, 51, + (24,84,0): 84, 64, 57, + (24,85,0): 82, 54, 50, + (24,86,0): 81, 48, 43, + (24,87,0): 95, 60, 54, + (24,88,0): 91, 52, 45, + (24,89,0): 94, 54, 46, + (24,90,0): 95, 52, 43, + (24,91,0): 92, 48, 39, + (24,92,0): 94, 47, 37, + (24,93,0): 101, 54, 44, + (24,94,0): 109, 61, 49, + (24,95,0): 114, 60, 48, + (24,96,0): 137, 73, 61, + (24,97,0): 143, 71, 59, + (24,98,0): 151, 73, 63, + (24,99,0): 159, 75, 65, + (24,100,0): 159, 70, 62, + (24,101,0): 155, 62, 55, + (24,102,0): 154, 61, 54, + (24,103,0): 158, 68, 59, + (24,104,0): 166, 78, 68, + (24,105,0): 164, 80, 69, + (24,106,0): 168, 86, 74, + (24,107,0): 171, 89, 75, + (24,108,0): 165, 79, 66, + (24,109,0): 153, 65, 53, + (24,110,0): 151, 59, 48, + (24,111,0): 156, 62, 54, + (24,112,0): 148, 57, 56, + (24,113,0): 146, 56, 56, + (24,114,0): 143, 53, 53, + (24,115,0): 137, 51, 50, + (24,116,0): 136, 55, 52, + (24,117,0): 135, 62, 56, + (24,118,0): 127, 63, 54, + (24,119,0): 117, 60, 49, + (24,120,0): 117, 65, 52, + (24,121,0): 115, 63, 50, + (24,122,0): 116, 59, 48, + (24,123,0): 121, 57, 48, + (24,124,0): 133, 54, 50, + (24,125,0): 142, 50, 51, + (24,126,0): 149, 44, 49, + (24,127,0): 155, 38, 44, + (24,128,0): 198, 72, 73, + (24,129,0): 229, 99, 97, + (24,130,0): 194, 70, 68, + (24,131,0): 202, 89, 85, + (24,132,0): 224, 122, 118, + (24,133,0): 171, 86, 79, + (24,134,0): 134, 70, 60, + (24,135,0): 132, 86, 70, + (24,136,0): 109, 82, 61, + (24,137,0): 105, 91, 65, + (24,138,0): 105, 98, 70, + (24,139,0): 107, 100, 72, + (24,140,0): 107, 95, 69, + (24,141,0): 111, 94, 68, + (24,142,0): 125, 99, 76, + (24,143,0): 141, 106, 84, + (24,144,0): 145, 99, 76, + (24,145,0): 177, 110, 93, + (24,146,0): 208, 111, 104, + (24,147,0): 218, 89, 93, + (24,148,0): 222, 59, 76, + (24,149,0): 229, 45, 69, + (24,150,0): 241, 44, 72, + (24,151,0): 243, 49, 76, + (24,152,0): 243, 65, 89, + (24,153,0): 233, 74, 92, + (24,154,0): 227, 91, 101, + (24,155,0): 226, 111, 114, + (24,156,0): 224, 124, 124, + (24,157,0): 218, 129, 125, + (24,158,0): 216, 133, 127, + (24,159,0): 215, 138, 130, + (24,160,0): 196, 126, 118, + (24,161,0): 192, 128, 119, + (24,162,0): 189, 131, 120, + (24,163,0): 185, 133, 120, + (24,164,0): 181, 135, 120, + (24,165,0): 175, 136, 119, + (24,166,0): 171, 138, 121, + (24,167,0): 167, 138, 120, + (24,168,0): 157, 128, 112, + (24,169,0): 157, 125, 110, + (24,170,0): 154, 121, 106, + (24,171,0): 150, 110, 98, + (24,172,0): 145, 98, 90, + (24,173,0): 135, 85, 78, + (24,174,0): 127, 72, 67, + (24,175,0): 123, 65, 63, + (24,176,0): 117, 58, 60, + (24,177,0): 103, 47, 50, + (24,178,0): 100, 48, 50, + (24,179,0): 97, 49, 49, + (24,180,0): 79, 39, 39, + (24,181,0): 71, 37, 35, + (24,182,0): 76, 48, 45, + (24,183,0): 77, 53, 49, + (24,184,0): 72, 51, 46, + (24,185,0): 69, 50, 44, + (24,186,0): 68, 49, 45, + (24,187,0): 70, 49, 46, + (24,188,0): 70, 46, 44, + (24,189,0): 71, 43, 42, + (24,190,0): 75, 45, 45, + (24,191,0): 81, 54, 47, + (24,192,0): 89, 72, 52, + (24,193,0): 96, 87, 58, + (24,194,0): 102, 95, 66, + (24,195,0): 103, 100, 69, + (24,196,0): 107, 111, 78, + (24,197,0): 117, 124, 90, + (24,198,0): 117, 132, 93, + (24,199,0): 111, 129, 89, + (24,200,0): 108, 131, 87, + (24,201,0): 108, 135, 90, + (24,202,0): 112, 141, 93, + (24,203,0): 114, 146, 97, + (24,204,0): 115, 149, 98, + (24,205,0): 117, 151, 100, + (24,206,0): 119, 153, 102, + (24,207,0): 118, 155, 104, + (24,208,0): 114, 150, 106, + (24,209,0): 115, 152, 111, + (24,210,0): 115, 151, 113, + (24,211,0): 113, 149, 111, + (24,212,0): 115, 149, 116, + (24,213,0): 119, 153, 120, + (24,214,0): 122, 152, 124, + (24,215,0): 121, 150, 122, + (24,216,0): 120, 149, 121, + (24,217,0): 115, 141, 114, + (24,218,0): 109, 135, 106, + (24,219,0): 107, 132, 102, + (24,220,0): 105, 130, 100, + (24,221,0): 97, 122, 90, + (24,222,0): 84, 109, 77, + (24,223,0): 79, 95, 68, + (24,224,0): 79, 80, 64, + (24,225,0): 84, 75, 66, + (24,226,0): 82, 73, 64, + (25,0,0): 57, 58, 52, + (25,1,0): 57, 58, 52, + (25,2,0): 57, 58, 52, + (25,3,0): 57, 58, 52, + (25,4,0): 58, 59, 53, + (25,5,0): 59, 60, 54, + (25,6,0): 62, 61, 56, + (25,7,0): 63, 62, 57, + (25,8,0): 62, 61, 56, + (25,9,0): 62, 61, 56, + (25,10,0): 65, 62, 57, + (25,11,0): 65, 62, 57, + (25,12,0): 66, 63, 58, + (25,13,0): 67, 64, 59, + (25,14,0): 68, 63, 59, + (25,15,0): 68, 63, 59, + (25,16,0): 70, 65, 61, + (25,17,0): 69, 64, 60, + (25,18,0): 69, 64, 58, + (25,19,0): 69, 64, 58, + (25,20,0): 68, 63, 57, + (25,21,0): 68, 63, 57, + (25,22,0): 69, 62, 56, + (25,23,0): 69, 62, 56, + (25,24,0): 69, 62, 56, + (25,25,0): 69, 62, 56, + (25,26,0): 69, 62, 56, + (25,27,0): 68, 61, 53, + (25,28,0): 67, 60, 54, + (25,29,0): 67, 60, 52, + (25,30,0): 68, 59, 52, + (25,31,0): 67, 58, 49, + (25,32,0): 66, 57, 50, + (25,33,0): 66, 57, 50, + (25,34,0): 66, 57, 50, + (25,35,0): 66, 57, 50, + (25,36,0): 65, 56, 51, + (25,37,0): 65, 56, 51, + (25,38,0): 64, 57, 51, + (25,39,0): 64, 57, 51, + (25,40,0): 62, 55, 49, + (25,41,0): 60, 55, 49, + (25,42,0): 59, 54, 48, + (25,43,0): 59, 54, 48, + (25,44,0): 57, 54, 47, + (25,45,0): 56, 53, 46, + (25,46,0): 55, 52, 47, + (25,47,0): 55, 52, 47, + (25,48,0): 57, 54, 49, + (25,49,0): 57, 54, 47, + (25,50,0): 57, 54, 47, + (25,51,0): 58, 55, 48, + (25,52,0): 60, 55, 49, + (25,53,0): 62, 58, 49, + (25,54,0): 65, 58, 48, + (25,55,0): 66, 60, 48, + (25,56,0): 67, 59, 48, + (25,57,0): 69, 59, 47, + (25,58,0): 73, 61, 49, + (25,59,0): 74, 62, 48, + (25,60,0): 76, 64, 50, + (25,61,0): 76, 64, 50, + (25,62,0): 78, 64, 51, + (25,63,0): 78, 64, 51, + (25,64,0): 78, 64, 53, + (25,65,0): 78, 64, 55, + (25,66,0): 77, 63, 54, + (25,67,0): 74, 61, 52, + (25,68,0): 73, 60, 51, + (25,69,0): 72, 59, 50, + (25,70,0): 69, 59, 50, + (25,71,0): 69, 59, 50, + (25,72,0): 67, 58, 49, + (25,73,0): 66, 57, 48, + (25,74,0): 64, 57, 49, + (25,75,0): 64, 57, 49, + (25,76,0): 64, 57, 49, + (25,77,0): 64, 57, 49, + (25,78,0): 65, 58, 52, + (25,79,0): 65, 58, 50, + (25,80,0): 67, 58, 51, + (25,81,0): 73, 56, 49, + (25,82,0): 75, 47, 43, + (25,83,0): 86, 46, 44, + (25,84,0): 106, 55, 54, + (25,85,0): 116, 58, 57, + (25,86,0): 123, 59, 59, + (25,87,0): 133, 69, 67, + (25,88,0): 129, 68, 63, + (25,89,0): 131, 72, 64, + (25,90,0): 132, 73, 65, + (25,91,0): 132, 72, 62, + (25,92,0): 141, 74, 66, + (25,93,0): 152, 79, 72, + (25,94,0): 161, 80, 76, + (25,95,0): 162, 79, 71, + (25,96,0): 147, 68, 55, + (25,97,0): 148, 66, 52, + (25,98,0): 154, 66, 54, + (25,99,0): 159, 67, 56, + (25,100,0): 160, 62, 51, + (25,101,0): 156, 55, 45, + (25,102,0): 156, 55, 45, + (25,103,0): 159, 61, 48, + (25,104,0): 163, 67, 53, + (25,105,0): 155, 63, 48, + (25,106,0): 153, 64, 48, + (25,107,0): 160, 69, 51, + (25,108,0): 164, 71, 54, + (25,109,0): 167, 70, 54, + (25,110,0): 174, 72, 58, + (25,111,0): 182, 78, 69, + (25,112,0): 181, 75, 77, + (25,113,0): 176, 71, 76, + (25,114,0): 167, 64, 68, + (25,115,0): 155, 56, 59, + (25,116,0): 147, 55, 56, + (25,117,0): 142, 61, 58, + (25,118,0): 133, 62, 56, + (25,119,0): 121, 61, 51, + (25,120,0): 114, 60, 48, + (25,121,0): 124, 72, 59, + (25,122,0): 135, 75, 65, + (25,123,0): 133, 62, 56, + (25,124,0): 133, 43, 43, + (25,125,0): 149, 40, 46, + (25,126,0): 181, 57, 68, + (25,127,0): 211, 75, 87, + (25,128,0): 219, 76, 78, + (25,129,0): 221, 79, 77, + (25,130,0): 199, 64, 61, + (25,131,0): 190, 65, 63, + (25,132,0): 208, 96, 92, + (25,133,0): 179, 89, 81, + (25,134,0): 132, 64, 53, + (25,135,0): 130, 84, 68, + (25,136,0): 121, 97, 73, + (25,137,0): 101, 91, 64, + (25,138,0): 96, 92, 63, + (25,139,0): 107, 104, 73, + (25,140,0): 117, 108, 79, + (25,141,0): 119, 102, 74, + (25,142,0): 127, 99, 75, + (25,143,0): 150, 99, 78, + (25,144,0): 185, 102, 88, + (25,145,0): 210, 97, 91, + (25,146,0): 224, 88, 90, + (25,147,0): 231, 67, 78, + (25,148,0): 238, 46, 69, + (25,149,0): 249, 39, 68, + (25,150,0): 255, 40, 72, + (25,151,0): 255, 42, 73, + (25,152,0): 255, 48, 78, + (25,153,0): 243, 53, 78, + (25,154,0): 236, 63, 82, + (25,155,0): 234, 76, 90, + (25,156,0): 230, 82, 94, + (25,157,0): 224, 84, 93, + (25,158,0): 222, 85, 93, + (25,159,0): 221, 90, 98, + (25,160,0): 219, 98, 105, + (25,161,0): 216, 101, 108, + (25,162,0): 214, 105, 110, + (25,163,0): 213, 108, 113, + (25,164,0): 208, 112, 114, + (25,165,0): 206, 116, 116, + (25,166,0): 204, 118, 119, + (25,167,0): 201, 120, 119, + (25,168,0): 204, 124, 125, + (25,169,0): 203, 121, 123, + (25,170,0): 203, 118, 121, + (25,171,0): 202, 113, 117, + (25,172,0): 202, 107, 115, + (25,173,0): 201, 101, 111, + (25,174,0): 199, 97, 108, + (25,175,0): 197, 95, 108, + (25,176,0): 195, 97, 110, + (25,177,0): 177, 84, 95, + (25,178,0): 163, 76, 85, + (25,179,0): 153, 72, 81, + (25,180,0): 141, 68, 75, + (25,181,0): 132, 70, 73, + (25,182,0): 107, 55, 57, + (25,183,0): 72, 28, 27, + (25,184,0): 84, 49, 45, + (25,185,0): 77, 48, 42, + (25,186,0): 72, 49, 43, + (25,187,0): 74, 54, 47, + (25,188,0): 75, 56, 49, + (25,189,0): 75, 58, 50, + (25,190,0): 79, 62, 54, + (25,191,0): 85, 69, 56, + (25,192,0): 91, 79, 53, + (25,193,0): 99, 90, 57, + (25,194,0): 103, 97, 65, + (25,195,0): 105, 102, 69, + (25,196,0): 110, 114, 79, + (25,197,0): 122, 130, 93, + (25,198,0): 122, 137, 98, + (25,199,0): 116, 134, 94, + (25,200,0): 114, 137, 95, + (25,201,0): 112, 137, 95, + (25,202,0): 112, 139, 96, + (25,203,0): 113, 142, 96, + (25,204,0): 117, 146, 100, + (25,205,0): 119, 148, 100, + (25,206,0): 119, 148, 100, + (25,207,0): 119, 148, 102, + (25,208,0): 115, 146, 105, + (25,209,0): 120, 150, 114, + (25,210,0): 122, 151, 120, + (25,211,0): 121, 150, 120, + (25,212,0): 126, 152, 125, + (25,213,0): 131, 157, 132, + (25,214,0): 133, 157, 135, + (25,215,0): 131, 155, 133, + (25,216,0): 129, 153, 131, + (25,217,0): 122, 146, 122, + (25,218,0): 114, 137, 111, + (25,219,0): 109, 132, 104, + (25,220,0): 104, 129, 100, + (25,221,0): 96, 121, 91, + (25,222,0): 84, 109, 77, + (25,223,0): 78, 97, 69, + (25,224,0): 82, 83, 67, + (25,225,0): 86, 80, 68, + (25,226,0): 86, 79, 69, + (26,0,0): 56, 57, 51, + (26,1,0): 56, 57, 51, + (26,2,0): 56, 57, 51, + (26,3,0): 57, 58, 52, + (26,4,0): 59, 60, 54, + (26,5,0): 60, 61, 55, + (26,6,0): 63, 62, 57, + (26,7,0): 64, 63, 58, + (26,8,0): 64, 63, 58, + (26,9,0): 64, 63, 58, + (26,10,0): 67, 64, 59, + (26,11,0): 67, 64, 59, + (26,12,0): 67, 64, 59, + (26,13,0): 67, 64, 59, + (26,14,0): 68, 63, 59, + (26,15,0): 68, 63, 59, + (26,16,0): 70, 65, 59, + (26,17,0): 70, 65, 59, + (26,18,0): 70, 65, 59, + (26,19,0): 69, 64, 58, + (26,20,0): 69, 64, 58, + (26,21,0): 69, 64, 58, + (26,22,0): 71, 64, 56, + (26,23,0): 70, 63, 55, + (26,24,0): 74, 65, 58, + (26,25,0): 73, 64, 57, + (26,26,0): 72, 63, 56, + (26,27,0): 71, 62, 53, + (26,28,0): 70, 61, 54, + (26,29,0): 69, 60, 51, + (26,30,0): 70, 60, 51, + (26,31,0): 69, 59, 49, + (26,32,0): 68, 58, 49, + (26,33,0): 68, 58, 49, + (26,34,0): 68, 58, 49, + (26,35,0): 68, 58, 49, + (26,36,0): 68, 59, 52, + (26,37,0): 68, 59, 52, + (26,38,0): 68, 59, 52, + (26,39,0): 67, 60, 52, + (26,40,0): 63, 56, 48, + (26,41,0): 63, 56, 48, + (26,42,0): 60, 55, 49, + (26,43,0): 59, 54, 48, + (26,44,0): 58, 53, 47, + (26,45,0): 58, 53, 47, + (26,46,0): 57, 52, 46, + (26,47,0): 57, 52, 46, + (26,48,0): 57, 54, 47, + (26,49,0): 57, 54, 47, + (26,50,0): 58, 53, 47, + (26,51,0): 59, 55, 46, + (26,52,0): 62, 55, 47, + (26,53,0): 64, 57, 47, + (26,54,0): 66, 57, 48, + (26,55,0): 67, 59, 48, + (26,56,0): 69, 59, 49, + (26,57,0): 70, 60, 48, + (26,58,0): 73, 61, 49, + (26,59,0): 75, 63, 49, + (26,60,0): 77, 63, 50, + (26,61,0): 77, 64, 48, + (26,62,0): 78, 65, 49, + (26,63,0): 77, 64, 48, + (26,64,0): 80, 63, 53, + (26,65,0): 77, 63, 52, + (26,66,0): 76, 62, 51, + (26,67,0): 75, 61, 50, + (26,68,0): 73, 60, 51, + (26,69,0): 72, 59, 50, + (26,70,0): 69, 59, 49, + (26,71,0): 68, 58, 48, + (26,72,0): 67, 58, 49, + (26,73,0): 67, 58, 49, + (26,74,0): 65, 58, 48, + (26,75,0): 65, 58, 48, + (26,76,0): 63, 59, 50, + (26,77,0): 64, 60, 51, + (26,78,0): 64, 60, 51, + (26,79,0): 68, 59, 52, + (26,80,0): 83, 69, 60, + (26,81,0): 82, 51, 46, + (26,82,0): 105, 51, 51, + (26,83,0): 142, 65, 71, + (26,84,0): 173, 76, 87, + (26,85,0): 193, 86, 96, + (26,86,0): 203, 93, 102, + (26,87,0): 196, 96, 98, + (26,88,0): 154, 66, 62, + (26,89,0): 150, 73, 63, + (26,90,0): 149, 77, 65, + (26,91,0): 155, 79, 66, + (26,92,0): 171, 82, 74, + (26,93,0): 190, 85, 82, + (26,94,0): 203, 80, 83, + (26,95,0): 196, 76, 75, + (26,96,0): 163, 65, 52, + (26,97,0): 157, 66, 48, + (26,98,0): 160, 64, 48, + (26,99,0): 165, 63, 49, + (26,100,0): 165, 59, 46, + (26,101,0): 163, 55, 43, + (26,102,0): 164, 56, 43, + (26,103,0): 167, 61, 47, + (26,104,0): 171, 69, 54, + (26,105,0): 161, 62, 43, + (26,106,0): 152, 55, 36, + (26,107,0): 157, 58, 39, + (26,108,0): 165, 62, 45, + (26,109,0): 172, 65, 47, + (26,110,0): 178, 67, 50, + (26,111,0): 184, 67, 58, + (26,112,0): 167, 48, 50, + (26,113,0): 177, 57, 66, + (26,114,0): 185, 68, 76, + (26,115,0): 190, 75, 82, + (26,116,0): 186, 77, 82, + (26,117,0): 173, 75, 76, + (26,118,0): 150, 65, 62, + (26,119,0): 130, 55, 49, + (26,120,0): 123, 56, 47, + (26,121,0): 118, 54, 44, + (26,122,0): 122, 49, 42, + (26,123,0): 133, 48, 45, + (26,124,0): 156, 51, 55, + (26,125,0): 186, 60, 71, + (26,126,0): 215, 70, 87, + (26,127,0): 232, 77, 91, + (26,128,0): 225, 71, 73, + (26,129,0): 206, 54, 51, + (26,130,0): 205, 60, 57, + (26,131,0): 187, 52, 49, + (26,132,0): 198, 79, 75, + (26,133,0): 198, 99, 93, + (26,134,0): 148, 74, 63, + (26,135,0): 140, 91, 74, + (26,136,0): 125, 99, 76, + (26,137,0): 106, 95, 67, + (26,138,0): 104, 99, 69, + (26,139,0): 117, 111, 79, + (26,140,0): 128, 111, 81, + (26,141,0): 130, 103, 74, + (26,142,0): 143, 103, 78, + (26,143,0): 177, 104, 89, + (26,144,0): 224, 100, 98, + (26,145,0): 239, 84, 90, + (26,146,0): 238, 71, 81, + (26,147,0): 239, 58, 73, + (26,148,0): 248, 52, 74, + (26,149,0): 255, 52, 78, + (26,150,0): 255, 50, 77, + (26,151,0): 254, 46, 72, + (26,152,0): 255, 53, 79, + (26,153,0): 245, 51, 75, + (26,154,0): 240, 53, 74, + (26,155,0): 239, 56, 76, + (26,156,0): 237, 55, 77, + (26,157,0): 233, 54, 75, + (26,158,0): 236, 54, 76, + (26,159,0): 239, 57, 80, + (26,160,0): 241, 65, 88, + (26,161,0): 239, 67, 91, + (26,162,0): 239, 70, 93, + (26,163,0): 237, 73, 97, + (26,164,0): 236, 77, 99, + (26,165,0): 234, 81, 101, + (26,166,0): 233, 84, 104, + (26,167,0): 232, 86, 107, + (26,168,0): 228, 84, 107, + (26,169,0): 229, 83, 106, + (26,170,0): 228, 80, 106, + (26,171,0): 228, 78, 105, + (26,172,0): 233, 78, 109, + (26,173,0): 238, 81, 112, + (26,174,0): 242, 83, 115, + (26,175,0): 244, 87, 118, + (26,176,0): 252, 105, 133, + (26,177,0): 237, 99, 124, + (26,178,0): 225, 93, 116, + (26,179,0): 210, 87, 108, + (26,180,0): 203, 90, 108, + (26,181,0): 199, 101, 114, + (26,182,0): 166, 83, 93, + (26,183,0): 114, 45, 50, + (26,184,0): 93, 39, 39, + (26,185,0): 88, 49, 44, + (26,186,0): 87, 58, 52, + (26,187,0): 81, 63, 53, + (26,188,0): 66, 58, 45, + (26,189,0): 58, 56, 41, + (26,190,0): 63, 66, 49, + (26,191,0): 76, 78, 57, + (26,192,0): 86, 79, 51, + (26,193,0): 97, 86, 54, + (26,194,0): 101, 95, 63, + (26,195,0): 104, 101, 68, + (26,196,0): 113, 117, 84, + (26,197,0): 127, 134, 101, + (26,198,0): 126, 140, 105, + (26,199,0): 119, 136, 100, + (26,200,0): 120, 140, 105, + (26,201,0): 117, 139, 101, + (26,202,0): 114, 139, 100, + (26,203,0): 114, 139, 99, + (26,204,0): 118, 140, 101, + (26,205,0): 121, 143, 104, + (26,206,0): 122, 144, 105, + (26,207,0): 122, 144, 106, + (26,208,0): 128, 149, 118, + (26,209,0): 132, 155, 126, + (26,210,0): 138, 158, 133, + (26,211,0): 141, 160, 138, + (26,212,0): 146, 163, 144, + (26,213,0): 151, 168, 150, + (26,214,0): 152, 169, 153, + (26,215,0): 150, 166, 153, + (26,216,0): 145, 162, 146, + (26,217,0): 135, 152, 134, + (26,218,0): 122, 141, 121, + (26,219,0): 112, 131, 109, + (26,220,0): 103, 126, 98, + (26,221,0): 94, 119, 89, + (26,222,0): 84, 109, 77, + (26,223,0): 80, 99, 71, + (26,224,0): 82, 87, 67, + (26,225,0): 88, 85, 70, + (26,226,0): 89, 85, 73, + (27,0,0): 55, 56, 50, + (27,1,0): 55, 56, 50, + (27,2,0): 56, 57, 51, + (27,3,0): 57, 58, 52, + (27,4,0): 59, 60, 54, + (27,5,0): 61, 62, 56, + (27,6,0): 64, 63, 58, + (27,7,0): 65, 64, 59, + (27,8,0): 66, 65, 60, + (27,9,0): 66, 65, 60, + (27,10,0): 68, 65, 60, + (27,11,0): 68, 65, 60, + (27,12,0): 68, 65, 60, + (27,13,0): 68, 65, 60, + (27,14,0): 69, 64, 60, + (27,15,0): 69, 64, 60, + (27,16,0): 71, 66, 60, + (27,17,0): 71, 66, 60, + (27,18,0): 71, 66, 60, + (27,19,0): 70, 65, 59, + (27,20,0): 70, 65, 59, + (27,21,0): 70, 66, 57, + (27,22,0): 72, 65, 57, + (27,23,0): 72, 65, 57, + (27,24,0): 76, 67, 60, + (27,25,0): 75, 66, 57, + (27,26,0): 74, 65, 56, + (27,27,0): 73, 64, 55, + (27,28,0): 72, 62, 53, + (27,29,0): 71, 61, 51, + (27,30,0): 70, 60, 50, + (27,31,0): 69, 59, 49, + (27,32,0): 68, 58, 48, + (27,33,0): 68, 58, 48, + (27,34,0): 69, 59, 49, + (27,35,0): 69, 59, 50, + (27,36,0): 68, 59, 50, + (27,37,0): 69, 60, 51, + (27,38,0): 69, 60, 53, + (27,39,0): 69, 60, 53, + (27,40,0): 64, 57, 49, + (27,41,0): 63, 56, 48, + (27,42,0): 61, 56, 50, + (27,43,0): 60, 55, 49, + (27,44,0): 59, 54, 48, + (27,45,0): 58, 53, 47, + (27,46,0): 58, 53, 47, + (27,47,0): 58, 53, 47, + (27,48,0): 57, 54, 47, + (27,49,0): 57, 54, 45, + (27,50,0): 59, 55, 46, + (27,51,0): 59, 55, 44, + (27,52,0): 63, 56, 46, + (27,53,0): 64, 58, 46, + (27,54,0): 67, 59, 48, + (27,55,0): 68, 60, 47, + (27,56,0): 70, 60, 48, + (27,57,0): 70, 61, 46, + (27,58,0): 74, 62, 48, + (27,59,0): 75, 63, 47, + (27,60,0): 77, 64, 48, + (27,61,0): 77, 64, 48, + (27,62,0): 77, 64, 47, + (27,63,0): 77, 64, 48, + (27,64,0): 79, 63, 50, + (27,65,0): 79, 62, 52, + (27,66,0): 76, 62, 51, + (27,67,0): 75, 61, 50, + (27,68,0): 74, 60, 51, + (27,69,0): 71, 58, 49, + (27,70,0): 69, 59, 49, + (27,71,0): 68, 58, 48, + (27,72,0): 68, 59, 50, + (27,73,0): 68, 59, 50, + (27,74,0): 66, 59, 49, + (27,75,0): 64, 60, 49, + (27,76,0): 64, 60, 51, + (27,77,0): 65, 61, 52, + (27,78,0): 66, 62, 53, + (27,79,0): 70, 60, 51, + (27,80,0): 81, 56, 49, + (27,81,0): 88, 43, 38, + (27,82,0): 135, 59, 63, + (27,83,0): 189, 85, 96, + (27,84,0): 216, 85, 101, + (27,85,0): 228, 86, 102, + (27,86,0): 226, 86, 99, + (27,87,0): 201, 75, 79, + (27,88,0): 157, 52, 48, + (27,89,0): 148, 58, 47, + (27,90,0): 144, 62, 48, + (27,91,0): 152, 66, 51, + (27,92,0): 173, 70, 61, + (27,93,0): 196, 74, 71, + (27,94,0): 212, 67, 72, + (27,95,0): 203, 63, 64, + (27,96,0): 177, 66, 55, + (27,97,0): 167, 70, 53, + (27,98,0): 169, 66, 51, + (27,99,0): 172, 64, 51, + (27,100,0): 175, 63, 51, + (27,101,0): 176, 62, 51, + (27,102,0): 179, 66, 52, + (27,103,0): 180, 68, 54, + (27,104,0): 178, 71, 53, + (27,105,0): 169, 66, 47, + (27,106,0): 163, 60, 41, + (27,107,0): 164, 59, 40, + (27,108,0): 169, 60, 40, + (27,109,0): 171, 58, 40, + (27,110,0): 174, 54, 38, + (27,111,0): 173, 51, 40, + (27,112,0): 182, 57, 55, + (27,113,0): 186, 57, 61, + (27,114,0): 187, 56, 62, + (27,115,0): 186, 55, 60, + (27,116,0): 190, 61, 66, + (27,117,0): 197, 74, 76, + (27,118,0): 196, 84, 83, + (27,119,0): 190, 88, 83, + (27,120,0): 153, 63, 55, + (27,121,0): 139, 52, 42, + (27,122,0): 135, 45, 37, + (27,123,0): 157, 54, 49, + (27,124,0): 195, 72, 75, + (27,125,0): 219, 80, 87, + (27,126,0): 224, 66, 81, + (27,127,0): 218, 52, 64, + (27,128,0): 221, 59, 57, + (27,129,0): 204, 47, 42, + (27,130,0): 209, 57, 52, + (27,131,0): 198, 56, 52, + (27,132,0): 197, 70, 64, + (27,133,0): 200, 93, 85, + (27,134,0): 167, 88, 75, + (27,135,0): 144, 87, 70, + (27,136,0): 119, 87, 64, + (27,137,0): 120, 100, 73, + (27,138,0): 126, 112, 83, + (27,139,0): 130, 111, 81, + (27,140,0): 133, 102, 74, + (27,141,0): 145, 99, 75, + (27,142,0): 172, 109, 91, + (27,143,0): 213, 117, 105, + (27,144,0): 234, 85, 87, + (27,145,0): 246, 70, 80, + (27,146,0): 242, 62, 74, + (27,147,0): 242, 60, 73, + (27,148,0): 249, 64, 78, + (27,149,0): 253, 67, 81, + (27,150,0): 249, 61, 76, + (27,151,0): 243, 55, 72, + (27,152,0): 253, 66, 83, + (27,153,0): 248, 60, 77, + (27,154,0): 244, 55, 75, + (27,155,0): 246, 54, 75, + (27,156,0): 248, 52, 74, + (27,157,0): 249, 50, 73, + (27,158,0): 255, 51, 78, + (27,159,0): 255, 56, 83, + (27,160,0): 255, 51, 84, + (27,161,0): 252, 53, 86, + (27,162,0): 252, 54, 87, + (27,163,0): 249, 56, 87, + (27,164,0): 247, 58, 90, + (27,165,0): 248, 61, 92, + (27,166,0): 246, 63, 94, + (27,167,0): 245, 64, 97, + (27,168,0): 247, 67, 102, + (27,169,0): 245, 67, 103, + (27,170,0): 244, 64, 101, + (27,171,0): 245, 63, 103, + (27,172,0): 247, 65, 105, + (27,173,0): 252, 67, 109, + (27,174,0): 255, 71, 115, + (27,175,0): 255, 74, 115, + (27,176,0): 255, 81, 117, + (27,177,0): 253, 84, 117, + (27,178,0): 250, 87, 118, + (27,179,0): 239, 85, 113, + (27,180,0): 228, 86, 110, + (27,181,0): 226, 99, 120, + (27,182,0): 213, 102, 118, + (27,183,0): 180, 89, 98, + (27,184,0): 124, 49, 53, + (27,185,0): 104, 48, 47, + (27,186,0): 88, 49, 42, + (27,187,0): 80, 56, 44, + (27,188,0): 71, 62, 47, + (27,189,0): 63, 64, 46, + (27,190,0): 59, 68, 47, + (27,191,0): 65, 70, 47, + (27,192,0): 81, 74, 46, + (27,193,0): 95, 84, 56, + (27,194,0): 103, 96, 67, + (27,195,0): 111, 107, 78, + (27,196,0): 124, 124, 96, + (27,197,0): 136, 142, 114, + (27,198,0): 135, 145, 118, + (27,199,0): 125, 139, 113, + (27,200,0): 122, 141, 113, + (27,201,0): 124, 143, 115, + (27,202,0): 124, 143, 115, + (27,203,0): 122, 141, 111, + (27,204,0): 122, 138, 109, + (27,205,0): 125, 140, 111, + (27,206,0): 131, 146, 117, + (27,207,0): 136, 151, 122, + (27,208,0): 149, 163, 138, + (27,209,0): 156, 169, 149, + (27,210,0): 163, 174, 157, + (27,211,0): 166, 177, 161, + (27,212,0): 172, 180, 167, + (27,213,0): 177, 185, 174, + (27,214,0): 176, 183, 176, + (27,215,0): 171, 181, 173, + (27,216,0): 161, 171, 162, + (27,217,0): 148, 160, 148, + (27,218,0): 131, 145, 130, + (27,219,0): 115, 132, 113, + (27,220,0): 104, 124, 99, + (27,221,0): 93, 116, 88, + (27,222,0): 83, 108, 78, + (27,223,0): 80, 100, 72, + (27,224,0): 80, 88, 67, + (27,225,0): 86, 87, 69, + (27,226,0): 87, 88, 72, + (28,0,0): 54, 55, 49, + (28,1,0): 54, 55, 49, + (28,2,0): 55, 56, 50, + (28,3,0): 56, 57, 51, + (28,4,0): 58, 59, 53, + (28,5,0): 60, 61, 55, + (28,6,0): 63, 62, 57, + (28,7,0): 64, 63, 58, + (28,8,0): 66, 65, 60, + (28,9,0): 66, 65, 60, + (28,10,0): 68, 65, 60, + (28,11,0): 68, 65, 60, + (28,12,0): 68, 65, 60, + (28,13,0): 69, 66, 61, + (28,14,0): 70, 65, 61, + (28,15,0): 70, 65, 61, + (28,16,0): 70, 67, 60, + (28,17,0): 70, 67, 60, + (28,18,0): 71, 66, 60, + (28,19,0): 72, 67, 61, + (28,20,0): 72, 68, 59, + (28,21,0): 72, 68, 59, + (28,22,0): 74, 67, 59, + (28,23,0): 74, 67, 57, + (28,24,0): 76, 67, 58, + (28,25,0): 75, 66, 57, + (28,26,0): 75, 65, 56, + (28,27,0): 74, 64, 54, + (28,28,0): 74, 61, 52, + (28,29,0): 73, 61, 49, + (28,30,0): 72, 60, 48, + (28,31,0): 71, 59, 47, + (28,32,0): 69, 59, 47, + (28,33,0): 69, 59, 47, + (28,34,0): 69, 59, 47, + (28,35,0): 69, 59, 49, + (28,36,0): 69, 59, 49, + (28,37,0): 69, 59, 49, + (28,38,0): 68, 59, 50, + (28,39,0): 68, 59, 50, + (28,40,0): 64, 57, 47, + (28,41,0): 64, 57, 47, + (28,42,0): 64, 57, 49, + (28,43,0): 63, 56, 48, + (28,44,0): 60, 55, 49, + (28,45,0): 59, 54, 48, + (28,46,0): 59, 54, 48, + (28,47,0): 58, 53, 47, + (28,48,0): 59, 55, 46, + (28,49,0): 59, 55, 46, + (28,50,0): 59, 55, 46, + (28,51,0): 60, 56, 45, + (28,52,0): 63, 56, 46, + (28,53,0): 65, 59, 47, + (28,54,0): 67, 59, 48, + (28,55,0): 68, 60, 47, + (28,56,0): 71, 61, 49, + (28,57,0): 71, 62, 47, + (28,58,0): 75, 63, 49, + (28,59,0): 77, 64, 48, + (28,60,0): 77, 64, 48, + (28,61,0): 78, 65, 48, + (28,62,0): 79, 63, 47, + (28,63,0): 79, 63, 48, + (28,64,0): 79, 63, 50, + (28,65,0): 78, 61, 51, + (28,66,0): 78, 61, 51, + (28,67,0): 74, 60, 49, + (28,68,0): 73, 59, 48, + (28,69,0): 71, 59, 47, + (28,70,0): 68, 58, 48, + (28,71,0): 68, 58, 48, + (28,72,0): 68, 60, 49, + (28,73,0): 68, 60, 49, + (28,74,0): 66, 59, 49, + (28,75,0): 64, 60, 49, + (28,76,0): 65, 61, 50, + (28,77,0): 65, 63, 51, + (28,78,0): 66, 63, 54, + (28,79,0): 75, 61, 52, + (28,80,0): 91, 54, 46, + (28,81,0): 116, 52, 50, + (28,82,0): 172, 77, 83, + (28,83,0): 218, 94, 105, + (28,84,0): 229, 78, 95, + (28,85,0): 226, 65, 81, + (28,86,0): 213, 55, 69, + (28,87,0): 182, 39, 43, + (28,88,0): 167, 50, 41, + (28,89,0): 156, 56, 40, + (28,90,0): 145, 58, 38, + (28,91,0): 149, 61, 41, + (28,92,0): 171, 65, 51, + (28,93,0): 193, 69, 61, + (28,94,0): 211, 63, 63, + (28,95,0): 204, 60, 59, + (28,96,0): 177, 63, 53, + (28,97,0): 168, 66, 52, + (28,98,0): 170, 64, 50, + (28,99,0): 173, 63, 50, + (28,100,0): 178, 64, 53, + (28,101,0): 184, 67, 57, + (28,102,0): 188, 72, 59, + (28,103,0): 187, 74, 60, + (28,104,0): 172, 62, 47, + (28,105,0): 170, 63, 47, + (28,106,0): 168, 61, 43, + (28,107,0): 166, 59, 41, + (28,108,0): 170, 57, 41, + (28,109,0): 176, 58, 44, + (28,110,0): 183, 59, 47, + (28,111,0): 187, 61, 49, + (28,112,0): 200, 71, 65, + (28,113,0): 204, 69, 65, + (28,114,0): 206, 64, 63, + (28,115,0): 205, 57, 57, + (28,116,0): 211, 56, 60, + (28,117,0): 220, 67, 69, + (28,118,0): 223, 77, 78, + (28,119,0): 218, 83, 79, + (28,120,0): 193, 68, 62, + (28,121,0): 195, 77, 67, + (28,122,0): 203, 84, 76, + (28,123,0): 209, 85, 77, + (28,124,0): 215, 75, 74, + (28,125,0): 218, 64, 66, + (28,126,0): 223, 53, 62, + (28,127,0): 224, 51, 55, + (28,128,0): 217, 52, 46, + (28,129,0): 215, 57, 46, + (28,130,0): 205, 51, 43, + (28,131,0): 206, 59, 52, + (28,132,0): 190, 57, 52, + (28,133,0): 178, 65, 57, + (28,134,0): 181, 91, 80, + (28,135,0): 150, 85, 67, + (28,136,0): 123, 78, 57, + (28,137,0): 130, 98, 73, + (28,138,0): 136, 106, 80, + (28,139,0): 133, 96, 70, + (28,140,0): 147, 90, 70, + (28,141,0): 176, 100, 84, + (28,142,0): 206, 112, 100, + (28,143,0): 232, 109, 104, + (28,144,0): 231, 70, 75, + (28,145,0): 237, 60, 68, + (28,146,0): 230, 59, 67, + (28,147,0): 227, 62, 68, + (28,148,0): 227, 68, 72, + (28,149,0): 227, 73, 75, + (28,150,0): 228, 74, 76, + (28,151,0): 229, 73, 77, + (28,152,0): 240, 76, 83, + (28,153,0): 239, 68, 77, + (28,154,0): 239, 58, 73, + (28,155,0): 242, 55, 72, + (28,156,0): 245, 52, 71, + (28,157,0): 248, 49, 70, + (28,158,0): 254, 52, 76, + (28,159,0): 255, 58, 82, + (28,160,0): 255, 57, 86, + (28,161,0): 253, 58, 88, + (28,162,0): 252, 59, 88, + (28,163,0): 250, 59, 90, + (28,164,0): 251, 60, 93, + (28,165,0): 252, 63, 95, + (28,166,0): 253, 65, 98, + (28,167,0): 252, 67, 101, + (28,168,0): 253, 69, 105, + (28,169,0): 251, 69, 107, + (28,170,0): 250, 68, 108, + (28,171,0): 250, 68, 109, + (28,172,0): 250, 67, 111, + (28,173,0): 249, 68, 111, + (28,174,0): 249, 68, 113, + (28,175,0): 250, 67, 111, + (28,176,0): 255, 72, 112, + (28,177,0): 255, 66, 104, + (28,178,0): 255, 74, 109, + (28,179,0): 253, 79, 112, + (28,180,0): 238, 75, 104, + (28,181,0): 230, 80, 107, + (28,182,0): 226, 93, 114, + (28,183,0): 216, 99, 115, + (28,184,0): 186, 91, 99, + (28,185,0): 140, 64, 68, + (28,186,0): 96, 38, 36, + (28,187,0): 81, 43, 34, + (28,188,0): 86, 64, 51, + (28,189,0): 86, 79, 61, + (28,190,0): 74, 76, 55, + (28,191,0): 65, 67, 45, + (28,192,0): 82, 74, 51, + (28,193,0): 101, 89, 67, + (28,194,0): 117, 106, 86, + (28,195,0): 128, 123, 103, + (28,196,0): 142, 141, 121, + (28,197,0): 153, 156, 139, + (28,198,0): 149, 156, 140, + (28,199,0): 136, 147, 131, + (28,200,0): 130, 142, 128, + (28,201,0): 137, 151, 136, + (28,202,0): 143, 155, 141, + (28,203,0): 140, 153, 136, + (28,204,0): 135, 146, 130, + (28,205,0): 138, 147, 130, + (28,206,0): 151, 158, 142, + (28,207,0): 164, 168, 153, + (28,208,0): 178, 182, 167, + (28,209,0): 184, 188, 174, + (28,210,0): 191, 193, 182, + (28,211,0): 192, 193, 185, + (28,212,0): 194, 195, 189, + (28,213,0): 197, 198, 193, + (28,214,0): 195, 195, 195, + (28,215,0): 190, 190, 190, + (28,216,0): 176, 181, 177, + (28,217,0): 162, 169, 162, + (28,218,0): 141, 151, 140, + (28,219,0): 121, 135, 118, + (28,220,0): 105, 123, 101, + (28,221,0): 92, 115, 89, + (28,222,0): 84, 109, 79, + (28,223,0): 82, 102, 74, + (28,224,0): 80, 90, 66, + (28,225,0): 84, 89, 67, + (28,226,0): 86, 91, 71, + (29,0,0): 53, 54, 48, + (29,1,0): 53, 54, 48, + (29,2,0): 54, 55, 49, + (29,3,0): 55, 56, 50, + (29,4,0): 56, 57, 51, + (29,5,0): 58, 59, 53, + (29,6,0): 61, 60, 55, + (29,7,0): 62, 61, 56, + (29,8,0): 64, 63, 58, + (29,9,0): 64, 63, 58, + (29,10,0): 67, 64, 59, + (29,11,0): 68, 65, 60, + (29,12,0): 69, 66, 61, + (29,13,0): 69, 66, 61, + (29,14,0): 71, 66, 62, + (29,15,0): 71, 66, 62, + (29,16,0): 71, 68, 61, + (29,17,0): 71, 68, 61, + (29,18,0): 72, 67, 61, + (29,19,0): 73, 68, 62, + (29,20,0): 73, 69, 60, + (29,21,0): 73, 69, 60, + (29,22,0): 75, 68, 58, + (29,23,0): 76, 69, 59, + (29,24,0): 76, 67, 58, + (29,25,0): 75, 67, 56, + (29,26,0): 76, 66, 56, + (29,27,0): 75, 65, 53, + (29,28,0): 76, 64, 52, + (29,29,0): 75, 63, 51, + (29,30,0): 74, 62, 50, + (29,31,0): 73, 61, 49, + (29,32,0): 71, 61, 49, + (29,33,0): 71, 61, 49, + (29,34,0): 70, 60, 48, + (29,35,0): 70, 60, 48, + (29,36,0): 69, 59, 49, + (29,37,0): 69, 59, 49, + (29,38,0): 68, 59, 50, + (29,39,0): 67, 58, 49, + (29,40,0): 65, 58, 48, + (29,41,0): 65, 58, 48, + (29,42,0): 64, 57, 49, + (29,43,0): 64, 57, 49, + (29,44,0): 61, 56, 50, + (29,45,0): 60, 55, 49, + (29,46,0): 59, 54, 48, + (29,47,0): 59, 54, 48, + (29,48,0): 59, 55, 46, + (29,49,0): 59, 55, 46, + (29,50,0): 59, 55, 44, + (29,51,0): 60, 56, 45, + (29,52,0): 63, 57, 45, + (29,53,0): 65, 59, 47, + (29,54,0): 68, 60, 47, + (29,55,0): 69, 61, 48, + (29,56,0): 72, 63, 48, + (29,57,0): 74, 62, 48, + (29,58,0): 76, 63, 47, + (29,59,0): 77, 64, 48, + (29,60,0): 78, 65, 48, + (29,61,0): 78, 65, 48, + (29,62,0): 79, 63, 47, + (29,63,0): 79, 63, 47, + (29,64,0): 79, 63, 50, + (29,65,0): 78, 61, 51, + (29,66,0): 77, 60, 50, + (29,67,0): 76, 59, 49, + (29,68,0): 73, 59, 48, + (29,69,0): 71, 59, 47, + (29,70,0): 70, 57, 48, + (29,71,0): 67, 57, 47, + (29,72,0): 67, 59, 48, + (29,73,0): 66, 60, 48, + (29,74,0): 66, 59, 49, + (29,75,0): 64, 60, 49, + (29,76,0): 64, 62, 50, + (29,77,0): 65, 63, 51, + (29,78,0): 66, 63, 54, + (29,79,0): 78, 59, 52, + (29,80,0): 106, 57, 52, + (29,81,0): 149, 71, 69, + (29,82,0): 195, 90, 95, + (29,83,0): 218, 88, 98, + (29,84,0): 220, 68, 81, + (29,85,0): 219, 57, 70, + (29,86,0): 209, 52, 59, + (29,87,0): 188, 44, 43, + (29,88,0): 172, 50, 39, + (29,89,0): 159, 56, 37, + (29,90,0): 150, 58, 33, + (29,91,0): 148, 58, 32, + (29,92,0): 161, 61, 38, + (29,93,0): 179, 64, 46, + (29,94,0): 193, 59, 50, + (29,95,0): 189, 56, 49, + (29,96,0): 167, 55, 44, + (29,97,0): 162, 58, 45, + (29,98,0): 165, 57, 45, + (29,99,0): 167, 55, 44, + (29,100,0): 175, 58, 49, + (29,101,0): 184, 66, 56, + (29,102,0): 186, 69, 59, + (29,103,0): 183, 69, 58, + (29,104,0): 174, 62, 50, + (29,105,0): 173, 63, 48, + (29,106,0): 167, 60, 44, + (29,107,0): 164, 54, 39, + (29,108,0): 170, 54, 41, + (29,109,0): 182, 62, 48, + (29,110,0): 195, 68, 59, + (29,111,0): 202, 71, 61, + (29,112,0): 188, 58, 45, + (29,113,0): 203, 65, 54, + (29,114,0): 221, 70, 63, + (29,115,0): 232, 68, 66, + (29,116,0): 239, 63, 65, + (29,117,0): 239, 59, 62, + (29,118,0): 231, 52, 55, + (29,119,0): 218, 48, 48, + (29,120,0): 216, 57, 53, + (29,121,0): 222, 73, 66, + (29,122,0): 229, 85, 76, + (29,123,0): 224, 80, 71, + (29,124,0): 216, 63, 57, + (29,125,0): 214, 50, 48, + (29,126,0): 224, 48, 50, + (29,127,0): 231, 55, 55, + (29,128,0): 216, 49, 40, + (29,129,0): 221, 61, 47, + (29,130,0): 202, 46, 34, + (29,131,0): 205, 56, 49, + (29,132,0): 189, 52, 44, + (29,133,0): 174, 55, 47, + (29,134,0): 200, 104, 92, + (29,135,0): 184, 108, 92, + (29,136,0): 142, 87, 67, + (29,137,0): 135, 90, 67, + (29,138,0): 132, 86, 63, + (29,139,0): 139, 81, 61, + (29,140,0): 170, 91, 76, + (29,141,0): 209, 106, 97, + (29,142,0): 226, 103, 98, + (29,143,0): 229, 83, 84, + (29,144,0): 240, 69, 75, + (29,145,0): 239, 62, 70, + (29,146,0): 226, 60, 64, + (29,147,0): 216, 62, 62, + (29,148,0): 209, 66, 62, + (29,149,0): 209, 72, 66, + (29,150,0): 219, 80, 77, + (29,151,0): 233, 87, 87, + (29,152,0): 235, 79, 82, + (29,153,0): 238, 68, 77, + (29,154,0): 239, 59, 71, + (29,155,0): 245, 54, 70, + (29,156,0): 246, 50, 70, + (29,157,0): 246, 47, 68, + (29,158,0): 249, 50, 71, + (29,159,0): 253, 55, 78, + (29,160,0): 251, 57, 83, + (29,161,0): 248, 58, 84, + (29,162,0): 248, 58, 86, + (29,163,0): 249, 59, 87, + (29,164,0): 254, 61, 92, + (29,165,0): 255, 63, 97, + (29,166,0): 255, 67, 101, + (29,167,0): 255, 68, 107, + (29,168,0): 251, 60, 101, + (29,169,0): 251, 62, 104, + (29,170,0): 250, 63, 106, + (29,171,0): 247, 64, 108, + (29,172,0): 247, 64, 110, + (29,173,0): 244, 62, 110, + (29,174,0): 241, 61, 108, + (29,175,0): 241, 60, 105, + (29,176,0): 255, 74, 114, + (29,177,0): 251, 61, 97, + (29,178,0): 251, 66, 100, + (29,179,0): 255, 78, 110, + (29,180,0): 251, 77, 110, + (29,181,0): 243, 80, 109, + (29,182,0): 236, 86, 111, + (29,183,0): 224, 91, 110, + (29,184,0): 231, 114, 130, + (29,185,0): 194, 97, 106, + (29,186,0): 150, 74, 76, + (29,187,0): 116, 58, 56, + (29,188,0): 93, 53, 45, + (29,189,0): 82, 56, 43, + (29,190,0): 82, 66, 50, + (29,191,0): 87, 76, 58, + (29,192,0): 94, 81, 65, + (29,193,0): 114, 101, 85, + (29,194,0): 136, 124, 110, + (29,195,0): 149, 141, 130, + (29,196,0): 159, 157, 145, + (29,197,0): 166, 167, 159, + (29,198,0): 161, 166, 159, + (29,199,0): 150, 156, 152, + (29,200,0): 149, 158, 155, + (29,201,0): 158, 167, 164, + (29,202,0): 166, 175, 172, + (29,203,0): 166, 172, 168, + (29,204,0): 162, 167, 163, + (29,205,0): 166, 168, 163, + (29,206,0): 181, 180, 176, + (29,207,0): 194, 193, 188, + (29,208,0): 204, 201, 192, + (29,209,0): 209, 206, 197, + (29,210,0): 213, 208, 204, + (29,211,0): 213, 208, 205, + (29,212,0): 212, 206, 206, + (29,213,0): 213, 207, 209, + (29,214,0): 209, 203, 207, + (29,215,0): 203, 198, 202, + (29,216,0): 191, 189, 192, + (29,217,0): 176, 178, 175, + (29,218,0): 152, 159, 152, + (29,219,0): 128, 140, 126, + (29,220,0): 109, 126, 107, + (29,221,0): 96, 116, 91, + (29,222,0): 87, 110, 82, + (29,223,0): 86, 106, 78, + (29,224,0): 83, 95, 71, + (29,225,0): 86, 96, 72, + (29,226,0): 87, 95, 72, + (30,0,0): 53, 54, 48, + (30,1,0): 53, 54, 48, + (30,2,0): 53, 54, 48, + (30,3,0): 53, 54, 48, + (30,4,0): 54, 55, 49, + (30,5,0): 56, 57, 51, + (30,6,0): 58, 57, 52, + (30,7,0): 59, 58, 53, + (30,8,0): 61, 60, 55, + (30,9,0): 62, 61, 56, + (30,10,0): 65, 62, 57, + (30,11,0): 67, 64, 59, + (30,12,0): 68, 65, 60, + (30,13,0): 70, 67, 62, + (30,14,0): 72, 67, 63, + (30,15,0): 72, 67, 63, + (30,16,0): 71, 68, 61, + (30,17,0): 72, 69, 62, + (30,18,0): 73, 68, 62, + (30,19,0): 73, 68, 62, + (30,20,0): 74, 70, 61, + (30,21,0): 74, 70, 61, + (30,22,0): 77, 70, 60, + (30,23,0): 77, 70, 60, + (30,24,0): 77, 69, 58, + (30,25,0): 76, 68, 57, + (30,26,0): 77, 67, 57, + (30,27,0): 77, 67, 55, + (30,28,0): 78, 66, 54, + (30,29,0): 77, 65, 51, + (30,30,0): 78, 64, 51, + (30,31,0): 77, 65, 51, + (30,32,0): 74, 65, 50, + (30,33,0): 74, 65, 50, + (30,34,0): 73, 64, 49, + (30,35,0): 72, 63, 48, + (30,36,0): 71, 61, 49, + (30,37,0): 70, 60, 48, + (30,38,0): 68, 60, 49, + (30,39,0): 68, 60, 49, + (30,40,0): 67, 58, 49, + (30,41,0): 67, 58, 49, + (30,42,0): 65, 58, 50, + (30,43,0): 64, 57, 49, + (30,44,0): 63, 56, 50, + (30,45,0): 63, 56, 50, + (30,46,0): 60, 55, 49, + (30,47,0): 60, 55, 49, + (30,48,0): 60, 56, 47, + (30,49,0): 60, 56, 45, + (30,50,0): 60, 56, 45, + (30,51,0): 60, 56, 45, + (30,52,0): 64, 58, 46, + (30,53,0): 65, 59, 47, + (30,54,0): 68, 60, 47, + (30,55,0): 69, 61, 48, + (30,56,0): 72, 63, 48, + (30,57,0): 75, 63, 49, + (30,58,0): 77, 64, 48, + (30,59,0): 78, 65, 48, + (30,60,0): 80, 64, 48, + (30,61,0): 80, 64, 48, + (30,62,0): 79, 64, 45, + (30,63,0): 79, 63, 47, + (30,64,0): 79, 61, 49, + (30,65,0): 79, 61, 49, + (30,66,0): 77, 61, 48, + (30,67,0): 76, 60, 47, + (30,68,0): 73, 59, 48, + (30,69,0): 70, 58, 46, + (30,70,0): 69, 56, 47, + (30,71,0): 67, 57, 47, + (30,72,0): 66, 58, 47, + (30,73,0): 65, 59, 47, + (30,74,0): 65, 58, 48, + (30,75,0): 63, 59, 48, + (30,76,0): 63, 61, 49, + (30,77,0): 64, 62, 50, + (30,78,0): 64, 64, 52, + (30,79,0): 78, 58, 49, + (30,80,0): 111, 50, 47, + (30,81,0): 165, 75, 75, + (30,82,0): 190, 84, 86, + (30,83,0): 186, 63, 68, + (30,84,0): 188, 49, 54, + (30,85,0): 193, 48, 51, + (30,86,0): 191, 49, 47, + (30,87,0): 183, 50, 41, + (30,88,0): 167, 50, 33, + (30,89,0): 162, 57, 35, + (30,90,0): 155, 61, 33, + (30,91,0): 150, 61, 31, + (30,92,0): 152, 61, 32, + (30,93,0): 158, 63, 35, + (30,94,0): 164, 59, 37, + (30,95,0): 162, 55, 37, + (30,96,0): 158, 54, 41, + (30,97,0): 160, 56, 45, + (30,98,0): 162, 54, 44, + (30,99,0): 165, 52, 44, + (30,100,0): 173, 56, 49, + (30,101,0): 183, 64, 58, + (30,102,0): 184, 67, 60, + (30,103,0): 178, 64, 54, + (30,104,0): 177, 66, 55, + (30,105,0): 173, 65, 52, + (30,106,0): 168, 60, 47, + (30,107,0): 166, 56, 43, + (30,108,0): 175, 58, 48, + (30,109,0): 188, 67, 56, + (30,110,0): 195, 68, 61, + (30,111,0): 196, 65, 55, + (30,112,0): 193, 64, 45, + (30,113,0): 203, 64, 45, + (30,114,0): 213, 55, 43, + (30,115,0): 221, 44, 38, + (30,116,0): 232, 36, 37, + (30,117,0): 245, 39, 43, + (30,118,0): 253, 44, 49, + (30,119,0): 252, 49, 52, + (30,120,0): 233, 44, 42, + (30,121,0): 227, 48, 43, + (30,122,0): 220, 53, 44, + (30,123,0): 217, 55, 44, + (30,124,0): 220, 53, 44, + (30,125,0): 223, 52, 44, + (30,126,0): 229, 50, 45, + (30,127,0): 228, 51, 43, + (30,128,0): 215, 52, 37, + (30,129,0): 212, 55, 38, + (30,130,0): 207, 51, 38, + (30,131,0): 206, 55, 44, + (30,132,0): 196, 55, 46, + (30,133,0): 187, 63, 55, + (30,134,0): 199, 97, 85, + (30,135,0): 210, 127, 113, + (30,136,0): 166, 101, 83, + (30,137,0): 143, 86, 66, + (30,138,0): 139, 76, 58, + (30,139,0): 164, 86, 73, + (30,140,0): 203, 100, 91, + (30,141,0): 224, 99, 95, + (30,142,0): 232, 82, 84, + (30,143,0): 233, 66, 73, + (30,144,0): 246, 69, 77, + (30,145,0): 238, 63, 68, + (30,146,0): 225, 62, 63, + (30,147,0): 213, 64, 60, + (30,148,0): 202, 63, 56, + (30,149,0): 200, 63, 55, + (30,150,0): 211, 69, 65, + (30,151,0): 229, 77, 76, + (30,152,0): 240, 74, 78, + (30,153,0): 245, 63, 75, + (30,154,0): 251, 56, 72, + (30,155,0): 255, 54, 72, + (30,156,0): 254, 53, 72, + (30,157,0): 249, 50, 69, + (30,158,0): 249, 54, 71, + (30,159,0): 250, 59, 77, + (30,160,0): 247, 58, 80, + (30,161,0): 246, 58, 82, + (30,162,0): 246, 56, 82, + (30,163,0): 249, 56, 85, + (30,164,0): 251, 56, 88, + (30,165,0): 254, 59, 93, + (30,166,0): 255, 61, 97, + (30,167,0): 255, 63, 103, + (30,168,0): 255, 64, 106, + (30,169,0): 255, 64, 108, + (30,170,0): 255, 65, 112, + (30,171,0): 255, 67, 115, + (30,172,0): 251, 68, 116, + (30,173,0): 249, 67, 116, + (30,174,0): 247, 67, 115, + (30,175,0): 244, 67, 111, + (30,176,0): 251, 73, 109, + (30,177,0): 245, 68, 97, + (30,178,0): 249, 72, 101, + (30,179,0): 252, 77, 106, + (30,180,0): 250, 77, 107, + (30,181,0): 255, 88, 116, + (30,182,0): 255, 97, 122, + (30,183,0): 242, 94, 116, + (30,184,0): 240, 107, 126, + (30,185,0): 229, 113, 126, + (30,186,0): 211, 111, 119, + (30,187,0): 175, 93, 97, + (30,188,0): 132, 67, 65, + (30,189,0): 104, 54, 47, + (30,190,0): 105, 65, 55, + (30,191,0): 115, 85, 74, + (30,192,0): 121, 101, 92, + (30,193,0): 140, 125, 118, + (30,194,0): 163, 150, 144, + (30,195,0): 173, 163, 161, + (30,196,0): 178, 174, 171, + (30,197,0): 182, 182, 182, + (30,198,0): 178, 182, 185, + (30,199,0): 170, 175, 179, + (30,200,0): 176, 183, 189, + (30,201,0): 182, 189, 197, + (30,202,0): 189, 193, 202, + (30,203,0): 192, 195, 202, + (30,204,0): 195, 194, 202, + (30,205,0): 201, 198, 205, + (30,206,0): 213, 206, 214, + (30,207,0): 221, 215, 219, + (30,208,0): 226, 218, 216, + (30,209,0): 231, 221, 219, + (30,210,0): 233, 221, 221, + (30,211,0): 230, 218, 220, + (30,212,0): 229, 216, 223, + (30,213,0): 228, 215, 224, + (30,214,0): 224, 212, 222, + (30,215,0): 217, 207, 216, + (30,216,0): 202, 197, 203, + (30,217,0): 186, 186, 186, + (30,218,0): 162, 167, 163, + (30,219,0): 136, 146, 135, + (30,220,0): 116, 130, 113, + (30,221,0): 101, 120, 98, + (30,222,0): 92, 115, 87, + (30,223,0): 91, 111, 83, + (30,224,0): 92, 106, 80, + (30,225,0): 92, 105, 79, + (30,226,0): 94, 104, 79, + (31,0,0): 53, 54, 49, + (31,1,0): 53, 54, 49, + (31,2,0): 53, 54, 49, + (31,3,0): 53, 54, 48, + (31,4,0): 53, 54, 49, + (31,5,0): 54, 55, 49, + (31,6,0): 56, 55, 50, + (31,7,0): 57, 56, 51, + (31,8,0): 60, 59, 54, + (31,9,0): 61, 60, 55, + (31,10,0): 64, 61, 56, + (31,11,0): 66, 63, 58, + (31,12,0): 68, 65, 60, + (31,13,0): 70, 67, 60, + (31,14,0): 71, 68, 61, + (31,15,0): 72, 69, 62, + (31,16,0): 72, 69, 62, + (31,17,0): 72, 69, 62, + (31,18,0): 72, 69, 60, + (31,19,0): 74, 70, 61, + (31,20,0): 74, 70, 59, + (31,21,0): 75, 71, 59, + (31,22,0): 75, 71, 59, + (31,23,0): 78, 72, 58, + (31,24,0): 77, 71, 59, + (31,25,0): 77, 71, 59, + (31,26,0): 77, 69, 58, + (31,27,0): 77, 68, 59, + (31,28,0): 77, 68, 59, + (31,29,0): 77, 68, 61, + (31,30,0): 78, 67, 63, + (31,31,0): 78, 67, 61, + (31,32,0): 77, 67, 55, + (31,33,0): 77, 68, 53, + (31,34,0): 75, 66, 51, + (31,35,0): 74, 65, 50, + (31,36,0): 72, 62, 50, + (31,37,0): 71, 61, 49, + (31,38,0): 69, 61, 50, + (31,39,0): 68, 59, 50, + (31,40,0): 67, 58, 49, + (31,41,0): 67, 58, 51, + (31,42,0): 65, 58, 50, + (31,43,0): 65, 58, 52, + (31,44,0): 64, 57, 51, + (31,45,0): 63, 55, 52, + (31,46,0): 60, 55, 51, + (31,47,0): 60, 55, 49, + (31,48,0): 62, 55, 47, + (31,49,0): 62, 55, 47, + (31,50,0): 60, 56, 47, + (31,51,0): 61, 57, 48, + (31,52,0): 62, 58, 49, + (31,53,0): 65, 58, 50, + (31,54,0): 67, 60, 50, + (31,55,0): 68, 61, 51, + (31,56,0): 72, 64, 53, + (31,57,0): 73, 63, 51, + (31,58,0): 76, 64, 50, + (31,59,0): 77, 65, 49, + (31,60,0): 78, 65, 48, + (31,61,0): 80, 64, 48, + (31,62,0): 79, 64, 45, + (31,63,0): 79, 63, 47, + (31,64,0): 76, 62, 49, + (31,65,0): 76, 62, 51, + (31,66,0): 75, 61, 50, + (31,67,0): 76, 59, 51, + (31,68,0): 74, 57, 49, + (31,69,0): 73, 56, 49, + (31,70,0): 70, 55, 48, + (31,71,0): 67, 56, 50, + (31,72,0): 65, 56, 47, + (31,73,0): 62, 58, 47, + (31,74,0): 61, 59, 47, + (31,75,0): 60, 61, 47, + (31,76,0): 63, 61, 48, + (31,77,0): 64, 62, 47, + (31,78,0): 66, 63, 48, + (31,79,0): 83, 57, 44, + (31,80,0): 134, 61, 55, + (31,81,0): 193, 93, 91, + (31,82,0): 200, 90, 89, + (31,83,0): 174, 56, 54, + (31,84,0): 170, 47, 42, + (31,85,0): 177, 50, 43, + (31,86,0): 171, 47, 37, + (31,87,0): 171, 51, 35, + (31,88,0): 170, 58, 38, + (31,89,0): 171, 67, 42, + (31,90,0): 169, 71, 44, + (31,91,0): 163, 70, 39, + (31,92,0): 160, 66, 38, + (31,93,0): 161, 66, 38, + (31,94,0): 161, 61, 35, + (31,95,0): 158, 58, 35, + (31,96,0): 160, 57, 42, + (31,97,0): 163, 59, 48, + (31,98,0): 166, 58, 48, + (31,99,0): 166, 55, 46, + (31,100,0): 173, 60, 52, + (31,101,0): 182, 67, 60, + (31,102,0): 183, 69, 59, + (31,103,0): 176, 64, 53, + (31,104,0): 171, 61, 48, + (31,105,0): 168, 60, 47, + (31,106,0): 169, 59, 46, + (31,107,0): 172, 60, 48, + (31,108,0): 187, 69, 57, + (31,109,0): 198, 76, 65, + (31,110,0): 197, 69, 60, + (31,111,0): 188, 56, 44, + (31,112,0): 188, 55, 36, + (31,113,0): 201, 60, 40, + (31,114,0): 218, 61, 46, + (31,115,0): 227, 53, 44, + (31,116,0): 238, 44, 42, + (31,117,0): 246, 42, 43, + (31,118,0): 249, 40, 43, + (31,119,0): 247, 39, 39, + (31,120,0): 246, 44, 42, + (31,121,0): 241, 48, 43, + (31,122,0): 236, 52, 44, + (31,123,0): 232, 54, 44, + (31,124,0): 227, 53, 42, + (31,125,0): 226, 52, 41, + (31,126,0): 225, 51, 40, + (31,127,0): 222, 52, 37, + (31,128,0): 222, 59, 42, + (31,129,0): 207, 50, 31, + (31,130,0): 219, 63, 48, + (31,131,0): 205, 55, 41, + (31,132,0): 199, 57, 45, + (31,133,0): 194, 63, 53, + (31,134,0): 179, 65, 54, + (31,135,0): 209, 108, 96, + (31,136,0): 191, 103, 89, + (31,137,0): 165, 82, 66, + (31,138,0): 170, 78, 65, + (31,139,0): 205, 98, 90, + (31,140,0): 232, 103, 98, + (31,141,0): 231, 81, 82, + (31,142,0): 235, 64, 70, + (31,143,0): 246, 65, 74, + (31,144,0): 237, 60, 68, + (31,145,0): 227, 58, 61, + (31,146,0): 215, 59, 60, + (31,147,0): 207, 62, 57, + (31,148,0): 195, 61, 52, + (31,149,0): 185, 54, 44, + (31,150,0): 187, 52, 46, + (31,151,0): 199, 56, 52, + (31,152,0): 229, 71, 72, + (31,153,0): 234, 63, 69, + (31,154,0): 242, 58, 68, + (31,155,0): 249, 57, 72, + (31,156,0): 252, 57, 73, + (31,157,0): 250, 55, 71, + (31,158,0): 250, 58, 73, + (31,159,0): 251, 63, 78, + (31,160,0): 252, 67, 85, + (31,161,0): 251, 65, 86, + (31,162,0): 250, 63, 84, + (31,163,0): 249, 59, 84, + (31,164,0): 251, 58, 85, + (31,165,0): 253, 58, 90, + (31,166,0): 255, 59, 94, + (31,167,0): 255, 60, 99, + (31,168,0): 255, 64, 104, + (31,169,0): 255, 63, 107, + (31,170,0): 255, 63, 110, + (31,171,0): 251, 63, 111, + (31,172,0): 247, 64, 112, + (31,173,0): 245, 65, 113, + (31,174,0): 245, 64, 115, + (31,175,0): 243, 66, 112, + (31,176,0): 244, 68, 106, + (31,177,0): 252, 79, 109, + (31,178,0): 255, 86, 115, + (31,179,0): 243, 76, 104, + (31,180,0): 231, 66, 96, + (31,181,0): 249, 86, 115, + (31,182,0): 255, 105, 133, + (31,183,0): 255, 102, 130, + (31,184,0): 246, 94, 119, + (31,185,0): 238, 96, 120, + (31,186,0): 231, 104, 123, + (31,187,0): 220, 112, 125, + (31,188,0): 199, 112, 120, + (31,189,0): 170, 102, 103, + (31,190,0): 143, 92, 88, + (31,191,0): 126, 89, 81, + (31,192,0): 153, 126, 119, + (31,193,0): 171, 152, 146, + (31,194,0): 190, 176, 173, + (31,195,0): 197, 187, 186, + (31,196,0): 198, 194, 195, + (31,197,0): 200, 199, 204, + (31,198,0): 199, 199, 207, + (31,199,0): 195, 195, 207, + (31,200,0): 203, 202, 216, + (31,201,0): 204, 202, 216, + (31,202,0): 209, 202, 218, + (31,203,0): 215, 206, 223, + (31,204,0): 221, 213, 228, + (31,205,0): 230, 219, 233, + (31,206,0): 232, 224, 235, + (31,207,0): 237, 227, 235, + (31,208,0): 239, 229, 230, + (31,209,0): 242, 232, 230, + (31,210,0): 244, 232, 232, + (31,211,0): 240, 228, 230, + (31,212,0): 238, 225, 232, + (31,213,0): 237, 224, 233, + (31,214,0): 234, 221, 231, + (31,215,0): 228, 216, 226, + (31,216,0): 209, 202, 209, + (31,217,0): 193, 191, 194, + (31,218,0): 171, 171, 169, + (31,219,0): 145, 150, 143, + (31,220,0): 122, 134, 120, + (31,221,0): 108, 123, 104, + (31,222,0): 98, 117, 95, + (31,223,0): 96, 114, 90, + (31,224,0): 100, 114, 89, + (31,225,0): 100, 112, 88, + (31,226,0): 100, 110, 86, + (32,0,0): 50, 49, 47, + (32,1,0): 51, 50, 48, + (32,2,0): 52, 51, 49, + (32,3,0): 54, 53, 49, + (32,4,0): 56, 55, 53, + (32,5,0): 57, 56, 52, + (32,6,0): 57, 56, 52, + (32,7,0): 57, 56, 52, + (32,8,0): 59, 58, 53, + (32,9,0): 60, 59, 54, + (32,10,0): 61, 61, 53, + (32,11,0): 63, 63, 55, + (32,12,0): 65, 65, 57, + (32,13,0): 67, 67, 57, + (32,14,0): 69, 69, 59, + (32,15,0): 69, 69, 59, + (32,16,0): 72, 72, 64, + (32,17,0): 72, 72, 62, + (32,18,0): 72, 72, 60, + (32,19,0): 74, 72, 59, + (32,20,0): 75, 74, 56, + (32,21,0): 76, 75, 55, + (32,22,0): 77, 76, 56, + (32,23,0): 78, 75, 56, + (32,24,0): 77, 74, 57, + (32,25,0): 74, 70, 58, + (32,26,0): 71, 68, 59, + (32,27,0): 74, 70, 67, + (32,28,0): 78, 73, 77, + (32,29,0): 78, 73, 80, + (32,30,0): 71, 68, 79, + (32,31,0): 68, 63, 69, + (32,32,0): 78, 69, 62, + (32,33,0): 76, 67, 52, + (32,34,0): 74, 64, 52, + (32,35,0): 75, 65, 53, + (32,36,0): 77, 67, 57, + (32,37,0): 76, 66, 56, + (32,38,0): 70, 61, 52, + (32,39,0): 66, 57, 48, + (32,40,0): 69, 60, 53, + (32,41,0): 67, 58, 53, + (32,42,0): 64, 57, 51, + (32,43,0): 63, 55, 52, + (32,44,0): 64, 56, 53, + (32,45,0): 63, 55, 53, + (32,46,0): 60, 55, 52, + (32,47,0): 60, 52, 50, + (32,48,0): 67, 58, 53, + (32,49,0): 66, 57, 52, + (32,50,0): 65, 57, 54, + (32,51,0): 62, 57, 53, + (32,52,0): 63, 58, 55, + (32,53,0): 62, 58, 55, + (32,54,0): 63, 59, 56, + (32,55,0): 64, 60, 57, + (32,56,0): 66, 63, 58, + (32,57,0): 68, 64, 55, + (32,58,0): 71, 64, 54, + (32,59,0): 74, 64, 52, + (32,60,0): 76, 64, 48, + (32,61,0): 79, 64, 45, + (32,62,0): 79, 64, 43, + (32,63,0): 76, 63, 44, + (32,64,0): 70, 64, 50, + (32,65,0): 69, 62, 52, + (32,66,0): 72, 59, 51, + (32,67,0): 74, 56, 52, + (32,68,0): 75, 54, 53, + (32,69,0): 77, 52, 55, + (32,70,0): 75, 55, 57, + (32,71,0): 72, 58, 58, + (32,72,0): 67, 62, 58, + (32,73,0): 55, 56, 48, + (32,74,0): 55, 59, 45, + (32,75,0): 62, 66, 49, + (32,76,0): 62, 64, 43, + (32,77,0): 58, 56, 35, + (32,78,0): 67, 59, 36, + (32,79,0): 101, 66, 46, + (32,80,0): 189, 106, 92, + (32,81,0): 183, 75, 65, + (32,82,0): 166, 55, 44, + (32,83,0): 164, 54, 41, + (32,84,0): 167, 55, 43, + (32,85,0): 164, 54, 39, + (32,86,0): 163, 56, 38, + (32,87,0): 168, 61, 43, + (32,88,0): 162, 57, 36, + (32,89,0): 165, 60, 38, + (32,90,0): 169, 64, 42, + (32,91,0): 171, 65, 41, + (32,92,0): 172, 61, 41, + (32,93,0): 172, 57, 38, + (32,94,0): 174, 54, 37, + (32,95,0): 170, 55, 37, + (32,96,0): 164, 54, 39, + (32,97,0): 161, 55, 41, + (32,98,0): 162, 56, 42, + (32,99,0): 166, 60, 46, + (32,100,0): 170, 64, 50, + (32,101,0): 172, 66, 52, + (32,102,0): 172, 66, 50, + (32,103,0): 172, 65, 49, + (32,104,0): 169, 62, 44, + (32,105,0): 171, 61, 44, + (32,106,0): 173, 60, 44, + (32,107,0): 179, 61, 47, + (32,108,0): 189, 67, 52, + (32,109,0): 196, 70, 56, + (32,110,0): 192, 62, 49, + (32,111,0): 184, 50, 38, + (32,112,0): 199, 57, 43, + (32,113,0): 203, 57, 42, + (32,114,0): 207, 57, 43, + (32,115,0): 213, 57, 45, + (32,116,0): 219, 55, 45, + (32,117,0): 225, 54, 46, + (32,118,0): 231, 52, 47, + (32,119,0): 237, 50, 45, + (32,120,0): 240, 46, 44, + (32,121,0): 242, 47, 45, + (32,122,0): 242, 49, 44, + (32,123,0): 239, 50, 44, + (32,124,0): 234, 53, 42, + (32,125,0): 227, 55, 41, + (32,126,0): 221, 58, 41, + (32,127,0): 218, 59, 40, + (32,128,0): 219, 58, 38, + (32,129,0): 212, 51, 31, + (32,130,0): 207, 52, 32, + (32,131,0): 206, 56, 39, + (32,132,0): 197, 56, 39, + (32,133,0): 190, 54, 40, + (32,134,0): 194, 66, 53, + (32,135,0): 207, 83, 73, + (32,136,0): 200, 78, 67, + (32,137,0): 207, 83, 75, + (32,138,0): 225, 92, 87, + (32,139,0): 238, 93, 90, + (32,140,0): 240, 80, 82, + (32,141,0): 237, 62, 67, + (32,142,0): 243, 56, 63, + (32,143,0): 248, 63, 71, + (32,144,0): 235, 64, 70, + (32,145,0): 225, 67, 68, + (32,146,0): 214, 64, 65, + (32,147,0): 201, 62, 57, + (32,148,0): 187, 60, 51, + (32,149,0): 179, 58, 47, + (32,150,0): 177, 59, 47, + (32,151,0): 180, 59, 48, + (32,152,0): 202, 76, 64, + (32,153,0): 212, 75, 67, + (32,154,0): 222, 70, 67, + (32,155,0): 226, 62, 63, + (32,156,0): 235, 60, 65, + (32,157,0): 248, 63, 71, + (32,158,0): 254, 62, 73, + (32,159,0): 249, 59, 71, + (32,160,0): 253, 69, 81, + (32,161,0): 250, 68, 81, + (32,162,0): 253, 68, 82, + (32,163,0): 255, 68, 85, + (32,164,0): 253, 64, 86, + (32,165,0): 250, 60, 85, + (32,166,0): 254, 61, 90, + (32,167,0): 255, 66, 100, + (32,168,0): 255, 70, 107, + (32,169,0): 255, 65, 106, + (32,170,0): 249, 59, 103, + (32,171,0): 245, 58, 103, + (32,172,0): 244, 61, 109, + (32,173,0): 248, 68, 115, + (32,174,0): 253, 73, 121, + (32,175,0): 255, 75, 122, + (32,176,0): 255, 78, 121, + (32,177,0): 255, 78, 117, + (32,178,0): 249, 81, 116, + (32,179,0): 239, 82, 113, + (32,180,0): 229, 79, 106, + (32,181,0): 229, 79, 106, + (32,182,0): 247, 90, 119, + (32,183,0): 255, 103, 135, + (32,184,0): 255, 93, 128, + (32,185,0): 240, 69, 105, + (32,186,0): 245, 86, 118, + (32,187,0): 232, 94, 120, + (32,188,0): 198, 91, 109, + (32,189,0): 194, 117, 125, + (32,190,0): 140, 92, 92, + (32,191,0): 145, 114, 109, + (32,192,0): 171, 143, 132, + (32,193,0): 189, 167, 156, + (32,194,0): 212, 195, 187, + (32,195,0): 222, 213, 208, + (32,196,0): 221, 220, 218, + (32,197,0): 220, 219, 224, + (32,198,0): 222, 220, 231, + (32,199,0): 226, 219, 235, + (32,200,0): 231, 216, 237, + (32,201,0): 235, 216, 238, + (32,202,0): 241, 217, 241, + (32,203,0): 244, 220, 242, + (32,204,0): 245, 227, 243, + (32,205,0): 245, 231, 244, + (32,206,0): 243, 236, 244, + (32,207,0): 244, 239, 243, + (32,208,0): 248, 243, 240, + (32,209,0): 248, 243, 239, + (32,210,0): 248, 240, 238, + (32,211,0): 245, 236, 237, + (32,212,0): 242, 231, 235, + (32,213,0): 237, 226, 232, + (32,214,0): 232, 221, 227, + (32,215,0): 229, 220, 225, + (32,216,0): 214, 208, 212, + (32,217,0): 205, 201, 202, + (32,218,0): 187, 186, 184, + (32,219,0): 163, 165, 160, + (32,220,0): 139, 144, 137, + (32,221,0): 121, 131, 120, + (32,222,0): 114, 125, 111, + (32,223,0): 112, 123, 107, + (32,224,0): 123, 132, 115, + (32,225,0): 119, 128, 109, + (32,226,0): 118, 125, 107, + (33,0,0): 48, 46, 47, + (33,1,0): 49, 47, 48, + (33,2,0): 51, 50, 48, + (33,3,0): 53, 52, 50, + (33,4,0): 54, 53, 51, + (33,5,0): 55, 54, 50, + (33,6,0): 56, 55, 51, + (33,7,0): 56, 55, 50, + (33,8,0): 58, 57, 52, + (33,9,0): 59, 58, 53, + (33,10,0): 61, 61, 53, + (33,11,0): 63, 63, 55, + (33,12,0): 65, 65, 55, + (33,13,0): 67, 67, 57, + (33,14,0): 68, 68, 56, + (33,15,0): 69, 69, 59, + (33,16,0): 72, 72, 62, + (33,17,0): 72, 72, 62, + (33,18,0): 72, 72, 60, + (33,19,0): 74, 72, 57, + (33,20,0): 75, 74, 54, + (33,21,0): 76, 75, 54, + (33,22,0): 77, 77, 53, + (33,23,0): 78, 77, 56, + (33,24,0): 75, 74, 56, + (33,25,0): 75, 73, 61, + (33,26,0): 75, 74, 69, + (33,27,0): 80, 80, 82, + (33,28,0): 87, 85, 96, + (33,29,0): 89, 88, 106, + (33,30,0): 86, 84, 106, + (33,31,0): 82, 79, 96, + (33,32,0): 79, 73, 75, + (33,33,0): 77, 68, 63, + (33,34,0): 72, 63, 58, + (33,35,0): 70, 61, 56, + (33,36,0): 71, 62, 57, + (33,37,0): 72, 63, 58, + (33,38,0): 70, 61, 56, + (33,39,0): 66, 59, 53, + (33,40,0): 68, 58, 56, + (33,41,0): 65, 57, 54, + (33,42,0): 63, 55, 52, + (33,43,0): 63, 55, 52, + (33,44,0): 64, 56, 53, + (33,45,0): 64, 56, 53, + (33,46,0): 61, 56, 53, + (33,47,0): 59, 54, 50, + (33,48,0): 61, 52, 47, + (33,49,0): 61, 52, 47, + (33,50,0): 61, 53, 50, + (33,51,0): 60, 55, 52, + (33,52,0): 61, 57, 54, + (33,53,0): 62, 58, 57, + (33,54,0): 61, 60, 58, + (33,55,0): 62, 61, 57, + (33,56,0): 66, 63, 58, + (33,57,0): 68, 63, 57, + (33,58,0): 71, 64, 54, + (33,59,0): 74, 64, 52, + (33,60,0): 77, 64, 48, + (33,61,0): 79, 64, 45, + (33,62,0): 80, 63, 43, + (33,63,0): 76, 63, 44, + (33,64,0): 65, 64, 46, + (33,65,0): 63, 64, 50, + (33,66,0): 69, 60, 53, + (33,67,0): 72, 57, 54, + (33,68,0): 74, 54, 55, + (33,69,0): 74, 52, 55, + (33,70,0): 70, 51, 55, + (33,71,0): 67, 52, 55, + (33,72,0): 65, 60, 57, + (33,73,0): 60, 59, 54, + (33,74,0): 61, 61, 49, + (33,75,0): 69, 63, 49, + (33,76,0): 74, 58, 42, + (33,77,0): 80, 54, 37, + (33,78,0): 100, 65, 46, + (33,79,0): 133, 74, 58, + (33,80,0): 176, 80, 66, + (33,81,0): 171, 59, 45, + (33,82,0): 160, 50, 35, + (33,83,0): 161, 54, 38, + (33,84,0): 163, 58, 39, + (33,85,0): 158, 55, 36, + (33,86,0): 158, 57, 37, + (33,87,0): 163, 62, 42, + (33,88,0): 161, 59, 37, + (33,89,0): 167, 60, 40, + (33,90,0): 174, 63, 43, + (33,91,0): 179, 64, 45, + (33,92,0): 182, 61, 44, + (33,93,0): 183, 57, 42, + (33,94,0): 184, 54, 40, + (33,95,0): 181, 55, 41, + (33,96,0): 170, 57, 41, + (33,97,0): 165, 58, 42, + (33,98,0): 164, 57, 41, + (33,99,0): 165, 59, 43, + (33,100,0): 168, 62, 46, + (33,101,0): 171, 65, 49, + (33,102,0): 171, 66, 47, + (33,103,0): 171, 64, 46, + (33,104,0): 174, 63, 44, + (33,105,0): 171, 58, 40, + (33,106,0): 177, 60, 43, + (33,107,0): 191, 69, 54, + (33,108,0): 198, 72, 57, + (33,109,0): 193, 63, 49, + (33,110,0): 188, 56, 43, + (33,111,0): 192, 54, 41, + (33,112,0): 203, 55, 43, + (33,113,0): 207, 55, 44, + (33,114,0): 208, 57, 46, + (33,115,0): 209, 59, 45, + (33,116,0): 212, 60, 47, + (33,117,0): 216, 58, 46, + (33,118,0): 224, 56, 47, + (33,119,0): 231, 52, 45, + (33,120,0): 238, 49, 45, + (33,121,0): 244, 46, 43, + (33,122,0): 244, 46, 43, + (33,123,0): 241, 48, 43, + (33,124,0): 234, 52, 41, + (33,125,0): 225, 55, 40, + (33,126,0): 215, 58, 39, + (33,127,0): 213, 58, 36, + (33,128,0): 222, 60, 39, + (33,129,0): 217, 54, 35, + (33,130,0): 213, 56, 37, + (33,131,0): 212, 61, 42, + (33,132,0): 204, 59, 42, + (33,133,0): 193, 53, 38, + (33,134,0): 196, 58, 47, + (33,135,0): 207, 70, 60, + (33,136,0): 209, 70, 63, + (33,137,0): 218, 73, 68, + (33,138,0): 233, 79, 77, + (33,139,0): 243, 80, 81, + (33,140,0): 244, 71, 73, + (33,141,0): 240, 59, 64, + (33,142,0): 245, 58, 65, + (33,143,0): 248, 67, 72, + (33,144,0): 229, 66, 69, + (33,145,0): 218, 68, 67, + (33,146,0): 210, 66, 65, + (33,147,0): 197, 62, 56, + (33,148,0): 183, 59, 49, + (33,149,0): 174, 58, 45, + (33,150,0): 170, 60, 45, + (33,151,0): 171, 61, 46, + (33,152,0): 182, 69, 53, + (33,153,0): 198, 76, 63, + (33,154,0): 212, 78, 69, + (33,155,0): 220, 71, 67, + (33,156,0): 227, 63, 62, + (33,157,0): 239, 63, 66, + (33,158,0): 250, 63, 70, + (33,159,0): 254, 64, 74, + (33,160,0): 248, 67, 74, + (33,161,0): 247, 67, 76, + (33,162,0): 250, 68, 80, + (33,163,0): 255, 70, 84, + (33,164,0): 253, 66, 83, + (33,165,0): 249, 62, 83, + (33,166,0): 252, 62, 88, + (33,167,0): 255, 66, 97, + (33,168,0): 255, 70, 104, + (33,169,0): 255, 67, 105, + (33,170,0): 252, 63, 105, + (33,171,0): 249, 64, 106, + (33,172,0): 249, 66, 112, + (33,173,0): 252, 70, 118, + (33,174,0): 254, 74, 122, + (33,175,0): 255, 75, 123, + (33,176,0): 255, 72, 120, + (33,177,0): 255, 71, 115, + (33,178,0): 244, 74, 111, + (33,179,0): 242, 82, 116, + (33,180,0): 243, 93, 122, + (33,181,0): 246, 96, 123, + (33,182,0): 247, 88, 118, + (33,183,0): 247, 79, 112, + (33,184,0): 250, 70, 107, + (33,185,0): 248, 68, 107, + (33,186,0): 238, 68, 104, + (33,187,0): 220, 73, 102, + (33,188,0): 203, 92, 111, + (33,189,0): 182, 106, 116, + (33,190,0): 115, 71, 72, + (33,191,0): 150, 121, 115, + (33,192,0): 180, 148, 137, + (33,193,0): 206, 176, 165, + (33,194,0): 229, 209, 200, + (33,195,0): 239, 226, 220, + (33,196,0): 235, 231, 230, + (33,197,0): 233, 232, 237, + (33,198,0): 236, 230, 242, + (33,199,0): 237, 226, 243, + (33,200,0): 246, 227, 249, + (33,201,0): 251, 225, 250, + (33,202,0): 255, 227, 253, + (33,203,0): 255, 230, 253, + (33,204,0): 255, 236, 254, + (33,205,0): 255, 242, 253, + (33,206,0): 254, 247, 254, + (33,207,0): 252, 250, 251, + (33,208,0): 253, 249, 246, + (33,209,0): 252, 249, 244, + (33,210,0): 251, 246, 243, + (33,211,0): 249, 244, 241, + (33,212,0): 247, 238, 239, + (33,213,0): 243, 234, 237, + (33,214,0): 240, 231, 236, + (33,215,0): 238, 229, 234, + (33,216,0): 230, 221, 224, + (33,217,0): 220, 214, 216, + (33,218,0): 202, 198, 197, + (33,219,0): 179, 178, 174, + (33,220,0): 158, 161, 154, + (33,221,0): 142, 147, 140, + (33,222,0): 137, 143, 133, + (33,223,0): 136, 144, 131, + (33,224,0): 142, 148, 134, + (33,225,0): 137, 144, 128, + (33,226,0): 134, 140, 126, + (34,0,0): 47, 46, 44, + (34,1,0): 48, 47, 45, + (34,2,0): 49, 48, 46, + (34,3,0): 50, 49, 47, + (34,4,0): 52, 51, 47, + (34,5,0): 53, 52, 48, + (34,6,0): 55, 54, 50, + (34,7,0): 55, 54, 49, + (34,8,0): 58, 57, 52, + (34,9,0): 58, 58, 50, + (34,10,0): 60, 60, 52, + (34,11,0): 62, 62, 54, + (34,12,0): 64, 64, 54, + (34,13,0): 66, 66, 56, + (34,14,0): 67, 67, 57, + (34,15,0): 68, 68, 58, + (34,16,0): 73, 70, 61, + (34,17,0): 73, 71, 59, + (34,18,0): 74, 72, 59, + (34,19,0): 76, 73, 56, + (34,20,0): 77, 74, 55, + (34,21,0): 78, 76, 55, + (34,22,0): 78, 76, 55, + (34,23,0): 79, 76, 57, + (34,24,0): 75, 73, 58, + (34,25,0): 78, 75, 66, + (34,26,0): 84, 82, 83, + (34,27,0): 95, 94, 102, + (34,28,0): 105, 104, 120, + (34,29,0): 109, 109, 133, + (34,30,0): 108, 107, 138, + (34,31,0): 107, 104, 131, + (34,32,0): 96, 89, 105, + (34,33,0): 89, 81, 92, + (34,34,0): 79, 71, 82, + (34,35,0): 72, 64, 75, + (34,36,0): 72, 62, 71, + (34,37,0): 71, 61, 69, + (34,38,0): 69, 60, 65, + (34,39,0): 64, 58, 60, + (34,40,0): 67, 58, 59, + (34,41,0): 63, 58, 55, + (34,42,0): 60, 55, 52, + (34,43,0): 60, 55, 51, + (34,44,0): 61, 56, 50, + (34,45,0): 62, 57, 51, + (34,46,0): 62, 58, 49, + (34,47,0): 61, 57, 48, + (34,48,0): 56, 51, 45, + (34,49,0): 57, 52, 46, + (34,50,0): 59, 54, 48, + (34,51,0): 60, 57, 50, + (34,52,0): 61, 58, 51, + (34,53,0): 62, 59, 52, + (34,54,0): 63, 60, 53, + (34,55,0): 64, 60, 51, + (34,56,0): 69, 62, 52, + (34,57,0): 71, 63, 52, + (34,58,0): 73, 63, 51, + (34,59,0): 76, 64, 48, + (34,60,0): 79, 63, 48, + (34,61,0): 80, 63, 47, + (34,62,0): 80, 63, 45, + (34,63,0): 76, 63, 44, + (34,64,0): 60, 59, 39, + (34,65,0): 58, 61, 42, + (34,66,0): 62, 60, 47, + (34,67,0): 65, 58, 48, + (34,68,0): 66, 55, 51, + (34,69,0): 67, 53, 52, + (34,70,0): 63, 52, 50, + (34,71,0): 60, 50, 49, + (34,72,0): 63, 55, 52, + (34,73,0): 68, 57, 53, + (34,74,0): 75, 56, 50, + (34,75,0): 82, 49, 44, + (34,76,0): 92, 43, 39, + (34,77,0): 111, 46, 44, + (34,78,0): 139, 58, 57, + (34,79,0): 164, 69, 67, + (34,80,0): 165, 58, 48, + (34,81,0): 162, 50, 36, + (34,82,0): 159, 49, 32, + (34,83,0): 164, 57, 39, + (34,84,0): 165, 60, 41, + (34,85,0): 158, 55, 36, + (34,86,0): 158, 56, 34, + (34,87,0): 162, 60, 38, + (34,88,0): 164, 59, 38, + (34,89,0): 170, 61, 41, + (34,90,0): 177, 65, 45, + (34,91,0): 182, 65, 47, + (34,92,0): 185, 62, 46, + (34,93,0): 187, 60, 45, + (34,94,0): 190, 58, 45, + (34,95,0): 190, 60, 47, + (34,96,0): 178, 60, 46, + (34,97,0): 172, 60, 46, + (34,98,0): 169, 57, 43, + (34,99,0): 169, 57, 43, + (34,100,0): 171, 60, 43, + (34,101,0): 173, 62, 45, + (34,102,0): 173, 62, 45, + (34,103,0): 173, 60, 44, + (34,104,0): 178, 63, 45, + (34,105,0): 176, 56, 40, + (34,106,0): 185, 62, 46, + (34,107,0): 203, 76, 61, + (34,108,0): 203, 71, 58, + (34,109,0): 188, 54, 42, + (34,110,0): 186, 50, 38, + (34,111,0): 201, 57, 46, + (34,112,0): 208, 54, 44, + (34,113,0): 212, 54, 43, + (34,114,0): 212, 56, 44, + (34,115,0): 214, 58, 46, + (34,116,0): 216, 58, 47, + (34,117,0): 220, 56, 46, + (34,118,0): 227, 54, 47, + (34,119,0): 232, 51, 44, + (34,120,0): 240, 48, 45, + (34,121,0): 244, 46, 43, + (34,122,0): 244, 46, 43, + (34,123,0): 240, 49, 41, + (34,124,0): 231, 50, 39, + (34,125,0): 221, 54, 38, + (34,126,0): 212, 56, 34, + (34,127,0): 210, 55, 33, + (34,128,0): 221, 56, 36, + (34,129,0): 220, 53, 35, + (34,130,0): 218, 57, 39, + (34,131,0): 218, 62, 47, + (34,132,0): 211, 61, 46, + (34,133,0): 200, 54, 41, + (34,134,0): 197, 57, 44, + (34,135,0): 203, 65, 55, + (34,136,0): 201, 60, 53, + (34,137,0): 205, 62, 56, + (34,138,0): 217, 69, 65, + (34,139,0): 229, 75, 73, + (34,140,0): 234, 74, 74, + (34,141,0): 233, 67, 67, + (34,142,0): 236, 63, 65, + (34,143,0): 235, 67, 67, + (34,144,0): 222, 67, 65, + (34,145,0): 213, 68, 63, + (34,146,0): 205, 66, 61, + (34,147,0): 194, 61, 52, + (34,148,0): 182, 58, 46, + (34,149,0): 174, 56, 42, + (34,150,0): 171, 58, 42, + (34,151,0): 172, 59, 43, + (34,152,0): 172, 56, 41, + (34,153,0): 192, 68, 56, + (34,154,0): 212, 78, 69, + (34,155,0): 221, 73, 69, + (34,156,0): 224, 64, 64, + (34,157,0): 232, 62, 65, + (34,158,0): 247, 66, 73, + (34,159,0): 255, 72, 80, + (34,160,0): 244, 65, 71, + (34,161,0): 244, 64, 73, + (34,162,0): 249, 67, 79, + (34,163,0): 253, 71, 84, + (34,164,0): 254, 69, 85, + (34,165,0): 250, 64, 85, + (34,166,0): 251, 63, 88, + (34,167,0): 254, 65, 95, + (34,168,0): 255, 68, 102, + (34,169,0): 255, 67, 105, + (34,170,0): 255, 67, 107, + (34,171,0): 255, 70, 112, + (34,172,0): 255, 73, 119, + (34,173,0): 255, 75, 123, + (34,174,0): 255, 76, 124, + (34,175,0): 255, 74, 122, + (34,176,0): 255, 66, 116, + (34,177,0): 255, 68, 116, + (34,178,0): 254, 72, 113, + (34,179,0): 250, 78, 116, + (34,180,0): 252, 91, 124, + (34,181,0): 255, 98, 128, + (34,182,0): 250, 87, 118, + (34,183,0): 236, 69, 99, + (34,184,0): 248, 77, 109, + (34,185,0): 254, 86, 119, + (34,186,0): 218, 64, 92, + (34,187,0): 203, 71, 94, + (34,188,0): 218, 121, 132, + (34,189,0): 187, 121, 123, + (34,190,0): 103, 64, 59, + (34,191,0): 151, 123, 112, + (34,192,0): 178, 140, 129, + (34,193,0): 215, 177, 166, + (34,194,0): 245, 216, 208, + (34,195,0): 253, 234, 228, + (34,196,0): 250, 240, 239, + (34,197,0): 250, 245, 249, + (34,198,0): 249, 243, 253, + (34,199,0): 244, 236, 251, + (34,200,0): 251, 233, 255, + (34,201,0): 255, 233, 255, + (34,202,0): 255, 234, 255, + (34,203,0): 255, 237, 255, + (34,204,0): 255, 242, 255, + (34,205,0): 255, 246, 255, + (34,206,0): 255, 251, 255, + (34,207,0): 255, 254, 252, + (34,208,0): 255, 253, 250, + (34,209,0): 255, 252, 248, + (34,210,0): 255, 249, 247, + (34,211,0): 255, 247, 245, + (34,212,0): 254, 244, 245, + (34,213,0): 252, 242, 243, + (34,214,0): 250, 239, 243, + (34,215,0): 248, 239, 242, + (34,216,0): 240, 231, 234, + (34,217,0): 229, 223, 225, + (34,218,0): 211, 207, 206, + (34,219,0): 190, 189, 185, + (34,220,0): 173, 174, 168, + (34,221,0): 162, 165, 158, + (34,222,0): 157, 163, 153, + (34,223,0): 157, 163, 151, + (34,224,0): 163, 171, 158, + (34,225,0): 157, 165, 150, + (34,226,0): 153, 161, 148, + (35,0,0): 47, 46, 44, + (35,1,0): 47, 46, 44, + (35,2,0): 48, 47, 45, + (35,3,0): 49, 48, 44, + (35,4,0): 50, 49, 45, + (35,5,0): 51, 50, 46, + (35,6,0): 53, 52, 47, + (35,7,0): 54, 53, 48, + (35,8,0): 56, 56, 48, + (35,9,0): 57, 57, 49, + (35,10,0): 59, 59, 51, + (35,11,0): 61, 61, 53, + (35,12,0): 63, 63, 53, + (35,13,0): 65, 65, 55, + (35,14,0): 66, 66, 56, + (35,15,0): 67, 67, 57, + (35,16,0): 72, 69, 60, + (35,17,0): 74, 70, 59, + (35,18,0): 75, 72, 57, + (35,19,0): 77, 74, 57, + (35,20,0): 80, 75, 56, + (35,21,0): 79, 77, 56, + (35,22,0): 81, 76, 56, + (35,23,0): 79, 76, 59, + (35,24,0): 76, 74, 62, + (35,25,0): 81, 80, 76, + (35,26,0): 94, 93, 98, + (35,27,0): 109, 108, 122, + (35,28,0): 122, 122, 146, + (35,29,0): 129, 130, 161, + (35,30,0): 128, 130, 168, + (35,31,0): 128, 128, 166, + (35,32,0): 123, 117, 151, + (35,33,0): 114, 107, 138, + (35,34,0): 101, 95, 123, + (35,35,0): 89, 83, 109, + (35,36,0): 84, 76, 100, + (35,37,0): 77, 69, 90, + (35,38,0): 71, 64, 80, + (35,39,0): 66, 60, 72, + (35,40,0): 68, 63, 70, + (35,41,0): 64, 59, 63, + (35,42,0): 60, 56, 55, + (35,43,0): 59, 54, 51, + (35,44,0): 59, 54, 48, + (35,45,0): 60, 56, 47, + (35,46,0): 61, 57, 46, + (35,47,0): 59, 56, 47, + (35,48,0): 58, 55, 48, + (35,49,0): 57, 57, 49, + (35,50,0): 59, 59, 51, + (35,51,0): 62, 59, 50, + (35,52,0): 63, 61, 49, + (35,53,0): 64, 60, 49, + (35,54,0): 63, 59, 47, + (35,55,0): 65, 59, 45, + (35,56,0): 70, 63, 47, + (35,57,0): 72, 63, 46, + (35,58,0): 75, 63, 47, + (35,59,0): 77, 64, 47, + (35,60,0): 79, 63, 48, + (35,61,0): 79, 63, 47, + (35,62,0): 80, 62, 48, + (35,63,0): 76, 63, 47, + (35,64,0): 66, 61, 42, + (35,65,0): 63, 62, 44, + (35,66,0): 64, 61, 46, + (35,67,0): 65, 58, 48, + (35,68,0): 65, 58, 50, + (35,69,0): 64, 57, 51, + (35,70,0): 62, 57, 53, + (35,71,0): 60, 57, 52, + (35,72,0): 61, 56, 52, + (35,73,0): 70, 56, 53, + (35,74,0): 80, 52, 49, + (35,75,0): 88, 44, 43, + (35,76,0): 107, 41, 43, + (35,77,0): 135, 48, 54, + (35,78,0): 161, 55, 65, + (35,79,0): 174, 61, 65, + (35,80,0): 167, 54, 46, + (35,81,0): 165, 55, 40, + (35,82,0): 165, 58, 40, + (35,83,0): 170, 63, 45, + (35,84,0): 168, 63, 44, + (35,85,0): 160, 57, 38, + (35,86,0): 161, 56, 35, + (35,87,0): 164, 59, 38, + (35,88,0): 165, 58, 38, + (35,89,0): 171, 60, 41, + (35,90,0): 179, 62, 44, + (35,91,0): 185, 64, 47, + (35,92,0): 189, 62, 47, + (35,93,0): 193, 61, 48, + (35,94,0): 197, 61, 49, + (35,95,0): 196, 62, 50, + (35,96,0): 189, 63, 51, + (35,97,0): 182, 61, 50, + (35,98,0): 178, 57, 46, + (35,99,0): 174, 56, 42, + (35,100,0): 175, 57, 43, + (35,101,0): 176, 58, 44, + (35,102,0): 178, 58, 44, + (35,103,0): 179, 57, 42, + (35,104,0): 182, 59, 44, + (35,105,0): 185, 59, 45, + (35,106,0): 196, 66, 52, + (35,107,0): 203, 69, 57, + (35,108,0): 200, 62, 51, + (35,109,0): 190, 49, 39, + (35,110,0): 192, 50, 40, + (35,111,0): 205, 57, 47, + (35,112,0): 214, 53, 43, + (35,113,0): 216, 52, 42, + (35,114,0): 218, 54, 45, + (35,115,0): 219, 55, 45, + (35,116,0): 222, 55, 46, + (35,117,0): 225, 54, 44, + (35,118,0): 230, 51, 44, + (35,119,0): 236, 49, 42, + (35,120,0): 243, 48, 44, + (35,121,0): 244, 46, 43, + (35,122,0): 244, 47, 41, + (35,123,0): 239, 48, 40, + (35,124,0): 228, 50, 38, + (35,125,0): 219, 52, 36, + (35,126,0): 210, 54, 32, + (35,127,0): 208, 53, 31, + (35,128,0): 215, 50, 30, + (35,129,0): 218, 48, 31, + (35,130,0): 218, 52, 36, + (35,131,0): 220, 60, 46, + (35,132,0): 214, 61, 47, + (35,133,0): 208, 57, 46, + (35,134,0): 205, 61, 50, + (35,135,0): 210, 68, 58, + (35,136,0): 196, 53, 45, + (35,137,0): 197, 54, 48, + (35,138,0): 202, 59, 53, + (35,139,0): 216, 68, 64, + (35,140,0): 226, 77, 73, + (35,141,0): 229, 75, 73, + (35,142,0): 222, 67, 63, + (35,143,0): 214, 61, 56, + (35,144,0): 211, 64, 57, + (35,145,0): 206, 65, 56, + (35,146,0): 199, 62, 52, + (35,147,0): 190, 60, 47, + (35,148,0): 181, 58, 43, + (35,149,0): 176, 56, 42, + (35,150,0): 175, 57, 43, + (35,151,0): 177, 59, 45, + (35,152,0): 172, 52, 38, + (35,153,0): 189, 63, 51, + (35,154,0): 209, 72, 64, + (35,155,0): 217, 72, 67, + (35,156,0): 221, 66, 64, + (35,157,0): 229, 64, 68, + (35,158,0): 243, 70, 76, + (35,159,0): 253, 78, 85, + (35,160,0): 240, 63, 69, + (35,161,0): 240, 63, 69, + (35,162,0): 246, 66, 77, + (35,163,0): 254, 72, 85, + (35,164,0): 254, 72, 87, + (35,165,0): 252, 66, 87, + (35,166,0): 250, 64, 88, + (35,167,0): 252, 65, 94, + (35,168,0): 255, 65, 99, + (35,169,0): 255, 67, 102, + (35,170,0): 255, 70, 109, + (35,171,0): 255, 73, 114, + (35,172,0): 255, 77, 121, + (35,173,0): 255, 79, 124, + (35,174,0): 255, 76, 123, + (35,175,0): 255, 72, 121, + (35,176,0): 255, 63, 113, + (35,177,0): 255, 74, 122, + (35,178,0): 255, 79, 122, + (35,179,0): 252, 73, 112, + (35,180,0): 246, 77, 110, + (35,181,0): 252, 87, 117, + (35,182,0): 252, 87, 117, + (35,183,0): 243, 79, 106, + (35,184,0): 239, 75, 102, + (35,185,0): 236, 78, 103, + (35,186,0): 206, 62, 85, + (35,187,0): 220, 98, 113, + (35,188,0): 251, 156, 164, + (35,189,0): 211, 141, 141, + (35,190,0): 104, 57, 51, + (35,191,0): 113, 75, 64, + (35,192,0): 166, 119, 109, + (35,193,0): 210, 163, 155, + (35,194,0): 247, 210, 202, + (35,195,0): 255, 231, 226, + (35,196,0): 255, 242, 241, + (35,197,0): 255, 251, 254, + (35,198,0): 255, 250, 255, + (35,199,0): 249, 241, 254, + (35,200,0): 250, 237, 255, + (35,201,0): 252, 237, 255, + (35,202,0): 255, 237, 255, + (35,203,0): 255, 240, 255, + (35,204,0): 255, 242, 253, + (35,205,0): 255, 246, 254, + (35,206,0): 254, 250, 251, + (35,207,0): 255, 251, 250, + (35,208,0): 255, 252, 249, + (35,209,0): 255, 251, 247, + (35,210,0): 255, 249, 247, + (35,211,0): 255, 248, 246, + (35,212,0): 255, 245, 246, + (35,213,0): 254, 244, 245, + (35,214,0): 254, 243, 247, + (35,215,0): 253, 242, 246, + (35,216,0): 246, 235, 239, + (35,217,0): 236, 227, 228, + (35,218,0): 218, 213, 210, + (35,219,0): 201, 198, 193, + (35,220,0): 186, 185, 180, + (35,221,0): 179, 180, 172, + (35,222,0): 177, 180, 169, + (35,223,0): 176, 182, 170, + (35,224,0): 183, 191, 180, + (35,225,0): 175, 183, 172, + (35,226,0): 169, 177, 166, + (36,0,0): 49, 48, 44, + (36,1,0): 49, 48, 44, + (36,2,0): 48, 47, 43, + (36,3,0): 48, 47, 43, + (36,4,0): 49, 48, 44, + (36,5,0): 50, 49, 44, + (36,6,0): 52, 51, 46, + (36,7,0): 53, 52, 47, + (36,8,0): 55, 55, 47, + (36,9,0): 56, 56, 48, + (36,10,0): 57, 57, 49, + (36,11,0): 59, 59, 51, + (36,12,0): 61, 61, 51, + (36,13,0): 63, 63, 53, + (36,14,0): 65, 65, 55, + (36,15,0): 68, 65, 56, + (36,16,0): 73, 69, 58, + (36,17,0): 76, 70, 58, + (36,18,0): 78, 72, 58, + (36,19,0): 80, 74, 58, + (36,20,0): 82, 75, 57, + (36,21,0): 82, 77, 58, + (36,22,0): 83, 76, 58, + (36,23,0): 81, 75, 61, + (36,24,0): 79, 74, 68, + (36,25,0): 86, 84, 85, + (36,26,0): 102, 100, 113, + (36,27,0): 119, 120, 141, + (36,28,0): 134, 134, 168, + (36,29,0): 141, 144, 185, + (36,30,0): 143, 147, 195, + (36,31,0): 143, 144, 198, + (36,32,0): 142, 139, 192, + (36,33,0): 135, 131, 182, + (36,34,0): 123, 119, 169, + (36,35,0): 112, 109, 154, + (36,36,0): 105, 100, 141, + (36,37,0): 95, 91, 126, + (36,38,0): 85, 80, 110, + (36,39,0): 78, 74, 97, + (36,40,0): 75, 71, 88, + (36,41,0): 69, 66, 77, + (36,42,0): 63, 61, 66, + (36,43,0): 59, 55, 56, + (36,44,0): 57, 53, 50, + (36,45,0): 57, 54, 47, + (36,46,0): 56, 53, 44, + (36,47,0): 56, 53, 44, + (36,48,0): 54, 55, 49, + (36,49,0): 55, 56, 51, + (36,50,0): 56, 57, 49, + (36,51,0): 59, 59, 49, + (36,52,0): 62, 60, 47, + (36,53,0): 63, 60, 43, + (36,54,0): 66, 61, 42, + (36,55,0): 67, 60, 41, + (36,56,0): 71, 63, 44, + (36,57,0): 74, 63, 43, + (36,58,0): 75, 64, 44, + (36,59,0): 76, 65, 47, + (36,60,0): 77, 64, 48, + (36,61,0): 77, 63, 50, + (36,62,0): 76, 64, 52, + (36,63,0): 76, 62, 51, + (36,64,0): 77, 63, 52, + (36,65,0): 76, 62, 53, + (36,66,0): 73, 58, 51, + (36,67,0): 67, 56, 50, + (36,68,0): 63, 56, 50, + (36,69,0): 60, 57, 52, + (36,70,0): 56, 59, 52, + (36,71,0): 55, 60, 53, + (36,72,0): 57, 60, 51, + (36,73,0): 64, 57, 49, + (36,74,0): 72, 51, 46, + (36,75,0): 90, 49, 47, + (36,76,0): 119, 55, 56, + (36,77,0): 149, 62, 68, + (36,78,0): 167, 61, 71, + (36,79,0): 169, 56, 60, + (36,80,0): 170, 59, 48, + (36,81,0): 170, 60, 43, + (36,82,0): 171, 64, 46, + (36,83,0): 172, 65, 47, + (36,84,0): 169, 64, 45, + (36,85,0): 165, 60, 41, + (36,86,0): 166, 59, 39, + (36,87,0): 171, 62, 42, + (36,88,0): 167, 56, 36, + (36,89,0): 173, 58, 39, + (36,90,0): 181, 60, 43, + (36,91,0): 188, 61, 46, + (36,92,0): 193, 60, 45, + (36,93,0): 197, 59, 46, + (36,94,0): 202, 60, 48, + (36,95,0): 202, 61, 51, + (36,96,0): 197, 63, 54, + (36,97,0): 190, 62, 51, + (36,98,0): 186, 58, 47, + (36,99,0): 183, 55, 44, + (36,100,0): 183, 55, 44, + (36,101,0): 184, 56, 43, + (36,102,0): 186, 56, 43, + (36,103,0): 186, 56, 43, + (36,104,0): 187, 55, 43, + (36,105,0): 199, 65, 53, + (36,106,0): 205, 67, 56, + (36,107,0): 197, 56, 46, + (36,108,0): 193, 49, 38, + (36,109,0): 198, 51, 41, + (36,110,0): 203, 55, 45, + (36,111,0): 207, 53, 43, + (36,112,0): 219, 52, 43, + (36,113,0): 223, 51, 41, + (36,114,0): 225, 52, 45, + (36,115,0): 226, 54, 44, + (36,116,0): 227, 53, 44, + (36,117,0): 231, 53, 43, + (36,118,0): 236, 49, 42, + (36,119,0): 240, 47, 42, + (36,120,0): 245, 47, 44, + (36,121,0): 246, 47, 42, + (36,122,0): 242, 47, 41, + (36,123,0): 236, 48, 39, + (36,124,0): 226, 50, 35, + (36,125,0): 217, 52, 33, + (36,126,0): 208, 53, 31, + (36,127,0): 207, 52, 30, + (36,128,0): 214, 49, 30, + (36,129,0): 217, 47, 30, + (36,130,0): 216, 50, 34, + (36,131,0): 216, 54, 41, + (36,132,0): 215, 57, 45, + (36,133,0): 212, 58, 48, + (36,134,0): 214, 63, 54, + (36,135,0): 216, 69, 61, + (36,136,0): 214, 70, 62, + (36,137,0): 205, 64, 55, + (36,138,0): 201, 60, 53, + (36,139,0): 203, 64, 57, + (36,140,0): 214, 75, 68, + (36,141,0): 217, 78, 71, + (36,142,0): 210, 69, 62, + (36,143,0): 197, 59, 49, + (36,144,0): 197, 61, 49, + (36,145,0): 194, 60, 48, + (36,146,0): 192, 60, 47, + (36,147,0): 186, 59, 44, + (36,148,0): 183, 57, 42, + (36,149,0): 180, 58, 43, + (36,150,0): 182, 60, 45, + (36,151,0): 185, 63, 48, + (36,152,0): 181, 57, 45, + (36,153,0): 191, 60, 50, + (36,154,0): 201, 64, 58, + (36,155,0): 210, 67, 63, + (36,156,0): 219, 67, 66, + (36,157,0): 227, 68, 72, + (36,158,0): 237, 74, 79, + (36,159,0): 246, 79, 86, + (36,160,0): 236, 63, 69, + (36,161,0): 237, 62, 67, + (36,162,0): 242, 66, 76, + (36,163,0): 251, 73, 85, + (36,164,0): 255, 74, 89, + (36,165,0): 253, 70, 88, + (36,166,0): 250, 67, 89, + (36,167,0): 251, 67, 93, + (36,168,0): 251, 64, 95, + (36,169,0): 251, 66, 100, + (36,170,0): 255, 69, 108, + (36,171,0): 255, 74, 115, + (36,172,0): 255, 78, 122, + (36,173,0): 255, 79, 124, + (36,174,0): 255, 76, 121, + (36,175,0): 255, 72, 118, + (36,176,0): 255, 68, 114, + (36,177,0): 255, 78, 124, + (36,178,0): 255, 80, 122, + (36,179,0): 251, 72, 111, + (36,180,0): 245, 74, 108, + (36,181,0): 253, 86, 116, + (36,182,0): 254, 87, 115, + (36,183,0): 243, 81, 105, + (36,184,0): 231, 71, 95, + (36,185,0): 224, 72, 93, + (36,186,0): 226, 88, 104, + (36,187,0): 255, 147, 158, + (36,188,0): 255, 178, 184, + (36,189,0): 239, 155, 155, + (36,190,0): 140, 72, 69, + (36,191,0): 108, 47, 42, + (36,192,0): 166, 106, 98, + (36,193,0): 206, 149, 142, + (36,194,0): 243, 198, 192, + (36,195,0): 255, 225, 220, + (36,196,0): 255, 240, 239, + (36,197,0): 255, 251, 253, + (36,198,0): 255, 253, 255, + (36,199,0): 251, 246, 253, + (36,200,0): 252, 246, 255, + (36,201,0): 253, 245, 255, + (36,202,0): 255, 245, 255, + (36,203,0): 255, 246, 255, + (36,204,0): 255, 248, 255, + (36,205,0): 255, 250, 254, + (36,206,0): 255, 252, 251, + (36,207,0): 255, 252, 249, + (36,208,0): 255, 251, 247, + (36,209,0): 255, 250, 247, + (36,210,0): 255, 248, 247, + (36,211,0): 255, 247, 246, + (36,212,0): 255, 245, 247, + (36,213,0): 255, 244, 246, + (36,214,0): 255, 243, 247, + (36,215,0): 255, 243, 247, + (36,216,0): 253, 241, 243, + (36,217,0): 243, 233, 234, + (36,218,0): 228, 220, 218, + (36,219,0): 214, 209, 205, + (36,220,0): 205, 202, 195, + (36,221,0): 201, 201, 191, + (36,222,0): 202, 202, 192, + (36,223,0): 202, 205, 194, + (36,224,0): 201, 208, 200, + (36,225,0): 190, 200, 191, + (36,226,0): 182, 192, 183, + (37,0,0): 54, 53, 49, + (37,1,0): 52, 51, 46, + (37,2,0): 51, 50, 46, + (37,3,0): 49, 48, 43, + (37,4,0): 49, 48, 43, + (37,5,0): 50, 49, 44, + (37,6,0): 51, 50, 45, + (37,7,0): 52, 51, 46, + (37,8,0): 54, 54, 46, + (37,9,0): 55, 55, 47, + (37,10,0): 56, 56, 48, + (37,11,0): 58, 58, 50, + (37,12,0): 60, 60, 50, + (37,13,0): 62, 62, 52, + (37,14,0): 64, 64, 54, + (37,15,0): 66, 64, 52, + (37,16,0): 74, 68, 56, + (37,17,0): 77, 69, 56, + (37,18,0): 79, 72, 56, + (37,19,0): 82, 75, 59, + (37,20,0): 84, 75, 58, + (37,21,0): 84, 77, 59, + (37,22,0): 83, 76, 60, + (37,23,0): 82, 75, 65, + (37,24,0): 81, 76, 73, + (37,25,0): 90, 87, 94, + (37,26,0): 108, 105, 124, + (37,27,0): 127, 126, 157, + (37,28,0): 140, 143, 184, + (37,29,0): 150, 153, 204, + (37,30,0): 153, 158, 216, + (37,31,0): 154, 158, 222, + (37,32,0): 153, 152, 218, + (37,33,0): 148, 145, 212, + (37,34,0): 140, 138, 201, + (37,35,0): 134, 133, 191, + (37,36,0): 129, 126, 181, + (37,37,0): 120, 118, 167, + (37,38,0): 110, 107, 150, + (37,39,0): 102, 101, 135, + (37,40,0): 93, 90, 119, + (37,41,0): 86, 84, 105, + (37,42,0): 77, 75, 89, + (37,43,0): 68, 65, 74, + (37,44,0): 62, 60, 63, + (37,45,0): 59, 58, 56, + (37,46,0): 59, 55, 52, + (37,47,0): 55, 54, 50, + (37,48,0): 53, 53, 53, + (37,49,0): 52, 53, 55, + (37,50,0): 54, 54, 52, + (37,51,0): 56, 55, 50, + (37,52,0): 60, 58, 46, + (37,53,0): 63, 60, 43, + (37,54,0): 67, 62, 42, + (37,55,0): 70, 64, 42, + (37,56,0): 71, 63, 42, + (37,57,0): 72, 64, 43, + (37,58,0): 73, 65, 44, + (37,59,0): 73, 66, 48, + (37,60,0): 73, 65, 52, + (37,61,0): 72, 66, 54, + (37,62,0): 72, 65, 57, + (37,63,0): 72, 63, 58, + (37,64,0): 76, 61, 58, + (37,65,0): 76, 58, 58, + (37,66,0): 71, 55, 55, + (37,67,0): 64, 54, 53, + (37,68,0): 58, 54, 53, + (37,69,0): 53, 55, 52, + (37,70,0): 49, 56, 49, + (37,71,0): 47, 57, 48, + (37,72,0): 55, 60, 53, + (37,73,0): 55, 52, 43, + (37,74,0): 67, 48, 41, + (37,75,0): 93, 56, 50, + (37,76,0): 126, 66, 65, + (37,77,0): 149, 71, 71, + (37,78,0): 157, 63, 64, + (37,79,0): 158, 52, 52, + (37,80,0): 167, 59, 47, + (37,81,0): 170, 60, 43, + (37,82,0): 170, 63, 45, + (37,83,0): 170, 63, 45, + (37,84,0): 169, 62, 44, + (37,85,0): 169, 62, 42, + (37,86,0): 172, 63, 43, + (37,87,0): 176, 63, 45, + (37,88,0): 171, 56, 37, + (37,89,0): 178, 57, 40, + (37,90,0): 185, 58, 43, + (37,91,0): 191, 57, 45, + (37,92,0): 195, 57, 44, + (37,93,0): 200, 58, 46, + (37,94,0): 205, 58, 48, + (37,95,0): 207, 60, 52, + (37,96,0): 203, 62, 53, + (37,97,0): 198, 59, 52, + (37,98,0): 194, 57, 49, + (37,99,0): 193, 56, 46, + (37,100,0): 193, 56, 46, + (37,101,0): 194, 57, 47, + (37,102,0): 194, 56, 46, + (37,103,0): 195, 54, 44, + (37,104,0): 197, 55, 45, + (37,105,0): 209, 67, 57, + (37,106,0): 208, 64, 55, + (37,107,0): 195, 48, 38, + (37,108,0): 195, 44, 35, + (37,109,0): 208, 55, 47, + (37,110,0): 214, 60, 52, + (37,111,0): 211, 50, 42, + (37,112,0): 224, 51, 44, + (37,113,0): 228, 50, 40, + (37,114,0): 231, 50, 43, + (37,115,0): 232, 51, 42, + (37,116,0): 234, 51, 43, + (37,117,0): 237, 50, 43, + (37,118,0): 240, 47, 42, + (37,119,0): 243, 45, 42, + (37,120,0): 246, 47, 42, + (37,121,0): 245, 46, 41, + (37,122,0): 241, 48, 41, + (37,123,0): 236, 49, 40, + (37,124,0): 225, 52, 36, + (37,125,0): 218, 53, 34, + (37,126,0): 209, 54, 32, + (37,127,0): 208, 53, 31, + (37,128,0): 216, 55, 35, + (37,129,0): 217, 51, 35, + (37,130,0): 214, 51, 36, + (37,131,0): 213, 51, 38, + (37,132,0): 213, 53, 41, + (37,133,0): 212, 56, 44, + (37,134,0): 212, 60, 49, + (37,135,0): 214, 63, 54, + (37,136,0): 236, 89, 81, + (37,137,0): 225, 82, 74, + (37,138,0): 211, 72, 65, + (37,139,0): 204, 67, 59, + (37,140,0): 202, 69, 60, + (37,141,0): 204, 73, 63, + (37,142,0): 200, 69, 59, + (37,143,0): 192, 62, 49, + (37,144,0): 188, 58, 42, + (37,145,0): 188, 59, 40, + (37,146,0): 188, 58, 42, + (37,147,0): 185, 58, 41, + (37,148,0): 183, 58, 40, + (37,149,0): 184, 58, 43, + (37,150,0): 188, 62, 48, + (37,151,0): 191, 65, 51, + (37,152,0): 193, 65, 54, + (37,153,0): 193, 60, 51, + (37,154,0): 197, 60, 54, + (37,155,0): 207, 65, 61, + (37,156,0): 215, 69, 69, + (37,157,0): 221, 71, 72, + (37,158,0): 228, 73, 77, + (37,159,0): 235, 76, 80, + (37,160,0): 232, 66, 70, + (37,161,0): 234, 64, 67, + (37,162,0): 240, 67, 73, + (37,163,0): 249, 75, 84, + (37,164,0): 254, 78, 89, + (37,165,0): 252, 74, 90, + (37,166,0): 252, 70, 92, + (37,167,0): 252, 70, 95, + (37,168,0): 248, 65, 95, + (37,169,0): 249, 66, 97, + (37,170,0): 253, 69, 105, + (37,171,0): 255, 74, 112, + (37,172,0): 255, 78, 119, + (37,173,0): 255, 79, 122, + (37,174,0): 255, 78, 120, + (37,175,0): 255, 76, 118, + (37,176,0): 254, 77, 119, + (37,177,0): 255, 79, 118, + (37,178,0): 252, 77, 116, + (37,179,0): 250, 79, 115, + (37,180,0): 255, 87, 121, + (37,181,0): 255, 95, 123, + (37,182,0): 252, 85, 111, + (37,183,0): 233, 71, 94, + (37,184,0): 243, 86, 107, + (37,185,0): 231, 83, 99, + (37,186,0): 240, 100, 113, + (37,187,0): 255, 144, 154, + (37,188,0): 254, 137, 145, + (37,189,0): 236, 130, 134, + (37,190,0): 194, 95, 98, + (37,191,0): 165, 77, 76, + (37,192,0): 179, 104, 101, + (37,193,0): 206, 141, 137, + (37,194,0): 240, 187, 183, + (37,195,0): 255, 219, 215, + (37,196,0): 255, 238, 237, + (37,197,0): 255, 247, 247, + (37,198,0): 255, 250, 253, + (37,199,0): 251, 249, 254, + (37,200,0): 253, 250, 255, + (37,201,0): 252, 251, 255, + (37,202,0): 253, 250, 255, + (37,203,0): 255, 250, 255, + (37,204,0): 255, 250, 254, + (37,205,0): 255, 251, 252, + (37,206,0): 253, 252, 250, + (37,207,0): 255, 251, 248, + (37,208,0): 255, 251, 247, + (37,209,0): 255, 251, 248, + (37,210,0): 255, 250, 249, + (37,211,0): 255, 250, 249, + (37,212,0): 255, 247, 249, + (37,213,0): 255, 245, 247, + (37,214,0): 254, 242, 246, + (37,215,0): 252, 240, 242, + (37,216,0): 249, 237, 239, + (37,217,0): 242, 230, 230, + (37,218,0): 231, 221, 219, + (37,219,0): 223, 216, 210, + (37,220,0): 219, 215, 206, + (37,221,0): 221, 219, 207, + (37,222,0): 224, 222, 210, + (37,223,0): 223, 225, 214, + (37,224,0): 221, 228, 220, + (37,225,0): 207, 216, 211, + (37,226,0): 197, 206, 201, + (38,0,0): 60, 57, 52, + (38,1,0): 59, 56, 49, + (38,2,0): 56, 53, 48, + (38,3,0): 53, 50, 43, + (38,4,0): 52, 49, 42, + (38,5,0): 52, 49, 42, + (38,6,0): 53, 50, 43, + (38,7,0): 54, 51, 44, + (38,8,0): 55, 52, 45, + (38,9,0): 56, 53, 46, + (38,10,0): 57, 54, 47, + (38,11,0): 59, 56, 49, + (38,12,0): 61, 58, 49, + (38,13,0): 63, 60, 51, + (38,14,0): 65, 62, 53, + (38,15,0): 67, 63, 52, + (38,16,0): 74, 66, 55, + (38,17,0): 77, 67, 55, + (38,18,0): 80, 71, 56, + (38,19,0): 83, 74, 59, + (38,20,0): 87, 75, 59, + (38,21,0): 85, 76, 61, + (38,22,0): 85, 75, 63, + (38,23,0): 83, 74, 67, + (38,24,0): 83, 74, 75, + (38,25,0): 93, 87, 99, + (38,26,0): 110, 108, 130, + (38,27,0): 130, 130, 166, + (38,28,0): 145, 149, 197, + (38,29,0): 154, 160, 218, + (38,30,0): 159, 166, 234, + (38,31,0): 162, 169, 241, + (38,32,0): 161, 165, 239, + (38,33,0): 158, 160, 235, + (38,34,0): 153, 155, 229, + (38,35,0): 149, 152, 221, + (38,36,0): 148, 149, 214, + (38,37,0): 144, 145, 202, + (38,38,0): 137, 137, 189, + (38,39,0): 130, 131, 177, + (38,40,0): 122, 121, 161, + (38,41,0): 114, 113, 145, + (38,42,0): 102, 99, 126, + (38,43,0): 88, 86, 107, + (38,44,0): 80, 78, 92, + (38,45,0): 73, 71, 82, + (38,46,0): 70, 67, 76, + (38,47,0): 67, 66, 74, + (38,48,0): 63, 63, 75, + (38,49,0): 61, 61, 71, + (38,50,0): 59, 58, 64, + (38,51,0): 59, 57, 58, + (38,52,0): 60, 57, 52, + (38,53,0): 63, 59, 47, + (38,54,0): 67, 61, 45, + (38,55,0): 69, 64, 44, + (38,56,0): 70, 64, 42, + (38,57,0): 70, 65, 43, + (38,58,0): 69, 66, 47, + (38,59,0): 69, 67, 52, + (38,60,0): 67, 67, 55, + (38,61,0): 66, 67, 59, + (38,62,0): 65, 67, 62, + (38,63,0): 65, 65, 65, + (38,64,0): 69, 59, 67, + (38,65,0): 71, 61, 70, + (38,66,0): 71, 64, 72, + (38,67,0): 71, 68, 75, + (38,68,0): 70, 71, 76, + (38,69,0): 67, 72, 75, + (38,70,0): 63, 72, 71, + (38,71,0): 62, 71, 66, + (38,72,0): 67, 72, 65, + (38,73,0): 65, 61, 52, + (38,74,0): 75, 58, 48, + (38,75,0): 102, 70, 59, + (38,76,0): 128, 80, 70, + (38,77,0): 138, 74, 64, + (38,78,0): 140, 63, 53, + (38,79,0): 146, 56, 45, + (38,80,0): 164, 62, 47, + (38,81,0): 169, 62, 44, + (38,82,0): 171, 62, 42, + (38,83,0): 172, 63, 43, + (38,84,0): 173, 64, 44, + (38,85,0): 175, 64, 45, + (38,86,0): 176, 63, 45, + (38,87,0): 177, 60, 42, + (38,88,0): 177, 56, 39, + (38,89,0): 182, 56, 41, + (38,90,0): 189, 57, 42, + (38,91,0): 195, 57, 44, + (38,92,0): 200, 56, 45, + (38,93,0): 204, 56, 46, + (38,94,0): 210, 57, 49, + (38,95,0): 212, 59, 53, + (38,96,0): 207, 58, 52, + (38,97,0): 205, 58, 51, + (38,98,0): 203, 56, 49, + (38,99,0): 203, 56, 49, + (38,100,0): 204, 57, 50, + (38,101,0): 205, 58, 50, + (38,102,0): 204, 55, 48, + (38,103,0): 203, 54, 47, + (38,104,0): 211, 60, 53, + (38,105,0): 213, 62, 53, + (38,106,0): 210, 57, 49, + (38,107,0): 204, 50, 40, + (38,108,0): 206, 52, 42, + (38,109,0): 216, 59, 50, + (38,110,0): 218, 60, 51, + (38,111,0): 215, 51, 42, + (38,112,0): 228, 49, 42, + (38,113,0): 233, 49, 39, + (38,114,0): 236, 49, 42, + (38,115,0): 238, 50, 41, + (38,116,0): 240, 49, 41, + (38,117,0): 242, 47, 41, + (38,118,0): 244, 45, 40, + (38,119,0): 246, 44, 40, + (38,120,0): 247, 45, 41, + (38,121,0): 244, 47, 41, + (38,122,0): 240, 49, 41, + (38,123,0): 233, 51, 40, + (38,124,0): 226, 53, 39, + (38,125,0): 217, 54, 37, + (38,126,0): 210, 55, 33, + (38,127,0): 207, 55, 32, + (38,128,0): 212, 57, 37, + (38,129,0): 213, 56, 37, + (38,130,0): 211, 54, 37, + (38,131,0): 209, 52, 37, + (38,132,0): 210, 52, 40, + (38,133,0): 211, 55, 43, + (38,134,0): 210, 56, 46, + (38,135,0): 208, 55, 47, + (38,136,0): 227, 78, 71, + (38,137,0): 232, 88, 80, + (38,138,0): 231, 90, 83, + (38,139,0): 218, 81, 73, + (38,140,0): 204, 71, 62, + (38,141,0): 196, 68, 57, + (38,142,0): 191, 64, 55, + (38,143,0): 185, 62, 47, + (38,144,0): 185, 60, 42, + (38,145,0): 185, 60, 38, + (38,146,0): 185, 60, 40, + (38,147,0): 185, 58, 39, + (38,148,0): 184, 57, 40, + (38,149,0): 186, 59, 42, + (38,150,0): 192, 62, 48, + (38,151,0): 195, 65, 52, + (38,152,0): 201, 68, 59, + (38,153,0): 198, 64, 55, + (38,154,0): 201, 64, 58, + (38,155,0): 209, 70, 67, + (38,156,0): 213, 73, 72, + (38,157,0): 214, 72, 71, + (38,158,0): 216, 71, 74, + (38,159,0): 223, 73, 75, + (38,160,0): 230, 70, 72, + (38,161,0): 232, 66, 68, + (38,162,0): 237, 68, 73, + (38,163,0): 245, 76, 83, + (38,164,0): 252, 81, 90, + (38,165,0): 251, 79, 93, + (38,166,0): 251, 76, 93, + (38,167,0): 251, 75, 96, + (38,168,0): 246, 68, 94, + (38,169,0): 247, 68, 97, + (38,170,0): 249, 70, 102, + (38,171,0): 253, 73, 108, + (38,172,0): 255, 78, 117, + (38,173,0): 255, 79, 120, + (38,174,0): 255, 79, 120, + (38,175,0): 255, 80, 119, + (38,176,0): 246, 85, 119, + (38,177,0): 242, 84, 117, + (38,178,0): 244, 84, 118, + (38,179,0): 250, 89, 120, + (38,180,0): 255, 93, 123, + (38,181,0): 255, 92, 119, + (38,182,0): 247, 83, 107, + (38,183,0): 236, 74, 95, + (38,184,0): 246, 89, 106, + (38,185,0): 239, 87, 102, + (38,186,0): 227, 79, 93, + (38,187,0): 239, 94, 107, + (38,188,0): 218, 78, 89, + (38,189,0): 223, 86, 96, + (38,190,0): 222, 86, 96, + (38,191,0): 210, 89, 96, + (38,192,0): 191, 99, 100, + (38,193,0): 199, 128, 124, + (38,194,0): 230, 169, 166, + (38,195,0): 255, 208, 207, + (38,196,0): 255, 233, 231, + (38,197,0): 255, 241, 240, + (38,198,0): 255, 246, 247, + (38,199,0): 254, 252, 253, + (38,200,0): 251, 252, 255, + (38,201,0): 249, 253, 255, + (38,202,0): 248, 252, 255, + (38,203,0): 250, 251, 253, + (38,204,0): 250, 250, 252, + (38,205,0): 249, 249, 249, + (38,206,0): 250, 249, 247, + (38,207,0): 252, 248, 245, + (38,208,0): 255, 250, 246, + (38,209,0): 255, 250, 247, + (38,210,0): 255, 251, 250, + (38,211,0): 255, 250, 249, + (38,212,0): 255, 247, 247, + (38,213,0): 254, 242, 242, + (38,214,0): 252, 237, 240, + (38,215,0): 249, 234, 237, + (38,216,0): 240, 225, 228, + (38,217,0): 233, 221, 221, + (38,218,0): 228, 217, 213, + (38,219,0): 226, 217, 210, + (38,220,0): 230, 223, 213, + (38,221,0): 235, 231, 219, + (38,222,0): 241, 237, 225, + (38,223,0): 241, 241, 229, + (38,224,0): 236, 243, 236, + (38,225,0): 220, 231, 227, + (38,226,0): 208, 219, 215, + (39,0,0): 64, 61, 54, + (39,1,0): 61, 58, 51, + (39,2,0): 58, 55, 48, + (39,3,0): 55, 52, 45, + (39,4,0): 53, 50, 43, + (39,5,0): 53, 50, 43, + (39,6,0): 53, 50, 43, + (39,7,0): 54, 51, 44, + (39,8,0): 55, 52, 45, + (39,9,0): 55, 52, 45, + (39,10,0): 57, 54, 47, + (39,11,0): 59, 56, 49, + (39,12,0): 61, 58, 49, + (39,13,0): 63, 60, 51, + (39,14,0): 64, 61, 52, + (39,15,0): 66, 62, 51, + (39,16,0): 74, 66, 55, + (39,17,0): 77, 67, 55, + (39,18,0): 82, 70, 56, + (39,19,0): 86, 74, 58, + (39,20,0): 87, 75, 59, + (39,21,0): 88, 76, 60, + (39,22,0): 87, 75, 63, + (39,23,0): 84, 73, 67, + (39,24,0): 83, 74, 77, + (39,25,0): 94, 88, 102, + (39,26,0): 112, 109, 136, + (39,27,0): 130, 132, 171, + (39,28,0): 145, 151, 203, + (39,29,0): 156, 164, 227, + (39,30,0): 163, 173, 245, + (39,31,0): 167, 176, 253, + (39,32,0): 170, 177, 255, + (39,33,0): 166, 172, 250, + (39,34,0): 161, 167, 243, + (39,35,0): 160, 164, 238, + (39,36,0): 159, 163, 234, + (39,37,0): 157, 161, 225, + (39,38,0): 153, 155, 214, + (39,39,0): 149, 150, 204, + (39,40,0): 146, 146, 196, + (39,41,0): 137, 136, 180, + (39,42,0): 121, 121, 159, + (39,43,0): 106, 105, 139, + (39,44,0): 96, 93, 124, + (39,45,0): 88, 85, 112, + (39,46,0): 82, 80, 104, + (39,47,0): 79, 77, 101, + (39,48,0): 78, 74, 99, + (39,49,0): 75, 71, 94, + (39,50,0): 70, 66, 83, + (39,51,0): 64, 61, 72, + (39,52,0): 63, 58, 62, + (39,53,0): 63, 58, 54, + (39,54,0): 64, 60, 49, + (39,55,0): 65, 62, 47, + (39,56,0): 67, 64, 47, + (39,57,0): 67, 66, 48, + (39,58,0): 66, 67, 51, + (39,59,0): 66, 68, 55, + (39,60,0): 63, 68, 61, + (39,61,0): 62, 68, 64, + (39,62,0): 60, 69, 68, + (39,63,0): 59, 66, 72, + (39,64,0): 65, 67, 82, + (39,65,0): 71, 72, 92, + (39,66,0): 80, 81, 99, + (39,67,0): 89, 91, 106, + (39,68,0): 95, 97, 110, + (39,69,0): 99, 99, 109, + (39,70,0): 99, 98, 104, + (39,71,0): 101, 95, 97, + (39,72,0): 102, 88, 87, + (39,73,0): 95, 74, 69, + (39,74,0): 106, 72, 63, + (39,75,0): 130, 83, 73, + (39,76,0): 146, 88, 76, + (39,77,0): 143, 76, 60, + (39,78,0): 142, 65, 49, + (39,79,0): 150, 63, 46, + (39,80,0): 167, 66, 48, + (39,81,0): 174, 64, 47, + (39,82,0): 174, 65, 45, + (39,83,0): 175, 64, 45, + (39,84,0): 176, 65, 46, + (39,85,0): 180, 65, 47, + (39,86,0): 178, 61, 43, + (39,87,0): 176, 55, 38, + (39,88,0): 181, 55, 40, + (39,89,0): 188, 56, 43, + (39,90,0): 194, 56, 43, + (39,91,0): 200, 56, 45, + (39,92,0): 205, 54, 45, + (39,93,0): 209, 55, 47, + (39,94,0): 213, 56, 49, + (39,95,0): 216, 59, 52, + (39,96,0): 210, 55, 50, + (39,97,0): 208, 55, 50, + (39,98,0): 208, 55, 50, + (39,99,0): 209, 56, 50, + (39,100,0): 212, 57, 52, + (39,101,0): 212, 57, 52, + (39,102,0): 211, 56, 51, + (39,103,0): 211, 54, 47, + (39,104,0): 222, 65, 58, + (39,105,0): 213, 56, 47, + (39,106,0): 209, 51, 42, + (39,107,0): 214, 56, 47, + (39,108,0): 222, 61, 53, + (39,109,0): 222, 61, 53, + (39,110,0): 218, 57, 49, + (39,111,0): 220, 53, 44, + (39,112,0): 231, 50, 41, + (39,113,0): 235, 48, 39, + (39,114,0): 239, 48, 40, + (39,115,0): 241, 48, 41, + (39,116,0): 244, 47, 41, + (39,117,0): 247, 45, 41, + (39,118,0): 247, 44, 40, + (39,119,0): 247, 44, 40, + (39,120,0): 247, 45, 41, + (39,121,0): 244, 47, 41, + (39,122,0): 238, 50, 41, + (39,123,0): 233, 52, 41, + (39,124,0): 225, 53, 39, + (39,125,0): 218, 55, 38, + (39,126,0): 212, 55, 36, + (39,127,0): 207, 56, 35, + (39,128,0): 206, 55, 34, + (39,129,0): 207, 56, 37, + (39,130,0): 206, 55, 36, + (39,131,0): 207, 54, 38, + (39,132,0): 208, 55, 41, + (39,133,0): 210, 57, 43, + (39,134,0): 209, 55, 43, + (39,135,0): 206, 52, 42, + (39,136,0): 203, 52, 43, + (39,137,0): 227, 78, 71, + (39,138,0): 243, 100, 92, + (39,139,0): 235, 96, 89, + (39,140,0): 213, 79, 70, + (39,141,0): 196, 65, 55, + (39,142,0): 186, 59, 50, + (39,143,0): 181, 57, 45, + (39,144,0): 184, 62, 41, + (39,145,0): 184, 62, 39, + (39,146,0): 185, 60, 38, + (39,147,0): 185, 59, 37, + (39,148,0): 186, 57, 38, + (39,149,0): 189, 57, 42, + (39,150,0): 192, 60, 47, + (39,151,0): 196, 62, 50, + (39,152,0): 202, 68, 57, + (39,153,0): 202, 65, 57, + (39,154,0): 206, 69, 63, + (39,155,0): 213, 75, 72, + (39,156,0): 211, 76, 73, + (39,157,0): 206, 71, 68, + (39,158,0): 205, 69, 69, + (39,159,0): 214, 72, 71, + (39,160,0): 227, 73, 73, + (39,161,0): 230, 67, 68, + (39,162,0): 232, 69, 72, + (39,163,0): 242, 77, 83, + (39,164,0): 248, 83, 90, + (39,165,0): 249, 82, 92, + (39,166,0): 247, 79, 94, + (39,167,0): 250, 79, 97, + (39,168,0): 244, 72, 94, + (39,169,0): 245, 71, 96, + (39,170,0): 248, 71, 100, + (39,171,0): 251, 73, 105, + (39,172,0): 255, 78, 114, + (39,173,0): 255, 81, 120, + (39,174,0): 255, 82, 121, + (39,175,0): 255, 84, 122, + (39,176,0): 239, 84, 116, + (39,177,0): 239, 90, 119, + (39,178,0): 249, 96, 126, + (39,179,0): 253, 96, 125, + (39,180,0): 249, 86, 113, + (39,181,0): 242, 78, 103, + (39,182,0): 245, 81, 105, + (39,183,0): 253, 90, 109, + (39,184,0): 251, 93, 108, + (39,185,0): 255, 102, 116, + (39,186,0): 235, 80, 94, + (39,187,0): 243, 88, 102, + (39,188,0): 238, 83, 97, + (39,189,0): 246, 90, 104, + (39,190,0): 237, 79, 94, + (39,191,0): 223, 83, 94, + (39,192,0): 190, 92, 93, + (39,193,0): 188, 114, 111, + (39,194,0): 216, 152, 150, + (39,195,0): 249, 198, 195, + (39,196,0): 255, 226, 225, + (39,197,0): 255, 235, 233, + (39,198,0): 254, 242, 242, + (39,199,0): 255, 255, 253, + (39,200,0): 252, 255, 255, + (39,201,0): 251, 255, 255, + (39,202,0): 248, 255, 255, + (39,203,0): 249, 255, 253, + (39,204,0): 249, 253, 252, + (39,205,0): 250, 252, 249, + (39,206,0): 252, 251, 247, + (39,207,0): 253, 249, 246, + (39,208,0): 253, 248, 244, + (39,209,0): 255, 248, 245, + (39,210,0): 255, 249, 248, + (39,211,0): 255, 249, 248, + (39,212,0): 255, 245, 245, + (39,213,0): 251, 239, 239, + (39,214,0): 247, 232, 235, + (39,215,0): 243, 229, 229, + (39,216,0): 235, 221, 221, + (39,217,0): 232, 218, 217, + (39,218,0): 228, 217, 211, + (39,219,0): 232, 222, 213, + (39,220,0): 240, 232, 221, + (39,221,0): 249, 243, 229, + (39,222,0): 255, 250, 236, + (39,223,0): 254, 254, 242, + (39,224,0): 244, 250, 246, + (39,225,0): 227, 237, 236, + (39,226,0): 214, 224, 223, + (40,0,0): 66, 62, 53, + (40,1,0): 65, 61, 52, + (40,2,0): 64, 60, 51, + (40,3,0): 62, 58, 49, + (40,4,0): 60, 56, 47, + (40,5,0): 58, 54, 45, + (40,6,0): 56, 52, 43, + (40,7,0): 55, 51, 42, + (40,8,0): 54, 50, 41, + (40,9,0): 54, 50, 41, + (40,10,0): 55, 51, 42, + (40,11,0): 56, 52, 43, + (40,12,0): 59, 54, 48, + (40,13,0): 62, 57, 51, + (40,14,0): 65, 60, 54, + (40,15,0): 69, 62, 54, + (40,16,0): 73, 64, 55, + (40,17,0): 77, 67, 55, + (40,18,0): 82, 70, 56, + (40,19,0): 85, 73, 57, + (40,20,0): 87, 74, 58, + (40,21,0): 88, 75, 59, + (40,22,0): 90, 76, 65, + (40,23,0): 91, 78, 72, + (40,24,0): 84, 73, 77, + (40,25,0): 88, 82, 96, + (40,26,0): 103, 100, 129, + (40,27,0): 124, 126, 167, + (40,28,0): 141, 146, 202, + (40,29,0): 151, 160, 227, + (40,30,0): 158, 170, 246, + (40,31,0): 165, 176, 255, + (40,32,0): 170, 179, 255, + (40,33,0): 171, 178, 255, + (40,34,0): 172, 180, 255, + (40,35,0): 172, 178, 252, + (40,36,0): 170, 177, 249, + (40,37,0): 170, 175, 243, + (40,38,0): 168, 172, 236, + (40,39,0): 169, 171, 232, + (40,40,0): 159, 161, 218, + (40,41,0): 153, 154, 210, + (40,42,0): 141, 141, 193, + (40,43,0): 129, 127, 177, + (40,44,0): 116, 114, 161, + (40,45,0): 104, 101, 146, + (40,46,0): 93, 90, 135, + (40,47,0): 88, 82, 126, + (40,48,0): 88, 81, 122, + (40,49,0): 89, 81, 118, + (40,50,0): 86, 79, 110, + (40,51,0): 77, 72, 95, + (40,52,0): 67, 63, 77, + (40,53,0): 63, 58, 64, + (40,54,0): 63, 59, 58, + (40,55,0): 66, 63, 56, + (40,56,0): 62, 62, 52, + (40,57,0): 64, 66, 53, + (40,58,0): 66, 69, 58, + (40,59,0): 63, 68, 61, + (40,60,0): 60, 66, 62, + (40,61,0): 58, 67, 66, + (40,62,0): 62, 70, 72, + (40,63,0): 65, 75, 84, + (40,64,0): 70, 85, 106, + (40,65,0): 85, 101, 126, + (40,66,0): 101, 113, 137, + (40,67,0): 108, 114, 136, + (40,68,0): 119, 117, 139, + (40,69,0): 131, 119, 139, + (40,70,0): 132, 111, 126, + (40,71,0): 128, 95, 106, + (40,72,0): 137, 91, 101, + (40,73,0): 144, 88, 91, + (40,74,0): 157, 87, 87, + (40,75,0): 164, 87, 81, + (40,76,0): 162, 78, 68, + (40,77,0): 154, 65, 51, + (40,78,0): 151, 58, 40, + (40,79,0): 158, 59, 40, + (40,80,0): 167, 60, 42, + (40,81,0): 172, 61, 42, + (40,82,0): 174, 63, 44, + (40,83,0): 177, 64, 46, + (40,84,0): 179, 64, 45, + (40,85,0): 180, 63, 45, + (40,86,0): 182, 61, 44, + (40,87,0): 185, 59, 44, + (40,88,0): 186, 54, 39, + (40,89,0): 190, 54, 40, + (40,90,0): 196, 54, 42, + (40,91,0): 203, 55, 45, + (40,92,0): 209, 55, 45, + (40,93,0): 214, 56, 47, + (40,94,0): 218, 57, 49, + (40,95,0): 218, 56, 51, + (40,96,0): 215, 56, 52, + (40,97,0): 216, 57, 53, + (40,98,0): 217, 58, 54, + (40,99,0): 216, 57, 51, + (40,100,0): 216, 54, 49, + (40,101,0): 216, 54, 49, + (40,102,0): 218, 56, 51, + (40,103,0): 221, 58, 51, + (40,104,0): 230, 67, 60, + (40,105,0): 224, 61, 54, + (40,106,0): 218, 55, 48, + (40,107,0): 227, 64, 55, + (40,108,0): 254, 91, 82, + (40,109,0): 255, 108, 99, + (40,110,0): 255, 93, 84, + (40,111,0): 231, 63, 54, + (40,112,0): 229, 51, 41, + (40,113,0): 237, 50, 41, + (40,114,0): 241, 50, 42, + (40,115,0): 244, 47, 41, + (40,116,0): 244, 42, 38, + (40,117,0): 245, 40, 37, + (40,118,0): 248, 40, 38, + (40,119,0): 248, 43, 40, + (40,120,0): 247, 45, 43, + (40,121,0): 243, 48, 44, + (40,122,0): 237, 50, 43, + (40,123,0): 227, 49, 39, + (40,124,0): 218, 48, 35, + (40,125,0): 212, 49, 34, + (40,126,0): 212, 52, 36, + (40,127,0): 211, 58, 40, + (40,128,0): 204, 59, 38, + (40,129,0): 202, 60, 40, + (40,130,0): 205, 60, 41, + (40,131,0): 207, 60, 42, + (40,132,0): 210, 58, 44, + (40,133,0): 210, 57, 43, + (40,134,0): 210, 56, 44, + (40,135,0): 209, 55, 45, + (40,136,0): 218, 64, 56, + (40,137,0): 207, 56, 49, + (40,138,0): 220, 71, 65, + (40,139,0): 244, 99, 94, + (40,140,0): 229, 88, 81, + (40,141,0): 203, 66, 60, + (40,142,0): 197, 64, 59, + (40,143,0): 183, 52, 42, + (40,144,0): 183, 58, 38, + (40,145,0): 182, 60, 36, + (40,146,0): 185, 60, 38, + (40,147,0): 186, 60, 38, + (40,148,0): 189, 58, 40, + (40,149,0): 191, 58, 43, + (40,150,0): 196, 60, 48, + (40,151,0): 198, 62, 50, + (40,152,0): 199, 62, 52, + (40,153,0): 204, 67, 59, + (40,154,0): 217, 80, 74, + (40,155,0): 223, 88, 82, + (40,156,0): 212, 79, 74, + (40,157,0): 195, 63, 58, + (40,158,0): 192, 63, 58, + (40,159,0): 207, 72, 68, + (40,160,0): 222, 72, 71, + (40,161,0): 226, 71, 69, + (40,162,0): 230, 74, 75, + (40,163,0): 239, 80, 84, + (40,164,0): 241, 82, 87, + (40,165,0): 239, 78, 86, + (40,166,0): 237, 75, 88, + (40,167,0): 241, 76, 92, + (40,168,0): 249, 82, 102, + (40,169,0): 248, 79, 102, + (40,170,0): 247, 75, 101, + (40,171,0): 247, 74, 102, + (40,172,0): 252, 77, 108, + (40,173,0): 255, 81, 115, + (40,174,0): 255, 82, 118, + (40,175,0): 253, 82, 118, + (40,176,0): 245, 88, 119, + (40,177,0): 239, 89, 118, + (40,178,0): 243, 89, 117, + (40,179,0): 251, 92, 120, + (40,180,0): 255, 93, 120, + (40,181,0): 255, 91, 115, + (40,182,0): 254, 88, 110, + (40,183,0): 252, 86, 106, + (40,184,0): 255, 101, 117, + (40,185,0): 247, 89, 103, + (40,186,0): 253, 95, 109, + (40,187,0): 252, 94, 108, + (40,188,0): 234, 73, 88, + (40,189,0): 235, 73, 88, + (40,190,0): 251, 84, 101, + (40,191,0): 233, 88, 101, + (40,192,0): 198, 102, 103, + (40,193,0): 173, 103, 101, + (40,194,0): 203, 142, 139, + (40,195,0): 232, 181, 178, + (40,196,0): 249, 209, 207, + (40,197,0): 255, 234, 231, + (40,198,0): 254, 238, 238, + (40,199,0): 252, 248, 247, + (40,200,0): 246, 250, 249, + (40,201,0): 247, 255, 253, + (40,202,0): 247, 255, 254, + (40,203,0): 246, 255, 252, + (40,204,0): 248, 254, 252, + (40,205,0): 253, 255, 252, + (40,206,0): 253, 252, 248, + (40,207,0): 251, 247, 244, + (40,208,0): 255, 250, 246, + (40,209,0): 255, 250, 246, + (40,210,0): 255, 247, 244, + (40,211,0): 253, 243, 241, + (40,212,0): 255, 244, 244, + (40,213,0): 255, 243, 243, + (40,214,0): 246, 232, 232, + (40,215,0): 231, 217, 217, + (40,216,0): 228, 214, 213, + (40,217,0): 223, 209, 206, + (40,218,0): 225, 214, 208, + (40,219,0): 241, 231, 222, + (40,220,0): 252, 244, 231, + (40,221,0): 253, 247, 231, + (40,222,0): 255, 251, 232, + (40,223,0): 255, 255, 243, + (40,224,0): 249, 254, 248, + (40,225,0): 231, 240, 239, + (40,226,0): 218, 227, 226, + (41,0,0): 67, 63, 54, + (41,1,0): 66, 62, 51, + (41,2,0): 65, 61, 52, + (41,3,0): 63, 59, 50, + (41,4,0): 61, 57, 48, + (41,5,0): 59, 55, 46, + (41,6,0): 58, 54, 45, + (41,7,0): 57, 53, 44, + (41,8,0): 55, 51, 42, + (41,9,0): 55, 51, 42, + (41,10,0): 55, 51, 42, + (41,11,0): 56, 52, 43, + (41,12,0): 58, 53, 47, + (41,13,0): 61, 56, 50, + (41,14,0): 64, 59, 53, + (41,15,0): 68, 61, 53, + (41,16,0): 72, 63, 54, + (41,17,0): 76, 66, 54, + (41,18,0): 81, 69, 55, + (41,19,0): 84, 72, 56, + (41,20,0): 86, 73, 56, + (41,21,0): 87, 74, 57, + (41,22,0): 89, 75, 62, + (41,23,0): 90, 77, 69, + (41,24,0): 85, 74, 78, + (41,25,0): 87, 81, 95, + (41,26,0): 101, 98, 127, + (41,27,0): 121, 123, 164, + (41,28,0): 138, 143, 201, + (41,29,0): 148, 157, 226, + (41,30,0): 155, 166, 245, + (41,31,0): 163, 174, 254, + (41,32,0): 171, 180, 255, + (41,33,0): 172, 181, 255, + (41,34,0): 174, 182, 255, + (41,35,0): 175, 183, 255, + (41,36,0): 176, 183, 255, + (41,37,0): 175, 182, 252, + (41,38,0): 175, 180, 248, + (41,39,0): 175, 178, 245, + (41,40,0): 169, 170, 235, + (41,41,0): 162, 163, 227, + (41,42,0): 152, 152, 216, + (41,43,0): 140, 138, 201, + (41,44,0): 128, 127, 187, + (41,45,0): 117, 113, 174, + (41,46,0): 105, 101, 160, + (41,47,0): 99, 94, 152, + (41,48,0): 96, 87, 142, + (41,49,0): 96, 86, 136, + (41,50,0): 93, 84, 127, + (41,51,0): 86, 80, 116, + (41,52,0): 77, 73, 98, + (41,53,0): 70, 67, 84, + (41,54,0): 66, 65, 73, + (41,55,0): 65, 65, 67, + (41,56,0): 60, 60, 58, + (41,57,0): 65, 66, 61, + (41,58,0): 70, 69, 65, + (41,59,0): 67, 68, 63, + (41,60,0): 65, 63, 64, + (41,61,0): 68, 66, 69, + (41,62,0): 79, 77, 82, + (41,63,0): 88, 86, 99, + (41,64,0): 102, 103, 131, + (41,65,0): 116, 116, 150, + (41,66,0): 130, 125, 157, + (41,67,0): 138, 125, 155, + (41,68,0): 149, 124, 154, + (41,69,0): 160, 124, 150, + (41,70,0): 165, 113, 136, + (41,71,0): 164, 96, 117, + (41,72,0): 172, 89, 107, + (41,73,0): 180, 87, 98, + (41,74,0): 185, 81, 88, + (41,75,0): 181, 73, 71, + (41,76,0): 173, 64, 57, + (41,77,0): 168, 60, 47, + (41,78,0): 168, 61, 41, + (41,79,0): 169, 63, 41, + (41,80,0): 167, 56, 37, + (41,81,0): 168, 55, 37, + (41,82,0): 171, 56, 38, + (41,83,0): 174, 57, 40, + (41,84,0): 176, 56, 39, + (41,85,0): 178, 57, 40, + (41,86,0): 181, 55, 40, + (41,87,0): 184, 54, 40, + (41,88,0): 187, 51, 37, + (41,89,0): 194, 52, 40, + (41,90,0): 202, 55, 45, + (41,91,0): 211, 58, 50, + (41,92,0): 217, 60, 51, + (41,93,0): 222, 61, 53, + (41,94,0): 223, 60, 53, + (41,95,0): 223, 60, 53, + (41,96,0): 225, 62, 57, + (41,97,0): 223, 60, 55, + (41,98,0): 223, 60, 55, + (41,99,0): 225, 62, 57, + (41,100,0): 229, 66, 61, + (41,101,0): 232, 67, 61, + (41,102,0): 231, 66, 60, + (41,103,0): 230, 65, 59, + (41,104,0): 229, 64, 58, + (41,105,0): 230, 66, 57, + (41,106,0): 228, 64, 55, + (41,107,0): 220, 56, 47, + (41,108,0): 213, 49, 40, + (41,109,0): 216, 54, 43, + (41,110,0): 235, 73, 62, + (41,111,0): 255, 91, 79, + (41,112,0): 241, 64, 54, + (41,113,0): 238, 54, 44, + (41,114,0): 234, 43, 35, + (41,115,0): 238, 41, 35, + (41,116,0): 248, 45, 41, + (41,117,0): 255, 47, 45, + (41,118,0): 254, 44, 43, + (41,119,0): 246, 40, 40, + (41,120,0): 250, 48, 46, + (41,121,0): 245, 52, 47, + (41,122,0): 239, 54, 49, + (41,123,0): 231, 54, 46, + (41,124,0): 222, 51, 41, + (41,125,0): 214, 50, 38, + (41,126,0): 212, 50, 37, + (41,127,0): 207, 54, 38, + (41,128,0): 203, 58, 39, + (41,129,0): 200, 59, 39, + (41,130,0): 202, 60, 40, + (41,131,0): 205, 58, 40, + (41,132,0): 207, 57, 42, + (41,133,0): 208, 55, 41, + (41,134,0): 209, 53, 41, + (41,135,0): 208, 52, 40, + (41,136,0): 211, 57, 47, + (41,137,0): 207, 53, 45, + (41,138,0): 212, 61, 54, + (41,139,0): 229, 80, 74, + (41,140,0): 229, 84, 81, + (41,141,0): 219, 76, 72, + (41,142,0): 205, 66, 63, + (41,143,0): 183, 49, 40, + (41,144,0): 188, 59, 40, + (41,145,0): 187, 61, 38, + (41,146,0): 189, 60, 39, + (41,147,0): 190, 59, 39, + (41,148,0): 190, 57, 40, + (41,149,0): 192, 56, 40, + (41,150,0): 194, 58, 44, + (41,151,0): 196, 58, 47, + (41,152,0): 200, 62, 52, + (41,153,0): 203, 66, 56, + (41,154,0): 213, 79, 70, + (41,155,0): 220, 87, 80, + (41,156,0): 210, 82, 73, + (41,157,0): 195, 68, 61, + (41,158,0): 191, 67, 59, + (41,159,0): 204, 72, 67, + (41,160,0): 219, 76, 72, + (41,161,0): 223, 74, 70, + (41,162,0): 229, 77, 76, + (41,163,0): 235, 83, 82, + (41,164,0): 237, 84, 87, + (41,165,0): 235, 80, 86, + (41,166,0): 233, 78, 86, + (41,167,0): 236, 79, 90, + (41,168,0): 247, 86, 102, + (41,169,0): 248, 85, 104, + (41,170,0): 249, 83, 105, + (41,171,0): 250, 82, 107, + (41,172,0): 252, 82, 109, + (41,173,0): 255, 83, 113, + (41,174,0): 255, 83, 116, + (41,175,0): 254, 83, 117, + (41,176,0): 241, 76, 108, + (41,177,0): 245, 84, 115, + (41,178,0): 255, 92, 121, + (41,179,0): 255, 96, 123, + (41,180,0): 255, 91, 117, + (41,181,0): 253, 85, 110, + (41,182,0): 250, 82, 105, + (41,183,0): 249, 84, 101, + (41,184,0): 249, 87, 102, + (41,185,0): 242, 84, 98, + (41,186,0): 249, 93, 104, + (41,187,0): 249, 93, 104, + (41,188,0): 236, 82, 94, + (41,189,0): 241, 87, 99, + (41,190,0): 247, 93, 105, + (41,191,0): 217, 86, 94, + (41,192,0): 182, 96, 95, + (41,193,0): 153, 92, 87, + (41,194,0): 185, 127, 125, + (41,195,0): 218, 169, 165, + (41,196,0): 239, 199, 197, + (41,197,0): 254, 224, 222, + (41,198,0): 251, 233, 233, + (41,199,0): 253, 248, 245, + (41,200,0): 248, 250, 247, + (41,201,0): 247, 255, 253, + (41,202,0): 247, 255, 254, + (41,203,0): 245, 255, 252, + (41,204,0): 248, 254, 252, + (41,205,0): 253, 255, 252, + (41,206,0): 254, 253, 251, + (41,207,0): 252, 248, 245, + (41,208,0): 253, 250, 245, + (41,209,0): 254, 249, 245, + (41,210,0): 252, 247, 243, + (41,211,0): 252, 244, 241, + (41,212,0): 255, 245, 244, + (41,213,0): 255, 244, 244, + (41,214,0): 245, 233, 233, + (41,215,0): 234, 220, 219, + (41,216,0): 229, 215, 212, + (41,217,0): 222, 209, 203, + (41,218,0): 223, 213, 204, + (41,219,0): 239, 229, 219, + (41,220,0): 252, 245, 229, + (41,221,0): 255, 249, 231, + (41,222,0): 255, 252, 232, + (41,223,0): 255, 255, 239, + (41,224,0): 248, 253, 246, + (41,225,0): 232, 241, 238, + (41,226,0): 221, 227, 225, + (42,0,0): 69, 65, 54, + (42,1,0): 69, 65, 53, + (42,2,0): 67, 63, 52, + (42,3,0): 65, 61, 50, + (42,4,0): 63, 59, 48, + (42,5,0): 61, 57, 46, + (42,6,0): 60, 56, 45, + (42,7,0): 59, 55, 44, + (42,8,0): 56, 52, 43, + (42,9,0): 56, 52, 43, + (42,10,0): 55, 51, 42, + (42,11,0): 56, 52, 43, + (42,12,0): 58, 53, 47, + (42,13,0): 61, 56, 50, + (42,14,0): 63, 58, 52, + (42,15,0): 67, 60, 52, + (42,16,0): 71, 62, 53, + (42,17,0): 74, 66, 55, + (42,18,0): 78, 68, 56, + (42,19,0): 82, 70, 54, + (42,20,0): 84, 71, 54, + (42,21,0): 87, 71, 55, + (42,22,0): 89, 73, 60, + (42,23,0): 89, 74, 67, + (42,24,0): 87, 75, 75, + (42,25,0): 88, 80, 93, + (42,26,0): 98, 94, 121, + (42,27,0): 115, 117, 156, + (42,28,0): 133, 138, 194, + (42,29,0): 144, 153, 220, + (42,30,0): 152, 164, 240, + (42,31,0): 160, 171, 250, + (42,32,0): 170, 179, 254, + (42,33,0): 173, 181, 254, + (42,34,0): 175, 183, 255, + (42,35,0): 177, 185, 255, + (42,36,0): 179, 186, 255, + (42,37,0): 180, 187, 255, + (42,38,0): 181, 185, 255, + (42,39,0): 181, 185, 255, + (42,40,0): 175, 178, 249, + (42,41,0): 172, 172, 244, + (42,42,0): 163, 163, 235, + (42,43,0): 153, 151, 224, + (42,44,0): 142, 141, 211, + (42,45,0): 131, 128, 199, + (42,46,0): 120, 117, 188, + (42,47,0): 115, 109, 179, + (42,48,0): 107, 96, 162, + (42,49,0): 105, 93, 155, + (42,50,0): 99, 90, 145, + (42,51,0): 93, 87, 133, + (42,52,0): 86, 82, 119, + (42,53,0): 78, 75, 104, + (42,54,0): 69, 68, 86, + (42,55,0): 64, 64, 76, + (42,56,0): 56, 53, 60, + (42,57,0): 65, 60, 64, + (42,58,0): 75, 65, 66, + (42,59,0): 76, 64, 66, + (42,60,0): 81, 62, 66, + (42,61,0): 90, 69, 74, + (42,62,0): 112, 87, 93, + (42,63,0): 130, 99, 115, + (42,64,0): 152, 115, 149, + (42,65,0): 165, 122, 165, + (42,66,0): 175, 127, 167, + (42,67,0): 178, 123, 162, + (42,68,0): 184, 118, 154, + (42,69,0): 192, 112, 147, + (42,70,0): 194, 99, 131, + (42,71,0): 192, 84, 110, + (42,72,0): 193, 71, 94, + (42,73,0): 207, 76, 92, + (42,74,0): 207, 73, 82, + (42,75,0): 195, 61, 62, + (42,76,0): 183, 54, 48, + (42,77,0): 180, 58, 43, + (42,78,0): 178, 61, 41, + (42,79,0): 173, 61, 39, + (42,80,0): 175, 60, 41, + (42,81,0): 176, 59, 41, + (42,82,0): 178, 58, 41, + (42,83,0): 180, 59, 42, + (42,84,0): 183, 60, 44, + (42,85,0): 187, 60, 45, + (42,86,0): 192, 60, 45, + (42,87,0): 196, 60, 46, + (42,88,0): 196, 54, 42, + (42,89,0): 203, 56, 46, + (42,90,0): 211, 60, 49, + (42,91,0): 217, 63, 53, + (42,92,0): 223, 65, 56, + (42,93,0): 225, 62, 55, + (42,94,0): 224, 60, 51, + (42,95,0): 223, 58, 52, + (42,96,0): 220, 55, 49, + (42,97,0): 217, 52, 46, + (42,98,0): 216, 51, 45, + (42,99,0): 222, 57, 51, + (42,100,0): 230, 65, 59, + (42,101,0): 236, 69, 63, + (42,102,0): 233, 66, 60, + (42,103,0): 228, 61, 53, + (42,104,0): 227, 60, 52, + (42,105,0): 219, 52, 44, + (42,106,0): 216, 52, 43, + (42,107,0): 219, 55, 45, + (42,108,0): 212, 50, 39, + (42,109,0): 204, 44, 32, + (42,110,0): 214, 54, 42, + (42,111,0): 233, 71, 58, + (42,112,0): 245, 75, 62, + (42,113,0): 242, 64, 54, + (42,114,0): 239, 52, 45, + (42,115,0): 240, 45, 41, + (42,116,0): 246, 44, 42, + (42,117,0): 250, 44, 44, + (42,118,0): 252, 44, 44, + (42,119,0): 248, 42, 44, + (42,120,0): 240, 42, 41, + (42,121,0): 236, 47, 43, + (42,122,0): 232, 50, 46, + (42,123,0): 227, 53, 46, + (42,124,0): 220, 52, 43, + (42,125,0): 216, 49, 40, + (42,126,0): 213, 49, 39, + (42,127,0): 209, 51, 39, + (42,128,0): 205, 55, 40, + (42,129,0): 203, 58, 41, + (42,130,0): 205, 58, 40, + (42,131,0): 208, 58, 41, + (42,132,0): 210, 59, 42, + (42,133,0): 211, 58, 42, + (42,134,0): 212, 56, 43, + (42,135,0): 212, 56, 44, + (42,136,0): 209, 52, 43, + (42,137,0): 214, 60, 52, + (42,138,0): 213, 58, 53, + (42,139,0): 213, 60, 55, + (42,140,0): 229, 79, 78, + (42,141,0): 237, 89, 87, + (42,142,0): 217, 69, 69, + (42,143,0): 194, 51, 47, + (42,144,0): 192, 59, 44, + (42,145,0): 191, 60, 40, + (42,146,0): 192, 59, 42, + (42,147,0): 191, 58, 41, + (42,148,0): 193, 57, 41, + (42,149,0): 192, 56, 40, + (42,150,0): 192, 56, 42, + (42,151,0): 192, 56, 44, + (42,152,0): 198, 61, 51, + (42,153,0): 199, 65, 54, + (42,154,0): 207, 74, 65, + (42,155,0): 216, 85, 75, + (42,156,0): 210, 82, 71, + (42,157,0): 198, 71, 62, + (42,158,0): 192, 68, 58, + (42,159,0): 199, 71, 62, + (42,160,0): 214, 75, 68, + (42,161,0): 216, 73, 67, + (42,162,0): 221, 76, 73, + (42,163,0): 228, 83, 80, + (42,164,0): 229, 83, 84, + (42,165,0): 226, 80, 83, + (42,166,0): 226, 77, 83, + (42,167,0): 229, 78, 87, + (42,168,0): 242, 88, 100, + (42,169,0): 246, 90, 104, + (42,170,0): 253, 91, 112, + (42,171,0): 254, 90, 114, + (42,172,0): 252, 86, 110, + (42,173,0): 250, 82, 108, + (42,174,0): 251, 81, 108, + (42,175,0): 255, 81, 112, + (42,176,0): 248, 70, 106, + (42,177,0): 255, 79, 116, + (42,178,0): 255, 89, 123, + (42,179,0): 255, 90, 121, + (42,180,0): 255, 86, 113, + (42,181,0): 252, 84, 107, + (42,182,0): 254, 87, 107, + (42,183,0): 255, 92, 109, + (42,184,0): 250, 89, 104, + (42,185,0): 247, 91, 104, + (42,186,0): 248, 98, 109, + (42,187,0): 242, 98, 107, + (42,188,0): 231, 96, 103, + (42,189,0): 234, 105, 110, + (42,190,0): 229, 106, 109, + (42,191,0): 197, 94, 95, + (42,192,0): 160, 93, 87, + (42,193,0): 126, 77, 70, + (42,194,0): 155, 108, 102, + (42,195,0): 195, 151, 148, + (42,196,0): 223, 185, 182, + (42,197,0): 241, 211, 209, + (42,198,0): 244, 224, 223, + (42,199,0): 255, 245, 244, + (42,200,0): 249, 249, 247, + (42,201,0): 249, 255, 253, + (42,202,0): 247, 255, 255, + (42,203,0): 245, 255, 252, + (42,204,0): 248, 254, 252, + (42,205,0): 253, 255, 254, + (42,206,0): 255, 252, 253, + (42,207,0): 252, 248, 247, + (42,208,0): 252, 249, 244, + (42,209,0): 252, 249, 242, + (42,210,0): 250, 247, 242, + (42,211,0): 251, 246, 242, + (42,212,0): 255, 247, 244, + (42,213,0): 255, 246, 244, + (42,214,0): 249, 238, 236, + (42,215,0): 239, 228, 226, + (42,216,0): 230, 219, 215, + (42,217,0): 220, 209, 203, + (42,218,0): 221, 211, 201, + (42,219,0): 238, 228, 216, + (42,220,0): 253, 246, 228, + (42,221,0): 255, 251, 232, + (42,222,0): 255, 253, 231, + (42,223,0): 255, 255, 236, + (42,224,0): 248, 251, 242, + (42,225,0): 233, 239, 235, + (42,226,0): 224, 229, 225, + (43,0,0): 73, 69, 57, + (43,1,0): 72, 68, 56, + (43,2,0): 70, 66, 54, + (43,3,0): 68, 64, 52, + (43,4,0): 66, 62, 51, + (43,5,0): 64, 60, 49, + (43,6,0): 63, 59, 48, + (43,7,0): 62, 58, 47, + (43,8,0): 58, 54, 45, + (43,9,0): 57, 53, 44, + (43,10,0): 57, 53, 44, + (43,11,0): 57, 53, 44, + (43,12,0): 58, 53, 47, + (43,13,0): 60, 55, 49, + (43,14,0): 62, 57, 51, + (43,15,0): 64, 59, 53, + (43,16,0): 69, 62, 54, + (43,17,0): 73, 64, 55, + (43,18,0): 76, 68, 55, + (43,19,0): 79, 70, 53, + (43,20,0): 82, 69, 52, + (43,21,0): 85, 69, 53, + (43,22,0): 87, 71, 56, + (43,23,0): 87, 73, 62, + (43,24,0): 88, 77, 75, + (43,25,0): 88, 78, 87, + (43,26,0): 94, 90, 113, + (43,27,0): 112, 112, 150, + (43,28,0): 128, 134, 186, + (43,29,0): 140, 150, 212, + (43,30,0): 149, 161, 233, + (43,31,0): 157, 169, 245, + (43,32,0): 168, 176, 249, + (43,33,0): 169, 177, 249, + (43,34,0): 173, 179, 253, + (43,35,0): 176, 183, 255, + (43,36,0): 177, 183, 255, + (43,37,0): 178, 185, 255, + (43,38,0): 180, 184, 255, + (43,39,0): 180, 184, 255, + (43,40,0): 175, 177, 252, + (43,41,0): 171, 173, 248, + (43,42,0): 165, 167, 242, + (43,43,0): 159, 158, 234, + (43,44,0): 151, 150, 226, + (43,45,0): 140, 139, 215, + (43,46,0): 130, 129, 205, + (43,47,0): 125, 121, 197, + (43,48,0): 117, 109, 182, + (43,49,0): 112, 103, 170, + (43,50,0): 102, 96, 158, + (43,51,0): 95, 90, 144, + (43,52,0): 89, 88, 132, + (43,53,0): 81, 81, 117, + (43,54,0): 71, 71, 99, + (43,55,0): 65, 62, 81, + (43,56,0): 61, 53, 68, + (43,57,0): 72, 56, 66, + (43,58,0): 84, 61, 67, + (43,59,0): 96, 64, 69, + (43,60,0): 110, 67, 74, + (43,61,0): 128, 79, 85, + (43,62,0): 150, 93, 100, + (43,63,0): 170, 103, 120, + (43,64,0): 189, 108, 141, + (43,65,0): 201, 110, 153, + (43,66,0): 203, 111, 152, + (43,67,0): 201, 105, 143, + (43,68,0): 198, 97, 131, + (43,69,0): 199, 88, 120, + (43,70,0): 198, 73, 103, + (43,71,0): 196, 59, 85, + (43,72,0): 197, 51, 72, + (43,73,0): 216, 65, 80, + (43,74,0): 223, 69, 79, + (43,75,0): 208, 60, 60, + (43,76,0): 195, 56, 49, + (43,77,0): 194, 64, 50, + (43,78,0): 186, 65, 44, + (43,79,0): 175, 59, 36, + (43,80,0): 173, 54, 34, + (43,81,0): 173, 53, 36, + (43,82,0): 174, 53, 36, + (43,83,0): 179, 53, 38, + (43,84,0): 182, 55, 40, + (43,85,0): 188, 56, 43, + (43,86,0): 195, 59, 45, + (43,87,0): 200, 60, 47, + (43,88,0): 211, 64, 54, + (43,89,0): 215, 64, 55, + (43,90,0): 218, 64, 54, + (43,91,0): 220, 63, 54, + (43,92,0): 222, 61, 53, + (43,93,0): 222, 57, 51, + (43,94,0): 221, 54, 46, + (43,95,0): 219, 52, 44, + (43,96,0): 211, 46, 40, + (43,97,0): 210, 45, 39, + (43,98,0): 211, 46, 40, + (43,99,0): 216, 51, 45, + (43,100,0): 225, 58, 52, + (43,101,0): 227, 60, 52, + (43,102,0): 225, 56, 49, + (43,103,0): 220, 53, 45, + (43,104,0): 220, 53, 45, + (43,105,0): 208, 44, 34, + (43,106,0): 205, 41, 31, + (43,107,0): 217, 55, 44, + (43,108,0): 226, 66, 54, + (43,109,0): 220, 63, 48, + (43,110,0): 208, 52, 37, + (43,111,0): 203, 46, 31, + (43,112,0): 233, 70, 55, + (43,113,0): 243, 73, 60, + (43,114,0): 253, 72, 63, + (43,115,0): 252, 60, 55, + (43,116,0): 244, 45, 42, + (43,117,0): 241, 35, 37, + (43,118,0): 245, 39, 41, + (43,119,0): 251, 47, 50, + (43,120,0): 241, 45, 46, + (43,121,0): 235, 47, 46, + (43,122,0): 228, 50, 46, + (43,123,0): 222, 51, 44, + (43,124,0): 218, 49, 42, + (43,125,0): 215, 48, 42, + (43,126,0): 214, 47, 41, + (43,127,0): 211, 48, 39, + (43,128,0): 211, 55, 42, + (43,129,0): 210, 57, 43, + (43,130,0): 214, 58, 43, + (43,131,0): 216, 60, 45, + (43,132,0): 218, 62, 47, + (43,133,0): 219, 63, 48, + (43,134,0): 220, 64, 51, + (43,135,0): 220, 64, 51, + (43,136,0): 210, 54, 42, + (43,137,0): 230, 76, 66, + (43,138,0): 229, 74, 69, + (43,139,0): 206, 53, 48, + (43,140,0): 223, 71, 70, + (43,141,0): 243, 90, 92, + (43,142,0): 223, 73, 75, + (43,143,0): 213, 65, 63, + (43,144,0): 200, 60, 47, + (43,145,0): 196, 59, 43, + (43,146,0): 195, 58, 42, + (43,147,0): 195, 58, 42, + (43,148,0): 194, 58, 42, + (43,149,0): 194, 58, 42, + (43,150,0): 193, 57, 43, + (43,151,0): 190, 57, 42, + (43,152,0): 194, 60, 48, + (43,153,0): 194, 62, 50, + (43,154,0): 200, 70, 57, + (43,155,0): 207, 79, 66, + (43,156,0): 206, 80, 68, + (43,157,0): 198, 72, 60, + (43,158,0): 191, 67, 55, + (43,159,0): 193, 67, 55, + (43,160,0): 206, 72, 63, + (43,161,0): 209, 70, 63, + (43,162,0): 213, 74, 69, + (43,163,0): 219, 80, 75, + (43,164,0): 221, 82, 79, + (43,165,0): 217, 77, 76, + (43,166,0): 218, 75, 77, + (43,167,0): 220, 75, 80, + (43,168,0): 235, 88, 96, + (43,169,0): 243, 91, 103, + (43,170,0): 252, 97, 113, + (43,171,0): 255, 97, 117, + (43,172,0): 250, 88, 109, + (43,173,0): 245, 79, 103, + (43,174,0): 245, 77, 103, + (43,175,0): 253, 78, 107, + (43,176,0): 255, 76, 112, + (43,177,0): 255, 79, 116, + (43,178,0): 255, 83, 115, + (43,179,0): 255, 82, 110, + (43,180,0): 250, 84, 108, + (43,181,0): 252, 90, 111, + (43,182,0): 255, 99, 117, + (43,183,0): 255, 105, 120, + (43,184,0): 255, 102, 117, + (43,185,0): 250, 98, 111, + (43,186,0): 244, 98, 109, + (43,187,0): 236, 101, 108, + (43,188,0): 224, 103, 108, + (43,189,0): 212, 106, 106, + (43,190,0): 200, 106, 104, + (43,191,0): 177, 104, 97, + (43,192,0): 141, 94, 84, + (43,193,0): 104, 70, 60, + (43,194,0): 130, 93, 85, + (43,195,0): 172, 135, 129, + (43,196,0): 206, 171, 169, + (43,197,0): 229, 199, 197, + (43,198,0): 239, 218, 217, + (43,199,0): 255, 243, 243, + (43,200,0): 251, 247, 246, + (43,201,0): 249, 253, 252, + (43,202,0): 248, 255, 255, + (43,203,0): 245, 255, 254, + (43,204,0): 248, 254, 254, + (43,205,0): 255, 255, 255, + (43,206,0): 255, 251, 255, + (43,207,0): 254, 248, 248, + (43,208,0): 251, 250, 245, + (43,209,0): 250, 250, 242, + (43,210,0): 249, 248, 243, + (43,211,0): 253, 250, 245, + (43,212,0): 255, 251, 247, + (43,213,0): 255, 250, 247, + (43,214,0): 253, 243, 241, + (43,215,0): 247, 236, 232, + (43,216,0): 235, 224, 218, + (43,217,0): 223, 213, 204, + (43,218,0): 222, 212, 202, + (43,219,0): 237, 230, 214, + (43,220,0): 254, 247, 228, + (43,221,0): 255, 254, 232, + (43,222,0): 255, 254, 229, + (43,223,0): 255, 254, 233, + (43,224,0): 247, 249, 238, + (43,225,0): 234, 239, 232, + (43,226,0): 228, 231, 224, + (44,0,0): 78, 72, 58, + (44,1,0): 77, 71, 57, + (44,2,0): 76, 70, 56, + (44,3,0): 74, 68, 54, + (44,4,0): 72, 66, 54, + (44,5,0): 70, 64, 52, + (44,6,0): 68, 61, 51, + (44,7,0): 67, 60, 50, + (44,8,0): 63, 56, 48, + (44,9,0): 62, 55, 47, + (44,10,0): 61, 54, 46, + (44,11,0): 61, 54, 46, + (44,12,0): 61, 54, 48, + (44,13,0): 62, 55, 49, + (44,14,0): 64, 57, 51, + (44,15,0): 63, 58, 52, + (44,16,0): 67, 62, 56, + (44,17,0): 69, 65, 56, + (44,18,0): 75, 67, 56, + (44,19,0): 78, 69, 54, + (44,20,0): 81, 68, 51, + (44,21,0): 82, 69, 50, + (44,22,0): 86, 70, 54, + (44,23,0): 86, 72, 59, + (44,24,0): 90, 77, 71, + (44,25,0): 86, 77, 82, + (44,26,0): 91, 87, 104, + (44,27,0): 108, 107, 139, + (44,28,0): 126, 130, 177, + (44,29,0): 138, 147, 206, + (44,30,0): 146, 159, 227, + (44,31,0): 154, 166, 238, + (44,32,0): 166, 174, 247, + (44,33,0): 169, 175, 249, + (44,34,0): 173, 176, 253, + (44,35,0): 175, 179, 253, + (44,36,0): 176, 179, 255, + (44,37,0): 176, 180, 254, + (44,38,0): 176, 179, 255, + (44,39,0): 175, 179, 253, + (44,40,0): 171, 174, 251, + (44,41,0): 168, 171, 248, + (44,42,0): 164, 167, 244, + (44,43,0): 160, 162, 239, + (44,44,0): 154, 156, 233, + (44,45,0): 147, 149, 226, + (44,46,0): 138, 140, 217, + (44,47,0): 134, 133, 209, + (44,48,0): 131, 127, 201, + (44,49,0): 123, 117, 187, + (44,50,0): 109, 107, 172, + (44,51,0): 100, 101, 158, + (44,52,0): 95, 97, 146, + (44,53,0): 89, 91, 132, + (44,54,0): 82, 81, 115, + (44,55,0): 78, 72, 98, + (44,56,0): 87, 70, 89, + (44,57,0): 95, 67, 81, + (44,58,0): 109, 66, 76, + (44,59,0): 129, 69, 77, + (44,60,0): 152, 77, 84, + (44,61,0): 172, 85, 93, + (44,62,0): 188, 91, 98, + (44,63,0): 202, 90, 104, + (44,64,0): 214, 84, 112, + (44,65,0): 223, 83, 118, + (44,66,0): 222, 84, 117, + (44,67,0): 215, 80, 110, + (44,68,0): 208, 74, 99, + (44,69,0): 203, 67, 89, + (44,70,0): 198, 57, 74, + (44,71,0): 194, 47, 63, + (44,72,0): 211, 57, 69, + (44,73,0): 225, 68, 77, + (44,74,0): 228, 72, 75, + (44,75,0): 215, 63, 60, + (44,76,0): 205, 62, 54, + (44,77,0): 203, 71, 58, + (44,78,0): 194, 73, 52, + (44,79,0): 182, 63, 41, + (44,80,0): 183, 62, 43, + (44,81,0): 184, 61, 45, + (44,82,0): 186, 60, 45, + (44,83,0): 189, 62, 47, + (44,84,0): 195, 63, 48, + (44,85,0): 202, 66, 52, + (44,86,0): 208, 68, 55, + (44,87,0): 213, 69, 58, + (44,88,0): 217, 69, 57, + (44,89,0): 218, 66, 55, + (44,90,0): 219, 62, 53, + (44,91,0): 217, 59, 50, + (44,92,0): 217, 54, 45, + (44,93,0): 217, 53, 44, + (44,94,0): 218, 51, 43, + (44,95,0): 215, 51, 42, + (44,96,0): 212, 49, 42, + (44,97,0): 215, 52, 45, + (44,98,0): 218, 55, 46, + (44,99,0): 221, 57, 48, + (44,100,0): 223, 56, 48, + (44,101,0): 222, 55, 47, + (44,102,0): 221, 54, 46, + (44,103,0): 220, 53, 44, + (44,104,0): 214, 47, 38, + (44,105,0): 217, 53, 43, + (44,106,0): 215, 55, 43, + (44,107,0): 207, 50, 35, + (44,108,0): 205, 49, 34, + (44,109,0): 210, 57, 41, + (44,110,0): 213, 62, 45, + (44,111,0): 212, 59, 41, + (44,112,0): 216, 60, 45, + (44,113,0): 230, 68, 55, + (44,114,0): 248, 74, 65, + (44,115,0): 253, 68, 63, + (44,116,0): 249, 54, 52, + (44,117,0): 245, 42, 45, + (44,118,0): 246, 42, 45, + (44,119,0): 247, 47, 50, + (44,120,0): 247, 54, 55, + (44,121,0): 237, 53, 53, + (44,122,0): 226, 51, 48, + (44,123,0): 218, 49, 44, + (44,124,0): 215, 48, 42, + (44,125,0): 215, 47, 44, + (44,126,0): 217, 48, 45, + (44,127,0): 217, 48, 43, + (44,128,0): 227, 56, 49, + (44,129,0): 228, 57, 49, + (44,130,0): 226, 58, 49, + (44,131,0): 226, 59, 50, + (44,132,0): 224, 60, 48, + (44,133,0): 223, 61, 48, + (44,134,0): 220, 63, 48, + (44,135,0): 218, 62, 49, + (44,136,0): 209, 55, 43, + (44,137,0): 239, 87, 76, + (44,138,0): 248, 97, 90, + (44,139,0): 211, 59, 54, + (44,140,0): 209, 59, 58, + (44,141,0): 230, 80, 81, + (44,142,0): 220, 70, 72, + (44,143,0): 230, 80, 81, + (44,144,0): 207, 60, 52, + (44,145,0): 202, 58, 47, + (44,146,0): 198, 56, 44, + (44,147,0): 197, 57, 44, + (44,148,0): 196, 58, 45, + (44,149,0): 196, 60, 46, + (44,150,0): 195, 59, 45, + (44,151,0): 192, 59, 44, + (44,152,0): 190, 58, 45, + (44,153,0): 190, 60, 46, + (44,154,0): 195, 65, 51, + (44,155,0): 199, 72, 57, + (44,156,0): 199, 73, 59, + (44,157,0): 194, 68, 54, + (44,158,0): 190, 64, 50, + (44,159,0): 188, 62, 48, + (44,160,0): 201, 70, 60, + (44,161,0): 202, 69, 60, + (44,162,0): 206, 73, 66, + (44,163,0): 213, 80, 73, + (44,164,0): 215, 82, 77, + (44,165,0): 213, 78, 75, + (44,166,0): 211, 75, 75, + (44,167,0): 215, 76, 79, + (44,168,0): 233, 90, 96, + (44,169,0): 240, 94, 104, + (44,170,0): 252, 102, 114, + (44,171,0): 255, 104, 120, + (44,172,0): 252, 93, 113, + (44,173,0): 242, 80, 101, + (44,174,0): 243, 77, 101, + (44,175,0): 252, 79, 107, + (44,176,0): 255, 83, 117, + (44,177,0): 255, 82, 116, + (44,178,0): 254, 81, 111, + (44,179,0): 244, 82, 106, + (44,180,0): 243, 92, 111, + (44,181,0): 250, 103, 119, + (44,182,0): 253, 105, 119, + (44,183,0): 249, 101, 115, + (44,184,0): 253, 101, 116, + (44,185,0): 245, 94, 109, + (44,186,0): 239, 94, 107, + (44,187,0): 236, 106, 114, + (44,188,0): 221, 115, 117, + (44,189,0): 192, 107, 102, + (44,190,0): 168, 101, 92, + (44,191,0): 156, 110, 97, + (44,192,0): 127, 101, 86, + (44,193,0): 89, 71, 57, + (44,194,0): 110, 86, 74, + (44,195,0): 150, 123, 114, + (44,196,0): 190, 159, 156, + (44,197,0): 223, 193, 193, + (44,198,0): 238, 214, 214, + (44,199,0): 254, 238, 239, + (44,200,0): 254, 245, 246, + (44,201,0): 252, 252, 252, + (44,202,0): 249, 255, 255, + (44,203,0): 246, 255, 254, + (44,204,0): 249, 253, 254, + (44,205,0): 255, 255, 255, + (44,206,0): 255, 251, 255, + (44,207,0): 254, 248, 250, + (44,208,0): 253, 254, 248, + (44,209,0): 250, 253, 244, + (44,210,0): 250, 251, 245, + (44,211,0): 254, 253, 248, + (44,212,0): 255, 255, 250, + (44,213,0): 255, 253, 249, + (44,214,0): 255, 250, 244, + (44,215,0): 255, 246, 241, + (44,216,0): 242, 233, 226, + (44,217,0): 229, 221, 210, + (44,218,0): 225, 217, 204, + (44,219,0): 240, 233, 215, + (44,220,0): 255, 250, 228, + (44,221,0): 255, 255, 230, + (44,222,0): 255, 254, 229, + (44,223,0): 255, 254, 233, + (44,224,0): 246, 248, 234, + (44,225,0): 237, 240, 231, + (44,226,0): 232, 233, 225, + (45,0,0): 81, 75, 61, + (45,1,0): 80, 74, 60, + (45,2,0): 79, 73, 59, + (45,3,0): 77, 71, 57, + (45,4,0): 75, 69, 57, + (45,5,0): 73, 67, 55, + (45,6,0): 71, 64, 54, + (45,7,0): 71, 64, 54, + (45,8,0): 66, 59, 51, + (45,9,0): 65, 58, 50, + (45,10,0): 64, 57, 49, + (45,11,0): 63, 56, 48, + (45,12,0): 63, 56, 50, + (45,13,0): 63, 56, 50, + (45,14,0): 65, 58, 52, + (45,15,0): 64, 59, 53, + (45,16,0): 66, 63, 56, + (45,17,0): 69, 66, 57, + (45,18,0): 75, 69, 57, + (45,19,0): 77, 70, 54, + (45,20,0): 80, 69, 51, + (45,21,0): 82, 69, 50, + (45,22,0): 85, 70, 51, + (45,23,0): 85, 72, 55, + (45,24,0): 89, 76, 67, + (45,25,0): 85, 75, 76, + (45,26,0): 90, 83, 99, + (45,27,0): 105, 105, 133, + (45,28,0): 124, 129, 171, + (45,29,0): 137, 147, 200, + (45,30,0): 147, 158, 222, + (45,31,0): 154, 164, 235, + (45,32,0): 166, 172, 248, + (45,33,0): 169, 172, 251, + (45,34,0): 172, 173, 253, + (45,35,0): 173, 176, 255, + (45,36,0): 174, 177, 255, + (45,37,0): 174, 177, 254, + (45,38,0): 173, 176, 253, + (45,39,0): 173, 176, 253, + (45,40,0): 169, 172, 249, + (45,41,0): 167, 170, 247, + (45,42,0): 164, 168, 242, + (45,43,0): 162, 166, 240, + (45,44,0): 159, 163, 237, + (45,45,0): 154, 158, 232, + (45,46,0): 149, 153, 227, + (45,47,0): 146, 148, 222, + (45,48,0): 146, 146, 218, + (45,49,0): 137, 138, 205, + (45,50,0): 124, 128, 192, + (45,51,0): 115, 120, 178, + (45,52,0): 111, 117, 169, + (45,53,0): 109, 112, 157, + (45,54,0): 105, 103, 142, + (45,55,0): 106, 95, 125, + (45,56,0): 121, 95, 120, + (45,57,0): 130, 87, 106, + (45,58,0): 142, 80, 95, + (45,59,0): 163, 79, 92, + (45,60,0): 187, 83, 92, + (45,61,0): 205, 84, 93, + (45,62,0): 214, 80, 87, + (45,63,0): 218, 72, 83, + (45,64,0): 224, 65, 83, + (45,65,0): 228, 65, 84, + (45,66,0): 224, 69, 85, + (45,67,0): 217, 69, 81, + (45,68,0): 210, 69, 77, + (45,69,0): 204, 65, 70, + (45,70,0): 199, 59, 60, + (45,71,0): 198, 54, 54, + (45,72,0): 227, 74, 76, + (45,73,0): 229, 73, 74, + (45,74,0): 224, 66, 65, + (45,75,0): 211, 56, 52, + (45,76,0): 206, 57, 50, + (45,77,0): 206, 65, 55, + (45,78,0): 200, 68, 53, + (45,79,0): 190, 63, 46, + (45,80,0): 195, 69, 54, + (45,81,0): 195, 69, 54, + (45,82,0): 197, 70, 55, + (45,83,0): 201, 69, 56, + (45,84,0): 206, 70, 56, + (45,85,0): 209, 71, 58, + (45,86,0): 215, 71, 60, + (45,87,0): 218, 71, 61, + (45,88,0): 214, 62, 51, + (45,89,0): 213, 59, 49, + (45,90,0): 214, 56, 47, + (45,91,0): 213, 52, 44, + (45,92,0): 214, 51, 42, + (45,93,0): 216, 52, 43, + (45,94,0): 219, 52, 44, + (45,95,0): 218, 54, 45, + (45,96,0): 219, 56, 49, + (45,97,0): 221, 60, 52, + (45,98,0): 224, 61, 52, + (45,99,0): 223, 60, 51, + (45,100,0): 221, 57, 48, + (45,101,0): 220, 53, 45, + (45,102,0): 220, 53, 44, + (45,103,0): 219, 55, 45, + (45,104,0): 210, 46, 36, + (45,105,0): 221, 59, 48, + (45,106,0): 218, 61, 46, + (45,107,0): 205, 49, 34, + (45,108,0): 198, 45, 29, + (45,109,0): 206, 55, 38, + (45,110,0): 210, 61, 41, + (45,111,0): 205, 58, 38, + (45,112,0): 204, 57, 39, + (45,113,0): 212, 56, 41, + (45,114,0): 226, 58, 47, + (45,115,0): 243, 61, 57, + (45,116,0): 255, 64, 64, + (45,117,0): 255, 60, 62, + (45,118,0): 254, 51, 55, + (45,119,0): 243, 44, 47, + (45,120,0): 234, 44, 46, + (45,121,0): 225, 43, 42, + (45,122,0): 216, 42, 41, + (45,123,0): 212, 43, 40, + (45,124,0): 215, 47, 44, + (45,125,0): 222, 52, 52, + (45,126,0): 228, 56, 56, + (45,127,0): 233, 57, 57, + (45,128,0): 239, 55, 53, + (45,129,0): 240, 55, 52, + (45,130,0): 238, 55, 51, + (45,131,0): 232, 55, 49, + (45,132,0): 227, 55, 45, + (45,133,0): 220, 54, 42, + (45,134,0): 215, 53, 40, + (45,135,0): 209, 53, 38, + (45,136,0): 205, 53, 40, + (45,137,0): 231, 80, 69, + (45,138,0): 255, 109, 99, + (45,139,0): 219, 72, 65, + (45,140,0): 200, 52, 50, + (45,141,0): 215, 67, 67, + (45,142,0): 211, 62, 66, + (45,143,0): 234, 86, 86, + (45,144,0): 217, 65, 60, + (45,145,0): 210, 62, 52, + (45,146,0): 203, 56, 46, + (45,147,0): 198, 54, 43, + (45,148,0): 198, 58, 45, + (45,149,0): 198, 60, 47, + (45,150,0): 195, 62, 47, + (45,151,0): 193, 61, 46, + (45,152,0): 187, 57, 43, + (45,153,0): 187, 60, 45, + (45,154,0): 190, 63, 48, + (45,155,0): 192, 65, 50, + (45,156,0): 191, 65, 50, + (45,157,0): 189, 64, 46, + (45,158,0): 188, 61, 46, + (45,159,0): 187, 60, 45, + (45,160,0): 195, 67, 54, + (45,161,0): 196, 68, 57, + (45,162,0): 200, 72, 63, + (45,163,0): 208, 80, 71, + (45,164,0): 211, 82, 76, + (45,165,0): 208, 79, 73, + (45,166,0): 210, 78, 76, + (45,167,0): 213, 79, 78, + (45,168,0): 233, 94, 99, + (45,169,0): 238, 97, 103, + (45,170,0): 251, 105, 116, + (45,171,0): 255, 110, 122, + (45,172,0): 255, 100, 117, + (45,173,0): 245, 86, 106, + (45,174,0): 245, 81, 105, + (45,175,0): 254, 86, 111, + (45,176,0): 255, 86, 115, + (45,177,0): 255, 86, 113, + (45,178,0): 245, 87, 110, + (45,179,0): 238, 93, 110, + (45,180,0): 241, 109, 120, + (45,181,0): 247, 117, 127, + (45,182,0): 240, 106, 115, + (45,183,0): 227, 87, 98, + (45,184,0): 243, 95, 109, + (45,185,0): 245, 94, 109, + (45,186,0): 241, 96, 111, + (45,187,0): 241, 114, 125, + (45,188,0): 238, 135, 138, + (45,189,0): 206, 128, 124, + (45,190,0): 169, 117, 104, + (45,191,0): 151, 122, 106, + (45,192,0): 117, 106, 88, + (45,193,0): 82, 77, 58, + (45,194,0): 97, 85, 71, + (45,195,0): 132, 112, 103, + (45,196,0): 177, 149, 146, + (45,197,0): 221, 191, 191, + (45,198,0): 239, 213, 216, + (45,199,0): 253, 233, 235, + (45,200,0): 254, 244, 245, + (45,201,0): 252, 250, 251, + (45,202,0): 250, 254, 255, + (45,203,0): 248, 254, 254, + (45,204,0): 252, 253, 255, + (45,205,0): 255, 254, 255, + (45,206,0): 255, 250, 255, + (45,207,0): 255, 249, 253, + (45,208,0): 255, 255, 251, + (45,209,0): 248, 254, 244, + (45,210,0): 250, 253, 246, + (45,211,0): 255, 255, 250, + (45,212,0): 255, 255, 250, + (45,213,0): 255, 255, 248, + (45,214,0): 255, 252, 246, + (45,215,0): 255, 253, 245, + (45,216,0): 250, 241, 232, + (45,217,0): 238, 230, 219, + (45,218,0): 234, 226, 213, + (45,219,0): 245, 240, 221, + (45,220,0): 255, 251, 229, + (45,221,0): 255, 254, 229, + (45,222,0): 255, 254, 226, + (45,223,0): 255, 255, 231, + (45,224,0): 249, 250, 234, + (45,225,0): 242, 244, 231, + (45,226,0): 238, 240, 229, + (46,0,0): 83, 77, 61, + (46,1,0): 82, 76, 60, + (46,2,0): 81, 75, 61, + (46,3,0): 79, 73, 59, + (46,4,0): 77, 71, 57, + (46,5,0): 75, 69, 55, + (46,6,0): 74, 68, 56, + (46,7,0): 73, 67, 55, + (46,8,0): 69, 62, 52, + (46,9,0): 68, 61, 51, + (46,10,0): 66, 59, 51, + (46,11,0): 65, 58, 50, + (46,12,0): 64, 57, 51, + (46,13,0): 65, 58, 52, + (46,14,0): 65, 57, 54, + (46,15,0): 64, 59, 55, + (46,16,0): 65, 64, 59, + (46,17,0): 67, 67, 59, + (46,18,0): 73, 69, 57, + (46,19,0): 77, 71, 55, + (46,20,0): 79, 71, 50, + (46,21,0): 82, 70, 48, + (46,22,0): 85, 70, 49, + (46,23,0): 85, 72, 53, + (46,24,0): 87, 75, 63, + (46,25,0): 82, 72, 70, + (46,26,0): 88, 82, 94, + (46,27,0): 106, 103, 130, + (46,28,0): 125, 129, 167, + (46,29,0): 137, 147, 196, + (46,30,0): 146, 158, 218, + (46,31,0): 152, 162, 231, + (46,32,0): 164, 167, 246, + (46,33,0): 166, 167, 250, + (46,34,0): 171, 169, 252, + (46,35,0): 171, 172, 254, + (46,36,0): 172, 173, 255, + (46,37,0): 173, 174, 254, + (46,38,0): 172, 174, 251, + (46,39,0): 172, 174, 251, + (46,40,0): 168, 172, 246, + (46,41,0): 166, 170, 244, + (46,42,0): 164, 168, 241, + (46,43,0): 163, 167, 240, + (46,44,0): 161, 168, 238, + (46,45,0): 160, 167, 237, + (46,46,0): 157, 164, 232, + (46,47,0): 155, 162, 230, + (46,48,0): 153, 158, 226, + (46,49,0): 146, 154, 219, + (46,50,0): 139, 147, 210, + (46,51,0): 134, 143, 202, + (46,52,0): 131, 141, 194, + (46,53,0): 132, 136, 183, + (46,54,0): 131, 129, 168, + (46,55,0): 136, 121, 154, + (46,56,0): 143, 109, 136, + (46,57,0): 154, 99, 122, + (46,58,0): 169, 88, 105, + (46,59,0): 187, 81, 95, + (46,60,0): 207, 77, 89, + (46,61,0): 224, 73, 82, + (46,62,0): 232, 65, 73, + (46,63,0): 232, 62, 65, + (46,64,0): 228, 62, 62, + (46,65,0): 222, 65, 60, + (46,66,0): 216, 69, 61, + (46,67,0): 210, 74, 60, + (46,68,0): 202, 75, 60, + (46,69,0): 194, 71, 53, + (46,70,0): 191, 68, 50, + (46,71,0): 195, 65, 49, + (46,72,0): 226, 86, 73, + (46,73,0): 223, 72, 63, + (46,74,0): 217, 60, 55, + (46,75,0): 216, 54, 51, + (46,76,0): 218, 56, 53, + (46,77,0): 216, 59, 54, + (46,78,0): 210, 57, 52, + (46,79,0): 200, 56, 48, + (46,80,0): 192, 58, 46, + (46,81,0): 190, 60, 46, + (46,82,0): 191, 59, 46, + (46,83,0): 192, 58, 46, + (46,84,0): 194, 56, 43, + (46,85,0): 195, 55, 42, + (46,86,0): 198, 52, 39, + (46,87,0): 198, 50, 38, + (46,88,0): 206, 52, 42, + (46,89,0): 208, 51, 42, + (46,90,0): 209, 51, 40, + (46,91,0): 212, 51, 41, + (46,92,0): 214, 51, 42, + (46,93,0): 217, 53, 44, + (46,94,0): 221, 54, 46, + (46,95,0): 220, 56, 47, + (46,96,0): 222, 61, 51, + (46,97,0): 219, 61, 50, + (46,98,0): 220, 59, 49, + (46,99,0): 219, 56, 47, + (46,100,0): 219, 55, 45, + (46,101,0): 218, 54, 44, + (46,102,0): 216, 52, 42, + (46,103,0): 215, 51, 41, + (46,104,0): 213, 51, 38, + (46,105,0): 211, 51, 37, + (46,106,0): 208, 52, 37, + (46,107,0): 207, 54, 38, + (46,108,0): 210, 61, 41, + (46,109,0): 209, 62, 42, + (46,110,0): 202, 57, 36, + (46,111,0): 192, 50, 28, + (46,112,0): 200, 58, 38, + (46,113,0): 202, 52, 37, + (46,114,0): 213, 49, 39, + (46,115,0): 231, 53, 49, + (46,116,0): 250, 60, 60, + (46,117,0): 255, 61, 64, + (46,118,0): 255, 55, 61, + (46,119,0): 247, 51, 55, + (46,120,0): 234, 45, 49, + (46,121,0): 225, 45, 46, + (46,122,0): 217, 45, 45, + (46,123,0): 215, 47, 46, + (46,124,0): 220, 52, 51, + (46,125,0): 227, 57, 58, + (46,126,0): 233, 59, 61, + (46,127,0): 240, 57, 61, + (46,128,0): 246, 50, 54, + (46,129,0): 248, 48, 51, + (46,130,0): 244, 48, 49, + (46,131,0): 237, 49, 47, + (46,132,0): 228, 49, 42, + (46,133,0): 222, 50, 40, + (46,134,0): 213, 49, 37, + (46,135,0): 207, 51, 36, + (46,136,0): 201, 49, 36, + (46,137,0): 209, 61, 49, + (46,138,0): 250, 106, 95, + (46,139,0): 228, 84, 76, + (46,140,0): 200, 57, 53, + (46,141,0): 208, 64, 63, + (46,142,0): 203, 58, 61, + (46,143,0): 228, 82, 83, + (46,144,0): 228, 74, 72, + (46,145,0): 220, 67, 61, + (46,146,0): 209, 58, 51, + (46,147,0): 201, 54, 46, + (46,148,0): 198, 56, 46, + (46,149,0): 197, 59, 48, + (46,150,0): 194, 60, 48, + (46,151,0): 191, 61, 47, + (46,152,0): 186, 59, 42, + (46,153,0): 188, 63, 45, + (46,154,0): 189, 64, 46, + (46,155,0): 188, 63, 45, + (46,156,0): 186, 59, 42, + (46,157,0): 186, 59, 40, + (46,158,0): 189, 59, 43, + (46,159,0): 190, 60, 44, + (46,160,0): 188, 62, 48, + (46,161,0): 188, 62, 50, + (46,162,0): 192, 68, 56, + (46,163,0): 200, 76, 66, + (46,164,0): 204, 80, 72, + (46,165,0): 202, 78, 70, + (46,166,0): 204, 76, 73, + (46,167,0): 208, 78, 76, + (46,168,0): 232, 97, 101, + (46,169,0): 236, 97, 102, + (46,170,0): 248, 104, 114, + (46,171,0): 255, 111, 123, + (46,172,0): 255, 104, 120, + (46,173,0): 247, 90, 107, + (46,174,0): 247, 85, 106, + (46,175,0): 253, 91, 114, + (46,176,0): 249, 91, 114, + (46,177,0): 244, 95, 115, + (46,178,0): 233, 98, 113, + (46,179,0): 227, 107, 116, + (46,180,0): 234, 125, 128, + (46,181,0): 242, 133, 136, + (46,182,0): 234, 118, 121, + (46,183,0): 222, 92, 100, + (46,184,0): 246, 101, 116, + (46,185,0): 255, 107, 124, + (46,186,0): 247, 98, 117, + (46,187,0): 238, 106, 119, + (46,188,0): 249, 144, 149, + (46,189,0): 239, 161, 159, + (46,190,0): 196, 148, 138, + (46,191,0): 163, 140, 124, + (46,192,0): 106, 105, 85, + (46,193,0): 73, 81, 60, + (46,194,0): 88, 85, 70, + (46,195,0): 117, 103, 92, + (46,196,0): 165, 140, 136, + (46,197,0): 220, 190, 190, + (46,198,0): 242, 213, 217, + (46,199,0): 249, 227, 230, + (46,200,0): 255, 242, 245, + (46,201,0): 255, 249, 251, + (46,202,0): 252, 253, 255, + (46,203,0): 249, 253, 255, + (46,204,0): 252, 253, 255, + (46,205,0): 255, 253, 255, + (46,206,0): 255, 251, 255, + (46,207,0): 255, 248, 253, + (46,208,0): 254, 255, 251, + (46,209,0): 247, 253, 243, + (46,210,0): 247, 253, 243, + (46,211,0): 253, 255, 247, + (46,212,0): 255, 255, 248, + (46,213,0): 255, 253, 246, + (46,214,0): 255, 251, 245, + (46,215,0): 255, 255, 246, + (46,216,0): 255, 250, 240, + (46,217,0): 246, 240, 226, + (46,218,0): 242, 236, 220, + (46,219,0): 251, 246, 226, + (46,220,0): 255, 252, 230, + (46,221,0): 254, 252, 227, + (46,222,0): 254, 253, 225, + (46,223,0): 255, 255, 230, + (46,224,0): 253, 254, 236, + (46,225,0): 248, 249, 235, + (46,226,0): 246, 246, 234, + (47,0,0): 86, 79, 63, + (47,1,0): 84, 78, 62, + (47,2,0): 83, 75, 62, + (47,3,0): 80, 74, 60, + (47,4,0): 79, 71, 58, + (47,5,0): 76, 70, 56, + (47,6,0): 76, 68, 55, + (47,7,0): 74, 68, 56, + (47,8,0): 72, 64, 53, + (47,9,0): 70, 64, 52, + (47,10,0): 69, 60, 51, + (47,11,0): 66, 59, 49, + (47,12,0): 66, 57, 50, + (47,13,0): 65, 58, 50, + (47,14,0): 67, 58, 51, + (47,15,0): 65, 60, 54, + (47,16,0): 67, 64, 57, + (47,17,0): 68, 68, 58, + (47,18,0): 74, 70, 58, + (47,19,0): 77, 71, 55, + (47,20,0): 79, 71, 50, + (47,21,0): 81, 70, 48, + (47,22,0): 84, 72, 50, + (47,23,0): 85, 72, 53, + (47,24,0): 85, 73, 61, + (47,25,0): 81, 71, 69, + (47,26,0): 87, 81, 93, + (47,27,0): 106, 104, 128, + (47,28,0): 126, 130, 168, + (47,29,0): 140, 148, 197, + (47,30,0): 147, 157, 216, + (47,31,0): 153, 162, 231, + (47,32,0): 159, 160, 242, + (47,33,0): 164, 160, 247, + (47,34,0): 166, 163, 250, + (47,35,0): 169, 166, 253, + (47,36,0): 169, 169, 255, + (47,37,0): 169, 171, 254, + (47,38,0): 169, 172, 253, + (47,39,0): 169, 172, 251, + (47,40,0): 165, 171, 245, + (47,41,0): 163, 170, 242, + (47,42,0): 163, 167, 238, + (47,43,0): 162, 167, 235, + (47,44,0): 164, 169, 237, + (47,45,0): 165, 170, 238, + (47,46,0): 165, 168, 237, + (47,47,0): 163, 167, 238, + (47,48,0): 152, 161, 230, + (47,49,0): 150, 161, 227, + (47,50,0): 148, 159, 221, + (47,51,0): 148, 159, 213, + (47,52,0): 149, 155, 203, + (47,53,0): 152, 150, 190, + (47,54,0): 158, 141, 175, + (47,55,0): 168, 132, 160, + (47,56,0): 164, 102, 127, + (47,57,0): 178, 93, 114, + (47,58,0): 193, 82, 99, + (47,59,0): 206, 74, 88, + (47,60,0): 218, 66, 78, + (47,61,0): 228, 62, 72, + (47,62,0): 235, 60, 67, + (47,63,0): 235, 61, 62, + (47,64,0): 231, 64, 58, + (47,65,0): 223, 67, 55, + (47,66,0): 216, 70, 55, + (47,67,0): 209, 74, 55, + (47,68,0): 199, 74, 52, + (47,69,0): 191, 71, 47, + (47,70,0): 189, 67, 44, + (47,71,0): 193, 64, 45, + (47,72,0): 225, 83, 69, + (47,73,0): 221, 68, 60, + (47,74,0): 221, 57, 55, + (47,75,0): 230, 62, 61, + (47,76,0): 236, 68, 67, + (47,77,0): 230, 64, 64, + (47,78,0): 219, 56, 57, + (47,79,0): 207, 53, 51, + (47,80,0): 205, 67, 57, + (47,81,0): 200, 68, 56, + (47,82,0): 201, 67, 56, + (47,83,0): 199, 65, 53, + (47,84,0): 198, 62, 50, + (47,85,0): 195, 57, 44, + (47,86,0): 194, 54, 41, + (47,87,0): 194, 50, 39, + (47,88,0): 198, 50, 40, + (47,89,0): 203, 51, 40, + (47,90,0): 206, 52, 42, + (47,91,0): 211, 53, 44, + (47,92,0): 216, 53, 46, + (47,93,0): 217, 52, 46, + (47,94,0): 219, 52, 46, + (47,95,0): 219, 52, 44, + (47,96,0): 228, 66, 55, + (47,97,0): 222, 60, 49, + (47,98,0): 218, 54, 44, + (47,99,0): 218, 54, 44, + (47,100,0): 223, 57, 45, + (47,101,0): 223, 57, 45, + (47,102,0): 219, 53, 41, + (47,103,0): 213, 49, 37, + (47,104,0): 216, 56, 40, + (47,105,0): 206, 49, 32, + (47,106,0): 202, 49, 33, + (47,107,0): 208, 57, 40, + (47,108,0): 206, 56, 39, + (47,109,0): 199, 52, 34, + (47,110,0): 202, 55, 37, + (47,111,0): 212, 67, 48, + (47,112,0): 200, 55, 38, + (47,113,0): 206, 56, 42, + (47,114,0): 215, 54, 44, + (47,115,0): 222, 53, 46, + (47,116,0): 230, 51, 47, + (47,117,0): 238, 53, 51, + (47,118,0): 246, 58, 57, + (47,119,0): 251, 63, 62, + (47,120,0): 255, 76, 75, + (47,121,0): 250, 72, 70, + (47,122,0): 242, 66, 66, + (47,123,0): 236, 62, 61, + (47,124,0): 234, 60, 61, + (47,125,0): 231, 55, 58, + (47,126,0): 229, 50, 54, + (47,127,0): 230, 44, 49, + (47,128,0): 244, 43, 49, + (47,129,0): 248, 41, 47, + (47,130,0): 244, 44, 46, + (47,131,0): 239, 47, 46, + (47,132,0): 232, 49, 43, + (47,133,0): 224, 52, 42, + (47,134,0): 217, 53, 41, + (47,135,0): 211, 55, 40, + (47,136,0): 198, 48, 33, + (47,137,0): 192, 46, 31, + (47,138,0): 244, 100, 89, + (47,139,0): 235, 93, 83, + (47,140,0): 207, 64, 58, + (47,141,0): 212, 68, 67, + (47,142,0): 203, 59, 59, + (47,143,0): 223, 77, 77, + (47,144,0): 234, 82, 81, + (47,145,0): 224, 72, 69, + (47,146,0): 211, 59, 54, + (47,147,0): 201, 54, 47, + (47,148,0): 198, 56, 46, + (47,149,0): 198, 57, 47, + (47,150,0): 195, 59, 45, + (47,151,0): 190, 58, 43, + (47,152,0): 190, 60, 44, + (47,153,0): 193, 64, 45, + (47,154,0): 192, 65, 46, + (47,155,0): 187, 60, 41, + (47,156,0): 183, 56, 37, + (47,157,0): 184, 57, 38, + (47,158,0): 189, 60, 41, + (47,159,0): 190, 63, 46, + (47,160,0): 181, 55, 41, + (47,161,0): 179, 55, 43, + (47,162,0): 184, 62, 49, + (47,163,0): 193, 71, 58, + (47,164,0): 197, 75, 64, + (47,165,0): 197, 73, 65, + (47,166,0): 200, 73, 66, + (47,167,0): 203, 74, 69, + (47,168,0): 229, 97, 95, + (47,169,0): 230, 94, 96, + (47,170,0): 241, 100, 106, + (47,171,0): 254, 110, 119, + (47,172,0): 254, 107, 117, + (47,173,0): 243, 93, 105, + (47,174,0): 240, 88, 101, + (47,175,0): 246, 94, 109, + (47,176,0): 248, 97, 116, + (47,177,0): 241, 100, 116, + (47,178,0): 229, 104, 112, + (47,179,0): 223, 110, 114, + (47,180,0): 233, 127, 127, + (47,181,0): 249, 141, 139, + (47,182,0): 247, 131, 132, + (47,183,0): 239, 110, 115, + (47,184,0): 253, 112, 121, + (47,185,0): 255, 120, 134, + (47,186,0): 245, 97, 113, + (47,187,0): 223, 88, 102, + (47,188,0): 246, 136, 145, + (47,189,0): 255, 180, 180, + (47,190,0): 211, 173, 162, + (47,191,0): 164, 153, 135, + (47,192,0): 96, 104, 80, + (47,193,0): 69, 81, 57, + (47,194,0): 82, 84, 63, + (47,195,0): 107, 97, 85, + (47,196,0): 156, 136, 129, + (47,197,0): 220, 192, 191, + (47,198,0): 244, 215, 217, + (47,199,0): 246, 224, 227, + (47,200,0): 255, 241, 244, + (47,201,0): 255, 248, 251, + (47,202,0): 253, 253, 255, + (47,203,0): 251, 252, 255, + (47,204,0): 252, 253, 255, + (47,205,0): 255, 253, 255, + (47,206,0): 255, 252, 255, + (47,207,0): 254, 249, 253, + (47,208,0): 250, 255, 249, + (47,209,0): 242, 254, 240, + (47,210,0): 242, 252, 241, + (47,211,0): 249, 255, 244, + (47,212,0): 253, 255, 247, + (47,213,0): 250, 252, 241, + (47,214,0): 254, 251, 242, + (47,215,0): 255, 255, 244, + (47,216,0): 255, 255, 243, + (47,217,0): 252, 246, 232, + (47,218,0): 248, 242, 226, + (47,219,0): 254, 249, 229, + (47,220,0): 255, 253, 231, + (47,221,0): 253, 251, 226, + (47,222,0): 253, 252, 224, + (47,223,0): 255, 255, 233, + (47,224,0): 255, 255, 241, + (47,225,0): 252, 252, 240, + (47,226,0): 251, 251, 239, + (48,0,0): 88, 79, 64, + (48,1,0): 87, 80, 64, + (48,2,0): 87, 78, 63, + (48,3,0): 85, 78, 62, + (48,4,0): 84, 75, 60, + (48,5,0): 82, 75, 59, + (48,6,0): 82, 73, 58, + (48,7,0): 80, 72, 59, + (48,8,0): 77, 67, 55, + (48,9,0): 75, 67, 54, + (48,10,0): 75, 65, 53, + (48,11,0): 72, 64, 51, + (48,12,0): 72, 62, 50, + (48,13,0): 71, 63, 50, + (48,14,0): 72, 62, 50, + (48,15,0): 70, 64, 52, + (48,16,0): 71, 67, 58, + (48,17,0): 71, 69, 57, + (48,18,0): 74, 71, 56, + (48,19,0): 78, 73, 54, + (48,20,0): 82, 74, 53, + (48,21,0): 85, 74, 52, + (48,22,0): 85, 74, 52, + (48,23,0): 86, 75, 57, + (48,24,0): 88, 78, 68, + (48,25,0): 85, 76, 77, + (48,26,0): 90, 84, 98, + (48,27,0): 107, 104, 131, + (48,28,0): 123, 126, 167, + (48,29,0): 137, 143, 195, + (48,30,0): 145, 153, 215, + (48,31,0): 152, 159, 231, + (48,32,0): 166, 162, 246, + (48,33,0): 167, 161, 249, + (48,34,0): 165, 160, 252, + (48,35,0): 164, 161, 252, + (48,36,0): 162, 163, 255, + (48,37,0): 163, 167, 255, + (48,38,0): 164, 170, 255, + (48,39,0): 164, 173, 252, + (48,40,0): 161, 170, 245, + (48,41,0): 161, 169, 241, + (48,42,0): 161, 168, 236, + (48,43,0): 164, 169, 237, + (48,44,0): 167, 170, 239, + (48,45,0): 172, 170, 243, + (48,46,0): 174, 170, 246, + (48,47,0): 171, 170, 246, + (48,48,0): 161, 168, 246, + (48,49,0): 156, 166, 238, + (48,50,0): 149, 160, 222, + (48,51,0): 152, 159, 211, + (48,52,0): 166, 164, 203, + (48,53,0): 180, 160, 188, + (48,54,0): 180, 135, 155, + (48,55,0): 179, 105, 120, + (48,56,0): 186, 78, 93, + (48,57,0): 205, 70, 84, + (48,58,0): 219, 65, 77, + (48,59,0): 227, 61, 73, + (48,60,0): 228, 61, 71, + (48,61,0): 227, 62, 69, + (48,62,0): 223, 64, 69, + (48,63,0): 223, 64, 68, + (48,64,0): 226, 61, 65, + (48,65,0): 221, 61, 61, + (48,66,0): 219, 70, 66, + (48,67,0): 200, 59, 52, + (48,68,0): 202, 68, 59, + (48,69,0): 202, 69, 60, + (48,70,0): 186, 49, 41, + (48,71,0): 219, 74, 69, + (48,72,0): 230, 75, 73, + (48,73,0): 233, 67, 69, + (48,74,0): 235, 62, 66, + (48,75,0): 232, 59, 63, + (48,76,0): 230, 60, 63, + (48,77,0): 225, 61, 62, + (48,78,0): 219, 59, 59, + (48,79,0): 212, 60, 57, + (48,80,0): 207, 66, 59, + (48,81,0): 200, 63, 55, + (48,82,0): 202, 68, 59, + (48,83,0): 209, 77, 65, + (48,84,0): 205, 75, 62, + (48,85,0): 191, 61, 48, + (48,86,0): 184, 54, 41, + (48,87,0): 189, 57, 44, + (48,88,0): 191, 55, 43, + (48,89,0): 195, 54, 44, + (48,90,0): 200, 53, 45, + (48,91,0): 203, 50, 42, + (48,92,0): 209, 47, 42, + (48,93,0): 212, 47, 43, + (48,94,0): 219, 50, 47, + (48,95,0): 224, 53, 46, + (48,96,0): 231, 65, 53, + (48,97,0): 224, 56, 43, + (48,98,0): 219, 49, 36, + (48,99,0): 222, 50, 38, + (48,100,0): 230, 57, 43, + (48,101,0): 231, 59, 45, + (48,102,0): 225, 55, 38, + (48,103,0): 215, 50, 31, + (48,104,0): 209, 50, 31, + (48,105,0): 206, 51, 31, + (48,106,0): 203, 52, 33, + (48,107,0): 201, 51, 34, + (48,108,0): 201, 51, 34, + (48,109,0): 203, 51, 37, + (48,110,0): 206, 53, 39, + (48,111,0): 207, 53, 41, + (48,112,0): 202, 48, 38, + (48,113,0): 207, 50, 41, + (48,114,0): 209, 53, 41, + (48,115,0): 210, 54, 42, + (48,116,0): 210, 52, 40, + (48,117,0): 213, 51, 38, + (48,118,0): 215, 51, 39, + (48,119,0): 220, 52, 41, + (48,120,0): 224, 50, 41, + (48,121,0): 230, 51, 46, + (48,122,0): 235, 53, 50, + (48,123,0): 235, 51, 51, + (48,124,0): 233, 47, 50, + (48,125,0): 231, 45, 50, + (48,126,0): 232, 45, 52, + (48,127,0): 237, 46, 53, + (48,128,0): 246, 45, 51, + (48,129,0): 246, 43, 47, + (48,130,0): 239, 43, 44, + (48,131,0): 236, 47, 45, + (48,132,0): 234, 53, 46, + (48,133,0): 227, 57, 44, + (48,134,0): 217, 55, 40, + (48,135,0): 208, 52, 37, + (48,136,0): 195, 45, 28, + (48,137,0): 196, 51, 34, + (48,138,0): 231, 88, 72, + (48,139,0): 233, 89, 78, + (48,140,0): 203, 59, 51, + (48,141,0): 223, 78, 73, + (48,142,0): 197, 52, 49, + (48,143,0): 218, 72, 72, + (48,144,0): 225, 79, 80, + (48,145,0): 220, 74, 74, + (48,146,0): 212, 67, 64, + (48,147,0): 204, 59, 54, + (48,148,0): 200, 56, 48, + (48,149,0): 198, 56, 44, + (48,150,0): 199, 57, 43, + (48,151,0): 200, 60, 43, + (48,152,0): 197, 60, 42, + (48,153,0): 194, 59, 40, + (48,154,0): 190, 57, 38, + (48,155,0): 188, 59, 40, + (48,156,0): 187, 60, 41, + (48,157,0): 186, 61, 41, + (48,158,0): 186, 61, 43, + (48,159,0): 183, 60, 44, + (48,160,0): 180, 56, 44, + (48,161,0): 181, 59, 48, + (48,162,0): 185, 61, 49, + (48,163,0): 187, 63, 51, + (48,164,0): 187, 63, 51, + (48,165,0): 190, 64, 52, + (48,166,0): 192, 64, 53, + (48,167,0): 196, 65, 55, + (48,168,0): 239, 106, 97, + (48,169,0): 245, 112, 105, + (48,170,0): 234, 99, 95, + (48,171,0): 244, 109, 106, + (48,172,0): 251, 113, 113, + (48,173,0): 236, 97, 100, + (48,174,0): 244, 103, 109, + (48,175,0): 255, 112, 121, + (48,176,0): 255, 107, 122, + (48,177,0): 251, 104, 120, + (48,178,0): 234, 103, 111, + (48,179,0): 226, 101, 105, + (48,180,0): 229, 103, 106, + (48,181,0): 237, 109, 110, + (48,182,0): 243, 110, 111, + (48,183,0): 245, 109, 111, + (48,184,0): 255, 119, 123, + (48,185,0): 255, 126, 133, + (48,186,0): 241, 95, 108, + (48,187,0): 241, 105, 119, + (48,188,0): 214, 103, 112, + (48,189,0): 248, 174, 175, + (48,190,0): 189, 167, 154, + (48,191,0): 133, 141, 117, + (48,192,0): 97, 112, 81, + (48,193,0): 74, 89, 58, + (48,194,0): 77, 81, 56, + (48,195,0): 115, 110, 90, + (48,196,0): 165, 149, 136, + (48,197,0): 205, 182, 176, + (48,198,0): 237, 213, 211, + (48,199,0): 255, 238, 240, + (48,200,0): 255, 244, 245, + (48,201,0): 255, 245, 249, + (48,202,0): 252, 247, 251, + (48,203,0): 251, 251, 253, + (48,204,0): 253, 254, 255, + (48,205,0): 254, 255, 255, + (48,206,0): 255, 254, 255, + (48,207,0): 251, 255, 254, + (48,208,0): 239, 255, 243, + (48,209,0): 229, 252, 232, + (48,210,0): 231, 249, 233, + (48,211,0): 240, 254, 237, + (48,212,0): 248, 255, 245, + (48,213,0): 252, 255, 244, + (48,214,0): 253, 255, 242, + (48,215,0): 255, 253, 240, + (48,216,0): 255, 253, 241, + (48,217,0): 255, 251, 238, + (48,218,0): 255, 250, 234, + (48,219,0): 255, 250, 230, + (48,220,0): 254, 249, 227, + (48,221,0): 252, 250, 225, + (48,222,0): 252, 250, 225, + (48,223,0): 251, 250, 229, + (48,224,0): 253, 253, 241, + (48,225,0): 255, 255, 250, + (48,226,0): 255, 255, 250, + (49,0,0): 89, 80, 65, + (49,1,0): 88, 79, 64, + (49,2,0): 88, 79, 64, + (49,3,0): 86, 77, 62, + (49,4,0): 85, 76, 61, + (49,5,0): 84, 75, 60, + (49,6,0): 83, 74, 59, + (49,7,0): 82, 73, 58, + (49,8,0): 78, 69, 54, + (49,9,0): 77, 68, 53, + (49,10,0): 76, 67, 52, + (49,11,0): 75, 66, 51, + (49,12,0): 74, 65, 50, + (49,13,0): 74, 65, 50, + (49,14,0): 74, 65, 50, + (49,15,0): 73, 65, 52, + (49,16,0): 71, 67, 56, + (49,17,0): 72, 68, 57, + (49,18,0): 76, 70, 56, + (49,19,0): 79, 72, 54, + (49,20,0): 82, 74, 53, + (49,21,0): 83, 75, 52, + (49,22,0): 86, 75, 55, + (49,23,0): 84, 75, 58, + (49,24,0): 88, 78, 69, + (49,25,0): 85, 76, 77, + (49,26,0): 89, 85, 99, + (49,27,0): 107, 104, 131, + (49,28,0): 123, 125, 166, + (49,29,0): 134, 140, 192, + (49,30,0): 141, 149, 211, + (49,31,0): 150, 154, 225, + (49,32,0): 161, 156, 236, + (49,33,0): 163, 155, 241, + (49,34,0): 161, 157, 244, + (49,35,0): 161, 158, 249, + (49,36,0): 160, 161, 253, + (49,37,0): 160, 165, 255, + (49,38,0): 162, 170, 255, + (49,39,0): 161, 172, 251, + (49,40,0): 160, 172, 244, + (49,41,0): 160, 171, 237, + (49,42,0): 158, 167, 232, + (49,43,0): 161, 166, 232, + (49,44,0): 164, 164, 234, + (49,45,0): 166, 164, 237, + (49,46,0): 166, 162, 238, + (49,47,0): 163, 160, 237, + (49,48,0): 163, 166, 243, + (49,49,0): 160, 164, 235, + (49,50,0): 160, 160, 220, + (49,51,0): 165, 155, 205, + (49,52,0): 177, 153, 189, + (49,53,0): 188, 143, 166, + (49,54,0): 189, 115, 130, + (49,55,0): 191, 87, 98, + (49,56,0): 204, 70, 77, + (49,57,0): 220, 63, 70, + (49,58,0): 230, 59, 67, + (49,59,0): 233, 58, 65, + (49,60,0): 230, 59, 67, + (49,61,0): 225, 62, 67, + (49,62,0): 219, 64, 68, + (49,63,0): 218, 65, 70, + (49,64,0): 224, 60, 67, + (49,65,0): 218, 57, 63, + (49,66,0): 218, 65, 68, + (49,67,0): 203, 59, 59, + (49,68,0): 204, 66, 63, + (49,69,0): 202, 64, 61, + (49,70,0): 193, 51, 49, + (49,71,0): 229, 79, 80, + (49,72,0): 230, 67, 70, + (49,73,0): 232, 63, 68, + (49,74,0): 234, 59, 66, + (49,75,0): 231, 56, 63, + (49,76,0): 226, 56, 59, + (49,77,0): 219, 56, 57, + (49,78,0): 213, 58, 56, + (49,79,0): 207, 59, 55, + (49,80,0): 212, 69, 63, + (49,81,0): 198, 61, 53, + (49,82,0): 197, 60, 52, + (49,83,0): 204, 71, 62, + (49,84,0): 204, 76, 65, + (49,85,0): 193, 67, 53, + (49,86,0): 184, 58, 44, + (49,87,0): 183, 57, 43, + (49,88,0): 185, 55, 42, + (49,89,0): 191, 55, 43, + (49,90,0): 198, 54, 45, + (49,91,0): 203, 52, 45, + (49,92,0): 209, 50, 46, + (49,93,0): 216, 51, 47, + (49,94,0): 225, 53, 51, + (49,95,0): 228, 56, 52, + (49,96,0): 229, 61, 50, + (49,97,0): 226, 58, 45, + (49,98,0): 225, 53, 41, + (49,99,0): 225, 52, 38, + (49,100,0): 228, 52, 39, + (49,101,0): 226, 53, 39, + (49,102,0): 221, 51, 34, + (49,103,0): 213, 50, 31, + (49,104,0): 211, 56, 36, + (49,105,0): 205, 56, 34, + (49,106,0): 201, 56, 37, + (49,107,0): 200, 58, 38, + (49,108,0): 204, 58, 43, + (49,109,0): 206, 58, 44, + (49,110,0): 207, 55, 44, + (49,111,0): 208, 51, 42, + (49,112,0): 213, 51, 46, + (49,113,0): 214, 53, 45, + (49,114,0): 211, 55, 43, + (49,115,0): 207, 55, 41, + (49,116,0): 201, 54, 38, + (49,117,0): 199, 52, 34, + (49,118,0): 203, 52, 33, + (49,119,0): 207, 52, 34, + (49,120,0): 216, 50, 36, + (49,121,0): 222, 50, 38, + (49,122,0): 227, 48, 43, + (49,123,0): 230, 46, 44, + (49,124,0): 230, 44, 45, + (49,125,0): 230, 44, 47, + (49,126,0): 230, 45, 50, + (49,127,0): 232, 46, 51, + (49,128,0): 236, 43, 46, + (49,129,0): 237, 44, 45, + (49,130,0): 236, 48, 46, + (49,131,0): 232, 50, 46, + (49,132,0): 224, 52, 42, + (49,133,0): 219, 53, 39, + (49,134,0): 213, 56, 39, + (49,135,0): 210, 57, 39, + (49,136,0): 213, 63, 46, + (49,137,0): 187, 42, 25, + (49,138,0): 214, 68, 53, + (49,139,0): 208, 62, 49, + (49,140,0): 217, 70, 62, + (49,141,0): 235, 86, 80, + (49,142,0): 218, 66, 63, + (49,143,0): 216, 66, 65, + (49,144,0): 231, 85, 86, + (49,145,0): 226, 82, 82, + (49,146,0): 220, 75, 72, + (49,147,0): 212, 67, 62, + (49,148,0): 205, 61, 53, + (49,149,0): 201, 57, 46, + (49,150,0): 200, 57, 43, + (49,151,0): 199, 56, 40, + (49,152,0): 200, 59, 42, + (49,153,0): 196, 59, 40, + (49,154,0): 191, 58, 39, + (49,155,0): 189, 60, 41, + (49,156,0): 189, 62, 43, + (49,157,0): 186, 63, 45, + (49,158,0): 185, 64, 47, + (49,159,0): 182, 62, 46, + (49,160,0): 178, 58, 44, + (49,161,0): 180, 59, 48, + (49,162,0): 183, 61, 48, + (49,163,0): 184, 62, 49, + (49,164,0): 186, 63, 48, + (49,165,0): 189, 63, 49, + (49,166,0): 193, 66, 51, + (49,167,0): 197, 67, 53, + (49,168,0): 235, 105, 92, + (49,169,0): 242, 109, 100, + (49,170,0): 231, 98, 91, + (49,171,0): 240, 107, 102, + (49,172,0): 245, 111, 108, + (49,173,0): 232, 98, 97, + (49,174,0): 241, 107, 108, + (49,175,0): 254, 115, 120, + (49,176,0): 255, 111, 126, + (49,177,0): 255, 110, 124, + (49,178,0): 242, 107, 114, + (49,179,0): 228, 97, 102, + (49,180,0): 228, 92, 96, + (49,181,0): 239, 99, 102, + (49,182,0): 253, 110, 112, + (49,183,0): 255, 119, 120, + (49,184,0): 253, 117, 119, + (49,185,0): 255, 121, 126, + (49,186,0): 235, 89, 100, + (49,187,0): 237, 99, 112, + (49,188,0): 215, 99, 110, + (49,189,0): 242, 168, 169, + (49,190,0): 178, 162, 147, + (49,191,0): 118, 134, 107, + (49,192,0): 94, 114, 79, + (49,193,0): 78, 95, 59, + (49,194,0): 83, 90, 59, + (49,195,0): 117, 115, 92, + (49,196,0): 169, 157, 141, + (49,197,0): 214, 196, 184, + (49,198,0): 246, 225, 220, + (49,199,0): 255, 245, 241, + (49,200,0): 255, 248, 248, + (49,201,0): 255, 248, 249, + (49,202,0): 253, 249, 250, + (49,203,0): 251, 251, 251, + (49,204,0): 250, 254, 253, + (49,205,0): 251, 255, 254, + (49,206,0): 250, 254, 255, + (49,207,0): 246, 255, 250, + (49,208,0): 237, 255, 242, + (49,209,0): 227, 255, 232, + (49,210,0): 227, 251, 229, + (49,211,0): 235, 254, 234, + (49,212,0): 244, 255, 240, + (49,213,0): 249, 255, 241, + (49,214,0): 252, 255, 241, + (49,215,0): 255, 255, 240, + (49,216,0): 255, 253, 239, + (49,217,0): 255, 253, 237, + (49,218,0): 255, 251, 233, + (49,219,0): 254, 247, 229, + (49,220,0): 249, 244, 224, + (49,221,0): 248, 243, 221, + (49,222,0): 250, 245, 223, + (49,223,0): 250, 247, 228, + (49,224,0): 249, 249, 239, + (49,225,0): 251, 252, 246, + (49,226,0): 254, 253, 249, + (50,0,0): 92, 80, 66, + (50,1,0): 91, 79, 65, + (50,2,0): 91, 79, 65, + (50,3,0): 89, 77, 63, + (50,4,0): 88, 76, 62, + (50,5,0): 87, 75, 61, + (50,6,0): 86, 74, 60, + (50,7,0): 86, 74, 60, + (50,8,0): 83, 71, 57, + (50,9,0): 82, 70, 56, + (50,10,0): 81, 69, 55, + (50,11,0): 79, 67, 53, + (50,12,0): 79, 67, 53, + (50,13,0): 79, 67, 53, + (50,14,0): 79, 67, 53, + (50,15,0): 77, 67, 55, + (50,16,0): 74, 67, 57, + (50,17,0): 74, 70, 59, + (50,18,0): 77, 71, 57, + (50,19,0): 80, 73, 55, + (50,20,0): 83, 75, 54, + (50,21,0): 86, 75, 53, + (50,22,0): 86, 75, 55, + (50,23,0): 84, 75, 58, + (50,24,0): 87, 77, 67, + (50,25,0): 86, 77, 78, + (50,26,0): 90, 87, 98, + (50,27,0): 107, 105, 129, + (50,28,0): 121, 123, 161, + (50,29,0): 133, 137, 185, + (50,30,0): 139, 145, 203, + (50,31,0): 146, 150, 214, + (50,32,0): 153, 152, 222, + (50,33,0): 155, 151, 227, + (50,34,0): 155, 152, 233, + (50,35,0): 155, 156, 238, + (50,36,0): 157, 159, 244, + (50,37,0): 158, 163, 247, + (50,38,0): 160, 167, 248, + (50,39,0): 160, 169, 244, + (50,40,0): 160, 170, 239, + (50,41,0): 157, 168, 232, + (50,42,0): 155, 165, 227, + (50,43,0): 156, 162, 224, + (50,44,0): 156, 160, 224, + (50,45,0): 157, 158, 225, + (50,46,0): 156, 154, 227, + (50,47,0): 155, 153, 226, + (50,48,0): 153, 154, 221, + (50,49,0): 158, 152, 214, + (50,50,0): 168, 147, 204, + (50,51,0): 178, 140, 189, + (50,52,0): 191, 131, 169, + (50,53,0): 198, 115, 145, + (50,54,0): 197, 91, 111, + (50,55,0): 194, 70, 81, + (50,56,0): 209, 68, 76, + (50,57,0): 218, 65, 68, + (50,58,0): 223, 63, 65, + (50,59,0): 225, 62, 63, + (50,60,0): 225, 62, 65, + (50,61,0): 225, 62, 67, + (50,62,0): 223, 62, 68, + (50,63,0): 223, 62, 70, + (50,64,0): 224, 60, 67, + (50,65,0): 215, 56, 61, + (50,66,0): 213, 63, 65, + (50,67,0): 207, 65, 64, + (50,68,0): 202, 67, 63, + (50,69,0): 195, 60, 56, + (50,70,0): 196, 57, 54, + (50,71,0): 233, 87, 87, + (50,72,0): 224, 66, 67, + (50,73,0): 228, 62, 66, + (50,74,0): 232, 59, 63, + (50,75,0): 227, 57, 60, + (50,76,0): 220, 54, 56, + (50,77,0): 214, 54, 54, + (50,78,0): 209, 57, 54, + (50,79,0): 204, 59, 54, + (50,80,0): 213, 72, 65, + (50,81,0): 196, 59, 49, + (50,82,0): 190, 53, 43, + (50,83,0): 197, 65, 53, + (50,84,0): 205, 75, 62, + (50,85,0): 198, 72, 58, + (50,86,0): 187, 61, 47, + (50,87,0): 183, 56, 41, + (50,88,0): 186, 54, 41, + (50,89,0): 191, 55, 41, + (50,90,0): 199, 55, 44, + (50,91,0): 207, 54, 46, + (50,92,0): 215, 53, 48, + (50,93,0): 222, 55, 49, + (50,94,0): 230, 57, 53, + (50,95,0): 233, 61, 57, + (50,96,0): 217, 50, 42, + (50,97,0): 218, 51, 42, + (50,98,0): 221, 53, 42, + (50,99,0): 223, 52, 42, + (50,100,0): 223, 52, 42, + (50,101,0): 222, 54, 41, + (50,102,0): 220, 57, 42, + (50,103,0): 217, 62, 44, + (50,104,0): 198, 51, 33, + (50,105,0): 192, 51, 31, + (50,106,0): 187, 52, 33, + (50,107,0): 186, 53, 34, + (50,108,0): 191, 55, 41, + (50,109,0): 191, 55, 41, + (50,110,0): 191, 50, 40, + (50,111,0): 193, 44, 37, + (50,112,0): 227, 64, 59, + (50,113,0): 229, 62, 56, + (50,114,0): 222, 61, 51, + (50,115,0): 213, 60, 46, + (50,116,0): 204, 57, 41, + (50,117,0): 200, 55, 36, + (50,118,0): 200, 55, 34, + (50,119,0): 204, 55, 35, + (50,120,0): 210, 55, 37, + (50,121,0): 213, 51, 36, + (50,122,0): 215, 47, 38, + (50,123,0): 217, 46, 39, + (50,124,0): 219, 46, 42, + (50,125,0): 220, 46, 45, + (50,126,0): 219, 47, 47, + (50,127,0): 220, 46, 47, + (50,128,0): 219, 44, 41, + (50,129,0): 223, 48, 43, + (50,130,0): 224, 53, 45, + (50,131,0): 220, 53, 44, + (50,132,0): 213, 51, 38, + (50,133,0): 208, 52, 37, + (50,134,0): 208, 57, 38, + (50,135,0): 209, 62, 42, + (50,136,0): 212, 65, 47, + (50,137,0): 194, 49, 32, + (50,138,0): 231, 83, 69, + (50,139,0): 210, 59, 48, + (50,140,0): 218, 65, 59, + (50,141,0): 222, 67, 63, + (50,142,0): 232, 74, 73, + (50,143,0): 240, 84, 85, + (50,144,0): 237, 85, 84, + (50,145,0): 231, 83, 81, + (50,146,0): 227, 79, 77, + (50,147,0): 221, 74, 67, + (50,148,0): 214, 67, 59, + (50,149,0): 207, 60, 50, + (50,150,0): 202, 56, 43, + (50,151,0): 197, 54, 38, + (50,152,0): 196, 55, 38, + (50,153,0): 192, 55, 37, + (50,154,0): 188, 55, 38, + (50,155,0): 185, 58, 39, + (50,156,0): 185, 60, 42, + (50,157,0): 183, 62, 45, + (50,158,0): 181, 61, 44, + (50,159,0): 178, 61, 44, + (50,160,0): 176, 58, 44, + (50,161,0): 177, 59, 47, + (50,162,0): 180, 60, 46, + (50,163,0): 181, 61, 47, + (50,164,0): 183, 61, 46, + (50,165,0): 185, 63, 48, + (50,166,0): 190, 67, 52, + (50,167,0): 195, 69, 55, + (50,168,0): 220, 92, 81, + (50,169,0): 234, 103, 93, + (50,170,0): 228, 97, 89, + (50,171,0): 240, 108, 103, + (50,172,0): 246, 112, 109, + (50,173,0): 231, 97, 96, + (50,174,0): 236, 102, 103, + (50,175,0): 245, 106, 113, + (50,176,0): 228, 80, 94, + (50,177,0): 240, 94, 107, + (50,178,0): 240, 106, 113, + (50,179,0): 235, 104, 109, + (50,180,0): 235, 99, 103, + (50,181,0): 242, 102, 105, + (50,182,0): 254, 111, 113, + (50,183,0): 255, 117, 119, + (50,184,0): 253, 114, 117, + (50,185,0): 252, 111, 117, + (50,186,0): 231, 81, 93, + (50,187,0): 232, 90, 104, + (50,188,0): 217, 97, 109, + (50,189,0): 237, 158, 161, + (50,190,0): 170, 152, 138, + (50,191,0): 108, 122, 96, + (50,192,0): 89, 109, 72, + (50,193,0): 79, 100, 61, + (50,194,0): 87, 96, 65, + (50,195,0): 119, 119, 93, + (50,196,0): 173, 165, 146, + (50,197,0): 225, 209, 194, + (50,198,0): 255, 238, 230, + (50,199,0): 255, 248, 241, + (50,200,0): 255, 251, 247, + (50,201,0): 255, 252, 248, + (50,202,0): 252, 253, 248, + (50,203,0): 250, 255, 251, + (50,204,0): 251, 255, 253, + (50,205,0): 251, 255, 253, + (50,206,0): 249, 255, 251, + (50,207,0): 244, 255, 246, + (50,208,0): 233, 255, 237, + (50,209,0): 222, 252, 226, + (50,210,0): 220, 246, 221, + (50,211,0): 225, 247, 224, + (50,212,0): 233, 251, 229, + (50,213,0): 239, 251, 231, + (50,214,0): 245, 252, 234, + (50,215,0): 252, 255, 236, + (50,216,0): 253, 250, 233, + (50,217,0): 255, 250, 234, + (50,218,0): 255, 248, 230, + (50,219,0): 249, 242, 224, + (50,220,0): 241, 234, 216, + (50,221,0): 239, 232, 213, + (50,222,0): 243, 236, 217, + (50,223,0): 247, 242, 223, + (50,224,0): 251, 248, 239, + (50,225,0): 252, 252, 244, + (50,226,0): 255, 254, 249, + (51,0,0): 92, 80, 66, + (51,1,0): 92, 80, 66, + (51,2,0): 91, 79, 65, + (51,3,0): 90, 78, 64, + (51,4,0): 89, 77, 63, + (51,5,0): 89, 77, 63, + (51,6,0): 88, 76, 62, + (51,7,0): 88, 76, 62, + (51,8,0): 85, 73, 59, + (51,9,0): 84, 72, 58, + (51,10,0): 83, 71, 57, + (51,11,0): 82, 70, 56, + (51,12,0): 82, 70, 56, + (51,13,0): 82, 70, 56, + (51,14,0): 82, 70, 56, + (51,15,0): 80, 70, 58, + (51,16,0): 76, 69, 59, + (51,17,0): 75, 71, 60, + (51,18,0): 79, 73, 59, + (51,19,0): 82, 75, 57, + (51,20,0): 84, 76, 55, + (51,21,0): 87, 76, 54, + (51,22,0): 87, 76, 56, + (51,23,0): 87, 75, 59, + (51,24,0): 86, 76, 66, + (51,25,0): 85, 77, 75, + (51,26,0): 92, 86, 96, + (51,27,0): 106, 104, 126, + (51,28,0): 121, 121, 155, + (51,29,0): 130, 133, 178, + (51,30,0): 138, 141, 194, + (51,31,0): 143, 148, 206, + (51,32,0): 148, 148, 210, + (51,33,0): 149, 148, 214, + (51,34,0): 149, 149, 219, + (51,35,0): 150, 152, 227, + (51,36,0): 152, 155, 232, + (51,37,0): 152, 158, 236, + (51,38,0): 155, 161, 237, + (51,39,0): 155, 163, 235, + (51,40,0): 156, 165, 232, + (51,41,0): 152, 162, 223, + (51,42,0): 150, 159, 218, + (51,43,0): 149, 155, 213, + (51,44,0): 147, 153, 213, + (51,45,0): 147, 151, 214, + (51,46,0): 146, 147, 214, + (51,47,0): 145, 144, 210, + (51,48,0): 136, 131, 189, + (51,49,0): 148, 130, 182, + (51,50,0): 168, 124, 175, + (51,51,0): 184, 115, 162, + (51,52,0): 199, 102, 143, + (51,53,0): 207, 88, 120, + (51,54,0): 210, 72, 97, + (51,55,0): 208, 62, 75, + (51,56,0): 217, 68, 74, + (51,57,0): 218, 68, 67, + (51,58,0): 218, 69, 65, + (51,59,0): 220, 68, 65, + (51,60,0): 222, 66, 67, + (51,61,0): 225, 64, 69, + (51,62,0): 229, 62, 70, + (51,63,0): 229, 62, 70, + (51,64,0): 227, 63, 70, + (51,65,0): 214, 58, 62, + (51,66,0): 209, 63, 64, + (51,67,0): 209, 69, 68, + (51,68,0): 198, 65, 60, + (51,69,0): 186, 54, 49, + (51,70,0): 197, 62, 58, + (51,71,0): 234, 90, 89, + (51,72,0): 221, 65, 66, + (51,73,0): 227, 64, 67, + (51,74,0): 230, 61, 64, + (51,75,0): 227, 58, 61, + (51,76,0): 219, 56, 57, + (51,77,0): 211, 57, 55, + (51,78,0): 208, 60, 56, + (51,79,0): 206, 65, 56, + (51,80,0): 207, 69, 59, + (51,81,0): 194, 58, 46, + (51,82,0): 187, 50, 40, + (51,83,0): 192, 60, 47, + (51,84,0): 199, 69, 55, + (51,85,0): 196, 69, 54, + (51,86,0): 189, 62, 47, + (51,87,0): 184, 57, 40, + (51,88,0): 189, 56, 41, + (51,89,0): 194, 57, 41, + (51,90,0): 203, 56, 46, + (51,91,0): 210, 58, 47, + (51,92,0): 217, 56, 48, + (51,93,0): 224, 57, 49, + (51,94,0): 232, 59, 55, + (51,95,0): 235, 62, 56, + (51,96,0): 217, 48, 43, + (51,97,0): 218, 49, 42, + (51,98,0): 222, 51, 44, + (51,99,0): 224, 51, 44, + (51,100,0): 225, 52, 45, + (51,101,0): 225, 54, 46, + (51,102,0): 220, 56, 46, + (51,103,0): 217, 59, 47, + (51,104,0): 202, 54, 40, + (51,105,0): 199, 58, 41, + (51,106,0): 195, 59, 43, + (51,107,0): 192, 59, 44, + (51,108,0): 192, 58, 46, + (51,109,0): 195, 58, 48, + (51,110,0): 198, 59, 54, + (51,111,0): 208, 56, 53, + (51,112,0): 236, 67, 64, + (51,113,0): 237, 64, 60, + (51,114,0): 228, 64, 55, + (51,115,0): 217, 61, 49, + (51,116,0): 207, 57, 42, + (51,117,0): 199, 57, 37, + (51,118,0): 200, 58, 38, + (51,119,0): 201, 59, 37, + (51,120,0): 207, 60, 40, + (51,121,0): 208, 55, 39, + (51,122,0): 207, 49, 37, + (51,123,0): 209, 49, 37, + (51,124,0): 212, 49, 40, + (51,125,0): 214, 51, 44, + (51,126,0): 212, 49, 44, + (51,127,0): 209, 47, 42, + (51,128,0): 211, 50, 42, + (51,129,0): 211, 53, 44, + (51,130,0): 211, 55, 43, + (51,131,0): 208, 55, 41, + (51,132,0): 205, 53, 39, + (51,133,0): 202, 55, 37, + (51,134,0): 204, 59, 40, + (51,135,0): 204, 62, 42, + (51,136,0): 204, 59, 40, + (51,137,0): 207, 60, 44, + (51,138,0): 244, 94, 80, + (51,139,0): 224, 70, 60, + (51,140,0): 210, 51, 47, + (51,141,0): 210, 46, 44, + (51,142,0): 230, 64, 64, + (51,143,0): 251, 87, 88, + (51,144,0): 255, 117, 115, + (51,145,0): 255, 114, 111, + (51,146,0): 255, 106, 103, + (51,147,0): 246, 94, 89, + (51,148,0): 231, 80, 71, + (51,149,0): 213, 65, 55, + (51,150,0): 199, 53, 40, + (51,151,0): 189, 46, 32, + (51,152,0): 196, 56, 39, + (51,153,0): 192, 56, 40, + (51,154,0): 187, 56, 38, + (51,155,0): 184, 59, 41, + (51,156,0): 183, 60, 44, + (51,157,0): 181, 61, 45, + (51,158,0): 178, 61, 44, + (51,159,0): 176, 60, 45, + (51,160,0): 175, 59, 46, + (51,161,0): 173, 60, 46, + (51,162,0): 176, 60, 47, + (51,163,0): 176, 60, 45, + (51,164,0): 177, 59, 45, + (51,165,0): 182, 62, 46, + (51,166,0): 188, 66, 51, + (51,167,0): 192, 70, 55, + (51,168,0): 203, 77, 65, + (51,169,0): 223, 96, 87, + (51,170,0): 226, 97, 91, + (51,171,0): 244, 112, 108, + (51,172,0): 248, 116, 114, + (51,173,0): 230, 96, 97, + (51,174,0): 228, 93, 97, + (51,175,0): 232, 93, 100, + (51,176,0): 218, 70, 84, + (51,177,0): 234, 88, 101, + (51,178,0): 239, 105, 114, + (51,179,0): 236, 107, 111, + (51,180,0): 240, 104, 108, + (51,181,0): 249, 109, 112, + (51,182,0): 255, 113, 118, + (51,183,0): 255, 115, 118, + (51,184,0): 254, 111, 115, + (51,185,0): 248, 103, 110, + (51,186,0): 229, 74, 88, + (51,187,0): 229, 82, 98, + (51,188,0): 218, 93, 107, + (51,189,0): 230, 148, 150, + (51,190,0): 168, 145, 131, + (51,191,0): 106, 116, 89, + (51,192,0): 85, 106, 67, + (51,193,0): 83, 104, 63, + (51,194,0): 92, 103, 69, + (51,195,0): 121, 124, 95, + (51,196,0): 176, 170, 148, + (51,197,0): 231, 220, 202, + (51,198,0): 255, 245, 232, + (51,199,0): 255, 249, 240, + (51,200,0): 255, 249, 239, + (51,201,0): 252, 252, 242, + (51,202,0): 251, 254, 245, + (51,203,0): 250, 255, 249, + (51,204,0): 249, 255, 250, + (51,205,0): 246, 255, 248, + (51,206,0): 242, 252, 243, + (51,207,0): 234, 251, 235, + (51,208,0): 219, 247, 222, + (51,209,0): 208, 241, 210, + (51,210,0): 205, 234, 204, + (51,211,0): 209, 235, 206, + (51,212,0): 217, 237, 210, + (51,213,0): 223, 239, 213, + (51,214,0): 233, 243, 219, + (51,215,0): 242, 247, 225, + (51,216,0): 244, 246, 225, + (51,217,0): 249, 246, 227, + (51,218,0): 251, 246, 227, + (51,219,0): 244, 237, 219, + (51,220,0): 234, 227, 209, + (51,221,0): 231, 222, 205, + (51,222,0): 235, 226, 209, + (51,223,0): 240, 233, 217, + (51,224,0): 251, 244, 234, + (51,225,0): 251, 246, 240, + (51,226,0): 254, 249, 243, + (52,0,0): 92, 80, 66, + (52,1,0): 92, 80, 66, + (52,2,0): 91, 79, 65, + (52,3,0): 91, 79, 65, + (52,4,0): 90, 78, 64, + (52,5,0): 89, 77, 63, + (52,6,0): 89, 77, 63, + (52,7,0): 89, 77, 63, + (52,8,0): 87, 75, 61, + (52,9,0): 86, 74, 60, + (52,10,0): 85, 73, 59, + (52,11,0): 85, 73, 59, + (52,12,0): 84, 72, 58, + (52,13,0): 85, 73, 59, + (52,14,0): 85, 73, 59, + (52,15,0): 83, 73, 61, + (52,16,0): 79, 71, 60, + (52,17,0): 79, 73, 61, + (52,18,0): 81, 73, 60, + (52,19,0): 83, 76, 58, + (52,20,0): 85, 77, 56, + (52,21,0): 88, 77, 55, + (52,22,0): 89, 76, 57, + (52,23,0): 88, 76, 60, + (52,24,0): 85, 75, 65, + (52,25,0): 85, 75, 73, + (52,26,0): 92, 85, 93, + (52,27,0): 104, 101, 120, + (52,28,0): 117, 116, 147, + (52,29,0): 124, 126, 165, + (52,30,0): 133, 135, 183, + (52,31,0): 140, 143, 194, + (52,32,0): 141, 144, 195, + (52,33,0): 142, 145, 200, + (52,34,0): 142, 146, 207, + (52,35,0): 144, 148, 212, + (52,36,0): 146, 149, 220, + (52,37,0): 147, 151, 224, + (52,38,0): 148, 152, 223, + (52,39,0): 147, 154, 222, + (52,40,0): 149, 157, 220, + (52,41,0): 146, 155, 214, + (52,42,0): 142, 148, 206, + (52,43,0): 137, 144, 199, + (52,44,0): 133, 139, 197, + (52,45,0): 129, 135, 195, + (52,46,0): 126, 130, 193, + (52,47,0): 129, 125, 184, + (52,48,0): 128, 115, 159, + (52,49,0): 145, 110, 150, + (52,50,0): 170, 102, 143, + (52,51,0): 193, 92, 134, + (52,52,0): 214, 78, 118, + (52,53,0): 225, 65, 101, + (52,54,0): 229, 59, 85, + (52,55,0): 230, 59, 75, + (52,56,0): 226, 67, 71, + (52,57,0): 220, 71, 67, + (52,58,0): 216, 73, 65, + (52,59,0): 216, 73, 65, + (52,60,0): 220, 71, 67, + (52,61,0): 227, 66, 71, + (52,62,0): 236, 62, 72, + (52,63,0): 237, 61, 72, + (52,64,0): 230, 66, 73, + (52,65,0): 215, 62, 64, + (52,66,0): 208, 64, 63, + (52,67,0): 208, 73, 69, + (52,68,0): 191, 62, 56, + (52,69,0): 179, 50, 44, + (52,70,0): 200, 67, 60, + (52,71,0): 224, 85, 80, + (52,72,0): 220, 68, 67, + (52,73,0): 225, 65, 67, + (52,74,0): 227, 63, 64, + (52,75,0): 225, 62, 63, + (52,76,0): 218, 63, 61, + (52,77,0): 212, 64, 60, + (52,78,0): 209, 68, 59, + (52,79,0): 207, 70, 60, + (52,80,0): 199, 61, 50, + (52,81,0): 192, 56, 42, + (52,82,0): 189, 53, 41, + (52,83,0): 189, 57, 42, + (52,84,0): 191, 61, 45, + (52,85,0): 191, 61, 45, + (52,86,0): 189, 59, 43, + (52,87,0): 189, 60, 41, + (52,88,0): 194, 58, 42, + (52,89,0): 199, 59, 42, + (52,90,0): 207, 59, 47, + (52,91,0): 213, 59, 47, + (52,92,0): 219, 56, 47, + (52,93,0): 224, 56, 47, + (52,94,0): 231, 56, 51, + (52,95,0): 235, 57, 53, + (52,96,0): 231, 56, 53, + (52,97,0): 230, 52, 50, + (52,98,0): 229, 49, 48, + (52,99,0): 232, 50, 49, + (52,100,0): 233, 51, 50, + (52,101,0): 231, 52, 48, + (52,102,0): 222, 49, 43, + (52,103,0): 214, 47, 39, + (52,104,0): 205, 48, 39, + (52,105,0): 205, 54, 45, + (52,106,0): 201, 57, 48, + (52,107,0): 197, 54, 46, + (52,108,0): 194, 51, 45, + (52,109,0): 196, 51, 48, + (52,110,0): 206, 57, 59, + (52,111,0): 222, 62, 64, + (52,112,0): 235, 56, 59, + (52,113,0): 237, 55, 54, + (52,114,0): 228, 55, 49, + (52,115,0): 216, 53, 44, + (52,116,0): 204, 52, 38, + (52,117,0): 198, 53, 34, + (52,118,0): 196, 55, 35, + (52,119,0): 197, 58, 37, + (52,120,0): 203, 61, 41, + (52,121,0): 203, 56, 38, + (52,122,0): 204, 52, 38, + (52,123,0): 206, 53, 39, + (52,124,0): 212, 56, 44, + (52,125,0): 212, 58, 48, + (52,126,0): 211, 57, 47, + (52,127,0): 208, 56, 45, + (52,128,0): 208, 62, 49, + (52,129,0): 202, 59, 45, + (52,130,0): 197, 56, 39, + (52,131,0): 196, 55, 37, + (52,132,0): 198, 57, 39, + (52,133,0): 199, 60, 41, + (52,134,0): 199, 60, 41, + (52,135,0): 199, 58, 40, + (52,136,0): 205, 62, 45, + (52,137,0): 205, 58, 42, + (52,138,0): 216, 62, 50, + (52,139,0): 225, 67, 58, + (52,140,0): 212, 47, 45, + (52,141,0): 228, 58, 58, + (52,142,0): 224, 50, 52, + (52,143,0): 223, 53, 54, + (52,144,0): 215, 53, 51, + (52,145,0): 214, 59, 54, + (52,146,0): 222, 67, 62, + (52,147,0): 229, 75, 67, + (52,148,0): 234, 81, 73, + (52,149,0): 234, 83, 72, + (52,150,0): 232, 84, 72, + (52,151,0): 228, 85, 71, + (52,152,0): 203, 63, 48, + (52,153,0): 196, 63, 46, + (52,154,0): 190, 60, 44, + (52,155,0): 184, 61, 45, + (52,156,0): 183, 62, 45, + (52,157,0): 180, 63, 46, + (52,158,0): 176, 63, 47, + (52,159,0): 174, 62, 48, + (52,160,0): 172, 60, 46, + (52,161,0): 172, 60, 46, + (52,162,0): 172, 60, 46, + (52,163,0): 172, 61, 44, + (52,164,0): 173, 60, 44, + (52,165,0): 177, 61, 46, + (52,166,0): 183, 65, 51, + (52,167,0): 186, 68, 54, + (52,168,0): 198, 76, 65, + (52,169,0): 222, 98, 88, + (52,170,0): 226, 99, 93, + (52,171,0): 240, 110, 108, + (52,172,0): 244, 114, 114, + (52,173,0): 229, 96, 99, + (52,174,0): 229, 96, 101, + (52,175,0): 232, 95, 103, + (52,176,0): 251, 105, 118, + (52,177,0): 254, 109, 122, + (52,178,0): 241, 110, 118, + (52,179,0): 229, 100, 104, + (52,180,0): 234, 98, 102, + (52,181,0): 252, 109, 113, + (52,182,0): 255, 117, 123, + (52,183,0): 255, 118, 124, + (52,184,0): 254, 107, 115, + (52,185,0): 245, 95, 106, + (52,186,0): 232, 71, 87, + (52,187,0): 228, 75, 93, + (52,188,0): 221, 90, 104, + (52,189,0): 226, 137, 141, + (52,190,0): 172, 142, 131, + (52,191,0): 115, 121, 93, + (52,192,0): 93, 114, 73, + (52,193,0): 94, 117, 73, + (52,194,0): 104, 119, 80, + (52,195,0): 129, 136, 102, + (52,196,0): 179, 178, 150, + (52,197,0): 232, 226, 204, + (52,198,0): 255, 250, 233, + (52,199,0): 255, 253, 237, + (52,200,0): 254, 252, 237, + (52,201,0): 251, 255, 240, + (52,202,0): 249, 255, 242, + (52,203,0): 247, 255, 243, + (52,204,0): 244, 255, 241, + (52,205,0): 237, 251, 234, + (52,206,0): 227, 241, 224, + (52,207,0): 218, 237, 215, + (52,208,0): 201, 232, 200, + (52,209,0): 191, 227, 189, + (52,210,0): 187, 221, 186, + (52,211,0): 192, 222, 188, + (52,212,0): 200, 224, 192, + (52,213,0): 207, 226, 196, + (52,214,0): 217, 230, 204, + (52,215,0): 227, 235, 211, + (52,216,0): 235, 239, 216, + (52,217,0): 243, 242, 222, + (52,218,0): 247, 242, 223, + (52,219,0): 242, 235, 217, + (52,220,0): 234, 225, 210, + (52,221,0): 231, 219, 205, + (52,222,0): 233, 221, 207, + (52,223,0): 238, 226, 214, + (52,224,0): 241, 231, 222, + (52,225,0): 240, 231, 224, + (52,226,0): 242, 233, 226, + (53,0,0): 91, 79, 65, + (53,1,0): 91, 79, 65, + (53,2,0): 91, 79, 65, + (53,3,0): 90, 78, 64, + (53,4,0): 90, 78, 64, + (53,5,0): 89, 77, 63, + (53,6,0): 89, 77, 63, + (53,7,0): 89, 77, 63, + (53,8,0): 88, 76, 62, + (53,9,0): 88, 76, 62, + (53,10,0): 87, 75, 61, + (53,11,0): 86, 74, 60, + (53,12,0): 86, 74, 60, + (53,13,0): 87, 75, 61, + (53,14,0): 87, 75, 61, + (53,15,0): 88, 76, 62, + (53,16,0): 81, 73, 62, + (53,17,0): 81, 73, 62, + (53,18,0): 83, 75, 62, + (53,19,0): 85, 76, 59, + (53,20,0): 88, 77, 57, + (53,21,0): 88, 77, 55, + (53,22,0): 89, 76, 57, + (53,23,0): 88, 77, 59, + (53,24,0): 87, 75, 63, + (53,25,0): 85, 76, 71, + (53,26,0): 89, 83, 87, + (53,27,0): 101, 94, 110, + (53,28,0): 110, 106, 131, + (53,29,0): 117, 116, 150, + (53,30,0): 126, 125, 165, + (53,31,0): 131, 134, 177, + (53,32,0): 133, 138, 180, + (53,33,0): 132, 139, 185, + (53,34,0): 135, 141, 193, + (53,35,0): 137, 142, 200, + (53,36,0): 139, 143, 207, + (53,37,0): 140, 143, 212, + (53,38,0): 141, 144, 213, + (53,39,0): 141, 144, 211, + (53,40,0): 144, 148, 211, + (53,41,0): 139, 144, 202, + (53,42,0): 131, 136, 192, + (53,43,0): 126, 129, 184, + (53,44,0): 120, 123, 178, + (53,45,0): 114, 116, 173, + (53,46,0): 108, 110, 171, + (53,47,0): 111, 104, 156, + (53,48,0): 131, 105, 140, + (53,49,0): 148, 98, 123, + (53,50,0): 175, 88, 120, + (53,51,0): 203, 79, 113, + (53,52,0): 227, 65, 102, + (53,53,0): 239, 56, 87, + (53,54,0): 243, 53, 78, + (53,55,0): 244, 58, 72, + (53,56,0): 235, 66, 69, + (53,57,0): 225, 72, 66, + (53,58,0): 217, 76, 66, + (53,59,0): 215, 77, 66, + (53,60,0): 222, 73, 69, + (53,61,0): 229, 69, 71, + (53,62,0): 240, 63, 73, + (53,63,0): 240, 62, 74, + (53,64,0): 228, 67, 72, + (53,65,0): 215, 67, 67, + (53,66,0): 204, 65, 62, + (53,67,0): 206, 73, 68, + (53,68,0): 186, 59, 52, + (53,69,0): 176, 52, 44, + (53,70,0): 201, 73, 64, + (53,71,0): 213, 76, 70, + (53,72,0): 216, 66, 65, + (53,73,0): 218, 63, 61, + (53,74,0): 219, 59, 59, + (53,75,0): 218, 60, 59, + (53,76,0): 216, 64, 61, + (53,77,0): 212, 69, 63, + (53,78,0): 205, 71, 60, + (53,79,0): 203, 71, 58, + (53,80,0): 192, 56, 42, + (53,81,0): 193, 56, 40, + (53,82,0): 192, 56, 42, + (53,83,0): 190, 57, 40, + (53,84,0): 188, 57, 39, + (53,85,0): 187, 56, 38, + (53,86,0): 189, 58, 40, + (53,87,0): 192, 59, 40, + (53,88,0): 196, 59, 41, + (53,89,0): 202, 61, 44, + (53,90,0): 210, 60, 46, + (53,91,0): 215, 59, 46, + (53,92,0): 220, 56, 46, + (53,93,0): 225, 54, 46, + (53,94,0): 228, 54, 47, + (53,95,0): 232, 53, 48, + (53,96,0): 234, 50, 50, + (53,97,0): 234, 46, 47, + (53,98,0): 234, 43, 48, + (53,99,0): 240, 47, 50, + (53,100,0): 246, 51, 55, + (53,101,0): 247, 54, 55, + (53,102,0): 240, 52, 53, + (53,103,0): 230, 50, 49, + (53,104,0): 219, 46, 42, + (53,105,0): 216, 51, 47, + (53,106,0): 215, 53, 50, + (53,107,0): 210, 50, 50, + (53,108,0): 209, 46, 49, + (53,109,0): 211, 46, 52, + (53,110,0): 220, 53, 61, + (53,111,0): 235, 58, 68, + (53,112,0): 237, 48, 54, + (53,113,0): 238, 48, 50, + (53,114,0): 230, 51, 47, + (53,115,0): 220, 51, 44, + (53,116,0): 209, 53, 41, + (53,117,0): 202, 55, 39, + (53,118,0): 200, 57, 40, + (53,119,0): 201, 60, 40, + (53,120,0): 198, 56, 36, + (53,121,0): 201, 54, 36, + (53,122,0): 206, 54, 40, + (53,123,0): 211, 58, 44, + (53,124,0): 218, 62, 50, + (53,125,0): 221, 65, 53, + (53,126,0): 221, 65, 53, + (53,127,0): 216, 65, 54, + (53,128,0): 211, 71, 56, + (53,129,0): 201, 65, 49, + (53,130,0): 194, 59, 40, + (53,131,0): 192, 57, 38, + (53,132,0): 195, 60, 41, + (53,133,0): 198, 61, 42, + (53,134,0): 197, 60, 42, + (53,135,0): 197, 56, 38, + (53,136,0): 204, 58, 43, + (53,137,0): 205, 55, 41, + (53,138,0): 205, 48, 39, + (53,139,0): 230, 67, 60, + (53,140,0): 219, 50, 47, + (53,141,0): 239, 63, 65, + (53,142,0): 227, 47, 50, + (53,143,0): 218, 42, 44, + (53,144,0): 213, 49, 47, + (53,145,0): 210, 53, 46, + (53,146,0): 213, 56, 49, + (53,147,0): 214, 57, 48, + (53,148,0): 210, 56, 46, + (53,149,0): 204, 53, 42, + (53,150,0): 198, 50, 38, + (53,151,0): 192, 49, 35, + (53,152,0): 206, 69, 53, + (53,153,0): 198, 65, 50, + (53,154,0): 188, 61, 46, + (53,155,0): 181, 58, 42, + (53,156,0): 177, 57, 41, + (53,157,0): 175, 57, 43, + (53,158,0): 171, 58, 44, + (53,159,0): 170, 58, 44, + (53,160,0): 171, 59, 47, + (53,161,0): 171, 61, 48, + (53,162,0): 172, 62, 47, + (53,163,0): 172, 60, 46, + (53,164,0): 171, 60, 43, + (53,165,0): 173, 60, 44, + (53,166,0): 178, 62, 47, + (53,167,0): 181, 65, 50, + (53,168,0): 201, 83, 71, + (53,169,0): 224, 103, 94, + (53,170,0): 224, 99, 95, + (53,171,0): 234, 106, 105, + (53,172,0): 238, 110, 111, + (53,173,0): 230, 99, 104, + (53,174,0): 240, 106, 113, + (53,175,0): 246, 110, 120, + (53,176,0): 255, 110, 123, + (53,177,0): 255, 114, 126, + (53,178,0): 241, 112, 117, + (53,179,0): 231, 102, 107, + (53,180,0): 240, 103, 110, + (53,181,0): 255, 116, 122, + (53,182,0): 255, 117, 126, + (53,183,0): 255, 110, 117, + (53,184,0): 253, 103, 112, + (53,185,0): 244, 90, 102, + (53,186,0): 237, 72, 89, + (53,187,0): 229, 72, 91, + (53,188,0): 222, 87, 102, + (53,189,0): 220, 128, 131, + (53,190,0): 180, 146, 134, + (53,191,0): 133, 136, 107, + (53,192,0): 113, 134, 93, + (53,193,0): 111, 137, 90, + (53,194,0): 121, 138, 96, + (53,195,0): 141, 151, 114, + (53,196,0): 182, 183, 152, + (53,197,0): 223, 222, 194, + (53,198,0): 249, 244, 222, + (53,199,0): 252, 250, 229, + (53,200,0): 255, 255, 239, + (53,201,0): 250, 255, 238, + (53,202,0): 244, 255, 238, + (53,203,0): 238, 255, 234, + (53,204,0): 230, 249, 227, + (53,205,0): 220, 239, 217, + (53,206,0): 208, 227, 205, + (53,207,0): 197, 222, 193, + (53,208,0): 178, 213, 173, + (53,209,0): 172, 211, 167, + (53,210,0): 172, 209, 168, + (53,211,0): 178, 210, 171, + (53,212,0): 185, 213, 175, + (53,213,0): 190, 214, 178, + (53,214,0): 201, 218, 186, + (53,215,0): 210, 223, 193, + (53,216,0): 224, 230, 204, + (53,217,0): 232, 234, 212, + (53,218,0): 240, 237, 218, + (53,219,0): 241, 234, 216, + (53,220,0): 236, 227, 212, + (53,221,0): 233, 221, 209, + (53,222,0): 232, 218, 207, + (53,223,0): 234, 220, 211, + (53,224,0): 232, 219, 211, + (53,225,0): 230, 217, 211, + (53,226,0): 229, 216, 210, + (54,0,0): 91, 78, 62, + (54,1,0): 91, 78, 62, + (54,2,0): 91, 78, 62, + (54,3,0): 91, 78, 62, + (54,4,0): 90, 77, 61, + (54,5,0): 90, 77, 61, + (54,6,0): 90, 77, 61, + (54,7,0): 90, 77, 61, + (54,8,0): 89, 76, 60, + (54,9,0): 89, 76, 60, + (54,10,0): 88, 75, 59, + (54,11,0): 88, 75, 59, + (54,12,0): 88, 75, 59, + (54,13,0): 89, 76, 60, + (54,14,0): 89, 76, 60, + (54,15,0): 89, 77, 63, + (54,16,0): 83, 73, 63, + (54,17,0): 84, 74, 62, + (54,18,0): 85, 76, 61, + (54,19,0): 88, 76, 60, + (54,20,0): 89, 78, 58, + (54,21,0): 90, 77, 58, + (54,22,0): 90, 77, 58, + (54,23,0): 89, 78, 60, + (54,24,0): 89, 77, 63, + (54,25,0): 85, 76, 69, + (54,26,0): 88, 79, 82, + (54,27,0): 95, 87, 98, + (54,28,0): 100, 95, 115, + (54,29,0): 106, 102, 129, + (54,30,0): 115, 111, 144, + (54,31,0): 121, 121, 157, + (54,32,0): 122, 128, 164, + (54,33,0): 122, 130, 169, + (54,34,0): 127, 131, 178, + (54,35,0): 130, 133, 188, + (54,36,0): 133, 134, 198, + (54,37,0): 135, 136, 203, + (54,38,0): 136, 137, 204, + (54,39,0): 136, 137, 202, + (54,40,0): 136, 136, 200, + (54,41,0): 131, 131, 191, + (54,42,0): 125, 124, 181, + (54,43,0): 121, 118, 173, + (54,44,0): 115, 112, 167, + (54,45,0): 110, 107, 164, + (54,46,0): 105, 101, 160, + (54,47,0): 111, 95, 142, + (54,48,0): 132, 94, 117, + (54,49,0): 151, 85, 97, + (54,50,0): 179, 78, 96, + (54,51,0): 210, 74, 98, + (54,52,0): 236, 64, 90, + (54,53,0): 246, 54, 79, + (54,54,0): 251, 52, 71, + (54,55,0): 252, 58, 69, + (54,56,0): 240, 64, 64, + (54,57,0): 231, 70, 62, + (54,58,0): 222, 74, 64, + (54,59,0): 219, 75, 66, + (54,60,0): 224, 72, 69, + (54,61,0): 231, 68, 71, + (54,62,0): 240, 63, 73, + (54,63,0): 239, 63, 74, + (54,64,0): 221, 65, 68, + (54,65,0): 212, 70, 68, + (54,66,0): 200, 65, 61, + (54,67,0): 201, 72, 66, + (54,68,0): 180, 58, 47, + (54,69,0): 177, 55, 44, + (54,70,0): 206, 79, 70, + (54,71,0): 201, 66, 60, + (54,72,0): 206, 61, 56, + (54,73,0): 208, 54, 52, + (54,74,0): 207, 49, 48, + (54,75,0): 208, 53, 49, + (54,76,0): 211, 62, 56, + (54,77,0): 207, 69, 59, + (54,78,0): 200, 70, 57, + (54,79,0): 195, 68, 53, + (54,80,0): 190, 57, 40, + (54,81,0): 195, 58, 40, + (54,82,0): 194, 58, 42, + (54,83,0): 191, 58, 39, + (54,84,0): 189, 56, 37, + (54,85,0): 190, 57, 38, + (54,86,0): 191, 58, 39, + (54,87,0): 193, 58, 38, + (54,88,0): 196, 57, 38, + (54,89,0): 203, 58, 41, + (54,90,0): 211, 58, 44, + (54,91,0): 217, 57, 43, + (54,92,0): 221, 55, 43, + (54,93,0): 225, 53, 43, + (54,94,0): 228, 51, 43, + (54,95,0): 234, 51, 45, + (54,96,0): 235, 42, 43, + (54,97,0): 241, 42, 45, + (54,98,0): 248, 45, 51, + (54,99,0): 253, 46, 52, + (54,100,0): 255, 49, 55, + (54,101,0): 255, 50, 55, + (54,102,0): 255, 51, 56, + (54,103,0): 253, 53, 56, + (54,104,0): 250, 55, 59, + (54,105,0): 246, 55, 60, + (54,106,0): 243, 57, 62, + (54,107,0): 243, 56, 65, + (54,108,0): 246, 56, 68, + (54,109,0): 247, 55, 70, + (54,110,0): 252, 53, 72, + (54,111,0): 254, 53, 69, + (54,112,0): 246, 42, 53, + (54,113,0): 244, 45, 50, + (54,114,0): 237, 49, 50, + (54,115,0): 227, 52, 47, + (54,116,0): 217, 54, 45, + (54,117,0): 208, 56, 42, + (54,118,0): 206, 59, 43, + (54,119,0): 206, 61, 44, + (54,120,0): 203, 53, 38, + (54,121,0): 209, 56, 42, + (54,122,0): 217, 59, 47, + (54,123,0): 223, 61, 50, + (54,124,0): 226, 62, 52, + (54,125,0): 228, 61, 52, + (54,126,0): 229, 62, 53, + (54,127,0): 223, 65, 54, + (54,128,0): 217, 74, 60, + (54,129,0): 207, 71, 55, + (54,130,0): 201, 65, 49, + (54,131,0): 196, 60, 44, + (54,132,0): 194, 57, 41, + (54,133,0): 194, 57, 39, + (54,134,0): 198, 56, 42, + (54,135,0): 200, 57, 41, + (54,136,0): 201, 50, 39, + (54,137,0): 211, 57, 47, + (54,138,0): 225, 64, 56, + (54,139,0): 235, 68, 62, + (54,140,0): 222, 48, 47, + (54,141,0): 224, 46, 46, + (54,142,0): 235, 52, 54, + (54,143,0): 232, 54, 54, + (54,144,0): 216, 51, 45, + (54,145,0): 213, 55, 46, + (54,146,0): 215, 57, 48, + (54,147,0): 215, 58, 49, + (54,148,0): 213, 59, 49, + (54,149,0): 210, 59, 48, + (54,150,0): 205, 58, 48, + (54,151,0): 201, 59, 47, + (54,152,0): 214, 76, 63, + (54,153,0): 204, 70, 58, + (54,154,0): 191, 64, 49, + (54,155,0): 180, 57, 42, + (54,156,0): 176, 54, 41, + (54,157,0): 172, 54, 40, + (54,158,0): 171, 55, 42, + (54,159,0): 169, 56, 42, + (54,160,0): 172, 59, 45, + (54,161,0): 173, 61, 47, + (54,162,0): 174, 62, 48, + (54,163,0): 173, 61, 47, + (54,164,0): 171, 60, 43, + (54,165,0): 171, 60, 43, + (54,166,0): 173, 60, 46, + (54,167,0): 177, 61, 48, + (54,168,0): 192, 75, 65, + (54,169,0): 218, 100, 90, + (54,170,0): 222, 99, 94, + (54,171,0): 232, 107, 105, + (54,172,0): 240, 111, 115, + (54,173,0): 234, 105, 110, + (54,174,0): 245, 114, 122, + (54,175,0): 253, 117, 127, + (54,176,0): 241, 101, 112, + (54,177,0): 248, 111, 121, + (54,178,0): 245, 116, 121, + (54,179,0): 237, 111, 115, + (54,180,0): 248, 111, 118, + (54,181,0): 255, 120, 127, + (54,182,0): 255, 116, 125, + (54,183,0): 255, 101, 111, + (54,184,0): 252, 98, 110, + (54,185,0): 242, 84, 98, + (54,186,0): 241, 72, 91, + (54,187,0): 231, 68, 89, + (54,188,0): 222, 81, 97, + (54,189,0): 217, 118, 123, + (54,190,0): 189, 149, 137, + (54,191,0): 152, 153, 122, + (54,192,0): 129, 150, 107, + (54,193,0): 123, 151, 102, + (54,194,0): 130, 149, 104, + (54,195,0): 145, 157, 117, + (54,196,0): 172, 178, 142, + (54,197,0): 203, 204, 173, + (54,198,0): 224, 224, 196, + (54,199,0): 233, 236, 209, + (54,200,0): 236, 244, 220, + (54,201,0): 227, 241, 215, + (54,202,0): 215, 235, 207, + (54,203,0): 205, 228, 199, + (54,204,0): 196, 221, 191, + (54,205,0): 187, 212, 182, + (54,206,0): 180, 203, 174, + (54,207,0): 172, 199, 164, + (54,208,0): 156, 193, 149, + (54,209,0): 152, 194, 144, + (54,210,0): 156, 195, 148, + (54,211,0): 163, 201, 154, + (54,212,0): 170, 203, 158, + (54,213,0): 175, 203, 162, + (54,214,0): 184, 206, 168, + (54,215,0): 194, 211, 177, + (54,216,0): 206, 217, 187, + (54,217,0): 216, 222, 196, + (54,218,0): 228, 227, 206, + (54,219,0): 235, 229, 213, + (54,220,0): 236, 226, 214, + (54,221,0): 233, 219, 210, + (54,222,0): 229, 212, 205, + (54,223,0): 226, 209, 202, + (54,224,0): 223, 205, 201, + (54,225,0): 218, 203, 198, + (54,226,0): 213, 198, 193, + (55,0,0): 91, 78, 62, + (55,1,0): 90, 77, 61, + (55,2,0): 90, 77, 61, + (55,3,0): 90, 77, 61, + (55,4,0): 90, 77, 61, + (55,5,0): 90, 77, 61, + (55,6,0): 89, 76, 60, + (55,7,0): 89, 76, 60, + (55,8,0): 90, 77, 61, + (55,9,0): 89, 76, 60, + (55,10,0): 89, 76, 60, + (55,11,0): 88, 75, 59, + (55,12,0): 88, 75, 59, + (55,13,0): 89, 76, 60, + (55,14,0): 90, 77, 61, + (55,15,0): 90, 76, 63, + (55,16,0): 86, 74, 62, + (55,17,0): 86, 74, 62, + (55,18,0): 88, 76, 62, + (55,19,0): 89, 78, 60, + (55,20,0): 90, 77, 60, + (55,21,0): 90, 77, 58, + (55,22,0): 90, 77, 58, + (55,23,0): 90, 77, 60, + (55,24,0): 91, 79, 65, + (55,25,0): 87, 77, 68, + (55,26,0): 87, 77, 76, + (55,27,0): 92, 82, 90, + (55,28,0): 94, 88, 102, + (55,29,0): 98, 93, 113, + (55,30,0): 106, 102, 127, + (55,31,0): 113, 113, 141, + (55,32,0): 116, 119, 150, + (55,33,0): 116, 122, 156, + (55,34,0): 120, 125, 167, + (55,35,0): 125, 128, 181, + (55,36,0): 129, 129, 191, + (55,37,0): 132, 131, 197, + (55,38,0): 133, 132, 200, + (55,39,0): 135, 132, 199, + (55,40,0): 130, 125, 191, + (55,41,0): 127, 121, 183, + (55,42,0): 125, 116, 173, + (55,43,0): 122, 111, 167, + (55,44,0): 122, 109, 165, + (55,45,0): 120, 105, 162, + (55,46,0): 116, 101, 160, + (55,47,0): 124, 95, 141, + (55,48,0): 133, 79, 93, + (55,49,0): 152, 72, 75, + (55,50,0): 178, 69, 75, + (55,51,0): 211, 71, 82, + (55,52,0): 237, 66, 82, + (55,53,0): 246, 58, 73, + (55,54,0): 252, 54, 67, + (55,55,0): 253, 58, 64, + (55,56,0): 244, 62, 61, + (55,57,0): 235, 66, 59, + (55,58,0): 228, 69, 63, + (55,59,0): 225, 70, 65, + (55,60,0): 227, 69, 66, + (55,61,0): 230, 67, 70, + (55,62,0): 237, 63, 72, + (55,63,0): 234, 64, 73, + (55,64,0): 214, 64, 65, + (55,65,0): 209, 71, 68, + (55,66,0): 197, 65, 60, + (55,67,0): 195, 71, 63, + (55,68,0): 178, 57, 46, + (55,69,0): 179, 58, 47, + (55,70,0): 209, 85, 75, + (55,71,0): 195, 62, 53, + (55,72,0): 201, 56, 51, + (55,73,0): 199, 47, 44, + (55,74,0): 197, 42, 38, + (55,75,0): 200, 47, 42, + (55,76,0): 205, 58, 51, + (55,77,0): 204, 67, 57, + (55,78,0): 195, 67, 54, + (55,79,0): 188, 62, 47, + (55,80,0): 192, 59, 42, + (55,81,0): 196, 59, 41, + (55,82,0): 195, 60, 41, + (55,83,0): 193, 58, 39, + (55,84,0): 194, 59, 40, + (55,85,0): 195, 60, 41, + (55,86,0): 194, 59, 39, + (55,87,0): 195, 56, 37, + (55,88,0): 196, 53, 36, + (55,89,0): 202, 55, 37, + (55,90,0): 212, 56, 41, + (55,91,0): 217, 55, 42, + (55,92,0): 221, 53, 42, + (55,93,0): 225, 51, 42, + (55,94,0): 229, 51, 41, + (55,95,0): 234, 50, 42, + (55,96,0): 245, 51, 51, + (55,97,0): 254, 54, 56, + (55,98,0): 255, 56, 60, + (55,99,0): 255, 52, 58, + (55,100,0): 255, 45, 50, + (55,101,0): 255, 40, 45, + (55,102,0): 255, 40, 45, + (55,103,0): 254, 43, 49, + (55,104,0): 254, 45, 51, + (55,105,0): 246, 41, 48, + (55,106,0): 242, 38, 49, + (55,107,0): 247, 41, 54, + (55,108,0): 255, 44, 63, + (55,109,0): 255, 42, 65, + (55,110,0): 252, 32, 57, + (55,111,0): 244, 25, 47, + (55,112,0): 246, 34, 48, + (55,113,0): 243, 40, 46, + (55,114,0): 237, 44, 49, + (55,115,0): 230, 48, 47, + (55,116,0): 218, 49, 44, + (55,117,0): 212, 51, 43, + (55,118,0): 209, 53, 41, + (55,119,0): 208, 54, 42, + (55,120,0): 212, 54, 43, + (55,121,0): 221, 57, 48, + (55,122,0): 230, 61, 54, + (55,123,0): 235, 62, 55, + (55,124,0): 235, 58, 52, + (55,125,0): 232, 55, 49, + (55,126,0): 232, 53, 48, + (55,127,0): 226, 57, 50, + (55,128,0): 223, 72, 61, + (55,129,0): 215, 75, 60, + (55,130,0): 211, 69, 55, + (55,131,0): 203, 61, 47, + (55,132,0): 196, 54, 40, + (55,133,0): 194, 51, 37, + (55,134,0): 200, 54, 41, + (55,135,0): 207, 56, 45, + (55,136,0): 206, 52, 42, + (55,137,0): 212, 54, 45, + (55,138,0): 230, 67, 60, + (55,139,0): 223, 56, 50, + (55,140,0): 224, 50, 49, + (55,141,0): 210, 32, 32, + (55,142,0): 236, 56, 57, + (55,143,0): 229, 54, 51, + (55,144,0): 213, 49, 40, + (55,145,0): 210, 52, 41, + (55,146,0): 210, 52, 41, + (55,147,0): 207, 53, 41, + (55,148,0): 206, 54, 43, + (55,149,0): 202, 54, 42, + (55,150,0): 200, 53, 43, + (55,151,0): 197, 55, 43, + (55,152,0): 227, 89, 78, + (55,153,0): 216, 82, 70, + (55,154,0): 202, 72, 59, + (55,155,0): 190, 64, 50, + (55,156,0): 183, 59, 47, + (55,157,0): 181, 59, 46, + (55,158,0): 181, 60, 49, + (55,159,0): 181, 60, 49, + (55,160,0): 175, 57, 45, + (55,161,0): 177, 59, 47, + (55,162,0): 177, 61, 48, + (55,163,0): 177, 61, 46, + (55,164,0): 175, 59, 44, + (55,165,0): 173, 57, 42, + (55,166,0): 173, 57, 44, + (55,167,0): 174, 58, 45, + (55,168,0): 177, 60, 50, + (55,169,0): 208, 89, 81, + (55,170,0): 220, 98, 93, + (55,171,0): 236, 112, 112, + (55,172,0): 244, 118, 121, + (55,173,0): 238, 109, 114, + (55,174,0): 245, 113, 124, + (55,175,0): 248, 114, 125, + (55,176,0): 255, 121, 131, + (55,177,0): 255, 127, 137, + (55,178,0): 250, 124, 128, + (55,179,0): 235, 109, 113, + (55,180,0): 241, 104, 112, + (55,181,0): 255, 114, 124, + (55,182,0): 255, 115, 127, + (55,183,0): 255, 105, 116, + (55,184,0): 250, 92, 106, + (55,185,0): 243, 80, 97, + (55,186,0): 245, 71, 94, + (55,187,0): 232, 64, 87, + (55,188,0): 220, 78, 94, + (55,189,0): 215, 112, 116, + (55,190,0): 196, 152, 139, + (55,191,0): 164, 163, 132, + (55,192,0): 134, 156, 110, + (55,193,0): 126, 154, 103, + (55,194,0): 129, 151, 104, + (55,195,0): 141, 156, 113, + (55,196,0): 161, 169, 130, + (55,197,0): 180, 186, 150, + (55,198,0): 200, 205, 173, + (55,199,0): 213, 220, 189, + (55,200,0): 202, 215, 185, + (55,201,0): 191, 210, 178, + (55,202,0): 176, 202, 167, + (55,203,0): 166, 193, 158, + (55,204,0): 157, 187, 151, + (55,205,0): 154, 182, 144, + (55,206,0): 150, 178, 140, + (55,207,0): 145, 176, 134, + (55,208,0): 140, 180, 130, + (55,209,0): 138, 181, 127, + (55,210,0): 143, 186, 133, + (55,211,0): 152, 192, 140, + (55,212,0): 158, 195, 144, + (55,213,0): 162, 196, 146, + (55,214,0): 170, 197, 154, + (55,215,0): 179, 201, 162, + (55,216,0): 190, 206, 170, + (55,217,0): 201, 210, 181, + (55,218,0): 216, 218, 196, + (55,219,0): 227, 224, 205, + (55,220,0): 232, 222, 210, + (55,221,0): 230, 216, 207, + (55,222,0): 223, 205, 201, + (55,223,0): 218, 199, 195, + (55,224,0): 211, 193, 189, + (55,225,0): 206, 188, 184, + (55,226,0): 200, 182, 180, + (56,0,0): 90, 77, 61, + (56,1,0): 90, 77, 61, + (56,2,0): 90, 77, 61, + (56,3,0): 90, 77, 61, + (56,4,0): 90, 77, 61, + (56,5,0): 90, 77, 61, + (56,6,0): 90, 77, 61, + (56,7,0): 90, 77, 61, + (56,8,0): 88, 75, 59, + (56,9,0): 88, 75, 59, + (56,10,0): 88, 75, 59, + (56,11,0): 89, 76, 60, + (56,12,0): 89, 76, 60, + (56,13,0): 90, 77, 61, + (56,14,0): 90, 77, 61, + (56,15,0): 90, 77, 61, + (56,16,0): 90, 76, 63, + (56,17,0): 90, 76, 63, + (56,18,0): 90, 77, 61, + (56,19,0): 91, 78, 61, + (56,20,0): 93, 77, 61, + (56,21,0): 94, 79, 60, + (56,22,0): 92, 79, 60, + (56,23,0): 92, 79, 62, + (56,24,0): 89, 77, 61, + (56,25,0): 87, 77, 67, + (56,26,0): 87, 76, 72, + (56,27,0): 88, 78, 79, + (56,28,0): 90, 80, 88, + (56,29,0): 93, 85, 98, + (56,30,0): 96, 89, 105, + (56,31,0): 96, 93, 114, + (56,32,0): 103, 103, 129, + (56,33,0): 106, 109, 142, + (56,34,0): 112, 114, 155, + (56,35,0): 114, 116, 167, + (56,36,0): 120, 119, 179, + (56,37,0): 129, 126, 193, + (56,38,0): 137, 131, 201, + (56,39,0): 138, 131, 199, + (56,40,0): 137, 126, 192, + (56,41,0): 140, 126, 188, + (56,42,0): 138, 120, 178, + (56,43,0): 135, 112, 168, + (56,44,0): 139, 112, 167, + (56,45,0): 145, 114, 171, + (56,46,0): 139, 106, 163, + (56,47,0): 137, 90, 132, + (56,48,0): 143, 71, 82, + (56,49,0): 161, 66, 60, + (56,50,0): 179, 65, 64, + (56,51,0): 202, 68, 67, + (56,52,0): 220, 64, 67, + (56,53,0): 231, 58, 62, + (56,54,0): 243, 60, 62, + (56,55,0): 254, 68, 69, + (56,56,0): 246, 62, 60, + (56,57,0): 241, 62, 58, + (56,58,0): 236, 62, 61, + (56,59,0): 233, 65, 64, + (56,60,0): 233, 67, 67, + (56,61,0): 233, 68, 72, + (56,62,0): 233, 66, 73, + (56,63,0): 226, 67, 72, + (56,64,0): 207, 63, 62, + (56,65,0): 197, 64, 57, + (56,66,0): 190, 63, 54, + (56,67,0): 183, 62, 51, + (56,68,0): 176, 60, 47, + (56,69,0): 178, 60, 48, + (56,70,0): 192, 68, 56, + (56,71,0): 210, 77, 68, + (56,72,0): 199, 54, 49, + (56,73,0): 212, 59, 54, + (56,74,0): 205, 50, 46, + (56,75,0): 204, 51, 46, + (56,76,0): 214, 67, 59, + (56,77,0): 199, 63, 51, + (56,78,0): 181, 54, 39, + (56,79,0): 187, 62, 44, + (56,80,0): 186, 55, 37, + (56,81,0): 193, 58, 39, + (56,82,0): 195, 60, 41, + (56,83,0): 194, 59, 40, + (56,84,0): 192, 57, 37, + (56,85,0): 194, 57, 38, + (56,86,0): 197, 58, 39, + (56,87,0): 199, 58, 40, + (56,88,0): 203, 58, 39, + (56,89,0): 208, 57, 40, + (56,90,0): 214, 54, 40, + (56,91,0): 216, 50, 36, + (56,92,0): 218, 46, 34, + (56,93,0): 224, 47, 37, + (56,94,0): 236, 55, 46, + (56,95,0): 245, 61, 53, + (56,96,0): 246, 57, 51, + (56,97,0): 247, 54, 49, + (56,98,0): 248, 49, 46, + (56,99,0): 249, 43, 43, + (56,100,0): 250, 40, 41, + (56,101,0): 252, 38, 40, + (56,102,0): 252, 38, 40, + (56,103,0): 252, 38, 40, + (56,104,0): 251, 38, 42, + (56,105,0): 247, 33, 41, + (56,106,0): 248, 34, 46, + (56,107,0): 255, 39, 55, + (56,108,0): 255, 41, 62, + (56,109,0): 255, 33, 59, + (56,110,0): 255, 24, 54, + (56,111,0): 255, 23, 49, + (56,112,0): 254, 37, 54, + (56,113,0): 238, 34, 43, + (56,114,0): 229, 34, 42, + (56,115,0): 227, 43, 45, + (56,116,0): 221, 45, 45, + (56,117,0): 211, 42, 39, + (56,118,0): 209, 44, 40, + (56,119,0): 218, 50, 47, + (56,120,0): 226, 54, 50, + (56,121,0): 232, 54, 52, + (56,122,0): 238, 54, 54, + (56,123,0): 242, 54, 53, + (56,124,0): 242, 49, 50, + (56,125,0): 239, 46, 47, + (56,126,0): 238, 44, 44, + (56,127,0): 229, 47, 44, + (56,128,0): 220, 57, 50, + (56,129,0): 209, 58, 49, + (56,130,0): 210, 57, 49, + (56,131,0): 236, 83, 75, + (56,132,0): 187, 34, 26, + (56,133,0): 196, 43, 35, + (56,134,0): 223, 70, 62, + (56,135,0): 200, 46, 38, + (56,136,0): 205, 46, 40, + (56,137,0): 222, 60, 55, + (56,138,0): 232, 69, 64, + (56,139,0): 226, 58, 55, + (56,140,0): 216, 47, 42, + (56,141,0): 218, 46, 42, + (56,142,0): 226, 53, 49, + (56,143,0): 229, 60, 55, + (56,144,0): 223, 62, 52, + (56,145,0): 213, 60, 46, + (56,146,0): 207, 53, 41, + (56,147,0): 203, 51, 38, + (56,148,0): 204, 53, 42, + (56,149,0): 205, 59, 46, + (56,150,0): 203, 59, 48, + (56,151,0): 197, 56, 46, + (56,152,0): 236, 98, 88, + (56,153,0): 224, 90, 79, + (56,154,0): 200, 67, 58, + (56,155,0): 185, 54, 44, + (56,156,0): 186, 58, 47, + (56,157,0): 184, 56, 45, + (56,158,0): 177, 51, 39, + (56,159,0): 180, 54, 42, + (56,160,0): 176, 48, 37, + (56,161,0): 176, 50, 38, + (56,162,0): 174, 50, 38, + (56,163,0): 175, 52, 37, + (56,164,0): 176, 54, 39, + (56,165,0): 178, 58, 42, + (56,166,0): 180, 60, 46, + (56,167,0): 179, 61, 49, + (56,168,0): 176, 58, 48, + (56,169,0): 186, 67, 59, + (56,170,0): 214, 92, 87, + (56,171,0): 236, 112, 112, + (56,172,0): 241, 115, 118, + (56,173,0): 246, 120, 124, + (56,174,0): 251, 121, 131, + (56,175,0): 245, 113, 124, + (56,176,0): 255, 122, 132, + (56,177,0): 253, 119, 128, + (56,178,0): 242, 117, 123, + (56,179,0): 244, 118, 122, + (56,180,0): 253, 116, 124, + (56,181,0): 255, 114, 124, + (56,182,0): 255, 107, 120, + (56,183,0): 255, 100, 115, + (56,184,0): 255, 94, 110, + (56,185,0): 241, 74, 92, + (56,186,0): 245, 69, 92, + (56,187,0): 239, 70, 91, + (56,188,0): 217, 70, 86, + (56,189,0): 208, 103, 107, + (56,190,0): 190, 144, 128, + (56,191,0): 158, 155, 122, + (56,192,0): 134, 156, 109, + (56,193,0): 125, 153, 102, + (56,194,0): 126, 148, 99, + (56,195,0): 135, 151, 106, + (56,196,0): 148, 159, 119, + (56,197,0): 158, 166, 129, + (56,198,0): 160, 168, 131, + (56,199,0): 156, 168, 132, + (56,200,0): 146, 163, 127, + (56,201,0): 138, 163, 124, + (56,202,0): 128, 159, 118, + (56,203,0): 122, 154, 113, + (56,204,0): 121, 154, 111, + (56,205,0): 124, 157, 114, + (56,206,0): 129, 160, 118, + (56,207,0): 131, 164, 117, + (56,208,0): 132, 172, 119, + (56,209,0): 134, 177, 121, + (56,210,0): 140, 183, 127, + (56,211,0): 147, 188, 132, + (56,212,0): 149, 190, 134, + (56,213,0): 152, 189, 135, + (56,214,0): 157, 189, 140, + (56,215,0): 162, 189, 144, + (56,216,0): 167, 188, 147, + (56,217,0): 175, 189, 154, + (56,218,0): 189, 195, 167, + (56,219,0): 206, 205, 185, + (56,220,0): 220, 212, 199, + (56,221,0): 224, 211, 202, + (56,222,0): 218, 200, 196, + (56,223,0): 211, 192, 188, + (56,224,0): 203, 185, 183, + (56,225,0): 192, 177, 174, + (56,226,0): 184, 168, 168, + (57,0,0): 90, 77, 61, + (57,1,0): 90, 77, 61, + (57,2,0): 90, 77, 61, + (57,3,0): 90, 77, 61, + (57,4,0): 90, 77, 61, + (57,5,0): 90, 77, 61, + (57,6,0): 90, 77, 61, + (57,7,0): 90, 77, 61, + (57,8,0): 88, 75, 59, + (57,9,0): 88, 75, 59, + (57,10,0): 88, 75, 59, + (57,11,0): 89, 76, 60, + (57,12,0): 89, 76, 60, + (57,13,0): 90, 77, 61, + (57,14,0): 90, 77, 61, + (57,15,0): 90, 77, 61, + (57,16,0): 90, 76, 63, + (57,17,0): 90, 77, 61, + (57,18,0): 92, 76, 61, + (57,19,0): 93, 77, 61, + (57,20,0): 93, 78, 59, + (57,21,0): 94, 79, 60, + (57,22,0): 92, 79, 60, + (57,23,0): 92, 79, 62, + (57,24,0): 93, 80, 64, + (57,25,0): 91, 79, 67, + (57,26,0): 91, 78, 70, + (57,27,0): 89, 78, 74, + (57,28,0): 90, 80, 81, + (57,29,0): 92, 83, 88, + (57,30,0): 95, 85, 94, + (57,31,0): 94, 88, 102, + (57,32,0): 97, 93, 116, + (57,33,0): 101, 100, 131, + (57,34,0): 107, 105, 145, + (57,35,0): 110, 108, 157, + (57,36,0): 117, 113, 172, + (57,37,0): 127, 122, 188, + (57,38,0): 135, 128, 196, + (57,39,0): 139, 128, 196, + (57,40,0): 143, 128, 193, + (57,41,0): 145, 125, 186, + (57,42,0): 143, 116, 171, + (57,43,0): 143, 108, 162, + (57,44,0): 154, 111, 164, + (57,45,0): 165, 115, 168, + (57,46,0): 158, 103, 158, + (57,47,0): 154, 86, 125, + (57,48,0): 156, 61, 69, + (57,49,0): 166, 55, 46, + (57,50,0): 175, 54, 46, + (57,51,0): 192, 61, 53, + (57,52,0): 208, 65, 59, + (57,53,0): 218, 63, 58, + (57,54,0): 231, 64, 58, + (57,55,0): 243, 65, 61, + (57,56,0): 245, 61, 61, + (57,57,0): 245, 59, 60, + (57,58,0): 244, 60, 62, + (57,59,0): 241, 62, 65, + (57,60,0): 236, 66, 69, + (57,61,0): 231, 66, 70, + (57,62,0): 225, 66, 70, + (57,63,0): 216, 66, 67, + (57,64,0): 199, 60, 55, + (57,65,0): 189, 61, 52, + (57,66,0): 182, 60, 49, + (57,67,0): 177, 59, 47, + (57,68,0): 171, 58, 44, + (57,69,0): 174, 58, 43, + (57,70,0): 189, 65, 53, + (57,71,0): 208, 74, 65, + (57,72,0): 218, 71, 64, + (57,73,0): 220, 65, 61, + (57,74,0): 212, 54, 51, + (57,75,0): 208, 53, 49, + (57,76,0): 213, 64, 57, + (57,77,0): 205, 67, 56, + (57,78,0): 187, 57, 43, + (57,79,0): 178, 53, 35, + (57,80,0): 189, 56, 39, + (57,81,0): 194, 59, 40, + (57,82,0): 196, 61, 42, + (57,83,0): 196, 61, 42, + (57,84,0): 196, 59, 40, + (57,85,0): 198, 59, 40, + (57,86,0): 199, 58, 40, + (57,87,0): 202, 57, 40, + (57,88,0): 207, 57, 40, + (57,89,0): 207, 54, 38, + (57,90,0): 212, 50, 37, + (57,91,0): 218, 50, 37, + (57,92,0): 227, 53, 42, + (57,93,0): 234, 56, 46, + (57,94,0): 239, 56, 48, + (57,95,0): 240, 57, 49, + (57,96,0): 231, 50, 39, + (57,97,0): 231, 49, 38, + (57,98,0): 235, 47, 38, + (57,99,0): 240, 45, 39, + (57,100,0): 246, 44, 40, + (57,101,0): 250, 45, 42, + (57,102,0): 254, 46, 44, + (57,103,0): 255, 46, 47, + (57,104,0): 251, 42, 45, + (57,105,0): 248, 37, 43, + (57,106,0): 250, 36, 46, + (57,107,0): 255, 39, 55, + (57,108,0): 255, 37, 59, + (57,109,0): 255, 29, 55, + (57,110,0): 255, 20, 51, + (57,111,0): 252, 19, 48, + (57,112,0): 244, 29, 47, + (57,113,0): 245, 45, 56, + (57,114,0): 244, 50, 59, + (57,115,0): 228, 41, 48, + (57,116,0): 218, 39, 43, + (57,117,0): 219, 45, 47, + (57,118,0): 221, 47, 49, + (57,119,0): 218, 42, 45, + (57,120,0): 241, 58, 62, + (57,121,0): 244, 55, 61, + (57,122,0): 247, 52, 58, + (57,123,0): 246, 50, 54, + (57,124,0): 246, 47, 52, + (57,125,0): 248, 48, 51, + (57,126,0): 249, 50, 53, + (57,127,0): 244, 56, 55, + (57,128,0): 219, 50, 45, + (57,129,0): 218, 59, 53, + (57,130,0): 215, 56, 50, + (57,131,0): 228, 69, 63, + (57,132,0): 228, 69, 63, + (57,133,0): 206, 47, 43, + (57,134,0): 209, 50, 46, + (57,135,0): 193, 34, 30, + (57,136,0): 212, 53, 49, + (57,137,0): 225, 63, 58, + (57,138,0): 232, 69, 64, + (57,139,0): 224, 61, 56, + (57,140,0): 216, 51, 45, + (57,141,0): 217, 50, 44, + (57,142,0): 221, 54, 48, + (57,143,0): 221, 58, 49, + (57,144,0): 212, 58, 46, + (57,145,0): 207, 57, 42, + (57,146,0): 201, 53, 39, + (57,147,0): 199, 53, 40, + (57,148,0): 200, 57, 43, + (57,149,0): 202, 60, 48, + (57,150,0): 202, 60, 50, + (57,151,0): 198, 57, 47, + (57,152,0): 237, 99, 89, + (57,153,0): 225, 88, 78, + (57,154,0): 201, 64, 56, + (57,155,0): 186, 52, 43, + (57,156,0): 194, 57, 49, + (57,157,0): 195, 58, 48, + (57,158,0): 191, 54, 44, + (57,159,0): 194, 57, 47, + (57,160,0): 191, 53, 43, + (57,161,0): 190, 52, 42, + (57,162,0): 189, 52, 42, + (57,163,0): 187, 53, 41, + (57,164,0): 184, 54, 41, + (57,165,0): 181, 53, 40, + (57,166,0): 180, 54, 40, + (57,167,0): 176, 54, 41, + (57,168,0): 180, 59, 48, + (57,169,0): 187, 66, 57, + (57,170,0): 211, 89, 84, + (57,171,0): 232, 108, 106, + (57,172,0): 239, 113, 116, + (57,173,0): 246, 120, 124, + (57,174,0): 254, 124, 132, + (57,175,0): 249, 117, 128, + (57,176,0): 255, 122, 132, + (57,177,0): 253, 119, 128, + (57,178,0): 244, 119, 125, + (57,179,0): 245, 118, 125, + (57,180,0): 254, 117, 125, + (57,181,0): 255, 111, 123, + (57,182,0): 255, 104, 118, + (57,183,0): 255, 97, 113, + (57,184,0): 255, 93, 110, + (57,185,0): 242, 75, 93, + (57,186,0): 246, 68, 92, + (57,187,0): 242, 70, 92, + (57,188,0): 221, 73, 89, + (57,189,0): 208, 102, 104, + (57,190,0): 183, 138, 119, + (57,191,0): 149, 146, 111, + (57,192,0): 127, 147, 98, + (57,193,0): 117, 146, 92, + (57,194,0): 120, 142, 93, + (57,195,0): 127, 144, 99, + (57,196,0): 138, 149, 107, + (57,197,0): 141, 152, 112, + (57,198,0): 139, 149, 112, + (57,199,0): 133, 148, 109, + (57,200,0): 112, 135, 93, + (57,201,0): 108, 137, 93, + (57,202,0): 104, 137, 92, + (57,203,0): 103, 141, 94, + (57,204,0): 107, 143, 95, + (57,205,0): 113, 149, 101, + (57,206,0): 121, 155, 105, + (57,207,0): 124, 158, 107, + (57,208,0): 132, 171, 116, + (57,209,0): 133, 177, 118, + (57,210,0): 139, 183, 124, + (57,211,0): 142, 186, 125, + (57,212,0): 146, 187, 127, + (57,213,0): 148, 187, 130, + (57,214,0): 151, 188, 134, + (57,215,0): 155, 187, 137, + (57,216,0): 155, 181, 134, + (57,217,0): 161, 179, 139, + (57,218,0): 172, 183, 151, + (57,219,0): 188, 190, 168, + (57,220,0): 205, 199, 183, + (57,221,0): 213, 200, 191, + (57,222,0): 212, 195, 188, + (57,223,0): 206, 188, 186, + (57,224,0): 197, 181, 181, + (57,225,0): 186, 172, 172, + (57,226,0): 177, 163, 163, + (58,0,0): 92, 76, 60, + (58,1,0): 92, 76, 60, + (58,2,0): 92, 76, 60, + (58,3,0): 92, 76, 60, + (58,4,0): 92, 76, 60, + (58,5,0): 92, 76, 60, + (58,6,0): 92, 76, 60, + (58,7,0): 92, 76, 60, + (58,8,0): 90, 74, 58, + (58,9,0): 90, 74, 58, + (58,10,0): 90, 74, 58, + (58,11,0): 91, 75, 59, + (58,12,0): 91, 75, 59, + (58,13,0): 92, 76, 60, + (58,14,0): 92, 76, 60, + (58,15,0): 92, 76, 60, + (58,16,0): 92, 76, 61, + (58,17,0): 92, 76, 61, + (58,18,0): 93, 75, 61, + (58,19,0): 93, 77, 61, + (58,20,0): 93, 78, 59, + (58,21,0): 94, 79, 60, + (58,22,0): 94, 79, 60, + (58,23,0): 92, 79, 60, + (58,24,0): 95, 82, 65, + (58,25,0): 93, 81, 65, + (58,26,0): 92, 80, 68, + (58,27,0): 91, 78, 70, + (58,28,0): 90, 79, 75, + (58,29,0): 91, 80, 78, + (58,30,0): 93, 81, 83, + (58,31,0): 92, 82, 90, + (58,32,0): 93, 84, 103, + (58,33,0): 98, 89, 118, + (58,34,0): 101, 95, 133, + (58,35,0): 105, 99, 145, + (58,36,0): 113, 108, 164, + (58,37,0): 125, 119, 181, + (58,38,0): 132, 126, 190, + (58,39,0): 137, 125, 189, + (58,40,0): 152, 132, 193, + (58,41,0): 155, 128, 183, + (58,42,0): 156, 118, 169, + (58,43,0): 160, 111, 158, + (58,44,0): 177, 115, 162, + (58,45,0): 189, 117, 165, + (58,46,0): 183, 104, 152, + (58,47,0): 177, 81, 118, + (58,48,0): 181, 61, 70, + (58,49,0): 186, 54, 49, + (58,50,0): 182, 54, 45, + (58,51,0): 189, 61, 50, + (58,52,0): 200, 68, 56, + (58,53,0): 210, 69, 59, + (58,54,0): 219, 66, 58, + (58,55,0): 228, 63, 57, + (58,56,0): 241, 61, 62, + (58,57,0): 247, 58, 62, + (58,58,0): 249, 58, 63, + (58,59,0): 247, 61, 66, + (58,60,0): 239, 64, 69, + (58,61,0): 229, 66, 69, + (58,62,0): 215, 65, 66, + (58,63,0): 205, 66, 63, + (58,64,0): 192, 59, 52, + (58,65,0): 184, 57, 48, + (58,66,0): 177, 57, 43, + (58,67,0): 173, 57, 42, + (58,68,0): 169, 56, 40, + (58,69,0): 173, 57, 42, + (58,70,0): 187, 63, 51, + (58,71,0): 207, 70, 60, + (58,72,0): 217, 68, 62, + (58,73,0): 215, 57, 54, + (58,74,0): 217, 55, 52, + (58,75,0): 218, 59, 55, + (58,76,0): 220, 67, 61, + (58,77,0): 221, 79, 69, + (58,78,0): 206, 72, 60, + (58,79,0): 181, 51, 35, + (58,80,0): 190, 57, 40, + (58,81,0): 193, 58, 39, + (58,82,0): 196, 59, 41, + (58,83,0): 198, 61, 43, + (58,84,0): 201, 61, 44, + (58,85,0): 200, 60, 43, + (58,86,0): 201, 58, 41, + (58,87,0): 204, 57, 41, + (58,88,0): 207, 55, 41, + (58,89,0): 207, 50, 35, + (58,90,0): 211, 47, 35, + (58,91,0): 223, 52, 42, + (58,92,0): 238, 61, 51, + (58,93,0): 244, 63, 54, + (58,94,0): 241, 57, 49, + (58,95,0): 233, 52, 43, + (58,96,0): 224, 54, 39, + (58,97,0): 221, 54, 38, + (58,98,0): 226, 50, 37, + (58,99,0): 230, 48, 37, + (58,100,0): 234, 46, 37, + (58,101,0): 238, 45, 38, + (58,102,0): 239, 44, 40, + (58,103,0): 242, 44, 41, + (58,104,0): 242, 44, 45, + (58,105,0): 239, 40, 43, + (58,106,0): 240, 39, 47, + (58,107,0): 247, 41, 54, + (58,108,0): 253, 37, 58, + (58,109,0): 252, 30, 55, + (58,110,0): 251, 22, 51, + (58,111,0): 248, 24, 51, + (58,112,0): 244, 37, 55, + (58,113,0): 241, 47, 58, + (58,114,0): 242, 52, 64, + (58,115,0): 239, 53, 64, + (58,116,0): 238, 57, 66, + (58,117,0): 238, 58, 67, + (58,118,0): 233, 53, 62, + (58,119,0): 229, 45, 55, + (58,120,0): 240, 50, 60, + (58,121,0): 243, 47, 59, + (58,122,0): 246, 46, 57, + (58,123,0): 246, 45, 55, + (58,124,0): 245, 46, 51, + (58,125,0): 245, 46, 49, + (58,126,0): 243, 47, 49, + (58,127,0): 237, 52, 50, + (58,128,0): 220, 48, 44, + (58,129,0): 226, 61, 57, + (58,130,0): 218, 54, 52, + (58,131,0): 223, 59, 57, + (58,132,0): 255, 109, 106, + (58,133,0): 229, 67, 65, + (58,134,0): 209, 47, 45, + (58,135,0): 206, 47, 44, + (58,136,0): 217, 58, 55, + (58,137,0): 223, 64, 60, + (58,138,0): 224, 65, 59, + (58,139,0): 219, 60, 54, + (58,140,0): 213, 55, 46, + (58,141,0): 214, 53, 45, + (58,142,0): 214, 53, 43, + (58,143,0): 210, 54, 42, + (58,144,0): 200, 54, 39, + (58,145,0): 195, 54, 37, + (58,146,0): 194, 54, 39, + (58,147,0): 196, 56, 41, + (58,148,0): 197, 59, 46, + (58,149,0): 198, 60, 49, + (58,150,0): 198, 60, 49, + (58,151,0): 197, 59, 49, + (58,152,0): 235, 96, 89, + (58,153,0): 225, 84, 77, + (58,154,0): 201, 60, 51, + (58,155,0): 191, 48, 40, + (58,156,0): 203, 59, 51, + (58,157,0): 209, 62, 54, + (58,158,0): 206, 59, 51, + (58,159,0): 210, 61, 54, + (58,160,0): 216, 61, 56, + (58,161,0): 215, 60, 55, + (58,162,0): 212, 61, 54, + (58,163,0): 207, 60, 50, + (58,164,0): 201, 59, 49, + (58,165,0): 195, 57, 46, + (58,166,0): 188, 54, 42, + (58,167,0): 182, 54, 41, + (58,168,0): 185, 59, 47, + (58,169,0): 188, 64, 54, + (58,170,0): 207, 84, 77, + (58,171,0): 227, 103, 101, + (58,172,0): 237, 111, 114, + (58,173,0): 248, 122, 126, + (58,174,0): 255, 129, 136, + (58,175,0): 253, 123, 131, + (58,176,0): 255, 122, 131, + (58,177,0): 252, 121, 129, + (58,178,0): 245, 122, 127, + (58,179,0): 246, 121, 127, + (58,180,0): 254, 117, 127, + (58,181,0): 255, 110, 124, + (58,182,0): 255, 99, 117, + (58,183,0): 255, 92, 111, + (58,184,0): 255, 89, 109, + (58,185,0): 242, 73, 94, + (58,186,0): 245, 65, 90, + (58,187,0): 242, 70, 92, + (58,188,0): 224, 76, 90, + (58,189,0): 203, 97, 97, + (58,190,0): 167, 122, 101, + (58,191,0): 130, 128, 90, + (58,192,0): 110, 130, 81, + (58,193,0): 104, 133, 79, + (58,194,0): 109, 131, 82, + (58,195,0): 116, 133, 88, + (58,196,0): 123, 136, 93, + (58,197,0): 125, 136, 94, + (58,198,0): 120, 132, 92, + (58,199,0): 113, 130, 88, + (58,200,0): 96, 122, 77, + (58,201,0): 95, 127, 80, + (58,202,0): 97, 133, 85, + (58,203,0): 101, 141, 89, + (58,204,0): 110, 149, 96, + (58,205,0): 117, 156, 103, + (58,206,0): 125, 160, 106, + (58,207,0): 128, 163, 109, + (58,208,0): 132, 171, 114, + (58,209,0): 135, 176, 116, + (58,210,0): 139, 180, 120, + (58,211,0): 142, 184, 121, + (58,212,0): 140, 184, 121, + (58,213,0): 143, 185, 122, + (58,214,0): 146, 186, 126, + (58,215,0): 148, 186, 129, + (58,216,0): 147, 177, 127, + (58,217,0): 149, 172, 128, + (58,218,0): 154, 170, 134, + (58,219,0): 168, 174, 146, + (58,220,0): 184, 181, 162, + (58,221,0): 196, 186, 174, + (58,222,0): 200, 185, 178, + (58,223,0): 198, 183, 180, + (58,224,0): 183, 171, 173, + (58,225,0): 169, 160, 165, + (58,226,0): 159, 150, 155, + (59,0,0): 91, 75, 59, + (59,1,0): 91, 75, 59, + (59,2,0): 91, 75, 59, + (59,3,0): 91, 75, 59, + (59,4,0): 91, 75, 59, + (59,5,0): 91, 75, 59, + (59,6,0): 91, 75, 59, + (59,7,0): 91, 75, 59, + (59,8,0): 90, 74, 58, + (59,9,0): 90, 74, 58, + (59,10,0): 90, 74, 58, + (59,11,0): 91, 75, 59, + (59,12,0): 91, 75, 59, + (59,13,0): 92, 76, 60, + (59,14,0): 92, 76, 60, + (59,15,0): 92, 76, 60, + (59,16,0): 93, 75, 61, + (59,17,0): 93, 75, 61, + (59,18,0): 93, 76, 60, + (59,19,0): 94, 77, 61, + (59,20,0): 94, 77, 59, + (59,21,0): 94, 79, 60, + (59,22,0): 94, 79, 60, + (59,23,0): 94, 79, 60, + (59,24,0): 94, 81, 64, + (59,25,0): 94, 81, 64, + (59,26,0): 93, 79, 66, + (59,27,0): 91, 79, 67, + (59,28,0): 92, 78, 69, + (59,29,0): 91, 78, 70, + (59,30,0): 92, 79, 73, + (59,31,0): 91, 79, 79, + (59,32,0): 94, 80, 95, + (59,33,0): 98, 84, 109, + (59,34,0): 100, 89, 123, + (59,35,0): 103, 94, 137, + (59,36,0): 111, 104, 156, + (59,37,0): 122, 117, 173, + (59,38,0): 132, 124, 183, + (59,39,0): 136, 123, 179, + (59,40,0): 155, 132, 186, + (59,41,0): 166, 133, 180, + (59,42,0): 175, 128, 170, + (59,43,0): 184, 122, 161, + (59,44,0): 200, 120, 159, + (59,45,0): 211, 116, 156, + (59,46,0): 204, 99, 140, + (59,47,0): 198, 77, 108, + (59,48,0): 216, 72, 82, + (59,49,0): 217, 67, 66, + (59,50,0): 209, 67, 63, + (59,51,0): 203, 70, 61, + (59,52,0): 201, 73, 60, + (59,53,0): 204, 72, 59, + (59,54,0): 211, 69, 59, + (59,55,0): 222, 65, 60, + (59,56,0): 238, 64, 65, + (59,57,0): 245, 60, 65, + (59,58,0): 251, 60, 68, + (59,59,0): 249, 62, 69, + (59,60,0): 240, 65, 72, + (59,61,0): 226, 66, 68, + (59,62,0): 209, 65, 64, + (59,63,0): 197, 64, 59, + (59,64,0): 191, 63, 54, + (59,65,0): 182, 60, 49, + (59,66,0): 175, 57, 43, + (59,67,0): 171, 58, 42, + (59,68,0): 170, 57, 41, + (59,69,0): 174, 56, 42, + (59,70,0): 188, 62, 48, + (59,71,0): 206, 68, 58, + (59,72,0): 213, 60, 55, + (59,73,0): 213, 51, 49, + (59,74,0): 224, 59, 57, + (59,75,0): 229, 65, 63, + (59,76,0): 225, 68, 63, + (59,77,0): 232, 83, 76, + (59,78,0): 223, 85, 74, + (59,79,0): 191, 58, 43, + (59,80,0): 193, 57, 41, + (59,81,0): 190, 55, 36, + (59,82,0): 192, 55, 37, + (59,83,0): 196, 59, 41, + (59,84,0): 201, 61, 44, + (59,85,0): 202, 61, 44, + (59,86,0): 203, 57, 42, + (59,87,0): 206, 56, 41, + (59,88,0): 205, 52, 38, + (59,89,0): 210, 50, 38, + (59,90,0): 217, 50, 41, + (59,91,0): 229, 57, 47, + (59,92,0): 241, 62, 55, + (59,93,0): 245, 62, 54, + (59,94,0): 240, 53, 46, + (59,95,0): 228, 47, 38, + (59,96,0): 222, 54, 41, + (59,97,0): 221, 55, 41, + (59,98,0): 224, 52, 42, + (59,99,0): 228, 50, 40, + (59,100,0): 231, 46, 41, + (59,101,0): 233, 46, 41, + (59,102,0): 236, 44, 41, + (59,103,0): 236, 44, 43, + (59,104,0): 232, 42, 44, + (59,105,0): 230, 39, 44, + (59,106,0): 234, 40, 49, + (59,107,0): 240, 42, 57, + (59,108,0): 245, 39, 60, + (59,109,0): 246, 34, 59, + (59,110,0): 250, 31, 61, + (59,111,0): 251, 37, 65, + (59,112,0): 253, 56, 74, + (59,113,0): 228, 40, 54, + (59,114,0): 229, 44, 58, + (59,115,0): 255, 77, 89, + (59,116,0): 255, 93, 105, + (59,117,0): 255, 78, 90, + (59,118,0): 242, 60, 73, + (59,119,0): 244, 58, 72, + (59,120,0): 232, 41, 56, + (59,121,0): 237, 42, 56, + (59,122,0): 241, 45, 57, + (59,123,0): 244, 48, 58, + (59,124,0): 241, 50, 55, + (59,125,0): 234, 48, 49, + (59,126,0): 225, 43, 42, + (59,127,0): 215, 40, 37, + (59,128,0): 216, 48, 45, + (59,129,0): 218, 55, 50, + (59,130,0): 212, 50, 47, + (59,131,0): 229, 67, 64, + (59,132,0): 255, 115, 112, + (59,133,0): 245, 86, 83, + (59,134,0): 221, 62, 59, + (59,135,0): 229, 71, 68, + (59,136,0): 219, 61, 58, + (59,137,0): 218, 60, 57, + (59,138,0): 213, 58, 53, + (59,139,0): 210, 56, 48, + (59,140,0): 209, 55, 45, + (59,141,0): 208, 54, 42, + (59,142,0): 205, 52, 38, + (59,143,0): 198, 51, 35, + (59,144,0): 190, 53, 35, + (59,145,0): 185, 54, 36, + (59,146,0): 187, 56, 38, + (59,147,0): 191, 59, 44, + (59,148,0): 192, 60, 47, + (59,149,0): 191, 57, 45, + (59,150,0): 192, 58, 47, + (59,151,0): 197, 60, 50, + (59,152,0): 229, 88, 81, + (59,153,0): 220, 77, 71, + (59,154,0): 202, 55, 48, + (59,155,0): 199, 48, 41, + (59,156,0): 215, 60, 55, + (59,157,0): 222, 65, 58, + (59,158,0): 218, 59, 53, + (59,159,0): 223, 60, 53, + (59,160,0): 231, 62, 57, + (59,161,0): 233, 61, 57, + (59,162,0): 230, 63, 57, + (59,163,0): 225, 64, 56, + (59,164,0): 217, 63, 53, + (59,165,0): 208, 60, 50, + (59,166,0): 200, 58, 46, + (59,167,0): 193, 57, 45, + (59,168,0): 187, 57, 44, + (59,169,0): 187, 61, 49, + (59,170,0): 203, 78, 72, + (59,171,0): 224, 99, 95, + (59,172,0): 236, 110, 111, + (59,173,0): 250, 124, 127, + (59,174,0): 255, 132, 136, + (59,175,0): 255, 125, 133, + (59,176,0): 252, 118, 127, + (59,177,0): 250, 119, 127, + (59,178,0): 245, 122, 127, + (59,179,0): 247, 122, 128, + (59,180,0): 255, 118, 128, + (59,181,0): 255, 109, 123, + (59,182,0): 255, 98, 116, + (59,183,0): 254, 91, 110, + (59,184,0): 250, 84, 104, + (59,185,0): 240, 71, 92, + (59,186,0): 241, 61, 86, + (59,187,0): 240, 68, 90, + (59,188,0): 225, 79, 92, + (59,189,0): 195, 91, 90, + (59,190,0): 146, 104, 82, + (59,191,0): 111, 109, 71, + (59,192,0): 95, 115, 66, + (59,193,0): 92, 121, 67, + (59,194,0): 100, 122, 73, + (59,195,0): 108, 125, 80, + (59,196,0): 116, 129, 86, + (59,197,0): 118, 131, 88, + (59,198,0): 114, 129, 88, + (59,199,0): 111, 129, 87, + (59,200,0): 109, 135, 90, + (59,201,0): 108, 142, 92, + (59,202,0): 111, 149, 98, + (59,203,0): 117, 157, 104, + (59,204,0): 123, 164, 108, + (59,205,0): 129, 168, 111, + (59,206,0): 132, 170, 113, + (59,207,0): 135, 170, 112, + (59,208,0): 134, 172, 113, + (59,209,0): 136, 176, 116, + (59,210,0): 139, 179, 117, + (59,211,0): 140, 182, 118, + (59,212,0): 138, 183, 118, + (59,213,0): 138, 183, 118, + (59,214,0): 139, 184, 119, + (59,215,0): 144, 184, 122, + (59,216,0): 145, 180, 124, + (59,217,0): 143, 171, 123, + (59,218,0): 144, 165, 124, + (59,219,0): 154, 165, 133, + (59,220,0): 170, 172, 150, + (59,221,0): 187, 180, 164, + (59,222,0): 197, 184, 175, + (59,223,0): 198, 184, 181, + (59,224,0): 177, 171, 175, + (59,225,0): 161, 158, 165, + (59,226,0): 151, 146, 153, + (60,0,0): 91, 75, 59, + (60,1,0): 91, 75, 59, + (60,2,0): 91, 75, 59, + (60,3,0): 91, 75, 59, + (60,4,0): 91, 75, 59, + (60,5,0): 91, 75, 59, + (60,6,0): 91, 75, 59, + (60,7,0): 91, 75, 59, + (60,8,0): 90, 74, 58, + (60,9,0): 90, 74, 58, + (60,10,0): 90, 74, 58, + (60,11,0): 91, 75, 59, + (60,12,0): 91, 75, 59, + (60,13,0): 92, 76, 60, + (60,14,0): 92, 76, 60, + (60,15,0): 92, 76, 60, + (60,16,0): 93, 76, 60, + (60,17,0): 94, 75, 60, + (60,18,0): 94, 75, 60, + (60,19,0): 94, 77, 61, + (60,20,0): 94, 77, 59, + (60,21,0): 95, 78, 60, + (60,22,0): 94, 79, 60, + (60,23,0): 94, 79, 60, + (60,24,0): 94, 79, 60, + (60,25,0): 94, 78, 62, + (60,26,0): 94, 78, 62, + (60,27,0): 92, 79, 63, + (60,28,0): 94, 78, 65, + (60,29,0): 93, 79, 66, + (60,30,0): 94, 80, 69, + (60,31,0): 94, 79, 74, + (60,32,0): 98, 78, 89, + (60,33,0): 99, 80, 100, + (60,34,0): 99, 84, 113, + (60,35,0): 101, 89, 125, + (60,36,0): 108, 101, 145, + (60,37,0): 120, 114, 162, + (60,38,0): 127, 119, 168, + (60,39,0): 131, 118, 164, + (60,40,0): 148, 125, 167, + (60,41,0): 172, 134, 171, + (60,42,0): 194, 137, 169, + (60,43,0): 206, 130, 158, + (60,44,0): 218, 119, 148, + (60,45,0): 223, 108, 137, + (60,46,0): 218, 89, 119, + (60,47,0): 216, 69, 95, + (60,48,0): 236, 70, 84, + (60,49,0): 242, 73, 78, + (60,50,0): 233, 77, 78, + (60,51,0): 219, 76, 72, + (60,52,0): 205, 71, 62, + (60,53,0): 202, 69, 60, + (60,54,0): 210, 69, 62, + (60,55,0): 219, 67, 62, + (60,56,0): 234, 66, 66, + (60,57,0): 242, 63, 67, + (60,58,0): 248, 63, 71, + (60,59,0): 246, 65, 74, + (60,60,0): 237, 68, 73, + (60,61,0): 222, 68, 70, + (60,62,0): 205, 66, 63, + (60,63,0): 192, 63, 57, + (60,64,0): 189, 65, 55, + (60,65,0): 181, 61, 47, + (60,66,0): 174, 58, 43, + (60,67,0): 171, 58, 42, + (60,68,0): 170, 57, 41, + (60,69,0): 174, 56, 42, + (60,70,0): 187, 59, 46, + (60,71,0): 204, 63, 54, + (60,72,0): 225, 70, 65, + (60,73,0): 226, 61, 59, + (60,74,0): 238, 66, 66, + (60,75,0): 235, 65, 65, + (60,76,0): 222, 59, 54, + (60,77,0): 227, 74, 66, + (60,78,0): 230, 88, 76, + (60,79,0): 213, 75, 62, + (60,80,0): 200, 64, 50, + (60,81,0): 192, 56, 40, + (60,82,0): 188, 51, 35, + (60,83,0): 193, 56, 40, + (60,84,0): 200, 60, 45, + (60,85,0): 201, 58, 42, + (60,86,0): 203, 55, 41, + (60,87,0): 208, 56, 43, + (60,88,0): 206, 48, 37, + (60,89,0): 215, 51, 41, + (60,90,0): 224, 56, 47, + (60,91,0): 233, 59, 52, + (60,92,0): 237, 58, 53, + (60,93,0): 237, 54, 48, + (60,94,0): 235, 48, 43, + (60,95,0): 229, 44, 39, + (60,96,0): 223, 48, 43, + (60,97,0): 223, 50, 44, + (60,98,0): 229, 49, 48, + (60,99,0): 235, 50, 48, + (60,100,0): 241, 51, 53, + (60,101,0): 244, 51, 54, + (60,102,0): 246, 53, 56, + (60,103,0): 244, 53, 58, + (60,104,0): 235, 46, 53, + (60,105,0): 232, 45, 54, + (60,106,0): 235, 47, 61, + (60,107,0): 240, 49, 67, + (60,108,0): 242, 46, 70, + (60,109,0): 245, 42, 71, + (60,110,0): 252, 44, 78, + (60,111,0): 255, 52, 82, + (60,112,0): 245, 58, 77, + (60,113,0): 229, 51, 63, + (60,114,0): 238, 62, 75, + (60,115,0): 255, 92, 105, + (60,116,0): 255, 104, 118, + (60,117,0): 255, 85, 100, + (60,118,0): 245, 67, 83, + (60,119,0): 247, 64, 82, + (60,120,0): 238, 51, 68, + (60,121,0): 237, 51, 65, + (60,122,0): 237, 51, 62, + (60,123,0): 233, 54, 60, + (60,124,0): 227, 57, 57, + (60,125,0): 219, 56, 51, + (60,126,0): 206, 52, 42, + (60,127,0): 199, 47, 36, + (60,128,0): 203, 50, 42, + (60,129,0): 199, 46, 40, + (60,130,0): 208, 55, 50, + (60,131,0): 242, 89, 84, + (60,132,0): 246, 92, 90, + (60,133,0): 242, 88, 86, + (60,134,0): 219, 65, 63, + (60,135,0): 226, 72, 70, + (60,136,0): 220, 66, 64, + (60,137,0): 212, 60, 55, + (60,138,0): 206, 55, 48, + (60,139,0): 205, 54, 45, + (60,140,0): 207, 56, 45, + (60,141,0): 207, 57, 43, + (60,142,0): 202, 55, 39, + (60,143,0): 194, 53, 35, + (60,144,0): 185, 56, 35, + (60,145,0): 179, 57, 36, + (60,146,0): 181, 58, 40, + (60,147,0): 184, 61, 45, + (60,148,0): 185, 59, 44, + (60,149,0): 182, 54, 41, + (60,150,0): 188, 55, 46, + (60,151,0): 198, 61, 53, + (60,152,0): 219, 78, 71, + (60,153,0): 217, 69, 65, + (60,154,0): 206, 53, 48, + (60,155,0): 208, 49, 45, + (60,156,0): 225, 62, 57, + (60,157,0): 231, 64, 58, + (60,158,0): 227, 56, 49, + (60,159,0): 231, 53, 49, + (60,160,0): 235, 50, 48, + (60,161,0): 238, 50, 49, + (60,162,0): 235, 53, 50, + (60,163,0): 231, 56, 51, + (60,164,0): 225, 58, 50, + (60,165,0): 216, 58, 47, + (60,166,0): 208, 57, 46, + (60,167,0): 200, 58, 46, + (60,168,0): 190, 54, 42, + (60,169,0): 186, 56, 43, + (60,170,0): 200, 73, 66, + (60,171,0): 220, 95, 89, + (60,172,0): 235, 110, 108, + (60,173,0): 251, 125, 128, + (60,174,0): 255, 133, 137, + (60,175,0): 255, 126, 131, + (60,176,0): 247, 116, 124, + (60,177,0): 248, 118, 126, + (60,178,0): 245, 122, 127, + (60,179,0): 248, 123, 129, + (60,180,0): 254, 116, 129, + (60,181,0): 255, 108, 124, + (60,182,0): 255, 97, 117, + (60,183,0): 255, 90, 112, + (60,184,0): 247, 81, 101, + (60,185,0): 241, 72, 93, + (60,186,0): 240, 62, 86, + (60,187,0): 238, 69, 90, + (60,188,0): 227, 83, 93, + (60,189,0): 188, 86, 82, + (60,190,0): 131, 91, 66, + (60,191,0): 98, 98, 60, + (60,192,0): 92, 112, 63, + (60,193,0): 91, 118, 67, + (60,194,0): 102, 121, 75, + (60,195,0): 110, 126, 81, + (60,196,0): 116, 129, 86, + (60,197,0): 120, 133, 90, + (60,198,0): 121, 136, 95, + (60,199,0): 119, 140, 97, + (60,200,0): 121, 149, 101, + (60,201,0): 120, 154, 104, + (60,202,0): 122, 160, 109, + (60,203,0): 124, 167, 113, + (60,204,0): 129, 170, 114, + (60,205,0): 132, 171, 114, + (60,206,0): 133, 171, 112, + (60,207,0): 134, 169, 111, + (60,208,0): 137, 172, 114, + (60,209,0): 139, 174, 116, + (60,210,0): 138, 178, 116, + (60,211,0): 138, 180, 116, + (60,212,0): 136, 181, 116, + (60,213,0): 135, 182, 114, + (60,214,0): 137, 184, 116, + (60,215,0): 139, 184, 119, + (60,216,0): 143, 183, 123, + (60,217,0): 140, 173, 120, + (60,218,0): 141, 164, 120, + (60,219,0): 151, 165, 130, + (60,220,0): 170, 174, 149, + (60,221,0): 191, 186, 167, + (60,222,0): 203, 193, 181, + (60,223,0): 207, 198, 193, + (60,224,0): 188, 186, 191, + (60,225,0): 168, 170, 182, + (60,226,0): 156, 156, 168, + (61,0,0): 90, 74, 58, + (61,1,0): 90, 74, 58, + (61,2,0): 90, 74, 58, + (61,3,0): 90, 74, 58, + (61,4,0): 90, 74, 58, + (61,5,0): 90, 74, 58, + (61,6,0): 90, 74, 58, + (61,7,0): 90, 74, 58, + (61,8,0): 90, 74, 58, + (61,9,0): 90, 74, 58, + (61,10,0): 90, 74, 58, + (61,11,0): 91, 75, 59, + (61,12,0): 91, 75, 59, + (61,13,0): 92, 76, 60, + (61,14,0): 92, 76, 60, + (61,15,0): 93, 76, 60, + (61,16,0): 94, 75, 60, + (61,17,0): 94, 75, 60, + (61,18,0): 94, 75, 60, + (61,19,0): 95, 76, 61, + (61,20,0): 94, 77, 59, + (61,21,0): 95, 78, 60, + (61,22,0): 94, 79, 60, + (61,23,0): 94, 79, 60, + (61,24,0): 93, 78, 59, + (61,25,0): 93, 78, 59, + (61,26,0): 94, 79, 60, + (61,27,0): 95, 79, 63, + (61,28,0): 95, 79, 63, + (61,29,0): 96, 80, 64, + (61,30,0): 97, 81, 65, + (61,31,0): 98, 80, 70, + (61,32,0): 101, 76, 80, + (61,33,0): 101, 77, 93, + (61,34,0): 97, 79, 101, + (61,35,0): 98, 85, 115, + (61,36,0): 104, 96, 133, + (61,37,0): 116, 111, 151, + (61,38,0): 123, 116, 157, + (61,39,0): 125, 113, 151, + (61,40,0): 143, 118, 150, + (61,41,0): 174, 131, 159, + (61,42,0): 203, 140, 161, + (61,43,0): 218, 131, 150, + (61,44,0): 227, 116, 133, + (61,45,0): 232, 101, 117, + (61,46,0): 230, 81, 100, + (61,47,0): 228, 63, 80, + (61,48,0): 242, 55, 72, + (61,49,0): 252, 64, 78, + (61,50,0): 244, 73, 81, + (61,51,0): 227, 71, 74, + (61,52,0): 209, 65, 64, + (61,53,0): 203, 66, 60, + (61,54,0): 209, 67, 63, + (61,55,0): 217, 67, 66, + (61,56,0): 230, 67, 70, + (61,57,0): 235, 64, 70, + (61,58,0): 239, 64, 71, + (61,59,0): 239, 66, 72, + (61,60,0): 231, 68, 73, + (61,61,0): 218, 68, 69, + (61,62,0): 201, 66, 62, + (61,63,0): 190, 63, 54, + (61,64,0): 186, 64, 53, + (61,65,0): 177, 59, 45, + (61,66,0): 169, 56, 40, + (61,67,0): 168, 57, 40, + (61,68,0): 170, 57, 41, + (61,69,0): 176, 56, 42, + (61,70,0): 188, 58, 45, + (61,71,0): 202, 59, 51, + (61,72,0): 232, 73, 69, + (61,73,0): 233, 63, 63, + (61,74,0): 235, 61, 62, + (61,75,0): 229, 55, 56, + (61,76,0): 218, 50, 47, + (61,77,0): 222, 65, 58, + (61,78,0): 238, 90, 80, + (61,79,0): 244, 104, 91, + (61,80,0): 218, 80, 67, + (61,81,0): 201, 65, 51, + (61,82,0): 190, 53, 37, + (61,83,0): 194, 54, 39, + (61,84,0): 199, 57, 43, + (61,85,0): 200, 57, 43, + (61,86,0): 203, 55, 43, + (61,87,0): 210, 56, 44, + (61,88,0): 209, 48, 38, + (61,89,0): 218, 54, 45, + (61,90,0): 230, 59, 52, + (61,91,0): 233, 59, 52, + (61,92,0): 234, 52, 48, + (61,93,0): 232, 47, 44, + (61,94,0): 234, 45, 43, + (61,95,0): 235, 45, 45, + (61,96,0): 241, 52, 56, + (61,97,0): 243, 52, 59, + (61,98,0): 247, 51, 61, + (61,99,0): 250, 50, 60, + (61,100,0): 251, 49, 61, + (61,101,0): 253, 49, 61, + (61,102,0): 250, 48, 60, + (61,103,0): 247, 49, 62, + (61,104,0): 244, 49, 65, + (61,105,0): 241, 50, 66, + (61,106,0): 242, 53, 75, + (61,107,0): 243, 53, 78, + (61,108,0): 242, 49, 78, + (61,109,0): 244, 46, 79, + (61,110,0): 254, 49, 88, + (61,111,0): 255, 62, 95, + (61,112,0): 230, 51, 72, + (61,113,0): 248, 78, 91, + (61,114,0): 255, 95, 108, + (61,115,0): 255, 92, 107, + (61,116,0): 252, 84, 99, + (61,117,0): 250, 79, 95, + (61,118,0): 244, 68, 88, + (61,119,0): 233, 56, 74, + (61,120,0): 243, 65, 81, + (61,121,0): 234, 58, 71, + (61,122,0): 221, 50, 58, + (61,123,0): 210, 47, 50, + (61,124,0): 202, 50, 45, + (61,125,0): 194, 56, 45, + (61,126,0): 189, 59, 43, + (61,127,0): 188, 58, 42, + (61,128,0): 196, 58, 47, + (61,129,0): 192, 50, 40, + (61,130,0): 217, 74, 66, + (61,131,0): 250, 107, 99, + (61,132,0): 221, 76, 71, + (61,133,0): 225, 80, 75, + (61,134,0): 207, 59, 57, + (61,135,0): 207, 59, 57, + (61,136,0): 224, 76, 74, + (61,137,0): 212, 64, 60, + (61,138,0): 202, 55, 48, + (61,139,0): 202, 55, 45, + (61,140,0): 206, 60, 47, + (61,141,0): 205, 60, 43, + (61,142,0): 203, 58, 41, + (61,143,0): 196, 59, 40, + (61,144,0): 180, 59, 38, + (61,145,0): 173, 58, 37, + (61,146,0): 175, 60, 41, + (61,147,0): 179, 62, 45, + (61,148,0): 177, 57, 41, + (61,149,0): 175, 51, 39, + (61,150,0): 186, 58, 47, + (61,151,0): 202, 68, 59, + (61,152,0): 214, 71, 65, + (61,153,0): 216, 67, 61, + (61,154,0): 212, 55, 50, + (61,155,0): 215, 50, 46, + (61,156,0): 231, 59, 55, + (61,157,0): 236, 58, 54, + (61,158,0): 232, 50, 46, + (61,159,0): 237, 50, 45, + (61,160,0): 242, 44, 45, + (61,161,0): 244, 44, 44, + (61,162,0): 242, 46, 47, + (61,163,0): 239, 51, 49, + (61,164,0): 232, 55, 49, + (61,165,0): 226, 58, 49, + (61,166,0): 218, 60, 49, + (61,167,0): 210, 62, 50, + (61,168,0): 194, 54, 41, + (61,169,0): 186, 52, 41, + (61,170,0): 197, 66, 58, + (61,171,0): 215, 88, 82, + (61,172,0): 231, 106, 104, + (61,173,0): 250, 124, 125, + (61,174,0): 255, 134, 137, + (61,175,0): 255, 127, 132, + (61,176,0): 248, 117, 125, + (61,177,0): 249, 119, 127, + (61,178,0): 246, 123, 128, + (61,179,0): 247, 122, 128, + (61,180,0): 252, 114, 127, + (61,181,0): 253, 105, 121, + (61,182,0): 255, 94, 115, + (61,183,0): 255, 89, 111, + (61,184,0): 245, 79, 99, + (61,185,0): 244, 75, 96, + (61,186,0): 242, 64, 88, + (61,187,0): 239, 70, 91, + (61,188,0): 229, 85, 95, + (61,189,0): 182, 83, 78, + (61,190,0): 121, 84, 58, + (61,191,0): 94, 96, 56, + (61,192,0): 96, 115, 69, + (61,193,0): 97, 124, 73, + (61,194,0): 110, 129, 83, + (61,195,0): 118, 134, 89, + (61,196,0): 123, 136, 93, + (61,197,0): 126, 139, 96, + (61,198,0): 129, 144, 103, + (61,199,0): 130, 151, 108, + (61,200,0): 128, 156, 108, + (61,201,0): 125, 159, 109, + (61,202,0): 124, 164, 111, + (61,203,0): 125, 168, 112, + (61,204,0): 128, 169, 111, + (61,205,0): 130, 170, 110, + (61,206,0): 131, 169, 108, + (61,207,0): 133, 169, 108, + (61,208,0): 137, 170, 113, + (61,209,0): 139, 173, 113, + (61,210,0): 137, 175, 114, + (61,211,0): 136, 178, 114, + (61,212,0): 133, 178, 111, + (61,213,0): 133, 180, 112, + (61,214,0): 135, 182, 114, + (61,215,0): 137, 184, 116, + (61,216,0): 139, 181, 118, + (61,217,0): 135, 173, 116, + (61,218,0): 140, 166, 119, + (61,219,0): 153, 169, 132, + (61,220,0): 175, 181, 153, + (61,221,0): 198, 196, 175, + (61,222,0): 213, 206, 190, + (61,223,0): 217, 210, 204, + (61,224,0): 194, 194, 202, + (61,225,0): 172, 178, 192, + (61,226,0): 155, 161, 175, + (62,0,0): 90, 75, 56, + (62,1,0): 90, 75, 56, + (62,2,0): 90, 75, 56, + (62,3,0): 90, 75, 56, + (62,4,0): 90, 75, 56, + (62,5,0): 90, 75, 56, + (62,6,0): 90, 75, 56, + (62,7,0): 90, 75, 56, + (62,8,0): 90, 75, 56, + (62,9,0): 90, 75, 56, + (62,10,0): 90, 75, 56, + (62,11,0): 91, 76, 57, + (62,12,0): 91, 76, 57, + (62,13,0): 92, 77, 58, + (62,14,0): 92, 77, 58, + (62,15,0): 93, 76, 58, + (62,16,0): 94, 75, 60, + (62,17,0): 96, 74, 60, + (62,18,0): 94, 75, 60, + (62,19,0): 95, 76, 61, + (62,20,0): 94, 77, 59, + (62,21,0): 95, 78, 60, + (62,22,0): 94, 79, 60, + (62,23,0): 94, 79, 60, + (62,24,0): 94, 79, 58, + (62,25,0): 95, 80, 59, + (62,26,0): 96, 79, 59, + (62,27,0): 97, 80, 62, + (62,28,0): 97, 80, 62, + (62,29,0): 97, 80, 62, + (62,30,0): 97, 80, 60, + (62,31,0): 100, 78, 65, + (62,32,0): 104, 75, 77, + (62,33,0): 103, 75, 87, + (62,34,0): 99, 78, 95, + (62,35,0): 98, 84, 109, + (62,36,0): 106, 97, 128, + (62,37,0): 118, 112, 146, + (62,38,0): 124, 118, 152, + (62,39,0): 128, 115, 145, + (62,40,0): 143, 117, 142, + (62,41,0): 173, 128, 148, + (62,42,0): 205, 134, 148, + (62,43,0): 222, 127, 135, + (62,44,0): 237, 113, 121, + (62,45,0): 246, 101, 108, + (62,46,0): 246, 82, 91, + (62,47,0): 244, 62, 75, + (62,48,0): 248, 47, 66, + (62,49,0): 255, 55, 75, + (62,50,0): 251, 65, 79, + (62,51,0): 235, 64, 73, + (62,52,0): 219, 63, 67, + (62,53,0): 214, 66, 66, + (62,54,0): 213, 67, 67, + (62,55,0): 215, 65, 66, + (62,56,0): 224, 65, 69, + (62,57,0): 227, 64, 69, + (62,58,0): 230, 63, 70, + (62,59,0): 228, 65, 70, + (62,60,0): 223, 67, 70, + (62,61,0): 212, 66, 66, + (62,62,0): 199, 64, 60, + (62,63,0): 189, 62, 53, + (62,64,0): 184, 62, 51, + (62,65,0): 175, 57, 43, + (62,66,0): 168, 55, 39, + (62,67,0): 169, 58, 41, + (62,68,0): 173, 60, 42, + (62,69,0): 180, 60, 44, + (62,70,0): 193, 61, 49, + (62,71,0): 207, 63, 55, + (62,72,0): 223, 61, 58, + (62,73,0): 229, 57, 57, + (62,74,0): 227, 48, 51, + (62,75,0): 226, 47, 50, + (62,76,0): 224, 52, 50, + (62,77,0): 219, 57, 52, + (62,78,0): 230, 77, 69, + (62,79,0): 252, 108, 97, + (62,80,0): 242, 104, 91, + (62,81,0): 217, 81, 67, + (62,82,0): 198, 60, 47, + (62,83,0): 198, 58, 45, + (62,84,0): 200, 58, 46, + (62,85,0): 201, 55, 42, + (62,86,0): 205, 54, 43, + (62,87,0): 213, 56, 47, + (62,88,0): 213, 52, 44, + (62,89,0): 222, 55, 47, + (62,90,0): 230, 57, 51, + (62,91,0): 232, 54, 50, + (62,92,0): 233, 49, 47, + (62,93,0): 232, 47, 44, + (62,94,0): 238, 49, 47, + (62,95,0): 245, 49, 53, + (62,96,0): 255, 50, 66, + (62,97,0): 255, 48, 68, + (62,98,0): 255, 45, 69, + (62,99,0): 255, 43, 65, + (62,100,0): 255, 38, 63, + (62,101,0): 255, 35, 60, + (62,102,0): 250, 32, 56, + (62,103,0): 244, 32, 55, + (62,104,0): 246, 39, 65, + (62,105,0): 243, 43, 69, + (62,106,0): 242, 47, 77, + (62,107,0): 242, 49, 80, + (62,108,0): 240, 44, 80, + (62,109,0): 243, 42, 84, + (62,110,0): 254, 51, 96, + (62,111,0): 255, 66, 104, + (62,112,0): 240, 67, 87, + (62,113,0): 255, 95, 108, + (62,114,0): 255, 103, 116, + (62,115,0): 247, 85, 100, + (62,116,0): 236, 74, 89, + (62,117,0): 239, 74, 90, + (62,118,0): 234, 65, 84, + (62,119,0): 217, 49, 66, + (62,120,0): 235, 64, 82, + (62,121,0): 221, 55, 67, + (62,122,0): 201, 45, 49, + (62,123,0): 186, 40, 40, + (62,124,0): 177, 46, 36, + (62,125,0): 171, 56, 38, + (62,126,0): 165, 63, 38, + (62,127,0): 168, 64, 39, + (62,128,0): 184, 63, 46, + (62,129,0): 188, 58, 44, + (62,130,0): 221, 89, 77, + (62,131,0): 225, 93, 81, + (62,132,0): 205, 71, 62, + (62,133,0): 205, 68, 62, + (62,134,0): 193, 54, 51, + (62,135,0): 201, 59, 55, + (62,136,0): 228, 85, 81, + (62,137,0): 213, 70, 64, + (62,138,0): 201, 57, 49, + (62,139,0): 200, 56, 45, + (62,140,0): 201, 58, 44, + (62,141,0): 200, 57, 40, + (62,142,0): 200, 57, 40, + (62,143,0): 196, 61, 41, + (62,144,0): 177, 63, 39, + (62,145,0): 166, 60, 38, + (62,146,0): 168, 59, 38, + (62,147,0): 172, 61, 42, + (62,148,0): 171, 55, 40, + (62,149,0): 172, 51, 40, + (62,150,0): 188, 61, 52, + (62,151,0): 211, 76, 70, + (62,152,0): 214, 71, 65, + (62,153,0): 221, 69, 64, + (62,154,0): 219, 57, 54, + (62,155,0): 220, 51, 48, + (62,156,0): 233, 55, 51, + (62,157,0): 236, 53, 49, + (62,158,0): 235, 48, 43, + (62,159,0): 244, 49, 45, + (62,160,0): 253, 44, 47, + (62,161,0): 255, 43, 45, + (62,162,0): 250, 46, 47, + (62,163,0): 244, 49, 47, + (62,164,0): 237, 52, 47, + (62,165,0): 230, 56, 49, + (62,166,0): 223, 59, 49, + (62,167,0): 216, 62, 50, + (62,168,0): 201, 57, 46, + (62,169,0): 189, 51, 40, + (62,170,0): 192, 59, 50, + (62,171,0): 207, 78, 72, + (62,172,0): 225, 97, 94, + (62,173,0): 247, 121, 122, + (62,174,0): 255, 136, 138, + (62,175,0): 255, 131, 135, + (62,176,0): 252, 121, 129, + (62,177,0): 252, 122, 130, + (62,178,0): 248, 124, 132, + (62,179,0): 247, 122, 130, + (62,180,0): 249, 111, 124, + (62,181,0): 249, 101, 117, + (62,182,0): 252, 90, 111, + (62,183,0): 252, 86, 108, + (62,184,0): 238, 75, 96, + (62,185,0): 242, 74, 97, + (62,186,0): 240, 64, 87, + (62,187,0): 236, 69, 89, + (62,188,0): 225, 84, 93, + (62,189,0): 174, 77, 71, + (62,190,0): 112, 77, 49, + (62,191,0): 92, 94, 54, + (62,192,0): 95, 114, 68, + (62,193,0): 102, 126, 78, + (62,194,0): 117, 136, 91, + (62,195,0): 127, 142, 99, + (62,196,0): 132, 144, 104, + (62,197,0): 134, 146, 106, + (62,198,0): 136, 151, 110, + (62,199,0): 137, 158, 115, + (62,200,0): 136, 164, 116, + (62,201,0): 132, 166, 116, + (62,202,0): 127, 167, 114, + (62,203,0): 125, 168, 112, + (62,204,0): 127, 168, 110, + (62,205,0): 129, 169, 109, + (62,206,0): 131, 169, 108, + (62,207,0): 134, 168, 108, + (62,208,0): 136, 167, 110, + (62,209,0): 138, 169, 110, + (62,210,0): 136, 172, 111, + (62,211,0): 134, 174, 111, + (62,212,0): 130, 175, 108, + (62,213,0): 130, 177, 107, + (62,214,0): 131, 181, 110, + (62,215,0): 133, 183, 114, + (62,216,0): 135, 179, 116, + (62,217,0): 134, 173, 116, + (62,218,0): 140, 168, 119, + (62,219,0): 155, 173, 133, + (62,220,0): 176, 185, 154, + (62,221,0): 199, 199, 175, + (62,222,0): 214, 207, 189, + (62,223,0): 215, 210, 204, + (62,224,0): 188, 192, 201, + (62,225,0): 165, 174, 189, + (62,226,0): 147, 156, 171, + (63,0,0): 91, 74, 56, + (63,1,0): 90, 75, 56, + (63,2,0): 91, 74, 56, + (63,3,0): 90, 75, 56, + (63,4,0): 91, 74, 56, + (63,5,0): 90, 75, 56, + (63,6,0): 91, 74, 56, + (63,7,0): 90, 75, 56, + (63,8,0): 91, 74, 56, + (63,9,0): 90, 75, 56, + (63,10,0): 91, 74, 56, + (63,11,0): 91, 76, 57, + (63,12,0): 92, 75, 57, + (63,13,0): 92, 77, 58, + (63,14,0): 93, 76, 58, + (63,15,0): 93, 76, 58, + (63,16,0): 94, 75, 60, + (63,17,0): 94, 75, 60, + (63,18,0): 94, 75, 60, + (63,19,0): 94, 77, 61, + (63,20,0): 94, 77, 61, + (63,21,0): 94, 79, 60, + (63,22,0): 94, 79, 60, + (63,23,0): 92, 79, 60, + (63,24,0): 96, 81, 62, + (63,25,0): 97, 82, 61, + (63,26,0): 97, 82, 63, + (63,27,0): 98, 81, 63, + (63,28,0): 98, 81, 63, + (63,29,0): 97, 80, 62, + (63,30,0): 97, 79, 59, + (63,31,0): 98, 76, 63, + (63,32,0): 107, 77, 75, + (63,33,0): 106, 76, 84, + (63,34,0): 101, 79, 92, + (63,35,0): 100, 87, 107, + (63,36,0): 107, 101, 127, + (63,37,0): 120, 117, 148, + (63,38,0): 125, 124, 156, + (63,39,0): 127, 120, 151, + (63,40,0): 145, 122, 148, + (63,41,0): 171, 129, 149, + (63,42,0): 198, 132, 144, + (63,43,0): 217, 126, 133, + (63,44,0): 238, 117, 122, + (63,45,0): 252, 109, 111, + (63,46,0): 253, 90, 91, + (63,47,0): 249, 70, 76, + (63,48,0): 247, 52, 69, + (63,49,0): 255, 58, 78, + (63,50,0): 251, 64, 81, + (63,51,0): 238, 63, 76, + (63,52,0): 229, 65, 74, + (63,53,0): 225, 69, 73, + (63,54,0): 221, 66, 70, + (63,55,0): 215, 60, 64, + (63,56,0): 222, 63, 68, + (63,57,0): 223, 62, 67, + (63,58,0): 225, 62, 67, + (63,59,0): 222, 64, 65, + (63,60,0): 218, 66, 65, + (63,61,0): 208, 65, 61, + (63,62,0): 197, 62, 56, + (63,63,0): 188, 61, 52, + (63,64,0): 181, 63, 49, + (63,65,0): 172, 59, 43, + (63,66,0): 169, 56, 40, + (63,67,0): 173, 60, 44, + (63,68,0): 180, 63, 46, + (63,69,0): 187, 64, 49, + (63,70,0): 202, 65, 55, + (63,71,0): 216, 67, 61, + (63,72,0): 217, 55, 52, + (63,73,0): 225, 56, 53, + (63,74,0): 222, 46, 46, + (63,75,0): 226, 51, 48, + (63,76,0): 230, 58, 54, + (63,77,0): 211, 48, 39, + (63,78,0): 207, 53, 41, + (63,79,0): 235, 85, 71, + (63,80,0): 255, 119, 106, + (63,81,0): 235, 91, 80, + (63,82,0): 209, 67, 55, + (63,83,0): 202, 60, 48, + (63,84,0): 203, 59, 48, + (63,85,0): 201, 55, 42, + (63,86,0): 205, 54, 43, + (63,87,0): 212, 58, 48, + (63,88,0): 218, 55, 48, + (63,89,0): 223, 56, 50, + (63,90,0): 229, 54, 51, + (63,91,0): 231, 51, 50, + (63,92,0): 234, 48, 49, + (63,93,0): 237, 49, 50, + (63,94,0): 244, 51, 54, + (63,95,0): 252, 53, 60, + (63,96,0): 252, 37, 53, + (63,97,0): 255, 35, 56, + (63,98,0): 255, 34, 56, + (63,99,0): 255, 33, 56, + (63,100,0): 255, 32, 55, + (63,101,0): 255, 31, 53, + (63,102,0): 251, 29, 52, + (63,103,0): 246, 30, 53, + (63,104,0): 237, 28, 50, + (63,105,0): 236, 32, 57, + (63,106,0): 237, 39, 66, + (63,107,0): 238, 41, 71, + (63,108,0): 237, 39, 74, + (63,109,0): 239, 41, 77, + (63,110,0): 253, 53, 92, + (63,111,0): 255, 70, 104, + (63,112,0): 255, 96, 115, + (63,113,0): 254, 94, 106, + (63,114,0): 247, 85, 98, + (63,115,0): 242, 80, 93, + (63,116,0): 242, 80, 93, + (63,117,0): 240, 75, 89, + (63,118,0): 227, 62, 76, + (63,119,0): 210, 48, 59, + (63,120,0): 218, 61, 70, + (63,121,0): 205, 54, 59, + (63,122,0): 187, 47, 46, + (63,123,0): 175, 46, 40, + (63,124,0): 168, 52, 39, + (63,125,0): 162, 59, 40, + (63,126,0): 155, 63, 38, + (63,127,0): 157, 61, 37, + (63,128,0): 170, 57, 39, + (63,129,0): 178, 56, 43, + (63,130,0): 210, 86, 74, + (63,131,0): 187, 59, 50, + (63,132,0): 196, 63, 56, + (63,133,0): 190, 52, 49, + (63,134,0): 189, 50, 47, + (63,135,0): 206, 67, 64, + (63,136,0): 229, 87, 83, + (63,137,0): 213, 72, 65, + (63,138,0): 200, 57, 49, + (63,139,0): 196, 54, 42, + (63,140,0): 197, 54, 40, + (63,141,0): 196, 53, 37, + (63,142,0): 198, 53, 36, + (63,143,0): 195, 58, 40, + (63,144,0): 177, 60, 40, + (63,145,0): 167, 58, 38, + (63,146,0): 168, 55, 37, + (63,147,0): 173, 57, 42, + (63,148,0): 172, 52, 38, + (63,149,0): 175, 49, 37, + (63,150,0): 194, 63, 53, + (63,151,0): 219, 82, 74, + (63,152,0): 217, 73, 65, + (63,153,0): 225, 72, 66, + (63,154,0): 222, 59, 54, + (63,155,0): 222, 50, 46, + (63,156,0): 234, 52, 49, + (63,157,0): 237, 49, 47, + (63,158,0): 239, 45, 43, + (63,159,0): 252, 50, 50, + (63,160,0): 254, 44, 47, + (63,161,0): 253, 43, 46, + (63,162,0): 249, 43, 45, + (63,163,0): 243, 43, 43, + (63,164,0): 237, 45, 42, + (63,165,0): 230, 49, 42, + (63,166,0): 223, 52, 44, + (63,167,0): 214, 56, 44, + (63,168,0): 209, 61, 49, + (63,169,0): 191, 50, 40, + (63,170,0): 188, 55, 46, + (63,171,0): 200, 73, 66, + (63,172,0): 217, 92, 88, + (63,173,0): 243, 119, 119, + (63,174,0): 255, 137, 139, + (63,175,0): 255, 134, 138, + (63,176,0): 253, 126, 133, + (63,177,0): 255, 125, 133, + (63,178,0): 252, 125, 134, + (63,179,0): 253, 119, 130, + (63,180,0): 252, 107, 122, + (63,181,0): 249, 96, 114, + (63,182,0): 249, 87, 108, + (63,183,0): 249, 83, 105, + (63,184,0): 234, 68, 92, + (63,185,0): 240, 71, 94, + (63,186,0): 236, 59, 85, + (63,187,0): 228, 65, 86, + (63,188,0): 215, 81, 90, + (63,189,0): 162, 73, 67, + (63,190,0): 102, 70, 45, + (63,191,0): 88, 93, 53, + (63,192,0): 90, 109, 63, + (63,193,0): 98, 125, 74, + (63,194,0): 116, 140, 92, + (63,195,0): 128, 150, 103, + (63,196,0): 135, 152, 108, + (63,197,0): 136, 155, 110, + (63,198,0): 138, 160, 114, + (63,199,0): 139, 165, 118, + (63,200,0): 140, 172, 122, + (63,201,0): 134, 171, 119, + (63,202,0): 129, 170, 114, + (63,203,0): 126, 167, 109, + (63,204,0): 124, 165, 105, + (63,205,0): 125, 165, 103, + (63,206,0): 129, 165, 103, + (63,207,0): 131, 165, 105, + (63,208,0): 131, 164, 107, + (63,209,0): 133, 166, 109, + (63,210,0): 132, 170, 109, + (63,211,0): 130, 172, 108, + (63,212,0): 128, 173, 104, + (63,213,0): 128, 175, 105, + (63,214,0): 129, 179, 106, + (63,215,0): 132, 182, 111, + (63,216,0): 137, 182, 115, + (63,217,0): 136, 176, 114, + (63,218,0): 140, 173, 120, + (63,219,0): 153, 176, 132, + (63,220,0): 172, 188, 152, + (63,221,0): 189, 198, 169, + (63,222,0): 201, 203, 181, + (63,223,0): 203, 205, 194, + (63,224,0): 182, 191, 196, + (63,225,0): 159, 171, 183, + (63,226,0): 140, 152, 164, + (64,0,0): 93, 75, 55, + (64,1,0): 92, 75, 55, + (64,2,0): 93, 75, 55, + (64,3,0): 92, 75, 55, + (64,4,0): 93, 75, 55, + (64,5,0): 92, 75, 55, + (64,6,0): 93, 75, 55, + (64,7,0): 92, 75, 55, + (64,8,0): 94, 76, 56, + (64,9,0): 93, 76, 56, + (64,10,0): 94, 76, 56, + (64,11,0): 93, 76, 56, + (64,12,0): 94, 76, 56, + (64,13,0): 93, 76, 56, + (64,14,0): 94, 76, 56, + (64,15,0): 93, 76, 58, + (64,16,0): 93, 74, 60, + (64,17,0): 93, 75, 61, + (64,18,0): 94, 76, 62, + (64,19,0): 92, 76, 60, + (64,20,0): 92, 76, 60, + (64,21,0): 91, 78, 61, + (64,22,0): 93, 80, 63, + (64,23,0): 94, 83, 65, + (64,24,0): 96, 83, 66, + (64,25,0): 95, 82, 63, + (64,26,0): 96, 80, 64, + (64,27,0): 98, 81, 65, + (64,28,0): 99, 82, 66, + (64,29,0): 100, 81, 66, + (64,30,0): 100, 78, 65, + (64,31,0): 100, 76, 66, + (64,32,0): 107, 75, 76, + (64,33,0): 104, 75, 80, + (64,34,0): 101, 79, 91, + (64,35,0): 102, 91, 108, + (64,36,0): 110, 107, 134, + (64,37,0): 120, 123, 156, + (64,38,0): 129, 133, 170, + (64,39,0): 137, 137, 173, + (64,40,0): 143, 132, 166, + (64,41,0): 165, 136, 166, + (64,42,0): 190, 136, 159, + (64,43,0): 208, 130, 144, + (64,44,0): 225, 121, 128, + (64,45,0): 240, 114, 115, + (64,46,0): 249, 106, 102, + (64,47,0): 255, 97, 96, + (64,48,0): 244, 77, 87, + (64,49,0): 237, 65, 79, + (64,50,0): 231, 61, 74, + (64,51,0): 233, 66, 76, + (64,52,0): 235, 69, 79, + (64,53,0): 231, 65, 75, + (64,54,0): 228, 61, 69, + (64,55,0): 229, 62, 70, + (64,56,0): 226, 59, 66, + (64,57,0): 224, 59, 63, + (64,58,0): 221, 58, 61, + (64,59,0): 217, 59, 58, + (64,60,0): 212, 60, 57, + (64,61,0): 204, 59, 54, + (64,62,0): 196, 58, 48, + (64,63,0): 185, 57, 44, + (64,64,0): 167, 54, 38, + (64,65,0): 175, 65, 48, + (64,66,0): 173, 60, 44, + (64,67,0): 172, 54, 40, + (64,68,0): 191, 65, 53, + (64,69,0): 204, 70, 61, + (64,70,0): 204, 61, 53, + (64,71,0): 208, 55, 50, + (64,72,0): 218, 56, 53, + (64,73,0): 220, 55, 49, + (64,74,0): 222, 53, 46, + (64,75,0): 222, 54, 45, + (64,76,0): 222, 56, 42, + (64,77,0): 221, 60, 42, + (64,78,0): 215, 58, 39, + (64,79,0): 211, 54, 37, + (64,80,0): 217, 59, 48, + (64,81,0): 240, 83, 76, + (64,82,0): 242, 90, 79, + (64,83,0): 217, 69, 57, + (64,84,0): 199, 56, 42, + (64,85,0): 205, 62, 46, + (64,86,0): 212, 66, 51, + (64,87,0): 210, 58, 45, + (64,88,0): 211, 50, 42, + (64,89,0): 240, 71, 66, + (64,90,0): 225, 47, 47, + (64,91,0): 239, 54, 59, + (64,92,0): 244, 55, 62, + (64,93,0): 239, 45, 56, + (64,94,0): 255, 66, 77, + (64,95,0): 240, 40, 51, + (64,96,0): 250, 38, 50, + (64,97,0): 255, 41, 50, + (64,98,0): 255, 41, 50, + (64,99,0): 249, 29, 39, + (64,100,0): 253, 34, 42, + (64,101,0): 255, 39, 47, + (64,102,0): 254, 39, 47, + (64,103,0): 240, 29, 38, + (64,104,0): 238, 31, 41, + (64,105,0): 248, 44, 55, + (64,106,0): 233, 33, 46, + (64,107,0): 235, 38, 55, + (64,108,0): 240, 44, 64, + (64,109,0): 227, 33, 57, + (64,110,0): 255, 86, 112, + (64,111,0): 229, 43, 66, + (64,112,0): 255, 92, 108, + (64,113,0): 255, 94, 105, + (64,114,0): 255, 89, 99, + (64,115,0): 251, 84, 92, + (64,116,0): 246, 79, 87, + (64,117,0): 236, 71, 77, + (64,118,0): 222, 62, 64, + (64,119,0): 208, 54, 52, + (64,120,0): 204, 61, 55, + (64,121,0): 197, 64, 55, + (64,122,0): 184, 62, 49, + (64,123,0): 167, 54, 38, + (64,124,0): 156, 49, 33, + (64,125,0): 154, 53, 35, + (64,126,0): 157, 58, 39, + (64,127,0): 160, 59, 41, + (64,128,0): 167, 56, 45, + (64,129,0): 174, 55, 47, + (64,130,0): 194, 69, 63, + (64,131,0): 191, 59, 55, + (64,132,0): 189, 51, 49, + (64,133,0): 196, 54, 52, + (64,134,0): 197, 53, 52, + (64,135,0): 212, 68, 67, + (64,136,0): 219, 76, 72, + (64,137,0): 218, 75, 69, + (64,138,0): 209, 68, 59, + (64,139,0): 200, 58, 48, + (64,140,0): 196, 52, 41, + (64,141,0): 199, 53, 40, + (64,142,0): 203, 52, 41, + (64,143,0): 197, 53, 42, + (64,144,0): 188, 60, 47, + (64,145,0): 179, 57, 44, + (64,146,0): 173, 47, 35, + (64,147,0): 171, 40, 30, + (64,148,0): 179, 45, 36, + (64,149,0): 195, 57, 47, + (64,150,0): 210, 67, 59, + (64,151,0): 216, 72, 63, + (64,152,0): 228, 80, 70, + (64,153,0): 223, 69, 61, + (64,154,0): 218, 55, 48, + (64,155,0): 221, 48, 42, + (64,156,0): 231, 48, 44, + (64,157,0): 242, 50, 49, + (64,158,0): 249, 49, 51, + (64,159,0): 253, 49, 52, + (64,160,0): 247, 47, 49, + (64,161,0): 246, 48, 49, + (64,162,0): 246, 48, 49, + (64,163,0): 243, 48, 46, + (64,164,0): 242, 48, 46, + (64,165,0): 237, 50, 45, + (64,166,0): 230, 53, 45, + (64,167,0): 221, 57, 47, + (64,168,0): 213, 61, 48, + (64,169,0): 190, 50, 37, + (64,170,0): 192, 62, 49, + (64,171,0): 185, 61, 51, + (64,172,0): 214, 95, 89, + (64,173,0): 233, 115, 113, + (64,174,0): 255, 143, 143, + (64,175,0): 251, 132, 134, + (64,176,0): 255, 135, 140, + (64,177,0): 255, 132, 141, + (64,178,0): 255, 120, 135, + (64,179,0): 253, 104, 123, + (64,180,0): 252, 95, 116, + (64,181,0): 254, 92, 115, + (64,182,0): 250, 86, 110, + (64,183,0): 243, 77, 101, + (64,184,0): 242, 72, 99, + (64,185,0): 235, 60, 89, + (64,186,0): 237, 62, 91, + (64,187,0): 224, 66, 89, + (64,188,0): 216, 94, 105, + (64,189,0): 141, 63, 59, + (64,190,0): 92, 67, 45, + (64,191,0): 83, 91, 54, + (64,192,0): 92, 116, 66, + (64,193,0): 103, 134, 77, + (64,194,0): 119, 150, 93, + (64,195,0): 125, 156, 99, + (64,196,0): 127, 157, 103, + (64,197,0): 128, 161, 106, + (64,198,0): 131, 166, 110, + (64,199,0): 130, 168, 111, + (64,200,0): 128, 167, 110, + (64,201,0): 127, 166, 109, + (64,202,0): 126, 165, 108, + (64,203,0): 125, 165, 105, + (64,204,0): 124, 164, 104, + (64,205,0): 125, 163, 102, + (64,206,0): 127, 163, 101, + (64,207,0): 127, 163, 102, + (64,208,0): 127, 165, 108, + (64,209,0): 127, 166, 109, + (64,210,0): 129, 171, 108, + (64,211,0): 127, 172, 107, + (64,212,0): 126, 173, 103, + (64,213,0): 127, 174, 102, + (64,214,0): 129, 177, 103, + (64,215,0): 131, 179, 105, + (64,216,0): 135, 181, 109, + (64,217,0): 139, 180, 114, + (64,218,0): 139, 177, 118, + (64,219,0): 142, 174, 124, + (64,220,0): 153, 180, 137, + (64,221,0): 167, 189, 153, + (64,222,0): 175, 194, 164, + (64,223,0): 178, 193, 174, + (64,224,0): 163, 175, 173, + (64,225,0): 141, 152, 158, + (64,226,0): 124, 135, 141, + (65,0,0): 93, 75, 55, + (65,1,0): 93, 75, 55, + (65,2,0): 93, 75, 55, + (65,3,0): 93, 75, 55, + (65,4,0): 93, 75, 55, + (65,5,0): 93, 75, 55, + (65,6,0): 93, 75, 55, + (65,7,0): 93, 75, 55, + (65,8,0): 94, 76, 56, + (65,9,0): 94, 76, 56, + (65,10,0): 94, 76, 56, + (65,11,0): 94, 76, 56, + (65,12,0): 94, 76, 56, + (65,13,0): 94, 76, 56, + (65,14,0): 94, 76, 56, + (65,15,0): 94, 75, 58, + (65,16,0): 92, 75, 59, + (65,17,0): 94, 76, 62, + (65,18,0): 95, 77, 63, + (65,19,0): 94, 78, 62, + (65,20,0): 91, 78, 61, + (65,21,0): 91, 78, 61, + (65,22,0): 92, 81, 63, + (65,23,0): 94, 82, 66, + (65,24,0): 95, 83, 67, + (65,25,0): 93, 81, 65, + (65,26,0): 93, 79, 66, + (65,27,0): 95, 79, 66, + (65,28,0): 96, 78, 68, + (65,29,0): 98, 80, 70, + (65,30,0): 99, 79, 72, + (65,31,0): 101, 77, 73, + (65,32,0): 105, 76, 78, + (65,33,0): 103, 78, 84, + (65,34,0): 101, 83, 97, + (65,35,0): 103, 95, 116, + (65,36,0): 110, 111, 142, + (65,37,0): 121, 126, 166, + (65,38,0): 128, 136, 183, + (65,39,0): 135, 139, 187, + (65,40,0): 158, 150, 199, + (65,41,0): 163, 140, 182, + (65,42,0): 171, 127, 160, + (65,43,0): 185, 120, 142, + (65,44,0): 211, 121, 133, + (65,45,0): 234, 124, 125, + (65,46,0): 244, 117, 111, + (65,47,0): 244, 105, 100, + (65,48,0): 245, 94, 99, + (65,49,0): 238, 81, 90, + (65,50,0): 233, 71, 82, + (65,51,0): 238, 74, 83, + (65,52,0): 243, 76, 86, + (65,53,0): 242, 71, 80, + (65,54,0): 238, 64, 74, + (65,55,0): 234, 60, 69, + (65,56,0): 228, 57, 63, + (65,57,0): 224, 58, 60, + (65,58,0): 220, 57, 58, + (65,59,0): 215, 60, 56, + (65,60,0): 210, 61, 55, + (65,61,0): 203, 60, 52, + (65,62,0): 196, 58, 47, + (65,63,0): 186, 59, 44, + (65,64,0): 171, 60, 43, + (65,65,0): 170, 63, 45, + (65,66,0): 169, 56, 40, + (65,67,0): 178, 58, 44, + (65,68,0): 193, 65, 54, + (65,69,0): 197, 60, 52, + (65,70,0): 199, 54, 49, + (65,71,0): 212, 60, 55, + (65,72,0): 210, 53, 48, + (65,73,0): 214, 53, 45, + (65,74,0): 215, 53, 42, + (65,75,0): 216, 52, 40, + (65,76,0): 217, 56, 38, + (65,77,0): 219, 58, 38, + (65,78,0): 219, 59, 37, + (65,79,0): 218, 57, 39, + (65,80,0): 221, 54, 46, + (65,81,0): 230, 65, 59, + (65,82,0): 235, 77, 68, + (65,83,0): 225, 73, 60, + (65,84,0): 208, 62, 47, + (65,85,0): 199, 56, 40, + (65,86,0): 202, 56, 41, + (65,87,0): 211, 59, 46, + (65,88,0): 221, 58, 51, + (65,89,0): 245, 73, 69, + (65,90,0): 228, 48, 49, + (65,91,0): 241, 55, 60, + (65,92,0): 246, 54, 65, + (65,93,0): 241, 46, 60, + (65,94,0): 255, 63, 77, + (65,95,0): 237, 37, 50, + (65,96,0): 243, 36, 44, + (65,97,0): 247, 37, 40, + (65,98,0): 251, 41, 44, + (65,99,0): 253, 43, 44, + (65,100,0): 252, 42, 43, + (65,101,0): 248, 40, 40, + (65,102,0): 246, 40, 40, + (65,103,0): 247, 43, 44, + (65,104,0): 239, 36, 39, + (65,105,0): 237, 37, 40, + (65,106,0): 234, 37, 44, + (65,107,0): 253, 59, 68, + (65,108,0): 216, 26, 38, + (65,109,0): 238, 50, 65, + (65,110,0): 250, 63, 80, + (65,111,0): 213, 35, 51, + (65,112,0): 255, 104, 117, + (65,113,0): 255, 97, 106, + (65,114,0): 255, 90, 97, + (65,115,0): 253, 86, 93, + (65,116,0): 247, 78, 83, + (65,117,0): 231, 65, 67, + (65,118,0): 218, 59, 56, + (65,119,0): 210, 61, 54, + (65,120,0): 193, 55, 44, + (65,121,0): 194, 66, 53, + (65,122,0): 188, 71, 54, + (65,123,0): 172, 61, 44, + (65,124,0): 154, 47, 31, + (65,125,0): 147, 39, 26, + (65,126,0): 146, 38, 25, + (65,127,0): 147, 39, 27, + (65,128,0): 158, 45, 37, + (65,129,0): 176, 58, 54, + (65,130,0): 209, 84, 80, + (65,131,0): 206, 72, 71, + (65,132,0): 195, 53, 52, + (65,133,0): 198, 52, 53, + (65,134,0): 209, 61, 61, + (65,135,0): 235, 87, 85, + (65,136,0): 216, 71, 66, + (65,137,0): 214, 71, 63, + (65,138,0): 208, 65, 57, + (65,139,0): 199, 57, 47, + (65,140,0): 198, 51, 41, + (65,141,0): 202, 54, 44, + (65,142,0): 208, 55, 47, + (65,143,0): 206, 55, 48, + (65,144,0): 199, 61, 51, + (65,145,0): 194, 57, 49, + (65,146,0): 194, 53, 46, + (65,147,0): 195, 50, 45, + (65,148,0): 201, 52, 46, + (65,149,0): 209, 56, 51, + (65,150,0): 216, 63, 57, + (65,151,0): 222, 69, 61, + (65,152,0): 228, 74, 64, + (65,153,0): 222, 65, 56, + (65,154,0): 218, 54, 45, + (65,155,0): 221, 48, 42, + (65,156,0): 231, 48, 44, + (65,157,0): 242, 50, 49, + (65,158,0): 251, 48, 51, + (65,159,0): 251, 48, 51, + (65,160,0): 244, 48, 50, + (65,161,0): 243, 49, 50, + (65,162,0): 244, 48, 49, + (65,163,0): 243, 47, 48, + (65,164,0): 243, 48, 46, + (65,165,0): 238, 49, 45, + (65,166,0): 231, 52, 45, + (65,167,0): 223, 57, 45, + (65,168,0): 215, 61, 49, + (65,169,0): 191, 51, 36, + (65,170,0): 190, 60, 47, + (65,171,0): 183, 61, 50, + (65,172,0): 211, 94, 87, + (65,173,0): 233, 118, 115, + (65,174,0): 255, 144, 144, + (65,175,0): 249, 133, 136, + (65,176,0): 253, 134, 140, + (65,177,0): 255, 128, 138, + (65,178,0): 255, 115, 132, + (65,179,0): 255, 100, 121, + (65,180,0): 255, 92, 116, + (65,181,0): 255, 89, 114, + (65,182,0): 252, 84, 110, + (65,183,0): 246, 76, 103, + (65,184,0): 243, 68, 97, + (65,185,0): 236, 61, 90, + (65,186,0): 236, 66, 95, + (65,187,0): 223, 74, 96, + (65,188,0): 194, 83, 92, + (65,189,0): 128, 61, 55, + (65,190,0): 88, 67, 46, + (65,191,0): 82, 92, 57, + (65,192,0): 91, 118, 67, + (65,193,0): 101, 135, 75, + (65,194,0): 115, 149, 89, + (65,195,0): 120, 156, 95, + (65,196,0): 119, 157, 98, + (65,197,0): 123, 161, 102, + (65,198,0): 125, 165, 105, + (65,199,0): 125, 166, 106, + (65,200,0): 124, 165, 105, + (65,201,0): 124, 165, 105, + (65,202,0): 124, 164, 104, + (65,203,0): 123, 163, 101, + (65,204,0): 123, 161, 100, + (65,205,0): 123, 161, 100, + (65,206,0): 125, 161, 99, + (65,207,0): 126, 162, 101, + (65,208,0): 124, 163, 106, + (65,209,0): 125, 166, 108, + (65,210,0): 125, 169, 108, + (65,211,0): 125, 170, 105, + (65,212,0): 124, 171, 101, + (65,213,0): 125, 173, 99, + (65,214,0): 127, 175, 99, + (65,215,0): 130, 177, 99, + (65,216,0): 133, 176, 104, + (65,217,0): 135, 178, 107, + (65,218,0): 136, 175, 112, + (65,219,0): 136, 171, 115, + (65,220,0): 139, 171, 124, + (65,221,0): 144, 172, 132, + (65,222,0): 144, 170, 135, + (65,223,0): 140, 162, 139, + (65,224,0): 118, 133, 126, + (65,225,0): 99, 111, 111, + (65,226,0): 83, 95, 95, + (66,0,0): 93, 76, 56, + (66,1,0): 93, 76, 56, + (66,2,0): 93, 76, 56, + (66,3,0): 93, 76, 56, + (66,4,0): 93, 76, 56, + (66,5,0): 93, 76, 56, + (66,6,0): 93, 76, 56, + (66,7,0): 93, 76, 56, + (66,8,0): 93, 76, 56, + (66,9,0): 93, 76, 56, + (66,10,0): 93, 76, 56, + (66,11,0): 93, 76, 56, + (66,12,0): 93, 76, 56, + (66,13,0): 93, 76, 56, + (66,14,0): 93, 76, 56, + (66,15,0): 93, 76, 56, + (66,16,0): 94, 75, 58, + (66,17,0): 95, 78, 62, + (66,18,0): 97, 80, 64, + (66,19,0): 96, 80, 64, + (66,20,0): 93, 80, 63, + (66,21,0): 92, 79, 62, + (66,22,0): 91, 79, 63, + (66,23,0): 91, 82, 67, + (66,24,0): 91, 81, 69, + (66,25,0): 91, 81, 71, + (66,26,0): 92, 79, 71, + (66,27,0): 92, 79, 73, + (66,28,0): 95, 80, 77, + (66,29,0): 99, 81, 79, + (66,30,0): 102, 84, 84, + (66,31,0): 103, 84, 86, + (66,32,0): 103, 84, 88, + (66,33,0): 103, 86, 96, + (66,34,0): 104, 92, 112, + (66,35,0): 108, 105, 134, + (66,36,0): 115, 118, 161, + (66,37,0): 124, 131, 185, + (66,38,0): 130, 138, 201, + (66,39,0): 138, 142, 206, + (66,40,0): 152, 146, 210, + (66,41,0): 160, 139, 196, + (66,42,0): 170, 131, 178, + (66,43,0): 185, 125, 159, + (66,44,0): 207, 128, 147, + (66,45,0): 228, 131, 138, + (66,46,0): 238, 126, 122, + (66,47,0): 242, 115, 109, + (66,48,0): 248, 102, 105, + (66,49,0): 242, 85, 92, + (66,50,0): 234, 73, 81, + (66,51,0): 237, 72, 79, + (66,52,0): 243, 73, 82, + (66,53,0): 245, 71, 81, + (66,54,0): 242, 65, 75, + (66,55,0): 238, 61, 69, + (66,56,0): 228, 55, 61, + (66,57,0): 224, 55, 58, + (66,58,0): 219, 56, 57, + (66,59,0): 213, 60, 55, + (66,60,0): 207, 63, 55, + (66,61,0): 201, 63, 52, + (66,62,0): 193, 61, 48, + (66,63,0): 184, 61, 45, + (66,64,0): 174, 61, 45, + (66,65,0): 170, 60, 43, + (66,66,0): 171, 58, 44, + (66,67,0): 184, 66, 54, + (66,68,0): 199, 72, 63, + (66,69,0): 192, 59, 50, + (66,70,0): 187, 48, 41, + (66,71,0): 202, 58, 50, + (66,72,0): 205, 54, 47, + (66,73,0): 208, 54, 46, + (66,74,0): 213, 55, 44, + (66,75,0): 216, 56, 44, + (66,76,0): 217, 55, 40, + (66,77,0): 217, 56, 38, + (66,78,0): 220, 57, 38, + (66,79,0): 224, 58, 42, + (66,80,0): 221, 52, 45, + (66,81,0): 219, 52, 46, + (66,82,0): 226, 65, 57, + (66,83,0): 233, 79, 67, + (66,84,0): 222, 72, 58, + (66,85,0): 200, 53, 37, + (66,86,0): 200, 50, 35, + (66,87,0): 217, 64, 50, + (66,88,0): 226, 62, 53, + (66,89,0): 245, 72, 68, + (66,90,0): 231, 48, 50, + (66,91,0): 242, 53, 59, + (66,92,0): 248, 54, 63, + (66,93,0): 245, 49, 61, + (66,94,0): 255, 66, 80, + (66,95,0): 244, 46, 59, + (66,96,0): 240, 41, 48, + (66,97,0): 235, 35, 38, + (66,98,0): 236, 36, 39, + (66,99,0): 249, 49, 51, + (66,100,0): 245, 45, 47, + (66,101,0): 239, 39, 39, + (66,102,0): 236, 38, 37, + (66,103,0): 245, 49, 50, + (66,104,0): 234, 40, 41, + (66,105,0): 245, 55, 57, + (66,106,0): 231, 42, 48, + (66,107,0): 225, 40, 48, + (66,108,0): 234, 50, 60, + (66,109,0): 255, 81, 93, + (66,110,0): 237, 59, 73, + (66,111,0): 255, 89, 101, + (66,112,0): 255, 94, 102, + (66,113,0): 242, 85, 92, + (66,114,0): 239, 78, 84, + (66,115,0): 241, 76, 82, + (66,116,0): 235, 69, 73, + (66,117,0): 222, 58, 59, + (66,118,0): 214, 55, 52, + (66,119,0): 214, 62, 57, + (66,120,0): 194, 53, 44, + (66,121,0): 194, 62, 50, + (66,122,0): 189, 65, 53, + (66,123,0): 181, 60, 49, + (66,124,0): 173, 55, 45, + (66,125,0): 168, 49, 41, + (66,126,0): 162, 43, 35, + (66,127,0): 157, 38, 32, + (66,128,0): 155, 36, 30, + (66,129,0): 169, 47, 42, + (66,130,0): 199, 69, 67, + (66,131,0): 194, 58, 58, + (66,132,0): 188, 44, 44, + (66,133,0): 200, 51, 53, + (66,134,0): 215, 65, 66, + (66,135,0): 244, 94, 93, + (66,136,0): 208, 63, 58, + (66,137,0): 210, 67, 59, + (66,138,0): 208, 65, 57, + (66,139,0): 203, 61, 51, + (66,140,0): 204, 57, 47, + (66,141,0): 212, 61, 52, + (66,142,0): 218, 64, 56, + (66,143,0): 219, 64, 59, + (66,144,0): 219, 64, 60, + (66,145,0): 216, 61, 59, + (66,146,0): 221, 62, 59, + (66,147,0): 227, 65, 63, + (66,148,0): 228, 62, 62, + (66,149,0): 224, 58, 58, + (66,150,0): 227, 63, 61, + (66,151,0): 235, 73, 68, + (66,152,0): 224, 66, 57, + (66,153,0): 221, 60, 52, + (66,154,0): 217, 53, 44, + (66,155,0): 221, 50, 43, + (66,156,0): 231, 49, 45, + (66,157,0): 240, 51, 49, + (66,158,0): 245, 49, 50, + (66,159,0): 248, 48, 50, + (66,160,0): 244, 48, 50, + (66,161,0): 244, 48, 50, + (66,162,0): 244, 48, 49, + (66,163,0): 243, 47, 48, + (66,164,0): 243, 48, 46, + (66,165,0): 238, 49, 45, + (66,166,0): 231, 52, 45, + (66,167,0): 223, 57, 45, + (66,168,0): 216, 62, 50, + (66,169,0): 192, 52, 37, + (66,170,0): 186, 56, 43, + (66,171,0): 181, 59, 48, + (66,172,0): 208, 91, 84, + (66,173,0): 237, 122, 119, + (66,174,0): 255, 147, 146, + (66,175,0): 251, 135, 138, + (66,176,0): 253, 129, 137, + (66,177,0): 255, 124, 137, + (66,178,0): 255, 113, 129, + (66,179,0): 253, 100, 120, + (66,180,0): 254, 90, 114, + (66,181,0): 255, 85, 111, + (66,182,0): 252, 79, 107, + (66,183,0): 250, 73, 102, + (66,184,0): 244, 65, 95, + (66,185,0): 238, 63, 92, + (66,186,0): 234, 71, 98, + (66,187,0): 223, 84, 103, + (66,188,0): 165, 64, 72, + (66,189,0): 117, 56, 51, + (66,190,0): 88, 70, 50, + (66,191,0): 85, 95, 60, + (66,192,0): 95, 119, 69, + (66,193,0): 102, 135, 78, + (66,194,0): 114, 147, 90, + (66,195,0): 117, 152, 94, + (66,196,0): 116, 154, 95, + (66,197,0): 120, 158, 99, + (66,198,0): 123, 163, 103, + (66,199,0): 123, 163, 103, + (66,200,0): 121, 162, 102, + (66,201,0): 121, 162, 102, + (66,202,0): 121, 161, 99, + (66,203,0): 120, 160, 98, + (66,204,0): 121, 159, 98, + (66,205,0): 121, 160, 97, + (66,206,0): 124, 160, 98, + (66,207,0): 122, 160, 99, + (66,208,0): 122, 162, 102, + (66,209,0): 123, 164, 104, + (66,210,0): 123, 167, 104, + (66,211,0): 123, 168, 101, + (66,212,0): 123, 169, 97, + (66,213,0): 123, 169, 96, + (66,214,0): 125, 171, 96, + (66,215,0): 127, 174, 96, + (66,216,0): 135, 178, 106, + (66,217,0): 138, 181, 110, + (66,218,0): 139, 178, 115, + (66,219,0): 137, 172, 116, + (66,220,0): 134, 166, 119, + (66,221,0): 130, 158, 117, + (66,222,0): 121, 147, 110, + (66,223,0): 111, 134, 108, + (66,224,0): 81, 99, 87, + (66,225,0): 64, 79, 76, + (66,226,0): 50, 65, 62, + (67,0,0): 94, 77, 57, + (67,1,0): 94, 77, 57, + (67,2,0): 94, 77, 57, + (67,3,0): 94, 77, 57, + (67,4,0): 94, 77, 57, + (67,5,0): 94, 77, 57, + (67,6,0): 94, 77, 57, + (67,7,0): 94, 77, 57, + (67,8,0): 94, 77, 57, + (67,9,0): 94, 77, 57, + (67,10,0): 94, 77, 57, + (67,11,0): 94, 77, 57, + (67,12,0): 94, 77, 57, + (67,13,0): 94, 77, 57, + (67,14,0): 94, 77, 57, + (67,15,0): 94, 77, 57, + (67,16,0): 94, 76, 56, + (67,17,0): 96, 78, 58, + (67,18,0): 97, 80, 60, + (67,19,0): 96, 81, 62, + (67,20,0): 93, 80, 63, + (67,21,0): 90, 78, 62, + (67,22,0): 89, 79, 67, + (67,23,0): 88, 80, 69, + (67,24,0): 88, 79, 72, + (67,25,0): 91, 81, 79, + (67,26,0): 95, 85, 84, + (67,27,0): 98, 88, 89, + (67,28,0): 101, 88, 95, + (67,29,0): 105, 89, 99, + (67,30,0): 108, 92, 102, + (67,31,0): 107, 94, 104, + (67,32,0): 108, 96, 108, + (67,33,0): 108, 99, 116, + (67,34,0): 111, 107, 134, + (67,35,0): 114, 116, 155, + (67,36,0): 121, 126, 181, + (67,37,0): 127, 135, 200, + (67,38,0): 133, 141, 214, + (67,39,0): 140, 143, 220, + (67,40,0): 142, 135, 212, + (67,41,0): 159, 139, 208, + (67,42,0): 173, 138, 194, + (67,43,0): 179, 129, 167, + (67,44,0): 189, 121, 144, + (67,45,0): 204, 123, 130, + (67,46,0): 222, 129, 124, + (67,47,0): 241, 130, 123, + (67,48,0): 254, 116, 116, + (67,49,0): 253, 100, 103, + (67,50,0): 244, 88, 92, + (67,51,0): 242, 79, 84, + (67,52,0): 242, 73, 80, + (67,53,0): 242, 68, 77, + (67,54,0): 240, 63, 71, + (67,55,0): 239, 60, 66, + (67,56,0): 229, 54, 59, + (67,57,0): 225, 55, 56, + (67,58,0): 219, 57, 55, + (67,59,0): 213, 60, 55, + (67,60,0): 206, 64, 54, + (67,61,0): 198, 64, 52, + (67,62,0): 191, 64, 49, + (67,63,0): 184, 63, 46, + (67,64,0): 173, 57, 42, + (67,65,0): 173, 62, 45, + (67,66,0): 177, 61, 48, + (67,67,0): 188, 70, 58, + (67,68,0): 204, 82, 71, + (67,69,0): 199, 72, 63, + (67,70,0): 186, 53, 46, + (67,71,0): 186, 49, 41, + (67,72,0): 200, 57, 49, + (67,73,0): 205, 56, 49, + (67,74,0): 211, 59, 48, + (67,75,0): 217, 61, 49, + (67,76,0): 219, 59, 45, + (67,77,0): 217, 54, 39, + (67,78,0): 220, 54, 38, + (67,79,0): 224, 56, 43, + (67,80,0): 224, 53, 45, + (67,81,0): 219, 50, 43, + (67,82,0): 224, 61, 52, + (67,83,0): 236, 78, 66, + (67,84,0): 227, 75, 61, + (67,85,0): 210, 58, 44, + (67,86,0): 209, 56, 42, + (67,87,0): 224, 66, 54, + (67,88,0): 222, 54, 45, + (67,89,0): 240, 62, 58, + (67,90,0): 233, 47, 48, + (67,91,0): 239, 48, 53, + (67,92,0): 245, 50, 58, + (67,93,0): 248, 52, 62, + (67,94,0): 255, 74, 86, + (67,95,0): 255, 70, 79, + (67,96,0): 253, 62, 69, + (67,97,0): 242, 51, 56, + (67,98,0): 226, 36, 38, + (67,99,0): 237, 47, 49, + (67,100,0): 234, 44, 44, + (67,101,0): 240, 50, 50, + (67,102,0): 232, 42, 42, + (67,103,0): 235, 47, 46, + (67,104,0): 241, 57, 57, + (67,105,0): 209, 26, 28, + (67,106,0): 229, 50, 54, + (67,107,0): 220, 43, 49, + (67,108,0): 231, 56, 63, + (67,109,0): 239, 68, 76, + (67,110,0): 255, 87, 98, + (67,111,0): 241, 75, 85, + (67,112,0): 217, 60, 67, + (67,113,0): 219, 64, 68, + (67,114,0): 225, 66, 70, + (67,115,0): 225, 62, 65, + (67,116,0): 222, 57, 61, + (67,117,0): 220, 56, 57, + (67,118,0): 218, 55, 56, + (67,119,0): 212, 57, 55, + (67,120,0): 201, 56, 51, + (67,121,0): 195, 56, 49, + (67,122,0): 190, 57, 50, + (67,123,0): 193, 64, 58, + (67,124,0): 206, 77, 72, + (67,125,0): 215, 85, 83, + (67,126,0): 210, 77, 78, + (67,127,0): 196, 66, 64, + (67,128,0): 178, 55, 50, + (67,129,0): 182, 57, 53, + (67,130,0): 207, 75, 73, + (67,131,0): 217, 77, 76, + (67,132,0): 227, 81, 82, + (67,133,0): 239, 89, 90, + (67,134,0): 234, 82, 81, + (67,135,0): 241, 89, 86, + (67,136,0): 201, 53, 49, + (67,137,0): 206, 62, 54, + (67,138,0): 210, 66, 57, + (67,139,0): 208, 64, 55, + (67,140,0): 211, 63, 53, + (67,141,0): 217, 66, 57, + (67,142,0): 224, 67, 60, + (67,143,0): 226, 64, 59, + (67,144,0): 233, 63, 64, + (67,145,0): 231, 56, 61, + (67,146,0): 236, 57, 61, + (67,147,0): 242, 63, 67, + (67,148,0): 239, 58, 63, + (67,149,0): 232, 53, 56, + (67,150,0): 236, 62, 61, + (67,151,0): 246, 77, 74, + (67,152,0): 222, 57, 51, + (67,153,0): 219, 54, 48, + (67,154,0): 218, 51, 43, + (67,155,0): 222, 51, 44, + (67,156,0): 229, 52, 46, + (67,157,0): 236, 51, 48, + (67,158,0): 242, 50, 49, + (67,159,0): 244, 48, 49, + (67,160,0): 244, 48, 50, + (67,161,0): 246, 47, 50, + (67,162,0): 246, 48, 49, + (67,163,0): 245, 47, 48, + (67,164,0): 245, 47, 46, + (67,165,0): 240, 48, 45, + (67,166,0): 233, 52, 45, + (67,167,0): 224, 56, 45, + (67,168,0): 217, 63, 51, + (67,169,0): 194, 54, 39, + (67,170,0): 183, 53, 40, + (67,171,0): 179, 57, 46, + (67,172,0): 203, 86, 79, + (67,173,0): 239, 124, 121, + (67,174,0): 255, 147, 146, + (67,175,0): 254, 135, 139, + (67,176,0): 255, 128, 137, + (67,177,0): 255, 121, 135, + (67,178,0): 252, 110, 126, + (67,179,0): 250, 99, 118, + (67,180,0): 250, 88, 111, + (67,181,0): 252, 80, 106, + (67,182,0): 251, 72, 102, + (67,183,0): 250, 67, 98, + (67,184,0): 242, 61, 92, + (67,185,0): 239, 66, 94, + (67,186,0): 229, 77, 100, + (67,187,0): 215, 90, 104, + (67,188,0): 136, 50, 53, + (67,189,0): 107, 57, 48, + (67,190,0): 92, 77, 56, + (67,191,0): 91, 101, 67, + (67,192,0): 99, 123, 75, + (67,193,0): 106, 137, 80, + (67,194,0): 115, 146, 89, + (67,195,0): 116, 149, 92, + (67,196,0): 117, 152, 94, + (67,197,0): 119, 157, 98, + (67,198,0): 121, 161, 101, + (67,199,0): 122, 162, 102, + (67,200,0): 119, 160, 100, + (67,201,0): 118, 160, 97, + (67,202,0): 119, 159, 97, + (67,203,0): 118, 158, 96, + (67,204,0): 120, 159, 96, + (67,205,0): 120, 159, 96, + (67,206,0): 123, 159, 97, + (67,207,0): 122, 160, 99, + (67,208,0): 122, 162, 102, + (67,209,0): 122, 163, 103, + (67,210,0): 122, 167, 102, + (67,211,0): 122, 167, 98, + (67,212,0): 122, 168, 96, + (67,213,0): 122, 168, 93, + (67,214,0): 124, 171, 93, + (67,215,0): 126, 173, 95, + (67,216,0): 134, 178, 103, + (67,217,0): 139, 180, 110, + (67,218,0): 140, 179, 116, + (67,219,0): 138, 173, 115, + (67,220,0): 134, 166, 117, + (67,221,0): 128, 157, 113, + (67,222,0): 116, 142, 105, + (67,223,0): 105, 128, 100, + (67,224,0): 80, 98, 84, + (67,225,0): 67, 82, 75, + (67,226,0): 56, 71, 64, + (68,0,0): 94, 77, 59, + (68,1,0): 94, 77, 59, + (68,2,0): 94, 77, 59, + (68,3,0): 94, 77, 59, + (68,4,0): 94, 77, 59, + (68,5,0): 94, 77, 59, + (68,6,0): 94, 77, 59, + (68,7,0): 94, 77, 59, + (68,8,0): 94, 77, 59, + (68,9,0): 94, 77, 59, + (68,10,0): 94, 77, 59, + (68,11,0): 94, 77, 59, + (68,12,0): 94, 77, 59, + (68,13,0): 94, 77, 59, + (68,14,0): 94, 77, 59, + (68,15,0): 94, 77, 57, + (68,16,0): 93, 75, 53, + (68,17,0): 95, 77, 53, + (68,18,0): 96, 80, 57, + (68,19,0): 95, 80, 59, + (68,20,0): 92, 79, 62, + (68,21,0): 90, 78, 64, + (68,22,0): 88, 79, 70, + (68,23,0): 88, 81, 75, + (68,24,0): 89, 80, 81, + (68,25,0): 96, 87, 92, + (68,26,0): 103, 96, 104, + (68,27,0): 110, 102, 115, + (68,28,0): 115, 104, 121, + (68,29,0): 115, 103, 123, + (68,30,0): 115, 103, 125, + (68,31,0): 113, 103, 127, + (68,32,0): 111, 108, 129, + (68,33,0): 112, 112, 138, + (68,34,0): 114, 118, 153, + (68,35,0): 118, 124, 172, + (68,36,0): 122, 130, 193, + (68,37,0): 127, 135, 208, + (68,38,0): 132, 139, 220, + (68,39,0): 138, 140, 225, + (68,40,0): 147, 142, 224, + (68,41,0): 157, 141, 214, + (68,42,0): 160, 132, 190, + (68,43,0): 158, 117, 159, + (68,44,0): 160, 108, 130, + (68,45,0): 172, 110, 115, + (68,46,0): 188, 117, 111, + (68,47,0): 210, 118, 107, + (68,48,0): 240, 115, 109, + (68,49,0): 253, 109, 108, + (68,50,0): 254, 104, 105, + (68,51,0): 251, 95, 96, + (68,52,0): 249, 83, 87, + (68,53,0): 244, 71, 77, + (68,54,0): 237, 60, 66, + (68,55,0): 234, 55, 61, + (68,56,0): 232, 53, 59, + (68,57,0): 227, 54, 56, + (68,58,0): 221, 57, 56, + (68,59,0): 215, 60, 55, + (68,60,0): 208, 64, 55, + (68,61,0): 199, 65, 53, + (68,62,0): 192, 65, 48, + (68,63,0): 185, 64, 47, + (68,64,0): 173, 55, 41, + (68,65,0): 180, 64, 51, + (68,66,0): 175, 58, 48, + (68,67,0): 176, 59, 49, + (68,68,0): 200, 82, 72, + (68,69,0): 213, 92, 81, + (68,70,0): 201, 77, 67, + (68,71,0): 187, 59, 48, + (68,72,0): 190, 57, 48, + (68,73,0): 193, 55, 45, + (68,74,0): 204, 57, 47, + (68,75,0): 214, 62, 51, + (68,76,0): 219, 61, 49, + (68,77,0): 218, 54, 42, + (68,78,0): 220, 52, 39, + (68,79,0): 226, 54, 42, + (68,80,0): 224, 51, 44, + (68,81,0): 226, 55, 48, + (68,82,0): 228, 61, 53, + (68,83,0): 229, 69, 57, + (68,84,0): 226, 70, 57, + (68,85,0): 222, 66, 51, + (68,86,0): 222, 65, 50, + (68,87,0): 226, 62, 50, + (68,88,0): 219, 48, 38, + (68,89,0): 234, 55, 50, + (68,90,0): 236, 48, 47, + (68,91,0): 238, 45, 48, + (68,92,0): 239, 44, 50, + (68,93,0): 246, 51, 59, + (68,94,0): 255, 76, 84, + (68,95,0): 255, 87, 94, + (68,96,0): 255, 90, 95, + (68,97,0): 255, 79, 83, + (68,98,0): 225, 46, 49, + (68,99,0): 227, 48, 51, + (68,100,0): 224, 44, 45, + (68,101,0): 247, 69, 69, + (68,102,0): 232, 54, 54, + (68,103,0): 220, 44, 44, + (68,104,0): 218, 44, 45, + (68,105,0): 234, 61, 63, + (68,106,0): 219, 49, 52, + (68,107,0): 216, 50, 54, + (68,108,0): 255, 98, 104, + (68,109,0): 224, 61, 66, + (68,110,0): 202, 41, 49, + (68,111,0): 202, 45, 52, + (68,112,0): 193, 38, 42, + (68,113,0): 213, 59, 61, + (68,114,0): 224, 65, 69, + (68,115,0): 218, 55, 58, + (68,116,0): 217, 51, 55, + (68,117,0): 223, 57, 61, + (68,118,0): 220, 55, 59, + (68,119,0): 205, 47, 48, + (68,120,0): 204, 52, 51, + (68,121,0): 205, 59, 59, + (68,122,0): 211, 71, 70, + (68,123,0): 221, 83, 83, + (68,124,0): 235, 96, 99, + (68,125,0): 245, 105, 108, + (68,126,0): 244, 101, 107, + (68,127,0): 234, 94, 97, + (68,128,0): 196, 64, 62, + (68,129,0): 198, 69, 64, + (68,130,0): 229, 94, 91, + (68,131,0): 248, 104, 103, + (68,132,0): 255, 111, 112, + (68,133,0): 255, 106, 106, + (68,134,0): 229, 75, 75, + (68,135,0): 215, 61, 59, + (68,136,0): 201, 52, 48, + (68,137,0): 209, 62, 55, + (68,138,0): 215, 68, 60, + (68,139,0): 214, 67, 59, + (68,140,0): 213, 62, 53, + (68,141,0): 213, 60, 52, + (68,142,0): 216, 58, 49, + (68,143,0): 220, 52, 49, + (68,144,0): 238, 53, 59, + (68,145,0): 241, 45, 55, + (68,146,0): 240, 44, 54, + (68,147,0): 242, 46, 56, + (68,148,0): 239, 44, 52, + (68,149,0): 235, 44, 51, + (68,150,0): 243, 57, 60, + (68,151,0): 254, 74, 75, + (68,152,0): 223, 51, 47, + (68,153,0): 220, 51, 46, + (68,154,0): 218, 51, 43, + (68,155,0): 220, 51, 44, + (68,156,0): 227, 53, 46, + (68,157,0): 234, 52, 48, + (68,158,0): 239, 52, 47, + (68,159,0): 242, 50, 49, + (68,160,0): 244, 48, 50, + (68,161,0): 246, 47, 50, + (68,162,0): 247, 47, 49, + (68,163,0): 246, 46, 48, + (68,164,0): 245, 47, 46, + (68,165,0): 240, 48, 45, + (68,166,0): 234, 51, 45, + (68,167,0): 226, 55, 45, + (68,168,0): 217, 63, 51, + (68,169,0): 198, 56, 42, + (68,170,0): 180, 50, 37, + (68,171,0): 178, 56, 45, + (68,172,0): 195, 78, 71, + (68,173,0): 239, 124, 121, + (68,174,0): 255, 146, 145, + (68,175,0): 255, 135, 140, + (68,176,0): 255, 126, 137, + (68,177,0): 255, 117, 132, + (68,178,0): 249, 108, 124, + (68,179,0): 246, 97, 116, + (68,180,0): 245, 85, 109, + (68,181,0): 247, 74, 102, + (68,182,0): 249, 64, 96, + (68,183,0): 249, 59, 93, + (68,184,0): 243, 58, 92, + (68,185,0): 237, 68, 97, + (68,186,0): 219, 80, 101, + (68,187,0): 193, 87, 97, + (68,188,0): 114, 46, 43, + (68,189,0): 98, 62, 48, + (68,190,0): 96, 84, 62, + (68,191,0): 99, 106, 73, + (68,192,0): 102, 124, 77, + (68,193,0): 107, 137, 83, + (68,194,0): 116, 146, 92, + (68,195,0): 117, 150, 95, + (68,196,0): 118, 153, 95, + (68,197,0): 120, 158, 99, + (68,198,0): 121, 161, 99, + (68,199,0): 120, 160, 98, + (68,200,0): 117, 159, 96, + (68,201,0): 117, 159, 96, + (68,202,0): 117, 157, 95, + (68,203,0): 118, 158, 95, + (68,204,0): 119, 158, 95, + (68,205,0): 120, 159, 96, + (68,206,0): 123, 159, 97, + (68,207,0): 122, 161, 98, + (68,208,0): 122, 162, 100, + (68,209,0): 123, 165, 101, + (68,210,0): 124, 166, 100, + (68,211,0): 124, 167, 96, + (68,212,0): 121, 167, 94, + (68,213,0): 121, 168, 90, + (68,214,0): 123, 170, 92, + (68,215,0): 125, 172, 94, + (68,216,0): 128, 172, 97, + (68,217,0): 133, 175, 103, + (68,218,0): 135, 174, 109, + (68,219,0): 135, 170, 112, + (68,220,0): 133, 165, 115, + (68,221,0): 131, 160, 114, + (68,222,0): 123, 149, 110, + (68,223,0): 114, 138, 106, + (68,224,0): 100, 119, 100, + (68,225,0): 91, 107, 94, + (68,226,0): 81, 97, 84, + (69,0,0): 95, 78, 60, + (69,1,0): 95, 78, 60, + (69,2,0): 95, 78, 60, + (69,3,0): 95, 78, 60, + (69,4,0): 95, 78, 60, + (69,5,0): 95, 78, 60, + (69,6,0): 95, 78, 60, + (69,7,0): 95, 78, 60, + (69,8,0): 95, 78, 60, + (69,9,0): 95, 78, 60, + (69,10,0): 95, 78, 60, + (69,11,0): 95, 78, 60, + (69,12,0): 95, 78, 60, + (69,13,0): 95, 78, 60, + (69,14,0): 95, 78, 60, + (69,15,0): 95, 78, 58, + (69,16,0): 94, 76, 52, + (69,17,0): 95, 78, 52, + (69,18,0): 96, 78, 56, + (69,19,0): 94, 79, 58, + (69,20,0): 91, 78, 62, + (69,21,0): 89, 79, 69, + (69,22,0): 90, 83, 77, + (69,23,0): 90, 84, 84, + (69,24,0): 95, 90, 97, + (69,25,0): 104, 98, 112, + (69,26,0): 114, 109, 129, + (69,27,0): 122, 117, 140, + (69,28,0): 123, 117, 145, + (69,29,0): 123, 113, 147, + (69,30,0): 122, 112, 147, + (69,31,0): 118, 112, 148, + (69,32,0): 113, 116, 149, + (69,33,0): 114, 119, 157, + (69,34,0): 116, 124, 170, + (69,35,0): 119, 128, 183, + (69,36,0): 122, 131, 196, + (69,37,0): 126, 134, 207, + (69,38,0): 132, 138, 216, + (69,39,0): 139, 141, 218, + (69,40,0): 150, 144, 218, + (69,41,0): 153, 139, 201, + (69,42,0): 155, 133, 180, + (69,43,0): 162, 131, 162, + (69,44,0): 170, 132, 145, + (69,45,0): 171, 126, 123, + (69,46,0): 159, 107, 93, + (69,47,0): 153, 82, 64, + (69,48,0): 186, 78, 66, + (69,49,0): 210, 82, 73, + (69,50,0): 225, 88, 82, + (69,51,0): 233, 88, 85, + (69,52,0): 239, 84, 82, + (69,53,0): 241, 75, 77, + (69,54,0): 236, 63, 67, + (69,55,0): 229, 52, 58, + (69,56,0): 235, 56, 60, + (69,57,0): 231, 57, 59, + (69,58,0): 226, 58, 57, + (69,59,0): 218, 61, 56, + (69,60,0): 211, 64, 56, + (69,61,0): 203, 65, 54, + (69,62,0): 195, 63, 48, + (69,63,0): 188, 62, 47, + (69,64,0): 179, 57, 44, + (69,65,0): 186, 65, 54, + (69,66,0): 171, 53, 43, + (69,67,0): 163, 46, 36, + (69,68,0): 190, 73, 63, + (69,69,0): 217, 103, 92, + (69,70,0): 217, 100, 90, + (69,71,0): 203, 85, 73, + (69,72,0): 184, 60, 50, + (69,73,0): 184, 54, 41, + (69,74,0): 192, 51, 41, + (69,75,0): 206, 58, 48, + (69,76,0): 217, 59, 48, + (69,77,0): 218, 54, 44, + (69,78,0): 222, 51, 41, + (69,79,0): 228, 54, 45, + (69,80,0): 223, 49, 42, + (69,81,0): 228, 55, 49, + (69,82,0): 227, 59, 50, + (69,83,0): 221, 57, 47, + (69,84,0): 222, 62, 48, + (69,85,0): 227, 70, 53, + (69,86,0): 228, 66, 51, + (69,87,0): 223, 57, 43, + (69,88,0): 222, 48, 39, + (69,89,0): 233, 52, 45, + (69,90,0): 240, 51, 49, + (69,91,0): 239, 45, 46, + (69,92,0): 236, 41, 45, + (69,93,0): 242, 47, 53, + (69,94,0): 255, 66, 71, + (69,95,0): 255, 82, 87, + (69,96,0): 255, 93, 98, + (69,97,0): 255, 92, 97, + (69,98,0): 226, 57, 60, + (69,99,0): 227, 57, 60, + (69,100,0): 213, 43, 44, + (69,101,0): 244, 74, 75, + (69,102,0): 226, 56, 57, + (69,103,0): 215, 47, 47, + (69,104,0): 217, 51, 53, + (69,105,0): 203, 39, 40, + (69,106,0): 202, 37, 41, + (69,107,0): 247, 87, 89, + (69,108,0): 220, 61, 65, + (69,109,0): 213, 57, 61, + (69,110,0): 209, 54, 58, + (69,111,0): 186, 31, 35, + (69,112,0): 196, 40, 43, + (69,113,0): 219, 61, 62, + (69,114,0): 229, 66, 69, + (69,115,0): 219, 53, 57, + (69,116,0): 215, 44, 50, + (69,117,0): 220, 49, 55, + (69,118,0): 217, 48, 53, + (69,119,0): 204, 41, 46, + (69,120,0): 208, 52, 55, + (69,121,0): 226, 76, 78, + (69,122,0): 244, 98, 101, + (69,123,0): 250, 105, 110, + (69,124,0): 247, 100, 108, + (69,125,0): 246, 96, 105, + (69,126,0): 248, 96, 108, + (69,127,0): 248, 98, 107, + (69,128,0): 214, 76, 76, + (69,129,0): 213, 78, 74, + (69,130,0): 234, 92, 90, + (69,131,0): 234, 86, 84, + (69,132,0): 231, 77, 77, + (69,133,0): 227, 72, 70, + (69,134,0): 207, 52, 50, + (69,135,0): 206, 51, 47, + (69,136,0): 217, 65, 60, + (69,137,0): 224, 75, 68, + (69,138,0): 228, 79, 72, + (69,139,0): 223, 74, 67, + (69,140,0): 217, 64, 56, + (69,141,0): 215, 58, 51, + (69,142,0): 215, 54, 46, + (69,143,0): 220, 46, 45, + (69,144,0): 245, 50, 58, + (69,145,0): 251, 45, 58, + (69,146,0): 248, 42, 55, + (69,147,0): 245, 39, 52, + (69,148,0): 245, 41, 52, + (69,149,0): 248, 48, 58, + (69,150,0): 255, 62, 67, + (69,151,0): 255, 74, 74, + (69,152,0): 224, 49, 46, + (69,153,0): 222, 51, 44, + (69,154,0): 220, 51, 44, + (69,155,0): 221, 53, 44, + (69,156,0): 225, 52, 45, + (69,157,0): 231, 52, 47, + (69,158,0): 237, 52, 47, + (69,159,0): 240, 51, 47, + (69,160,0): 244, 48, 50, + (69,161,0): 247, 47, 50, + (69,162,0): 249, 46, 49, + (69,163,0): 248, 45, 48, + (69,164,0): 246, 46, 46, + (69,165,0): 241, 47, 45, + (69,166,0): 235, 50, 45, + (69,167,0): 226, 55, 45, + (69,168,0): 217, 61, 49, + (69,169,0): 201, 59, 45, + (69,170,0): 179, 49, 36, + (69,171,0): 177, 55, 44, + (69,172,0): 186, 67, 61, + (69,173,0): 236, 121, 118, + (69,174,0): 255, 141, 141, + (69,175,0): 255, 136, 141, + (69,176,0): 255, 123, 135, + (69,177,0): 255, 113, 129, + (69,178,0): 246, 104, 120, + (69,179,0): 243, 96, 114, + (69,180,0): 243, 83, 107, + (69,181,0): 244, 69, 98, + (69,182,0): 249, 58, 92, + (69,183,0): 249, 55, 90, + (69,184,0): 243, 58, 92, + (69,185,0): 235, 72, 99, + (69,186,0): 205, 80, 96, + (69,187,0): 160, 74, 77, + (69,188,0): 102, 52, 43, + (69,189,0): 89, 66, 48, + (69,190,0): 95, 87, 64, + (69,191,0): 99, 106, 73, + (69,192,0): 102, 124, 78, + (69,193,0): 107, 136, 82, + (69,194,0): 116, 145, 91, + (69,195,0): 119, 149, 95, + (69,196,0): 120, 153, 96, + (69,197,0): 123, 158, 100, + (69,198,0): 122, 160, 99, + (69,199,0): 118, 158, 96, + (69,200,0): 115, 155, 93, + (69,201,0): 114, 156, 92, + (69,202,0): 115, 155, 92, + (69,203,0): 116, 156, 93, + (69,204,0): 118, 157, 94, + (69,205,0): 119, 158, 95, + (69,206,0): 123, 159, 97, + (69,207,0): 122, 161, 98, + (69,208,0): 121, 161, 98, + (69,209,0): 122, 164, 98, + (69,210,0): 124, 167, 98, + (69,211,0): 123, 166, 95, + (69,212,0): 120, 166, 91, + (69,213,0): 120, 167, 89, + (69,214,0): 122, 169, 89, + (69,215,0): 123, 170, 90, + (69,216,0): 126, 170, 95, + (69,217,0): 131, 173, 101, + (69,218,0): 133, 172, 107, + (69,219,0): 135, 169, 109, + (69,220,0): 137, 167, 115, + (69,221,0): 137, 165, 117, + (69,222,0): 132, 157, 115, + (69,223,0): 124, 148, 114, + (69,224,0): 117, 137, 112, + (69,225,0): 111, 128, 109, + (69,226,0): 103, 120, 102, + (70,0,0): 95, 80, 61, + (70,1,0): 95, 80, 61, + (70,2,0): 95, 80, 61, + (70,3,0): 95, 80, 61, + (70,4,0): 95, 80, 61, + (70,5,0): 95, 80, 61, + (70,6,0): 95, 80, 61, + (70,7,0): 95, 80, 61, + (70,8,0): 94, 79, 60, + (70,9,0): 94, 79, 60, + (70,10,0): 94, 79, 60, + (70,11,0): 94, 79, 60, + (70,12,0): 94, 79, 60, + (70,13,0): 94, 79, 60, + (70,14,0): 94, 79, 60, + (70,15,0): 95, 78, 58, + (70,16,0): 97, 80, 54, + (70,17,0): 97, 80, 54, + (70,18,0): 97, 79, 57, + (70,19,0): 94, 79, 60, + (70,20,0): 91, 79, 65, + (70,21,0): 91, 82, 75, + (70,22,0): 92, 86, 86, + (70,23,0): 95, 90, 97, + (70,24,0): 107, 103, 118, + (70,25,0): 115, 111, 134, + (70,26,0): 125, 122, 151, + (70,27,0): 130, 126, 161, + (70,28,0): 129, 124, 165, + (70,29,0): 125, 119, 163, + (70,30,0): 123, 117, 165, + (70,31,0): 120, 118, 167, + (70,32,0): 115, 121, 171, + (70,33,0): 115, 125, 178, + (70,34,0): 120, 129, 184, + (70,35,0): 123, 132, 191, + (70,36,0): 126, 134, 196, + (70,37,0): 132, 138, 200, + (70,38,0): 141, 142, 206, + (70,39,0): 148, 147, 205, + (70,40,0): 154, 147, 198, + (70,41,0): 160, 150, 187, + (70,42,0): 171, 156, 179, + (70,43,0): 188, 167, 176, + (70,44,0): 201, 173, 169, + (70,45,0): 197, 166, 148, + (70,46,0): 170, 136, 109, + (70,47,0): 154, 103, 76, + (70,48,0): 155, 70, 50, + (70,49,0): 173, 65, 52, + (70,50,0): 181, 65, 52, + (70,51,0): 194, 66, 57, + (70,52,0): 214, 72, 68, + (70,53,0): 232, 78, 78, + (70,54,0): 238, 74, 75, + (70,55,0): 236, 63, 67, + (70,56,0): 235, 61, 63, + (70,57,0): 233, 59, 61, + (70,58,0): 229, 59, 59, + (70,59,0): 224, 60, 58, + (70,60,0): 217, 64, 56, + (70,61,0): 210, 63, 53, + (70,62,0): 202, 62, 49, + (70,63,0): 194, 60, 48, + (70,64,0): 189, 58, 48, + (70,65,0): 190, 63, 54, + (70,66,0): 175, 52, 44, + (70,67,0): 167, 49, 39, + (70,68,0): 187, 73, 63, + (70,69,0): 209, 99, 86, + (70,70,0): 214, 104, 91, + (70,71,0): 213, 101, 87, + (70,72,0): 195, 79, 66, + (70,73,0): 186, 62, 50, + (70,74,0): 186, 52, 41, + (70,75,0): 199, 55, 44, + (70,76,0): 214, 57, 48, + (70,77,0): 217, 53, 44, + (70,78,0): 223, 50, 43, + (70,79,0): 231, 54, 48, + (70,80,0): 226, 48, 44, + (70,81,0): 227, 52, 47, + (70,82,0): 226, 55, 47, + (70,83,0): 222, 55, 46, + (70,84,0): 224, 62, 49, + (70,85,0): 229, 67, 52, + (70,86,0): 228, 62, 48, + (70,87,0): 222, 52, 37, + (70,88,0): 229, 51, 41, + (70,89,0): 232, 47, 42, + (70,90,0): 240, 51, 47, + (70,91,0): 240, 46, 46, + (70,92,0): 239, 45, 46, + (70,93,0): 241, 48, 51, + (70,94,0): 242, 54, 55, + (70,95,0): 244, 64, 67, + (70,96,0): 246, 77, 82, + (70,97,0): 252, 89, 94, + (70,98,0): 233, 70, 75, + (70,99,0): 246, 81, 87, + (70,100,0): 216, 51, 55, + (70,101,0): 235, 70, 74, + (70,102,0): 221, 56, 60, + (70,103,0): 230, 65, 69, + (70,104,0): 216, 53, 56, + (70,105,0): 204, 44, 46, + (70,106,0): 207, 46, 51, + (70,107,0): 226, 70, 73, + (70,108,0): 210, 55, 59, + (70,109,0): 208, 55, 58, + (70,110,0): 185, 35, 37, + (70,111,0): 213, 59, 61, + (70,112,0): 217, 57, 59, + (70,113,0): 226, 60, 62, + (70,114,0): 232, 62, 65, + (70,115,0): 230, 55, 60, + (70,116,0): 223, 46, 54, + (70,117,0): 219, 42, 50, + (70,118,0): 224, 50, 59, + (70,119,0): 228, 61, 68, + (70,120,0): 238, 77, 83, + (70,121,0): 250, 95, 101, + (70,122,0): 255, 109, 115, + (70,123,0): 255, 106, 115, + (70,124,0): 248, 97, 106, + (70,125,0): 245, 91, 103, + (70,126,0): 246, 90, 104, + (70,127,0): 246, 92, 102, + (70,128,0): 244, 100, 100, + (70,129,0): 232, 90, 86, + (70,130,0): 232, 87, 84, + (70,131,0): 216, 64, 61, + (70,132,0): 207, 49, 48, + (70,133,0): 212, 52, 52, + (70,134,0): 211, 51, 51, + (70,135,0): 225, 67, 64, + (70,136,0): 227, 74, 69, + (70,137,0): 233, 82, 75, + (70,138,0): 234, 83, 76, + (70,139,0): 225, 74, 65, + (70,140,0): 217, 63, 55, + (70,141,0): 216, 57, 51, + (70,142,0): 219, 56, 49, + (70,143,0): 227, 51, 51, + (70,144,0): 243, 46, 55, + (70,145,0): 255, 48, 62, + (70,146,0): 255, 48, 61, + (70,147,0): 250, 42, 55, + (70,148,0): 252, 46, 58, + (70,149,0): 255, 59, 69, + (70,150,0): 255, 67, 72, + (70,151,0): 251, 65, 66, + (70,152,0): 227, 49, 47, + (70,153,0): 223, 52, 45, + (70,154,0): 221, 52, 45, + (70,155,0): 221, 53, 44, + (70,156,0): 226, 52, 45, + (70,157,0): 230, 51, 44, + (70,158,0): 237, 52, 47, + (70,159,0): 241, 52, 48, + (70,160,0): 244, 48, 50, + (70,161,0): 247, 47, 50, + (70,162,0): 249, 46, 49, + (70,163,0): 248, 45, 48, + (70,164,0): 246, 46, 46, + (70,165,0): 241, 47, 45, + (70,166,0): 235, 50, 45, + (70,167,0): 227, 55, 45, + (70,168,0): 216, 58, 47, + (70,169,0): 205, 62, 48, + (70,170,0): 181, 49, 37, + (70,171,0): 177, 55, 44, + (70,172,0): 178, 59, 53, + (70,173,0): 233, 115, 113, + (70,174,0): 255, 138, 138, + (70,175,0): 255, 135, 141, + (70,176,0): 255, 116, 132, + (70,177,0): 253, 104, 124, + (70,178,0): 243, 97, 116, + (70,179,0): 241, 92, 112, + (70,180,0): 244, 82, 106, + (70,181,0): 245, 68, 97, + (70,182,0): 251, 55, 93, + (70,183,0): 252, 56, 94, + (70,184,0): 245, 61, 95, + (70,185,0): 232, 78, 102, + (70,186,0): 188, 81, 91, + (70,187,0): 125, 57, 54, + (70,188,0): 94, 60, 48, + (70,189,0): 81, 68, 49, + (70,190,0): 91, 86, 64, + (70,191,0): 93, 100, 69, + (70,192,0): 101, 119, 77, + (70,193,0): 106, 133, 82, + (70,194,0): 114, 142, 91, + (70,195,0): 118, 148, 94, + (70,196,0): 121, 154, 97, + (70,197,0): 123, 158, 100, + (70,198,0): 120, 158, 97, + (70,199,0): 115, 155, 93, + (70,200,0): 112, 152, 89, + (70,201,0): 112, 153, 87, + (70,202,0): 113, 154, 88, + (70,203,0): 113, 154, 88, + (70,204,0): 116, 155, 92, + (70,205,0): 117, 156, 93, + (70,206,0): 121, 157, 95, + (70,207,0): 120, 159, 96, + (70,208,0): 120, 161, 95, + (70,209,0): 121, 162, 94, + (70,210,0): 122, 165, 94, + (70,211,0): 121, 164, 92, + (70,212,0): 120, 164, 89, + (70,213,0): 120, 164, 87, + (70,214,0): 121, 165, 86, + (70,215,0): 123, 167, 88, + (70,216,0): 127, 169, 95, + (70,217,0): 130, 172, 100, + (70,218,0): 132, 171, 104, + (70,219,0): 134, 168, 108, + (70,220,0): 135, 165, 111, + (70,221,0): 134, 162, 113, + (70,222,0): 128, 154, 109, + (70,223,0): 120, 145, 106, + (70,224,0): 112, 132, 104, + (70,225,0): 108, 128, 101, + (70,226,0): 101, 121, 96, + (71,0,0): 95, 80, 61, + (71,1,0): 95, 80, 61, + (71,2,0): 95, 80, 61, + (71,3,0): 95, 80, 61, + (71,4,0): 95, 80, 61, + (71,5,0): 95, 80, 61, + (71,6,0): 95, 80, 61, + (71,7,0): 95, 80, 61, + (71,8,0): 94, 79, 60, + (71,9,0): 94, 79, 60, + (71,10,0): 94, 79, 60, + (71,11,0): 94, 79, 60, + (71,12,0): 94, 79, 60, + (71,13,0): 94, 79, 60, + (71,14,0): 94, 79, 60, + (71,15,0): 95, 78, 58, + (71,16,0): 99, 81, 57, + (71,17,0): 99, 81, 57, + (71,18,0): 97, 80, 60, + (71,19,0): 93, 80, 64, + (71,20,0): 90, 80, 71, + (71,21,0): 92, 84, 82, + (71,22,0): 95, 90, 97, + (71,23,0): 97, 95, 109, + (71,24,0): 116, 114, 138, + (71,25,0): 121, 120, 152, + (71,26,0): 129, 128, 168, + (71,27,0): 131, 129, 176, + (71,28,0): 126, 126, 176, + (71,29,0): 121, 121, 175, + (71,30,0): 121, 117, 176, + (71,31,0): 119, 119, 181, + (71,32,0): 119, 124, 190, + (71,33,0): 120, 127, 195, + (71,34,0): 125, 133, 196, + (71,35,0): 130, 136, 196, + (71,36,0): 133, 138, 193, + (71,37,0): 141, 143, 191, + (71,38,0): 151, 150, 190, + (71,39,0): 160, 157, 188, + (71,40,0): 172, 167, 187, + (71,41,0): 182, 172, 180, + (71,42,0): 190, 179, 175, + (71,43,0): 200, 184, 169, + (71,44,0): 208, 190, 166, + (71,45,0): 214, 193, 162, + (71,46,0): 209, 187, 150, + (71,47,0): 208, 172, 136, + (71,48,0): 175, 111, 84, + (71,49,0): 174, 92, 71, + (71,50,0): 164, 71, 53, + (71,51,0): 168, 62, 48, + (71,52,0): 194, 71, 63, + (71,53,0): 224, 87, 81, + (71,54,0): 239, 87, 86, + (71,55,0): 241, 78, 79, + (71,56,0): 233, 64, 67, + (71,57,0): 234, 61, 63, + (71,58,0): 230, 60, 61, + (71,59,0): 226, 61, 59, + (71,60,0): 223, 61, 58, + (71,61,0): 215, 61, 53, + (71,62,0): 207, 59, 49, + (71,63,0): 201, 57, 48, + (71,64,0): 193, 56, 48, + (71,65,0): 193, 60, 53, + (71,66,0): 185, 58, 51, + (71,67,0): 184, 61, 53, + (71,68,0): 193, 79, 69, + (71,69,0): 199, 88, 77, + (71,70,0): 199, 93, 79, + (71,71,0): 209, 101, 88, + (71,72,0): 211, 99, 85, + (71,73,0): 194, 76, 62, + (71,74,0): 188, 58, 45, + (71,75,0): 197, 56, 46, + (71,76,0): 210, 57, 49, + (71,77,0): 215, 52, 45, + (71,78,0): 223, 50, 44, + (71,79,0): 231, 54, 48, + (71,80,0): 230, 52, 48, + (71,81,0): 225, 50, 45, + (71,82,0): 224, 53, 46, + (71,83,0): 227, 60, 51, + (71,84,0): 231, 67, 55, + (71,85,0): 230, 67, 52, + (71,86,0): 226, 58, 45, + (71,87,0): 223, 51, 37, + (71,88,0): 233, 52, 43, + (71,89,0): 229, 45, 37, + (71,90,0): 240, 48, 45, + (71,91,0): 240, 48, 45, + (71,92,0): 241, 52, 50, + (71,93,0): 242, 54, 53, + (71,94,0): 232, 46, 47, + (71,95,0): 226, 50, 52, + (71,96,0): 231, 66, 70, + (71,97,0): 247, 88, 93, + (71,98,0): 246, 87, 92, + (71,99,0): 255, 111, 117, + (71,100,0): 229, 68, 74, + (71,101,0): 235, 72, 77, + (71,102,0): 224, 60, 67, + (71,103,0): 254, 91, 96, + (71,104,0): 255, 109, 115, + (71,105,0): 220, 59, 64, + (71,106,0): 255, 123, 128, + (71,107,0): 255, 108, 112, + (71,108,0): 234, 81, 84, + (71,109,0): 211, 61, 63, + (71,110,0): 198, 48, 50, + (71,111,0): 215, 59, 62, + (71,112,0): 241, 72, 75, + (71,113,0): 235, 59, 62, + (71,114,0): 237, 56, 63, + (71,115,0): 246, 62, 70, + (71,116,0): 240, 56, 66, + (71,117,0): 230, 46, 56, + (71,118,0): 241, 64, 74, + (71,119,0): 255, 95, 103, + (71,120,0): 255, 110, 119, + (71,121,0): 255, 107, 114, + (71,122,0): 254, 100, 110, + (71,123,0): 245, 94, 103, + (71,124,0): 247, 95, 107, + (71,125,0): 253, 99, 111, + (71,126,0): 253, 95, 110, + (71,127,0): 246, 90, 101, + (71,128,0): 241, 93, 93, + (71,129,0): 227, 80, 73, + (71,130,0): 226, 74, 71, + (71,131,0): 213, 55, 52, + (71,132,0): 210, 47, 48, + (71,133,0): 217, 53, 52, + (71,134,0): 210, 48, 46, + (71,135,0): 216, 57, 53, + (71,136,0): 223, 68, 63, + (71,137,0): 227, 74, 68, + (71,138,0): 226, 73, 65, + (71,139,0): 217, 64, 56, + (71,140,0): 211, 54, 47, + (71,141,0): 214, 52, 47, + (71,142,0): 220, 55, 49, + (71,143,0): 232, 54, 54, + (71,144,0): 234, 39, 47, + (71,145,0): 252, 48, 60, + (71,146,0): 254, 50, 61, + (71,147,0): 247, 43, 54, + (71,148,0): 249, 48, 58, + (71,149,0): 255, 62, 69, + (71,150,0): 253, 63, 65, + (71,151,0): 236, 52, 52, + (71,152,0): 226, 51, 46, + (71,153,0): 224, 53, 46, + (71,154,0): 222, 54, 45, + (71,155,0): 223, 52, 44, + (71,156,0): 225, 51, 42, + (71,157,0): 232, 51, 44, + (71,158,0): 239, 52, 47, + (71,159,0): 244, 52, 49, + (71,160,0): 246, 48, 49, + (71,161,0): 247, 47, 50, + (71,162,0): 249, 46, 49, + (71,163,0): 248, 45, 48, + (71,164,0): 248, 46, 46, + (71,165,0): 242, 47, 45, + (71,166,0): 235, 50, 45, + (71,167,0): 227, 55, 45, + (71,168,0): 215, 57, 46, + (71,169,0): 209, 63, 50, + (71,170,0): 182, 48, 37, + (71,171,0): 178, 54, 44, + (71,172,0): 176, 54, 49, + (71,173,0): 232, 112, 111, + (71,174,0): 255, 135, 136, + (71,175,0): 255, 134, 142, + (71,176,0): 255, 110, 128, + (71,177,0): 252, 99, 120, + (71,178,0): 241, 94, 113, + (71,179,0): 242, 90, 111, + (71,180,0): 245, 81, 106, + (71,181,0): 246, 67, 97, + (71,182,0): 253, 57, 95, + (71,183,0): 253, 59, 96, + (71,184,0): 242, 67, 98, + (71,185,0): 225, 84, 103, + (71,186,0): 174, 82, 87, + (71,187,0): 98, 48, 39, + (71,188,0): 89, 68, 51, + (71,189,0): 74, 69, 47, + (71,190,0): 85, 83, 60, + (71,191,0): 88, 93, 63, + (71,192,0): 99, 115, 76, + (71,193,0): 105, 129, 81, + (71,194,0): 113, 139, 91, + (71,195,0): 118, 146, 95, + (71,196,0): 122, 152, 98, + (71,197,0): 124, 157, 100, + (71,198,0): 120, 156, 95, + (71,199,0): 114, 153, 90, + (71,200,0): 110, 151, 85, + (71,201,0): 110, 151, 85, + (71,202,0): 110, 151, 85, + (71,203,0): 111, 152, 86, + (71,204,0): 114, 153, 90, + (71,205,0): 116, 155, 92, + (71,206,0): 119, 155, 93, + (71,207,0): 119, 158, 93, + (71,208,0): 119, 158, 91, + (71,209,0): 120, 161, 91, + (71,210,0): 121, 163, 91, + (71,211,0): 119, 163, 88, + (71,212,0): 118, 162, 87, + (71,213,0): 118, 162, 85, + (71,214,0): 119, 163, 84, + (71,215,0): 121, 165, 88, + (71,216,0): 122, 164, 90, + (71,217,0): 126, 166, 95, + (71,218,0): 129, 166, 99, + (71,219,0): 127, 161, 100, + (71,220,0): 126, 156, 102, + (71,221,0): 123, 151, 102, + (71,222,0): 114, 140, 93, + (71,223,0): 105, 130, 88, + (71,224,0): 95, 117, 81, + (71,225,0): 92, 113, 82, + (71,226,0): 86, 107, 76, + (72,0,0): 92, 76, 60, + (72,1,0): 94, 78, 62, + (72,2,0): 96, 80, 64, + (72,3,0): 96, 80, 64, + (72,4,0): 95, 79, 63, + (72,5,0): 95, 79, 63, + (72,6,0): 95, 79, 63, + (72,7,0): 97, 81, 65, + (72,8,0): 98, 82, 66, + (72,9,0): 95, 79, 63, + (72,10,0): 93, 77, 61, + (72,11,0): 93, 77, 61, + (72,12,0): 97, 81, 65, + (72,13,0): 99, 83, 67, + (72,14,0): 98, 82, 66, + (72,15,0): 96, 81, 62, + (72,16,0): 100, 83, 63, + (72,17,0): 97, 80, 62, + (72,18,0): 93, 80, 64, + (72,19,0): 94, 81, 73, + (72,20,0): 91, 81, 80, + (72,21,0): 90, 83, 90, + (72,22,0): 101, 97, 112, + (72,23,0): 115, 113, 137, + (72,24,0): 121, 120, 154, + (72,25,0): 122, 124, 165, + (72,26,0): 126, 128, 177, + (72,27,0): 128, 129, 185, + (72,28,0): 125, 127, 186, + (72,29,0): 120, 122, 183, + (72,30,0): 114, 115, 180, + (72,31,0): 108, 111, 182, + (72,32,0): 116, 119, 198, + (72,33,0): 118, 124, 202, + (72,34,0): 128, 131, 202, + (72,35,0): 139, 141, 198, + (72,36,0): 150, 151, 195, + (72,37,0): 164, 164, 190, + (72,38,0): 178, 176, 187, + (72,39,0): 188, 185, 180, + (72,40,0): 203, 197, 181, + (72,41,0): 211, 204, 176, + (72,42,0): 217, 207, 172, + (72,43,0): 219, 207, 165, + (72,44,0): 220, 207, 163, + (72,45,0): 221, 209, 161, + (72,46,0): 217, 203, 156, + (72,47,0): 217, 194, 152, + (72,48,0): 209, 168, 136, + (72,49,0): 184, 128, 103, + (72,50,0): 161, 93, 70, + (72,51,0): 203, 122, 103, + (72,52,0): 216, 116, 101, + (72,53,0): 189, 72, 63, + (72,54,0): 216, 81, 78, + (72,55,0): 247, 99, 99, + (72,56,0): 233, 75, 76, + (72,57,0): 229, 63, 65, + (72,58,0): 225, 57, 57, + (72,59,0): 227, 59, 58, + (72,60,0): 226, 58, 57, + (72,61,0): 219, 55, 53, + (72,62,0): 216, 54, 49, + (72,63,0): 214, 59, 54, + (72,64,0): 203, 56, 49, + (72,65,0): 192, 53, 46, + (72,66,0): 199, 66, 59, + (72,67,0): 187, 60, 51, + (72,68,0): 191, 73, 63, + (72,69,0): 198, 88, 75, + (72,70,0): 185, 79, 65, + (72,71,0): 206, 100, 86, + (72,72,0): 209, 99, 84, + (72,73,0): 204, 88, 73, + (72,74,0): 197, 71, 57, + (72,75,0): 196, 58, 47, + (72,76,0): 205, 54, 45, + (72,77,0): 216, 55, 47, + (72,78,0): 225, 54, 47, + (72,79,0): 227, 52, 47, + (72,80,0): 223, 48, 45, + (72,81,0): 223, 50, 44, + (72,82,0): 224, 55, 48, + (72,83,0): 228, 61, 52, + (72,84,0): 224, 60, 48, + (72,85,0): 221, 55, 41, + (72,86,0): 223, 53, 40, + (72,87,0): 229, 55, 44, + (72,88,0): 228, 47, 36, + (72,89,0): 234, 47, 38, + (72,90,0): 236, 47, 41, + (72,91,0): 238, 49, 45, + (72,92,0): 238, 50, 48, + (72,93,0): 235, 52, 48, + (72,94,0): 232, 53, 49, + (72,95,0): 226, 54, 52, + (72,96,0): 215, 55, 57, + (72,97,0): 230, 74, 78, + (72,98,0): 245, 89, 93, + (72,99,0): 237, 78, 83, + (72,100,0): 215, 56, 61, + (72,101,0): 215, 54, 60, + (72,102,0): 249, 88, 96, + (72,103,0): 255, 126, 132, + (72,104,0): 255, 120, 128, + (72,105,0): 255, 107, 113, + (72,106,0): 255, 99, 107, + (72,107,0): 255, 102, 109, + (72,108,0): 255, 101, 107, + (72,109,0): 245, 92, 97, + (72,110,0): 242, 89, 92, + (72,111,0): 252, 91, 96, + (72,112,0): 255, 87, 90, + (72,113,0): 255, 70, 75, + (72,114,0): 249, 58, 66, + (72,115,0): 248, 57, 65, + (72,116,0): 243, 51, 62, + (72,117,0): 235, 45, 57, + (72,118,0): 234, 50, 62, + (72,119,0): 238, 62, 72, + (72,120,0): 252, 85, 95, + (72,121,0): 255, 97, 105, + (72,122,0): 255, 104, 114, + (72,123,0): 254, 103, 112, + (72,124,0): 251, 100, 109, + (72,125,0): 254, 100, 110, + (72,126,0): 255, 97, 111, + (72,127,0): 251, 94, 103, + (72,128,0): 237, 83, 83, + (72,129,0): 223, 70, 64, + (72,130,0): 214, 56, 53, + (72,131,0): 214, 52, 49, + (72,132,0): 215, 49, 49, + (72,133,0): 215, 47, 46, + (72,134,0): 216, 51, 49, + (72,135,0): 219, 57, 52, + (72,136,0): 225, 68, 61, + (72,137,0): 220, 66, 58, + (72,138,0): 217, 63, 55, + (72,139,0): 214, 60, 52, + (72,140,0): 215, 57, 48, + (72,141,0): 219, 56, 49, + (72,142,0): 224, 57, 51, + (72,143,0): 230, 54, 54, + (72,144,0): 240, 55, 60, + (72,145,0): 243, 52, 59, + (72,146,0): 243, 52, 59, + (72,147,0): 246, 52, 60, + (72,148,0): 245, 54, 59, + (72,149,0): 242, 53, 57, + (72,150,0): 235, 51, 51, + (72,151,0): 227, 49, 47, + (72,152,0): 222, 51, 44, + (72,153,0): 222, 53, 46, + (72,154,0): 223, 55, 46, + (72,155,0): 224, 53, 43, + (72,156,0): 228, 51, 43, + (72,157,0): 233, 50, 44, + (72,158,0): 239, 50, 44, + (72,159,0): 245, 50, 48, + (72,160,0): 247, 49, 50, + (72,161,0): 248, 48, 51, + (72,162,0): 250, 47, 50, + (72,163,0): 249, 46, 49, + (72,164,0): 249, 47, 47, + (72,165,0): 243, 48, 46, + (72,166,0): 236, 51, 46, + (72,167,0): 229, 55, 46, + (72,168,0): 224, 63, 53, + (72,169,0): 204, 56, 44, + (72,170,0): 191, 54, 44, + (72,171,0): 175, 47, 38, + (72,172,0): 184, 59, 55, + (72,173,0): 210, 88, 87, + (72,174,0): 255, 152, 154, + (72,175,0): 254, 123, 131, + (72,176,0): 255, 109, 128, + (72,177,0): 255, 102, 124, + (72,178,0): 246, 93, 114, + (72,179,0): 239, 81, 104, + (72,180,0): 241, 72, 101, + (72,181,0): 249, 68, 101, + (72,182,0): 253, 61, 100, + (72,183,0): 245, 59, 96, + (72,184,0): 242, 79, 108, + (72,185,0): 209, 84, 100, + (72,186,0): 137, 61, 63, + (72,187,0): 80, 44, 32, + (72,188,0): 69, 58, 38, + (72,189,0): 68, 70, 46, + (72,190,0): 77, 77, 53, + (72,191,0): 90, 94, 67, + (72,192,0): 91, 105, 69, + (72,193,0): 99, 120, 77, + (72,194,0): 113, 136, 90, + (72,195,0): 120, 146, 98, + (72,196,0): 120, 150, 96, + (72,197,0): 116, 149, 92, + (72,198,0): 114, 150, 89, + (72,199,0): 113, 152, 89, + (72,200,0): 108, 149, 83, + (72,201,0): 109, 150, 82, + (72,202,0): 110, 151, 83, + (72,203,0): 111, 152, 84, + (72,204,0): 114, 153, 88, + (72,205,0): 116, 155, 90, + (72,206,0): 117, 156, 93, + (72,207,0): 117, 156, 91, + (72,208,0): 116, 155, 88, + (72,209,0): 116, 157, 87, + (72,210,0): 118, 160, 88, + (72,211,0): 119, 161, 87, + (72,212,0): 118, 162, 87, + (72,213,0): 118, 162, 85, + (72,214,0): 117, 161, 84, + (72,215,0): 116, 160, 83, + (72,216,0): 123, 165, 91, + (72,217,0): 123, 163, 93, + (72,218,0): 122, 158, 94, + (72,219,0): 117, 151, 91, + (72,220,0): 109, 139, 85, + (72,221,0): 98, 126, 77, + (72,222,0): 88, 114, 67, + (72,223,0): 83, 106, 62, + (72,224,0): 63, 85, 46, + (72,225,0): 63, 85, 47, + (72,226,0): 62, 84, 46, + (73,0,0): 91, 75, 59, + (73,1,0): 94, 78, 62, + (73,2,0): 96, 80, 64, + (73,3,0): 96, 80, 64, + (73,4,0): 96, 80, 64, + (73,5,0): 95, 79, 63, + (73,6,0): 96, 80, 64, + (73,7,0): 97, 81, 65, + (73,8,0): 98, 82, 66, + (73,9,0): 96, 80, 64, + (73,10,0): 95, 79, 63, + (73,11,0): 96, 80, 64, + (73,12,0): 98, 82, 66, + (73,13,0): 99, 83, 67, + (73,14,0): 98, 82, 66, + (73,15,0): 96, 80, 64, + (73,16,0): 102, 86, 71, + (73,17,0): 95, 81, 70, + (73,18,0): 92, 79, 71, + (73,19,0): 94, 84, 83, + (73,20,0): 97, 90, 97, + (73,21,0): 100, 96, 111, + (73,22,0): 109, 107, 131, + (73,23,0): 118, 119, 150, + (73,24,0): 119, 121, 162, + (73,25,0): 123, 125, 174, + (73,26,0): 125, 127, 184, + (73,27,0): 120, 124, 185, + (73,28,0): 113, 117, 181, + (73,29,0): 107, 112, 180, + (73,30,0): 108, 111, 182, + (73,31,0): 110, 113, 190, + (73,32,0): 117, 119, 206, + (73,33,0): 124, 126, 211, + (73,34,0): 137, 137, 209, + (73,35,0): 152, 152, 206, + (73,36,0): 168, 167, 199, + (73,37,0): 184, 182, 193, + (73,38,0): 201, 197, 186, + (73,39,0): 211, 206, 177, + (73,40,0): 219, 214, 172, + (73,41,0): 226, 219, 167, + (73,42,0): 231, 222, 167, + (73,43,0): 230, 221, 164, + (73,44,0): 228, 219, 164, + (73,45,0): 226, 216, 163, + (73,46,0): 219, 209, 158, + (73,47,0): 212, 199, 154, + (73,48,0): 212, 188, 154, + (73,49,0): 189, 155, 128, + (73,50,0): 170, 124, 100, + (73,51,0): 199, 138, 119, + (73,52,0): 202, 125, 109, + (73,53,0): 182, 86, 74, + (73,54,0): 211, 96, 91, + (73,55,0): 246, 114, 112, + (73,56,0): 236, 90, 91, + (73,57,0): 231, 75, 76, + (73,58,0): 226, 63, 64, + (73,59,0): 228, 62, 62, + (73,60,0): 233, 63, 64, + (73,61,0): 229, 59, 59, + (73,62,0): 224, 54, 54, + (73,63,0): 219, 54, 52, + (73,64,0): 214, 61, 56, + (73,65,0): 201, 56, 51, + (73,66,0): 202, 63, 56, + (73,67,0): 185, 54, 46, + (73,68,0): 184, 62, 51, + (73,69,0): 189, 75, 64, + (73,70,0): 182, 72, 59, + (73,71,0): 200, 93, 77, + (73,72,0): 221, 111, 96, + (73,73,0): 212, 96, 81, + (73,74,0): 198, 72, 58, + (73,75,0): 189, 53, 41, + (73,76,0): 196, 48, 38, + (73,77,0): 212, 54, 45, + (73,78,0): 220, 53, 45, + (73,79,0): 219, 48, 41, + (73,80,0): 226, 53, 49, + (73,81,0): 229, 57, 53, + (73,82,0): 228, 61, 55, + (73,83,0): 224, 60, 51, + (73,84,0): 220, 56, 46, + (73,85,0): 219, 53, 41, + (73,86,0): 223, 52, 42, + (73,87,0): 227, 53, 42, + (73,88,0): 236, 55, 46, + (73,89,0): 237, 53, 43, + (73,90,0): 237, 50, 43, + (73,91,0): 235, 48, 43, + (73,92,0): 231, 48, 44, + (73,93,0): 227, 50, 44, + (73,94,0): 225, 52, 46, + (73,95,0): 221, 53, 50, + (73,96,0): 214, 56, 55, + (73,97,0): 216, 62, 64, + (73,98,0): 228, 74, 76, + (73,99,0): 243, 87, 91, + (73,100,0): 250, 94, 98, + (73,101,0): 252, 92, 100, + (73,102,0): 254, 93, 101, + (73,103,0): 255, 97, 105, + (73,104,0): 240, 79, 87, + (73,105,0): 235, 74, 82, + (73,106,0): 238, 78, 86, + (73,107,0): 252, 92, 100, + (73,108,0): 255, 104, 111, + (73,109,0): 255, 101, 107, + (73,110,0): 244, 89, 95, + (73,111,0): 242, 79, 84, + (73,112,0): 236, 53, 58, + (73,113,0): 239, 45, 53, + (73,114,0): 241, 44, 54, + (73,115,0): 244, 47, 57, + (73,116,0): 238, 40, 53, + (73,117,0): 228, 34, 45, + (73,118,0): 227, 41, 54, + (73,119,0): 234, 57, 67, + (73,120,0): 251, 81, 90, + (73,121,0): 253, 92, 100, + (73,122,0): 255, 100, 108, + (73,123,0): 255, 101, 109, + (73,124,0): 255, 102, 110, + (73,125,0): 255, 101, 109, + (73,126,0): 252, 92, 104, + (73,127,0): 242, 82, 90, + (73,128,0): 229, 69, 69, + (73,129,0): 222, 60, 55, + (73,130,0): 219, 54, 52, + (73,131,0): 222, 54, 51, + (73,132,0): 223, 53, 53, + (73,133,0): 220, 51, 48, + (73,134,0): 218, 50, 47, + (73,135,0): 219, 54, 50, + (73,136,0): 224, 62, 57, + (73,137,0): 219, 62, 55, + (73,138,0): 216, 59, 52, + (73,139,0): 215, 58, 51, + (73,140,0): 219, 56, 49, + (73,141,0): 223, 56, 50, + (73,142,0): 229, 57, 53, + (73,143,0): 231, 58, 54, + (73,144,0): 233, 57, 59, + (73,145,0): 234, 55, 58, + (73,146,0): 235, 55, 58, + (73,147,0): 238, 55, 57, + (73,148,0): 238, 55, 57, + (73,149,0): 236, 54, 53, + (73,150,0): 229, 51, 49, + (73,151,0): 223, 50, 44, + (73,152,0): 220, 51, 44, + (73,153,0): 221, 54, 45, + (73,154,0): 223, 55, 44, + (73,155,0): 226, 54, 44, + (73,156,0): 229, 50, 43, + (73,157,0): 234, 49, 44, + (73,158,0): 242, 49, 44, + (73,159,0): 245, 50, 48, + (73,160,0): 247, 49, 50, + (73,161,0): 247, 48, 51, + (73,162,0): 250, 47, 50, + (73,163,0): 249, 46, 49, + (73,164,0): 247, 47, 47, + (73,165,0): 243, 48, 46, + (73,166,0): 236, 51, 46, + (73,167,0): 229, 55, 46, + (73,168,0): 223, 60, 51, + (73,169,0): 212, 61, 50, + (73,170,0): 194, 56, 46, + (73,171,0): 182, 49, 42, + (73,172,0): 183, 55, 52, + (73,173,0): 216, 90, 91, + (73,174,0): 255, 144, 147, + (73,175,0): 251, 115, 125, + (73,176,0): 254, 103, 122, + (73,177,0): 254, 94, 118, + (73,178,0): 247, 87, 111, + (73,179,0): 244, 80, 105, + (73,180,0): 246, 71, 102, + (73,181,0): 246, 65, 98, + (73,182,0): 250, 61, 99, + (73,183,0): 241, 66, 99, + (73,184,0): 227, 81, 104, + (73,185,0): 183, 76, 86, + (73,186,0): 119, 60, 56, + (73,187,0): 76, 50, 35, + (73,188,0): 62, 57, 35, + (73,189,0): 61, 65, 40, + (73,190,0): 71, 71, 47, + (73,191,0): 80, 83, 56, + (73,192,0): 88, 99, 65, + (73,193,0): 96, 114, 74, + (73,194,0): 110, 131, 88, + (73,195,0): 117, 143, 95, + (73,196,0): 118, 147, 93, + (73,197,0): 116, 147, 88, + (73,198,0): 113, 147, 86, + (73,199,0): 112, 148, 84, + (73,200,0): 107, 146, 79, + (73,201,0): 107, 148, 80, + (73,202,0): 108, 149, 81, + (73,203,0): 109, 150, 82, + (73,204,0): 112, 151, 86, + (73,205,0): 114, 153, 88, + (73,206,0): 115, 154, 91, + (73,207,0): 115, 154, 89, + (73,208,0): 116, 155, 88, + (73,209,0): 117, 157, 87, + (73,210,0): 117, 159, 87, + (73,211,0): 117, 159, 87, + (73,212,0): 116, 158, 84, + (73,213,0): 114, 158, 81, + (73,214,0): 113, 157, 82, + (73,215,0): 112, 156, 81, + (73,216,0): 110, 152, 80, + (73,217,0): 108, 148, 78, + (73,218,0): 104, 140, 76, + (73,219,0): 98, 129, 70, + (73,220,0): 88, 117, 63, + (73,221,0): 78, 105, 54, + (73,222,0): 70, 93, 47, + (73,223,0): 64, 87, 43, + (73,224,0): 64, 87, 45, + (73,225,0): 64, 87, 45, + (73,226,0): 64, 87, 45, + (74,0,0): 89, 76, 60, + (74,1,0): 91, 78, 62, + (74,2,0): 94, 81, 65, + (74,3,0): 94, 81, 65, + (74,4,0): 94, 81, 65, + (74,5,0): 94, 81, 65, + (74,6,0): 95, 82, 66, + (74,7,0): 96, 83, 67, + (74,8,0): 97, 84, 68, + (74,9,0): 96, 83, 67, + (74,10,0): 95, 82, 66, + (74,11,0): 96, 83, 67, + (74,12,0): 97, 84, 68, + (74,13,0): 97, 84, 68, + (74,14,0): 96, 83, 67, + (74,15,0): 94, 80, 67, + (74,16,0): 98, 85, 77, + (74,17,0): 92, 81, 77, + (74,18,0): 91, 81, 82, + (74,19,0): 99, 89, 98, + (74,20,0): 107, 100, 116, + (74,21,0): 113, 109, 132, + (74,22,0): 118, 117, 149, + (74,23,0): 121, 123, 164, + (74,24,0): 121, 123, 172, + (74,25,0): 121, 126, 182, + (74,26,0): 120, 124, 187, + (74,27,0): 110, 115, 181, + (74,28,0): 101, 105, 176, + (74,29,0): 96, 103, 175, + (74,30,0): 106, 110, 184, + (74,31,0): 114, 117, 196, + (74,32,0): 125, 125, 213, + (74,33,0): 135, 133, 217, + (74,34,0): 151, 148, 217, + (74,35,0): 169, 167, 216, + (74,36,0): 187, 185, 209, + (74,37,0): 203, 201, 202, + (74,38,0): 220, 215, 193, + (74,39,0): 229, 224, 184, + (74,40,0): 233, 228, 173, + (74,41,0): 237, 231, 169, + (74,42,0): 240, 232, 167, + (74,43,0): 237, 229, 166, + (74,44,0): 231, 225, 167, + (74,45,0): 226, 219, 165, + (74,46,0): 215, 207, 160, + (74,47,0): 203, 196, 154, + (74,48,0): 185, 174, 144, + (74,49,0): 170, 154, 129, + (74,50,0): 156, 130, 107, + (74,51,0): 171, 130, 112, + (74,52,0): 168, 110, 96, + (74,53,0): 158, 81, 71, + (74,54,0): 187, 93, 85, + (74,55,0): 222, 109, 105, + (74,56,0): 247, 117, 117, + (74,57,0): 238, 96, 95, + (74,58,0): 227, 74, 76, + (74,59,0): 226, 66, 68, + (74,60,0): 234, 65, 68, + (74,61,0): 235, 62, 64, + (74,62,0): 231, 57, 58, + (74,63,0): 224, 54, 54, + (74,64,0): 223, 61, 58, + (74,65,0): 212, 59, 54, + (74,66,0): 212, 65, 58, + (74,67,0): 194, 55, 48, + (74,68,0): 183, 55, 44, + (74,69,0): 183, 62, 51, + (74,70,0): 174, 61, 47, + (74,71,0): 182, 70, 56, + (74,72,0): 219, 106, 92, + (74,73,0): 223, 105, 91, + (74,74,0): 217, 91, 77, + (74,75,0): 202, 66, 54, + (74,76,0): 197, 50, 40, + (74,77,0): 209, 52, 43, + (74,78,0): 217, 54, 45, + (74,79,0): 217, 50, 44, + (74,80,0): 222, 53, 50, + (74,81,0): 233, 65, 62, + (74,82,0): 236, 71, 67, + (74,83,0): 224, 61, 54, + (74,84,0): 213, 50, 41, + (74,85,0): 213, 49, 39, + (74,86,0): 218, 50, 39, + (74,87,0): 222, 48, 37, + (74,88,0): 230, 52, 42, + (74,89,0): 232, 49, 41, + (74,90,0): 231, 46, 41, + (74,91,0): 230, 47, 41, + (74,92,0): 227, 50, 44, + (74,93,0): 226, 55, 47, + (74,94,0): 225, 61, 52, + (74,95,0): 224, 66, 57, + (74,96,0): 198, 45, 40, + (74,97,0): 202, 52, 51, + (74,98,0): 220, 68, 67, + (74,99,0): 240, 86, 88, + (74,100,0): 250, 94, 98, + (74,101,0): 247, 90, 97, + (74,102,0): 243, 83, 91, + (74,103,0): 241, 81, 91, + (74,104,0): 231, 69, 80, + (74,105,0): 232, 70, 81, + (74,106,0): 237, 77, 87, + (74,107,0): 251, 91, 101, + (74,108,0): 255, 107, 116, + (74,109,0): 255, 109, 115, + (74,110,0): 242, 87, 93, + (74,111,0): 225, 60, 66, + (74,112,0): 232, 47, 53, + (74,113,0): 242, 45, 52, + (74,114,0): 250, 50, 60, + (74,115,0): 251, 51, 62, + (74,116,0): 244, 44, 57, + (74,117,0): 236, 40, 52, + (74,118,0): 243, 55, 69, + (74,119,0): 255, 76, 87, + (74,120,0): 245, 74, 83, + (74,121,0): 244, 80, 87, + (74,122,0): 247, 87, 95, + (74,123,0): 252, 95, 102, + (74,124,0): 255, 100, 107, + (74,125,0): 255, 97, 105, + (74,126,0): 246, 82, 89, + (74,127,0): 232, 67, 73, + (74,128,0): 222, 57, 55, + (74,129,0): 222, 55, 49, + (74,130,0): 227, 55, 53, + (74,131,0): 233, 60, 56, + (74,132,0): 235, 59, 59, + (74,133,0): 230, 57, 53, + (74,134,0): 225, 53, 49, + (74,135,0): 221, 54, 48, + (74,136,0): 221, 58, 51, + (74,137,0): 217, 59, 50, + (74,138,0): 215, 57, 48, + (74,139,0): 215, 57, 48, + (74,140,0): 220, 55, 49, + (74,141,0): 225, 56, 51, + (74,142,0): 231, 58, 54, + (74,143,0): 233, 60, 56, + (74,144,0): 227, 57, 57, + (74,145,0): 227, 57, 57, + (74,146,0): 229, 57, 55, + (74,147,0): 231, 57, 56, + (74,148,0): 232, 56, 56, + (74,149,0): 230, 55, 52, + (74,150,0): 225, 52, 48, + (74,151,0): 219, 50, 43, + (74,152,0): 218, 54, 45, + (74,153,0): 219, 55, 45, + (74,154,0): 222, 56, 44, + (74,155,0): 226, 54, 44, + (74,156,0): 231, 50, 41, + (74,157,0): 235, 48, 41, + (74,158,0): 243, 48, 44, + (74,159,0): 247, 49, 48, + (74,160,0): 245, 49, 50, + (74,161,0): 245, 49, 51, + (74,162,0): 248, 48, 50, + (74,163,0): 247, 47, 49, + (74,164,0): 247, 47, 47, + (74,165,0): 242, 48, 46, + (74,166,0): 238, 51, 46, + (74,167,0): 231, 54, 46, + (74,168,0): 221, 57, 48, + (74,169,0): 220, 68, 57, + (74,170,0): 199, 56, 48, + (74,171,0): 187, 52, 46, + (74,172,0): 181, 47, 46, + (74,173,0): 228, 95, 98, + (74,174,0): 255, 131, 136, + (74,175,0): 248, 108, 119, + (74,176,0): 252, 99, 120, + (74,177,0): 251, 88, 115, + (74,178,0): 248, 81, 109, + (74,179,0): 251, 78, 108, + (74,180,0): 250, 69, 102, + (74,181,0): 243, 59, 93, + (74,182,0): 239, 61, 95, + (74,183,0): 233, 74, 102, + (74,184,0): 210, 85, 103, + (74,185,0): 155, 68, 74, + (74,186,0): 107, 60, 52, + (74,187,0): 79, 62, 44, + (74,188,0): 62, 60, 39, + (74,189,0): 59, 63, 40, + (74,190,0): 70, 68, 47, + (74,191,0): 72, 72, 48, + (74,192,0): 81, 92, 60, + (74,193,0): 89, 107, 69, + (74,194,0): 103, 124, 81, + (74,195,0): 114, 137, 91, + (74,196,0): 116, 143, 90, + (74,197,0): 113, 144, 85, + (74,198,0): 109, 143, 82, + (74,199,0): 107, 143, 79, + (74,200,0): 105, 144, 77, + (74,201,0): 105, 145, 75, + (74,202,0): 105, 146, 76, + (74,203,0): 107, 148, 80, + (74,204,0): 109, 150, 84, + (74,205,0): 110, 151, 85, + (74,206,0): 112, 151, 88, + (74,207,0): 113, 152, 87, + (74,208,0): 117, 156, 89, + (74,209,0): 117, 157, 87, + (74,210,0): 116, 156, 85, + (74,211,0): 114, 156, 84, + (74,212,0): 112, 154, 82, + (74,213,0): 109, 151, 77, + (74,214,0): 107, 149, 77, + (74,215,0): 106, 148, 76, + (74,216,0): 101, 141, 71, + (74,217,0): 97, 136, 69, + (74,218,0): 91, 127, 65, + (74,219,0): 85, 116, 59, + (74,220,0): 76, 105, 51, + (74,221,0): 69, 96, 45, + (74,222,0): 65, 88, 42, + (74,223,0): 62, 85, 39, + (74,224,0): 67, 93, 48, + (74,225,0): 68, 94, 49, + (74,226,0): 69, 95, 50, + (75,0,0): 87, 74, 58, + (75,1,0): 90, 77, 61, + (75,2,0): 92, 79, 63, + (75,3,0): 94, 81, 65, + (75,4,0): 93, 80, 64, + (75,5,0): 94, 81, 65, + (75,6,0): 95, 82, 66, + (75,7,0): 97, 84, 68, + (75,8,0): 96, 83, 67, + (75,9,0): 96, 83, 67, + (75,10,0): 96, 83, 67, + (75,11,0): 97, 84, 68, + (75,12,0): 97, 84, 68, + (75,13,0): 96, 83, 67, + (75,14,0): 95, 82, 66, + (75,15,0): 92, 80, 68, + (75,16,0): 90, 79, 77, + (75,17,0): 90, 81, 86, + (75,18,0): 98, 88, 99, + (75,19,0): 106, 99, 115, + (75,20,0): 113, 109, 134, + (75,21,0): 118, 117, 149, + (75,22,0): 120, 122, 163, + (75,23,0): 122, 124, 173, + (75,24,0): 119, 124, 180, + (75,25,0): 115, 121, 183, + (75,26,0): 109, 114, 180, + (75,27,0): 98, 105, 175, + (75,28,0): 93, 100, 172, + (75,29,0): 97, 103, 177, + (75,30,0): 108, 114, 190, + (75,31,0): 120, 123, 202, + (75,32,0): 137, 138, 221, + (75,33,0): 149, 146, 225, + (75,34,0): 164, 162, 225, + (75,35,0): 182, 181, 225, + (75,36,0): 199, 196, 217, + (75,37,0): 213, 209, 208, + (75,38,0): 225, 220, 198, + (75,39,0): 231, 227, 189, + (75,40,0): 235, 229, 179, + (75,41,0): 238, 233, 175, + (75,42,0): 238, 232, 174, + (75,43,0): 233, 226, 171, + (75,44,0): 227, 219, 170, + (75,45,0): 218, 211, 167, + (75,46,0): 203, 195, 158, + (75,47,0): 188, 182, 150, + (75,48,0): 166, 164, 139, + (75,49,0): 157, 152, 132, + (75,50,0): 150, 134, 118, + (75,51,0): 155, 127, 113, + (75,52,0): 155, 113, 99, + (75,53,0): 156, 98, 87, + (75,54,0): 181, 104, 96, + (75,55,0): 208, 113, 109, + (75,56,0): 251, 139, 137, + (75,57,0): 243, 118, 116, + (75,58,0): 232, 92, 93, + (75,59,0): 229, 76, 78, + (75,60,0): 229, 69, 71, + (75,61,0): 234, 65, 68, + (75,62,0): 234, 61, 63, + (75,63,0): 232, 60, 60, + (75,64,0): 223, 58, 56, + (75,65,0): 219, 60, 56, + (75,66,0): 222, 69, 63, + (75,67,0): 211, 67, 59, + (75,68,0): 195, 58, 48, + (75,69,0): 186, 58, 47, + (75,70,0): 176, 54, 41, + (75,71,0): 167, 49, 35, + (75,72,0): 191, 73, 59, + (75,73,0): 219, 97, 82, + (75,74,0): 234, 107, 92, + (75,75,0): 219, 83, 69, + (75,76,0): 201, 58, 44, + (75,77,0): 204, 52, 39, + (75,78,0): 212, 54, 43, + (75,79,0): 215, 52, 45, + (75,80,0): 217, 52, 50, + (75,81,0): 241, 77, 75, + (75,82,0): 254, 90, 88, + (75,83,0): 237, 75, 70, + (75,84,0): 217, 56, 48, + (75,85,0): 214, 51, 42, + (75,86,0): 219, 52, 43, + (75,87,0): 222, 50, 40, + (75,88,0): 223, 46, 38, + (75,89,0): 225, 44, 37, + (75,90,0): 225, 44, 37, + (75,91,0): 222, 45, 37, + (75,92,0): 220, 49, 41, + (75,93,0): 218, 54, 44, + (75,94,0): 217, 59, 48, + (75,95,0): 215, 63, 52, + (75,96,0): 194, 47, 39, + (75,97,0): 196, 52, 44, + (75,98,0): 206, 58, 54, + (75,99,0): 217, 67, 66, + (75,100,0): 223, 70, 72, + (75,101,0): 224, 69, 73, + (75,102,0): 228, 71, 78, + (75,103,0): 234, 77, 86, + (75,104,0): 241, 81, 93, + (75,105,0): 246, 86, 98, + (75,106,0): 247, 87, 97, + (75,107,0): 248, 91, 100, + (75,108,0): 255, 102, 111, + (75,109,0): 255, 107, 115, + (75,110,0): 241, 86, 94, + (75,111,0): 219, 56, 61, + (75,112,0): 233, 50, 55, + (75,113,0): 240, 47, 52, + (75,114,0): 241, 46, 54, + (75,115,0): 240, 43, 52, + (75,116,0): 235, 37, 50, + (75,117,0): 235, 41, 52, + (75,118,0): 249, 62, 73, + (75,119,0): 255, 83, 95, + (75,120,0): 237, 63, 73, + (75,121,0): 232, 65, 73, + (75,122,0): 234, 71, 76, + (75,123,0): 242, 81, 86, + (75,124,0): 255, 90, 96, + (75,125,0): 255, 88, 93, + (75,126,0): 244, 71, 77, + (75,127,0): 227, 54, 56, + (75,128,0): 225, 53, 51, + (75,129,0): 228, 55, 51, + (75,130,0): 234, 59, 56, + (75,131,0): 242, 64, 62, + (75,132,0): 244, 64, 63, + (75,133,0): 239, 61, 59, + (75,134,0): 230, 57, 53, + (75,135,0): 224, 55, 50, + (75,136,0): 221, 56, 50, + (75,137,0): 218, 57, 49, + (75,138,0): 217, 56, 48, + (75,139,0): 217, 56, 48, + (75,140,0): 220, 55, 49, + (75,141,0): 227, 55, 51, + (75,142,0): 232, 57, 54, + (75,143,0): 233, 58, 55, + (75,144,0): 226, 58, 55, + (75,145,0): 224, 59, 57, + (75,146,0): 227, 58, 55, + (75,147,0): 230, 58, 56, + (75,148,0): 231, 58, 54, + (75,149,0): 229, 56, 52, + (75,150,0): 224, 53, 46, + (75,151,0): 218, 51, 43, + (75,152,0): 218, 54, 44, + (75,153,0): 219, 55, 45, + (75,154,0): 222, 56, 44, + (75,155,0): 226, 54, 44, + (75,156,0): 231, 50, 41, + (75,157,0): 235, 48, 41, + (75,158,0): 242, 47, 43, + (75,159,0): 246, 48, 47, + (75,160,0): 244, 50, 50, + (75,161,0): 244, 50, 51, + (75,162,0): 247, 49, 50, + (75,163,0): 246, 48, 49, + (75,164,0): 246, 48, 47, + (75,165,0): 242, 48, 46, + (75,166,0): 238, 51, 46, + (75,167,0): 231, 54, 46, + (75,168,0): 220, 56, 47, + (75,169,0): 224, 70, 60, + (75,170,0): 201, 57, 49, + (75,171,0): 190, 51, 46, + (75,172,0): 182, 44, 44, + (75,173,0): 238, 102, 106, + (75,174,0): 255, 121, 128, + (75,175,0): 248, 103, 116, + (75,176,0): 253, 100, 121, + (75,177,0): 250, 86, 113, + (75,178,0): 251, 76, 107, + (75,179,0): 255, 72, 106, + (75,180,0): 252, 64, 99, + (75,181,0): 239, 55, 89, + (75,182,0): 232, 63, 94, + (75,183,0): 224, 82, 104, + (75,184,0): 195, 89, 101, + (75,185,0): 135, 67, 66, + (75,186,0): 101, 67, 55, + (75,187,0): 90, 79, 59, + (75,188,0): 72, 70, 49, + (75,189,0): 65, 67, 45, + (75,190,0): 76, 71, 51, + (75,191,0): 70, 68, 45, + (75,192,0): 76, 85, 54, + (75,193,0): 83, 99, 62, + (75,194,0): 98, 116, 76, + (75,195,0): 108, 131, 85, + (75,196,0): 112, 139, 88, + (75,197,0): 110, 141, 82, + (75,198,0): 107, 141, 80, + (75,199,0): 105, 142, 75, + (75,200,0): 103, 143, 73, + (75,201,0): 104, 144, 74, + (75,202,0): 104, 145, 75, + (75,203,0): 106, 147, 77, + (75,204,0): 107, 148, 80, + (75,205,0): 109, 150, 84, + (75,206,0): 111, 150, 87, + (75,207,0): 112, 151, 86, + (75,208,0): 116, 155, 88, + (75,209,0): 115, 155, 85, + (75,210,0): 113, 153, 83, + (75,211,0): 111, 151, 80, + (75,212,0): 106, 147, 77, + (75,213,0): 103, 144, 74, + (75,214,0): 101, 142, 72, + (75,215,0): 100, 141, 71, + (75,216,0): 96, 135, 68, + (75,217,0): 93, 129, 65, + (75,218,0): 87, 121, 61, + (75,219,0): 82, 113, 56, + (75,220,0): 77, 105, 54, + (75,221,0): 76, 102, 54, + (75,222,0): 78, 101, 55, + (75,223,0): 79, 102, 56, + (75,224,0): 77, 103, 56, + (75,225,0): 78, 104, 56, + (75,226,0): 79, 105, 58, + (76,0,0): 85, 72, 56, + (76,1,0): 87, 74, 58, + (76,2,0): 91, 78, 62, + (76,3,0): 92, 79, 63, + (76,4,0): 93, 80, 64, + (76,5,0): 93, 80, 64, + (76,6,0): 95, 82, 66, + (76,7,0): 97, 84, 68, + (76,8,0): 95, 82, 66, + (76,9,0): 96, 83, 67, + (76,10,0): 97, 84, 68, + (76,11,0): 97, 84, 68, + (76,12,0): 96, 83, 67, + (76,13,0): 95, 82, 66, + (76,14,0): 95, 82, 66, + (76,15,0): 94, 81, 73, + (76,16,0): 86, 77, 82, + (76,17,0): 95, 88, 104, + (76,18,0): 110, 102, 123, + (76,19,0): 116, 112, 137, + (76,20,0): 120, 116, 151, + (76,21,0): 120, 119, 161, + (76,22,0): 120, 122, 171, + (76,23,0): 121, 123, 180, + (76,24,0): 115, 121, 183, + (76,25,0): 106, 114, 179, + (76,26,0): 96, 103, 173, + (76,27,0): 91, 99, 171, + (76,28,0): 95, 103, 176, + (76,29,0): 106, 114, 187, + (76,30,0): 118, 124, 198, + (76,31,0): 128, 132, 206, + (76,32,0): 147, 149, 223, + (76,33,0): 158, 159, 224, + (76,34,0): 173, 174, 228, + (76,35,0): 187, 189, 228, + (76,36,0): 203, 201, 225, + (76,37,0): 212, 211, 217, + (76,38,0): 221, 218, 209, + (76,39,0): 225, 223, 202, + (76,40,0): 229, 224, 194, + (76,41,0): 230, 226, 191, + (76,42,0): 228, 222, 188, + (76,43,0): 224, 215, 182, + (76,44,0): 218, 208, 181, + (76,45,0): 206, 198, 175, + (76,46,0): 190, 182, 163, + (76,47,0): 174, 167, 151, + (76,48,0): 155, 153, 140, + (76,49,0): 143, 141, 128, + (76,50,0): 140, 132, 121, + (76,51,0): 141, 123, 113, + (76,52,0): 147, 117, 107, + (76,53,0): 157, 114, 105, + (76,54,0): 169, 109, 101, + (76,55,0): 188, 111, 105, + (76,56,0): 230, 137, 132, + (76,57,0): 237, 129, 126, + (76,58,0): 240, 116, 114, + (76,59,0): 240, 102, 100, + (76,60,0): 238, 88, 89, + (76,61,0): 237, 79, 78, + (76,62,0): 235, 69, 69, + (76,63,0): 233, 65, 64, + (76,64,0): 227, 58, 55, + (76,65,0): 224, 59, 55, + (76,66,0): 228, 66, 61, + (76,67,0): 222, 69, 63, + (76,68,0): 204, 60, 51, + (76,69,0): 198, 61, 51, + (76,70,0): 196, 66, 53, + (76,71,0): 175, 49, 35, + (76,72,0): 174, 48, 34, + (76,73,0): 199, 73, 59, + (76,74,0): 220, 88, 75, + (76,75,0): 214, 78, 64, + (76,76,0): 204, 61, 47, + (76,77,0): 206, 56, 42, + (76,78,0): 208, 54, 42, + (76,79,0): 209, 51, 42, + (76,80,0): 214, 52, 50, + (76,81,0): 245, 85, 85, + (76,82,0): 255, 107, 104, + (76,83,0): 250, 93, 88, + (76,84,0): 227, 68, 62, + (76,85,0): 220, 59, 51, + (76,86,0): 223, 59, 50, + (76,87,0): 227, 56, 48, + (76,88,0): 226, 52, 45, + (76,89,0): 227, 50, 44, + (76,90,0): 226, 49, 43, + (76,91,0): 221, 48, 41, + (76,92,0): 212, 48, 39, + (76,93,0): 205, 47, 36, + (76,94,0): 198, 47, 36, + (76,95,0): 194, 48, 35, + (76,96,0): 197, 57, 44, + (76,97,0): 192, 52, 39, + (76,98,0): 193, 51, 41, + (76,99,0): 203, 58, 53, + (76,100,0): 215, 67, 65, + (76,101,0): 219, 69, 71, + (76,102,0): 219, 66, 71, + (76,103,0): 218, 64, 72, + (76,104,0): 225, 69, 80, + (76,105,0): 236, 80, 91, + (76,106,0): 242, 86, 97, + (76,107,0): 242, 86, 97, + (76,108,0): 249, 93, 104, + (76,109,0): 255, 101, 109, + (76,110,0): 241, 87, 95, + (76,111,0): 222, 63, 68, + (76,112,0): 233, 59, 60, + (76,113,0): 237, 53, 55, + (76,114,0): 237, 51, 56, + (76,115,0): 239, 50, 56, + (76,116,0): 242, 50, 61, + (76,117,0): 247, 57, 67, + (76,118,0): 255, 72, 83, + (76,119,0): 255, 86, 95, + (76,120,0): 229, 53, 63, + (76,121,0): 222, 51, 59, + (76,122,0): 223, 54, 59, + (76,123,0): 234, 65, 68, + (76,124,0): 249, 74, 79, + (76,125,0): 253, 72, 77, + (76,126,0): 244, 59, 65, + (76,127,0): 233, 49, 51, + (76,128,0): 232, 53, 49, + (76,129,0): 235, 57, 53, + (76,130,0): 239, 60, 56, + (76,131,0): 242, 60, 57, + (76,132,0): 243, 59, 57, + (76,133,0): 240, 58, 55, + (76,134,0): 233, 55, 51, + (76,135,0): 226, 55, 48, + (76,136,0): 223, 59, 50, + (76,137,0): 220, 59, 49, + (76,138,0): 219, 58, 48, + (76,139,0): 220, 57, 48, + (76,140,0): 223, 56, 50, + (76,141,0): 228, 55, 51, + (76,142,0): 232, 54, 52, + (76,143,0): 233, 55, 53, + (76,144,0): 230, 58, 56, + (76,145,0): 228, 59, 56, + (76,146,0): 230, 58, 56, + (76,147,0): 232, 58, 57, + (76,148,0): 232, 59, 55, + (76,149,0): 230, 57, 53, + (76,150,0): 225, 54, 47, + (76,151,0): 220, 51, 44, + (76,152,0): 219, 55, 45, + (76,153,0): 220, 56, 46, + (76,154,0): 223, 57, 45, + (76,155,0): 225, 55, 42, + (76,156,0): 229, 51, 41, + (76,157,0): 233, 49, 41, + (76,158,0): 241, 48, 41, + (76,159,0): 244, 49, 45, + (76,160,0): 243, 51, 50, + (76,161,0): 241, 51, 51, + (76,162,0): 244, 50, 50, + (76,163,0): 244, 48, 49, + (76,164,0): 244, 49, 47, + (76,165,0): 242, 48, 46, + (76,166,0): 238, 51, 46, + (76,167,0): 231, 54, 46, + (76,168,0): 222, 55, 47, + (76,169,0): 224, 67, 58, + (76,170,0): 202, 55, 48, + (76,171,0): 192, 49, 45, + (76,172,0): 192, 49, 51, + (76,173,0): 247, 106, 112, + (76,174,0): 255, 113, 122, + (76,175,0): 249, 103, 116, + (76,176,0): 248, 95, 116, + (76,177,0): 246, 82, 109, + (76,178,0): 252, 68, 102, + (76,179,0): 255, 63, 100, + (76,180,0): 255, 59, 99, + (76,181,0): 242, 58, 94, + (76,182,0): 228, 71, 100, + (76,183,0): 216, 91, 109, + (76,184,0): 171, 86, 91, + (76,185,0): 119, 69, 62, + (76,186,0): 100, 74, 61, + (76,187,0): 97, 89, 70, + (76,188,0): 84, 79, 59, + (76,189,0): 75, 73, 52, + (76,190,0): 80, 73, 54, + (76,191,0): 71, 69, 46, + (76,192,0): 71, 80, 51, + (76,193,0): 76, 92, 56, + (76,194,0): 90, 108, 70, + (76,195,0): 102, 124, 78, + (76,196,0): 109, 133, 83, + (76,197,0): 109, 138, 82, + (76,198,0): 108, 140, 77, + (76,199,0): 104, 141, 74, + (76,200,0): 102, 142, 72, + (76,201,0): 103, 143, 72, + (76,202,0): 103, 145, 73, + (76,203,0): 105, 146, 76, + (76,204,0): 106, 147, 79, + (76,205,0): 108, 149, 83, + (76,206,0): 110, 149, 86, + (76,207,0): 111, 150, 85, + (76,208,0): 116, 153, 86, + (76,209,0): 115, 152, 85, + (76,210,0): 110, 149, 82, + (76,211,0): 106, 146, 76, + (76,212,0): 102, 143, 75, + (76,213,0): 99, 140, 72, + (76,214,0): 97, 138, 70, + (76,215,0): 95, 136, 70, + (76,216,0): 90, 129, 66, + (76,217,0): 88, 124, 63, + (76,218,0): 83, 116, 59, + (76,219,0): 80, 110, 56, + (76,220,0): 79, 107, 58, + (76,221,0): 82, 108, 61, + (76,222,0): 87, 110, 64, + (76,223,0): 90, 113, 67, + (76,224,0): 85, 111, 63, + (76,225,0): 85, 112, 61, + (76,226,0): 85, 111, 63, + (77,0,0): 82, 69, 53, + (77,1,0): 85, 72, 56, + (77,2,0): 88, 75, 59, + (77,3,0): 90, 77, 61, + (77,4,0): 91, 78, 62, + (77,5,0): 92, 79, 63, + (77,6,0): 94, 81, 65, + (77,7,0): 96, 83, 67, + (77,8,0): 96, 83, 67, + (77,9,0): 97, 84, 68, + (77,10,0): 97, 84, 68, + (77,11,0): 97, 84, 68, + (77,12,0): 96, 83, 67, + (77,13,0): 96, 83, 67, + (77,14,0): 98, 85, 69, + (77,15,0): 97, 86, 80, + (77,16,0): 94, 86, 99, + (77,17,0): 106, 101, 124, + (77,18,0): 121, 117, 144, + (77,19,0): 125, 121, 154, + (77,20,0): 122, 121, 161, + (77,21,0): 120, 121, 169, + (77,22,0): 118, 121, 176, + (77,23,0): 115, 119, 180, + (77,24,0): 106, 114, 179, + (77,25,0): 99, 106, 176, + (77,26,0): 91, 99, 171, + (77,27,0): 93, 101, 174, + (77,28,0): 104, 112, 185, + (77,29,0): 118, 126, 199, + (77,30,0): 129, 135, 209, + (77,31,0): 136, 141, 209, + (77,32,0): 153, 157, 220, + (77,33,0): 163, 166, 221, + (77,34,0): 175, 179, 226, + (77,35,0): 187, 191, 228, + (77,36,0): 198, 199, 227, + (77,37,0): 207, 206, 224, + (77,38,0): 212, 211, 219, + (77,39,0): 215, 213, 214, + (77,40,0): 217, 214, 209, + (77,41,0): 217, 213, 204, + (77,42,0): 215, 208, 198, + (77,43,0): 210, 201, 192, + (77,44,0): 204, 195, 190, + (77,45,0): 197, 186, 184, + (77,46,0): 180, 168, 168, + (77,47,0): 163, 155, 153, + (77,48,0): 141, 137, 134, + (77,49,0): 124, 121, 116, + (77,50,0): 124, 116, 113, + (77,51,0): 120, 107, 101, + (77,52,0): 130, 107, 101, + (77,53,0): 143, 110, 103, + (77,54,0): 144, 97, 91, + (77,55,0): 157, 96, 91, + (77,56,0): 192, 115, 109, + (77,57,0): 215, 122, 117, + (77,58,0): 237, 128, 123, + (77,59,0): 249, 126, 121, + (77,60,0): 253, 115, 112, + (77,61,0): 250, 100, 99, + (77,62,0): 243, 85, 84, + (77,63,0): 237, 73, 71, + (77,64,0): 237, 68, 63, + (77,65,0): 234, 62, 58, + (77,66,0): 225, 60, 54, + (77,67,0): 224, 65, 59, + (77,68,0): 209, 58, 49, + (77,69,0): 211, 67, 58, + (77,70,0): 221, 84, 74, + (77,71,0): 194, 62, 50, + (77,72,0): 184, 54, 41, + (77,73,0): 189, 57, 44, + (77,74,0): 194, 61, 46, + (77,75,0): 200, 63, 47, + (77,76,0): 207, 66, 49, + (77,77,0): 215, 67, 53, + (77,78,0): 214, 64, 49, + (77,79,0): 209, 55, 45, + (77,80,0): 208, 50, 47, + (77,81,0): 234, 76, 77, + (77,82,0): 250, 95, 93, + (77,83,0): 242, 87, 83, + (77,84,0): 223, 68, 63, + (77,85,0): 217, 58, 52, + (77,86,0): 219, 56, 49, + (77,87,0): 224, 55, 48, + (77,88,0): 230, 57, 51, + (77,89,0): 231, 57, 50, + (77,90,0): 231, 57, 50, + (77,91,0): 226, 58, 49, + (77,92,0): 218, 57, 47, + (77,93,0): 209, 57, 44, + (77,94,0): 202, 56, 43, + (77,95,0): 196, 56, 41, + (77,96,0): 176, 40, 24, + (77,97,0): 184, 51, 34, + (77,98,0): 200, 64, 50, + (77,99,0): 211, 73, 62, + (77,100,0): 210, 68, 64, + (77,101,0): 203, 59, 58, + (77,102,0): 204, 55, 59, + (77,103,0): 207, 58, 64, + (77,104,0): 211, 57, 67, + (77,105,0): 227, 73, 83, + (77,106,0): 237, 86, 95, + (77,107,0): 240, 89, 98, + (77,108,0): 244, 93, 102, + (77,109,0): 246, 95, 104, + (77,110,0): 232, 83, 89, + (77,111,0): 218, 63, 67, + (77,112,0): 229, 64, 62, + (77,113,0): 236, 63, 59, + (77,114,0): 243, 64, 67, + (77,115,0): 253, 70, 74, + (77,116,0): 255, 76, 84, + (77,117,0): 255, 81, 89, + (77,118,0): 255, 84, 93, + (77,119,0): 255, 85, 94, + (77,120,0): 226, 51, 58, + (77,121,0): 221, 46, 53, + (77,122,0): 221, 46, 51, + (77,123,0): 231, 55, 58, + (77,124,0): 245, 60, 65, + (77,125,0): 249, 58, 63, + (77,126,0): 248, 52, 56, + (77,127,0): 244, 48, 50, + (77,128,0): 237, 52, 50, + (77,129,0): 239, 57, 53, + (77,130,0): 240, 56, 54, + (77,131,0): 237, 52, 50, + (77,132,0): 235, 50, 48, + (77,133,0): 234, 50, 48, + (77,134,0): 231, 52, 48, + (77,135,0): 225, 52, 46, + (77,136,0): 227, 60, 52, + (77,137,0): 224, 61, 52, + (77,138,0): 223, 60, 51, + (77,139,0): 222, 59, 50, + (77,140,0): 225, 56, 51, + (77,141,0): 228, 55, 51, + (77,142,0): 232, 52, 51, + (77,143,0): 232, 52, 51, + (77,144,0): 232, 56, 56, + (77,145,0): 231, 57, 56, + (77,146,0): 232, 56, 56, + (77,147,0): 235, 57, 57, + (77,148,0): 235, 57, 55, + (77,149,0): 233, 55, 53, + (77,150,0): 226, 53, 47, + (77,151,0): 222, 51, 44, + (77,152,0): 219, 55, 45, + (77,153,0): 220, 56, 44, + (77,154,0): 221, 58, 43, + (77,155,0): 223, 55, 42, + (77,156,0): 227, 50, 40, + (77,157,0): 231, 48, 40, + (77,158,0): 239, 48, 40, + (77,159,0): 242, 49, 44, + (77,160,0): 241, 52, 50, + (77,161,0): 240, 52, 51, + (77,162,0): 243, 51, 50, + (77,163,0): 243, 49, 49, + (77,164,0): 243, 49, 47, + (77,165,0): 241, 49, 46, + (77,166,0): 236, 51, 46, + (77,167,0): 231, 54, 46, + (77,168,0): 224, 57, 49, + (77,169,0): 217, 60, 51, + (77,170,0): 204, 55, 49, + (77,171,0): 193, 48, 45, + (77,172,0): 209, 64, 67, + (77,173,0): 255, 110, 117, + (77,174,0): 253, 107, 117, + (77,175,0): 247, 99, 113, + (77,176,0): 237, 84, 105, + (77,177,0): 241, 74, 102, + (77,178,0): 250, 62, 97, + (77,179,0): 255, 55, 94, + (77,180,0): 255, 55, 98, + (77,181,0): 248, 64, 100, + (77,182,0): 227, 79, 105, + (77,183,0): 200, 92, 105, + (77,184,0): 139, 71, 70, + (77,185,0): 106, 70, 58, + (77,186,0): 93, 76, 60, + (77,187,0): 93, 86, 67, + (77,188,0): 88, 81, 62, + (77,189,0): 81, 74, 55, + (77,190,0): 79, 71, 52, + (77,191,0): 73, 68, 46, + (77,192,0): 68, 74, 46, + (77,193,0): 71, 85, 50, + (77,194,0): 83, 99, 62, + (77,195,0): 94, 115, 72, + (77,196,0): 103, 127, 77, + (77,197,0): 106, 135, 79, + (77,198,0): 106, 138, 75, + (77,199,0): 103, 140, 71, + (77,200,0): 103, 140, 70, + (77,201,0): 102, 142, 71, + (77,202,0): 102, 144, 72, + (77,203,0): 103, 144, 74, + (77,204,0): 105, 146, 78, + (77,205,0): 107, 148, 82, + (77,206,0): 109, 148, 85, + (77,207,0): 109, 148, 85, + (77,208,0): 113, 149, 85, + (77,209,0): 111, 148, 81, + (77,210,0): 106, 145, 78, + (77,211,0): 103, 142, 75, + (77,212,0): 99, 140, 72, + (77,213,0): 96, 137, 69, + (77,214,0): 95, 136, 70, + (77,215,0): 94, 134, 71, + (77,216,0): 92, 130, 69, + (77,217,0): 91, 126, 68, + (77,218,0): 87, 120, 65, + (77,219,0): 86, 114, 63, + (77,220,0): 85, 111, 64, + (77,221,0): 89, 112, 66, + (77,222,0): 93, 114, 71, + (77,223,0): 94, 117, 71, + (77,224,0): 90, 114, 66, + (77,225,0): 88, 115, 64, + (77,226,0): 88, 115, 64, + (78,0,0): 78, 66, 50, + (78,1,0): 81, 69, 53, + (78,2,0): 85, 73, 57, + (78,3,0): 87, 75, 59, + (78,4,0): 88, 76, 60, + (78,5,0): 90, 78, 62, + (78,6,0): 92, 80, 64, + (78,7,0): 94, 82, 66, + (78,8,0): 97, 85, 69, + (78,9,0): 98, 86, 70, + (78,10,0): 98, 86, 70, + (78,11,0): 97, 85, 69, + (78,12,0): 95, 83, 67, + (78,13,0): 97, 85, 69, + (78,14,0): 102, 90, 74, + (78,15,0): 104, 93, 89, + (78,16,0): 110, 103, 119, + (78,17,0): 117, 112, 142, + (78,18,0): 124, 120, 153, + (78,19,0): 123, 121, 160, + (78,20,0): 119, 120, 166, + (78,21,0): 118, 119, 173, + (78,22,0): 112, 117, 175, + (78,23,0): 106, 111, 175, + (78,24,0): 97, 104, 172, + (78,25,0): 94, 102, 174, + (78,26,0): 95, 103, 176, + (78,27,0): 101, 109, 182, + (78,28,0): 112, 120, 192, + (78,29,0): 125, 133, 205, + (78,30,0): 137, 144, 216, + (78,31,0): 143, 151, 214, + (78,32,0): 153, 161, 210, + (78,33,0): 161, 168, 210, + (78,34,0): 170, 178, 217, + (78,35,0): 180, 186, 222, + (78,36,0): 186, 191, 223, + (78,37,0): 192, 193, 224, + (78,38,0): 195, 195, 223, + (78,39,0): 199, 197, 221, + (78,40,0): 198, 194, 217, + (78,41,0): 197, 192, 212, + (78,42,0): 193, 186, 204, + (78,43,0): 188, 179, 196, + (78,44,0): 187, 176, 193, + (78,45,0): 181, 168, 186, + (78,46,0): 166, 153, 170, + (78,47,0): 150, 139, 153, + (78,48,0): 139, 132, 139, + (78,49,0): 117, 111, 113, + (78,50,0): 119, 110, 111, + (78,51,0): 115, 101, 101, + (78,52,0): 122, 102, 101, + (78,53,0): 137, 109, 106, + (78,54,0): 133, 94, 89, + (78,55,0): 150, 99, 95, + (78,56,0): 155, 90, 84, + (78,57,0): 183, 103, 96, + (78,58,0): 214, 117, 110, + (78,59,0): 237, 124, 118, + (78,60,0): 252, 125, 119, + (78,61,0): 255, 120, 115, + (78,62,0): 254, 106, 102, + (78,63,0): 249, 92, 87, + (78,64,0): 252, 83, 78, + (78,65,0): 245, 72, 66, + (78,66,0): 230, 61, 54, + (78,67,0): 231, 68, 61, + (78,68,0): 216, 59, 52, + (78,69,0): 219, 71, 61, + (78,70,0): 234, 92, 82, + (78,71,0): 197, 59, 48, + (78,72,0): 196, 60, 48, + (78,73,0): 189, 55, 43, + (78,74,0): 190, 54, 40, + (78,75,0): 199, 62, 46, + (78,76,0): 209, 68, 51, + (78,77,0): 212, 66, 51, + (78,78,0): 212, 65, 49, + (78,79,0): 215, 65, 51, + (78,80,0): 210, 56, 54, + (78,81,0): 216, 62, 62, + (78,82,0): 221, 67, 67, + (78,83,0): 220, 66, 64, + (78,84,0): 214, 61, 55, + (78,85,0): 213, 56, 49, + (78,86,0): 216, 55, 47, + (78,87,0): 222, 55, 47, + (78,88,0): 229, 58, 51, + (78,89,0): 230, 57, 51, + (78,90,0): 229, 58, 51, + (78,91,0): 226, 59, 51, + (78,92,0): 219, 62, 53, + (78,93,0): 213, 65, 53, + (78,94,0): 209, 69, 56, + (78,95,0): 204, 71, 54, + (78,96,0): 174, 45, 24, + (78,97,0): 188, 59, 37, + (78,98,0): 205, 74, 56, + (78,99,0): 209, 76, 61, + (78,100,0): 198, 61, 53, + (78,101,0): 187, 48, 43, + (78,102,0): 192, 48, 48, + (78,103,0): 202, 57, 62, + (78,104,0): 215, 65, 74, + (78,105,0): 226, 76, 85, + (78,106,0): 236, 86, 97, + (78,107,0): 240, 90, 101, + (78,108,0): 239, 92, 100, + (78,109,0): 236, 89, 97, + (78,110,0): 223, 76, 82, + (78,111,0): 212, 62, 64, + (78,112,0): 209, 52, 47, + (78,113,0): 218, 53, 47, + (78,114,0): 227, 57, 57, + (78,115,0): 237, 63, 64, + (78,116,0): 245, 66, 72, + (78,117,0): 247, 68, 74, + (78,118,0): 244, 64, 73, + (78,119,0): 239, 62, 70, + (78,120,0): 228, 51, 59, + (78,121,0): 225, 48, 54, + (78,122,0): 230, 49, 54, + (78,123,0): 240, 55, 60, + (78,124,0): 247, 54, 57, + (78,125,0): 249, 49, 52, + (78,126,0): 254, 45, 50, + (78,127,0): 253, 49, 52, + (78,128,0): 239, 50, 48, + (78,129,0): 240, 57, 53, + (78,130,0): 240, 55, 52, + (78,131,0): 236, 48, 46, + (78,132,0): 232, 44, 42, + (78,133,0): 231, 48, 44, + (78,134,0): 230, 51, 46, + (78,135,0): 224, 51, 44, + (78,136,0): 228, 61, 53, + (78,137,0): 224, 61, 52, + (78,138,0): 224, 61, 52, + (78,139,0): 224, 60, 51, + (78,140,0): 227, 58, 53, + (78,141,0): 230, 57, 53, + (78,142,0): 234, 54, 53, + (78,143,0): 236, 54, 53, + (78,144,0): 236, 53, 55, + (78,145,0): 236, 53, 55, + (78,146,0): 237, 53, 55, + (78,147,0): 238, 54, 56, + (78,148,0): 238, 54, 54, + (78,149,0): 235, 53, 52, + (78,150,0): 228, 50, 46, + (78,151,0): 222, 49, 43, + (78,152,0): 222, 55, 46, + (78,153,0): 221, 57, 45, + (78,154,0): 221, 58, 43, + (78,155,0): 223, 55, 42, + (78,156,0): 225, 52, 38, + (78,157,0): 230, 49, 38, + (78,158,0): 237, 49, 40, + (78,159,0): 241, 49, 44, + (78,160,0): 240, 52, 50, + (78,161,0): 238, 53, 51, + (78,162,0): 241, 52, 50, + (78,163,0): 242, 50, 49, + (78,164,0): 243, 49, 47, + (78,165,0): 241, 49, 46, + (78,166,0): 236, 51, 46, + (78,167,0): 231, 54, 46, + (78,168,0): 226, 59, 51, + (78,169,0): 210, 52, 43, + (78,170,0): 210, 58, 53, + (78,171,0): 198, 50, 48, + (78,172,0): 231, 85, 88, + (78,173,0): 255, 112, 120, + (78,174,0): 249, 99, 110, + (78,175,0): 241, 90, 105, + (78,176,0): 227, 75, 96, + (78,177,0): 239, 72, 102, + (78,178,0): 253, 58, 98, + (78,179,0): 255, 49, 93, + (78,180,0): 255, 54, 98, + (78,181,0): 253, 67, 104, + (78,182,0): 219, 77, 101, + (78,183,0): 177, 80, 89, + (78,184,0): 106, 53, 47, + (78,185,0): 94, 71, 55, + (78,186,0): 88, 75, 58, + (78,187,0): 85, 78, 59, + (78,188,0): 89, 81, 62, + (78,189,0): 85, 74, 56, + (78,190,0): 76, 64, 48, + (78,191,0): 73, 68, 48, + (78,192,0): 64, 70, 44, + (78,193,0): 65, 79, 46, + (78,194,0): 75, 91, 54, + (78,195,0): 88, 106, 64, + (78,196,0): 98, 120, 71, + (78,197,0): 102, 129, 74, + (78,198,0): 104, 136, 73, + (78,199,0): 102, 139, 70, + (78,200,0): 101, 138, 68, + (78,201,0): 99, 139, 66, + (78,202,0): 99, 141, 69, + (78,203,0): 101, 142, 72, + (78,204,0): 103, 144, 76, + (78,205,0): 104, 145, 79, + (78,206,0): 105, 145, 82, + (78,207,0): 107, 146, 83, + (78,208,0): 110, 146, 82, + (78,209,0): 108, 144, 80, + (78,210,0): 104, 143, 78, + (78,211,0): 100, 139, 74, + (78,212,0): 97, 138, 72, + (78,213,0): 95, 136, 70, + (78,214,0): 95, 135, 72, + (78,215,0): 95, 135, 72, + (78,216,0): 95, 133, 72, + (78,217,0): 95, 130, 72, + (78,218,0): 93, 126, 71, + (78,219,0): 93, 121, 70, + (78,220,0): 93, 119, 72, + (78,221,0): 96, 119, 75, + (78,222,0): 99, 120, 79, + (78,223,0): 99, 122, 78, + (78,224,0): 92, 116, 66, + (78,225,0): 90, 117, 64, + (78,226,0): 90, 117, 64, + (79,0,0): 74, 67, 51, + (79,1,0): 77, 70, 54, + (79,2,0): 81, 72, 57, + (79,3,0): 84, 75, 60, + (79,4,0): 87, 75, 61, + (79,5,0): 89, 77, 63, + (79,6,0): 92, 79, 63, + (79,7,0): 94, 81, 65, + (79,8,0): 100, 87, 70, + (79,9,0): 101, 88, 71, + (79,10,0): 100, 88, 72, + (79,11,0): 98, 86, 70, + (79,12,0): 95, 85, 73, + (79,13,0): 97, 87, 77, + (79,14,0): 103, 94, 85, + (79,15,0): 108, 99, 102, + (79,16,0): 119, 114, 137, + (79,17,0): 121, 117, 154, + (79,18,0): 120, 118, 158, + (79,19,0): 116, 115, 159, + (79,20,0): 114, 114, 164, + (79,21,0): 116, 117, 173, + (79,22,0): 108, 112, 175, + (79,23,0): 98, 103, 169, + (79,24,0): 90, 97, 169, + (79,25,0): 95, 101, 175, + (79,26,0): 102, 108, 184, + (79,27,0): 109, 115, 191, + (79,28,0): 118, 124, 200, + (79,29,0): 129, 135, 211, + (79,30,0): 143, 147, 221, + (79,31,0): 151, 156, 222, + (79,32,0): 155, 161, 211, + (79,33,0): 160, 167, 209, + (79,34,0): 169, 174, 216, + (79,35,0): 174, 179, 221, + (79,36,0): 177, 180, 223, + (79,37,0): 178, 179, 223, + (79,38,0): 180, 179, 223, + (79,39,0): 182, 179, 222, + (79,40,0): 181, 176, 217, + (79,41,0): 179, 172, 213, + (79,42,0): 174, 166, 203, + (79,43,0): 171, 161, 196, + (79,44,0): 170, 159, 193, + (79,45,0): 164, 153, 185, + (79,46,0): 153, 140, 170, + (79,47,0): 136, 126, 150, + (79,48,0): 126, 120, 132, + (79,49,0): 102, 97, 103, + (79,50,0): 108, 99, 102, + (79,51,0): 100, 88, 90, + (79,52,0): 108, 90, 88, + (79,53,0): 124, 99, 95, + (79,54,0): 123, 86, 80, + (79,55,0): 147, 98, 93, + (79,56,0): 140, 77, 70, + (79,57,0): 162, 85, 77, + (79,58,0): 187, 97, 88, + (79,59,0): 212, 108, 99, + (79,60,0): 238, 121, 114, + (79,61,0): 255, 129, 122, + (79,62,0): 255, 124, 119, + (79,63,0): 255, 112, 106, + (79,64,0): 254, 97, 92, + (79,65,0): 247, 84, 79, + (79,66,0): 233, 71, 66, + (79,67,0): 238, 79, 73, + (79,68,0): 221, 66, 61, + (79,69,0): 222, 71, 64, + (79,70,0): 234, 87, 79, + (79,71,0): 186, 44, 34, + (79,72,0): 190, 49, 39, + (79,73,0): 190, 52, 39, + (79,74,0): 199, 62, 46, + (79,75,0): 209, 69, 54, + (79,76,0): 203, 62, 45, + (79,77,0): 193, 50, 34, + (79,78,0): 202, 55, 39, + (79,79,0): 219, 69, 55, + (79,80,0): 222, 69, 63, + (79,81,0): 211, 57, 55, + (79,82,0): 204, 51, 46, + (79,83,0): 205, 53, 48, + (79,84,0): 212, 59, 53, + (79,85,0): 215, 61, 53, + (79,86,0): 221, 60, 52, + (79,87,0): 225, 61, 52, + (79,88,0): 228, 59, 52, + (79,89,0): 228, 57, 50, + (79,90,0): 222, 53, 46, + (79,91,0): 215, 52, 43, + (79,92,0): 207, 53, 41, + (79,93,0): 202, 56, 43, + (79,94,0): 197, 60, 44, + (79,95,0): 194, 63, 45, + (79,96,0): 212, 83, 62, + (79,97,0): 200, 71, 50, + (79,98,0): 189, 60, 41, + (79,99,0): 190, 58, 45, + (79,100,0): 195, 61, 50, + (79,101,0): 196, 59, 53, + (79,102,0): 194, 55, 52, + (79,103,0): 194, 52, 51, + (79,104,0): 220, 75, 78, + (79,105,0): 221, 76, 81, + (79,106,0): 225, 80, 85, + (79,107,0): 229, 84, 89, + (79,108,0): 232, 89, 93, + (79,109,0): 229, 86, 88, + (79,110,0): 220, 77, 79, + (79,111,0): 212, 67, 64, + (79,112,0): 203, 52, 43, + (79,113,0): 212, 54, 43, + (79,114,0): 218, 53, 47, + (79,115,0): 224, 52, 50, + (79,116,0): 228, 49, 52, + (79,117,0): 232, 49, 54, + (79,118,0): 233, 48, 56, + (79,119,0): 231, 46, 54, + (79,120,0): 238, 51, 62, + (79,121,0): 237, 50, 59, + (79,122,0): 244, 52, 63, + (79,123,0): 253, 56, 66, + (79,124,0): 255, 51, 62, + (79,125,0): 253, 41, 53, + (79,126,0): 255, 40, 51, + (79,127,0): 255, 46, 57, + (79,128,0): 248, 45, 51, + (79,129,0): 249, 53, 55, + (79,130,0): 249, 53, 57, + (79,131,0): 240, 46, 47, + (79,132,0): 235, 42, 43, + (79,133,0): 233, 48, 46, + (79,134,0): 232, 53, 49, + (79,135,0): 226, 53, 47, + (79,136,0): 227, 60, 52, + (79,137,0): 224, 61, 52, + (79,138,0): 224, 61, 52, + (79,139,0): 225, 61, 52, + (79,140,0): 228, 59, 54, + (79,141,0): 231, 58, 54, + (79,142,0): 235, 55, 54, + (79,143,0): 238, 54, 54, + (79,144,0): 236, 52, 54, + (79,145,0): 235, 51, 53, + (79,146,0): 236, 50, 53, + (79,147,0): 237, 51, 52, + (79,148,0): 237, 53, 53, + (79,149,0): 234, 52, 49, + (79,150,0): 227, 49, 45, + (79,151,0): 219, 48, 40, + (79,152,0): 222, 56, 44, + (79,153,0): 221, 58, 43, + (79,154,0): 221, 58, 43, + (79,155,0): 222, 56, 40, + (79,156,0): 224, 52, 38, + (79,157,0): 227, 51, 36, + (79,158,0): 233, 51, 38, + (79,159,0): 236, 52, 42, + (79,160,0): 238, 53, 48, + (79,161,0): 238, 53, 50, + (79,162,0): 240, 52, 50, + (79,163,0): 240, 51, 47, + (79,164,0): 242, 50, 47, + (79,165,0): 239, 50, 44, + (79,166,0): 235, 52, 44, + (79,167,0): 231, 54, 46, + (79,168,0): 228, 61, 52, + (79,169,0): 205, 47, 38, + (79,170,0): 215, 62, 57, + (79,171,0): 202, 52, 53, + (79,172,0): 249, 98, 103, + (79,173,0): 255, 112, 121, + (79,174,0): 246, 91, 105, + (79,175,0): 237, 80, 99, + (79,176,0): 228, 70, 93, + (79,177,0): 243, 72, 104, + (79,178,0): 255, 61, 101, + (79,179,0): 255, 50, 93, + (79,180,0): 255, 55, 97, + (79,181,0): 245, 71, 104, + (79,182,0): 201, 74, 93, + (79,183,0): 148, 66, 70, + (79,184,0): 83, 43, 35, + (79,185,0): 88, 72, 56, + (79,186,0): 84, 75, 58, + (79,187,0): 79, 72, 54, + (79,188,0): 89, 80, 63, + (79,189,0): 83, 74, 57, + (79,190,0): 69, 64, 45, + (79,191,0): 71, 70, 49, + (79,192,0): 61, 67, 39, + (79,193,0): 64, 74, 40, + (79,194,0): 73, 85, 49, + (79,195,0): 83, 100, 58, + (79,196,0): 95, 114, 69, + (79,197,0): 101, 125, 73, + (79,198,0): 103, 132, 74, + (79,199,0): 101, 136, 72, + (79,200,0): 99, 136, 67, + (79,201,0): 97, 137, 66, + (79,202,0): 98, 138, 67, + (79,203,0): 99, 141, 69, + (79,204,0): 101, 142, 72, + (79,205,0): 102, 143, 77, + (79,206,0): 104, 143, 80, + (79,207,0): 105, 144, 81, + (79,208,0): 108, 144, 80, + (79,209,0): 107, 144, 77, + (79,210,0): 102, 141, 74, + (79,211,0): 99, 138, 73, + (79,212,0): 97, 136, 71, + (79,213,0): 96, 135, 70, + (79,214,0): 96, 135, 72, + (79,215,0): 96, 134, 73, + (79,216,0): 94, 129, 71, + (79,217,0): 94, 127, 70, + (79,218,0): 95, 125, 71, + (79,219,0): 96, 124, 73, + (79,220,0): 97, 123, 75, + (79,221,0): 100, 123, 77, + (79,222,0): 102, 124, 78, + (79,223,0): 102, 126, 78, + (79,224,0): 93, 120, 67, + (79,225,0): 92, 121, 63, + (79,226,0): 93, 122, 66, + (80,0,0): 68, 66, 54, + (80,1,0): 70, 68, 56, + (80,2,0): 74, 70, 59, + (80,3,0): 80, 71, 62, + (80,4,0): 82, 72, 62, + (80,5,0): 87, 73, 62, + (80,6,0): 93, 77, 62, + (80,7,0): 95, 79, 63, + (80,8,0): 96, 81, 62, + (80,9,0): 97, 82, 63, + (80,10,0): 96, 83, 66, + (80,11,0): 95, 86, 71, + (80,12,0): 98, 89, 82, + (80,13,0): 103, 98, 95, + (80,14,0): 111, 106, 110, + (80,15,0): 115, 111, 126, + (80,16,0): 119, 113, 147, + (80,17,0): 122, 116, 160, + (80,18,0): 124, 121, 168, + (80,19,0): 121, 119, 169, + (80,20,0): 112, 112, 166, + (80,21,0): 103, 103, 163, + (80,22,0): 96, 97, 162, + (80,23,0): 92, 95, 164, + (80,24,0): 96, 98, 173, + (80,25,0): 102, 104, 181, + (80,26,0): 111, 112, 192, + (80,27,0): 121, 122, 204, + (80,28,0): 132, 130, 214, + (80,29,0): 141, 139, 223, + (80,30,0): 150, 146, 231, + (80,31,0): 156, 153, 232, + (80,32,0): 160, 158, 223, + (80,33,0): 161, 160, 218, + (80,34,0): 163, 162, 219, + (80,35,0): 164, 163, 220, + (80,36,0): 166, 163, 220, + (80,37,0): 165, 162, 219, + (80,38,0): 165, 160, 216, + (80,39,0): 164, 159, 213, + (80,40,0): 165, 158, 210, + (80,41,0): 163, 156, 207, + (80,42,0): 162, 154, 201, + (80,43,0): 162, 153, 198, + (80,44,0): 159, 150, 193, + (80,45,0): 153, 142, 184, + (80,46,0): 142, 131, 171, + (80,47,0): 131, 124, 155, + (80,48,0): 113, 111, 124, + (80,49,0): 104, 103, 108, + (80,50,0): 99, 95, 96, + (80,51,0): 102, 90, 90, + (80,52,0): 108, 89, 85, + (80,53,0): 115, 86, 80, + (80,54,0): 128, 85, 78, + (80,55,0): 143, 86, 79, + (80,56,0): 150, 82, 73, + (80,57,0): 169, 89, 80, + (80,58,0): 181, 88, 80, + (80,59,0): 192, 91, 83, + (80,60,0): 216, 107, 100, + (80,61,0): 235, 122, 114, + (80,62,0): 246, 131, 124, + (80,63,0): 255, 139, 134, + (80,64,0): 249, 117, 113, + (80,65,0): 255, 117, 115, + (80,66,0): 237, 95, 93, + (80,67,0): 223, 80, 76, + (80,68,0): 217, 69, 65, + (80,69,0): 239, 90, 84, + (80,70,0): 204, 55, 49, + (80,71,0): 197, 50, 42, + (80,72,0): 196, 54, 42, + (80,73,0): 195, 55, 40, + (80,74,0): 192, 55, 39, + (80,75,0): 195, 55, 38, + (80,76,0): 198, 57, 40, + (80,77,0): 202, 59, 43, + (80,78,0): 208, 60, 46, + (80,79,0): 213, 63, 49, + (80,80,0): 210, 56, 46, + (80,81,0): 214, 60, 50, + (80,82,0): 215, 63, 52, + (80,83,0): 211, 59, 48, + (80,84,0): 205, 53, 40, + (80,85,0): 205, 51, 39, + (80,86,0): 216, 58, 47, + (80,87,0): 226, 64, 53, + (80,88,0): 224, 57, 48, + (80,89,0): 225, 57, 48, + (80,90,0): 222, 55, 46, + (80,91,0): 215, 55, 43, + (80,92,0): 207, 55, 41, + (80,93,0): 201, 58, 42, + (80,94,0): 198, 63, 44, + (80,95,0): 196, 65, 47, + (80,96,0): 194, 61, 46, + (80,97,0): 198, 64, 52, + (80,98,0): 203, 69, 58, + (80,99,0): 205, 71, 60, + (80,100,0): 204, 67, 59, + (80,101,0): 197, 60, 52, + (80,102,0): 187, 50, 44, + (80,103,0): 182, 43, 38, + (80,104,0): 199, 60, 55, + (80,105,0): 208, 69, 66, + (80,106,0): 217, 79, 76, + (80,107,0): 224, 86, 83, + (80,108,0): 227, 89, 86, + (80,109,0): 225, 88, 82, + (80,110,0): 216, 79, 73, + (80,111,0): 208, 67, 58, + (80,112,0): 205, 58, 42, + (80,113,0): 213, 58, 40, + (80,114,0): 220, 56, 44, + (80,115,0): 227, 53, 46, + (80,116,0): 232, 46, 47, + (80,117,0): 237, 42, 50, + (80,118,0): 240, 40, 51, + (80,119,0): 244, 39, 54, + (80,120,0): 251, 44, 62, + (80,121,0): 250, 43, 63, + (80,122,0): 251, 42, 63, + (80,123,0): 253, 41, 63, + (80,124,0): 255, 39, 63, + (80,125,0): 255, 38, 63, + (80,126,0): 255, 36, 60, + (80,127,0): 255, 35, 60, + (80,128,0): 255, 35, 55, + (80,129,0): 255, 38, 56, + (80,130,0): 255, 42, 59, + (80,131,0): 254, 44, 57, + (80,132,0): 244, 44, 54, + (80,133,0): 237, 46, 53, + (80,134,0): 233, 53, 54, + (80,135,0): 232, 60, 58, + (80,136,0): 221, 56, 52, + (80,137,0): 221, 58, 51, + (80,138,0): 222, 59, 52, + (80,139,0): 224, 59, 53, + (80,140,0): 227, 58, 53, + (80,141,0): 230, 57, 53, + (80,142,0): 233, 55, 51, + (80,143,0): 235, 53, 52, + (80,144,0): 235, 51, 53, + (80,145,0): 236, 52, 54, + (80,146,0): 235, 53, 52, + (80,147,0): 233, 53, 52, + (80,148,0): 231, 53, 51, + (80,149,0): 226, 53, 47, + (80,150,0): 221, 53, 44, + (80,151,0): 219, 53, 41, + (80,152,0): 220, 56, 44, + (80,153,0): 219, 57, 42, + (80,154,0): 220, 57, 40, + (80,155,0): 222, 57, 38, + (80,156,0): 223, 56, 38, + (80,157,0): 226, 55, 37, + (80,158,0): 227, 54, 37, + (80,159,0): 230, 52, 38, + (80,160,0): 236, 53, 45, + (80,161,0): 237, 52, 47, + (80,162,0): 240, 53, 48, + (80,163,0): 241, 52, 46, + (80,164,0): 241, 53, 44, + (80,165,0): 237, 53, 43, + (80,166,0): 232, 54, 42, + (80,167,0): 228, 56, 44, + (80,168,0): 222, 58, 48, + (80,169,0): 212, 55, 46, + (80,170,0): 211, 58, 53, + (80,171,0): 215, 62, 64, + (80,172,0): 255, 109, 117, + (80,173,0): 255, 98, 113, + (80,174,0): 248, 85, 106, + (80,175,0): 241, 75, 99, + (80,176,0): 247, 79, 105, + (80,177,0): 236, 58, 90, + (80,178,0): 249, 57, 94, + (80,179,0): 255, 63, 103, + (80,180,0): 245, 64, 99, + (80,181,0): 230, 80, 107, + (80,182,0): 178, 73, 87, + (80,183,0): 97, 36, 35, + (80,184,0): 71, 43, 32, + (80,185,0): 65, 56, 39, + (80,186,0): 75, 68, 52, + (80,187,0): 82, 76, 60, + (80,188,0): 79, 73, 57, + (80,189,0): 66, 67, 49, + (80,190,0): 59, 68, 47, + (80,191,0): 60, 73, 47, + (80,192,0): 65, 72, 38, + (80,193,0): 69, 75, 37, + (80,194,0): 75, 83, 46, + (80,195,0): 83, 93, 56, + (80,196,0): 91, 107, 68, + (80,197,0): 97, 118, 75, + (80,198,0): 100, 126, 78, + (80,199,0): 100, 131, 74, + (80,200,0): 98, 134, 70, + (80,201,0): 96, 136, 66, + (80,202,0): 97, 137, 64, + (80,203,0): 99, 139, 66, + (80,204,0): 101, 141, 70, + (80,205,0): 104, 144, 74, + (80,206,0): 108, 144, 80, + (80,207,0): 109, 145, 81, + (80,208,0): 108, 145, 76, + (80,209,0): 105, 142, 72, + (80,210,0): 103, 140, 71, + (80,211,0): 102, 139, 72, + (80,212,0): 102, 138, 74, + (80,213,0): 101, 137, 73, + (80,214,0): 99, 133, 72, + (80,215,0): 97, 131, 71, + (80,216,0): 100, 131, 74, + (80,217,0): 100, 129, 73, + (80,218,0): 98, 127, 71, + (80,219,0): 99, 126, 71, + (80,220,0): 100, 127, 74, + (80,221,0): 100, 127, 72, + (80,222,0): 101, 126, 71, + (80,223,0): 97, 125, 67, + (80,224,0): 91, 123, 60, + (80,225,0): 92, 127, 61, + (80,226,0): 95, 130, 66, + (81,0,0): 61, 63, 52, + (81,1,0): 63, 65, 54, + (81,2,0): 70, 67, 60, + (81,3,0): 74, 69, 63, + (81,4,0): 80, 69, 63, + (81,5,0): 84, 71, 62, + (81,6,0): 91, 75, 62, + (81,7,0): 93, 77, 61, + (81,8,0): 96, 79, 59, + (81,9,0): 96, 81, 60, + (81,10,0): 94, 83, 65, + (81,11,0): 94, 86, 73, + (81,12,0): 99, 91, 88, + (81,13,0): 104, 99, 105, + (81,14,0): 110, 108, 121, + (81,15,0): 115, 111, 134, + (81,16,0): 116, 112, 149, + (81,17,0): 118, 112, 158, + (81,18,0): 116, 112, 162, + (81,19,0): 112, 109, 162, + (81,20,0): 103, 102, 159, + (81,21,0): 97, 97, 159, + (81,22,0): 93, 94, 161, + (81,23,0): 92, 92, 164, + (81,24,0): 101, 100, 176, + (81,25,0): 107, 106, 186, + (81,26,0): 116, 114, 197, + (81,27,0): 125, 123, 207, + (81,28,0): 134, 130, 217, + (81,29,0): 141, 137, 224, + (81,30,0): 148, 142, 230, + (81,31,0): 152, 147, 229, + (81,32,0): 155, 149, 221, + (81,33,0): 156, 151, 217, + (81,34,0): 157, 152, 218, + (81,35,0): 158, 153, 219, + (81,36,0): 158, 151, 218, + (81,37,0): 157, 150, 217, + (81,38,0): 156, 150, 214, + (81,39,0): 155, 149, 211, + (81,40,0): 158, 150, 210, + (81,41,0): 156, 148, 205, + (81,42,0): 156, 147, 200, + (81,43,0): 155, 147, 198, + (81,44,0): 154, 145, 192, + (81,45,0): 147, 138, 183, + (81,46,0): 136, 127, 170, + (81,47,0): 128, 121, 154, + (81,48,0): 115, 109, 123, + (81,49,0): 107, 101, 105, + (81,50,0): 100, 94, 94, + (81,51,0): 101, 91, 89, + (81,52,0): 107, 90, 83, + (81,53,0): 113, 86, 77, + (81,54,0): 124, 84, 74, + (81,55,0): 141, 84, 75, + (81,56,0): 157, 84, 75, + (81,57,0): 178, 91, 82, + (81,58,0): 187, 88, 82, + (81,59,0): 195, 88, 82, + (81,60,0): 211, 102, 97, + (81,61,0): 221, 114, 106, + (81,62,0): 224, 120, 111, + (81,63,0): 235, 126, 119, + (81,64,0): 251, 136, 133, + (81,65,0): 255, 135, 133, + (81,66,0): 247, 117, 115, + (81,67,0): 238, 103, 100, + (81,68,0): 227, 85, 83, + (81,69,0): 235, 90, 85, + (81,70,0): 199, 50, 44, + (81,71,0): 194, 47, 37, + (81,72,0): 197, 55, 41, + (81,73,0): 195, 55, 38, + (81,74,0): 192, 55, 37, + (81,75,0): 193, 56, 38, + (81,76,0): 196, 56, 39, + (81,77,0): 200, 59, 42, + (81,78,0): 207, 59, 45, + (81,79,0): 211, 61, 47, + (81,80,0): 213, 57, 44, + (81,81,0): 213, 57, 44, + (81,82,0): 211, 58, 44, + (81,83,0): 210, 58, 44, + (81,84,0): 209, 57, 43, + (81,85,0): 209, 57, 43, + (81,86,0): 212, 56, 43, + (81,87,0): 216, 56, 44, + (81,88,0): 223, 59, 49, + (81,89,0): 224, 57, 48, + (81,90,0): 220, 56, 46, + (81,91,0): 214, 56, 44, + (81,92,0): 207, 57, 42, + (81,93,0): 200, 57, 40, + (81,94,0): 193, 58, 38, + (81,95,0): 190, 57, 38, + (81,96,0): 190, 54, 42, + (81,97,0): 193, 56, 48, + (81,98,0): 198, 61, 53, + (81,99,0): 201, 64, 56, + (81,100,0): 202, 65, 57, + (81,101,0): 200, 63, 55, + (81,102,0): 197, 60, 52, + (81,103,0): 194, 57, 49, + (81,104,0): 191, 52, 45, + (81,105,0): 199, 62, 54, + (81,106,0): 209, 72, 64, + (81,107,0): 216, 79, 71, + (81,108,0): 218, 81, 73, + (81,109,0): 215, 78, 70, + (81,110,0): 204, 67, 59, + (81,111,0): 195, 55, 42, + (81,112,0): 202, 55, 37, + (81,113,0): 211, 56, 36, + (81,114,0): 221, 55, 41, + (81,115,0): 229, 52, 44, + (81,116,0): 237, 47, 47, + (81,117,0): 244, 43, 51, + (81,118,0): 249, 41, 55, + (81,119,0): 253, 40, 58, + (81,120,0): 255, 43, 64, + (81,121,0): 255, 42, 65, + (81,122,0): 255, 41, 65, + (81,123,0): 255, 38, 65, + (81,124,0): 255, 35, 64, + (81,125,0): 255, 33, 60, + (81,126,0): 255, 30, 61, + (81,127,0): 255, 29, 58, + (81,128,0): 255, 30, 57, + (81,129,0): 255, 31, 56, + (81,130,0): 255, 36, 58, + (81,131,0): 255, 41, 59, + (81,132,0): 247, 45, 57, + (81,133,0): 241, 50, 58, + (81,134,0): 234, 55, 58, + (81,135,0): 230, 60, 60, + (81,136,0): 220, 57, 52, + (81,137,0): 220, 58, 53, + (81,138,0): 222, 59, 52, + (81,139,0): 224, 59, 53, + (81,140,0): 227, 58, 53, + (81,141,0): 230, 57, 53, + (81,142,0): 233, 55, 51, + (81,143,0): 235, 53, 50, + (81,144,0): 235, 51, 53, + (81,145,0): 236, 52, 54, + (81,146,0): 235, 53, 52, + (81,147,0): 232, 54, 52, + (81,148,0): 228, 55, 49, + (81,149,0): 223, 54, 47, + (81,150,0): 220, 53, 44, + (81,151,0): 217, 53, 41, + (81,152,0): 219, 57, 42, + (81,153,0): 219, 57, 42, + (81,154,0): 220, 57, 40, + (81,155,0): 220, 57, 38, + (81,156,0): 222, 57, 38, + (81,157,0): 223, 56, 37, + (81,158,0): 225, 56, 37, + (81,159,0): 227, 54, 37, + (81,160,0): 231, 53, 43, + (81,161,0): 234, 51, 43, + (81,162,0): 235, 52, 44, + (81,163,0): 235, 53, 42, + (81,164,0): 235, 53, 42, + (81,165,0): 232, 54, 40, + (81,166,0): 228, 55, 41, + (81,167,0): 223, 55, 42, + (81,168,0): 221, 61, 49, + (81,169,0): 209, 52, 43, + (81,170,0): 207, 53, 51, + (81,171,0): 239, 84, 88, + (81,172,0): 255, 102, 114, + (81,173,0): 255, 91, 111, + (81,174,0): 241, 73, 98, + (81,175,0): 249, 76, 104, + (81,176,0): 248, 69, 99, + (81,177,0): 247, 64, 95, + (81,178,0): 244, 56, 91, + (81,179,0): 243, 62, 97, + (81,180,0): 239, 78, 109, + (81,181,0): 205, 76, 98, + (81,182,0): 139, 56, 64, + (81,183,0): 89, 41, 37, + (81,184,0): 69, 51, 39, + (81,185,0): 60, 54, 40, + (81,186,0): 62, 59, 44, + (81,187,0): 67, 64, 49, + (81,188,0): 67, 66, 48, + (81,189,0): 61, 64, 45, + (81,190,0): 56, 68, 46, + (81,191,0): 58, 73, 44, + (81,192,0): 60, 68, 29, + (81,193,0): 75, 80, 39, + (81,194,0): 92, 98, 60, + (81,195,0): 101, 111, 74, + (81,196,0): 104, 118, 82, + (81,197,0): 101, 122, 81, + (81,198,0): 100, 126, 79, + (81,199,0): 100, 130, 76, + (81,200,0): 97, 131, 70, + (81,201,0): 97, 134, 65, + (81,202,0): 97, 137, 64, + (81,203,0): 99, 140, 64, + (81,204,0): 103, 141, 68, + (81,205,0): 105, 142, 72, + (81,206,0): 107, 144, 77, + (81,207,0): 108, 145, 78, + (81,208,0): 108, 145, 75, + (81,209,0): 106, 144, 71, + (81,210,0): 104, 141, 72, + (81,211,0): 102, 139, 70, + (81,212,0): 103, 138, 74, + (81,213,0): 102, 137, 73, + (81,214,0): 102, 133, 74, + (81,215,0): 100, 131, 72, + (81,216,0): 102, 131, 75, + (81,217,0): 100, 129, 73, + (81,218,0): 100, 127, 72, + (81,219,0): 100, 128, 70, + (81,220,0): 101, 129, 71, + (81,221,0): 101, 129, 71, + (81,222,0): 102, 127, 69, + (81,223,0): 98, 126, 65, + (81,224,0): 93, 128, 62, + (81,225,0): 95, 132, 63, + (81,226,0): 98, 135, 66, + (82,0,0): 54, 57, 46, + (82,1,0): 58, 60, 49, + (82,2,0): 63, 63, 55, + (82,3,0): 68, 65, 58, + (82,4,0): 75, 66, 59, + (82,5,0): 79, 69, 60, + (82,6,0): 86, 72, 61, + (82,7,0): 89, 76, 60, + (82,8,0): 94, 79, 60, + (82,9,0): 92, 79, 60, + (82,10,0): 92, 83, 66, + (82,11,0): 94, 87, 77, + (82,12,0): 99, 93, 93, + (82,13,0): 104, 101, 108, + (82,14,0): 111, 109, 123, + (82,15,0): 115, 113, 137, + (82,16,0): 115, 111, 148, + (82,17,0): 113, 107, 153, + (82,18,0): 106, 102, 152, + (82,19,0): 99, 96, 149, + (82,20,0): 92, 91, 148, + (82,21,0): 90, 90, 152, + (82,22,0): 92, 93, 160, + (82,23,0): 92, 95, 166, + (82,24,0): 104, 106, 181, + (82,25,0): 110, 111, 191, + (82,26,0): 119, 120, 202, + (82,27,0): 127, 128, 210, + (82,28,0): 134, 132, 216, + (82,29,0): 138, 136, 220, + (82,30,0): 143, 139, 224, + (82,31,0): 145, 142, 221, + (82,32,0): 147, 144, 215, + (82,33,0): 147, 144, 211, + (82,34,0): 147, 144, 211, + (82,35,0): 147, 144, 211, + (82,36,0): 148, 142, 212, + (82,37,0): 147, 141, 211, + (82,38,0): 147, 140, 208, + (82,39,0): 146, 139, 206, + (82,40,0): 149, 140, 205, + (82,41,0): 147, 139, 199, + (82,42,0): 148, 139, 194, + (82,43,0): 148, 140, 191, + (82,44,0): 147, 139, 186, + (82,45,0): 140, 133, 175, + (82,46,0): 131, 123, 162, + (82,47,0): 126, 115, 145, + (82,48,0): 121, 103, 119, + (82,49,0): 115, 96, 102, + (82,50,0): 103, 91, 91, + (82,51,0): 100, 91, 86, + (82,52,0): 100, 91, 82, + (82,53,0): 104, 88, 75, + (82,54,0): 117, 85, 72, + (82,55,0): 135, 83, 72, + (82,56,0): 166, 89, 81, + (82,57,0): 190, 95, 89, + (82,58,0): 203, 91, 89, + (82,59,0): 208, 88, 87, + (82,60,0): 218, 100, 98, + (82,61,0): 222, 109, 105, + (82,62,0): 220, 113, 107, + (82,63,0): 226, 119, 113, + (82,64,0): 251, 138, 132, + (82,65,0): 255, 138, 134, + (82,66,0): 255, 133, 129, + (82,67,0): 255, 125, 121, + (82,68,0): 247, 110, 104, + (82,69,0): 238, 97, 88, + (82,70,0): 196, 52, 43, + (82,71,0): 192, 50, 38, + (82,72,0): 196, 56, 41, + (82,73,0): 193, 58, 39, + (82,74,0): 192, 57, 38, + (82,75,0): 192, 57, 37, + (82,76,0): 194, 57, 38, + (82,77,0): 198, 59, 40, + (82,78,0): 204, 58, 43, + (82,79,0): 208, 58, 44, + (82,80,0): 214, 58, 45, + (82,81,0): 211, 53, 41, + (82,82,0): 206, 53, 39, + (82,83,0): 208, 56, 42, + (82,84,0): 212, 62, 47, + (82,85,0): 212, 62, 47, + (82,86,0): 206, 54, 40, + (82,87,0): 203, 47, 34, + (82,88,0): 218, 58, 46, + (82,89,0): 218, 56, 45, + (82,90,0): 217, 55, 44, + (82,91,0): 214, 56, 44, + (82,92,0): 208, 58, 43, + (82,93,0): 201, 58, 41, + (82,94,0): 194, 57, 38, + (82,95,0): 190, 55, 36, + (82,96,0): 189, 53, 41, + (82,97,0): 192, 54, 44, + (82,98,0): 194, 56, 46, + (82,99,0): 196, 58, 48, + (82,100,0): 199, 61, 51, + (82,101,0): 202, 64, 54, + (82,102,0): 203, 65, 55, + (82,103,0): 204, 66, 56, + (82,104,0): 199, 58, 49, + (82,105,0): 202, 64, 54, + (82,106,0): 207, 69, 59, + (82,107,0): 208, 70, 60, + (82,108,0): 210, 72, 62, + (82,109,0): 209, 71, 61, + (82,110,0): 202, 64, 54, + (82,111,0): 197, 55, 43, + (82,112,0): 204, 54, 37, + (82,113,0): 214, 54, 38, + (82,114,0): 223, 55, 44, + (82,115,0): 231, 52, 47, + (82,116,0): 241, 48, 51, + (82,117,0): 246, 45, 53, + (82,118,0): 251, 43, 57, + (82,119,0): 255, 42, 60, + (82,120,0): 252, 39, 59, + (82,121,0): 252, 39, 61, + (82,122,0): 251, 37, 61, + (82,123,0): 249, 35, 59, + (82,124,0): 251, 33, 58, + (82,125,0): 250, 30, 55, + (82,126,0): 252, 28, 55, + (82,127,0): 254, 27, 54, + (82,128,0): 255, 29, 55, + (82,129,0): 255, 30, 53, + (82,130,0): 254, 35, 55, + (82,131,0): 253, 42, 59, + (82,132,0): 247, 50, 60, + (82,133,0): 242, 55, 62, + (82,134,0): 236, 57, 60, + (82,135,0): 229, 59, 59, + (82,136,0): 220, 57, 52, + (82,137,0): 220, 58, 53, + (82,138,0): 222, 59, 52, + (82,139,0): 224, 59, 53, + (82,140,0): 229, 57, 53, + (82,141,0): 231, 56, 53, + (82,142,0): 233, 55, 51, + (82,143,0): 235, 53, 50, + (82,144,0): 237, 51, 54, + (82,145,0): 238, 52, 55, + (82,146,0): 237, 53, 53, + (82,147,0): 234, 54, 53, + (82,148,0): 229, 54, 49, + (82,149,0): 225, 54, 47, + (82,150,0): 220, 53, 44, + (82,151,0): 216, 52, 40, + (82,152,0): 218, 56, 41, + (82,153,0): 217, 57, 41, + (82,154,0): 218, 57, 39, + (82,155,0): 219, 56, 37, + (82,156,0): 221, 56, 37, + (82,157,0): 222, 55, 36, + (82,158,0): 224, 55, 36, + (82,159,0): 225, 54, 37, + (82,160,0): 225, 53, 39, + (82,161,0): 226, 52, 41, + (82,162,0): 227, 53, 42, + (82,163,0): 227, 54, 40, + (82,164,0): 227, 54, 40, + (82,165,0): 225, 55, 40, + (82,166,0): 221, 55, 41, + (82,167,0): 218, 56, 43, + (82,168,0): 219, 61, 50, + (82,169,0): 204, 50, 42, + (82,170,0): 211, 56, 54, + (82,171,0): 255, 108, 112, + (82,172,0): 255, 93, 108, + (82,173,0): 249, 81, 104, + (82,174,0): 237, 62, 91, + (82,175,0): 255, 75, 108, + (82,176,0): 247, 59, 92, + (82,177,0): 255, 66, 100, + (82,178,0): 240, 56, 90, + (82,179,0): 233, 65, 98, + (82,180,0): 227, 87, 113, + (82,181,0): 171, 64, 82, + (82,182,0): 101, 34, 41, + (82,183,0): 81, 46, 42, + (82,184,0): 65, 52, 43, + (82,185,0): 52, 53, 39, + (82,186,0): 53, 54, 38, + (82,187,0): 58, 59, 41, + (82,188,0): 63, 62, 42, + (82,189,0): 62, 61, 40, + (82,190,0): 60, 64, 41, + (82,191,0): 62, 69, 38, + (82,192,0): 62, 70, 29, + (82,193,0): 88, 97, 52, + (82,194,0): 115, 126, 84, + (82,195,0): 128, 140, 100, + (82,196,0): 119, 135, 96, + (82,197,0): 104, 127, 83, + (82,198,0): 97, 125, 76, + (82,199,0): 97, 128, 71, + (82,200,0): 96, 131, 67, + (82,201,0): 96, 133, 63, + (82,202,0): 97, 137, 64, + (82,203,0): 99, 140, 64, + (82,204,0): 104, 142, 69, + (82,205,0): 106, 143, 74, + (82,206,0): 107, 144, 77, + (82,207,0): 108, 145, 78, + (82,208,0): 110, 147, 77, + (82,209,0): 107, 145, 72, + (82,210,0): 104, 141, 72, + (82,211,0): 103, 140, 71, + (82,212,0): 104, 139, 75, + (82,213,0): 104, 139, 75, + (82,214,0): 102, 136, 76, + (82,215,0): 100, 134, 74, + (82,216,0): 101, 132, 75, + (82,217,0): 100, 131, 74, + (82,218,0): 99, 128, 70, + (82,219,0): 100, 129, 71, + (82,220,0): 102, 130, 72, + (82,221,0): 102, 130, 71, + (82,222,0): 101, 129, 70, + (82,223,0): 98, 128, 66, + (82,224,0): 99, 134, 68, + (82,225,0): 101, 138, 69, + (82,226,0): 104, 141, 72, + (83,0,0): 50, 53, 42, + (83,1,0): 53, 56, 45, + (83,2,0): 59, 60, 52, + (83,3,0): 65, 62, 55, + (83,4,0): 71, 64, 58, + (83,5,0): 75, 66, 59, + (83,6,0): 82, 69, 60, + (83,7,0): 86, 74, 60, + (83,8,0): 88, 76, 60, + (83,9,0): 89, 77, 61, + (83,10,0): 89, 81, 68, + (83,11,0): 94, 87, 79, + (83,12,0): 99, 94, 98, + (83,13,0): 105, 103, 114, + (83,14,0): 111, 110, 128, + (83,15,0): 114, 111, 140, + (83,16,0): 114, 109, 149, + (83,17,0): 106, 103, 148, + (83,18,0): 96, 94, 143, + (83,19,0): 87, 87, 139, + (83,20,0): 84, 85, 142, + (83,21,0): 87, 88, 152, + (83,22,0): 92, 95, 162, + (83,23,0): 97, 99, 173, + (83,24,0): 108, 110, 187, + (83,25,0): 114, 115, 195, + (83,26,0): 123, 124, 206, + (83,27,0): 130, 131, 213, + (83,28,0): 136, 134, 217, + (83,29,0): 138, 136, 219, + (83,30,0): 140, 136, 220, + (83,31,0): 141, 138, 217, + (83,32,0): 143, 142, 212, + (83,33,0): 143, 140, 209, + (83,34,0): 143, 140, 209, + (83,35,0): 142, 139, 210, + (83,36,0): 143, 137, 211, + (83,37,0): 142, 136, 210, + (83,38,0): 142, 134, 209, + (83,39,0): 141, 133, 206, + (83,40,0): 143, 133, 202, + (83,41,0): 142, 133, 196, + (83,42,0): 143, 134, 191, + (83,43,0): 144, 136, 187, + (83,44,0): 143, 136, 180, + (83,45,0): 137, 131, 169, + (83,46,0): 128, 121, 154, + (83,47,0): 126, 112, 137, + (83,48,0): 127, 96, 112, + (83,49,0): 121, 90, 96, + (83,50,0): 107, 89, 89, + (83,51,0): 99, 92, 84, + (83,52,0): 96, 94, 81, + (83,53,0): 98, 91, 73, + (83,54,0): 109, 86, 70, + (83,55,0): 128, 82, 69, + (83,56,0): 161, 84, 76, + (83,57,0): 193, 91, 89, + (83,58,0): 209, 89, 91, + (83,59,0): 217, 88, 92, + (83,60,0): 228, 99, 103, + (83,61,0): 228, 108, 107, + (83,62,0): 224, 112, 108, + (83,63,0): 228, 121, 115, + (83,64,0): 236, 125, 118, + (83,65,0): 237, 122, 115, + (83,66,0): 254, 131, 126, + (83,67,0): 255, 134, 129, + (83,68,0): 255, 129, 123, + (83,69,0): 245, 107, 97, + (83,70,0): 201, 60, 50, + (83,71,0): 196, 56, 41, + (83,72,0): 194, 59, 40, + (83,73,0): 191, 58, 39, + (83,74,0): 191, 59, 38, + (83,75,0): 190, 58, 37, + (83,76,0): 193, 58, 38, + (83,77,0): 197, 58, 39, + (83,78,0): 200, 57, 41, + (83,79,0): 206, 56, 42, + (83,80,0): 216, 58, 46, + (83,81,0): 212, 54, 42, + (83,82,0): 206, 53, 39, + (83,83,0): 206, 56, 41, + (83,84,0): 209, 62, 46, + (83,85,0): 209, 62, 46, + (83,86,0): 203, 56, 40, + (83,87,0): 199, 47, 33, + (83,88,0): 210, 54, 41, + (83,89,0): 211, 53, 41, + (83,90,0): 210, 52, 40, + (83,91,0): 210, 54, 41, + (83,92,0): 209, 57, 43, + (83,93,0): 205, 60, 43, + (83,94,0): 200, 61, 42, + (83,95,0): 196, 59, 41, + (83,96,0): 196, 58, 45, + (83,97,0): 196, 58, 47, + (83,98,0): 198, 57, 48, + (83,99,0): 198, 57, 47, + (83,100,0): 199, 58, 49, + (83,101,0): 200, 59, 49, + (83,102,0): 201, 60, 51, + (83,103,0): 203, 61, 51, + (83,104,0): 211, 68, 60, + (83,105,0): 211, 69, 59, + (83,106,0): 208, 65, 57, + (83,107,0): 203, 61, 51, + (83,108,0): 203, 60, 52, + (83,109,0): 207, 65, 55, + (83,110,0): 207, 64, 56, + (83,111,0): 206, 59, 49, + (83,112,0): 206, 53, 39, + (83,113,0): 217, 53, 41, + (83,114,0): 226, 53, 46, + (83,115,0): 235, 51, 49, + (83,116,0): 242, 47, 53, + (83,117,0): 247, 43, 54, + (83,118,0): 249, 41, 55, + (83,119,0): 252, 41, 58, + (83,120,0): 249, 38, 57, + (83,121,0): 247, 38, 59, + (83,122,0): 247, 38, 59, + (83,123,0): 248, 39, 60, + (83,124,0): 251, 38, 60, + (83,125,0): 253, 37, 58, + (83,126,0): 255, 36, 58, + (83,127,0): 255, 35, 58, + (83,128,0): 255, 33, 54, + (83,129,0): 253, 34, 54, + (83,130,0): 250, 37, 55, + (83,131,0): 249, 44, 59, + (83,132,0): 247, 53, 62, + (83,133,0): 242, 57, 63, + (83,134,0): 233, 57, 59, + (83,135,0): 225, 57, 56, + (83,136,0): 220, 57, 52, + (83,137,0): 220, 58, 53, + (83,138,0): 222, 59, 52, + (83,139,0): 224, 59, 53, + (83,140,0): 229, 57, 53, + (83,141,0): 231, 56, 53, + (83,142,0): 233, 55, 51, + (83,143,0): 235, 53, 52, + (83,144,0): 238, 52, 55, + (83,145,0): 238, 52, 55, + (83,146,0): 238, 54, 54, + (83,147,0): 234, 54, 53, + (83,148,0): 230, 55, 50, + (83,149,0): 225, 54, 47, + (83,150,0): 220, 53, 44, + (83,151,0): 215, 53, 42, + (83,152,0): 216, 56, 42, + (83,153,0): 216, 56, 40, + (83,154,0): 216, 56, 40, + (83,155,0): 217, 56, 38, + (83,156,0): 218, 55, 38, + (83,157,0): 220, 55, 36, + (83,158,0): 221, 54, 36, + (83,159,0): 221, 54, 36, + (83,160,0): 219, 53, 37, + (83,161,0): 220, 54, 40, + (83,162,0): 221, 55, 39, + (83,163,0): 220, 57, 40, + (83,164,0): 220, 57, 40, + (83,165,0): 218, 59, 40, + (83,166,0): 215, 58, 41, + (83,167,0): 214, 58, 43, + (83,168,0): 213, 59, 49, + (83,169,0): 206, 51, 46, + (83,170,0): 231, 73, 74, + (83,171,0): 255, 111, 119, + (83,172,0): 254, 85, 104, + (83,173,0): 243, 69, 94, + (83,174,0): 243, 62, 95, + (83,175,0): 255, 67, 102, + (83,176,0): 251, 55, 91, + (83,177,0): 252, 60, 97, + (83,178,0): 240, 66, 99, + (83,179,0): 228, 79, 108, + (83,180,0): 196, 80, 101, + (83,181,0): 129, 47, 61, + (83,182,0): 78, 29, 33, + (83,183,0): 72, 48, 46, + (83,184,0): 54, 47, 39, + (83,185,0): 50, 52, 39, + (83,186,0): 56, 58, 44, + (83,187,0): 62, 65, 46, + (83,188,0): 65, 64, 43, + (83,189,0): 63, 61, 36, + (83,190,0): 65, 64, 36, + (83,191,0): 69, 70, 36, + (83,192,0): 84, 93, 48, + (83,193,0): 112, 126, 77, + (83,194,0): 143, 159, 114, + (83,195,0): 151, 168, 124, + (83,196,0): 131, 152, 109, + (83,197,0): 106, 132, 87, + (83,198,0): 95, 123, 74, + (83,199,0): 93, 126, 69, + (83,200,0): 95, 131, 67, + (83,201,0): 97, 134, 64, + (83,202,0): 98, 138, 65, + (83,203,0): 102, 143, 67, + (83,204,0): 107, 144, 74, + (83,205,0): 108, 145, 76, + (83,206,0): 109, 146, 79, + (83,207,0): 109, 146, 79, + (83,208,0): 111, 148, 78, + (83,209,0): 108, 146, 73, + (83,210,0): 105, 142, 73, + (83,211,0): 104, 141, 72, + (83,212,0): 105, 140, 76, + (83,213,0): 105, 140, 76, + (83,214,0): 104, 138, 78, + (83,215,0): 103, 137, 77, + (83,216,0): 102, 133, 76, + (83,217,0): 100, 131, 74, + (83,218,0): 100, 129, 71, + (83,219,0): 101, 130, 72, + (83,220,0): 103, 131, 72, + (83,221,0): 104, 132, 73, + (83,222,0): 102, 130, 71, + (83,223,0): 100, 130, 68, + (83,224,0): 103, 138, 72, + (83,225,0): 105, 142, 73, + (83,226,0): 108, 145, 76, + (84,0,0): 45, 51, 39, + (84,1,0): 51, 54, 43, + (84,2,0): 56, 57, 49, + (84,3,0): 60, 59, 54, + (84,4,0): 66, 61, 57, + (84,5,0): 71, 64, 58, + (84,6,0): 77, 68, 61, + (84,7,0): 81, 71, 61, + (84,8,0): 83, 73, 61, + (84,9,0): 83, 75, 62, + (84,10,0): 85, 78, 68, + (84,11,0): 90, 85, 81, + (84,12,0): 97, 94, 101, + (84,13,0): 105, 103, 117, + (84,14,0): 109, 107, 129, + (84,15,0): 108, 107, 138, + (84,16,0): 106, 104, 144, + (84,17,0): 98, 96, 143, + (84,18,0): 88, 86, 136, + (84,19,0): 80, 80, 134, + (84,20,0): 81, 81, 141, + (84,21,0): 88, 89, 154, + (84,22,0): 96, 99, 170, + (84,23,0): 102, 106, 180, + (84,24,0): 111, 114, 193, + (84,25,0): 117, 120, 201, + (84,26,0): 124, 127, 208, + (84,27,0): 130, 133, 214, + (84,28,0): 134, 135, 217, + (84,29,0): 135, 136, 216, + (84,30,0): 138, 137, 217, + (84,31,0): 139, 138, 214, + (84,32,0): 139, 139, 209, + (84,33,0): 139, 138, 206, + (84,34,0): 138, 136, 209, + (84,35,0): 137, 135, 210, + (84,36,0): 137, 133, 210, + (84,37,0): 136, 131, 211, + (84,38,0): 138, 131, 211, + (84,39,0): 137, 130, 207, + (84,40,0): 140, 132, 205, + (84,41,0): 139, 132, 199, + (84,42,0): 141, 133, 192, + (84,43,0): 141, 134, 185, + (84,44,0): 141, 134, 175, + (84,45,0): 135, 130, 162, + (84,46,0): 126, 120, 146, + (84,47,0): 127, 110, 129, + (84,48,0): 131, 90, 104, + (84,49,0): 125, 84, 90, + (84,50,0): 108, 87, 84, + (84,51,0): 99, 92, 82, + (84,52,0): 92, 96, 79, + (84,53,0): 91, 95, 72, + (84,54,0): 102, 90, 68, + (84,55,0): 122, 83, 66, + (84,56,0): 149, 74, 68, + (84,57,0): 187, 83, 82, + (84,58,0): 209, 83, 87, + (84,59,0): 219, 82, 89, + (84,60,0): 230, 93, 100, + (84,61,0): 231, 102, 106, + (84,62,0): 224, 108, 108, + (84,63,0): 227, 118, 113, + (84,64,0): 228, 117, 110, + (84,65,0): 226, 111, 104, + (84,66,0): 247, 126, 118, + (84,67,0): 255, 130, 123, + (84,68,0): 255, 135, 126, + (84,69,0): 244, 108, 96, + (84,70,0): 201, 63, 50, + (84,71,0): 193, 56, 40, + (84,72,0): 192, 59, 40, + (84,73,0): 191, 61, 39, + (84,74,0): 191, 61, 39, + (84,75,0): 192, 60, 39, + (84,76,0): 194, 59, 39, + (84,77,0): 197, 58, 39, + (84,78,0): 199, 56, 40, + (84,79,0): 205, 55, 41, + (84,80,0): 216, 58, 47, + (84,81,0): 217, 56, 46, + (84,82,0): 210, 56, 44, + (84,83,0): 207, 57, 43, + (84,84,0): 204, 58, 43, + (84,85,0): 201, 58, 42, + (84,86,0): 200, 57, 41, + (84,87,0): 201, 55, 40, + (84,88,0): 207, 57, 43, + (84,89,0): 209, 55, 43, + (84,90,0): 210, 56, 44, + (84,91,0): 209, 55, 43, + (84,92,0): 207, 55, 42, + (84,93,0): 204, 56, 42, + (84,94,0): 203, 60, 44, + (84,95,0): 203, 62, 45, + (84,96,0): 202, 60, 48, + (84,97,0): 201, 61, 48, + (84,98,0): 202, 60, 50, + (84,99,0): 201, 59, 47, + (84,100,0): 200, 58, 48, + (84,101,0): 198, 56, 44, + (84,102,0): 197, 55, 45, + (84,103,0): 197, 53, 42, + (84,104,0): 208, 64, 55, + (84,105,0): 208, 64, 53, + (84,106,0): 205, 61, 52, + (84,107,0): 201, 57, 46, + (84,108,0): 203, 56, 48, + (84,109,0): 206, 59, 49, + (84,110,0): 205, 58, 50, + (84,111,0): 204, 53, 44, + (84,112,0): 208, 47, 37, + (84,113,0): 217, 48, 41, + (84,114,0): 228, 50, 48, + (84,115,0): 236, 50, 53, + (84,116,0): 244, 47, 56, + (84,117,0): 249, 45, 57, + (84,118,0): 251, 43, 59, + (84,119,0): 252, 44, 60, + (84,120,0): 252, 45, 63, + (84,121,0): 251, 46, 63, + (84,122,0): 252, 47, 64, + (84,123,0): 252, 47, 64, + (84,124,0): 254, 47, 65, + (84,125,0): 255, 47, 63, + (84,126,0): 255, 45, 63, + (84,127,0): 255, 46, 64, + (84,128,0): 255, 40, 56, + (84,129,0): 251, 40, 55, + (84,130,0): 247, 43, 55, + (84,131,0): 245, 48, 58, + (84,132,0): 241, 54, 61, + (84,133,0): 237, 56, 61, + (84,134,0): 228, 56, 56, + (84,135,0): 221, 53, 52, + (84,136,0): 220, 57, 52, + (84,137,0): 220, 58, 53, + (84,138,0): 222, 59, 54, + (84,139,0): 226, 58, 55, + (84,140,0): 229, 57, 53, + (84,141,0): 231, 56, 53, + (84,142,0): 234, 54, 53, + (84,143,0): 236, 52, 52, + (84,144,0): 241, 52, 56, + (84,145,0): 241, 52, 56, + (84,146,0): 239, 53, 54, + (84,147,0): 237, 55, 54, + (84,148,0): 230, 55, 50, + (84,149,0): 225, 54, 47, + (84,150,0): 218, 54, 44, + (84,151,0): 215, 53, 42, + (84,152,0): 216, 56, 42, + (84,153,0): 214, 57, 40, + (84,154,0): 214, 57, 40, + (84,155,0): 216, 57, 38, + (84,156,0): 216, 57, 38, + (84,157,0): 217, 56, 38, + (84,158,0): 218, 55, 38, + (84,159,0): 217, 56, 38, + (84,160,0): 213, 56, 37, + (84,161,0): 213, 58, 38, + (84,162,0): 214, 59, 39, + (84,163,0): 213, 61, 40, + (84,164,0): 212, 61, 40, + (84,165,0): 211, 62, 42, + (84,166,0): 211, 61, 44, + (84,167,0): 211, 61, 46, + (84,168,0): 208, 55, 47, + (84,169,0): 215, 60, 56, + (84,170,0): 255, 93, 100, + (84,171,0): 255, 96, 111, + (84,172,0): 255, 80, 103, + (84,173,0): 240, 60, 89, + (84,174,0): 255, 66, 104, + (84,175,0): 250, 55, 95, + (84,176,0): 255, 55, 95, + (84,177,0): 242, 52, 88, + (84,178,0): 237, 78, 108, + (84,179,0): 215, 92, 113, + (84,180,0): 148, 64, 79, + (84,181,0): 91, 38, 46, + (84,182,0): 71, 40, 45, + (84,183,0): 63, 49, 48, + (84,184,0): 49, 46, 41, + (84,185,0): 52, 54, 43, + (84,186,0): 58, 62, 47, + (84,187,0): 60, 65, 43, + (84,188,0): 58, 61, 34, + (84,189,0): 62, 61, 30, + (84,190,0): 80, 74, 40, + (84,191,0): 94, 92, 53, + (84,192,0): 121, 133, 83, + (84,193,0): 144, 163, 108, + (84,194,0): 170, 190, 139, + (84,195,0): 168, 190, 141, + (84,196,0): 142, 165, 119, + (84,197,0): 111, 139, 91, + (84,198,0): 97, 127, 75, + (84,199,0): 94, 127, 70, + (84,200,0): 96, 132, 68, + (84,201,0): 99, 136, 66, + (84,202,0): 101, 141, 68, + (84,203,0): 106, 147, 71, + (84,204,0): 111, 148, 78, + (84,205,0): 112, 149, 80, + (84,206,0): 111, 147, 83, + (84,207,0): 111, 147, 83, + (84,208,0): 111, 148, 78, + (84,209,0): 108, 146, 73, + (84,210,0): 105, 142, 73, + (84,211,0): 103, 140, 71, + (84,212,0): 105, 140, 76, + (84,213,0): 105, 140, 76, + (84,214,0): 105, 139, 79, + (84,215,0): 104, 138, 78, + (84,216,0): 102, 133, 74, + (84,217,0): 101, 132, 73, + (84,218,0): 100, 131, 72, + (84,219,0): 101, 132, 73, + (84,220,0): 103, 133, 73, + (84,221,0): 104, 134, 72, + (84,222,0): 103, 133, 71, + (84,223,0): 101, 133, 68, + (84,224,0): 105, 142, 73, + (84,225,0): 105, 145, 75, + (84,226,0): 108, 148, 78, + (85,0,0): 43, 49, 37, + (85,1,0): 46, 52, 42, + (85,2,0): 52, 55, 48, + (85,3,0): 56, 57, 51, + (85,4,0): 62, 58, 55, + (85,5,0): 66, 61, 58, + (85,6,0): 72, 65, 59, + (85,7,0): 75, 68, 60, + (85,8,0): 78, 72, 60, + (85,9,0): 78, 71, 61, + (85,10,0): 79, 74, 68, + (85,11,0): 87, 83, 82, + (85,12,0): 95, 94, 102, + (85,13,0): 102, 101, 117, + (85,14,0): 103, 103, 127, + (85,15,0): 103, 102, 134, + (85,16,0): 98, 97, 137, + (85,17,0): 91, 89, 138, + (85,18,0): 81, 81, 133, + (85,19,0): 78, 79, 135, + (85,20,0): 82, 83, 147, + (85,21,0): 91, 94, 163, + (85,22,0): 101, 105, 179, + (85,23,0): 108, 111, 190, + (85,24,0): 117, 119, 202, + (85,25,0): 122, 124, 209, + (85,26,0): 127, 129, 214, + (85,27,0): 131, 133, 216, + (85,28,0): 134, 135, 217, + (85,29,0): 134, 135, 215, + (85,30,0): 136, 135, 213, + (85,31,0): 137, 136, 212, + (85,32,0): 135, 135, 205, + (85,33,0): 134, 134, 204, + (85,34,0): 134, 132, 205, + (85,35,0): 133, 130, 207, + (85,36,0): 133, 128, 210, + (85,37,0): 133, 128, 210, + (85,38,0): 135, 127, 212, + (85,39,0): 135, 128, 208, + (85,40,0): 141, 133, 210, + (85,41,0): 140, 133, 201, + (85,42,0): 141, 133, 192, + (85,43,0): 140, 134, 182, + (85,44,0): 139, 133, 169, + (85,45,0): 132, 128, 155, + (85,46,0): 123, 118, 138, + (85,47,0): 124, 106, 120, + (85,48,0): 129, 87, 97, + (85,49,0): 126, 81, 86, + (85,50,0): 109, 85, 81, + (85,51,0): 100, 94, 80, + (85,52,0): 92, 100, 77, + (85,53,0): 89, 97, 73, + (85,54,0): 99, 93, 69, + (85,55,0): 118, 87, 67, + (85,56,0): 146, 78, 69, + (85,57,0): 183, 85, 82, + (85,58,0): 209, 84, 90, + (85,59,0): 219, 82, 90, + (85,60,0): 231, 92, 99, + (85,61,0): 231, 98, 103, + (85,62,0): 228, 104, 106, + (85,63,0): 231, 113, 111, + (85,64,0): 236, 121, 114, + (85,65,0): 230, 113, 104, + (85,66,0): 247, 124, 116, + (85,67,0): 243, 115, 106, + (85,68,0): 254, 120, 109, + (85,69,0): 230, 92, 81, + (85,70,0): 196, 59, 43, + (85,71,0): 190, 53, 35, + (85,72,0): 194, 59, 39, + (85,73,0): 193, 61, 40, + (85,74,0): 193, 61, 40, + (85,75,0): 195, 60, 40, + (85,76,0): 196, 59, 40, + (85,77,0): 200, 59, 41, + (85,78,0): 203, 57, 42, + (85,79,0): 207, 55, 42, + (85,80,0): 214, 53, 43, + (85,81,0): 216, 55, 45, + (85,82,0): 212, 58, 46, + (85,83,0): 206, 58, 44, + (85,84,0): 199, 58, 41, + (85,85,0): 196, 56, 39, + (85,86,0): 198, 58, 41, + (85,87,0): 202, 61, 44, + (85,88,0): 207, 61, 46, + (85,89,0): 214, 64, 50, + (85,90,0): 217, 65, 52, + (85,91,0): 214, 62, 49, + (85,92,0): 206, 56, 42, + (85,93,0): 200, 52, 38, + (85,94,0): 202, 56, 41, + (85,95,0): 203, 60, 44, + (85,96,0): 201, 58, 44, + (85,97,0): 200, 58, 44, + (85,98,0): 201, 59, 47, + (85,99,0): 201, 59, 45, + (85,100,0): 202, 58, 47, + (85,101,0): 200, 57, 43, + (85,102,0): 200, 53, 43, + (85,103,0): 199, 53, 40, + (85,104,0): 202, 54, 44, + (85,105,0): 207, 59, 47, + (85,106,0): 210, 62, 52, + (85,107,0): 211, 63, 51, + (85,108,0): 214, 63, 54, + (85,109,0): 213, 62, 51, + (85,110,0): 206, 55, 46, + (85,111,0): 201, 44, 35, + (85,112,0): 210, 43, 37, + (85,113,0): 220, 45, 42, + (85,114,0): 231, 48, 50, + (85,115,0): 240, 51, 57, + (85,116,0): 246, 49, 59, + (85,117,0): 250, 48, 60, + (85,118,0): 253, 48, 63, + (85,119,0): 253, 48, 63, + (85,120,0): 249, 48, 64, + (85,121,0): 247, 49, 64, + (85,122,0): 247, 49, 64, + (85,123,0): 246, 48, 61, + (85,124,0): 247, 47, 60, + (85,125,0): 247, 45, 57, + (85,126,0): 250, 44, 57, + (85,127,0): 250, 42, 55, + (85,128,0): 252, 46, 59, + (85,129,0): 248, 46, 58, + (85,130,0): 245, 48, 58, + (85,131,0): 240, 51, 58, + (85,132,0): 237, 54, 59, + (85,133,0): 231, 55, 58, + (85,134,0): 224, 54, 54, + (85,135,0): 218, 53, 51, + (85,136,0): 220, 57, 52, + (85,137,0): 221, 58, 53, + (85,138,0): 223, 58, 54, + (85,139,0): 226, 58, 55, + (85,140,0): 229, 57, 53, + (85,141,0): 231, 56, 53, + (85,142,0): 234, 54, 53, + (85,143,0): 236, 52, 52, + (85,144,0): 242, 53, 57, + (85,145,0): 242, 53, 57, + (85,146,0): 240, 54, 55, + (85,147,0): 237, 55, 54, + (85,148,0): 230, 55, 52, + (85,149,0): 223, 54, 47, + (85,150,0): 218, 54, 45, + (85,151,0): 214, 54, 42, + (85,152,0): 213, 55, 43, + (85,153,0): 212, 56, 41, + (85,154,0): 212, 56, 41, + (85,155,0): 212, 57, 39, + (85,156,0): 213, 56, 39, + (85,157,0): 213, 56, 37, + (85,158,0): 215, 55, 39, + (85,159,0): 212, 57, 37, + (85,160,0): 208, 57, 36, + (85,161,0): 206, 60, 37, + (85,162,0): 207, 61, 38, + (85,163,0): 207, 63, 39, + (85,164,0): 206, 64, 40, + (85,165,0): 206, 64, 42, + (85,166,0): 206, 63, 46, + (85,167,0): 208, 60, 48, + (85,168,0): 208, 55, 49, + (85,169,0): 232, 72, 72, + (85,170,0): 255, 103, 113, + (85,171,0): 254, 78, 98, + (85,172,0): 255, 72, 100, + (85,173,0): 246, 56, 90, + (85,174,0): 255, 66, 108, + (85,175,0): 246, 49, 92, + (85,176,0): 255, 57, 96, + (85,177,0): 234, 55, 87, + (85,178,0): 221, 83, 106, + (85,179,0): 185, 87, 102, + (85,180,0): 107, 50, 57, + (85,181,0): 71, 41, 43, + (85,182,0): 71, 55, 58, + (85,183,0): 59, 50, 51, + (85,184,0): 56, 51, 48, + (85,185,0): 58, 55, 48, + (85,186,0): 57, 59, 45, + (85,187,0): 53, 58, 35, + (85,188,0): 51, 56, 24, + (85,189,0): 66, 68, 29, + (85,190,0): 102, 99, 58, + (85,191,0): 129, 131, 84, + (85,192,0): 159, 174, 119, + (85,193,0): 169, 193, 135, + (85,194,0): 181, 206, 151, + (85,195,0): 175, 199, 147, + (85,196,0): 146, 174, 125, + (85,197,0): 118, 148, 98, + (85,198,0): 101, 134, 81, + (85,199,0): 96, 130, 70, + (85,200,0): 96, 133, 66, + (85,201,0): 99, 136, 66, + (85,202,0): 103, 143, 70, + (85,203,0): 109, 150, 74, + (85,204,0): 114, 152, 79, + (85,205,0): 114, 151, 82, + (85,206,0): 113, 149, 85, + (85,207,0): 112, 148, 84, + (85,208,0): 111, 148, 78, + (85,209,0): 108, 145, 75, + (85,210,0): 104, 141, 72, + (85,211,0): 102, 139, 70, + (85,212,0): 104, 139, 75, + (85,213,0): 105, 140, 76, + (85,214,0): 105, 139, 78, + (85,215,0): 105, 139, 79, + (85,216,0): 103, 134, 75, + (85,217,0): 102, 133, 74, + (85,218,0): 101, 132, 73, + (85,219,0): 102, 133, 73, + (85,220,0): 104, 136, 73, + (85,221,0): 105, 137, 72, + (85,222,0): 105, 135, 71, + (85,223,0): 102, 134, 67, + (85,224,0): 106, 143, 74, + (85,225,0): 107, 147, 77, + (85,226,0): 110, 150, 80, + (86,0,0): 40, 48, 35, + (86,1,0): 43, 49, 39, + (86,2,0): 47, 52, 45, + (86,3,0): 51, 53, 48, + (86,4,0): 55, 54, 52, + (86,5,0): 60, 56, 53, + (86,6,0): 64, 61, 56, + (86,7,0): 67, 62, 56, + (86,8,0): 73, 69, 60, + (86,9,0): 72, 69, 60, + (86,10,0): 75, 72, 67, + (86,11,0): 82, 80, 81, + (86,12,0): 91, 91, 101, + (86,13,0): 97, 98, 116, + (86,14,0): 98, 98, 124, + (86,15,0): 96, 96, 130, + (86,16,0): 95, 94, 136, + (86,17,0): 90, 88, 138, + (86,18,0): 84, 84, 138, + (86,19,0): 84, 84, 144, + (86,20,0): 92, 93, 160, + (86,21,0): 103, 105, 179, + (86,22,0): 112, 115, 196, + (86,23,0): 118, 120, 205, + (86,24,0): 123, 127, 216, + (86,25,0): 126, 130, 219, + (86,26,0): 131, 132, 222, + (86,27,0): 132, 134, 221, + (86,28,0): 132, 133, 216, + (86,29,0): 131, 132, 214, + (86,30,0): 133, 132, 212, + (86,31,0): 134, 133, 209, + (86,32,0): 131, 134, 203, + (86,33,0): 130, 133, 202, + (86,34,0): 131, 131, 205, + (86,35,0): 130, 129, 207, + (86,36,0): 131, 127, 211, + (86,37,0): 133, 128, 212, + (86,38,0): 136, 128, 214, + (86,39,0): 136, 128, 211, + (86,40,0): 141, 133, 210, + (86,41,0): 139, 132, 200, + (86,42,0): 139, 131, 188, + (86,43,0): 139, 132, 176, + (86,44,0): 137, 130, 163, + (86,45,0): 129, 124, 146, + (86,46,0): 119, 113, 127, + (86,47,0): 117, 102, 109, + (86,48,0): 125, 86, 91, + (86,49,0): 121, 81, 81, + (86,50,0): 107, 87, 78, + (86,51,0): 101, 95, 79, + (86,52,0): 93, 101, 77, + (86,53,0): 91, 100, 73, + (86,54,0): 100, 96, 71, + (86,55,0): 116, 91, 69, + (86,56,0): 140, 82, 70, + (86,57,0): 176, 91, 84, + (86,58,0): 202, 89, 91, + (86,59,0): 214, 85, 90, + (86,60,0): 226, 91, 97, + (86,61,0): 230, 93, 100, + (86,62,0): 231, 98, 101, + (86,63,0): 237, 109, 108, + (86,64,0): 245, 122, 115, + (86,65,0): 237, 114, 106, + (86,66,0): 247, 120, 111, + (86,67,0): 222, 89, 80, + (86,68,0): 229, 91, 80, + (86,69,0): 210, 68, 56, + (86,70,0): 195, 53, 39, + (86,71,0): 199, 58, 41, + (86,72,0): 197, 58, 39, + (86,73,0): 196, 60, 38, + (86,74,0): 197, 61, 39, + (86,75,0): 200, 61, 40, + (86,76,0): 202, 59, 42, + (86,77,0): 205, 58, 42, + (86,78,0): 208, 56, 42, + (86,79,0): 212, 54, 42, + (86,80,0): 211, 48, 39, + (86,81,0): 212, 51, 41, + (86,82,0): 210, 56, 44, + (86,83,0): 205, 59, 44, + (86,84,0): 199, 59, 42, + (86,85,0): 194, 59, 40, + (86,86,0): 192, 59, 40, + (86,87,0): 195, 60, 41, + (86,88,0): 200, 59, 42, + (86,89,0): 213, 67, 52, + (86,90,0): 225, 75, 61, + (86,91,0): 222, 72, 58, + (86,92,0): 211, 61, 47, + (86,93,0): 202, 52, 38, + (86,94,0): 201, 53, 39, + (86,95,0): 205, 59, 44, + (86,96,0): 200, 57, 41, + (86,97,0): 200, 57, 41, + (86,98,0): 200, 57, 43, + (86,99,0): 200, 57, 41, + (86,100,0): 202, 56, 43, + (86,101,0): 202, 56, 41, + (86,102,0): 203, 55, 43, + (86,103,0): 203, 55, 41, + (86,104,0): 205, 54, 43, + (86,105,0): 210, 60, 46, + (86,106,0): 215, 63, 52, + (86,107,0): 216, 64, 51, + (86,108,0): 218, 64, 54, + (86,109,0): 219, 65, 53, + (86,110,0): 215, 58, 49, + (86,111,0): 210, 49, 41, + (86,112,0): 220, 48, 46, + (86,113,0): 229, 49, 52, + (86,114,0): 238, 52, 57, + (86,115,0): 245, 54, 62, + (86,116,0): 249, 52, 62, + (86,117,0): 249, 49, 62, + (86,118,0): 250, 48, 64, + (86,119,0): 248, 47, 63, + (86,120,0): 242, 46, 60, + (86,121,0): 239, 47, 60, + (86,122,0): 237, 47, 57, + (86,123,0): 237, 48, 55, + (86,124,0): 239, 45, 53, + (86,125,0): 239, 44, 50, + (86,126,0): 242, 43, 50, + (86,127,0): 241, 42, 49, + (86,128,0): 244, 49, 57, + (86,129,0): 244, 50, 58, + (86,130,0): 242, 53, 59, + (86,131,0): 236, 53, 57, + (86,132,0): 229, 53, 55, + (86,133,0): 225, 53, 53, + (86,134,0): 223, 55, 54, + (86,135,0): 221, 56, 54, + (86,136,0): 220, 56, 54, + (86,137,0): 221, 57, 55, + (86,138,0): 223, 58, 54, + (86,139,0): 227, 58, 55, + (86,140,0): 230, 56, 55, + (86,141,0): 233, 55, 55, + (86,142,0): 234, 54, 55, + (86,143,0): 236, 52, 54, + (86,144,0): 244, 53, 58, + (86,145,0): 244, 53, 58, + (86,146,0): 241, 55, 58, + (86,147,0): 238, 56, 55, + (86,148,0): 230, 55, 52, + (86,149,0): 224, 55, 48, + (86,150,0): 218, 54, 45, + (86,151,0): 212, 54, 42, + (86,152,0): 211, 55, 42, + (86,153,0): 209, 56, 42, + (86,154,0): 208, 56, 42, + (86,155,0): 208, 57, 40, + (86,156,0): 208, 57, 40, + (86,157,0): 208, 57, 38, + (86,158,0): 209, 56, 40, + (86,159,0): 208, 57, 38, + (86,160,0): 203, 57, 34, + (86,161,0): 200, 58, 34, + (86,162,0): 200, 62, 36, + (86,163,0): 199, 63, 37, + (86,164,0): 200, 64, 40, + (86,165,0): 200, 64, 42, + (86,166,0): 203, 62, 45, + (86,167,0): 206, 59, 49, + (86,168,0): 213, 58, 54, + (86,169,0): 250, 85, 91, + (86,170,0): 255, 94, 111, + (86,171,0): 255, 71, 97, + (86,172,0): 253, 62, 95, + (86,173,0): 254, 58, 96, + (86,174,0): 255, 56, 102, + (86,175,0): 250, 53, 98, + (86,176,0): 244, 58, 95, + (86,177,0): 230, 71, 99, + (86,178,0): 192, 80, 96, + (86,179,0): 135, 64, 72, + (86,180,0): 84, 50, 51, + (86,181,0): 67, 53, 52, + (86,182,0): 68, 57, 61, + (86,183,0): 62, 51, 55, + (86,184,0): 66, 51, 54, + (86,185,0): 64, 53, 49, + (86,186,0): 58, 56, 43, + (86,187,0): 54, 60, 34, + (86,188,0): 57, 67, 30, + (86,189,0): 80, 92, 46, + (86,190,0): 125, 132, 80, + (86,191,0): 159, 168, 113, + (86,192,0): 176, 197, 138, + (86,193,0): 175, 203, 142, + (86,194,0): 176, 204, 146, + (86,195,0): 166, 195, 141, + (86,196,0): 146, 174, 125, + (86,197,0): 123, 153, 101, + (86,198,0): 103, 136, 81, + (86,199,0): 95, 129, 69, + (86,200,0): 94, 131, 64, + (86,201,0): 99, 137, 64, + (86,202,0): 105, 143, 68, + (86,203,0): 111, 149, 74, + (86,204,0): 115, 153, 80, + (86,205,0): 115, 152, 83, + (86,206,0): 113, 149, 85, + (86,207,0): 111, 147, 83, + (86,208,0): 110, 147, 78, + (86,209,0): 107, 144, 74, + (86,210,0): 103, 140, 71, + (86,211,0): 101, 138, 69, + (86,212,0): 103, 138, 74, + (86,213,0): 104, 139, 75, + (86,214,0): 105, 139, 78, + (86,215,0): 105, 139, 78, + (86,216,0): 102, 136, 75, + (86,217,0): 100, 134, 73, + (86,218,0): 100, 134, 73, + (86,219,0): 101, 136, 72, + (86,220,0): 103, 138, 74, + (86,221,0): 104, 139, 73, + (86,222,0): 105, 137, 72, + (86,223,0): 102, 137, 69, + (86,224,0): 106, 146, 76, + (86,225,0): 108, 150, 78, + (86,226,0): 111, 153, 81, + (87,0,0): 38, 46, 33, + (87,1,0): 40, 48, 37, + (87,2,0): 45, 50, 43, + (87,3,0): 49, 51, 46, + (87,4,0): 51, 51, 49, + (87,5,0): 55, 54, 52, + (87,6,0): 58, 57, 53, + (87,7,0): 60, 59, 54, + (87,8,0): 71, 68, 61, + (87,9,0): 68, 68, 60, + (87,10,0): 71, 70, 66, + (87,11,0): 79, 79, 81, + (87,12,0): 90, 90, 100, + (87,13,0): 95, 97, 112, + (87,14,0): 94, 96, 121, + (87,15,0): 92, 92, 126, + (87,16,0): 96, 95, 137, + (87,17,0): 92, 90, 140, + (87,18,0): 89, 88, 145, + (87,19,0): 92, 92, 154, + (87,20,0): 103, 103, 173, + (87,21,0): 113, 115, 192, + (87,22,0): 122, 124, 209, + (87,23,0): 127, 128, 220, + (87,24,0): 129, 132, 225, + (87,25,0): 130, 133, 228, + (87,26,0): 133, 134, 227, + (87,27,0): 132, 133, 225, + (87,28,0): 131, 131, 219, + (87,29,0): 129, 130, 213, + (87,30,0): 131, 130, 210, + (87,31,0): 131, 130, 206, + (87,32,0): 132, 135, 204, + (87,33,0): 131, 134, 201, + (87,34,0): 132, 132, 204, + (87,35,0): 131, 130, 206, + (87,36,0): 133, 130, 211, + (87,37,0): 135, 130, 214, + (87,38,0): 138, 130, 215, + (87,39,0): 140, 131, 212, + (87,40,0): 141, 133, 208, + (87,41,0): 140, 131, 196, + (87,42,0): 139, 130, 183, + (87,43,0): 138, 130, 171, + (87,44,0): 133, 127, 155, + (87,45,0): 127, 120, 136, + (87,46,0): 115, 110, 117, + (87,47,0): 111, 99, 99, + (87,48,0): 117, 87, 85, + (87,49,0): 114, 84, 76, + (87,50,0): 105, 87, 75, + (87,51,0): 102, 95, 77, + (87,52,0): 99, 101, 77, + (87,53,0): 97, 100, 73, + (87,54,0): 102, 96, 70, + (87,55,0): 115, 93, 70, + (87,56,0): 125, 79, 63, + (87,57,0): 159, 89, 77, + (87,58,0): 184, 89, 83, + (87,59,0): 197, 83, 82, + (87,60,0): 215, 86, 90, + (87,61,0): 226, 87, 92, + (87,62,0): 233, 90, 96, + (87,63,0): 240, 100, 101, + (87,64,0): 247, 114, 109, + (87,65,0): 241, 110, 102, + (87,66,0): 247, 113, 104, + (87,67,0): 209, 68, 59, + (87,68,0): 212, 65, 55, + (87,69,0): 197, 49, 37, + (87,70,0): 200, 52, 38, + (87,71,0): 212, 67, 50, + (87,72,0): 199, 57, 37, + (87,73,0): 199, 58, 38, + (87,74,0): 201, 59, 39, + (87,75,0): 205, 60, 41, + (87,76,0): 208, 58, 43, + (87,77,0): 211, 58, 44, + (87,78,0): 216, 56, 44, + (87,79,0): 217, 55, 44, + (87,80,0): 207, 44, 35, + (87,81,0): 206, 48, 37, + (87,82,0): 206, 54, 41, + (87,83,0): 203, 60, 44, + (87,84,0): 199, 64, 45, + (87,85,0): 193, 62, 42, + (87,86,0): 190, 59, 39, + (87,87,0): 188, 55, 36, + (87,88,0): 192, 52, 35, + (87,89,0): 209, 66, 50, + (87,90,0): 227, 79, 65, + (87,91,0): 228, 78, 64, + (87,92,0): 216, 66, 52, + (87,93,0): 203, 55, 41, + (87,94,0): 203, 55, 41, + (87,95,0): 208, 62, 47, + (87,96,0): 202, 59, 43, + (87,97,0): 201, 58, 42, + (87,98,0): 199, 56, 40, + (87,99,0): 198, 55, 39, + (87,100,0): 200, 54, 39, + (87,101,0): 202, 54, 40, + (87,102,0): 206, 56, 42, + (87,103,0): 208, 56, 43, + (87,104,0): 211, 59, 46, + (87,105,0): 213, 59, 47, + (87,106,0): 213, 57, 45, + (87,107,0): 210, 54, 42, + (87,108,0): 213, 55, 44, + (87,109,0): 218, 60, 49, + (87,110,0): 221, 60, 50, + (87,111,0): 220, 55, 49, + (87,112,0): 232, 56, 56, + (87,113,0): 241, 56, 61, + (87,114,0): 247, 58, 65, + (87,115,0): 251, 57, 66, + (87,116,0): 250, 52, 65, + (87,117,0): 245, 47, 60, + (87,118,0): 242, 44, 59, + (87,119,0): 239, 44, 58, + (87,120,0): 237, 47, 59, + (87,121,0): 234, 49, 57, + (87,122,0): 234, 51, 56, + (87,123,0): 235, 52, 56, + (87,124,0): 237, 53, 55, + (87,125,0): 241, 53, 54, + (87,126,0): 244, 51, 54, + (87,127,0): 243, 53, 55, + (87,128,0): 239, 50, 54, + (87,129,0): 238, 53, 58, + (87,130,0): 236, 56, 59, + (87,131,0): 233, 54, 57, + (87,132,0): 226, 52, 53, + (87,133,0): 222, 52, 52, + (87,134,0): 223, 55, 54, + (87,135,0): 225, 60, 58, + (87,136,0): 221, 56, 54, + (87,137,0): 222, 57, 55, + (87,138,0): 225, 57, 54, + (87,139,0): 227, 58, 55, + (87,140,0): 230, 56, 55, + (87,141,0): 233, 55, 55, + (87,142,0): 234, 54, 55, + (87,143,0): 236, 52, 54, + (87,144,0): 244, 53, 58, + (87,145,0): 244, 53, 58, + (87,146,0): 241, 55, 58, + (87,147,0): 236, 56, 57, + (87,148,0): 230, 57, 53, + (87,149,0): 223, 56, 50, + (87,150,0): 216, 55, 47, + (87,151,0): 211, 55, 43, + (87,152,0): 208, 56, 43, + (87,153,0): 205, 58, 42, + (87,154,0): 205, 57, 43, + (87,155,0): 204, 59, 42, + (87,156,0): 205, 58, 42, + (87,157,0): 205, 58, 40, + (87,158,0): 205, 58, 42, + (87,159,0): 204, 59, 40, + (87,160,0): 197, 57, 34, + (87,161,0): 194, 58, 34, + (87,162,0): 195, 61, 36, + (87,163,0): 194, 62, 37, + (87,164,0): 195, 63, 40, + (87,165,0): 198, 63, 43, + (87,166,0): 201, 61, 46, + (87,167,0): 205, 56, 49, + (87,168,0): 220, 60, 62, + (87,169,0): 255, 93, 102, + (87,170,0): 255, 81, 103, + (87,171,0): 255, 72, 100, + (87,172,0): 250, 56, 91, + (87,173,0): 255, 63, 103, + (87,174,0): 246, 46, 92, + (87,175,0): 251, 62, 104, + (87,176,0): 228, 61, 91, + (87,177,0): 224, 93, 111, + (87,178,0): 162, 76, 85, + (87,179,0): 91, 45, 45, + (87,180,0): 71, 56, 51, + (87,181,0): 70, 66, 63, + (87,182,0): 64, 55, 58, + (87,183,0): 67, 52, 57, + (87,184,0): 71, 48, 54, + (87,185,0): 70, 50, 49, + (87,186,0): 64, 57, 41, + (87,187,0): 63, 68, 38, + (87,188,0): 69, 86, 42, + (87,189,0): 96, 116, 63, + (87,190,0): 139, 157, 97, + (87,191,0): 170, 190, 127, + (87,192,0): 177, 203, 140, + (87,193,0): 171, 201, 139, + (87,194,0): 166, 195, 139, + (87,195,0): 157, 186, 132, + (87,196,0): 142, 172, 122, + (87,197,0): 123, 153, 101, + (87,198,0): 102, 135, 80, + (87,199,0): 90, 124, 64, + (87,200,0): 94, 129, 63, + (87,201,0): 97, 135, 62, + (87,202,0): 104, 142, 67, + (87,203,0): 111, 149, 74, + (87,204,0): 114, 152, 79, + (87,205,0): 114, 151, 82, + (87,206,0): 112, 148, 84, + (87,207,0): 110, 146, 82, + (87,208,0): 110, 147, 78, + (87,209,0): 106, 143, 73, + (87,210,0): 102, 139, 70, + (87,211,0): 100, 137, 68, + (87,212,0): 102, 137, 73, + (87,213,0): 104, 139, 75, + (87,214,0): 105, 139, 78, + (87,215,0): 105, 139, 78, + (87,216,0): 102, 136, 75, + (87,217,0): 101, 135, 74, + (87,218,0): 100, 135, 71, + (87,219,0): 101, 136, 70, + (87,220,0): 103, 138, 72, + (87,221,0): 104, 139, 71, + (87,222,0): 104, 139, 71, + (87,223,0): 101, 138, 68, + (87,224,0): 107, 147, 76, + (87,225,0): 109, 151, 79, + (87,226,0): 112, 154, 82, + (88,0,0): 40, 48, 33, + (88,1,0): 39, 47, 34, + (88,2,0): 40, 45, 38, + (88,3,0): 41, 46, 40, + (88,4,0): 46, 48, 45, + (88,5,0): 51, 51, 49, + (88,6,0): 55, 56, 51, + (88,7,0): 57, 58, 52, + (88,8,0): 61, 61, 53, + (88,9,0): 63, 64, 56, + (88,10,0): 68, 69, 64, + (88,11,0): 74, 76, 75, + (88,12,0): 79, 82, 89, + (88,13,0): 86, 88, 101, + (88,14,0): 90, 92, 115, + (88,15,0): 93, 94, 125, + (88,16,0): 89, 88, 130, + (88,17,0): 91, 89, 139, + (88,18,0): 94, 93, 150, + (88,19,0): 101, 101, 163, + (88,20,0): 110, 110, 182, + (88,21,0): 119, 120, 200, + (88,22,0): 127, 129, 216, + (88,23,0): 132, 133, 226, + (88,24,0): 140, 140, 238, + (88,25,0): 140, 140, 240, + (88,26,0): 138, 138, 236, + (88,27,0): 134, 135, 228, + (88,28,0): 130, 130, 220, + (88,29,0): 128, 128, 214, + (88,30,0): 130, 128, 211, + (88,31,0): 131, 130, 206, + (88,32,0): 128, 131, 198, + (88,33,0): 129, 133, 197, + (88,34,0): 131, 131, 201, + (88,35,0): 132, 132, 206, + (88,36,0): 134, 131, 208, + (88,37,0): 136, 131, 211, + (88,38,0): 139, 132, 210, + (88,39,0): 140, 132, 207, + (88,40,0): 138, 128, 197, + (88,41,0): 138, 128, 188, + (88,42,0): 137, 128, 175, + (88,43,0): 135, 125, 160, + (88,44,0): 128, 120, 143, + (88,45,0): 119, 111, 122, + (88,46,0): 107, 101, 103, + (88,47,0): 102, 93, 88, + (88,48,0): 106, 92, 81, + (88,49,0): 108, 92, 77, + (88,50,0): 104, 92, 76, + (88,51,0): 102, 94, 75, + (88,52,0): 101, 95, 73, + (88,53,0): 102, 96, 72, + (88,54,0): 106, 96, 71, + (88,55,0): 114, 94, 70, + (88,56,0): 114, 79, 59, + (88,57,0): 135, 84, 65, + (88,58,0): 166, 92, 79, + (88,59,0): 193, 96, 89, + (88,60,0): 209, 89, 88, + (88,61,0): 220, 81, 84, + (88,62,0): 237, 83, 91, + (88,63,0): 247, 92, 96, + (88,64,0): 249, 104, 101, + (88,65,0): 230, 89, 80, + (88,66,0): 212, 68, 60, + (88,67,0): 206, 55, 48, + (88,68,0): 209, 55, 47, + (88,69,0): 215, 58, 49, + (88,70,0): 214, 61, 47, + (88,71,0): 212, 59, 43, + (88,72,0): 207, 57, 40, + (88,73,0): 205, 58, 38, + (88,74,0): 207, 57, 40, + (88,75,0): 209, 58, 41, + (88,76,0): 212, 56, 41, + (88,77,0): 216, 56, 42, + (88,78,0): 220, 53, 44, + (88,79,0): 220, 53, 44, + (88,80,0): 208, 47, 37, + (88,81,0): 205, 51, 41, + (88,82,0): 204, 56, 44, + (88,83,0): 202, 62, 47, + (88,84,0): 197, 64, 47, + (88,85,0): 193, 64, 45, + (88,86,0): 190, 61, 42, + (88,87,0): 188, 57, 39, + (88,88,0): 194, 57, 41, + (88,89,0): 190, 48, 34, + (88,90,0): 233, 87, 74, + (88,91,0): 223, 75, 63, + (88,92,0): 195, 47, 35, + (88,93,0): 209, 61, 49, + (88,94,0): 206, 60, 47, + (88,95,0): 199, 56, 40, + (88,96,0): 202, 59, 43, + (88,97,0): 201, 58, 41, + (88,98,0): 200, 57, 40, + (88,99,0): 199, 56, 39, + (88,100,0): 200, 55, 38, + (88,101,0): 201, 54, 38, + (88,102,0): 203, 53, 38, + (88,103,0): 204, 52, 38, + (88,104,0): 208, 55, 41, + (88,105,0): 215, 59, 46, + (88,106,0): 220, 62, 50, + (88,107,0): 220, 60, 48, + (88,108,0): 217, 55, 44, + (88,109,0): 218, 56, 45, + (88,110,0): 226, 62, 52, + (88,111,0): 236, 67, 60, + (88,112,0): 245, 66, 69, + (88,113,0): 242, 57, 63, + (88,114,0): 240, 50, 60, + (88,115,0): 246, 52, 63, + (88,116,0): 246, 50, 64, + (88,117,0): 241, 45, 59, + (88,118,0): 237, 45, 58, + (88,119,0): 237, 50, 61, + (88,120,0): 236, 55, 62, + (88,121,0): 230, 53, 59, + (88,122,0): 228, 54, 56, + (88,123,0): 229, 55, 56, + (88,124,0): 235, 57, 57, + (88,125,0): 240, 58, 57, + (88,126,0): 241, 55, 56, + (88,127,0): 239, 55, 55, + (88,128,0): 242, 59, 61, + (88,129,0): 238, 60, 60, + (88,130,0): 234, 58, 58, + (88,131,0): 230, 56, 55, + (88,132,0): 225, 56, 53, + (88,133,0): 223, 55, 52, + (88,134,0): 220, 55, 53, + (88,135,0): 220, 55, 53, + (88,136,0): 222, 57, 55, + (88,137,0): 225, 57, 56, + (88,138,0): 227, 57, 57, + (88,139,0): 230, 58, 58, + (88,140,0): 233, 57, 59, + (88,141,0): 236, 57, 60, + (88,142,0): 237, 57, 60, + (88,143,0): 239, 56, 60, + (88,144,0): 244, 55, 59, + (88,145,0): 243, 54, 58, + (88,146,0): 240, 56, 58, + (88,147,0): 237, 57, 58, + (88,148,0): 231, 59, 57, + (88,149,0): 224, 59, 53, + (88,150,0): 215, 57, 48, + (88,151,0): 207, 55, 44, + (88,152,0): 202, 56, 43, + (88,153,0): 200, 57, 41, + (88,154,0): 199, 57, 43, + (88,155,0): 198, 58, 41, + (88,156,0): 199, 58, 41, + (88,157,0): 199, 58, 40, + (88,158,0): 200, 59, 42, + (88,159,0): 199, 60, 41, + (88,160,0): 193, 57, 35, + (88,161,0): 196, 61, 39, + (88,162,0): 190, 58, 35, + (88,163,0): 182, 52, 30, + (88,164,0): 188, 57, 37, + (88,165,0): 201, 68, 51, + (88,166,0): 206, 64, 54, + (88,167,0): 201, 49, 44, + (88,168,0): 255, 95, 101, + (88,169,0): 255, 87, 103, + (88,170,0): 255, 75, 98, + (88,171,0): 252, 61, 92, + (88,172,0): 245, 51, 88, + (88,173,0): 242, 50, 89, + (88,174,0): 247, 56, 99, + (88,175,0): 240, 69, 105, + (88,176,0): 228, 91, 111, + (88,177,0): 171, 71, 81, + (88,178,0): 110, 52, 51, + (88,179,0): 78, 51, 44, + (88,180,0): 67, 63, 54, + (88,181,0): 65, 66, 60, + (88,182,0): 66, 54, 56, + (88,183,0): 66, 43, 49, + (88,184,0): 77, 46, 51, + (88,185,0): 77, 49, 46, + (88,186,0): 67, 56, 38, + (88,187,0): 68, 74, 40, + (88,188,0): 88, 110, 61, + (88,189,0): 125, 155, 95, + (88,190,0): 155, 186, 119, + (88,191,0): 167, 198, 130, + (88,192,0): 171, 203, 140, + (88,193,0): 159, 190, 130, + (88,194,0): 152, 182, 128, + (88,195,0): 148, 178, 126, + (88,196,0): 130, 160, 110, + (88,197,0): 102, 132, 82, + (88,198,0): 88, 118, 66, + (88,199,0): 89, 123, 63, + (88,200,0): 93, 128, 62, + (88,201,0): 99, 135, 65, + (88,202,0): 105, 143, 68, + (88,203,0): 110, 148, 73, + (88,204,0): 109, 149, 76, + (88,205,0): 108, 148, 78, + (88,206,0): 107, 146, 79, + (88,207,0): 108, 145, 78, + (88,208,0): 105, 142, 73, + (88,209,0): 102, 138, 68, + (88,210,0): 99, 134, 66, + (88,211,0): 99, 134, 66, + (88,212,0): 102, 137, 73, + (88,213,0): 104, 139, 75, + (88,214,0): 102, 138, 76, + (88,215,0): 100, 136, 74, + (88,216,0): 103, 139, 77, + (88,217,0): 104, 140, 78, + (88,218,0): 103, 139, 75, + (88,219,0): 102, 139, 72, + (88,220,0): 101, 138, 69, + (88,221,0): 102, 139, 69, + (88,222,0): 106, 143, 73, + (88,223,0): 107, 147, 74, + (88,224,0): 113, 155, 81, + (88,225,0): 113, 157, 82, + (88,226,0): 114, 158, 83, + (89,0,0): 42, 48, 34, + (89,1,0): 41, 47, 35, + (89,2,0): 41, 46, 39, + (89,3,0): 41, 46, 40, + (89,4,0): 45, 47, 44, + (89,5,0): 49, 51, 48, + (89,6,0): 53, 54, 49, + (89,7,0): 55, 56, 50, + (89,8,0): 59, 60, 52, + (89,9,0): 62, 63, 55, + (89,10,0): 65, 68, 61, + (89,11,0): 72, 74, 71, + (89,12,0): 79, 80, 84, + (89,13,0): 83, 85, 97, + (89,14,0): 88, 89, 107, + (89,15,0): 90, 92, 117, + (89,16,0): 92, 90, 127, + (89,17,0): 94, 93, 137, + (89,18,0): 100, 98, 148, + (89,19,0): 107, 106, 164, + (89,20,0): 117, 116, 186, + (89,21,0): 127, 126, 206, + (89,22,0): 135, 135, 223, + (89,23,0): 139, 140, 233, + (89,24,0): 141, 141, 239, + (89,25,0): 140, 140, 240, + (89,26,0): 137, 137, 235, + (89,27,0): 133, 132, 226, + (89,28,0): 128, 128, 216, + (89,29,0): 128, 126, 210, + (89,30,0): 128, 127, 207, + (89,31,0): 130, 130, 204, + (89,32,0): 133, 134, 199, + (89,33,0): 134, 135, 199, + (89,34,0): 135, 136, 201, + (89,35,0): 137, 136, 204, + (89,36,0): 139, 136, 207, + (89,37,0): 140, 134, 206, + (89,38,0): 141, 134, 204, + (89,39,0): 142, 133, 200, + (89,40,0): 138, 128, 188, + (89,41,0): 137, 127, 177, + (89,42,0): 134, 124, 161, + (89,43,0): 130, 120, 147, + (89,44,0): 123, 115, 130, + (89,45,0): 116, 107, 112, + (89,46,0): 108, 98, 96, + (89,47,0): 100, 93, 83, + (89,48,0): 99, 96, 79, + (89,49,0): 98, 96, 75, + (89,50,0): 101, 94, 75, + (89,51,0): 102, 94, 75, + (89,52,0): 105, 92, 73, + (89,53,0): 108, 93, 72, + (89,54,0): 110, 94, 71, + (89,55,0): 113, 93, 69, + (89,56,0): 121, 93, 71, + (89,57,0): 130, 89, 67, + (89,58,0): 149, 88, 70, + (89,59,0): 173, 90, 76, + (89,60,0): 199, 86, 80, + (89,61,0): 221, 83, 83, + (89,62,0): 243, 82, 88, + (89,63,0): 254, 89, 95, + (89,64,0): 240, 85, 83, + (89,65,0): 227, 76, 69, + (89,66,0): 217, 62, 57, + (89,67,0): 213, 54, 48, + (89,68,0): 217, 54, 47, + (89,69,0): 220, 57, 48, + (89,70,0): 219, 57, 44, + (89,71,0): 214, 57, 40, + (89,72,0): 211, 56, 38, + (89,73,0): 209, 56, 38, + (89,74,0): 209, 56, 40, + (89,75,0): 212, 56, 41, + (89,76,0): 215, 55, 41, + (89,77,0): 220, 54, 42, + (89,78,0): 223, 52, 44, + (89,79,0): 221, 53, 44, + (89,80,0): 206, 48, 39, + (89,81,0): 201, 53, 41, + (89,82,0): 200, 57, 43, + (89,83,0): 198, 61, 45, + (89,84,0): 196, 65, 47, + (89,85,0): 193, 64, 45, + (89,86,0): 191, 60, 42, + (89,87,0): 190, 57, 40, + (89,88,0): 196, 56, 41, + (89,89,0): 203, 60, 46, + (89,90,0): 228, 82, 69, + (89,91,0): 220, 72, 60, + (89,92,0): 200, 52, 40, + (89,93,0): 204, 58, 45, + (89,94,0): 200, 58, 44, + (89,95,0): 194, 52, 38, + (89,96,0): 202, 61, 44, + (89,97,0): 203, 60, 43, + (89,98,0): 202, 59, 42, + (89,99,0): 202, 59, 42, + (89,100,0): 203, 58, 41, + (89,101,0): 204, 57, 41, + (89,102,0): 206, 56, 41, + (89,103,0): 207, 54, 40, + (89,104,0): 211, 55, 42, + (89,105,0): 214, 56, 44, + (89,106,0): 217, 55, 44, + (89,107,0): 215, 51, 41, + (89,108,0): 213, 49, 39, + (89,109,0): 216, 49, 40, + (89,110,0): 222, 55, 46, + (89,111,0): 231, 60, 53, + (89,112,0): 248, 68, 71, + (89,113,0): 241, 56, 62, + (89,114,0): 237, 47, 57, + (89,115,0): 239, 47, 58, + (89,116,0): 240, 48, 61, + (89,117,0): 238, 46, 59, + (89,118,0): 235, 49, 60, + (89,119,0): 235, 54, 63, + (89,120,0): 228, 53, 58, + (89,121,0): 220, 51, 54, + (89,122,0): 216, 50, 50, + (89,123,0): 223, 58, 56, + (89,124,0): 238, 69, 66, + (89,125,0): 248, 73, 70, + (89,126,0): 248, 68, 67, + (89,127,0): 243, 63, 62, + (89,128,0): 233, 58, 55, + (89,129,0): 231, 57, 56, + (89,130,0): 229, 57, 55, + (89,131,0): 226, 57, 54, + (89,132,0): 225, 56, 53, + (89,133,0): 224, 56, 53, + (89,134,0): 225, 57, 56, + (89,135,0): 225, 57, 56, + (89,136,0): 224, 56, 55, + (89,137,0): 226, 56, 56, + (89,138,0): 229, 57, 57, + (89,139,0): 231, 57, 58, + (89,140,0): 233, 57, 59, + (89,141,0): 236, 57, 60, + (89,142,0): 237, 57, 60, + (89,143,0): 238, 55, 59, + (89,144,0): 243, 54, 58, + (89,145,0): 242, 53, 57, + (89,146,0): 238, 54, 56, + (89,147,0): 234, 56, 56, + (89,148,0): 228, 59, 56, + (89,149,0): 220, 58, 53, + (89,150,0): 211, 57, 47, + (89,151,0): 203, 55, 43, + (89,152,0): 198, 56, 42, + (89,153,0): 195, 58, 42, + (89,154,0): 194, 58, 42, + (89,155,0): 192, 59, 42, + (89,156,0): 192, 59, 42, + (89,157,0): 193, 60, 41, + (89,158,0): 193, 60, 43, + (89,159,0): 193, 60, 41, + (89,160,0): 189, 57, 36, + (89,161,0): 193, 63, 41, + (89,162,0): 187, 58, 37, + (89,163,0): 179, 53, 31, + (89,164,0): 185, 58, 39, + (89,165,0): 192, 60, 47, + (89,166,0): 201, 58, 50, + (89,167,0): 215, 61, 61, + (89,168,0): 255, 95, 103, + (89,169,0): 255, 81, 100, + (89,170,0): 253, 67, 91, + (89,171,0): 246, 57, 87, + (89,172,0): 242, 57, 91, + (89,173,0): 242, 61, 96, + (89,174,0): 240, 64, 100, + (89,175,0): 224, 74, 101, + (89,176,0): 170, 64, 76, + (89,177,0): 131, 63, 62, + (89,178,0): 95, 58, 50, + (89,179,0): 72, 58, 47, + (89,180,0): 59, 61, 48, + (89,181,0): 59, 61, 50, + (89,182,0): 73, 59, 58, + (89,183,0): 85, 61, 61, + (89,184,0): 81, 47, 46, + (89,185,0): 84, 55, 47, + (89,186,0): 87, 75, 53, + (89,187,0): 100, 104, 69, + (89,188,0): 119, 143, 91, + (89,189,0): 140, 176, 112, + (89,190,0): 154, 195, 125, + (89,191,0): 159, 199, 129, + (89,192,0): 152, 186, 125, + (89,193,0): 154, 185, 128, + (89,194,0): 154, 182, 131, + (89,195,0): 141, 169, 120, + (89,196,0): 114, 142, 94, + (89,197,0): 89, 117, 69, + (89,198,0): 84, 112, 61, + (89,199,0): 92, 123, 66, + (89,200,0): 95, 127, 64, + (89,201,0): 98, 134, 64, + (89,202,0): 105, 141, 67, + (89,203,0): 109, 147, 72, + (89,204,0): 108, 148, 75, + (89,205,0): 107, 147, 76, + (89,206,0): 105, 144, 77, + (89,207,0): 105, 144, 77, + (89,208,0): 103, 140, 71, + (89,209,0): 101, 137, 67, + (89,210,0): 99, 134, 66, + (89,211,0): 99, 134, 68, + (89,212,0): 103, 138, 74, + (89,213,0): 105, 140, 76, + (89,214,0): 104, 140, 78, + (89,215,0): 103, 139, 77, + (89,216,0): 105, 141, 79, + (89,217,0): 105, 141, 77, + (89,218,0): 105, 142, 75, + (89,219,0): 103, 140, 71, + (89,220,0): 103, 140, 70, + (89,221,0): 102, 142, 69, + (89,222,0): 108, 146, 73, + (89,223,0): 109, 149, 76, + (89,224,0): 112, 156, 81, + (89,225,0): 111, 157, 82, + (89,226,0): 114, 158, 83, + (90,0,0): 45, 49, 34, + (90,1,0): 45, 49, 35, + (90,2,0): 44, 47, 38, + (90,3,0): 44, 46, 41, + (90,4,0): 47, 47, 45, + (90,5,0): 49, 49, 47, + (90,6,0): 51, 52, 47, + (90,7,0): 52, 53, 45, + (90,8,0): 57, 59, 48, + (90,9,0): 60, 62, 49, + (90,10,0): 64, 66, 55, + (90,11,0): 69, 72, 65, + (90,12,0): 75, 77, 76, + (90,13,0): 81, 82, 87, + (90,14,0): 85, 85, 97, + (90,15,0): 86, 87, 105, + (90,16,0): 92, 89, 116, + (90,17,0): 94, 93, 127, + (90,18,0): 102, 100, 140, + (90,19,0): 112, 110, 160, + (90,20,0): 122, 120, 183, + (90,21,0): 133, 131, 206, + (90,22,0): 141, 139, 223, + (90,23,0): 144, 144, 234, + (90,24,0): 144, 142, 239, + (90,25,0): 142, 140, 237, + (90,26,0): 138, 137, 231, + (90,27,0): 135, 132, 223, + (90,28,0): 129, 127, 211, + (90,29,0): 127, 124, 203, + (90,30,0): 127, 125, 200, + (90,31,0): 128, 127, 195, + (90,32,0): 134, 134, 196, + (90,33,0): 136, 136, 196, + (90,34,0): 138, 138, 198, + (90,35,0): 140, 139, 199, + (90,36,0): 140, 138, 201, + (90,37,0): 140, 136, 197, + (90,38,0): 140, 132, 191, + (90,39,0): 139, 130, 183, + (90,40,0): 137, 128, 175, + (90,41,0): 134, 124, 161, + (90,42,0): 128, 118, 145, + (90,43,0): 123, 112, 129, + (90,44,0): 117, 106, 114, + (90,45,0): 110, 100, 99, + (90,46,0): 105, 94, 88, + (90,47,0): 99, 93, 81, + (90,48,0): 93, 98, 76, + (90,49,0): 93, 98, 75, + (90,50,0): 97, 95, 74, + (90,51,0): 103, 92, 74, + (90,52,0): 109, 90, 73, + (90,53,0): 112, 91, 72, + (90,54,0): 114, 92, 71, + (90,55,0): 114, 92, 69, + (90,56,0): 122, 96, 73, + (90,57,0): 123, 87, 63, + (90,58,0): 137, 82, 61, + (90,59,0): 164, 85, 68, + (90,60,0): 199, 88, 79, + (90,61,0): 224, 86, 83, + (90,62,0): 245, 80, 84, + (90,63,0): 252, 79, 83, + (90,64,0): 226, 62, 60, + (90,65,0): 222, 60, 55, + (90,66,0): 221, 56, 52, + (90,67,0): 222, 55, 49, + (90,68,0): 225, 54, 47, + (90,69,0): 225, 54, 46, + (90,70,0): 221, 55, 43, + (90,71,0): 218, 55, 40, + (90,72,0): 212, 55, 38, + (90,73,0): 211, 56, 36, + (90,74,0): 211, 56, 38, + (90,75,0): 213, 56, 39, + (90,76,0): 216, 54, 41, + (90,77,0): 221, 53, 42, + (90,78,0): 224, 51, 44, + (90,79,0): 221, 53, 44, + (90,80,0): 203, 51, 40, + (90,81,0): 196, 54, 40, + (90,82,0): 194, 57, 41, + (90,83,0): 193, 60, 43, + (90,84,0): 194, 63, 45, + (90,85,0): 194, 63, 45, + (90,86,0): 193, 60, 43, + (90,87,0): 192, 56, 40, + (90,88,0): 195, 53, 39, + (90,89,0): 220, 74, 61, + (90,90,0): 218, 70, 58, + (90,91,0): 213, 65, 53, + (90,92,0): 206, 60, 47, + (90,93,0): 196, 54, 40, + (90,94,0): 196, 59, 43, + (90,95,0): 190, 54, 38, + (90,96,0): 198, 58, 41, + (90,97,0): 199, 58, 41, + (90,98,0): 199, 58, 41, + (90,99,0): 201, 58, 42, + (90,100,0): 202, 56, 41, + (90,101,0): 203, 55, 41, + (90,102,0): 204, 54, 40, + (90,103,0): 205, 51, 39, + (90,104,0): 213, 57, 45, + (90,105,0): 213, 55, 44, + (90,106,0): 214, 51, 42, + (90,107,0): 215, 51, 42, + (90,108,0): 218, 51, 43, + (90,109,0): 223, 54, 47, + (90,110,0): 229, 58, 51, + (90,111,0): 233, 60, 56, + (90,112,0): 240, 60, 61, + (90,113,0): 237, 52, 57, + (90,114,0): 235, 48, 55, + (90,115,0): 236, 49, 56, + (90,116,0): 238, 51, 60, + (90,117,0): 237, 52, 60, + (90,118,0): 235, 55, 64, + (90,119,0): 234, 61, 67, + (90,120,0): 221, 55, 59, + (90,121,0): 225, 65, 65, + (90,122,0): 236, 78, 75, + (90,123,0): 248, 89, 85, + (90,124,0): 253, 90, 85, + (90,125,0): 250, 81, 76, + (90,126,0): 239, 66, 62, + (90,127,0): 229, 56, 52, + (90,128,0): 226, 54, 50, + (90,129,0): 224, 55, 50, + (90,130,0): 224, 55, 50, + (90,131,0): 224, 55, 50, + (90,132,0): 225, 56, 53, + (90,133,0): 226, 57, 54, + (90,134,0): 228, 59, 56, + (90,135,0): 228, 59, 56, + (90,136,0): 225, 55, 55, + (90,137,0): 228, 56, 56, + (90,138,0): 230, 56, 58, + (90,139,0): 232, 56, 59, + (90,140,0): 235, 56, 60, + (90,141,0): 235, 56, 60, + (90,142,0): 235, 56, 60, + (90,143,0): 236, 56, 59, + (90,144,0): 239, 53, 56, + (90,145,0): 238, 52, 55, + (90,146,0): 236, 53, 55, + (90,147,0): 231, 55, 55, + (90,148,0): 226, 58, 55, + (90,149,0): 217, 58, 52, + (90,150,0): 207, 56, 47, + (90,151,0): 199, 55, 44, + (90,152,0): 194, 56, 43, + (90,153,0): 191, 58, 43, + (90,154,0): 189, 59, 43, + (90,155,0): 187, 60, 43, + (90,156,0): 187, 60, 43, + (90,157,0): 187, 60, 41, + (90,158,0): 187, 60, 43, + (90,159,0): 187, 60, 41, + (90,160,0): 184, 57, 38, + (90,161,0): 189, 64, 42, + (90,162,0): 179, 57, 36, + (90,163,0): 177, 54, 36, + (90,164,0): 182, 59, 43, + (90,165,0): 180, 49, 39, + (90,166,0): 194, 52, 48, + (90,167,0): 235, 80, 84, + (90,168,0): 255, 92, 105, + (90,169,0): 254, 75, 96, + (90,170,0): 243, 59, 85, + (90,171,0): 237, 57, 86, + (90,172,0): 238, 65, 93, + (90,173,0): 236, 73, 102, + (90,174,0): 227, 75, 100, + (90,175,0): 202, 79, 97, + (90,176,0): 130, 56, 57, + (90,177,0): 102, 62, 54, + (90,178,0): 85, 63, 50, + (90,179,0): 71, 64, 48, + (90,180,0): 59, 60, 44, + (90,181,0): 56, 54, 41, + (90,182,0): 65, 52, 43, + (90,183,0): 78, 55, 47, + (90,184,0): 72, 43, 35, + (90,185,0): 83, 60, 44, + (90,186,0): 103, 93, 66, + (90,187,0): 129, 136, 95, + (90,188,0): 146, 171, 116, + (90,189,0): 149, 188, 123, + (90,190,0): 148, 194, 122, + (90,191,0): 149, 192, 123, + (90,192,0): 146, 180, 120, + (90,193,0): 156, 184, 133, + (90,194,0): 154, 180, 133, + (90,195,0): 128, 154, 109, + (90,196,0): 92, 117, 75, + (90,197,0): 72, 98, 53, + (90,198,0): 78, 104, 56, + (90,199,0): 91, 120, 66, + (90,200,0): 95, 125, 63, + (90,201,0): 99, 131, 64, + (90,202,0): 104, 140, 68, + (90,203,0): 108, 146, 71, + (90,204,0): 106, 146, 73, + (90,205,0): 104, 146, 74, + (90,206,0): 103, 144, 76, + (90,207,0): 102, 143, 75, + (90,208,0): 100, 137, 68, + (90,209,0): 100, 135, 67, + (90,210,0): 99, 134, 68, + (90,211,0): 101, 136, 70, + (90,212,0): 104, 139, 75, + (90,213,0): 107, 142, 78, + (90,214,0): 107, 143, 79, + (90,215,0): 106, 142, 78, + (90,216,0): 105, 144, 79, + (90,217,0): 105, 144, 79, + (90,218,0): 105, 144, 77, + (90,219,0): 104, 144, 74, + (90,220,0): 103, 143, 72, + (90,221,0): 104, 146, 72, + (90,222,0): 108, 148, 75, + (90,223,0): 111, 153, 77, + (90,224,0): 115, 161, 86, + (90,225,0): 115, 163, 87, + (90,226,0): 117, 163, 88, + (91,0,0): 50, 52, 38, + (91,1,0): 48, 52, 38, + (91,2,0): 48, 49, 41, + (91,3,0): 48, 49, 43, + (91,4,0): 49, 50, 45, + (91,5,0): 50, 51, 46, + (91,6,0): 51, 52, 46, + (91,7,0): 52, 54, 43, + (91,8,0): 57, 59, 45, + (91,9,0): 59, 62, 45, + (91,10,0): 63, 65, 51, + (91,11,0): 68, 70, 57, + (91,12,0): 73, 74, 68, + (91,13,0): 77, 79, 78, + (91,14,0): 82, 81, 87, + (91,15,0): 83, 83, 93, + (91,16,0): 88, 86, 100, + (91,17,0): 92, 90, 111, + (91,18,0): 100, 97, 126, + (91,19,0): 110, 108, 148, + (91,20,0): 122, 119, 172, + (91,21,0): 132, 130, 195, + (91,22,0): 140, 137, 214, + (91,23,0): 145, 143, 227, + (91,24,0): 148, 145, 234, + (91,25,0): 147, 144, 235, + (91,26,0): 142, 139, 226, + (91,27,0): 137, 133, 217, + (91,28,0): 130, 127, 204, + (91,29,0): 127, 124, 195, + (91,30,0): 127, 124, 191, + (91,31,0): 128, 126, 189, + (91,32,0): 132, 131, 189, + (91,33,0): 134, 133, 190, + (91,34,0): 137, 136, 193, + (91,35,0): 141, 138, 193, + (91,36,0): 139, 136, 189, + (91,37,0): 137, 133, 183, + (91,38,0): 135, 127, 174, + (91,39,0): 133, 125, 166, + (91,40,0): 133, 123, 157, + (91,41,0): 128, 118, 143, + (91,42,0): 121, 110, 127, + (91,43,0): 114, 102, 112, + (91,44,0): 109, 97, 99, + (91,45,0): 107, 93, 90, + (91,46,0): 105, 90, 83, + (91,47,0): 99, 91, 78, + (91,48,0): 92, 97, 75, + (91,49,0): 90, 98, 74, + (91,50,0): 97, 95, 74, + (91,51,0): 103, 92, 74, + (91,52,0): 111, 89, 75, + (91,53,0): 115, 89, 74, + (91,54,0): 117, 90, 73, + (91,55,0): 119, 91, 70, + (91,56,0): 118, 86, 65, + (91,57,0): 123, 81, 59, + (91,58,0): 139, 81, 61, + (91,59,0): 171, 88, 70, + (91,60,0): 205, 91, 80, + (91,61,0): 226, 84, 80, + (91,62,0): 237, 71, 73, + (91,63,0): 239, 63, 65, + (91,64,0): 219, 50, 47, + (91,65,0): 220, 53, 47, + (91,66,0): 225, 53, 49, + (91,67,0): 227, 54, 48, + (91,68,0): 227, 53, 46, + (91,69,0): 225, 53, 43, + (91,70,0): 224, 54, 41, + (91,71,0): 219, 56, 41, + (91,72,0): 214, 55, 36, + (91,73,0): 211, 56, 36, + (91,74,0): 209, 56, 38, + (91,75,0): 212, 57, 39, + (91,76,0): 216, 54, 41, + (91,77,0): 220, 54, 42, + (91,78,0): 224, 51, 44, + (91,79,0): 218, 54, 45, + (91,80,0): 200, 54, 41, + (91,81,0): 189, 56, 39, + (91,82,0): 188, 55, 38, + (91,83,0): 189, 58, 40, + (91,84,0): 191, 62, 43, + (91,85,0): 194, 63, 45, + (91,86,0): 195, 59, 43, + (91,87,0): 196, 56, 41, + (91,88,0): 198, 52, 39, + (91,89,0): 233, 85, 73, + (91,90,0): 211, 60, 49, + (91,91,0): 204, 56, 44, + (91,92,0): 209, 66, 52, + (91,93,0): 190, 53, 37, + (91,94,0): 192, 61, 43, + (91,95,0): 192, 61, 43, + (91,96,0): 192, 56, 40, + (91,97,0): 196, 56, 39, + (91,98,0): 197, 57, 40, + (91,99,0): 199, 58, 41, + (91,100,0): 200, 57, 41, + (91,101,0): 203, 55, 41, + (91,102,0): 204, 54, 40, + (91,103,0): 205, 51, 39, + (91,104,0): 210, 54, 42, + (91,105,0): 212, 51, 41, + (91,106,0): 213, 50, 41, + (91,107,0): 219, 52, 44, + (91,108,0): 227, 58, 51, + (91,109,0): 233, 62, 55, + (91,110,0): 236, 63, 57, + (91,111,0): 236, 61, 58, + (91,112,0): 232, 52, 53, + (91,113,0): 236, 53, 57, + (91,114,0): 239, 54, 59, + (91,115,0): 238, 53, 59, + (91,116,0): 234, 50, 58, + (91,117,0): 230, 51, 57, + (91,118,0): 228, 55, 61, + (91,119,0): 226, 60, 64, + (91,120,0): 243, 85, 86, + (91,121,0): 252, 98, 98, + (91,122,0): 255, 109, 106, + (91,123,0): 255, 105, 100, + (91,124,0): 243, 86, 81, + (91,125,0): 228, 65, 60, + (91,126,0): 223, 54, 51, + (91,127,0): 221, 52, 47, + (91,128,0): 223, 54, 49, + (91,129,0): 222, 55, 49, + (91,130,0): 222, 55, 49, + (91,131,0): 223, 56, 50, + (91,132,0): 225, 56, 53, + (91,133,0): 226, 57, 54, + (91,134,0): 229, 57, 55, + (91,135,0): 230, 58, 56, + (91,136,0): 229, 55, 56, + (91,137,0): 230, 56, 57, + (91,138,0): 232, 56, 59, + (91,139,0): 233, 57, 60, + (91,140,0): 235, 56, 60, + (91,141,0): 235, 56, 60, + (91,142,0): 235, 56, 60, + (91,143,0): 236, 55, 60, + (91,144,0): 238, 53, 58, + (91,145,0): 238, 54, 56, + (91,146,0): 234, 54, 55, + (91,147,0): 229, 57, 55, + (91,148,0): 223, 60, 55, + (91,149,0): 214, 60, 52, + (91,150,0): 204, 57, 47, + (91,151,0): 197, 57, 44, + (91,152,0): 190, 57, 42, + (91,153,0): 186, 59, 42, + (91,154,0): 182, 59, 41, + (91,155,0): 181, 60, 41, + (91,156,0): 181, 60, 43, + (91,157,0): 180, 61, 41, + (91,158,0): 179, 59, 42, + (91,159,0): 179, 60, 40, + (91,160,0): 179, 58, 39, + (91,161,0): 183, 64, 44, + (91,162,0): 173, 56, 38, + (91,163,0): 173, 56, 39, + (91,164,0): 179, 59, 45, + (91,165,0): 171, 43, 34, + (91,166,0): 193, 53, 52, + (91,167,0): 252, 97, 103, + (91,168,0): 253, 85, 100, + (91,169,0): 249, 72, 92, + (91,170,0): 238, 62, 85, + (91,171,0): 232, 62, 88, + (91,172,0): 229, 73, 95, + (91,173,0): 220, 81, 100, + (91,174,0): 206, 81, 95, + (91,175,0): 177, 85, 90, + (91,176,0): 119, 70, 65, + (91,177,0): 92, 70, 57, + (91,178,0): 79, 66, 50, + (91,179,0): 74, 67, 49, + (91,180,0): 70, 67, 48, + (91,181,0): 64, 61, 42, + (91,182,0): 61, 54, 35, + (91,183,0): 61, 50, 30, + (91,184,0): 65, 50, 29, + (91,185,0): 81, 70, 42, + (91,186,0): 110, 107, 72, + (91,187,0): 138, 147, 102, + (91,188,0): 149, 172, 116, + (91,189,0): 145, 180, 116, + (91,190,0): 141, 184, 115, + (91,191,0): 144, 186, 120, + (91,192,0): 157, 187, 133, + (91,193,0): 161, 184, 138, + (91,194,0): 144, 167, 125, + (91,195,0): 108, 130, 91, + (91,196,0): 75, 95, 58, + (91,197,0): 65, 87, 48, + (91,198,0): 76, 99, 55, + (91,199,0): 87, 114, 63, + (91,200,0): 95, 123, 64, + (91,201,0): 100, 131, 64, + (91,202,0): 105, 138, 67, + (91,203,0): 107, 145, 70, + (91,204,0): 105, 145, 72, + (91,205,0): 103, 145, 71, + (91,206,0): 100, 143, 72, + (91,207,0): 101, 142, 74, + (91,208,0): 98, 135, 66, + (91,209,0): 99, 134, 66, + (91,210,0): 100, 135, 69, + (91,211,0): 103, 138, 72, + (91,212,0): 106, 141, 77, + (91,213,0): 108, 143, 79, + (91,214,0): 109, 145, 81, + (91,215,0): 110, 146, 82, + (91,216,0): 106, 145, 80, + (91,217,0): 106, 145, 78, + (91,218,0): 106, 146, 76, + (91,219,0): 104, 146, 74, + (91,220,0): 103, 145, 71, + (91,221,0): 105, 147, 71, + (91,222,0): 109, 151, 75, + (91,223,0): 112, 156, 79, + (91,224,0): 119, 166, 88, + (91,225,0): 118, 166, 90, + (91,226,0): 118, 166, 90, + (92,0,0): 55, 56, 40, + (92,1,0): 54, 56, 42, + (92,2,0): 54, 54, 44, + (92,3,0): 53, 54, 46, + (92,4,0): 53, 54, 48, + (92,5,0): 53, 54, 48, + (92,6,0): 54, 55, 47, + (92,7,0): 54, 56, 43, + (92,8,0): 59, 62, 45, + (92,9,0): 61, 64, 45, + (92,10,0): 64, 67, 46, + (92,11,0): 68, 71, 52, + (92,12,0): 73, 75, 62, + (92,13,0): 77, 78, 70, + (92,14,0): 81, 80, 78, + (92,15,0): 82, 82, 82, + (92,16,0): 86, 85, 83, + (92,17,0): 89, 88, 93, + (92,18,0): 97, 95, 108, + (92,19,0): 107, 105, 129, + (92,20,0): 117, 115, 155, + (92,21,0): 128, 125, 178, + (92,22,0): 136, 134, 199, + (92,23,0): 140, 138, 211, + (92,24,0): 149, 146, 225, + (92,25,0): 148, 145, 226, + (92,26,0): 144, 141, 220, + (92,27,0): 139, 135, 211, + (92,28,0): 132, 129, 196, + (92,29,0): 129, 125, 186, + (92,30,0): 127, 124, 181, + (92,31,0): 127, 124, 179, + (92,32,0): 129, 126, 181, + (92,33,0): 132, 129, 182, + (92,34,0): 135, 133, 183, + (92,35,0): 137, 134, 181, + (92,36,0): 138, 132, 176, + (92,37,0): 134, 128, 166, + (92,38,0): 129, 122, 155, + (92,39,0): 128, 119, 146, + (92,40,0): 127, 115, 135, + (92,41,0): 122, 110, 124, + (92,42,0): 114, 101, 108, + (92,43,0): 109, 95, 95, + (92,44,0): 106, 91, 88, + (92,45,0): 105, 90, 83, + (92,46,0): 106, 89, 79, + (92,47,0): 102, 90, 76, + (92,48,0): 97, 96, 76, + (92,49,0): 95, 97, 76, + (92,50,0): 100, 95, 76, + (92,51,0): 105, 92, 75, + (92,52,0): 110, 91, 76, + (92,53,0): 116, 90, 75, + (92,54,0): 122, 90, 75, + (92,55,0): 125, 90, 71, + (92,56,0): 127, 84, 65, + (92,57,0): 136, 81, 61, + (92,58,0): 157, 81, 65, + (92,59,0): 182, 86, 70, + (92,60,0): 205, 83, 72, + (92,61,0): 216, 72, 64, + (92,62,0): 223, 58, 56, + (92,63,0): 226, 52, 51, + (92,64,0): 221, 49, 45, + (92,65,0): 223, 51, 47, + (92,66,0): 226, 53, 47, + (92,67,0): 227, 53, 46, + (92,68,0): 225, 51, 44, + (92,69,0): 223, 51, 41, + (92,70,0): 221, 53, 40, + (92,71,0): 220, 57, 40, + (92,72,0): 211, 56, 36, + (92,73,0): 208, 57, 36, + (92,74,0): 207, 58, 38, + (92,75,0): 209, 58, 39, + (92,76,0): 212, 56, 41, + (92,77,0): 217, 55, 42, + (92,78,0): 221, 53, 44, + (92,79,0): 216, 55, 45, + (92,80,0): 196, 59, 43, + (92,81,0): 185, 58, 41, + (92,82,0): 181, 54, 37, + (92,83,0): 183, 56, 39, + (92,84,0): 189, 59, 43, + (92,85,0): 194, 61, 46, + (92,86,0): 199, 59, 46, + (92,87,0): 199, 55, 44, + (92,88,0): 208, 57, 48, + (92,89,0): 245, 92, 84, + (92,90,0): 214, 61, 53, + (92,91,0): 201, 53, 43, + (92,92,0): 207, 65, 53, + (92,93,0): 184, 51, 36, + (92,94,0): 183, 58, 40, + (92,95,0): 188, 63, 43, + (92,96,0): 191, 58, 41, + (92,97,0): 195, 58, 42, + (92,98,0): 198, 58, 43, + (92,99,0): 200, 58, 44, + (92,100,0): 202, 59, 45, + (92,101,0): 204, 58, 45, + (92,102,0): 207, 56, 45, + (92,103,0): 209, 55, 45, + (92,104,0): 208, 51, 42, + (92,105,0): 210, 49, 41, + (92,106,0): 214, 49, 43, + (92,107,0): 222, 55, 49, + (92,108,0): 229, 60, 55, + (92,109,0): 234, 62, 58, + (92,110,0): 232, 59, 55, + (92,111,0): 230, 55, 52, + (92,112,0): 233, 55, 53, + (92,113,0): 239, 59, 60, + (92,114,0): 240, 60, 63, + (92,115,0): 234, 54, 57, + (92,116,0): 228, 49, 53, + (92,117,0): 228, 53, 58, + (92,118,0): 232, 66, 70, + (92,119,0): 237, 77, 79, + (92,120,0): 255, 120, 119, + (92,121,0): 255, 113, 110, + (92,122,0): 241, 96, 91, + (92,123,0): 221, 74, 67, + (92,124,0): 209, 56, 51, + (92,125,0): 209, 50, 46, + (92,126,0): 220, 55, 51, + (92,127,0): 231, 64, 58, + (92,128,0): 224, 57, 51, + (92,129,0): 224, 57, 49, + (92,130,0): 224, 55, 50, + (92,131,0): 224, 55, 50, + (92,132,0): 226, 54, 50, + (92,133,0): 227, 55, 51, + (92,134,0): 229, 55, 54, + (92,135,0): 229, 55, 54, + (92,136,0): 230, 54, 56, + (92,137,0): 231, 55, 57, + (92,138,0): 234, 55, 59, + (92,139,0): 235, 56, 60, + (92,140,0): 235, 56, 62, + (92,141,0): 235, 56, 62, + (92,142,0): 232, 55, 61, + (92,143,0): 234, 55, 59, + (92,144,0): 238, 55, 59, + (92,145,0): 238, 55, 57, + (92,146,0): 234, 55, 58, + (92,147,0): 228, 58, 58, + (92,148,0): 223, 61, 58, + (92,149,0): 214, 61, 55, + (92,150,0): 203, 59, 50, + (92,151,0): 195, 59, 47, + (92,152,0): 186, 56, 42, + (92,153,0): 181, 58, 42, + (92,154,0): 179, 59, 42, + (92,155,0): 175, 60, 41, + (92,156,0): 175, 60, 42, + (92,157,0): 172, 60, 40, + (92,158,0): 172, 59, 41, + (92,159,0): 172, 59, 41, + (92,160,0): 170, 59, 40, + (92,161,0): 172, 61, 42, + (92,162,0): 166, 56, 39, + (92,163,0): 167, 57, 42, + (92,164,0): 170, 56, 45, + (92,165,0): 171, 48, 41, + (92,166,0): 203, 64, 67, + (92,167,0): 255, 105, 114, + (92,168,0): 243, 78, 94, + (92,169,0): 241, 72, 91, + (92,170,0): 235, 69, 89, + (92,171,0): 226, 73, 91, + (92,172,0): 215, 80, 94, + (92,173,0): 199, 85, 93, + (92,174,0): 178, 86, 87, + (92,175,0): 153, 90, 85, + (92,176,0): 103, 75, 63, + (92,177,0): 83, 74, 57, + (92,178,0): 80, 68, 52, + (92,179,0): 78, 67, 49, + (92,180,0): 73, 67, 45, + (92,181,0): 66, 64, 39, + (92,182,0): 63, 66, 35, + (92,183,0): 65, 71, 35, + (92,184,0): 77, 85, 46, + (92,185,0): 94, 103, 60, + (92,186,0): 120, 129, 84, + (92,187,0): 139, 153, 102, + (92,188,0): 145, 164, 109, + (92,189,0): 141, 169, 110, + (92,190,0): 143, 178, 114, + (92,191,0): 151, 185, 125, + (92,192,0): 157, 183, 136, + (92,193,0): 146, 167, 128, + (92,194,0): 117, 134, 100, + (92,195,0): 82, 99, 67, + (92,196,0): 63, 80, 48, + (92,197,0): 66, 83, 49, + (92,198,0): 79, 97, 57, + (92,199,0): 86, 108, 61, + (92,200,0): 98, 123, 66, + (92,201,0): 101, 130, 66, + (92,202,0): 105, 138, 67, + (92,203,0): 106, 144, 69, + (92,204,0): 105, 146, 70, + (92,205,0): 101, 145, 70, + (92,206,0): 98, 144, 72, + (92,207,0): 99, 142, 71, + (92,208,0): 98, 135, 66, + (92,209,0): 102, 134, 67, + (92,210,0): 103, 138, 72, + (92,211,0): 105, 140, 74, + (92,212,0): 107, 142, 78, + (92,213,0): 109, 144, 80, + (92,214,0): 110, 146, 82, + (92,215,0): 111, 147, 83, + (92,216,0): 106, 145, 78, + (92,217,0): 107, 146, 79, + (92,218,0): 106, 147, 77, + (92,219,0): 105, 147, 75, + (92,220,0): 105, 147, 73, + (92,221,0): 106, 150, 73, + (92,222,0): 110, 154, 75, + (92,223,0): 114, 158, 79, + (92,224,0): 120, 167, 89, + (92,225,0): 118, 167, 88, + (92,226,0): 118, 167, 88, + (93,0,0): 63, 61, 46, + (93,1,0): 61, 62, 46, + (93,2,0): 61, 61, 49, + (93,3,0): 61, 61, 51, + (93,4,0): 61, 61, 53, + (93,5,0): 59, 60, 52, + (93,6,0): 59, 61, 50, + (93,7,0): 59, 61, 47, + (93,8,0): 63, 66, 47, + (93,9,0): 64, 68, 45, + (93,10,0): 67, 71, 46, + (93,11,0): 70, 74, 51, + (93,12,0): 75, 76, 58, + (93,13,0): 78, 79, 65, + (93,14,0): 81, 81, 73, + (93,15,0): 82, 82, 72, + (93,16,0): 89, 87, 74, + (93,17,0): 90, 90, 78, + (93,18,0): 95, 94, 92, + (93,19,0): 103, 101, 114, + (93,20,0): 113, 110, 137, + (93,21,0): 123, 121, 161, + (93,22,0): 131, 128, 183, + (93,23,0): 135, 133, 196, + (93,24,0): 143, 140, 209, + (93,25,0): 143, 140, 211, + (93,26,0): 141, 138, 207, + (93,27,0): 138, 133, 199, + (93,28,0): 131, 127, 186, + (93,29,0): 126, 121, 175, + (93,30,0): 122, 119, 166, + (93,31,0): 121, 118, 165, + (93,32,0): 123, 119, 169, + (93,33,0): 124, 122, 171, + (93,34,0): 128, 125, 170, + (93,35,0): 131, 126, 166, + (93,36,0): 131, 125, 161, + (93,37,0): 127, 121, 149, + (93,38,0): 124, 116, 137, + (93,39,0): 122, 114, 129, + (93,40,0): 118, 107, 115, + (93,41,0): 114, 102, 104, + (93,42,0): 109, 95, 94, + (93,43,0): 106, 91, 86, + (93,44,0): 107, 90, 82, + (93,45,0): 108, 90, 80, + (93,46,0): 108, 90, 78, + (93,47,0): 107, 91, 78, + (93,48,0): 103, 94, 77, + (93,49,0): 102, 95, 77, + (93,50,0): 103, 94, 77, + (93,51,0): 106, 93, 77, + (93,52,0): 110, 93, 77, + (93,53,0): 118, 92, 77, + (93,54,0): 124, 92, 77, + (93,55,0): 131, 89, 73, + (93,56,0): 150, 94, 79, + (93,57,0): 157, 85, 71, + (93,58,0): 169, 77, 64, + (93,59,0): 185, 73, 61, + (93,60,0): 197, 64, 55, + (93,61,0): 204, 56, 46, + (93,62,0): 213, 50, 43, + (93,63,0): 221, 50, 43, + (93,64,0): 225, 53, 49, + (93,65,0): 225, 54, 47, + (93,66,0): 226, 53, 46, + (93,67,0): 226, 52, 45, + (93,68,0): 224, 50, 41, + (93,69,0): 222, 52, 39, + (93,70,0): 220, 54, 38, + (93,71,0): 218, 59, 40, + (93,72,0): 209, 57, 36, + (93,73,0): 205, 59, 36, + (93,74,0): 204, 59, 38, + (93,75,0): 206, 59, 39, + (93,76,0): 209, 58, 41, + (93,77,0): 213, 57, 42, + (93,78,0): 217, 55, 44, + (93,79,0): 211, 57, 45, + (93,80,0): 193, 62, 44, + (93,81,0): 180, 59, 40, + (93,82,0): 176, 53, 35, + (93,83,0): 178, 53, 35, + (93,84,0): 187, 57, 41, + (93,85,0): 196, 60, 46, + (93,86,0): 201, 59, 47, + (93,87,0): 203, 55, 45, + (93,88,0): 217, 63, 55, + (93,89,0): 248, 91, 84, + (93,90,0): 227, 73, 65, + (93,91,0): 206, 58, 48, + (93,92,0): 204, 64, 51, + (93,93,0): 184, 54, 38, + (93,94,0): 172, 51, 32, + (93,95,0): 181, 60, 41, + (93,96,0): 188, 57, 39, + (93,97,0): 191, 55, 39, + (93,98,0): 192, 55, 39, + (93,99,0): 195, 55, 40, + (93,100,0): 197, 55, 41, + (93,101,0): 201, 55, 42, + (93,102,0): 206, 55, 44, + (93,103,0): 209, 55, 45, + (93,104,0): 217, 60, 51, + (93,105,0): 219, 58, 50, + (93,106,0): 222, 57, 51, + (93,107,0): 229, 60, 55, + (93,108,0): 234, 62, 58, + (93,109,0): 234, 61, 57, + (93,110,0): 231, 56, 53, + (93,111,0): 227, 52, 49, + (93,112,0): 232, 57, 54, + (93,113,0): 235, 60, 57, + (93,114,0): 236, 58, 58, + (93,115,0): 232, 56, 58, + (93,116,0): 236, 62, 64, + (93,117,0): 248, 80, 80, + (93,118,0): 255, 98, 99, + (93,119,0): 255, 112, 112, + (93,120,0): 249, 104, 101, + (93,121,0): 226, 84, 80, + (93,122,0): 202, 61, 54, + (93,123,0): 192, 49, 43, + (93,124,0): 201, 52, 48, + (93,125,0): 214, 59, 55, + (93,126,0): 223, 61, 58, + (93,127,0): 224, 59, 55, + (93,128,0): 226, 59, 53, + (93,129,0): 225, 58, 50, + (93,130,0): 226, 57, 52, + (93,131,0): 225, 56, 51, + (93,132,0): 227, 55, 51, + (93,133,0): 228, 55, 51, + (93,134,0): 229, 53, 53, + (93,135,0): 230, 54, 54, + (93,136,0): 233, 54, 57, + (93,137,0): 233, 54, 57, + (93,138,0): 234, 55, 59, + (93,139,0): 235, 56, 60, + (93,140,0): 235, 56, 62, + (93,141,0): 234, 55, 61, + (93,142,0): 232, 55, 61, + (93,143,0): 233, 54, 58, + (93,144,0): 239, 56, 60, + (93,145,0): 236, 56, 57, + (93,146,0): 232, 56, 58, + (93,147,0): 227, 59, 58, + (93,148,0): 221, 62, 58, + (93,149,0): 211, 62, 55, + (93,150,0): 201, 60, 50, + (93,151,0): 192, 60, 47, + (93,152,0): 182, 56, 41, + (93,153,0): 178, 58, 41, + (93,154,0): 174, 59, 41, + (93,155,0): 170, 59, 40, + (93,156,0): 169, 60, 40, + (93,157,0): 168, 59, 39, + (93,158,0): 165, 58, 38, + (93,159,0): 165, 58, 40, + (93,160,0): 165, 60, 41, + (93,161,0): 160, 57, 40, + (93,162,0): 160, 59, 41, + (93,163,0): 160, 57, 42, + (93,164,0): 162, 54, 42, + (93,165,0): 181, 62, 56, + (93,166,0): 219, 84, 88, + (93,167,0): 249, 102, 112, + (93,168,0): 237, 76, 92, + (93,169,0): 237, 74, 93, + (93,170,0): 231, 76, 92, + (93,171,0): 216, 78, 91, + (93,172,0): 198, 83, 90, + (93,173,0): 177, 87, 86, + (93,174,0): 156, 92, 82, + (93,175,0): 136, 97, 82, + (93,176,0): 84, 71, 55, + (93,177,0): 77, 74, 57, + (93,178,0): 83, 70, 53, + (93,179,0): 77, 62, 43, + (93,180,0): 63, 51, 27, + (93,181,0): 57, 54, 23, + (93,182,0): 65, 77, 37, + (93,183,0): 78, 102, 54, + (93,184,0): 108, 138, 84, + (93,185,0): 119, 148, 92, + (93,186,0): 132, 155, 101, + (93,187,0): 137, 154, 100, + (93,188,0): 141, 155, 102, + (93,189,0): 144, 163, 107, + (93,190,0): 148, 173, 116, + (93,191,0): 152, 176, 124, + (93,192,0): 131, 149, 109, + (93,193,0): 110, 125, 92, + (93,194,0): 81, 96, 67, + (93,195,0): 60, 74, 48, + (93,196,0): 57, 70, 44, + (93,197,0): 65, 80, 49, + (93,198,0): 79, 95, 59, + (93,199,0): 87, 106, 61, + (93,200,0): 99, 122, 68, + (93,201,0): 101, 130, 66, + (93,202,0): 106, 139, 68, + (93,203,0): 107, 145, 70, + (93,204,0): 105, 146, 70, + (93,205,0): 101, 145, 70, + (93,206,0): 97, 143, 70, + (93,207,0): 99, 142, 71, + (93,208,0): 99, 136, 67, + (93,209,0): 105, 137, 70, + (93,210,0): 106, 141, 75, + (93,211,0): 108, 143, 77, + (93,212,0): 108, 143, 79, + (93,213,0): 108, 143, 79, + (93,214,0): 109, 145, 81, + (93,215,0): 110, 146, 82, + (93,216,0): 109, 148, 81, + (93,217,0): 109, 149, 79, + (93,218,0): 109, 150, 80, + (93,219,0): 108, 150, 76, + (93,220,0): 107, 151, 74, + (93,221,0): 109, 153, 74, + (93,222,0): 114, 159, 78, + (93,223,0): 115, 162, 81, + (93,224,0): 124, 173, 94, + (93,225,0): 123, 172, 93, + (93,226,0): 122, 171, 92, + (94,0,0): 68, 65, 48, + (94,1,0): 68, 66, 51, + (94,2,0): 68, 66, 54, + (94,3,0): 67, 67, 57, + (94,4,0): 67, 67, 59, + (94,5,0): 67, 67, 59, + (94,6,0): 66, 66, 54, + (94,7,0): 66, 67, 51, + (94,8,0): 68, 70, 48, + (94,9,0): 69, 72, 45, + (94,10,0): 71, 74, 45, + (94,11,0): 74, 77, 50, + (94,12,0): 79, 78, 57, + (94,13,0): 82, 81, 63, + (94,14,0): 84, 82, 69, + (94,15,0): 85, 83, 68, + (94,16,0): 92, 90, 67, + (94,17,0): 92, 92, 68, + (94,18,0): 92, 93, 79, + (94,19,0): 97, 97, 97, + (94,20,0): 105, 104, 120, + (94,21,0): 114, 113, 144, + (94,22,0): 123, 122, 166, + (94,23,0): 129, 126, 181, + (94,24,0): 134, 130, 191, + (94,25,0): 136, 131, 195, + (94,26,0): 136, 132, 193, + (94,27,0): 132, 129, 186, + (94,28,0): 127, 123, 174, + (94,29,0): 121, 115, 161, + (94,30,0): 116, 111, 151, + (94,31,0): 111, 109, 148, + (94,32,0): 112, 109, 154, + (94,33,0): 114, 111, 158, + (94,34,0): 118, 113, 154, + (94,35,0): 119, 115, 150, + (94,36,0): 119, 115, 142, + (94,37,0): 116, 111, 131, + (94,38,0): 115, 107, 120, + (94,39,0): 114, 105, 110, + (94,40,0): 109, 97, 97, + (94,41,0): 108, 95, 89, + (94,42,0): 106, 92, 83, + (94,43,0): 107, 90, 80, + (94,44,0): 109, 91, 79, + (94,45,0): 111, 91, 80, + (94,46,0): 111, 92, 78, + (94,47,0): 111, 92, 78, + (94,48,0): 110, 92, 78, + (94,49,0): 109, 93, 78, + (94,50,0): 107, 94, 78, + (94,51,0): 108, 95, 79, + (94,52,0): 111, 95, 79, + (94,53,0): 117, 96, 79, + (94,54,0): 125, 93, 78, + (94,55,0): 137, 89, 77, + (94,56,0): 161, 95, 83, + (94,57,0): 167, 79, 69, + (94,58,0): 174, 66, 56, + (94,59,0): 186, 59, 50, + (94,60,0): 197, 55, 45, + (94,61,0): 204, 50, 40, + (94,62,0): 212, 51, 41, + (94,63,0): 220, 53, 44, + (94,64,0): 224, 55, 48, + (94,65,0): 225, 54, 47, + (94,66,0): 225, 52, 45, + (94,67,0): 224, 51, 44, + (94,68,0): 224, 52, 42, + (94,69,0): 221, 53, 40, + (94,70,0): 216, 55, 37, + (94,71,0): 212, 57, 37, + (94,72,0): 207, 58, 34, + (94,73,0): 202, 61, 34, + (94,74,0): 201, 61, 36, + (94,75,0): 202, 62, 39, + (94,76,0): 205, 60, 41, + (94,77,0): 210, 59, 42, + (94,78,0): 213, 57, 44, + (94,79,0): 207, 59, 45, + (94,80,0): 191, 64, 45, + (94,81,0): 177, 60, 40, + (94,82,0): 172, 53, 33, + (94,83,0): 174, 51, 33, + (94,84,0): 186, 56, 40, + (94,85,0): 196, 60, 46, + (94,86,0): 202, 58, 47, + (94,87,0): 206, 53, 45, + (94,88,0): 216, 57, 51, + (94,89,0): 240, 78, 73, + (94,90,0): 241, 84, 77, + (94,91,0): 217, 66, 57, + (94,92,0): 204, 66, 53, + (94,93,0): 190, 63, 46, + (94,94,0): 166, 49, 29, + (94,95,0): 179, 60, 40, + (94,96,0): 190, 60, 44, + (94,97,0): 193, 57, 43, + (94,98,0): 193, 55, 42, + (94,99,0): 194, 54, 41, + (94,100,0): 197, 55, 43, + (94,101,0): 201, 57, 46, + (94,102,0): 207, 59, 49, + (94,103,0): 212, 59, 51, + (94,104,0): 225, 68, 61, + (94,105,0): 227, 65, 60, + (94,106,0): 228, 63, 59, + (94,107,0): 231, 62, 59, + (94,108,0): 233, 61, 59, + (94,109,0): 233, 59, 58, + (94,110,0): 232, 56, 56, + (94,111,0): 231, 56, 53, + (94,112,0): 231, 56, 53, + (94,113,0): 230, 57, 53, + (94,114,0): 230, 55, 52, + (94,115,0): 233, 59, 58, + (94,116,0): 244, 74, 74, + (94,117,0): 255, 92, 91, + (94,118,0): 255, 100, 99, + (94,119,0): 248, 99, 95, + (94,120,0): 204, 61, 57, + (94,121,0): 193, 56, 50, + (94,122,0): 189, 52, 46, + (94,123,0): 195, 56, 49, + (94,124,0): 213, 65, 61, + (94,125,0): 222, 69, 64, + (94,126,0): 223, 61, 59, + (94,127,0): 217, 52, 50, + (94,128,0): 226, 59, 53, + (94,129,0): 226, 59, 51, + (94,130,0): 226, 57, 52, + (94,131,0): 226, 57, 52, + (94,132,0): 228, 56, 52, + (94,133,0): 229, 56, 52, + (94,134,0): 231, 55, 55, + (94,135,0): 233, 55, 55, + (94,136,0): 234, 54, 57, + (94,137,0): 235, 55, 58, + (94,138,0): 235, 54, 59, + (94,139,0): 235, 56, 60, + (94,140,0): 235, 56, 62, + (94,141,0): 232, 55, 61, + (94,142,0): 232, 55, 61, + (94,143,0): 233, 54, 58, + (94,144,0): 235, 55, 58, + (94,145,0): 233, 54, 57, + (94,146,0): 230, 56, 57, + (94,147,0): 224, 59, 57, + (94,148,0): 219, 62, 57, + (94,149,0): 209, 62, 54, + (94,150,0): 198, 60, 49, + (94,151,0): 190, 60, 46, + (94,152,0): 179, 56, 41, + (94,153,0): 174, 59, 41, + (94,154,0): 170, 59, 40, + (94,155,0): 166, 59, 39, + (94,156,0): 164, 59, 40, + (94,157,0): 163, 58, 39, + (94,158,0): 163, 58, 39, + (94,159,0): 160, 57, 38, + (94,160,0): 161, 62, 43, + (94,161,0): 150, 55, 37, + (94,162,0): 156, 61, 43, + (94,163,0): 154, 57, 41, + (94,164,0): 154, 50, 39, + (94,165,0): 195, 80, 75, + (94,166,0): 237, 107, 109, + (94,167,0): 237, 93, 102, + (94,168,0): 235, 80, 94, + (94,169,0): 232, 75, 92, + (94,170,0): 220, 74, 87, + (94,171,0): 202, 77, 83, + (94,172,0): 182, 84, 83, + (94,173,0): 161, 93, 82, + (94,174,0): 142, 101, 81, + (94,175,0): 127, 106, 85, + (94,176,0): 78, 75, 56, + (94,177,0): 75, 72, 55, + (94,178,0): 80, 63, 47, + (94,179,0): 76, 55, 36, + (94,180,0): 69, 53, 27, + (94,181,0): 71, 71, 35, + (94,182,0): 87, 111, 61, + (94,183,0): 105, 146, 86, + (94,184,0): 127, 178, 111, + (94,185,0): 130, 179, 113, + (94,186,0): 131, 165, 104, + (94,187,0): 125, 146, 89, + (94,188,0): 131, 141, 89, + (94,189,0): 142, 150, 99, + (94,190,0): 137, 151, 100, + (94,191,0): 124, 140, 95, + (94,192,0): 88, 102, 67, + (94,193,0): 71, 84, 56, + (94,194,0): 57, 69, 45, + (94,195,0): 54, 66, 42, + (94,196,0): 58, 68, 44, + (94,197,0): 61, 74, 48, + (94,198,0): 74, 88, 55, + (94,199,0): 87, 104, 62, + (94,200,0): 101, 124, 70, + (94,201,0): 104, 130, 67, + (94,202,0): 108, 139, 69, + (94,203,0): 108, 144, 70, + (94,204,0): 105, 147, 71, + (94,205,0): 99, 145, 70, + (94,206,0): 97, 145, 71, + (94,207,0): 97, 143, 71, + (94,208,0): 102, 139, 70, + (94,209,0): 108, 140, 73, + (94,210,0): 109, 144, 78, + (94,211,0): 110, 145, 79, + (94,212,0): 108, 143, 79, + (94,213,0): 107, 142, 78, + (94,214,0): 107, 143, 79, + (94,215,0): 109, 145, 81, + (94,216,0): 112, 151, 84, + (94,217,0): 113, 153, 83, + (94,218,0): 112, 153, 83, + (94,219,0): 112, 154, 80, + (94,220,0): 111, 155, 78, + (94,221,0): 113, 157, 78, + (94,222,0): 116, 163, 82, + (94,223,0): 119, 166, 85, + (94,224,0): 126, 175, 96, + (94,225,0): 123, 174, 95, + (94,226,0): 121, 172, 93, + (95,0,0): 73, 67, 51, + (95,1,0): 74, 68, 54, + (95,2,0): 73, 69, 57, + (95,3,0): 73, 69, 58, + (95,4,0): 73, 71, 59, + (95,5,0): 73, 71, 59, + (95,6,0): 72, 70, 57, + (95,7,0): 72, 71, 53, + (95,8,0): 73, 72, 51, + (95,9,0): 74, 74, 50, + (95,10,0): 76, 76, 50, + (95,11,0): 78, 78, 52, + (95,12,0): 82, 80, 59, + (95,13,0): 84, 81, 62, + (95,14,0): 88, 82, 68, + (95,15,0): 89, 84, 65, + (95,16,0): 93, 89, 62, + (95,17,0): 91, 90, 62, + (95,18,0): 92, 89, 72, + (95,19,0): 94, 91, 84, + (95,20,0): 100, 97, 104, + (95,21,0): 110, 107, 126, + (95,22,0): 120, 115, 147, + (95,23,0): 125, 120, 160, + (95,24,0): 129, 123, 167, + (95,25,0): 131, 125, 171, + (95,26,0): 133, 127, 173, + (95,27,0): 131, 124, 166, + (95,28,0): 125, 119, 157, + (95,29,0): 117, 110, 143, + (95,30,0): 111, 105, 133, + (95,31,0): 107, 103, 130, + (95,32,0): 105, 102, 133, + (95,33,0): 106, 103, 134, + (95,34,0): 109, 104, 134, + (95,35,0): 109, 105, 128, + (95,36,0): 109, 105, 120, + (95,37,0): 108, 103, 110, + (95,38,0): 107, 98, 101, + (95,39,0): 106, 96, 94, + (95,40,0): 103, 93, 84, + (95,41,0): 104, 92, 80, + (95,42,0): 104, 90, 77, + (95,43,0): 107, 91, 76, + (95,44,0): 110, 93, 77, + (95,45,0): 113, 94, 79, + (95,46,0): 113, 94, 79, + (95,47,0): 112, 93, 78, + (95,48,0): 112, 93, 79, + (95,49,0): 111, 93, 79, + (95,50,0): 112, 93, 78, + (95,51,0): 115, 93, 79, + (95,52,0): 119, 93, 78, + (95,53,0): 126, 93, 78, + (95,54,0): 137, 91, 76, + (95,55,0): 147, 87, 76, + (95,56,0): 162, 84, 72, + (95,57,0): 166, 69, 60, + (95,58,0): 171, 57, 47, + (95,59,0): 186, 55, 45, + (95,60,0): 200, 56, 47, + (95,61,0): 211, 54, 45, + (95,62,0): 217, 54, 45, + (95,63,0): 221, 54, 45, + (95,64,0): 223, 54, 47, + (95,65,0): 223, 52, 45, + (95,66,0): 223, 52, 44, + (95,67,0): 223, 52, 44, + (95,68,0): 223, 55, 44, + (95,69,0): 221, 55, 41, + (95,70,0): 216, 54, 39, + (95,71,0): 209, 54, 36, + (95,72,0): 207, 58, 36, + (95,73,0): 204, 60, 36, + (95,74,0): 202, 60, 38, + (95,75,0): 203, 61, 39, + (95,76,0): 206, 59, 41, + (95,77,0): 209, 59, 42, + (95,78,0): 211, 58, 44, + (95,79,0): 206, 60, 45, + (95,80,0): 190, 65, 47, + (95,81,0): 175, 60, 39, + (95,82,0): 168, 51, 33, + (95,83,0): 172, 51, 32, + (95,84,0): 182, 57, 39, + (95,85,0): 193, 61, 46, + (95,86,0): 201, 59, 47, + (95,87,0): 204, 56, 46, + (95,88,0): 204, 50, 42, + (95,89,0): 224, 65, 59, + (95,90,0): 248, 91, 84, + (95,91,0): 224, 73, 64, + (95,92,0): 208, 68, 55, + (95,93,0): 202, 70, 55, + (95,94,0): 171, 50, 31, + (95,95,0): 184, 63, 44, + (95,96,0): 202, 70, 55, + (95,97,0): 204, 66, 53, + (95,98,0): 202, 64, 51, + (95,99,0): 203, 63, 50, + (95,100,0): 205, 63, 51, + (95,101,0): 210, 66, 55, + (95,102,0): 220, 69, 60, + (95,103,0): 225, 71, 63, + (95,104,0): 226, 64, 59, + (95,105,0): 226, 61, 57, + (95,106,0): 227, 58, 55, + (95,107,0): 226, 54, 52, + (95,108,0): 226, 54, 52, + (95,109,0): 227, 55, 53, + (95,110,0): 229, 57, 55, + (95,111,0): 229, 60, 57, + (95,112,0): 228, 63, 57, + (95,113,0): 224, 61, 54, + (95,114,0): 221, 58, 53, + (95,115,0): 225, 63, 58, + (95,116,0): 234, 77, 72, + (95,117,0): 234, 81, 76, + (95,118,0): 211, 64, 57, + (95,119,0): 184, 41, 35, + (95,120,0): 184, 45, 38, + (95,121,0): 190, 53, 45, + (95,122,0): 201, 62, 55, + (95,123,0): 208, 65, 59, + (95,124,0): 214, 62, 57, + (95,125,0): 217, 59, 56, + (95,126,0): 225, 59, 59, + (95,127,0): 231, 61, 61, + (95,128,0): 226, 57, 54, + (95,129,0): 226, 57, 54, + (95,130,0): 226, 57, 54, + (95,131,0): 228, 56, 54, + (95,132,0): 229, 57, 53, + (95,133,0): 231, 58, 54, + (95,134,0): 233, 57, 57, + (95,135,0): 234, 58, 58, + (95,136,0): 234, 56, 56, + (95,137,0): 234, 56, 56, + (95,138,0): 235, 56, 59, + (95,139,0): 235, 56, 59, + (95,140,0): 233, 57, 60, + (95,141,0): 232, 56, 59, + (95,142,0): 231, 55, 58, + (95,143,0): 231, 55, 58, + (95,144,0): 233, 54, 58, + (95,145,0): 230, 54, 56, + (95,146,0): 226, 56, 56, + (95,147,0): 222, 58, 56, + (95,148,0): 214, 61, 56, + (95,149,0): 204, 61, 53, + (95,150,0): 194, 60, 49, + (95,151,0): 185, 59, 45, + (95,152,0): 174, 57, 40, + (95,153,0): 170, 59, 42, + (95,154,0): 166, 59, 41, + (95,155,0): 162, 59, 40, + (95,156,0): 160, 59, 39, + (95,157,0): 158, 59, 38, + (95,158,0): 159, 58, 40, + (95,159,0): 155, 58, 39, + (95,160,0): 152, 63, 45, + (95,161,0): 140, 53, 34, + (95,162,0): 153, 61, 46, + (95,163,0): 152, 56, 42, + (95,164,0): 151, 47, 38, + (95,165,0): 205, 92, 88, + (95,166,0): 246, 122, 124, + (95,167,0): 222, 88, 95, + (95,168,0): 229, 89, 100, + (95,169,0): 217, 81, 91, + (95,170,0): 200, 77, 82, + (95,171,0): 183, 77, 79, + (95,172,0): 167, 87, 80, + (95,173,0): 155, 97, 85, + (95,174,0): 141, 104, 85, + (95,175,0): 128, 110, 86, + (95,176,0): 84, 84, 56, + (95,177,0): 67, 72, 42, + (95,178,0): 66, 57, 28, + (95,179,0): 72, 59, 27, + (95,180,0): 88, 80, 43, + (95,181,0): 110, 116, 68, + (95,182,0): 132, 162, 102, + (95,183,0): 148, 193, 126, + (95,184,0): 135, 188, 118, + (95,185,0): 134, 184, 115, + (95,186,0): 124, 158, 97, + (95,187,0): 110, 130, 77, + (95,188,0): 117, 126, 81, + (95,189,0): 130, 135, 94, + (95,190,0): 117, 125, 86, + (95,191,0): 91, 98, 64, + (95,192,0): 59, 68, 41, + (95,193,0): 52, 60, 37, + (95,194,0): 53, 61, 40, + (95,195,0): 61, 68, 50, + (95,196,0): 60, 69, 50, + (95,197,0): 57, 67, 43, + (95,198,0): 67, 80, 50, + (95,199,0): 85, 101, 62, + (95,200,0): 103, 123, 72, + (95,201,0): 105, 131, 70, + (95,202,0): 108, 139, 71, + (95,203,0): 109, 145, 71, + (95,204,0): 106, 147, 71, + (95,205,0): 102, 146, 71, + (95,206,0): 98, 144, 71, + (95,207,0): 99, 142, 71, + (95,208,0): 104, 141, 74, + (95,209,0): 108, 143, 77, + (95,210,0): 111, 146, 80, + (95,211,0): 110, 147, 80, + (95,212,0): 108, 143, 77, + (95,213,0): 105, 142, 75, + (95,214,0): 106, 143, 74, + (95,215,0): 106, 146, 76, + (95,216,0): 115, 155, 84, + (95,217,0): 115, 157, 85, + (95,218,0): 115, 157, 83, + (95,219,0): 114, 158, 81, + (95,220,0): 114, 158, 79, + (95,221,0): 115, 162, 82, + (95,222,0): 119, 166, 85, + (95,223,0): 122, 171, 90, + (95,224,0): 119, 167, 91, + (95,225,0): 117, 165, 91, + (95,226,0): 116, 164, 90, + (96,0,0): 82, 75, 59, + (96,1,0): 82, 75, 59, + (96,2,0): 82, 74, 61, + (96,3,0): 82, 74, 61, + (96,4,0): 82, 74, 61, + (96,5,0): 82, 74, 61, + (96,6,0): 82, 74, 61, + (96,7,0): 82, 75, 59, + (96,8,0): 85, 78, 60, + (96,9,0): 86, 79, 61, + (96,10,0): 87, 80, 62, + (96,11,0): 88, 81, 63, + (96,12,0): 89, 82, 64, + (96,13,0): 91, 84, 68, + (96,14,0): 92, 85, 69, + (96,15,0): 92, 85, 69, + (96,16,0): 98, 91, 72, + (96,17,0): 97, 90, 72, + (96,18,0): 97, 89, 76, + (96,19,0): 98, 89, 82, + (96,20,0): 101, 93, 91, + (96,21,0): 107, 97, 105, + (96,22,0): 113, 102, 116, + (96,23,0): 117, 106, 123, + (96,24,0): 122, 110, 132, + (96,25,0): 124, 112, 136, + (96,26,0): 127, 115, 139, + (96,27,0): 127, 115, 137, + (96,28,0): 124, 112, 132, + (96,29,0): 117, 106, 123, + (96,30,0): 109, 98, 114, + (96,31,0): 101, 93, 106, + (96,32,0): 99, 96, 105, + (96,33,0): 96, 95, 101, + (96,34,0): 95, 93, 98, + (96,35,0): 95, 90, 94, + (96,36,0): 94, 90, 89, + (96,37,0): 94, 89, 85, + (96,38,0): 97, 90, 82, + (96,39,0): 98, 90, 79, + (96,40,0): 101, 91, 79, + (96,41,0): 103, 91, 75, + (96,42,0): 105, 92, 75, + (96,43,0): 107, 92, 73, + (96,44,0): 107, 92, 71, + (96,45,0): 109, 92, 72, + (96,46,0): 109, 93, 70, + (96,47,0): 106, 94, 72, + (96,48,0): 106, 98, 79, + (96,49,0): 114, 101, 84, + (96,50,0): 113, 90, 74, + (96,51,0): 117, 79, 66, + (96,52,0): 139, 87, 74, + (96,53,0): 156, 92, 80, + (96,54,0): 162, 90, 76, + (96,55,0): 170, 91, 76, + (96,56,0): 164, 78, 61, + (96,57,0): 165, 70, 52, + (96,58,0): 166, 60, 44, + (96,59,0): 176, 56, 40, + (96,60,0): 194, 56, 45, + (96,61,0): 210, 56, 48, + (96,62,0): 221, 52, 49, + (96,63,0): 222, 49, 45, + (96,64,0): 223, 54, 47, + (96,65,0): 222, 55, 46, + (96,66,0): 222, 55, 46, + (96,67,0): 222, 55, 46, + (96,68,0): 222, 55, 46, + (96,69,0): 219, 55, 43, + (96,70,0): 216, 54, 41, + (96,71,0): 215, 55, 41, + (96,72,0): 213, 56, 41, + (96,73,0): 212, 56, 41, + (96,74,0): 210, 57, 41, + (96,75,0): 210, 57, 41, + (96,76,0): 210, 57, 43, + (96,77,0): 210, 57, 43, + (96,78,0): 212, 56, 43, + (96,79,0): 205, 59, 44, + (96,80,0): 189, 59, 43, + (96,81,0): 182, 62, 45, + (96,82,0): 174, 57, 40, + (96,83,0): 169, 49, 32, + (96,84,0): 171, 50, 33, + (96,85,0): 183, 57, 42, + (96,86,0): 192, 60, 47, + (96,87,0): 195, 57, 46, + (96,88,0): 200, 53, 43, + (96,89,0): 206, 53, 45, + (96,90,0): 212, 58, 48, + (96,91,0): 219, 67, 56, + (96,92,0): 221, 75, 62, + (96,93,0): 212, 72, 57, + (96,94,0): 194, 61, 44, + (96,95,0): 183, 50, 35, + (96,96,0): 221, 80, 70, + (96,97,0): 216, 74, 64, + (96,98,0): 212, 70, 60, + (96,99,0): 211, 69, 59, + (96,100,0): 215, 73, 63, + (96,101,0): 219, 72, 64, + (96,102,0): 221, 68, 62, + (96,103,0): 223, 61, 58, + (96,104,0): 223, 55, 52, + (96,105,0): 230, 56, 55, + (96,106,0): 234, 58, 58, + (96,107,0): 234, 58, 58, + (96,108,0): 229, 57, 55, + (96,109,0): 224, 55, 52, + (96,110,0): 222, 57, 51, + (96,111,0): 220, 61, 55, + (96,112,0): 220, 69, 62, + (96,113,0): 209, 65, 57, + (96,114,0): 199, 57, 47, + (96,115,0): 191, 50, 40, + (96,116,0): 185, 48, 38, + (96,117,0): 186, 52, 41, + (96,118,0): 191, 59, 47, + (96,119,0): 195, 63, 51, + (96,120,0): 195, 58, 48, + (96,121,0): 199, 61, 51, + (96,122,0): 208, 64, 55, + (96,123,0): 217, 64, 58, + (96,124,0): 224, 62, 59, + (96,125,0): 229, 60, 57, + (96,126,0): 233, 57, 57, + (96,127,0): 236, 58, 58, + (96,128,0): 230, 56, 58, + (96,129,0): 229, 56, 58, + (96,130,0): 229, 56, 58, + (96,131,0): 229, 57, 57, + (96,132,0): 229, 57, 55, + (96,133,0): 229, 57, 55, + (96,134,0): 229, 57, 53, + (96,135,0): 229, 57, 53, + (96,136,0): 224, 52, 48, + (96,137,0): 225, 53, 49, + (96,138,0): 228, 54, 53, + (96,139,0): 229, 55, 54, + (96,140,0): 230, 56, 57, + (96,141,0): 231, 57, 58, + (96,142,0): 231, 57, 58, + (96,143,0): 231, 57, 59, + (96,144,0): 235, 59, 62, + (96,145,0): 230, 57, 59, + (96,146,0): 223, 57, 57, + (96,147,0): 220, 61, 58, + (96,148,0): 214, 65, 61, + (96,149,0): 205, 66, 59, + (96,150,0): 193, 65, 54, + (96,151,0): 183, 63, 49, + (96,152,0): 169, 58, 41, + (96,153,0): 163, 60, 43, + (96,154,0): 160, 61, 42, + (96,155,0): 155, 60, 40, + (96,156,0): 153, 58, 38, + (96,157,0): 150, 58, 37, + (96,158,0): 151, 56, 38, + (96,159,0): 145, 56, 38, + (96,160,0): 144, 65, 48, + (96,161,0): 139, 60, 45, + (96,162,0): 135, 47, 35, + (96,163,0): 145, 47, 38, + (96,164,0): 188, 76, 74, + (96,165,0): 228, 109, 111, + (96,166,0): 229, 109, 111, + (96,167,0): 205, 86, 90, + (96,168,0): 189, 76, 78, + (96,169,0): 181, 78, 79, + (96,170,0): 170, 81, 77, + (96,171,0): 162, 85, 79, + (96,172,0): 155, 88, 79, + (96,173,0): 150, 93, 82, + (96,174,0): 149, 97, 84, + (96,175,0): 138, 106, 83, + (96,176,0): 88, 89, 47, + (96,177,0): 61, 75, 22, + (96,178,0): 56, 69, 15, + (96,179,0): 86, 97, 41, + (96,180,0): 127, 141, 80, + (96,181,0): 155, 176, 111, + (96,182,0): 161, 188, 121, + (96,183,0): 156, 189, 120, + (96,184,0): 146, 181, 115, + (96,185,0): 126, 157, 97, + (96,186,0): 104, 128, 76, + (96,187,0): 92, 109, 67, + (96,188,0): 89, 100, 66, + (96,189,0): 84, 93, 66, + (96,190,0): 72, 80, 57, + (96,191,0): 63, 68, 48, + (96,192,0): 58, 61, 44, + (96,193,0): 64, 67, 50, + (96,194,0): 60, 64, 49, + (96,195,0): 58, 62, 48, + (96,196,0): 60, 67, 51, + (96,197,0): 58, 67, 48, + (96,198,0): 65, 78, 50, + (96,199,0): 82, 100, 62, + (96,200,0): 93, 115, 66, + (96,201,0): 103, 131, 72, + (96,202,0): 112, 143, 75, + (96,203,0): 111, 147, 75, + (96,204,0): 108, 146, 71, + (96,205,0): 106, 146, 73, + (96,206,0): 105, 147, 75, + (96,207,0): 103, 144, 74, + (96,208,0): 108, 144, 80, + (96,209,0): 109, 145, 83, + (96,210,0): 111, 147, 83, + (96,211,0): 108, 147, 80, + (96,212,0): 109, 146, 77, + (96,213,0): 107, 147, 74, + (96,214,0): 109, 150, 74, + (96,215,0): 109, 152, 73, + (96,216,0): 113, 156, 76, + (96,217,0): 113, 158, 77, + (96,218,0): 114, 159, 78, + (96,219,0): 114, 161, 80, + (96,220,0): 116, 163, 82, + (96,221,0): 118, 167, 85, + (96,222,0): 121, 170, 89, + (96,223,0): 122, 170, 94, + (96,224,0): 123, 168, 101, + (96,225,0): 111, 155, 92, + (96,226,0): 101, 145, 82, + (97,0,0): 87, 78, 63, + (97,1,0): 87, 78, 63, + (97,2,0): 87, 78, 63, + (97,3,0): 87, 78, 63, + (97,4,0): 87, 78, 63, + (97,5,0): 87, 78, 63, + (97,6,0): 87, 78, 63, + (97,7,0): 87, 78, 63, + (97,8,0): 88, 79, 64, + (97,9,0): 89, 80, 65, + (97,10,0): 89, 80, 65, + (97,11,0): 91, 82, 67, + (97,12,0): 92, 83, 68, + (97,13,0): 93, 84, 69, + (97,14,0): 94, 85, 70, + (97,15,0): 95, 86, 71, + (97,16,0): 100, 91, 74, + (97,17,0): 99, 90, 73, + (97,18,0): 99, 89, 77, + (97,19,0): 99, 89, 79, + (97,20,0): 102, 91, 85, + (97,21,0): 106, 95, 93, + (97,22,0): 110, 98, 100, + (97,23,0): 112, 100, 104, + (97,24,0): 114, 101, 108, + (97,25,0): 116, 103, 112, + (97,26,0): 118, 105, 114, + (97,27,0): 118, 105, 114, + (97,28,0): 115, 102, 109, + (97,29,0): 109, 96, 103, + (97,30,0): 103, 91, 95, + (97,31,0): 98, 88, 89, + (97,32,0): 94, 91, 86, + (97,33,0): 90, 90, 82, + (97,34,0): 89, 86, 79, + (97,35,0): 87, 84, 75, + (97,36,0): 88, 84, 73, + (97,37,0): 88, 84, 72, + (97,38,0): 92, 86, 72, + (97,39,0): 94, 87, 71, + (97,40,0): 99, 90, 75, + (97,41,0): 99, 90, 73, + (97,42,0): 102, 91, 73, + (97,43,0): 103, 92, 72, + (97,44,0): 105, 93, 71, + (97,45,0): 106, 94, 70, + (97,46,0): 107, 95, 71, + (97,47,0): 106, 95, 73, + (97,48,0): 102, 97, 77, + (97,49,0): 111, 103, 84, + (97,50,0): 119, 91, 77, + (97,51,0): 129, 83, 70, + (97,52,0): 153, 86, 77, + (97,53,0): 168, 88, 79, + (97,54,0): 175, 82, 74, + (97,55,0): 180, 82, 69, + (97,56,0): 173, 73, 57, + (97,57,0): 170, 67, 48, + (97,58,0): 171, 61, 44, + (97,59,0): 177, 57, 41, + (97,60,0): 190, 56, 44, + (97,61,0): 204, 55, 48, + (97,62,0): 216, 52, 50, + (97,63,0): 220, 51, 48, + (97,64,0): 221, 54, 46, + (97,65,0): 220, 56, 46, + (97,66,0): 220, 56, 46, + (97,67,0): 220, 56, 46, + (97,68,0): 219, 55, 45, + (97,69,0): 218, 56, 45, + (97,70,0): 217, 55, 44, + (97,71,0): 215, 55, 43, + (97,72,0): 215, 55, 43, + (97,73,0): 213, 55, 43, + (97,74,0): 213, 55, 43, + (97,75,0): 213, 55, 43, + (97,76,0): 212, 56, 43, + (97,77,0): 212, 56, 43, + (97,78,0): 212, 56, 43, + (97,79,0): 206, 58, 44, + (97,80,0): 190, 60, 46, + (97,81,0): 182, 62, 46, + (97,82,0): 174, 57, 40, + (97,83,0): 166, 49, 32, + (97,84,0): 167, 50, 32, + (97,85,0): 178, 58, 41, + (97,86,0): 185, 62, 46, + (97,87,0): 190, 60, 46, + (97,88,0): 198, 58, 45, + (97,89,0): 199, 52, 42, + (97,90,0): 203, 52, 41, + (97,91,0): 210, 59, 48, + (97,92,0): 220, 69, 58, + (97,93,0): 225, 79, 66, + (97,94,0): 223, 81, 67, + (97,95,0): 221, 79, 67, + (97,96,0): 219, 70, 63, + (97,97,0): 214, 65, 59, + (97,98,0): 209, 60, 53, + (97,99,0): 208, 59, 52, + (97,100,0): 211, 62, 55, + (97,101,0): 215, 62, 56, + (97,102,0): 217, 58, 54, + (97,103,0): 218, 53, 51, + (97,104,0): 230, 56, 55, + (97,105,0): 234, 56, 56, + (97,106,0): 236, 56, 57, + (97,107,0): 234, 56, 56, + (97,108,0): 230, 56, 55, + (97,109,0): 226, 58, 55, + (97,110,0): 225, 62, 57, + (97,111,0): 219, 66, 58, + (97,112,0): 205, 64, 55, + (97,113,0): 194, 61, 52, + (97,114,0): 187, 57, 44, + (97,115,0): 180, 52, 39, + (97,116,0): 178, 52, 38, + (97,117,0): 181, 55, 41, + (97,118,0): 186, 60, 45, + (97,119,0): 191, 64, 49, + (97,120,0): 198, 64, 52, + (97,121,0): 205, 64, 54, + (97,122,0): 213, 65, 55, + (97,123,0): 220, 63, 56, + (97,124,0): 226, 58, 55, + (97,125,0): 230, 56, 55, + (97,126,0): 235, 55, 54, + (97,127,0): 239, 56, 58, + (97,128,0): 233, 54, 58, + (97,129,0): 231, 54, 60, + (97,130,0): 231, 55, 58, + (97,131,0): 230, 56, 57, + (97,132,0): 230, 56, 55, + (97,133,0): 229, 57, 53, + (97,134,0): 229, 57, 53, + (97,135,0): 227, 58, 53, + (97,136,0): 226, 57, 50, + (97,137,0): 227, 58, 51, + (97,138,0): 227, 58, 53, + (97,139,0): 228, 59, 54, + (97,140,0): 228, 59, 56, + (97,141,0): 228, 59, 56, + (97,142,0): 229, 57, 57, + (97,143,0): 229, 57, 57, + (97,144,0): 228, 58, 59, + (97,145,0): 227, 59, 59, + (97,146,0): 223, 60, 61, + (97,147,0): 217, 63, 61, + (97,148,0): 208, 65, 59, + (97,149,0): 196, 63, 54, + (97,150,0): 183, 61, 50, + (97,151,0): 172, 59, 45, + (97,152,0): 165, 59, 43, + (97,153,0): 160, 61, 42, + (97,154,0): 156, 61, 43, + (97,155,0): 151, 60, 41, + (97,156,0): 150, 59, 40, + (97,157,0): 146, 58, 38, + (97,158,0): 147, 56, 37, + (97,159,0): 140, 58, 37, + (97,160,0): 128, 57, 39, + (97,161,0): 128, 56, 41, + (97,162,0): 137, 53, 42, + (97,163,0): 157, 60, 53, + (97,164,0): 191, 81, 80, + (97,165,0): 215, 101, 101, + (97,166,0): 209, 94, 97, + (97,167,0): 183, 77, 77, + (97,168,0): 172, 78, 76, + (97,169,0): 164, 84, 77, + (97,170,0): 157, 89, 80, + (97,171,0): 152, 92, 81, + (97,172,0): 151, 94, 83, + (97,173,0): 151, 94, 83, + (97,174,0): 152, 95, 86, + (97,175,0): 140, 102, 81, + (97,176,0): 96, 95, 47, + (97,177,0): 83, 103, 42, + (97,178,0): 94, 114, 51, + (97,179,0): 122, 144, 79, + (97,180,0): 153, 175, 110, + (97,181,0): 165, 190, 124, + (97,182,0): 153, 178, 112, + (97,183,0): 136, 160, 98, + (97,184,0): 106, 130, 72, + (97,185,0): 97, 117, 66, + (97,186,0): 84, 101, 59, + (97,187,0): 74, 88, 55, + (97,188,0): 70, 80, 55, + (97,189,0): 63, 72, 53, + (97,190,0): 57, 63, 49, + (97,191,0): 53, 56, 45, + (97,192,0): 58, 60, 47, + (97,193,0): 65, 66, 52, + (97,194,0): 61, 63, 52, + (97,195,0): 58, 61, 50, + (97,196,0): 61, 65, 51, + (97,197,0): 58, 67, 48, + (97,198,0): 64, 77, 51, + (97,199,0): 82, 100, 62, + (97,200,0): 94, 116, 69, + (97,201,0): 103, 131, 72, + (97,202,0): 113, 144, 77, + (97,203,0): 112, 148, 76, + (97,204,0): 110, 146, 72, + (97,205,0): 107, 148, 72, + (97,206,0): 107, 147, 76, + (97,207,0): 104, 145, 75, + (97,208,0): 109, 145, 81, + (97,209,0): 110, 146, 84, + (97,210,0): 109, 148, 83, + (97,211,0): 109, 148, 81, + (97,212,0): 107, 147, 76, + (97,213,0): 107, 148, 72, + (97,214,0): 108, 151, 72, + (97,215,0): 109, 152, 72, + (97,216,0): 112, 157, 74, + (97,217,0): 112, 157, 74, + (97,218,0): 112, 160, 76, + (97,219,0): 115, 162, 81, + (97,220,0): 117, 166, 84, + (97,221,0): 120, 169, 88, + (97,222,0): 120, 169, 88, + (97,223,0): 120, 168, 94, + (97,224,0): 110, 152, 89, + (97,225,0): 100, 141, 83, + (97,226,0): 90, 131, 73, + (98,0,0): 93, 84, 69, + (98,1,0): 93, 84, 69, + (98,2,0): 93, 84, 69, + (98,3,0): 93, 84, 69, + (98,4,0): 93, 84, 69, + (98,5,0): 93, 84, 69, + (98,6,0): 93, 84, 69, + (98,7,0): 93, 84, 69, + (98,8,0): 91, 82, 67, + (98,9,0): 92, 83, 68, + (98,10,0): 93, 84, 69, + (98,11,0): 94, 85, 70, + (98,12,0): 95, 86, 71, + (98,13,0): 96, 87, 72, + (98,14,0): 97, 88, 73, + (98,15,0): 97, 88, 71, + (98,16,0): 101, 93, 74, + (98,17,0): 101, 93, 72, + (98,18,0): 100, 91, 74, + (98,19,0): 100, 91, 76, + (98,20,0): 101, 91, 81, + (98,21,0): 102, 91, 85, + (98,22,0): 104, 93, 89, + (98,23,0): 104, 93, 91, + (98,24,0): 105, 93, 93, + (98,25,0): 106, 94, 94, + (98,26,0): 107, 95, 95, + (98,27,0): 107, 95, 95, + (98,28,0): 105, 94, 92, + (98,29,0): 102, 91, 89, + (98,30,0): 98, 87, 83, + (98,31,0): 95, 86, 81, + (98,32,0): 90, 86, 77, + (98,33,0): 87, 84, 75, + (98,34,0): 85, 81, 72, + (98,35,0): 82, 78, 67, + (98,36,0): 81, 77, 66, + (98,37,0): 83, 79, 67, + (98,38,0): 87, 81, 67, + (98,39,0): 88, 82, 66, + (98,40,0): 94, 87, 71, + (98,41,0): 94, 87, 69, + (98,42,0): 97, 89, 70, + (98,43,0): 99, 91, 70, + (98,44,0): 103, 92, 72, + (98,45,0): 105, 94, 72, + (98,46,0): 107, 96, 74, + (98,47,0): 105, 97, 76, + (98,48,0): 101, 96, 77, + (98,49,0): 113, 101, 85, + (98,50,0): 123, 94, 80, + (98,51,0): 136, 88, 78, + (98,52,0): 162, 91, 85, + (98,53,0): 175, 88, 81, + (98,54,0): 177, 74, 69, + (98,55,0): 182, 71, 64, + (98,56,0): 182, 65, 55, + (98,57,0): 183, 63, 49, + (98,58,0): 182, 60, 47, + (98,59,0): 184, 56, 43, + (98,60,0): 189, 55, 43, + (98,61,0): 197, 57, 44, + (98,62,0): 204, 57, 47, + (98,63,0): 211, 57, 47, + (98,64,0): 217, 56, 46, + (98,65,0): 219, 55, 45, + (98,66,0): 219, 55, 45, + (98,67,0): 219, 57, 46, + (98,68,0): 218, 56, 45, + (98,69,0): 217, 55, 44, + (98,70,0): 217, 55, 44, + (98,71,0): 215, 55, 43, + (98,72,0): 215, 55, 43, + (98,73,0): 213, 55, 43, + (98,74,0): 213, 55, 43, + (98,75,0): 212, 56, 43, + (98,76,0): 212, 56, 43, + (98,77,0): 212, 56, 43, + (98,78,0): 210, 57, 43, + (98,79,0): 205, 59, 44, + (98,80,0): 192, 62, 48, + (98,81,0): 182, 62, 46, + (98,82,0): 173, 58, 40, + (98,83,0): 163, 50, 32, + (98,84,0): 163, 51, 31, + (98,85,0): 170, 58, 38, + (98,86,0): 179, 62, 44, + (98,87,0): 185, 62, 46, + (98,88,0): 196, 63, 48, + (98,89,0): 196, 56, 43, + (98,90,0): 197, 50, 40, + (98,91,0): 200, 52, 42, + (98,92,0): 208, 60, 48, + (98,93,0): 216, 70, 57, + (98,94,0): 220, 77, 63, + (98,95,0): 225, 78, 68, + (98,96,0): 216, 59, 54, + (98,97,0): 215, 53, 51, + (98,98,0): 210, 51, 48, + (98,99,0): 211, 53, 50, + (98,100,0): 216, 58, 55, + (98,101,0): 222, 63, 60, + (98,102,0): 227, 62, 60, + (98,103,0): 232, 60, 60, + (98,104,0): 236, 57, 60, + (98,105,0): 237, 54, 58, + (98,106,0): 234, 51, 55, + (98,107,0): 231, 51, 54, + (98,108,0): 230, 54, 56, + (98,109,0): 227, 57, 57, + (98,110,0): 224, 60, 58, + (98,111,0): 217, 64, 58, + (98,112,0): 193, 55, 45, + (98,113,0): 184, 56, 43, + (98,114,0): 179, 53, 39, + (98,115,0): 175, 52, 37, + (98,116,0): 175, 52, 37, + (98,117,0): 178, 55, 40, + (98,118,0): 182, 59, 43, + (98,119,0): 187, 61, 46, + (98,120,0): 200, 68, 53, + (98,121,0): 205, 67, 54, + (98,122,0): 213, 66, 56, + (98,123,0): 217, 63, 55, + (98,124,0): 223, 58, 52, + (98,125,0): 229, 56, 52, + (98,126,0): 234, 54, 53, + (98,127,0): 238, 55, 57, + (98,128,0): 234, 54, 57, + (98,129,0): 233, 54, 57, + (98,130,0): 233, 54, 57, + (98,131,0): 231, 55, 55, + (98,132,0): 231, 55, 55, + (98,133,0): 230, 57, 53, + (98,134,0): 229, 57, 53, + (98,135,0): 229, 58, 51, + (98,136,0): 227, 58, 51, + (98,137,0): 228, 59, 52, + (98,138,0): 228, 59, 54, + (98,139,0): 227, 60, 54, + (98,140,0): 227, 59, 56, + (98,141,0): 226, 58, 57, + (98,142,0): 225, 57, 57, + (98,143,0): 222, 56, 56, + (98,144,0): 221, 57, 58, + (98,145,0): 220, 60, 60, + (98,146,0): 218, 64, 62, + (98,147,0): 211, 66, 61, + (98,148,0): 200, 63, 57, + (98,149,0): 185, 58, 49, + (98,150,0): 173, 55, 43, + (98,151,0): 165, 55, 40, + (98,152,0): 161, 59, 44, + (98,153,0): 157, 60, 43, + (98,154,0): 153, 60, 43, + (98,155,0): 148, 59, 41, + (98,156,0): 147, 58, 40, + (98,157,0): 144, 57, 38, + (98,158,0): 144, 55, 37, + (98,159,0): 138, 57, 38, + (98,160,0): 122, 54, 35, + (98,161,0): 121, 54, 37, + (98,162,0): 136, 57, 44, + (98,163,0): 160, 70, 61, + (98,164,0): 185, 83, 79, + (98,165,0): 192, 87, 84, + (98,166,0): 184, 80, 79, + (98,167,0): 171, 73, 70, + (98,168,0): 162, 77, 72, + (98,169,0): 156, 83, 76, + (98,170,0): 153, 89, 80, + (98,171,0): 151, 94, 83, + (98,172,0): 151, 97, 87, + (98,173,0): 151, 97, 87, + (98,174,0): 152, 95, 86, + (98,175,0): 139, 101, 80, + (98,176,0): 115, 114, 70, + (98,177,0): 122, 141, 86, + (98,178,0): 147, 166, 110, + (98,179,0): 164, 185, 128, + (98,180,0): 171, 192, 135, + (98,181,0): 158, 179, 123, + (98,182,0): 124, 144, 91, + (98,183,0): 91, 111, 60, + (98,184,0): 63, 82, 36, + (98,185,0): 65, 83, 43, + (98,186,0): 65, 80, 47, + (98,187,0): 63, 76, 50, + (98,188,0): 58, 67, 48, + (98,189,0): 54, 60, 46, + (98,190,0): 54, 57, 48, + (98,191,0): 53, 56, 47, + (98,192,0): 57, 59, 46, + (98,193,0): 64, 65, 51, + (98,194,0): 61, 63, 52, + (98,195,0): 57, 60, 49, + (98,196,0): 61, 65, 51, + (98,197,0): 57, 66, 47, + (98,198,0): 64, 77, 51, + (98,199,0): 81, 99, 61, + (98,200,0): 96, 118, 71, + (98,201,0): 105, 133, 74, + (98,202,0): 115, 146, 79, + (98,203,0): 114, 150, 78, + (98,204,0): 112, 148, 74, + (98,205,0): 109, 150, 74, + (98,206,0): 109, 149, 78, + (98,207,0): 107, 148, 78, + (98,208,0): 112, 148, 84, + (98,209,0): 113, 149, 85, + (98,210,0): 111, 150, 83, + (98,211,0): 110, 150, 80, + (98,212,0): 108, 148, 75, + (98,213,0): 108, 149, 73, + (98,214,0): 108, 151, 72, + (98,215,0): 110, 153, 73, + (98,216,0): 112, 157, 76, + (98,217,0): 112, 157, 76, + (98,218,0): 112, 159, 78, + (98,219,0): 117, 164, 83, + (98,220,0): 120, 169, 88, + (98,221,0): 121, 170, 91, + (98,222,0): 117, 166, 87, + (98,223,0): 113, 160, 88, + (98,224,0): 95, 137, 74, + (98,225,0): 86, 127, 69, + (98,226,0): 79, 120, 62, + (99,0,0): 97, 88, 73, + (99,1,0): 97, 88, 73, + (99,2,0): 97, 88, 73, + (99,3,0): 97, 88, 73, + (99,4,0): 97, 88, 73, + (99,5,0): 97, 88, 73, + (99,6,0): 97, 88, 73, + (99,7,0): 97, 88, 73, + (99,8,0): 95, 86, 71, + (99,9,0): 96, 87, 72, + (99,10,0): 96, 87, 72, + (99,11,0): 97, 88, 73, + (99,12,0): 98, 89, 74, + (99,13,0): 99, 90, 75, + (99,14,0): 100, 91, 76, + (99,15,0): 100, 91, 74, + (99,16,0): 101, 93, 72, + (99,17,0): 102, 94, 71, + (99,18,0): 102, 94, 73, + (99,19,0): 103, 95, 76, + (99,20,0): 103, 94, 79, + (99,21,0): 102, 92, 80, + (99,22,0): 102, 92, 82, + (99,23,0): 102, 92, 83, + (99,24,0): 104, 93, 87, + (99,25,0): 104, 93, 87, + (99,26,0): 104, 93, 87, + (99,27,0): 104, 94, 85, + (99,28,0): 103, 93, 84, + (99,29,0): 101, 91, 81, + (99,30,0): 100, 90, 80, + (99,31,0): 99, 91, 78, + (99,32,0): 93, 89, 77, + (99,33,0): 90, 86, 74, + (99,34,0): 86, 82, 70, + (99,35,0): 82, 78, 66, + (99,36,0): 80, 76, 64, + (99,37,0): 80, 77, 62, + (99,38,0): 84, 78, 64, + (99,39,0): 85, 79, 63, + (99,40,0): 87, 81, 65, + (99,41,0): 89, 84, 65, + (99,42,0): 91, 86, 67, + (99,43,0): 93, 88, 68, + (99,44,0): 97, 90, 71, + (99,45,0): 100, 93, 74, + (99,46,0): 102, 95, 76, + (99,47,0): 102, 97, 77, + (99,48,0): 103, 97, 81, + (99,49,0): 111, 99, 85, + (99,50,0): 119, 91, 79, + (99,51,0): 138, 91, 81, + (99,52,0): 169, 98, 92, + (99,53,0): 182, 91, 88, + (99,54,0): 180, 71, 68, + (99,55,0): 183, 61, 58, + (99,56,0): 193, 61, 56, + (99,57,0): 195, 60, 54, + (99,58,0): 195, 58, 48, + (99,59,0): 193, 57, 45, + (99,60,0): 189, 56, 41, + (99,61,0): 189, 57, 42, + (99,62,0): 193, 61, 46, + (99,63,0): 202, 62, 47, + (99,64,0): 213, 57, 45, + (99,65,0): 217, 55, 44, + (99,66,0): 218, 56, 45, + (99,67,0): 217, 57, 45, + (99,68,0): 218, 56, 45, + (99,69,0): 216, 56, 44, + (99,70,0): 216, 56, 44, + (99,71,0): 213, 55, 43, + (99,72,0): 213, 55, 43, + (99,73,0): 212, 56, 43, + (99,74,0): 212, 56, 43, + (99,75,0): 212, 56, 43, + (99,76,0): 212, 56, 43, + (99,77,0): 212, 56, 43, + (99,78,0): 210, 57, 43, + (99,79,0): 205, 59, 44, + (99,80,0): 193, 63, 49, + (99,81,0): 182, 62, 46, + (99,82,0): 172, 57, 39, + (99,83,0): 162, 51, 32, + (99,84,0): 157, 51, 29, + (99,85,0): 162, 56, 34, + (99,86,0): 172, 61, 41, + (99,87,0): 181, 64, 46, + (99,88,0): 188, 63, 45, + (99,89,0): 191, 58, 43, + (99,90,0): 195, 55, 42, + (99,91,0): 197, 53, 42, + (99,92,0): 203, 55, 43, + (99,93,0): 206, 58, 46, + (99,94,0): 206, 60, 47, + (99,95,0): 211, 58, 50, + (99,96,0): 220, 55, 53, + (99,97,0): 223, 50, 52, + (99,98,0): 218, 50, 50, + (99,99,0): 218, 52, 52, + (99,100,0): 222, 56, 56, + (99,101,0): 226, 60, 60, + (99,102,0): 232, 62, 63, + (99,103,0): 235, 61, 62, + (99,104,0): 235, 56, 60, + (99,105,0): 235, 52, 56, + (99,106,0): 232, 49, 54, + (99,107,0): 229, 50, 53, + (99,108,0): 228, 54, 56, + (99,109,0): 224, 56, 55, + (99,110,0): 217, 55, 53, + (99,111,0): 204, 55, 49, + (99,112,0): 185, 51, 40, + (99,113,0): 177, 54, 39, + (99,114,0): 175, 53, 38, + (99,115,0): 174, 54, 38, + (99,116,0): 174, 54, 38, + (99,117,0): 176, 56, 40, + (99,118,0): 179, 58, 41, + (99,119,0): 181, 58, 42, + (99,120,0): 195, 65, 49, + (99,121,0): 202, 66, 52, + (99,122,0): 210, 66, 55, + (99,123,0): 217, 64, 56, + (99,124,0): 223, 60, 53, + (99,125,0): 227, 58, 53, + (99,126,0): 234, 56, 54, + (99,127,0): 236, 56, 55, + (99,128,0): 237, 54, 56, + (99,129,0): 235, 55, 56, + (99,130,0): 235, 55, 56, + (99,131,0): 234, 56, 54, + (99,132,0): 234, 56, 54, + (99,133,0): 232, 57, 52, + (99,134,0): 231, 58, 52, + (99,135,0): 230, 59, 52, + (99,136,0): 226, 57, 50, + (99,137,0): 225, 58, 50, + (99,138,0): 223, 58, 52, + (99,139,0): 224, 59, 55, + (99,140,0): 222, 58, 56, + (99,141,0): 220, 58, 56, + (99,142,0): 219, 57, 55, + (99,143,0): 217, 57, 57, + (99,144,0): 214, 60, 58, + (99,145,0): 213, 64, 60, + (99,146,0): 210, 67, 61, + (99,147,0): 202, 65, 59, + (99,148,0): 187, 59, 50, + (99,149,0): 175, 54, 43, + (99,150,0): 164, 54, 39, + (99,151,0): 158, 55, 40, + (99,152,0): 156, 59, 42, + (99,153,0): 152, 59, 41, + (99,154,0): 148, 59, 41, + (99,155,0): 146, 59, 40, + (99,156,0): 143, 58, 38, + (99,157,0): 141, 56, 36, + (99,158,0): 140, 55, 35, + (99,159,0): 135, 57, 37, + (99,160,0): 128, 61, 42, + (99,161,0): 118, 53, 35, + (99,162,0): 129, 53, 39, + (99,163,0): 153, 69, 58, + (99,164,0): 170, 80, 72, + (99,165,0): 172, 77, 71, + (99,166,0): 169, 76, 71, + (99,167,0): 166, 81, 76, + (99,168,0): 157, 80, 74, + (99,169,0): 152, 85, 76, + (99,170,0): 148, 90, 79, + (99,171,0): 148, 94, 82, + (99,172,0): 149, 97, 86, + (99,173,0): 149, 97, 86, + (99,174,0): 151, 97, 87, + (99,175,0): 141, 103, 84, + (99,176,0): 137, 133, 95, + (99,177,0): 153, 169, 120, + (99,178,0): 173, 189, 142, + (99,179,0): 166, 184, 136, + (99,180,0): 144, 161, 116, + (99,181,0): 115, 134, 89, + (99,182,0): 78, 96, 56, + (99,183,0): 47, 65, 27, + (99,184,0): 45, 62, 28, + (99,185,0): 51, 66, 37, + (99,186,0): 58, 70, 46, + (99,187,0): 61, 70, 51, + (99,188,0): 59, 65, 51, + (99,189,0): 58, 61, 50, + (99,190,0): 58, 61, 52, + (99,191,0): 60, 61, 53, + (99,192,0): 57, 57, 45, + (99,193,0): 63, 64, 50, + (99,194,0): 60, 62, 51, + (99,195,0): 57, 60, 49, + (99,196,0): 60, 64, 50, + (99,197,0): 57, 66, 47, + (99,198,0): 63, 76, 50, + (99,199,0): 80, 98, 60, + (99,200,0): 97, 119, 72, + (99,201,0): 106, 134, 75, + (99,202,0): 116, 147, 80, + (99,203,0): 115, 151, 79, + (99,204,0): 114, 150, 76, + (99,205,0): 111, 152, 76, + (99,206,0): 111, 151, 80, + (99,207,0): 109, 151, 79, + (99,208,0): 112, 151, 84, + (99,209,0): 115, 152, 85, + (99,210,0): 112, 152, 82, + (99,211,0): 111, 151, 80, + (99,212,0): 109, 150, 74, + (99,213,0): 109, 150, 72, + (99,214,0): 110, 153, 74, + (99,215,0): 112, 155, 75, + (99,216,0): 113, 158, 77, + (99,217,0): 114, 159, 78, + (99,218,0): 116, 163, 83, + (99,219,0): 121, 168, 88, + (99,220,0): 123, 172, 93, + (99,221,0): 119, 167, 91, + (99,222,0): 109, 157, 83, + (99,223,0): 101, 146, 77, + (99,224,0): 90, 132, 69, + (99,225,0): 82, 123, 65, + (99,226,0): 77, 118, 60, + (100,0,0): 99, 90, 75, + (100,1,0): 99, 90, 75, + (100,2,0): 99, 90, 75, + (100,3,0): 99, 90, 75, + (100,4,0): 99, 90, 75, + (100,5,0): 99, 90, 75, + (100,6,0): 99, 90, 75, + (100,7,0): 99, 90, 75, + (100,8,0): 99, 90, 75, + (100,9,0): 99, 90, 75, + (100,10,0): 100, 91, 76, + (100,11,0): 100, 91, 76, + (100,12,0): 101, 92, 77, + (100,13,0): 102, 93, 78, + (100,14,0): 102, 93, 78, + (100,15,0): 102, 93, 76, + (100,16,0): 102, 94, 71, + (100,17,0): 103, 95, 72, + (100,18,0): 104, 96, 73, + (100,19,0): 105, 97, 76, + (100,20,0): 105, 97, 78, + (100,21,0): 105, 96, 79, + (100,22,0): 104, 95, 80, + (100,23,0): 103, 94, 79, + (100,24,0): 106, 96, 84, + (100,25,0): 105, 96, 81, + (100,26,0): 105, 96, 81, + (100,27,0): 104, 95, 78, + (100,28,0): 104, 95, 78, + (100,29,0): 104, 96, 77, + (100,30,0): 104, 96, 77, + (100,31,0): 104, 97, 78, + (100,32,0): 100, 94, 78, + (100,33,0): 96, 90, 76, + (100,34,0): 91, 85, 71, + (100,35,0): 86, 80, 66, + (100,36,0): 80, 77, 62, + (100,37,0): 78, 75, 58, + (100,38,0): 78, 75, 58, + (100,39,0): 78, 75, 58, + (100,40,0): 80, 77, 60, + (100,41,0): 82, 79, 62, + (100,42,0): 84, 81, 64, + (100,43,0): 86, 83, 64, + (100,44,0): 88, 87, 67, + (100,45,0): 91, 90, 70, + (100,46,0): 93, 92, 72, + (100,47,0): 95, 92, 75, + (100,48,0): 99, 96, 81, + (100,49,0): 105, 93, 81, + (100,50,0): 112, 85, 74, + (100,51,0): 134, 91, 82, + (100,52,0): 172, 105, 99, + (100,53,0): 189, 100, 96, + (100,54,0): 191, 79, 77, + (100,55,0): 197, 67, 67, + (100,56,0): 205, 61, 61, + (100,57,0): 210, 58, 57, + (100,58,0): 209, 57, 52, + (100,59,0): 203, 56, 48, + (100,60,0): 194, 56, 43, + (100,61,0): 187, 60, 41, + (100,62,0): 184, 65, 43, + (100,63,0): 190, 65, 43, + (100,64,0): 208, 58, 43, + (100,65,0): 215, 55, 41, + (100,66,0): 216, 56, 42, + (100,67,0): 215, 58, 43, + (100,68,0): 217, 57, 43, + (100,69,0): 214, 57, 42, + (100,70,0): 214, 57, 42, + (100,71,0): 212, 56, 41, + (100,72,0): 212, 56, 41, + (100,73,0): 212, 56, 41, + (100,74,0): 212, 56, 41, + (100,75,0): 210, 57, 41, + (100,76,0): 210, 57, 41, + (100,77,0): 210, 57, 41, + (100,78,0): 210, 57, 41, + (100,79,0): 205, 59, 44, + (100,80,0): 193, 63, 49, + (100,81,0): 182, 62, 48, + (100,82,0): 171, 58, 40, + (100,83,0): 161, 54, 34, + (100,84,0): 154, 52, 30, + (100,85,0): 155, 55, 32, + (100,86,0): 163, 61, 38, + (100,87,0): 175, 66, 45, + (100,88,0): 179, 59, 42, + (100,89,0): 186, 59, 44, + (100,90,0): 194, 58, 44, + (100,91,0): 199, 57, 45, + (100,92,0): 203, 56, 46, + (100,93,0): 206, 58, 48, + (100,94,0): 208, 60, 48, + (100,95,0): 216, 59, 52, + (100,96,0): 232, 58, 60, + (100,97,0): 234, 53, 60, + (100,98,0): 228, 51, 57, + (100,99,0): 226, 51, 56, + (100,100,0): 223, 53, 56, + (100,101,0): 223, 53, 56, + (100,102,0): 225, 52, 56, + (100,103,0): 225, 51, 53, + (100,104,0): 233, 54, 60, + (100,105,0): 232, 53, 57, + (100,106,0): 231, 52, 58, + (100,107,0): 230, 56, 58, + (100,108,0): 226, 57, 60, + (100,109,0): 218, 56, 54, + (100,110,0): 206, 51, 49, + (100,111,0): 191, 48, 40, + (100,112,0): 181, 53, 40, + (100,113,0): 174, 57, 40, + (100,114,0): 174, 57, 40, + (100,115,0): 173, 58, 40, + (100,116,0): 173, 58, 40, + (100,117,0): 173, 58, 40, + (100,118,0): 173, 56, 38, + (100,119,0): 175, 55, 38, + (100,120,0): 184, 58, 43, + (100,121,0): 193, 59, 47, + (100,122,0): 205, 63, 51, + (100,123,0): 215, 64, 55, + (100,124,0): 221, 62, 56, + (100,125,0): 225, 60, 56, + (100,126,0): 231, 58, 54, + (100,127,0): 235, 57, 55, + (100,128,0): 237, 55, 54, + (100,129,0): 238, 54, 54, + (100,130,0): 238, 54, 54, + (100,131,0): 237, 55, 52, + (100,132,0): 234, 56, 52, + (100,133,0): 232, 58, 51, + (100,134,0): 231, 58, 51, + (100,135,0): 228, 60, 51, + (100,136,0): 225, 58, 50, + (100,137,0): 223, 59, 50, + (100,138,0): 223, 60, 53, + (100,139,0): 220, 61, 55, + (100,140,0): 219, 61, 58, + (100,141,0): 217, 62, 60, + (100,142,0): 215, 61, 59, + (100,143,0): 212, 62, 61, + (100,144,0): 207, 64, 60, + (100,145,0): 203, 66, 60, + (100,146,0): 197, 66, 58, + (100,147,0): 185, 61, 53, + (100,148,0): 173, 55, 45, + (100,149,0): 163, 53, 40, + (100,150,0): 158, 55, 40, + (100,151,0): 154, 58, 42, + (100,152,0): 150, 59, 41, + (100,153,0): 147, 60, 41, + (100,154,0): 145, 59, 42, + (100,155,0): 141, 58, 40, + (100,156,0): 138, 57, 38, + (100,157,0): 137, 56, 37, + (100,158,0): 136, 55, 36, + (100,159,0): 131, 56, 37, + (100,160,0): 131, 64, 45, + (100,161,0): 117, 52, 34, + (100,162,0): 123, 51, 37, + (100,163,0): 147, 71, 58, + (100,164,0): 164, 81, 73, + (100,165,0): 161, 78, 70, + (100,166,0): 158, 78, 71, + (100,167,0): 161, 87, 78, + (100,168,0): 152, 85, 76, + (100,169,0): 146, 88, 76, + (100,170,0): 144, 90, 78, + (100,171,0): 141, 92, 78, + (100,172,0): 143, 93, 82, + (100,173,0): 148, 96, 85, + (100,174,0): 151, 97, 87, + (100,175,0): 143, 104, 87, + (100,176,0): 141, 137, 102, + (100,177,0): 152, 165, 122, + (100,178,0): 157, 169, 129, + (100,179,0): 128, 142, 106, + (100,180,0): 93, 107, 72, + (100,181,0): 68, 83, 52, + (100,182,0): 50, 64, 38, + (100,183,0): 36, 50, 25, + (100,184,0): 45, 58, 38, + (100,185,0): 48, 59, 42, + (100,186,0): 53, 61, 46, + (100,187,0): 57, 63, 51, + (100,188,0): 60, 63, 52, + (100,189,0): 61, 63, 52, + (100,190,0): 58, 59, 51, + (100,191,0): 58, 58, 48, + (100,192,0): 57, 57, 45, + (100,193,0): 62, 63, 49, + (100,194,0): 59, 61, 50, + (100,195,0): 56, 59, 48, + (100,196,0): 59, 63, 49, + (100,197,0): 56, 65, 46, + (100,198,0): 62, 75, 49, + (100,199,0): 80, 98, 60, + (100,200,0): 98, 120, 73, + (100,201,0): 107, 135, 76, + (100,202,0): 117, 148, 81, + (100,203,0): 116, 152, 80, + (100,204,0): 115, 151, 77, + (100,205,0): 113, 154, 78, + (100,206,0): 113, 153, 82, + (100,207,0): 111, 153, 81, + (100,208,0): 114, 154, 83, + (100,209,0): 114, 154, 83, + (100,210,0): 114, 154, 81, + (100,211,0): 112, 153, 77, + (100,212,0): 109, 151, 75, + (100,213,0): 109, 152, 73, + (100,214,0): 112, 155, 76, + (100,215,0): 115, 158, 79, + (100,216,0): 116, 160, 81, + (100,217,0): 118, 162, 83, + (100,218,0): 120, 167, 89, + (100,219,0): 123, 169, 94, + (100,220,0): 122, 168, 95, + (100,221,0): 113, 159, 86, + (100,222,0): 100, 146, 74, + (100,223,0): 89, 134, 67, + (100,224,0): 92, 133, 73, + (100,225,0): 85, 124, 69, + (100,226,0): 81, 120, 65, + (101,0,0): 101, 92, 77, + (101,1,0): 101, 92, 77, + (101,2,0): 101, 92, 77, + (101,3,0): 101, 92, 77, + (101,4,0): 101, 92, 77, + (101,5,0): 101, 92, 77, + (101,6,0): 101, 92, 77, + (101,7,0): 101, 92, 77, + (101,8,0): 101, 92, 77, + (101,9,0): 102, 93, 78, + (101,10,0): 102, 93, 78, + (101,11,0): 102, 93, 78, + (101,12,0): 103, 94, 79, + (101,13,0): 103, 94, 79, + (101,14,0): 104, 95, 80, + (101,15,0): 104, 95, 78, + (101,16,0): 103, 95, 74, + (101,17,0): 104, 96, 73, + (101,18,0): 105, 97, 76, + (101,19,0): 106, 98, 77, + (101,20,0): 106, 98, 79, + (101,21,0): 106, 98, 79, + (101,22,0): 106, 97, 80, + (101,23,0): 106, 97, 80, + (101,24,0): 106, 97, 80, + (101,25,0): 105, 97, 78, + (101,26,0): 104, 96, 77, + (101,27,0): 104, 96, 75, + (101,28,0): 104, 96, 75, + (101,29,0): 104, 96, 73, + (101,30,0): 105, 97, 74, + (101,31,0): 106, 98, 75, + (101,32,0): 102, 95, 77, + (101,33,0): 98, 93, 74, + (101,34,0): 94, 88, 72, + (101,35,0): 88, 82, 66, + (101,36,0): 83, 77, 61, + (101,37,0): 77, 74, 57, + (101,38,0): 75, 72, 55, + (101,39,0): 73, 72, 54, + (101,40,0): 75, 74, 56, + (101,41,0): 76, 75, 57, + (101,42,0): 76, 77, 59, + (101,43,0): 78, 79, 61, + (101,44,0): 80, 81, 63, + (101,45,0): 81, 84, 65, + (101,46,0): 83, 86, 69, + (101,47,0): 84, 85, 69, + (101,48,0): 92, 88, 76, + (101,49,0): 95, 85, 73, + (101,50,0): 100, 80, 69, + (101,51,0): 124, 87, 78, + (101,52,0): 161, 104, 97, + (101,53,0): 181, 102, 97, + (101,54,0): 193, 88, 85, + (101,55,0): 211, 83, 82, + (101,56,0): 214, 65, 67, + (101,57,0): 220, 60, 62, + (101,58,0): 219, 57, 55, + (101,59,0): 210, 56, 48, + (101,60,0): 200, 58, 46, + (101,61,0): 189, 62, 43, + (101,62,0): 178, 66, 42, + (101,63,0): 183, 64, 40, + (101,64,0): 204, 59, 42, + (101,65,0): 212, 55, 40, + (101,66,0): 213, 56, 41, + (101,67,0): 213, 57, 42, + (101,68,0): 214, 57, 42, + (101,69,0): 213, 57, 42, + (101,70,0): 213, 57, 42, + (101,71,0): 212, 56, 41, + (101,72,0): 212, 56, 41, + (101,73,0): 210, 57, 41, + (101,74,0): 210, 57, 41, + (101,75,0): 210, 57, 41, + (101,76,0): 210, 57, 41, + (101,77,0): 210, 57, 41, + (101,78,0): 210, 57, 41, + (101,79,0): 205, 59, 44, + (101,80,0): 193, 63, 49, + (101,81,0): 181, 61, 47, + (101,82,0): 171, 60, 41, + (101,83,0): 162, 57, 36, + (101,84,0): 153, 54, 31, + (101,85,0): 149, 53, 29, + (101,86,0): 155, 59, 34, + (101,87,0): 167, 65, 42, + (101,88,0): 178, 66, 46, + (101,89,0): 185, 64, 47, + (101,90,0): 191, 59, 44, + (101,91,0): 195, 55, 42, + (101,92,0): 197, 50, 40, + (101,93,0): 203, 52, 43, + (101,94,0): 210, 59, 48, + (101,95,0): 223, 61, 56, + (101,96,0): 233, 54, 58, + (101,97,0): 237, 52, 60, + (101,98,0): 234, 55, 61, + (101,99,0): 232, 57, 62, + (101,100,0): 229, 59, 62, + (101,101,0): 228, 59, 62, + (101,102,0): 225, 59, 61, + (101,103,0): 224, 58, 60, + (101,104,0): 223, 53, 56, + (101,105,0): 224, 55, 58, + (101,106,0): 226, 57, 62, + (101,107,0): 224, 61, 62, + (101,108,0): 217, 61, 62, + (101,109,0): 207, 58, 54, + (101,110,0): 194, 51, 47, + (101,111,0): 181, 48, 39, + (101,112,0): 177, 57, 43, + (101,113,0): 172, 61, 42, + (101,114,0): 172, 61, 42, + (101,115,0): 171, 62, 42, + (101,116,0): 170, 61, 41, + (101,117,0): 169, 60, 40, + (101,118,0): 169, 58, 39, + (101,119,0): 171, 56, 37, + (101,120,0): 175, 54, 37, + (101,121,0): 183, 56, 41, + (101,122,0): 197, 59, 48, + (101,123,0): 206, 62, 51, + (101,124,0): 214, 61, 53, + (101,125,0): 222, 60, 55, + (101,126,0): 227, 59, 56, + (101,127,0): 232, 59, 55, + (101,128,0): 236, 56, 55, + (101,129,0): 239, 55, 53, + (101,130,0): 239, 55, 53, + (101,131,0): 238, 56, 53, + (101,132,0): 235, 58, 52, + (101,133,0): 233, 59, 52, + (101,134,0): 231, 60, 52, + (101,135,0): 228, 61, 52, + (101,136,0): 226, 62, 53, + (101,137,0): 224, 63, 55, + (101,138,0): 222, 65, 58, + (101,139,0): 218, 65, 59, + (101,140,0): 217, 65, 62, + (101,141,0): 213, 65, 63, + (101,142,0): 209, 64, 61, + (101,143,0): 205, 66, 63, + (101,144,0): 195, 63, 58, + (101,145,0): 187, 64, 56, + (101,146,0): 179, 61, 51, + (101,147,0): 170, 56, 45, + (101,148,0): 161, 53, 40, + (101,149,0): 155, 53, 39, + (101,150,0): 152, 56, 40, + (101,151,0): 149, 60, 42, + (101,152,0): 145, 60, 40, + (101,153,0): 141, 60, 41, + (101,154,0): 138, 60, 40, + (101,155,0): 136, 58, 38, + (101,156,0): 134, 57, 39, + (101,157,0): 132, 55, 37, + (101,158,0): 131, 54, 36, + (101,159,0): 127, 54, 37, + (101,160,0): 125, 58, 41, + (101,161,0): 116, 51, 33, + (101,162,0): 126, 57, 42, + (101,163,0): 151, 79, 65, + (101,164,0): 163, 89, 78, + (101,165,0): 156, 82, 71, + (101,166,0): 149, 79, 69, + (101,167,0): 152, 86, 74, + (101,168,0): 149, 89, 78, + (101,169,0): 144, 91, 77, + (101,170,0): 142, 90, 77, + (101,171,0): 140, 91, 77, + (101,172,0): 142, 92, 81, + (101,173,0): 147, 95, 84, + (101,174,0): 153, 96, 87, + (101,175,0): 145, 103, 87, + (101,176,0): 126, 120, 88, + (101,177,0): 121, 131, 94, + (101,178,0): 114, 124, 90, + (101,179,0): 85, 96, 66, + (101,180,0): 59, 69, 44, + (101,181,0): 47, 59, 37, + (101,182,0): 48, 59, 42, + (101,183,0): 48, 60, 46, + (101,184,0): 51, 61, 50, + (101,185,0): 52, 60, 49, + (101,186,0): 54, 60, 50, + (101,187,0): 60, 63, 54, + (101,188,0): 64, 65, 57, + (101,189,0): 63, 65, 54, + (101,190,0): 60, 60, 48, + (101,191,0): 55, 55, 43, + (101,192,0): 56, 57, 43, + (101,193,0): 62, 63, 49, + (101,194,0): 58, 60, 49, + (101,195,0): 55, 58, 47, + (101,196,0): 58, 62, 48, + (101,197,0): 55, 64, 45, + (101,198,0): 61, 74, 48, + (101,199,0): 79, 97, 59, + (101,200,0): 98, 120, 73, + (101,201,0): 107, 135, 76, + (101,202,0): 117, 148, 81, + (101,203,0): 117, 153, 81, + (101,204,0): 116, 152, 78, + (101,205,0): 113, 154, 78, + (101,206,0): 114, 154, 83, + (101,207,0): 112, 154, 82, + (101,208,0): 114, 154, 81, + (101,209,0): 115, 156, 80, + (101,210,0): 114, 155, 79, + (101,211,0): 112, 153, 75, + (101,212,0): 110, 153, 74, + (101,213,0): 112, 155, 76, + (101,214,0): 115, 158, 79, + (101,215,0): 118, 161, 82, + (101,216,0): 121, 165, 88, + (101,217,0): 123, 167, 90, + (101,218,0): 122, 168, 93, + (101,219,0): 120, 166, 93, + (101,220,0): 113, 159, 87, + (101,221,0): 103, 148, 79, + (101,222,0): 93, 138, 69, + (101,223,0): 88, 130, 66, + (101,224,0): 95, 134, 77, + (101,225,0): 87, 126, 71, + (101,226,0): 82, 121, 66, + (102,0,0): 103, 94, 79, + (102,1,0): 103, 94, 79, + (102,2,0): 103, 94, 79, + (102,3,0): 103, 94, 79, + (102,4,0): 103, 94, 79, + (102,5,0): 103, 94, 79, + (102,6,0): 103, 94, 79, + (102,7,0): 103, 94, 79, + (102,8,0): 103, 94, 79, + (102,9,0): 103, 94, 79, + (102,10,0): 103, 94, 79, + (102,11,0): 104, 95, 80, + (102,12,0): 104, 95, 80, + (102,13,0): 104, 95, 80, + (102,14,0): 104, 95, 80, + (102,15,0): 105, 96, 79, + (102,16,0): 106, 97, 80, + (102,17,0): 106, 98, 79, + (102,18,0): 106, 98, 79, + (102,19,0): 106, 98, 79, + (102,20,0): 105, 96, 79, + (102,21,0): 105, 96, 79, + (102,22,0): 105, 97, 78, + (102,23,0): 105, 97, 78, + (102,24,0): 105, 97, 78, + (102,25,0): 104, 96, 75, + (102,26,0): 104, 96, 75, + (102,27,0): 104, 96, 73, + (102,28,0): 104, 96, 73, + (102,29,0): 104, 97, 71, + (102,30,0): 104, 97, 71, + (102,31,0): 104, 97, 71, + (102,32,0): 102, 95, 76, + (102,33,0): 101, 94, 75, + (102,34,0): 98, 91, 73, + (102,35,0): 92, 87, 68, + (102,36,0): 87, 82, 63, + (102,37,0): 80, 77, 58, + (102,38,0): 76, 73, 56, + (102,39,0): 73, 72, 54, + (102,40,0): 73, 72, 54, + (102,41,0): 71, 72, 54, + (102,42,0): 71, 74, 57, + (102,43,0): 71, 75, 58, + (102,44,0): 72, 76, 59, + (102,45,0): 73, 77, 60, + (102,46,0): 72, 79, 63, + (102,47,0): 74, 78, 63, + (102,48,0): 82, 80, 67, + (102,49,0): 89, 81, 70, + (102,50,0): 92, 78, 67, + (102,51,0): 105, 82, 68, + (102,52,0): 129, 89, 77, + (102,53,0): 149, 87, 76, + (102,54,0): 174, 84, 76, + (102,55,0): 209, 91, 89, + (102,56,0): 217, 75, 74, + (102,57,0): 223, 65, 66, + (102,58,0): 223, 57, 57, + (102,59,0): 217, 55, 50, + (102,60,0): 207, 59, 49, + (102,61,0): 195, 62, 45, + (102,62,0): 183, 64, 42, + (102,63,0): 180, 60, 36, + (102,64,0): 201, 58, 41, + (102,65,0): 211, 55, 40, + (102,66,0): 212, 56, 41, + (102,67,0): 211, 58, 42, + (102,68,0): 213, 57, 42, + (102,69,0): 211, 58, 42, + (102,70,0): 211, 58, 42, + (102,71,0): 211, 58, 42, + (102,72,0): 210, 57, 41, + (102,73,0): 209, 58, 41, + (102,74,0): 209, 58, 41, + (102,75,0): 209, 58, 41, + (102,76,0): 209, 58, 41, + (102,77,0): 209, 58, 41, + (102,78,0): 209, 58, 41, + (102,79,0): 205, 59, 44, + (102,80,0): 193, 61, 48, + (102,81,0): 181, 61, 47, + (102,82,0): 172, 61, 44, + (102,83,0): 163, 60, 41, + (102,84,0): 152, 56, 32, + (102,85,0): 144, 52, 27, + (102,86,0): 149, 57, 32, + (102,87,0): 161, 65, 41, + (102,88,0): 173, 67, 45, + (102,89,0): 182, 65, 47, + (102,90,0): 191, 61, 47, + (102,91,0): 192, 54, 43, + (102,92,0): 194, 47, 37, + (102,93,0): 199, 48, 39, + (102,94,0): 208, 54, 46, + (102,95,0): 222, 58, 56, + (102,96,0): 232, 53, 57, + (102,97,0): 238, 54, 62, + (102,98,0): 236, 59, 65, + (102,99,0): 233, 64, 67, + (102,100,0): 229, 66, 69, + (102,101,0): 224, 66, 67, + (102,102,0): 220, 64, 65, + (102,103,0): 217, 63, 63, + (102,104,0): 204, 50, 50, + (102,105,0): 207, 55, 54, + (102,106,0): 211, 58, 60, + (102,107,0): 207, 62, 59, + (102,108,0): 199, 60, 57, + (102,109,0): 189, 56, 49, + (102,110,0): 180, 53, 46, + (102,111,0): 171, 53, 41, + (102,112,0): 170, 60, 45, + (102,113,0): 167, 62, 43, + (102,114,0): 167, 62, 43, + (102,115,0): 166, 63, 44, + (102,116,0): 165, 62, 43, + (102,117,0): 166, 61, 40, + (102,118,0): 166, 59, 39, + (102,119,0): 169, 58, 39, + (102,120,0): 170, 55, 37, + (102,121,0): 177, 56, 39, + (102,122,0): 188, 56, 43, + (102,123,0): 195, 57, 46, + (102,124,0): 203, 56, 48, + (102,125,0): 211, 58, 52, + (102,126,0): 220, 61, 57, + (102,127,0): 228, 63, 59, + (102,128,0): 233, 58, 55, + (102,129,0): 236, 57, 53, + (102,130,0): 236, 57, 53, + (102,131,0): 235, 58, 52, + (102,132,0): 233, 59, 52, + (102,133,0): 232, 59, 52, + (102,134,0): 229, 61, 52, + (102,135,0): 226, 62, 52, + (102,136,0): 224, 66, 55, + (102,137,0): 221, 67, 57, + (102,138,0): 218, 67, 60, + (102,139,0): 213, 66, 59, + (102,140,0): 207, 65, 61, + (102,141,0): 202, 63, 60, + (102,142,0): 199, 61, 59, + (102,143,0): 191, 62, 57, + (102,144,0): 177, 60, 51, + (102,145,0): 169, 58, 47, + (102,146,0): 162, 56, 43, + (102,147,0): 156, 54, 40, + (102,148,0): 152, 55, 39, + (102,149,0): 148, 56, 41, + (102,150,0): 145, 58, 41, + (102,151,0): 141, 58, 40, + (102,152,0): 139, 61, 41, + (102,153,0): 137, 60, 42, + (102,154,0): 135, 60, 41, + (102,155,0): 131, 58, 39, + (102,156,0): 130, 57, 40, + (102,157,0): 128, 55, 38, + (102,158,0): 127, 54, 37, + (102,159,0): 125, 54, 36, + (102,160,0): 120, 51, 35, + (102,161,0): 120, 53, 37, + (102,162,0): 133, 66, 50, + (102,163,0): 152, 85, 69, + (102,164,0): 157, 87, 75, + (102,165,0): 148, 80, 67, + (102,166,0): 144, 80, 68, + (102,167,0): 149, 90, 76, + (102,168,0): 147, 89, 77, + (102,169,0): 144, 90, 78, + (102,170,0): 144, 92, 81, + (102,171,0): 144, 92, 81, + (102,172,0): 146, 91, 84, + (102,173,0): 149, 92, 85, + (102,174,0): 152, 91, 86, + (102,175,0): 142, 98, 85, + (102,176,0): 107, 98, 69, + (102,177,0): 86, 96, 61, + (102,178,0): 74, 83, 52, + (102,179,0): 61, 71, 44, + (102,180,0): 54, 63, 42, + (102,181,0): 50, 61, 44, + (102,182,0): 52, 62, 51, + (102,183,0): 53, 63, 54, + (102,184,0): 54, 61, 54, + (102,185,0): 56, 63, 56, + (102,186,0): 61, 66, 59, + (102,187,0): 67, 70, 61, + (102,188,0): 69, 71, 60, + (102,189,0): 67, 68, 54, + (102,190,0): 64, 62, 47, + (102,191,0): 59, 57, 42, + (102,192,0): 55, 56, 42, + (102,193,0): 61, 62, 48, + (102,194,0): 58, 60, 49, + (102,195,0): 55, 58, 47, + (102,196,0): 58, 62, 48, + (102,197,0): 54, 63, 44, + (102,198,0): 61, 74, 48, + (102,199,0): 78, 96, 58, + (102,200,0): 97, 119, 72, + (102,201,0): 107, 135, 76, + (102,202,0): 117, 148, 81, + (102,203,0): 117, 153, 81, + (102,204,0): 116, 152, 78, + (102,205,0): 114, 155, 79, + (102,206,0): 114, 154, 83, + (102,207,0): 112, 154, 80, + (102,208,0): 113, 155, 79, + (102,209,0): 114, 157, 78, + (102,210,0): 113, 156, 77, + (102,211,0): 112, 155, 76, + (102,212,0): 111, 154, 75, + (102,213,0): 114, 157, 78, + (102,214,0): 117, 161, 84, + (102,215,0): 121, 165, 88, + (102,216,0): 127, 171, 96, + (102,217,0): 126, 169, 97, + (102,218,0): 122, 165, 93, + (102,219,0): 113, 156, 85, + (102,220,0): 102, 145, 76, + (102,221,0): 95, 137, 71, + (102,222,0): 93, 135, 69, + (102,223,0): 94, 136, 73, + (102,224,0): 97, 136, 79, + (102,225,0): 89, 128, 73, + (102,226,0): 82, 121, 66, + (103,0,0): 104, 95, 80, + (103,1,0): 104, 95, 80, + (103,2,0): 104, 95, 80, + (103,3,0): 104, 95, 80, + (103,4,0): 104, 95, 80, + (103,5,0): 104, 95, 80, + (103,6,0): 104, 95, 80, + (103,7,0): 104, 95, 80, + (103,8,0): 103, 94, 79, + (103,9,0): 104, 95, 80, + (103,10,0): 104, 95, 80, + (103,11,0): 104, 95, 80, + (103,12,0): 104, 95, 80, + (103,13,0): 104, 95, 80, + (103,14,0): 105, 96, 81, + (103,15,0): 105, 96, 81, + (103,16,0): 109, 100, 85, + (103,17,0): 108, 99, 84, + (103,18,0): 106, 97, 82, + (103,19,0): 105, 96, 81, + (103,20,0): 104, 95, 80, + (103,21,0): 103, 94, 79, + (103,22,0): 103, 94, 77, + (103,23,0): 104, 96, 77, + (103,24,0): 105, 97, 78, + (103,25,0): 105, 97, 76, + (103,26,0): 105, 97, 76, + (103,27,0): 105, 97, 76, + (103,28,0): 104, 96, 73, + (103,29,0): 104, 96, 73, + (103,30,0): 104, 97, 71, + (103,31,0): 104, 96, 73, + (103,32,0): 103, 97, 75, + (103,33,0): 102, 95, 76, + (103,34,0): 101, 94, 75, + (103,35,0): 98, 91, 72, + (103,36,0): 92, 87, 68, + (103,37,0): 85, 82, 63, + (103,38,0): 80, 77, 60, + (103,39,0): 77, 76, 58, + (103,40,0): 69, 70, 52, + (103,41,0): 68, 71, 52, + (103,42,0): 68, 72, 55, + (103,43,0): 68, 72, 55, + (103,44,0): 66, 73, 57, + (103,45,0): 66, 75, 58, + (103,46,0): 66, 75, 58, + (103,47,0): 67, 74, 58, + (103,48,0): 74, 74, 62, + (103,49,0): 84, 80, 68, + (103,50,0): 85, 79, 65, + (103,51,0): 89, 76, 60, + (103,52,0): 101, 75, 58, + (103,53,0): 115, 69, 53, + (103,54,0): 146, 74, 62, + (103,55,0): 192, 91, 83, + (103,56,0): 215, 83, 79, + (103,57,0): 222, 70, 69, + (103,58,0): 223, 59, 58, + (103,59,0): 220, 55, 53, + (103,60,0): 213, 59, 51, + (103,61,0): 204, 61, 47, + (103,62,0): 189, 60, 41, + (103,63,0): 184, 55, 34, + (103,64,0): 203, 58, 41, + (103,65,0): 207, 56, 39, + (103,66,0): 208, 57, 40, + (103,67,0): 210, 59, 42, + (103,68,0): 210, 59, 42, + (103,69,0): 210, 59, 42, + (103,70,0): 210, 59, 42, + (103,71,0): 210, 59, 42, + (103,72,0): 209, 58, 41, + (103,73,0): 209, 58, 41, + (103,74,0): 209, 58, 41, + (103,75,0): 209, 58, 41, + (103,76,0): 209, 58, 41, + (103,77,0): 209, 58, 41, + (103,78,0): 209, 58, 41, + (103,79,0): 205, 59, 44, + (103,80,0): 193, 59, 48, + (103,81,0): 182, 58, 46, + (103,82,0): 173, 60, 44, + (103,83,0): 167, 62, 43, + (103,84,0): 153, 57, 35, + (103,85,0): 143, 51, 26, + (103,86,0): 147, 55, 30, + (103,87,0): 159, 63, 39, + (103,88,0): 163, 57, 35, + (103,89,0): 176, 59, 41, + (103,90,0): 192, 62, 48, + (103,91,0): 198, 60, 49, + (103,92,0): 204, 56, 46, + (103,93,0): 208, 55, 47, + (103,94,0): 217, 60, 53, + (103,95,0): 227, 63, 61, + (103,96,0): 236, 61, 66, + (103,97,0): 238, 63, 68, + (103,98,0): 233, 67, 69, + (103,99,0): 226, 68, 67, + (103,100,0): 214, 64, 63, + (103,101,0): 202, 59, 55, + (103,102,0): 192, 53, 48, + (103,103,0): 187, 49, 46, + (103,104,0): 183, 48, 44, + (103,105,0): 187, 54, 49, + (103,106,0): 190, 58, 54, + (103,107,0): 187, 60, 54, + (103,108,0): 179, 58, 50, + (103,109,0): 169, 57, 46, + (103,110,0): 164, 56, 44, + (103,111,0): 160, 58, 43, + (103,112,0): 161, 61, 45, + (103,113,0): 159, 62, 43, + (103,114,0): 160, 63, 44, + (103,115,0): 161, 64, 45, + (103,116,0): 161, 64, 45, + (103,117,0): 163, 64, 43, + (103,118,0): 163, 62, 42, + (103,119,0): 164, 61, 42, + (103,120,0): 169, 59, 42, + (103,121,0): 173, 58, 40, + (103,122,0): 178, 55, 40, + (103,123,0): 184, 54, 41, + (103,124,0): 191, 53, 43, + (103,125,0): 201, 57, 48, + (103,126,0): 212, 63, 57, + (103,127,0): 224, 67, 62, + (103,128,0): 229, 60, 55, + (103,129,0): 232, 59, 53, + (103,130,0): 232, 59, 53, + (103,131,0): 231, 60, 52, + (103,132,0): 229, 60, 53, + (103,133,0): 228, 61, 52, + (103,134,0): 225, 62, 53, + (103,135,0): 222, 64, 53, + (103,136,0): 220, 68, 57, + (103,137,0): 216, 68, 58, + (103,138,0): 210, 67, 59, + (103,139,0): 202, 65, 57, + (103,140,0): 196, 63, 58, + (103,141,0): 188, 59, 54, + (103,142,0): 184, 56, 53, + (103,143,0): 176, 57, 51, + (103,144,0): 162, 55, 45, + (103,145,0): 153, 56, 40, + (103,146,0): 149, 53, 39, + (103,147,0): 147, 54, 39, + (103,148,0): 145, 58, 41, + (103,149,0): 143, 60, 42, + (103,150,0): 139, 58, 41, + (103,151,0): 133, 56, 38, + (103,152,0): 136, 61, 42, + (103,153,0): 133, 60, 43, + (103,154,0): 131, 60, 42, + (103,155,0): 128, 60, 41, + (103,156,0): 126, 58, 39, + (103,157,0): 124, 56, 37, + (103,158,0): 123, 54, 38, + (103,159,0): 123, 54, 38, + (103,160,0): 121, 49, 35, + (103,161,0): 128, 56, 42, + (103,162,0): 140, 71, 56, + (103,163,0): 150, 83, 67, + (103,164,0): 146, 80, 66, + (103,165,0): 139, 76, 61, + (103,166,0): 144, 82, 69, + (103,167,0): 153, 95, 83, + (103,168,0): 145, 87, 76, + (103,169,0): 146, 89, 78, + (103,170,0): 148, 91, 82, + (103,171,0): 150, 93, 84, + (103,172,0): 150, 93, 86, + (103,173,0): 151, 92, 86, + (103,174,0): 150, 89, 84, + (103,175,0): 140, 94, 81, + (103,176,0): 97, 88, 59, + (103,177,0): 69, 77, 40, + (103,178,0): 54, 64, 30, + (103,179,0): 56, 65, 38, + (103,180,0): 62, 71, 50, + (103,181,0): 60, 69, 52, + (103,182,0): 51, 61, 50, + (103,183,0): 45, 55, 46, + (103,184,0): 49, 56, 49, + (103,185,0): 55, 62, 54, + (103,186,0): 66, 69, 60, + (103,187,0): 71, 74, 63, + (103,188,0): 72, 73, 59, + (103,189,0): 66, 67, 49, + (103,190,0): 63, 62, 42, + (103,191,0): 59, 58, 38, + (103,192,0): 55, 56, 40, + (103,193,0): 61, 62, 48, + (103,194,0): 57, 59, 48, + (103,195,0): 54, 57, 46, + (103,196,0): 58, 62, 48, + (103,197,0): 54, 63, 44, + (103,198,0): 60, 73, 47, + (103,199,0): 78, 96, 58, + (103,200,0): 97, 119, 72, + (103,201,0): 106, 134, 75, + (103,202,0): 117, 148, 81, + (103,203,0): 116, 152, 80, + (103,204,0): 116, 152, 78, + (103,205,0): 114, 155, 79, + (103,206,0): 114, 154, 83, + (103,207,0): 112, 154, 80, + (103,208,0): 113, 156, 77, + (103,209,0): 113, 156, 76, + (103,210,0): 113, 156, 76, + (103,211,0): 112, 155, 75, + (103,212,0): 112, 155, 76, + (103,213,0): 115, 158, 79, + (103,214,0): 119, 163, 86, + (103,215,0): 123, 167, 92, + (103,216,0): 130, 173, 101, + (103,217,0): 128, 171, 100, + (103,218,0): 120, 163, 92, + (103,219,0): 106, 149, 80, + (103,220,0): 93, 135, 69, + (103,221,0): 89, 131, 65, + (103,222,0): 94, 136, 72, + (103,223,0): 101, 143, 80, + (103,224,0): 99, 138, 81, + (103,225,0): 90, 129, 74, + (103,226,0): 83, 122, 67, + (104,0,0): 105, 96, 81, + (104,1,0): 105, 96, 81, + (104,2,0): 105, 96, 81, + (104,3,0): 105, 96, 81, + (104,4,0): 105, 96, 81, + (104,5,0): 105, 96, 81, + (104,6,0): 105, 96, 81, + (104,7,0): 105, 96, 81, + (104,8,0): 105, 96, 81, + (104,9,0): 105, 96, 81, + (104,10,0): 105, 96, 81, + (104,11,0): 105, 96, 81, + (104,12,0): 105, 96, 81, + (104,13,0): 105, 96, 81, + (104,14,0): 105, 96, 81, + (104,15,0): 105, 95, 83, + (104,16,0): 106, 96, 87, + (104,17,0): 106, 96, 87, + (104,18,0): 106, 96, 87, + (104,19,0): 106, 96, 87, + (104,20,0): 106, 96, 86, + (104,21,0): 106, 96, 86, + (104,22,0): 106, 96, 84, + (104,23,0): 106, 97, 82, + (104,24,0): 106, 97, 82, + (104,25,0): 106, 97, 80, + (104,26,0): 106, 97, 80, + (104,27,0): 106, 98, 79, + (104,28,0): 106, 98, 79, + (104,29,0): 106, 98, 79, + (104,30,0): 106, 98, 77, + (104,31,0): 106, 98, 77, + (104,32,0): 103, 95, 74, + (104,33,0): 103, 95, 74, + (104,34,0): 102, 94, 73, + (104,35,0): 101, 95, 73, + (104,36,0): 98, 93, 73, + (104,37,0): 90, 88, 67, + (104,38,0): 83, 80, 61, + (104,39,0): 77, 76, 58, + (104,40,0): 72, 73, 55, + (104,41,0): 69, 72, 55, + (104,42,0): 65, 69, 54, + (104,43,0): 64, 68, 53, + (104,44,0): 63, 69, 55, + (104,45,0): 63, 71, 56, + (104,46,0): 63, 71, 56, + (104,47,0): 63, 69, 55, + (104,48,0): 72, 74, 61, + (104,49,0): 74, 75, 61, + (104,50,0): 67, 68, 52, + (104,51,0): 75, 74, 54, + (104,52,0): 92, 81, 59, + (104,53,0): 96, 70, 47, + (104,54,0): 128, 75, 57, + (104,55,0): 189, 107, 93, + (104,56,0): 217, 104, 96, + (104,57,0): 224, 86, 83, + (104,58,0): 226, 71, 69, + (104,59,0): 229, 65, 64, + (104,60,0): 226, 64, 61, + (104,61,0): 215, 61, 53, + (104,62,0): 203, 59, 48, + (104,63,0): 201, 59, 45, + (104,64,0): 199, 51, 37, + (104,65,0): 203, 53, 38, + (104,66,0): 204, 54, 39, + (104,67,0): 205, 55, 40, + (104,68,0): 205, 55, 40, + (104,69,0): 206, 56, 41, + (104,70,0): 209, 59, 44, + (104,71,0): 211, 61, 46, + (104,72,0): 210, 60, 45, + (104,73,0): 210, 60, 45, + (104,74,0): 210, 60, 45, + (104,75,0): 210, 60, 45, + (104,76,0): 209, 59, 44, + (104,77,0): 209, 59, 44, + (104,78,0): 209, 59, 44, + (104,79,0): 206, 60, 45, + (104,80,0): 187, 50, 40, + (104,81,0): 182, 55, 46, + (104,82,0): 177, 59, 47, + (104,83,0): 168, 58, 41, + (104,84,0): 154, 55, 34, + (104,85,0): 148, 53, 31, + (104,86,0): 149, 55, 30, + (104,87,0): 156, 57, 34, + (104,88,0): 174, 65, 45, + (104,89,0): 179, 59, 43, + (104,90,0): 186, 54, 41, + (104,91,0): 193, 52, 42, + (104,92,0): 205, 54, 47, + (104,93,0): 215, 60, 55, + (104,94,0): 226, 67, 63, + (104,95,0): 234, 72, 69, + (104,96,0): 232, 68, 69, + (104,97,0): 232, 69, 72, + (104,98,0): 221, 67, 67, + (104,99,0): 201, 58, 54, + (104,100,0): 187, 54, 49, + (104,101,0): 180, 56, 48, + (104,102,0): 176, 55, 46, + (104,103,0): 169, 52, 43, + (104,104,0): 171, 57, 47, + (104,105,0): 169, 57, 46, + (104,106,0): 164, 56, 46, + (104,107,0): 160, 56, 45, + (104,108,0): 155, 57, 44, + (104,109,0): 150, 58, 43, + (104,110,0): 147, 60, 43, + (104,111,0): 146, 60, 43, + (104,112,0): 150, 61, 43, + (104,113,0): 152, 61, 42, + (104,114,0): 153, 62, 43, + (104,115,0): 154, 63, 44, + (104,116,0): 155, 64, 45, + (104,117,0): 156, 65, 44, + (104,118,0): 158, 66, 45, + (104,119,0): 161, 64, 45, + (104,120,0): 162, 59, 42, + (104,121,0): 165, 58, 40, + (104,122,0): 171, 55, 40, + (104,123,0): 176, 54, 41, + (104,124,0): 182, 54, 43, + (104,125,0): 190, 56, 45, + (104,126,0): 197, 58, 51, + (104,127,0): 204, 60, 52, + (104,128,0): 218, 61, 54, + (104,129,0): 224, 61, 54, + (104,130,0): 226, 63, 56, + (104,131,0): 226, 65, 55, + (104,132,0): 226, 65, 57, + (104,133,0): 222, 66, 54, + (104,134,0): 218, 64, 54, + (104,135,0): 215, 64, 53, + (104,136,0): 216, 72, 61, + (104,137,0): 210, 69, 59, + (104,138,0): 199, 65, 56, + (104,139,0): 187, 59, 50, + (104,140,0): 178, 53, 47, + (104,141,0): 170, 51, 45, + (104,142,0): 166, 49, 42, + (104,143,0): 159, 50, 43, + (104,144,0): 153, 57, 45, + (104,145,0): 146, 59, 42, + (104,146,0): 145, 57, 43, + (104,147,0): 141, 58, 42, + (104,148,0): 139, 58, 41, + (104,149,0): 136, 59, 41, + (104,150,0): 135, 59, 43, + (104,151,0): 133, 60, 43, + (104,152,0): 128, 57, 39, + (104,153,0): 125, 56, 40, + (104,154,0): 124, 57, 40, + (104,155,0): 124, 57, 40, + (104,156,0): 124, 57, 40, + (104,157,0): 123, 56, 39, + (104,158,0): 121, 54, 38, + (104,159,0): 120, 51, 36, + (104,160,0): 119, 45, 32, + (104,161,0): 139, 65, 52, + (104,162,0): 151, 79, 67, + (104,163,0): 147, 77, 65, + (104,164,0): 142, 76, 64, + (104,165,0): 145, 81, 69, + (104,166,0): 147, 85, 74, + (104,167,0): 142, 82, 71, + (104,168,0): 152, 92, 82, + (104,169,0): 152, 92, 82, + (104,170,0): 145, 85, 77, + (104,171,0): 144, 84, 76, + (104,172,0): 151, 90, 85, + (104,173,0): 149, 88, 83, + (104,174,0): 148, 87, 84, + (104,175,0): 147, 103, 90, + (104,176,0): 93, 84, 53, + (104,177,0): 73, 81, 42, + (104,178,0): 65, 75, 40, + (104,179,0): 66, 75, 44, + (104,180,0): 62, 72, 47, + (104,181,0): 55, 64, 43, + (104,182,0): 50, 61, 45, + (104,183,0): 52, 63, 49, + (104,184,0): 52, 60, 49, + (104,185,0): 72, 80, 67, + (104,186,0): 90, 94, 80, + (104,187,0): 87, 91, 74, + (104,188,0): 77, 79, 58, + (104,189,0): 68, 70, 46, + (104,190,0): 65, 65, 39, + (104,191,0): 61, 61, 37, + (104,192,0): 58, 59, 41, + (104,193,0): 62, 63, 49, + (104,194,0): 59, 61, 50, + (104,195,0): 58, 61, 50, + (104,196,0): 59, 63, 49, + (104,197,0): 52, 61, 42, + (104,198,0): 59, 72, 46, + (104,199,0): 80, 98, 60, + (104,200,0): 99, 121, 74, + (104,201,0): 108, 136, 77, + (104,202,0): 117, 148, 81, + (104,203,0): 115, 151, 79, + (104,204,0): 114, 150, 76, + (104,205,0): 112, 153, 77, + (104,206,0): 114, 154, 83, + (104,207,0): 113, 155, 81, + (104,208,0): 112, 157, 76, + (104,209,0): 113, 158, 75, + (104,210,0): 114, 159, 78, + (104,211,0): 114, 159, 78, + (104,212,0): 115, 159, 80, + (104,213,0): 118, 162, 85, + (104,214,0): 123, 167, 92, + (104,215,0): 127, 170, 98, + (104,216,0): 130, 173, 102, + (104,217,0): 120, 163, 94, + (104,218,0): 106, 147, 79, + (104,219,0): 96, 137, 71, + (104,220,0): 94, 135, 69, + (104,221,0): 97, 137, 74, + (104,222,0): 102, 142, 80, + (104,223,0): 104, 144, 84, + (104,224,0): 100, 137, 83, + (104,225,0): 91, 128, 76, + (104,226,0): 84, 121, 69, + (105,0,0): 105, 96, 81, + (105,1,0): 105, 96, 81, + (105,2,0): 105, 96, 81, + (105,3,0): 105, 96, 81, + (105,4,0): 105, 96, 81, + (105,5,0): 105, 96, 81, + (105,6,0): 105, 96, 81, + (105,7,0): 105, 96, 81, + (105,8,0): 105, 96, 81, + (105,9,0): 105, 96, 81, + (105,10,0): 105, 96, 81, + (105,11,0): 105, 96, 81, + (105,12,0): 105, 96, 81, + (105,13,0): 105, 96, 81, + (105,14,0): 105, 96, 81, + (105,15,0): 105, 95, 83, + (105,16,0): 106, 95, 89, + (105,17,0): 106, 95, 91, + (105,18,0): 106, 95, 91, + (105,19,0): 106, 95, 89, + (105,20,0): 106, 95, 89, + (105,21,0): 106, 96, 87, + (105,22,0): 106, 96, 86, + (105,23,0): 106, 96, 84, + (105,24,0): 106, 96, 84, + (105,25,0): 106, 97, 82, + (105,26,0): 106, 97, 82, + (105,27,0): 106, 97, 82, + (105,28,0): 106, 97, 82, + (105,29,0): 106, 97, 82, + (105,30,0): 106, 97, 80, + (105,31,0): 106, 97, 80, + (105,32,0): 104, 96, 77, + (105,33,0): 104, 96, 75, + (105,34,0): 103, 95, 74, + (105,35,0): 103, 95, 74, + (105,36,0): 100, 93, 74, + (105,37,0): 94, 89, 69, + (105,38,0): 85, 82, 63, + (105,39,0): 79, 78, 58, + (105,40,0): 73, 74, 58, + (105,41,0): 69, 72, 55, + (105,42,0): 66, 68, 54, + (105,43,0): 64, 68, 53, + (105,44,0): 63, 69, 55, + (105,45,0): 62, 70, 55, + (105,46,0): 62, 70, 55, + (105,47,0): 61, 69, 54, + (105,48,0): 66, 70, 56, + (105,49,0): 65, 67, 53, + (105,50,0): 64, 69, 49, + (105,51,0): 72, 76, 53, + (105,52,0): 77, 73, 48, + (105,53,0): 82, 65, 39, + (105,54,0): 124, 82, 58, + (105,55,0): 185, 117, 98, + (105,56,0): 201, 100, 88, + (105,57,0): 221, 96, 90, + (105,58,0): 234, 86, 84, + (105,59,0): 230, 72, 71, + (105,60,0): 226, 64, 62, + (105,61,0): 226, 64, 61, + (105,62,0): 219, 62, 57, + (105,63,0): 209, 56, 48, + (105,64,0): 205, 57, 43, + (105,65,0): 206, 61, 44, + (105,66,0): 207, 61, 46, + (105,67,0): 207, 62, 45, + (105,68,0): 207, 59, 45, + (105,69,0): 206, 59, 43, + (105,70,0): 205, 57, 43, + (105,71,0): 205, 58, 42, + (105,72,0): 206, 58, 44, + (105,73,0): 208, 58, 43, + (105,74,0): 208, 58, 44, + (105,75,0): 208, 58, 43, + (105,76,0): 208, 58, 44, + (105,77,0): 208, 58, 43, + (105,78,0): 208, 58, 44, + (105,79,0): 205, 59, 46, + (105,80,0): 201, 63, 53, + (105,81,0): 197, 66, 58, + (105,82,0): 188, 66, 55, + (105,83,0): 174, 61, 47, + (105,84,0): 159, 54, 35, + (105,85,0): 150, 49, 29, + (105,86,0): 150, 49, 29, + (105,87,0): 155, 50, 29, + (105,88,0): 168, 53, 35, + (105,89,0): 180, 54, 40, + (105,90,0): 195, 59, 47, + (105,91,0): 209, 65, 56, + (105,92,0): 222, 69, 63, + (105,93,0): 230, 73, 68, + (105,94,0): 233, 74, 70, + (105,95,0): 234, 75, 72, + (105,96,0): 224, 66, 65, + (105,97,0): 219, 69, 68, + (105,98,0): 208, 66, 62, + (105,99,0): 190, 59, 51, + (105,100,0): 175, 57, 47, + (105,101,0): 171, 61, 48, + (105,102,0): 165, 63, 49, + (105,103,0): 159, 61, 48, + (105,104,0): 159, 63, 49, + (105,105,0): 156, 62, 50, + (105,106,0): 151, 62, 48, + (105,107,0): 149, 61, 47, + (105,108,0): 143, 61, 47, + (105,109,0): 139, 62, 46, + (105,110,0): 135, 64, 46, + (105,111,0): 136, 63, 44, + (105,112,0): 142, 61, 42, + (105,113,0): 143, 60, 42, + (105,114,0): 146, 60, 43, + (105,115,0): 145, 62, 44, + (105,116,0): 148, 63, 43, + (105,117,0): 148, 63, 43, + (105,118,0): 150, 63, 44, + (105,119,0): 153, 62, 44, + (105,120,0): 159, 64, 46, + (105,121,0): 161, 61, 45, + (105,122,0): 164, 58, 44, + (105,123,0): 168, 56, 44, + (105,124,0): 173, 55, 43, + (105,125,0): 178, 56, 45, + (105,126,0): 184, 57, 48, + (105,127,0): 189, 56, 47, + (105,128,0): 202, 60, 50, + (105,129,0): 208, 60, 50, + (105,130,0): 211, 63, 53, + (105,131,0): 213, 65, 55, + (105,132,0): 215, 67, 57, + (105,133,0): 214, 67, 57, + (105,134,0): 212, 68, 57, + (105,135,0): 209, 69, 56, + (105,136,0): 202, 66, 54, + (105,137,0): 195, 65, 52, + (105,138,0): 185, 61, 51, + (105,139,0): 176, 58, 48, + (105,140,0): 169, 54, 47, + (105,141,0): 164, 53, 46, + (105,142,0): 159, 52, 44, + (105,143,0): 153, 55, 44, + (105,144,0): 146, 58, 46, + (105,145,0): 140, 61, 44, + (105,146,0): 138, 59, 44, + (105,147,0): 136, 59, 43, + (105,148,0): 134, 58, 42, + (105,149,0): 132, 59, 42, + (105,150,0): 131, 60, 42, + (105,151,0): 129, 60, 44, + (105,152,0): 126, 59, 42, + (105,153,0): 124, 59, 41, + (105,154,0): 123, 57, 41, + (105,155,0): 121, 58, 41, + (105,156,0): 120, 57, 40, + (105,157,0): 119, 56, 39, + (105,158,0): 117, 54, 39, + (105,159,0): 119, 52, 36, + (105,160,0): 128, 52, 39, + (105,161,0): 144, 68, 55, + (105,162,0): 152, 78, 67, + (105,163,0): 145, 75, 63, + (105,164,0): 140, 74, 62, + (105,165,0): 143, 81, 68, + (105,166,0): 146, 84, 73, + (105,167,0): 144, 82, 71, + (105,168,0): 147, 83, 74, + (105,169,0): 152, 88, 79, + (105,170,0): 152, 85, 79, + (105,171,0): 151, 86, 80, + (105,172,0): 156, 93, 88, + (105,173,0): 148, 87, 82, + (105,174,0): 142, 83, 79, + (105,175,0): 138, 99, 84, + (105,176,0): 93, 87, 53, + (105,177,0): 88, 99, 57, + (105,178,0): 95, 106, 66, + (105,179,0): 90, 102, 66, + (105,180,0): 73, 84, 54, + (105,181,0): 54, 67, 41, + (105,182,0): 52, 64, 42, + (105,183,0): 60, 72, 52, + (105,184,0): 79, 88, 71, + (105,185,0): 89, 98, 81, + (105,186,0): 95, 102, 84, + (105,187,0): 87, 92, 70, + (105,188,0): 74, 78, 55, + (105,189,0): 66, 69, 42, + (105,190,0): 63, 63, 35, + (105,191,0): 60, 60, 34, + (105,192,0): 57, 58, 40, + (105,193,0): 61, 62, 48, + (105,194,0): 58, 60, 49, + (105,195,0): 57, 60, 49, + (105,196,0): 60, 64, 50, + (105,197,0): 53, 62, 43, + (105,198,0): 59, 72, 46, + (105,199,0): 80, 98, 60, + (105,200,0): 100, 122, 75, + (105,201,0): 108, 136, 77, + (105,202,0): 117, 148, 81, + (105,203,0): 116, 152, 80, + (105,204,0): 114, 150, 76, + (105,205,0): 113, 154, 78, + (105,206,0): 114, 154, 83, + (105,207,0): 113, 155, 81, + (105,208,0): 115, 160, 79, + (105,209,0): 114, 159, 76, + (105,210,0): 112, 157, 76, + (105,211,0): 113, 158, 77, + (105,212,0): 116, 160, 81, + (105,213,0): 120, 164, 87, + (105,214,0): 124, 167, 95, + (105,215,0): 127, 170, 99, + (105,216,0): 123, 166, 97, + (105,217,0): 111, 154, 85, + (105,218,0): 99, 140, 74, + (105,219,0): 93, 134, 68, + (105,220,0): 97, 137, 74, + (105,221,0): 101, 141, 78, + (105,222,0): 101, 141, 78, + (105,223,0): 99, 139, 79, + (105,224,0): 100, 137, 83, + (105,225,0): 91, 128, 76, + (105,226,0): 84, 121, 69, + (106,0,0): 105, 96, 81, + (106,1,0): 105, 96, 81, + (106,2,0): 105, 96, 81, + (106,3,0): 105, 96, 81, + (106,4,0): 105, 96, 81, + (106,5,0): 105, 96, 81, + (106,6,0): 105, 96, 81, + (106,7,0): 105, 96, 81, + (106,8,0): 105, 96, 81, + (106,9,0): 105, 96, 81, + (106,10,0): 105, 96, 81, + (106,11,0): 105, 96, 81, + (106,12,0): 105, 96, 81, + (106,13,0): 105, 96, 81, + (106,14,0): 105, 96, 81, + (106,15,0): 105, 95, 85, + (106,16,0): 106, 95, 91, + (106,17,0): 106, 94, 94, + (106,18,0): 106, 94, 94, + (106,19,0): 106, 95, 93, + (106,20,0): 106, 95, 89, + (106,21,0): 106, 96, 87, + (106,22,0): 106, 96, 86, + (106,23,0): 106, 96, 84, + (106,24,0): 106, 96, 84, + (106,25,0): 106, 96, 84, + (106,26,0): 106, 96, 84, + (106,27,0): 106, 96, 84, + (106,28,0): 106, 96, 84, + (106,29,0): 106, 96, 84, + (106,30,0): 106, 96, 86, + (106,31,0): 106, 96, 84, + (106,32,0): 108, 97, 79, + (106,33,0): 107, 96, 76, + (106,34,0): 105, 97, 78, + (106,35,0): 105, 97, 78, + (106,36,0): 102, 95, 76, + (106,37,0): 97, 92, 72, + (106,38,0): 89, 86, 67, + (106,39,0): 83, 82, 62, + (106,40,0): 77, 75, 60, + (106,41,0): 72, 73, 57, + (106,42,0): 68, 70, 56, + (106,43,0): 65, 69, 54, + (106,44,0): 65, 69, 54, + (106,45,0): 63, 70, 54, + (106,46,0): 62, 68, 54, + (106,47,0): 61, 67, 53, + (106,48,0): 62, 69, 53, + (106,49,0): 58, 62, 45, + (106,50,0): 66, 71, 49, + (106,51,0): 73, 75, 51, + (106,52,0): 69, 63, 37, + (106,53,0): 84, 64, 39, + (106,54,0): 132, 92, 67, + (106,55,0): 181, 116, 96, + (106,56,0): 179, 87, 74, + (106,57,0): 214, 100, 90, + (106,58,0): 239, 101, 98, + (106,59,0): 236, 84, 83, + (106,60,0): 230, 70, 72, + (106,61,0): 235, 71, 72, + (106,62,0): 232, 66, 68, + (106,63,0): 219, 57, 54, + (106,64,0): 203, 55, 43, + (106,65,0): 201, 58, 42, + (106,66,0): 201, 58, 44, + (106,67,0): 201, 58, 42, + (106,68,0): 203, 57, 44, + (106,69,0): 202, 56, 41, + (106,70,0): 200, 54, 41, + (106,71,0): 200, 54, 39, + (106,72,0): 202, 56, 43, + (106,73,0): 203, 55, 41, + (106,74,0): 203, 55, 43, + (106,75,0): 203, 55, 41, + (106,76,0): 203, 55, 43, + (106,77,0): 204, 56, 42, + (106,78,0): 204, 56, 44, + (106,79,0): 203, 56, 46, + (106,80,0): 194, 51, 45, + (106,81,0): 190, 53, 47, + (106,82,0): 182, 54, 45, + (106,83,0): 173, 51, 40, + (106,84,0): 161, 48, 34, + (106,85,0): 158, 47, 30, + (106,86,0): 160, 49, 32, + (106,87,0): 167, 51, 36, + (106,88,0): 188, 65, 50, + (106,89,0): 199, 67, 55, + (106,90,0): 214, 71, 63, + (106,91,0): 225, 76, 70, + (106,92,0): 231, 76, 71, + (106,93,0): 233, 74, 70, + (106,94,0): 229, 70, 66, + (106,95,0): 223, 68, 64, + (106,96,0): 216, 66, 65, + (106,97,0): 209, 67, 65, + (106,98,0): 195, 63, 58, + (106,99,0): 177, 59, 49, + (106,100,0): 166, 60, 47, + (106,101,0): 161, 65, 49, + (106,102,0): 156, 69, 52, + (106,103,0): 152, 69, 51, + (106,104,0): 149, 68, 51, + (106,105,0): 146, 67, 52, + (106,106,0): 143, 66, 50, + (106,107,0): 138, 65, 48, + (106,108,0): 133, 64, 48, + (106,109,0): 130, 65, 47, + (106,110,0): 126, 65, 46, + (106,111,0): 129, 64, 46, + (106,112,0): 132, 59, 42, + (106,113,0): 136, 59, 43, + (106,114,0): 137, 58, 41, + (106,115,0): 137, 60, 42, + (106,116,0): 139, 60, 43, + (106,117,0): 139, 60, 43, + (106,118,0): 142, 61, 42, + (106,119,0): 143, 60, 42, + (106,120,0): 150, 63, 46, + (106,121,0): 152, 60, 45, + (106,122,0): 155, 59, 43, + (106,123,0): 158, 56, 42, + (106,124,0): 162, 56, 43, + (106,125,0): 167, 56, 45, + (106,126,0): 170, 58, 46, + (106,127,0): 175, 57, 47, + (106,128,0): 185, 57, 46, + (106,129,0): 190, 57, 48, + (106,130,0): 193, 59, 48, + (106,131,0): 196, 62, 51, + (106,132,0): 197, 63, 51, + (106,133,0): 197, 65, 52, + (106,134,0): 195, 65, 51, + (106,135,0): 193, 65, 52, + (106,136,0): 182, 59, 44, + (106,137,0): 178, 58, 44, + (106,138,0): 170, 56, 45, + (106,139,0): 163, 55, 43, + (106,140,0): 158, 54, 43, + (106,141,0): 155, 54, 44, + (106,142,0): 152, 55, 46, + (106,143,0): 148, 58, 47, + (106,144,0): 141, 59, 47, + (106,145,0): 136, 60, 44, + (106,146,0): 135, 59, 45, + (106,147,0): 132, 59, 44, + (106,148,0): 130, 58, 43, + (106,149,0): 128, 59, 43, + (106,150,0): 128, 59, 43, + (106,151,0): 127, 60, 44, + (106,152,0): 125, 59, 43, + (106,153,0): 122, 59, 42, + (106,154,0): 122, 59, 44, + (106,155,0): 119, 57, 42, + (106,156,0): 118, 56, 41, + (106,157,0): 117, 55, 40, + (106,158,0): 116, 54, 41, + (106,159,0): 118, 52, 38, + (106,160,0): 136, 59, 49, + (106,161,0): 148, 70, 60, + (106,162,0): 150, 78, 66, + (106,163,0): 142, 74, 61, + (106,164,0): 136, 72, 60, + (106,165,0): 141, 79, 66, + (106,166,0): 145, 83, 72, + (106,167,0): 146, 82, 73, + (106,168,0): 146, 79, 73, + (106,169,0): 153, 84, 79, + (106,170,0): 153, 83, 81, + (106,171,0): 154, 86, 83, + (106,172,0): 154, 93, 90, + (106,173,0): 147, 89, 85, + (106,174,0): 141, 91, 84, + (106,175,0): 141, 108, 91, + (106,176,0): 129, 125, 88, + (106,177,0): 126, 137, 94, + (106,178,0): 128, 139, 97, + (106,179,0): 108, 120, 82, + (106,180,0): 76, 88, 52, + (106,181,0): 54, 68, 35, + (106,182,0): 61, 74, 46, + (106,183,0): 76, 90, 64, + (106,184,0): 101, 113, 89, + (106,185,0): 101, 111, 87, + (106,186,0): 93, 101, 77, + (106,187,0): 80, 85, 62, + (106,188,0): 69, 73, 48, + (106,189,0): 63, 67, 40, + (106,190,0): 61, 64, 35, + (106,191,0): 58, 60, 36, + (106,192,0): 56, 57, 39, + (106,193,0): 59, 60, 46, + (106,194,0): 56, 58, 47, + (106,195,0): 57, 60, 49, + (106,196,0): 61, 65, 51, + (106,197,0): 54, 63, 44, + (106,198,0): 60, 73, 47, + (106,199,0): 80, 98, 60, + (106,200,0): 100, 122, 75, + (106,201,0): 109, 137, 78, + (106,202,0): 118, 149, 82, + (106,203,0): 116, 152, 80, + (106,204,0): 115, 151, 77, + (106,205,0): 113, 154, 78, + (106,206,0): 114, 154, 83, + (106,207,0): 112, 154, 80, + (106,208,0): 117, 162, 81, + (106,209,0): 112, 160, 76, + (106,210,0): 110, 157, 76, + (106,211,0): 112, 159, 79, + (106,212,0): 117, 164, 86, + (106,213,0): 121, 167, 92, + (106,214,0): 125, 168, 96, + (106,215,0): 124, 167, 96, + (106,216,0): 112, 153, 85, + (106,217,0): 102, 143, 77, + (106,218,0): 92, 132, 69, + (106,219,0): 92, 132, 69, + (106,220,0): 101, 140, 77, + (106,221,0): 105, 144, 81, + (106,222,0): 102, 141, 78, + (106,223,0): 95, 133, 72, + (106,224,0): 99, 136, 82, + (106,225,0): 90, 127, 76, + (106,226,0): 83, 120, 69, + (107,0,0): 105, 96, 81, + (107,1,0): 105, 96, 81, + (107,2,0): 105, 96, 81, + (107,3,0): 105, 96, 81, + (107,4,0): 105, 96, 81, + (107,5,0): 105, 96, 81, + (107,6,0): 105, 96, 81, + (107,7,0): 105, 96, 81, + (107,8,0): 106, 97, 82, + (107,9,0): 106, 97, 82, + (107,10,0): 106, 97, 82, + (107,11,0): 106, 97, 82, + (107,12,0): 106, 97, 82, + (107,13,0): 106, 97, 82, + (107,14,0): 106, 97, 82, + (107,15,0): 106, 96, 86, + (107,16,0): 107, 96, 92, + (107,17,0): 107, 95, 95, + (107,18,0): 107, 96, 94, + (107,19,0): 107, 96, 92, + (107,20,0): 107, 96, 90, + (107,21,0): 107, 97, 88, + (107,22,0): 107, 97, 87, + (107,23,0): 107, 97, 85, + (107,24,0): 107, 97, 85, + (107,25,0): 107, 97, 85, + (107,26,0): 107, 97, 85, + (107,27,0): 107, 97, 85, + (107,28,0): 107, 97, 87, + (107,29,0): 107, 97, 87, + (107,30,0): 107, 97, 88, + (107,31,0): 107, 97, 87, + (107,32,0): 110, 98, 82, + (107,33,0): 109, 98, 80, + (107,34,0): 106, 98, 79, + (107,35,0): 106, 98, 79, + (107,36,0): 104, 97, 78, + (107,37,0): 101, 94, 75, + (107,38,0): 95, 90, 71, + (107,39,0): 89, 86, 69, + (107,40,0): 82, 79, 62, + (107,41,0): 77, 75, 60, + (107,42,0): 71, 72, 58, + (107,43,0): 68, 70, 56, + (107,44,0): 67, 69, 55, + (107,45,0): 66, 68, 54, + (107,46,0): 64, 68, 53, + (107,47,0): 62, 66, 51, + (107,48,0): 63, 70, 52, + (107,49,0): 60, 65, 45, + (107,50,0): 71, 73, 51, + (107,51,0): 76, 70, 48, + (107,52,0): 77, 59, 37, + (107,53,0): 110, 78, 57, + (107,54,0): 152, 100, 79, + (107,55,0): 167, 96, 78, + (107,56,0): 158, 66, 53, + (107,57,0): 197, 84, 76, + (107,58,0): 229, 100, 95, + (107,59,0): 239, 95, 94, + (107,60,0): 237, 83, 85, + (107,61,0): 237, 74, 79, + (107,62,0): 234, 68, 72, + (107,63,0): 227, 64, 65, + (107,64,0): 205, 56, 49, + (107,65,0): 199, 57, 45, + (107,66,0): 197, 55, 43, + (107,67,0): 197, 55, 43, + (107,68,0): 200, 56, 45, + (107,69,0): 202, 58, 47, + (107,70,0): 203, 59, 48, + (107,71,0): 205, 58, 48, + (107,72,0): 209, 62, 52, + (107,73,0): 209, 62, 52, + (107,74,0): 210, 62, 52, + (107,75,0): 210, 62, 52, + (107,76,0): 211, 63, 53, + (107,77,0): 211, 63, 53, + (107,78,0): 211, 63, 53, + (107,79,0): 211, 62, 55, + (107,80,0): 211, 63, 59, + (107,81,0): 209, 66, 62, + (107,82,0): 203, 68, 62, + (107,83,0): 198, 70, 61, + (107,84,0): 194, 70, 60, + (107,85,0): 195, 73, 62, + (107,86,0): 199, 77, 64, + (107,87,0): 206, 80, 68, + (107,88,0): 217, 83, 72, + (107,89,0): 221, 80, 71, + (107,90,0): 226, 77, 71, + (107,91,0): 228, 73, 69, + (107,92,0): 228, 71, 66, + (107,93,0): 226, 67, 63, + (107,94,0): 224, 65, 61, + (107,95,0): 220, 65, 61, + (107,96,0): 214, 69, 66, + (107,97,0): 202, 67, 63, + (107,98,0): 189, 62, 55, + (107,99,0): 173, 59, 48, + (107,100,0): 161, 61, 46, + (107,101,0): 155, 66, 48, + (107,102,0): 151, 70, 51, + (107,103,0): 148, 73, 54, + (107,104,0): 142, 69, 52, + (107,105,0): 140, 69, 51, + (107,106,0): 138, 66, 51, + (107,107,0): 133, 66, 49, + (107,108,0): 130, 64, 48, + (107,109,0): 125, 64, 46, + (107,110,0): 123, 64, 46, + (107,111,0): 124, 63, 45, + (107,112,0): 128, 59, 44, + (107,113,0): 131, 57, 44, + (107,114,0): 131, 58, 43, + (107,115,0): 132, 59, 44, + (107,116,0): 132, 59, 44, + (107,117,0): 133, 60, 45, + (107,118,0): 135, 59, 43, + (107,119,0): 136, 59, 43, + (107,120,0): 137, 58, 43, + (107,121,0): 140, 57, 41, + (107,122,0): 143, 55, 41, + (107,123,0): 147, 55, 42, + (107,124,0): 150, 56, 44, + (107,125,0): 156, 58, 47, + (107,126,0): 160, 59, 47, + (107,127,0): 163, 59, 48, + (107,128,0): 170, 58, 47, + (107,129,0): 173, 56, 46, + (107,130,0): 175, 57, 47, + (107,131,0): 176, 58, 46, + (107,132,0): 176, 58, 46, + (107,133,0): 176, 58, 44, + (107,134,0): 175, 57, 43, + (107,135,0): 174, 56, 42, + (107,136,0): 168, 55, 41, + (107,137,0): 165, 55, 40, + (107,138,0): 158, 54, 41, + (107,139,0): 155, 54, 42, + (107,140,0): 149, 55, 43, + (107,141,0): 146, 56, 45, + (107,142,0): 145, 57, 47, + (107,143,0): 142, 60, 48, + (107,144,0): 136, 60, 46, + (107,145,0): 133, 60, 45, + (107,146,0): 131, 59, 44, + (107,147,0): 129, 57, 42, + (107,148,0): 127, 58, 42, + (107,149,0): 126, 57, 42, + (107,150,0): 125, 58, 42, + (107,151,0): 125, 59, 43, + (107,152,0): 124, 58, 44, + (107,153,0): 122, 59, 44, + (107,154,0): 121, 59, 44, + (107,155,0): 119, 57, 42, + (107,156,0): 115, 56, 42, + (107,157,0): 113, 54, 40, + (107,158,0): 114, 55, 41, + (107,159,0): 117, 53, 41, + (107,160,0): 140, 68, 56, + (107,161,0): 146, 72, 61, + (107,162,0): 145, 75, 63, + (107,163,0): 138, 72, 58, + (107,164,0): 135, 73, 60, + (107,165,0): 139, 79, 68, + (107,166,0): 147, 84, 75, + (107,167,0): 151, 84, 76, + (107,168,0): 150, 81, 76, + (107,169,0): 155, 84, 80, + (107,170,0): 152, 81, 79, + (107,171,0): 148, 83, 79, + (107,172,0): 150, 92, 88, + (107,173,0): 144, 95, 88, + (107,174,0): 144, 104, 94, + (107,175,0): 151, 126, 106, + (107,176,0): 148, 148, 112, + (107,177,0): 133, 146, 102, + (107,178,0): 117, 130, 87, + (107,179,0): 89, 104, 63, + (107,180,0): 67, 82, 43, + (107,181,0): 63, 79, 42, + (107,182,0): 80, 96, 60, + (107,183,0): 99, 114, 81, + (107,184,0): 101, 116, 85, + (107,185,0): 92, 105, 75, + (107,186,0): 78, 88, 61, + (107,187,0): 67, 76, 49, + (107,188,0): 63, 69, 43, + (107,189,0): 62, 66, 41, + (107,190,0): 61, 65, 40, + (107,191,0): 59, 61, 39, + (107,192,0): 55, 56, 40, + (107,193,0): 58, 59, 45, + (107,194,0): 55, 57, 46, + (107,195,0): 57, 60, 49, + (107,196,0): 61, 65, 51, + (107,197,0): 55, 64, 45, + (107,198,0): 60, 73, 47, + (107,199,0): 79, 97, 59, + (107,200,0): 98, 120, 73, + (107,201,0): 108, 136, 77, + (107,202,0): 118, 149, 82, + (107,203,0): 117, 153, 81, + (107,204,0): 116, 152, 78, + (107,205,0): 114, 155, 79, + (107,206,0): 114, 154, 83, + (107,207,0): 111, 155, 80, + (107,208,0): 113, 160, 79, + (107,209,0): 111, 158, 77, + (107,210,0): 111, 158, 77, + (107,211,0): 115, 162, 82, + (107,212,0): 122, 168, 93, + (107,213,0): 124, 170, 97, + (107,214,0): 122, 165, 94, + (107,215,0): 117, 160, 91, + (107,216,0): 99, 140, 74, + (107,217,0): 94, 135, 69, + (107,218,0): 91, 131, 68, + (107,219,0): 95, 135, 72, + (107,220,0): 103, 142, 79, + (107,221,0): 106, 145, 80, + (107,222,0): 102, 141, 76, + (107,223,0): 96, 135, 72, + (107,224,0): 98, 135, 81, + (107,225,0): 89, 126, 75, + (107,226,0): 82, 119, 68, + (108,0,0): 105, 96, 81, + (108,1,0): 105, 96, 81, + (108,2,0): 105, 96, 81, + (108,3,0): 105, 96, 81, + (108,4,0): 105, 96, 81, + (108,5,0): 105, 96, 81, + (108,6,0): 105, 96, 81, + (108,7,0): 105, 96, 81, + (108,8,0): 106, 97, 82, + (108,9,0): 106, 97, 82, + (108,10,0): 106, 97, 82, + (108,11,0): 106, 97, 82, + (108,12,0): 106, 97, 82, + (108,13,0): 106, 97, 82, + (108,14,0): 106, 97, 82, + (108,15,0): 106, 96, 84, + (108,16,0): 107, 96, 90, + (108,17,0): 107, 96, 92, + (108,18,0): 107, 96, 90, + (108,19,0): 107, 97, 88, + (108,20,0): 107, 97, 87, + (108,21,0): 107, 97, 85, + (108,22,0): 107, 98, 83, + (108,23,0): 107, 98, 83, + (108,24,0): 107, 98, 83, + (108,25,0): 107, 98, 83, + (108,26,0): 107, 98, 83, + (108,27,0): 107, 97, 85, + (108,28,0): 107, 97, 87, + (108,29,0): 107, 97, 87, + (108,30,0): 107, 97, 88, + (108,31,0): 107, 97, 87, + (108,32,0): 111, 99, 85, + (108,33,0): 110, 98, 82, + (108,34,0): 107, 98, 81, + (108,35,0): 107, 98, 81, + (108,36,0): 107, 98, 81, + (108,37,0): 104, 97, 79, + (108,38,0): 100, 93, 77, + (108,39,0): 96, 90, 74, + (108,40,0): 88, 82, 66, + (108,41,0): 82, 79, 62, + (108,42,0): 78, 75, 60, + (108,43,0): 73, 71, 56, + (108,44,0): 71, 69, 54, + (108,45,0): 68, 69, 53, + (108,46,0): 66, 67, 51, + (108,47,0): 63, 66, 49, + (108,48,0): 64, 72, 49, + (108,49,0): 65, 70, 47, + (108,50,0): 77, 71, 49, + (108,51,0): 83, 62, 43, + (108,52,0): 101, 62, 45, + (108,53,0): 148, 90, 76, + (108,54,0): 170, 96, 83, + (108,55,0): 153, 63, 52, + (108,56,0): 155, 52, 43, + (108,57,0): 179, 64, 57, + (108,58,0): 214, 89, 85, + (108,59,0): 241, 106, 103, + (108,60,0): 245, 101, 101, + (108,61,0): 235, 82, 85, + (108,62,0): 232, 73, 78, + (108,63,0): 233, 77, 80, + (108,64,0): 217, 73, 65, + (108,65,0): 211, 70, 60, + (108,66,0): 205, 64, 54, + (108,67,0): 203, 62, 52, + (108,68,0): 206, 64, 54, + (108,69,0): 210, 68, 58, + (108,70,0): 213, 71, 61, + (108,71,0): 215, 71, 62, + (108,72,0): 218, 74, 65, + (108,73,0): 218, 74, 65, + (108,74,0): 221, 74, 66, + (108,75,0): 221, 74, 66, + (108,76,0): 222, 75, 67, + (108,77,0): 222, 75, 67, + (108,78,0): 224, 75, 68, + (108,79,0): 224, 75, 69, + (108,80,0): 235, 83, 82, + (108,81,0): 232, 84, 84, + (108,82,0): 227, 83, 82, + (108,83,0): 220, 82, 79, + (108,84,0): 216, 83, 76, + (108,85,0): 216, 83, 76, + (108,86,0): 219, 85, 76, + (108,87,0): 224, 85, 78, + (108,88,0): 224, 76, 72, + (108,89,0): 225, 73, 70, + (108,90,0): 227, 69, 66, + (108,91,0): 226, 67, 64, + (108,92,0): 228, 66, 64, + (108,93,0): 226, 67, 64, + (108,94,0): 228, 69, 66, + (108,95,0): 224, 70, 68, + (108,96,0): 218, 73, 70, + (108,97,0): 203, 68, 64, + (108,98,0): 188, 61, 55, + (108,99,0): 174, 60, 50, + (108,100,0): 163, 62, 50, + (108,101,0): 153, 66, 49, + (108,102,0): 147, 68, 51, + (108,103,0): 146, 71, 52, + (108,104,0): 141, 68, 51, + (108,105,0): 138, 66, 51, + (108,106,0): 137, 65, 51, + (108,107,0): 132, 63, 48, + (108,108,0): 130, 62, 49, + (108,109,0): 128, 62, 48, + (108,110,0): 125, 62, 47, + (108,111,0): 125, 62, 47, + (108,112,0): 127, 59, 46, + (108,113,0): 128, 58, 46, + (108,114,0): 128, 58, 46, + (108,115,0): 128, 58, 46, + (108,116,0): 128, 61, 45, + (108,117,0): 129, 60, 45, + (108,118,0): 129, 60, 45, + (108,119,0): 131, 59, 45, + (108,120,0): 130, 57, 42, + (108,121,0): 132, 56, 42, + (108,122,0): 134, 56, 43, + (108,123,0): 138, 56, 42, + (108,124,0): 140, 57, 43, + (108,125,0): 144, 58, 45, + (108,126,0): 146, 58, 46, + (108,127,0): 148, 58, 47, + (108,128,0): 155, 59, 47, + (108,129,0): 158, 57, 45, + (108,130,0): 159, 57, 45, + (108,131,0): 160, 58, 44, + (108,132,0): 161, 57, 44, + (108,133,0): 162, 56, 43, + (108,134,0): 162, 56, 42, + (108,135,0): 162, 56, 42, + (108,136,0): 159, 56, 41, + (108,137,0): 156, 56, 41, + (108,138,0): 152, 56, 40, + (108,139,0): 148, 56, 41, + (108,140,0): 143, 57, 42, + (108,141,0): 140, 58, 44, + (108,142,0): 137, 58, 45, + (108,143,0): 135, 59, 45, + (108,144,0): 132, 58, 45, + (108,145,0): 130, 58, 44, + (108,146,0): 129, 57, 43, + (108,147,0): 128, 56, 42, + (108,148,0): 125, 56, 41, + (108,149,0): 125, 55, 43, + (108,150,0): 124, 56, 43, + (108,151,0): 123, 57, 43, + (108,152,0): 122, 56, 44, + (108,153,0): 121, 57, 45, + (108,154,0): 120, 58, 45, + (108,155,0): 118, 56, 43, + (108,156,0): 113, 53, 42, + (108,157,0): 111, 53, 41, + (108,158,0): 113, 55, 43, + (108,159,0): 116, 57, 43, + (108,160,0): 140, 72, 59, + (108,161,0): 141, 73, 60, + (108,162,0): 137, 73, 61, + (108,163,0): 132, 73, 59, + (108,164,0): 133, 75, 63, + (108,165,0): 140, 82, 70, + (108,166,0): 147, 87, 77, + (108,167,0): 152, 88, 79, + (108,168,0): 152, 81, 77, + (108,169,0): 156, 85, 81, + (108,170,0): 152, 82, 80, + (108,171,0): 147, 86, 81, + (108,172,0): 146, 96, 89, + (108,173,0): 136, 98, 87, + (108,174,0): 131, 103, 91, + (108,175,0): 134, 122, 100, + (108,176,0): 110, 114, 81, + (108,177,0): 90, 105, 64, + (108,178,0): 74, 89, 48, + (108,179,0): 65, 82, 40, + (108,180,0): 73, 90, 48, + (108,181,0): 87, 105, 63, + (108,182,0): 100, 118, 78, + (108,183,0): 106, 124, 86, + (108,184,0): 88, 105, 69, + (108,185,0): 76, 91, 58, + (108,186,0): 63, 76, 46, + (108,187,0): 58, 68, 41, + (108,188,0): 60, 68, 44, + (108,189,0): 62, 67, 45, + (108,190,0): 60, 65, 45, + (108,191,0): 58, 61, 44, + (108,192,0): 56, 57, 43, + (108,193,0): 58, 59, 45, + (108,194,0): 54, 56, 45, + (108,195,0): 56, 59, 48, + (108,196,0): 62, 66, 52, + (108,197,0): 55, 64, 45, + (108,198,0): 59, 72, 46, + (108,199,0): 76, 94, 56, + (108,200,0): 95, 117, 70, + (108,201,0): 105, 133, 74, + (108,202,0): 116, 147, 80, + (108,203,0): 116, 152, 80, + (108,204,0): 116, 152, 78, + (108,205,0): 114, 155, 79, + (108,206,0): 115, 155, 84, + (108,207,0): 112, 156, 81, + (108,208,0): 110, 157, 77, + (108,209,0): 109, 158, 76, + (108,210,0): 112, 161, 80, + (108,211,0): 119, 168, 89, + (108,212,0): 124, 170, 97, + (108,213,0): 122, 168, 96, + (108,214,0): 114, 157, 88, + (108,215,0): 105, 147, 81, + (108,216,0): 90, 131, 65, + (108,217,0): 92, 132, 69, + (108,218,0): 97, 136, 73, + (108,219,0): 101, 140, 77, + (108,220,0): 103, 142, 77, + (108,221,0): 103, 142, 75, + (108,222,0): 104, 141, 74, + (108,223,0): 102, 138, 76, + (108,224,0): 99, 134, 80, + (108,225,0): 89, 123, 73, + (108,226,0): 82, 116, 66, + (109,0,0): 105, 96, 81, + (109,1,0): 105, 96, 81, + (109,2,0): 105, 96, 81, + (109,3,0): 105, 96, 81, + (109,4,0): 105, 96, 81, + (109,5,0): 105, 96, 81, + (109,6,0): 105, 96, 81, + (109,7,0): 105, 96, 81, + (109,8,0): 107, 98, 83, + (109,9,0): 107, 98, 83, + (109,10,0): 107, 98, 83, + (109,11,0): 107, 98, 83, + (109,12,0): 107, 98, 83, + (109,13,0): 107, 98, 83, + (109,14,0): 107, 98, 83, + (109,15,0): 107, 97, 85, + (109,16,0): 108, 98, 89, + (109,17,0): 108, 98, 89, + (109,18,0): 108, 98, 89, + (109,19,0): 108, 98, 86, + (109,20,0): 108, 98, 86, + (109,21,0): 108, 99, 82, + (109,22,0): 108, 99, 82, + (109,23,0): 108, 100, 81, + (109,24,0): 108, 100, 81, + (109,25,0): 108, 100, 81, + (109,26,0): 108, 99, 82, + (109,27,0): 108, 99, 84, + (109,28,0): 108, 98, 86, + (109,29,0): 108, 98, 88, + (109,30,0): 108, 98, 88, + (109,31,0): 108, 98, 88, + (109,32,0): 111, 99, 85, + (109,33,0): 110, 98, 82, + (109,34,0): 107, 98, 81, + (109,35,0): 108, 99, 82, + (109,36,0): 108, 99, 82, + (109,37,0): 107, 98, 81, + (109,38,0): 103, 96, 80, + (109,39,0): 100, 93, 77, + (109,40,0): 94, 87, 71, + (109,41,0): 89, 83, 67, + (109,42,0): 83, 77, 63, + (109,43,0): 77, 74, 59, + (109,44,0): 75, 72, 57, + (109,45,0): 71, 69, 54, + (109,46,0): 69, 66, 51, + (109,47,0): 64, 65, 47, + (109,48,0): 61, 71, 46, + (109,49,0): 66, 70, 45, + (109,50,0): 81, 66, 45, + (109,51,0): 98, 61, 45, + (109,52,0): 129, 69, 58, + (109,53,0): 169, 89, 82, + (109,54,0): 178, 79, 74, + (109,55,0): 155, 46, 43, + (109,56,0): 175, 60, 57, + (109,57,0): 184, 62, 59, + (109,58,0): 208, 84, 82, + (109,59,0): 242, 112, 110, + (109,60,0): 254, 118, 118, + (109,61,0): 243, 100, 104, + (109,62,0): 237, 88, 94, + (109,63,0): 242, 93, 95, + (109,64,0): 227, 85, 81, + (109,65,0): 218, 80, 70, + (109,66,0): 212, 71, 64, + (109,67,0): 208, 67, 58, + (109,68,0): 209, 68, 61, + (109,69,0): 212, 71, 62, + (109,70,0): 214, 71, 65, + (109,71,0): 214, 71, 63, + (109,72,0): 217, 72, 67, + (109,73,0): 218, 74, 66, + (109,74,0): 220, 72, 68, + (109,75,0): 221, 74, 67, + (109,76,0): 222, 74, 70, + (109,77,0): 222, 75, 68, + (109,78,0): 224, 75, 71, + (109,79,0): 224, 75, 71, + (109,80,0): 226, 72, 72, + (109,81,0): 225, 71, 73, + (109,82,0): 220, 72, 72, + (109,83,0): 217, 71, 71, + (109,84,0): 214, 72, 68, + (109,85,0): 215, 72, 68, + (109,86,0): 216, 71, 66, + (109,87,0): 219, 70, 66, + (109,88,0): 224, 66, 65, + (109,89,0): 228, 65, 66, + (109,90,0): 230, 66, 65, + (109,91,0): 232, 66, 66, + (109,92,0): 231, 67, 66, + (109,93,0): 228, 66, 64, + (109,94,0): 223, 65, 62, + (109,95,0): 219, 65, 63, + (109,96,0): 221, 73, 71, + (109,97,0): 205, 66, 63, + (109,98,0): 188, 59, 54, + (109,99,0): 175, 61, 51, + (109,100,0): 165, 63, 51, + (109,101,0): 153, 64, 48, + (109,102,0): 146, 65, 48, + (109,103,0): 144, 67, 51, + (109,104,0): 140, 64, 50, + (109,105,0): 137, 64, 49, + (109,106,0): 136, 62, 49, + (109,107,0): 134, 60, 49, + (109,108,0): 132, 60, 48, + (109,109,0): 129, 59, 49, + (109,110,0): 129, 59, 49, + (109,111,0): 128, 60, 49, + (109,112,0): 128, 60, 49, + (109,113,0): 127, 61, 49, + (109,114,0): 127, 60, 51, + (109,115,0): 127, 61, 49, + (109,116,0): 127, 61, 49, + (109,117,0): 127, 61, 47, + (109,118,0): 127, 61, 49, + (109,119,0): 127, 61, 47, + (109,120,0): 128, 60, 47, + (109,121,0): 129, 60, 45, + (109,122,0): 131, 59, 45, + (109,123,0): 131, 57, 44, + (109,124,0): 133, 57, 44, + (109,125,0): 132, 56, 42, + (109,126,0): 133, 55, 43, + (109,127,0): 133, 54, 41, + (109,128,0): 141, 57, 46, + (109,129,0): 143, 56, 46, + (109,130,0): 145, 57, 45, + (109,131,0): 148, 58, 47, + (109,132,0): 151, 59, 46, + (109,133,0): 154, 61, 46, + (109,134,0): 158, 60, 47, + (109,135,0): 159, 62, 46, + (109,136,0): 153, 57, 41, + (109,137,0): 150, 57, 40, + (109,138,0): 147, 58, 42, + (109,139,0): 144, 58, 43, + (109,140,0): 138, 59, 44, + (109,141,0): 135, 59, 43, + (109,142,0): 132, 59, 44, + (109,143,0): 130, 58, 43, + (109,144,0): 130, 58, 44, + (109,145,0): 129, 57, 43, + (109,146,0): 127, 55, 41, + (109,147,0): 126, 54, 40, + (109,148,0): 123, 53, 41, + (109,149,0): 123, 53, 41, + (109,150,0): 123, 53, 41, + (109,151,0): 122, 54, 41, + (109,152,0): 120, 54, 42, + (109,153,0): 120, 56, 44, + (109,154,0): 119, 57, 44, + (109,155,0): 115, 56, 42, + (109,156,0): 112, 52, 41, + (109,157,0): 111, 53, 41, + (109,158,0): 114, 58, 45, + (109,159,0): 118, 60, 48, + (109,160,0): 139, 77, 64, + (109,161,0): 137, 75, 60, + (109,162,0): 132, 74, 60, + (109,163,0): 130, 77, 61, + (109,164,0): 133, 81, 67, + (109,165,0): 139, 86, 72, + (109,166,0): 146, 88, 77, + (109,167,0): 151, 87, 78, + (109,168,0): 147, 78, 73, + (109,169,0): 153, 84, 79, + (109,170,0): 151, 86, 82, + (109,171,0): 149, 92, 85, + (109,172,0): 144, 101, 92, + (109,173,0): 123, 94, 80, + (109,174,0): 102, 86, 70, + (109,175,0): 96, 94, 71, + (109,176,0): 69, 79, 45, + (109,177,0): 62, 78, 41, + (109,178,0): 63, 79, 40, + (109,179,0): 74, 92, 50, + (109,180,0): 95, 114, 69, + (109,181,0): 107, 126, 81, + (109,182,0): 101, 120, 75, + (109,183,0): 88, 106, 64, + (109,184,0): 77, 95, 55, + (109,185,0): 64, 81, 45, + (109,186,0): 54, 69, 38, + (109,187,0): 55, 68, 42, + (109,188,0): 61, 70, 49, + (109,189,0): 61, 68, 52, + (109,190,0): 58, 62, 48, + (109,191,0): 55, 59, 45, + (109,192,0): 56, 58, 44, + (109,193,0): 58, 59, 45, + (109,194,0): 54, 56, 45, + (109,195,0): 56, 59, 48, + (109,196,0): 62, 66, 52, + (109,197,0): 55, 64, 45, + (109,198,0): 57, 70, 44, + (109,199,0): 73, 91, 53, + (109,200,0): 91, 113, 66, + (109,201,0): 101, 129, 70, + (109,202,0): 114, 145, 78, + (109,203,0): 115, 151, 79, + (109,204,0): 115, 151, 77, + (109,205,0): 114, 155, 79, + (109,206,0): 115, 155, 84, + (109,207,0): 112, 156, 81, + (109,208,0): 109, 156, 76, + (109,209,0): 111, 160, 79, + (109,210,0): 115, 164, 85, + (109,211,0): 120, 168, 92, + (109,212,0): 122, 168, 96, + (109,213,0): 115, 160, 91, + (109,214,0): 105, 147, 81, + (109,215,0): 96, 138, 72, + (109,216,0): 89, 129, 66, + (109,217,0): 94, 134, 71, + (109,218,0): 101, 140, 77, + (109,219,0): 103, 142, 77, + (109,220,0): 102, 141, 74, + (109,221,0): 101, 141, 71, + (109,222,0): 103, 140, 71, + (109,223,0): 104, 140, 76, + (109,224,0): 97, 132, 78, + (109,225,0): 88, 122, 72, + (109,226,0): 81, 115, 65, + (110,0,0): 105, 96, 81, + (110,1,0): 105, 96, 81, + (110,2,0): 105, 96, 81, + (110,3,0): 105, 96, 81, + (110,4,0): 105, 96, 81, + (110,5,0): 105, 96, 81, + (110,6,0): 105, 96, 81, + (110,7,0): 105, 96, 81, + (110,8,0): 107, 98, 83, + (110,9,0): 107, 98, 83, + (110,10,0): 107, 98, 83, + (110,11,0): 107, 98, 83, + (110,12,0): 107, 98, 83, + (110,13,0): 107, 98, 83, + (110,14,0): 107, 98, 83, + (110,15,0): 107, 98, 83, + (110,16,0): 108, 98, 88, + (110,17,0): 108, 98, 86, + (110,18,0): 108, 98, 86, + (110,19,0): 108, 99, 82, + (110,20,0): 108, 99, 82, + (110,21,0): 108, 100, 79, + (110,22,0): 108, 100, 79, + (110,23,0): 108, 100, 77, + (110,24,0): 108, 100, 77, + (110,25,0): 108, 100, 77, + (110,26,0): 108, 100, 79, + (110,27,0): 108, 100, 81, + (110,28,0): 108, 99, 82, + (110,29,0): 108, 99, 84, + (110,30,0): 108, 98, 86, + (110,31,0): 108, 98, 86, + (110,32,0): 111, 99, 85, + (110,33,0): 109, 97, 83, + (110,34,0): 107, 98, 83, + (110,35,0): 108, 99, 84, + (110,36,0): 109, 100, 85, + (110,37,0): 108, 99, 84, + (110,38,0): 105, 96, 81, + (110,39,0): 102, 95, 79, + (110,40,0): 98, 91, 75, + (110,41,0): 94, 87, 71, + (110,42,0): 88, 81, 65, + (110,43,0): 82, 76, 60, + (110,44,0): 79, 73, 57, + (110,45,0): 74, 71, 54, + (110,46,0): 73, 67, 51, + (110,47,0): 65, 67, 46, + (110,48,0): 60, 70, 43, + (110,49,0): 66, 69, 42, + (110,50,0): 86, 64, 43, + (110,51,0): 122, 70, 57, + (110,52,0): 163, 80, 76, + (110,53,0): 178, 72, 72, + (110,54,0): 180, 57, 60, + (110,55,0): 183, 52, 57, + (110,56,0): 197, 67, 69, + (110,57,0): 193, 65, 64, + (110,58,0): 200, 75, 73, + (110,59,0): 222, 98, 96, + (110,60,0): 241, 113, 112, + (110,61,0): 242, 109, 112, + (110,62,0): 233, 97, 101, + (110,63,0): 228, 89, 92, + (110,64,0): 219, 81, 78, + (110,65,0): 213, 76, 68, + (110,66,0): 207, 68, 63, + (110,67,0): 205, 66, 59, + (110,68,0): 207, 68, 63, + (110,69,0): 208, 69, 62, + (110,70,0): 208, 66, 62, + (110,71,0): 205, 64, 57, + (110,72,0): 210, 67, 63, + (110,73,0): 210, 67, 61, + (110,74,0): 212, 67, 64, + (110,75,0): 213, 68, 63, + (110,76,0): 215, 67, 65, + (110,77,0): 216, 68, 64, + (110,78,0): 217, 69, 67, + (110,79,0): 218, 68, 67, + (110,80,0): 221, 65, 68, + (110,81,0): 221, 65, 68, + (110,82,0): 222, 68, 70, + (110,83,0): 221, 71, 72, + (110,84,0): 223, 73, 72, + (110,85,0): 224, 74, 73, + (110,86,0): 227, 73, 73, + (110,87,0): 229, 71, 72, + (110,88,0): 231, 65, 67, + (110,89,0): 234, 65, 68, + (110,90,0): 236, 66, 69, + (110,91,0): 236, 66, 69, + (110,92,0): 231, 65, 65, + (110,93,0): 226, 64, 62, + (110,94,0): 219, 61, 58, + (110,95,0): 214, 60, 58, + (110,96,0): 219, 69, 70, + (110,97,0): 204, 60, 60, + (110,98,0): 188, 54, 51, + (110,99,0): 177, 58, 50, + (110,100,0): 169, 62, 52, + (110,101,0): 155, 61, 49, + (110,102,0): 147, 61, 48, + (110,103,0): 145, 63, 49, + (110,104,0): 139, 60, 47, + (110,105,0): 139, 59, 48, + (110,106,0): 138, 58, 49, + (110,107,0): 137, 57, 48, + (110,108,0): 136, 56, 49, + (110,109,0): 135, 56, 51, + (110,110,0): 136, 57, 52, + (110,111,0): 133, 58, 52, + (110,112,0): 128, 60, 51, + (110,113,0): 125, 61, 51, + (110,114,0): 125, 61, 52, + (110,115,0): 125, 61, 51, + (110,116,0): 125, 61, 51, + (110,117,0): 125, 61, 49, + (110,118,0): 125, 61, 51, + (110,119,0): 124, 60, 48, + (110,120,0): 124, 60, 48, + (110,121,0): 124, 61, 46, + (110,122,0): 126, 60, 46, + (110,123,0): 126, 58, 45, + (110,124,0): 125, 57, 44, + (110,125,0): 125, 56, 41, + (110,126,0): 126, 54, 42, + (110,127,0): 126, 54, 42, + (110,128,0): 131, 57, 46, + (110,129,0): 131, 57, 46, + (110,130,0): 135, 57, 45, + (110,131,0): 137, 57, 46, + (110,132,0): 141, 57, 46, + (110,133,0): 145, 59, 46, + (110,134,0): 149, 60, 46, + (110,135,0): 150, 61, 45, + (110,136,0): 146, 57, 41, + (110,137,0): 145, 58, 41, + (110,138,0): 141, 58, 42, + (110,139,0): 138, 59, 42, + (110,140,0): 135, 59, 43, + (110,141,0): 131, 60, 42, + (110,142,0): 128, 59, 43, + (110,143,0): 126, 59, 42, + (110,144,0): 128, 56, 42, + (110,145,0): 128, 56, 44, + (110,146,0): 126, 54, 42, + (110,147,0): 125, 53, 41, + (110,148,0): 124, 52, 40, + (110,149,0): 122, 52, 40, + (110,150,0): 122, 52, 42, + (110,151,0): 121, 53, 42, + (110,152,0): 117, 50, 41, + (110,153,0): 118, 54, 44, + (110,154,0): 118, 56, 45, + (110,155,0): 114, 54, 43, + (110,156,0): 111, 51, 41, + (110,157,0): 111, 53, 42, + (110,158,0): 115, 58, 47, + (110,159,0): 120, 64, 51, + (110,160,0): 138, 80, 66, + (110,161,0): 134, 78, 63, + (110,162,0): 129, 78, 61, + (110,163,0): 130, 81, 64, + (110,164,0): 133, 86, 70, + (110,165,0): 137, 88, 73, + (110,166,0): 142, 85, 74, + (110,167,0): 145, 82, 73, + (110,168,0): 146, 79, 73, + (110,169,0): 151, 84, 78, + (110,170,0): 147, 84, 79, + (110,171,0): 145, 92, 86, + (110,172,0): 138, 102, 90, + (110,173,0): 110, 91, 74, + (110,174,0): 80, 75, 55, + (110,175,0): 69, 75, 49, + (110,176,0): 65, 78, 48, + (110,177,0): 75, 90, 57, + (110,178,0): 87, 103, 67, + (110,179,0): 96, 114, 74, + (110,180,0): 103, 121, 79, + (110,181,0): 100, 122, 76, + (110,182,0): 86, 108, 62, + (110,183,0): 71, 93, 47, + (110,184,0): 65, 86, 45, + (110,185,0): 55, 72, 36, + (110,186,0): 49, 64, 33, + (110,187,0): 54, 66, 42, + (110,188,0): 61, 70, 53, + (110,189,0): 60, 68, 57, + (110,190,0): 56, 61, 54, + (110,191,0): 55, 58, 51, + (110,192,0): 57, 59, 46, + (110,193,0): 59, 60, 46, + (110,194,0): 54, 56, 45, + (110,195,0): 57, 60, 49, + (110,196,0): 63, 67, 53, + (110,197,0): 55, 64, 45, + (110,198,0): 55, 68, 42, + (110,199,0): 70, 88, 50, + (110,200,0): 86, 108, 61, + (110,201,0): 97, 125, 66, + (110,202,0): 111, 142, 75, + (110,203,0): 113, 149, 77, + (110,204,0): 115, 151, 77, + (110,205,0): 114, 155, 79, + (110,206,0): 116, 156, 85, + (110,207,0): 113, 157, 82, + (110,208,0): 111, 158, 80, + (110,209,0): 113, 162, 81, + (110,210,0): 117, 166, 87, + (110,211,0): 118, 166, 90, + (110,212,0): 115, 161, 89, + (110,213,0): 106, 151, 82, + (110,214,0): 98, 140, 74, + (110,215,0): 91, 133, 69, + (110,216,0): 94, 134, 72, + (110,217,0): 96, 136, 73, + (110,218,0): 99, 138, 75, + (110,219,0): 101, 140, 75, + (110,220,0): 102, 141, 74, + (110,221,0): 102, 142, 72, + (110,222,0): 102, 139, 70, + (110,223,0): 101, 137, 73, + (110,224,0): 96, 131, 77, + (110,225,0): 87, 121, 71, + (110,226,0): 80, 114, 64, + (111,0,0): 105, 96, 81, + (111,1,0): 105, 96, 81, + (111,2,0): 105, 96, 81, + (111,3,0): 105, 96, 81, + (111,4,0): 105, 96, 81, + (111,5,0): 105, 96, 81, + (111,6,0): 105, 96, 81, + (111,7,0): 105, 96, 81, + (111,8,0): 107, 98, 83, + (111,9,0): 107, 98, 83, + (111,10,0): 107, 98, 83, + (111,11,0): 107, 98, 83, + (111,12,0): 107, 98, 83, + (111,13,0): 107, 98, 83, + (111,14,0): 107, 98, 83, + (111,15,0): 107, 98, 83, + (111,16,0): 108, 98, 86, + (111,17,0): 108, 99, 84, + (111,18,0): 108, 99, 84, + (111,19,0): 108, 99, 82, + (111,20,0): 108, 100, 81, + (111,21,0): 108, 100, 79, + (111,22,0): 108, 100, 79, + (111,23,0): 108, 100, 77, + (111,24,0): 108, 100, 77, + (111,25,0): 108, 100, 79, + (111,26,0): 108, 100, 79, + (111,27,0): 108, 100, 81, + (111,28,0): 108, 99, 82, + (111,29,0): 108, 99, 84, + (111,30,0): 108, 99, 84, + (111,31,0): 108, 99, 84, + (111,32,0): 110, 98, 84, + (111,33,0): 109, 97, 83, + (111,34,0): 109, 97, 83, + (111,35,0): 109, 97, 83, + (111,36,0): 109, 100, 85, + (111,37,0): 108, 99, 84, + (111,38,0): 106, 97, 82, + (111,39,0): 103, 96, 80, + (111,40,0): 100, 93, 77, + (111,41,0): 96, 89, 73, + (111,42,0): 90, 83, 67, + (111,43,0): 85, 78, 62, + (111,44,0): 80, 75, 56, + (111,45,0): 77, 72, 53, + (111,46,0): 73, 68, 49, + (111,47,0): 69, 67, 46, + (111,48,0): 65, 69, 42, + (111,49,0): 71, 67, 40, + (111,50,0): 92, 65, 44, + (111,51,0): 137, 83, 71, + (111,52,0): 175, 92, 88, + (111,53,0): 169, 63, 65, + (111,54,0): 169, 49, 51, + (111,55,0): 203, 74, 78, + (111,56,0): 195, 64, 69, + (111,57,0): 189, 61, 62, + (111,58,0): 185, 59, 60, + (111,59,0): 195, 71, 71, + (111,60,0): 216, 90, 91, + (111,61,0): 229, 101, 102, + (111,62,0): 221, 88, 91, + (111,63,0): 205, 71, 72, + (111,64,0): 209, 74, 71, + (111,65,0): 207, 69, 66, + (111,66,0): 205, 66, 63, + (111,67,0): 206, 67, 62, + (111,68,0): 210, 71, 66, + (111,69,0): 210, 71, 66, + (111,70,0): 206, 67, 62, + (111,71,0): 201, 62, 55, + (111,72,0): 207, 68, 61, + (111,73,0): 209, 68, 61, + (111,74,0): 210, 68, 64, + (111,75,0): 212, 69, 65, + (111,76,0): 214, 69, 66, + (111,77,0): 217, 69, 67, + (111,78,0): 220, 67, 69, + (111,79,0): 222, 68, 70, + (111,80,0): 222, 63, 67, + (111,81,0): 223, 64, 68, + (111,82,0): 222, 66, 69, + (111,83,0): 223, 69, 69, + (111,84,0): 225, 71, 71, + (111,85,0): 224, 70, 70, + (111,86,0): 224, 66, 67, + (111,87,0): 225, 62, 63, + (111,88,0): 232, 66, 68, + (111,89,0): 234, 64, 67, + (111,90,0): 232, 62, 65, + (111,91,0): 231, 61, 62, + (111,92,0): 228, 62, 62, + (111,93,0): 228, 64, 63, + (111,94,0): 226, 67, 64, + (111,95,0): 223, 69, 67, + (111,96,0): 215, 65, 66, + (111,97,0): 200, 56, 56, + (111,98,0): 184, 52, 48, + (111,99,0): 177, 58, 52, + (111,100,0): 169, 62, 54, + (111,101,0): 155, 61, 51, + (111,102,0): 146, 60, 47, + (111,103,0): 142, 63, 50, + (111,104,0): 137, 59, 47, + (111,105,0): 136, 58, 48, + (111,106,0): 136, 58, 48, + (111,107,0): 136, 56, 49, + (111,108,0): 136, 55, 51, + (111,109,0): 138, 55, 51, + (111,110,0): 137, 56, 52, + (111,111,0): 136, 59, 53, + (111,112,0): 128, 58, 50, + (111,113,0): 126, 59, 50, + (111,114,0): 126, 59, 50, + (111,115,0): 124, 60, 50, + (111,116,0): 124, 60, 48, + (111,117,0): 124, 60, 48, + (111,118,0): 124, 60, 48, + (111,119,0): 124, 60, 48, + (111,120,0): 120, 56, 44, + (111,121,0): 121, 57, 45, + (111,122,0): 124, 58, 46, + (111,123,0): 124, 58, 46, + (111,124,0): 125, 59, 45, + (111,125,0): 125, 59, 45, + (111,126,0): 125, 57, 44, + (111,127,0): 125, 57, 44, + (111,128,0): 126, 58, 47, + (111,129,0): 127, 57, 47, + (111,130,0): 128, 55, 46, + (111,131,0): 129, 55, 44, + (111,132,0): 132, 54, 42, + (111,133,0): 133, 53, 42, + (111,134,0): 134, 55, 42, + (111,135,0): 134, 55, 40, + (111,136,0): 138, 56, 42, + (111,137,0): 136, 57, 42, + (111,138,0): 136, 59, 43, + (111,139,0): 133, 60, 45, + (111,140,0): 132, 60, 45, + (111,141,0): 128, 61, 44, + (111,142,0): 126, 60, 44, + (111,143,0): 125, 59, 43, + (111,144,0): 125, 57, 44, + (111,145,0): 125, 55, 45, + (111,146,0): 124, 54, 44, + (111,147,0): 121, 53, 42, + (111,148,0): 122, 52, 42, + (111,149,0): 120, 52, 41, + (111,150,0): 120, 52, 41, + (111,151,0): 120, 53, 44, + (111,152,0): 114, 50, 40, + (111,153,0): 117, 53, 43, + (111,154,0): 118, 56, 45, + (111,155,0): 114, 54, 43, + (111,156,0): 110, 52, 41, + (111,157,0): 110, 53, 42, + (111,158,0): 116, 59, 48, + (111,159,0): 120, 66, 54, + (111,160,0): 138, 85, 71, + (111,161,0): 132, 80, 66, + (111,162,0): 128, 79, 64, + (111,163,0): 132, 83, 68, + (111,164,0): 136, 87, 73, + (111,165,0): 140, 86, 74, + (111,166,0): 140, 82, 71, + (111,167,0): 141, 78, 71, + (111,168,0): 149, 84, 78, + (111,169,0): 148, 85, 78, + (111,170,0): 139, 82, 75, + (111,171,0): 132, 88, 77, + (111,172,0): 127, 100, 83, + (111,173,0): 101, 90, 68, + (111,174,0): 71, 75, 50, + (111,175,0): 61, 74, 44, + (111,176,0): 73, 88, 57, + (111,177,0): 90, 107, 73, + (111,178,0): 103, 120, 84, + (111,179,0): 99, 120, 81, + (111,180,0): 89, 110, 69, + (111,181,0): 83, 104, 61, + (111,182,0): 78, 99, 56, + (111,183,0): 74, 95, 52, + (111,184,0): 58, 76, 38, + (111,185,0): 48, 63, 30, + (111,186,0): 44, 57, 29, + (111,187,0): 53, 62, 41, + (111,188,0): 61, 67, 53, + (111,189,0): 60, 66, 56, + (111,190,0): 58, 60, 55, + (111,191,0): 57, 60, 53, + (111,192,0): 59, 61, 50, + (111,193,0): 59, 61, 48, + (111,194,0): 55, 57, 46, + (111,195,0): 57, 60, 49, + (111,196,0): 63, 67, 53, + (111,197,0): 56, 63, 45, + (111,198,0): 56, 66, 41, + (111,199,0): 69, 85, 49, + (111,200,0): 85, 104, 59, + (111,201,0): 97, 122, 67, + (111,202,0): 110, 138, 77, + (111,203,0): 114, 147, 78, + (111,204,0): 114, 150, 78, + (111,205,0): 114, 154, 81, + (111,206,0): 115, 157, 83, + (111,207,0): 113, 157, 82, + (111,208,0): 114, 160, 85, + (111,209,0): 117, 163, 88, + (111,210,0): 118, 164, 91, + (111,211,0): 116, 162, 90, + (111,212,0): 111, 154, 85, + (111,213,0): 102, 144, 78, + (111,214,0): 94, 136, 72, + (111,215,0): 91, 131, 68, + (111,216,0): 100, 140, 78, + (111,217,0): 97, 137, 75, + (111,218,0): 96, 135, 72, + (111,219,0): 99, 138, 73, + (111,220,0): 102, 141, 74, + (111,221,0): 103, 142, 75, + (111,222,0): 101, 138, 69, + (111,223,0): 97, 133, 69, + (111,224,0): 96, 131, 77, + (111,225,0): 87, 121, 71, + (111,226,0): 80, 114, 64, + (112,0,0): 105, 96, 81, + (112,1,0): 105, 96, 81, + (112,2,0): 105, 96, 81, + (112,3,0): 106, 97, 82, + (112,4,0): 106, 97, 82, + (112,5,0): 107, 98, 83, + (112,6,0): 107, 98, 83, + (112,7,0): 107, 98, 83, + (112,8,0): 106, 97, 82, + (112,9,0): 106, 97, 82, + (112,10,0): 106, 97, 82, + (112,11,0): 106, 97, 82, + (112,12,0): 106, 97, 82, + (112,13,0): 106, 97, 82, + (112,14,0): 106, 97, 82, + (112,15,0): 106, 97, 82, + (112,16,0): 107, 98, 83, + (112,17,0): 107, 98, 83, + (112,18,0): 107, 98, 83, + (112,19,0): 107, 98, 83, + (112,20,0): 107, 98, 81, + (112,21,0): 107, 98, 81, + (112,22,0): 107, 98, 81, + (112,23,0): 107, 98, 81, + (112,24,0): 108, 99, 82, + (112,25,0): 108, 99, 82, + (112,26,0): 108, 99, 82, + (112,27,0): 108, 99, 82, + (112,28,0): 108, 99, 84, + (112,29,0): 108, 99, 84, + (112,30,0): 108, 99, 84, + (112,31,0): 110, 98, 84, + (112,32,0): 107, 93, 80, + (112,33,0): 112, 96, 81, + (112,34,0): 116, 100, 87, + (112,35,0): 114, 100, 87, + (112,36,0): 110, 98, 86, + (112,37,0): 106, 96, 84, + (112,38,0): 104, 96, 83, + (112,39,0): 104, 98, 84, + (112,40,0): 103, 97, 83, + (112,41,0): 103, 97, 81, + (112,42,0): 99, 93, 77, + (112,43,0): 91, 86, 67, + (112,44,0): 86, 81, 61, + (112,45,0): 83, 78, 56, + (112,46,0): 78, 72, 50, + (112,47,0): 71, 65, 41, + (112,48,0): 76, 70, 44, + (112,49,0): 74, 62, 36, + (112,50,0): 98, 73, 51, + (112,51,0): 145, 103, 87, + (112,52,0): 182, 120, 109, + (112,53,0): 187, 108, 101, + (112,54,0): 183, 89, 87, + (112,55,0): 185, 79, 79, + (112,56,0): 182, 66, 69, + (112,57,0): 189, 66, 69, + (112,58,0): 194, 68, 71, + (112,59,0): 200, 70, 72, + (112,60,0): 205, 72, 75, + (112,61,0): 208, 74, 75, + (112,62,0): 211, 75, 77, + (112,63,0): 211, 75, 77, + (112,64,0): 205, 69, 69, + (112,65,0): 205, 69, 69, + (112,66,0): 208, 70, 68, + (112,67,0): 211, 72, 69, + (112,68,0): 212, 70, 66, + (112,69,0): 207, 68, 61, + (112,70,0): 206, 67, 60, + (112,71,0): 207, 70, 60, + (112,72,0): 200, 68, 56, + (112,73,0): 201, 69, 57, + (112,74,0): 203, 69, 60, + (112,75,0): 207, 68, 63, + (112,76,0): 212, 67, 64, + (112,77,0): 216, 66, 67, + (112,78,0): 222, 63, 68, + (112,79,0): 222, 61, 67, + (112,80,0): 225, 66, 70, + (112,81,0): 223, 67, 68, + (112,82,0): 223, 67, 68, + (112,83,0): 224, 68, 69, + (112,84,0): 224, 68, 69, + (112,85,0): 225, 70, 68, + (112,86,0): 225, 70, 68, + (112,87,0): 227, 69, 68, + (112,88,0): 227, 67, 67, + (112,89,0): 228, 66, 64, + (112,90,0): 228, 64, 63, + (112,91,0): 227, 63, 62, + (112,92,0): 227, 63, 62, + (112,93,0): 227, 63, 61, + (112,94,0): 227, 63, 61, + (112,95,0): 224, 66, 63, + (112,96,0): 211, 66, 63, + (112,97,0): 197, 62, 58, + (112,98,0): 184, 57, 51, + (112,99,0): 170, 55, 48, + (112,100,0): 160, 57, 48, + (112,101,0): 151, 61, 50, + (112,102,0): 142, 62, 51, + (112,103,0): 134, 62, 50, + (112,104,0): 131, 63, 50, + (112,105,0): 129, 63, 51, + (112,106,0): 129, 61, 50, + (112,107,0): 129, 59, 51, + (112,108,0): 132, 57, 51, + (112,109,0): 135, 56, 51, + (112,110,0): 136, 56, 49, + (112,111,0): 136, 57, 50, + (112,112,0): 133, 59, 48, + (112,113,0): 132, 60, 46, + (112,114,0): 132, 60, 46, + (112,115,0): 129, 60, 45, + (112,116,0): 129, 59, 47, + (112,117,0): 128, 58, 46, + (112,118,0): 128, 58, 46, + (112,119,0): 128, 58, 46, + (112,120,0): 126, 58, 45, + (112,121,0): 126, 58, 45, + (112,122,0): 126, 58, 45, + (112,123,0): 126, 58, 45, + (112,124,0): 126, 58, 47, + (112,125,0): 126, 58, 47, + (112,126,0): 126, 58, 47, + (112,127,0): 126, 58, 47, + (112,128,0): 125, 57, 48, + (112,129,0): 125, 57, 48, + (112,130,0): 126, 56, 48, + (112,131,0): 126, 56, 46, + (112,132,0): 128, 55, 46, + (112,133,0): 128, 55, 46, + (112,134,0): 128, 55, 46, + (112,135,0): 126, 56, 44, + (112,136,0): 128, 56, 44, + (112,137,0): 126, 56, 44, + (112,138,0): 125, 57, 44, + (112,139,0): 124, 56, 45, + (112,140,0): 123, 57, 45, + (112,141,0): 122, 56, 44, + (112,142,0): 120, 56, 44, + (112,143,0): 120, 56, 44, + (112,144,0): 120, 56, 46, + (112,145,0): 120, 56, 46, + (112,146,0): 119, 55, 45, + (112,147,0): 118, 56, 45, + (112,148,0): 118, 54, 44, + (112,149,0): 116, 54, 43, + (112,150,0): 115, 53, 42, + (112,151,0): 113, 53, 43, + (112,152,0): 109, 49, 39, + (112,153,0): 114, 54, 44, + (112,154,0): 110, 52, 41, + (112,155,0): 109, 51, 40, + (112,156,0): 111, 54, 43, + (112,157,0): 109, 52, 41, + (112,158,0): 113, 56, 45, + (112,159,0): 127, 73, 61, + (112,160,0): 133, 83, 72, + (112,161,0): 133, 83, 74, + (112,162,0): 134, 82, 71, + (112,163,0): 136, 82, 72, + (112,164,0): 139, 80, 72, + (112,165,0): 144, 81, 74, + (112,166,0): 148, 81, 75, + (112,167,0): 149, 82, 76, + (112,168,0): 147, 84, 77, + (112,169,0): 141, 84, 75, + (112,170,0): 137, 91, 78, + (112,171,0): 130, 99, 81, + (112,172,0): 111, 95, 72, + (112,173,0): 89, 85, 58, + (112,174,0): 77, 86, 55, + (112,175,0): 79, 95, 59, + (112,176,0): 106, 126, 89, + (112,177,0): 98, 120, 81, + (112,178,0): 89, 111, 72, + (112,179,0): 85, 106, 67, + (112,180,0): 82, 103, 64, + (112,181,0): 77, 98, 59, + (112,182,0): 73, 89, 53, + (112,183,0): 67, 82, 49, + (112,184,0): 55, 68, 38, + (112,185,0): 52, 62, 35, + (112,186,0): 50, 58, 35, + (112,187,0): 54, 59, 39, + (112,188,0): 60, 62, 48, + (112,189,0): 64, 66, 53, + (112,190,0): 64, 64, 54, + (112,191,0): 60, 62, 51, + (112,192,0): 53, 56, 45, + (112,193,0): 51, 57, 45, + (112,194,0): 52, 58, 46, + (112,195,0): 55, 58, 47, + (112,196,0): 57, 61, 47, + (112,197,0): 59, 63, 46, + (112,198,0): 61, 66, 44, + (112,199,0): 60, 69, 40, + (112,200,0): 83, 95, 59, + (112,201,0): 97, 114, 70, + (112,202,0): 110, 134, 82, + (112,203,0): 115, 145, 85, + (112,204,0): 114, 149, 81, + (112,205,0): 114, 154, 83, + (112,206,0): 115, 157, 83, + (112,207,0): 114, 157, 85, + (112,208,0): 117, 158, 90, + (112,209,0): 126, 167, 101, + (112,210,0): 126, 167, 101, + (112,211,0): 112, 152, 89, + (112,212,0): 98, 138, 75, + (112,213,0): 94, 134, 71, + (112,214,0): 94, 134, 72, + (112,215,0): 94, 132, 71, + (112,216,0): 96, 134, 73, + (112,217,0): 98, 136, 75, + (112,218,0): 100, 138, 77, + (112,219,0): 102, 141, 78, + (112,220,0): 101, 140, 77, + (112,221,0): 99, 138, 75, + (112,222,0): 96, 135, 72, + (112,223,0): 94, 132, 71, + (112,224,0): 95, 130, 76, + (112,225,0): 84, 118, 68, + (112,226,0): 75, 109, 59, + (113,0,0): 105, 96, 81, + (113,1,0): 105, 96, 81, + (113,2,0): 105, 96, 81, + (113,3,0): 106, 97, 82, + (113,4,0): 106, 97, 82, + (113,5,0): 107, 98, 83, + (113,6,0): 107, 98, 83, + (113,7,0): 107, 98, 83, + (113,8,0): 106, 97, 82, + (113,9,0): 106, 97, 82, + (113,10,0): 106, 97, 82, + (113,11,0): 106, 97, 82, + (113,12,0): 106, 97, 82, + (113,13,0): 106, 97, 82, + (113,14,0): 106, 97, 82, + (113,15,0): 106, 97, 82, + (113,16,0): 107, 98, 83, + (113,17,0): 107, 98, 83, + (113,18,0): 107, 98, 83, + (113,19,0): 107, 98, 83, + (113,20,0): 107, 98, 83, + (113,21,0): 107, 98, 83, + (113,22,0): 107, 98, 83, + (113,23,0): 107, 98, 83, + (113,24,0): 108, 99, 84, + (113,25,0): 108, 99, 84, + (113,26,0): 108, 99, 84, + (113,27,0): 108, 99, 84, + (113,28,0): 108, 99, 84, + (113,29,0): 108, 99, 84, + (113,30,0): 108, 99, 84, + (113,31,0): 110, 98, 84, + (113,32,0): 114, 98, 83, + (113,33,0): 113, 97, 82, + (113,34,0): 114, 98, 85, + (113,35,0): 113, 99, 86, + (113,36,0): 114, 102, 90, + (113,37,0): 111, 103, 90, + (113,38,0): 109, 101, 88, + (113,39,0): 106, 100, 86, + (113,40,0): 103, 99, 87, + (113,41,0): 107, 104, 89, + (113,42,0): 111, 105, 89, + (113,43,0): 108, 103, 84, + (113,44,0): 104, 99, 79, + (113,45,0): 99, 94, 72, + (113,46,0): 91, 85, 61, + (113,47,0): 82, 76, 52, + (113,48,0): 80, 74, 48, + (113,49,0): 72, 62, 37, + (113,50,0): 81, 63, 41, + (113,51,0): 107, 80, 61, + (113,52,0): 127, 88, 71, + (113,53,0): 132, 78, 66, + (113,54,0): 136, 69, 61, + (113,55,0): 147, 68, 63, + (113,56,0): 177, 87, 86, + (113,57,0): 184, 84, 84, + (113,58,0): 187, 81, 81, + (113,59,0): 192, 80, 79, + (113,60,0): 192, 78, 77, + (113,61,0): 193, 77, 77, + (113,62,0): 194, 76, 74, + (113,63,0): 194, 76, 74, + (113,64,0): 205, 85, 84, + (113,65,0): 197, 73, 71, + (113,66,0): 192, 62, 62, + (113,67,0): 195, 61, 58, + (113,68,0): 205, 67, 64, + (113,69,0): 209, 70, 65, + (113,70,0): 205, 66, 59, + (113,71,0): 199, 62, 52, + (113,72,0): 202, 68, 57, + (113,73,0): 202, 68, 57, + (113,74,0): 204, 70, 61, + (113,75,0): 208, 69, 62, + (113,76,0): 214, 69, 66, + (113,77,0): 219, 66, 68, + (113,78,0): 223, 64, 69, + (113,79,0): 224, 63, 69, + (113,80,0): 223, 67, 70, + (113,81,0): 223, 67, 68, + (113,82,0): 223, 67, 68, + (113,83,0): 223, 69, 69, + (113,84,0): 224, 69, 67, + (113,85,0): 224, 70, 68, + (113,86,0): 225, 70, 68, + (113,87,0): 225, 70, 68, + (113,88,0): 224, 69, 65, + (113,89,0): 225, 67, 64, + (113,90,0): 224, 66, 63, + (113,91,0): 224, 65, 62, + (113,92,0): 226, 64, 61, + (113,93,0): 226, 64, 61, + (113,94,0): 226, 64, 61, + (113,95,0): 224, 66, 63, + (113,96,0): 213, 68, 63, + (113,97,0): 200, 67, 60, + (113,98,0): 186, 62, 54, + (113,99,0): 172, 58, 48, + (113,100,0): 160, 57, 48, + (113,101,0): 148, 58, 47, + (113,102,0): 138, 60, 48, + (113,103,0): 130, 60, 48, + (113,104,0): 128, 65, 50, + (113,105,0): 126, 64, 51, + (113,106,0): 126, 62, 52, + (113,107,0): 127, 60, 51, + (113,108,0): 131, 58, 51, + (113,109,0): 134, 57, 49, + (113,110,0): 136, 56, 49, + (113,111,0): 137, 57, 48, + (113,112,0): 135, 59, 46, + (113,113,0): 133, 60, 45, + (113,114,0): 132, 59, 44, + (113,115,0): 132, 59, 44, + (113,116,0): 131, 59, 45, + (113,117,0): 130, 58, 44, + (113,118,0): 130, 58, 44, + (113,119,0): 130, 58, 44, + (113,120,0): 127, 57, 45, + (113,121,0): 127, 57, 45, + (113,122,0): 127, 57, 45, + (113,123,0): 127, 57, 45, + (113,124,0): 126, 58, 47, + (113,125,0): 126, 58, 47, + (113,126,0): 126, 58, 47, + (113,127,0): 126, 58, 47, + (113,128,0): 125, 57, 48, + (113,129,0): 125, 57, 48, + (113,130,0): 125, 57, 48, + (113,131,0): 125, 57, 48, + (113,132,0): 125, 57, 48, + (113,133,0): 125, 57, 48, + (113,134,0): 124, 57, 48, + (113,135,0): 124, 57, 48, + (113,136,0): 124, 57, 48, + (113,137,0): 122, 58, 48, + (113,138,0): 122, 58, 48, + (113,139,0): 121, 57, 47, + (113,140,0): 121, 57, 47, + (113,141,0): 121, 57, 47, + (113,142,0): 119, 57, 46, + (113,143,0): 119, 57, 46, + (113,144,0): 119, 56, 47, + (113,145,0): 119, 56, 47, + (113,146,0): 116, 56, 46, + (113,147,0): 115, 55, 45, + (113,148,0): 114, 54, 44, + (113,149,0): 114, 54, 44, + (113,150,0): 112, 54, 43, + (113,151,0): 112, 54, 43, + (113,152,0): 107, 49, 38, + (113,153,0): 113, 55, 44, + (113,154,0): 109, 52, 41, + (113,155,0): 108, 51, 40, + (113,156,0): 111, 54, 43, + (113,157,0): 108, 51, 40, + (113,158,0): 112, 55, 44, + (113,159,0): 126, 72, 62, + (113,160,0): 132, 82, 73, + (113,161,0): 133, 83, 76, + (113,162,0): 136, 81, 74, + (113,163,0): 139, 80, 74, + (113,164,0): 144, 81, 76, + (113,165,0): 148, 80, 77, + (113,166,0): 149, 81, 78, + (113,167,0): 148, 83, 79, + (113,168,0): 138, 79, 71, + (113,169,0): 133, 83, 72, + (113,170,0): 128, 91, 75, + (113,171,0): 123, 101, 80, + (113,172,0): 115, 105, 80, + (113,173,0): 104, 107, 76, + (113,174,0): 102, 113, 81, + (113,175,0): 103, 120, 84, + (113,176,0): 94, 116, 77, + (113,177,0): 88, 110, 71, + (113,178,0): 80, 102, 63, + (113,179,0): 76, 97, 58, + (113,180,0): 75, 95, 58, + (113,181,0): 75, 92, 58, + (113,182,0): 71, 86, 55, + (113,183,0): 67, 80, 52, + (113,184,0): 60, 70, 45, + (113,185,0): 56, 64, 41, + (113,186,0): 54, 59, 39, + (113,187,0): 55, 58, 41, + (113,188,0): 60, 61, 47, + (113,189,0): 63, 64, 50, + (113,190,0): 62, 62, 50, + (113,191,0): 59, 61, 48, + (113,192,0): 52, 58, 48, + (113,193,0): 51, 59, 48, + (113,194,0): 53, 59, 49, + (113,195,0): 54, 60, 48, + (113,196,0): 58, 60, 47, + (113,197,0): 60, 63, 46, + (113,198,0): 62, 65, 44, + (113,199,0): 62, 68, 42, + (113,200,0): 81, 91, 57, + (113,201,0): 94, 109, 68, + (113,202,0): 107, 129, 82, + (113,203,0): 112, 140, 82, + (113,204,0): 112, 147, 83, + (113,205,0): 113, 153, 82, + (113,206,0): 115, 157, 83, + (113,207,0): 115, 158, 86, + (113,208,0): 120, 159, 94, + (113,209,0): 124, 162, 101, + (113,210,0): 120, 158, 97, + (113,211,0): 107, 145, 84, + (113,212,0): 96, 134, 73, + (113,213,0): 93, 131, 70, + (113,214,0): 93, 131, 70, + (113,215,0): 92, 130, 69, + (113,216,0): 96, 134, 73, + (113,217,0): 97, 135, 74, + (113,218,0): 99, 137, 76, + (113,219,0): 101, 139, 78, + (113,220,0): 100, 138, 77, + (113,221,0): 98, 136, 75, + (113,222,0): 96, 134, 73, + (113,223,0): 94, 132, 73, + (113,224,0): 93, 127, 76, + (113,225,0): 82, 116, 66, + (113,226,0): 73, 107, 57, + (114,0,0): 105, 96, 81, + (114,1,0): 105, 96, 81, + (114,2,0): 105, 96, 81, + (114,3,0): 106, 97, 82, + (114,4,0): 106, 97, 82, + (114,5,0): 107, 98, 83, + (114,6,0): 107, 98, 83, + (114,7,0): 107, 98, 83, + (114,8,0): 106, 97, 82, + (114,9,0): 106, 97, 82, + (114,10,0): 106, 97, 82, + (114,11,0): 106, 97, 82, + (114,12,0): 106, 97, 82, + (114,13,0): 106, 97, 82, + (114,14,0): 106, 97, 82, + (114,15,0): 106, 97, 82, + (114,16,0): 107, 98, 83, + (114,17,0): 107, 98, 83, + (114,18,0): 107, 98, 83, + (114,19,0): 107, 98, 83, + (114,20,0): 107, 98, 83, + (114,21,0): 107, 98, 83, + (114,22,0): 107, 98, 83, + (114,23,0): 107, 98, 83, + (114,24,0): 108, 99, 84, + (114,25,0): 108, 99, 84, + (114,26,0): 108, 99, 84, + (114,27,0): 108, 99, 84, + (114,28,0): 108, 99, 84, + (114,29,0): 108, 99, 84, + (114,30,0): 108, 99, 84, + (114,31,0): 110, 98, 84, + (114,32,0): 113, 100, 84, + (114,33,0): 111, 95, 80, + (114,34,0): 109, 93, 80, + (114,35,0): 109, 95, 82, + (114,36,0): 113, 101, 89, + (114,37,0): 111, 103, 92, + (114,38,0): 108, 100, 89, + (114,39,0): 104, 98, 86, + (114,40,0): 102, 98, 87, + (114,41,0): 112, 108, 96, + (114,42,0): 123, 120, 105, + (114,43,0): 126, 123, 106, + (114,44,0): 127, 121, 105, + (114,45,0): 122, 117, 98, + (114,46,0): 112, 105, 86, + (114,47,0): 101, 96, 74, + (114,48,0): 84, 84, 60, + (114,49,0): 70, 70, 46, + (114,50,0): 67, 62, 40, + (114,51,0): 77, 66, 46, + (114,52,0): 83, 64, 47, + (114,53,0): 85, 56, 40, + (114,54,0): 93, 55, 42, + (114,55,0): 108, 61, 51, + (114,56,0): 110, 55, 48, + (114,57,0): 117, 57, 49, + (114,58,0): 126, 59, 53, + (114,59,0): 135, 64, 58, + (114,60,0): 146, 73, 66, + (114,61,0): 155, 80, 74, + (114,62,0): 165, 88, 80, + (114,63,0): 171, 91, 82, + (114,64,0): 185, 94, 89, + (114,65,0): 183, 84, 78, + (114,66,0): 181, 72, 69, + (114,67,0): 186, 67, 63, + (114,68,0): 198, 68, 66, + (114,69,0): 206, 71, 67, + (114,70,0): 210, 68, 64, + (114,71,0): 207, 64, 58, + (114,72,0): 208, 65, 59, + (114,73,0): 209, 66, 60, + (114,74,0): 211, 68, 62, + (114,75,0): 213, 70, 64, + (114,76,0): 215, 70, 67, + (114,77,0): 219, 69, 70, + (114,78,0): 222, 68, 70, + (114,79,0): 222, 68, 70, + (114,80,0): 222, 68, 68, + (114,81,0): 222, 68, 68, + (114,82,0): 222, 68, 68, + (114,83,0): 221, 69, 68, + (114,84,0): 223, 69, 69, + (114,85,0): 222, 70, 69, + (114,86,0): 223, 69, 67, + (114,87,0): 223, 69, 67, + (114,88,0): 222, 68, 66, + (114,89,0): 222, 68, 66, + (114,90,0): 221, 68, 63, + (114,91,0): 220, 67, 62, + (114,92,0): 221, 66, 61, + (114,93,0): 221, 66, 61, + (114,94,0): 221, 66, 61, + (114,95,0): 220, 67, 62, + (114,96,0): 214, 69, 64, + (114,97,0): 206, 69, 63, + (114,98,0): 195, 66, 60, + (114,99,0): 179, 62, 53, + (114,100,0): 162, 58, 49, + (114,101,0): 148, 56, 45, + (114,102,0): 136, 57, 44, + (114,103,0): 131, 59, 45, + (114,104,0): 130, 64, 50, + (114,105,0): 127, 64, 49, + (114,106,0): 126, 62, 50, + (114,107,0): 127, 61, 49, + (114,108,0): 131, 58, 49, + (114,109,0): 134, 57, 49, + (114,110,0): 135, 56, 49, + (114,111,0): 136, 58, 48, + (114,112,0): 135, 59, 46, + (114,113,0): 132, 59, 44, + (114,114,0): 132, 59, 44, + (114,115,0): 132, 59, 44, + (114,116,0): 130, 58, 44, + (114,117,0): 130, 58, 44, + (114,118,0): 128, 58, 46, + (114,119,0): 128, 58, 46, + (114,120,0): 127, 57, 45, + (114,121,0): 127, 57, 45, + (114,122,0): 126, 58, 47, + (114,123,0): 126, 58, 47, + (114,124,0): 126, 58, 47, + (114,125,0): 126, 58, 47, + (114,126,0): 126, 58, 47, + (114,127,0): 126, 58, 47, + (114,128,0): 125, 57, 48, + (114,129,0): 125, 57, 48, + (114,130,0): 125, 57, 48, + (114,131,0): 125, 57, 48, + (114,132,0): 124, 57, 48, + (114,133,0): 123, 56, 47, + (114,134,0): 123, 56, 47, + (114,135,0): 123, 56, 47, + (114,136,0): 123, 59, 49, + (114,137,0): 123, 59, 49, + (114,138,0): 122, 58, 48, + (114,139,0): 121, 59, 48, + (114,140,0): 120, 58, 47, + (114,141,0): 120, 58, 47, + (114,142,0): 120, 58, 47, + (114,143,0): 120, 58, 47, + (114,144,0): 116, 56, 46, + (114,145,0): 116, 56, 46, + (114,146,0): 115, 55, 45, + (114,147,0): 115, 55, 45, + (114,148,0): 114, 54, 44, + (114,149,0): 113, 53, 43, + (114,150,0): 111, 53, 42, + (114,151,0): 111, 53, 42, + (114,152,0): 106, 49, 38, + (114,153,0): 111, 54, 43, + (114,154,0): 109, 52, 41, + (114,155,0): 107, 50, 39, + (114,156,0): 108, 54, 42, + (114,157,0): 105, 51, 39, + (114,158,0): 109, 55, 43, + (114,159,0): 125, 71, 61, + (114,160,0): 135, 80, 73, + (114,161,0): 135, 80, 73, + (114,162,0): 139, 80, 74, + (114,163,0): 142, 81, 76, + (114,164,0): 145, 82, 77, + (114,165,0): 146, 83, 78, + (114,166,0): 148, 85, 80, + (114,167,0): 145, 86, 80, + (114,168,0): 140, 87, 79, + (114,169,0): 135, 91, 80, + (114,170,0): 126, 94, 79, + (114,171,0): 116, 98, 78, + (114,172,0): 111, 105, 81, + (114,173,0): 111, 114, 85, + (114,174,0): 108, 119, 89, + (114,175,0): 102, 119, 85, + (114,176,0): 81, 101, 66, + (114,177,0): 75, 95, 58, + (114,178,0): 69, 89, 54, + (114,179,0): 68, 85, 51, + (114,180,0): 69, 86, 54, + (114,181,0): 71, 86, 57, + (114,182,0): 71, 84, 56, + (114,183,0): 69, 82, 56, + (114,184,0): 63, 73, 48, + (114,185,0): 60, 68, 45, + (114,186,0): 57, 62, 42, + (114,187,0): 55, 59, 42, + (114,188,0): 58, 60, 46, + (114,189,0): 60, 62, 48, + (114,190,0): 59, 61, 47, + (114,191,0): 57, 59, 46, + (114,192,0): 54, 60, 50, + (114,193,0): 53, 61, 50, + (114,194,0): 54, 60, 50, + (114,195,0): 54, 60, 48, + (114,196,0): 58, 60, 47, + (114,197,0): 60, 62, 48, + (114,198,0): 61, 64, 45, + (114,199,0): 61, 67, 41, + (114,200,0): 77, 87, 53, + (114,201,0): 90, 105, 64, + (114,202,0): 102, 124, 77, + (114,203,0): 108, 136, 78, + (114,204,0): 110, 145, 81, + (114,205,0): 113, 153, 82, + (114,206,0): 117, 159, 85, + (114,207,0): 116, 159, 87, + (114,208,0): 122, 161, 96, + (114,209,0): 119, 157, 96, + (114,210,0): 110, 148, 87, + (114,211,0): 99, 137, 76, + (114,212,0): 92, 130, 69, + (114,213,0): 92, 130, 69, + (114,214,0): 92, 130, 69, + (114,215,0): 90, 128, 67, + (114,216,0): 95, 133, 72, + (114,217,0): 97, 135, 74, + (114,218,0): 98, 136, 75, + (114,219,0): 100, 138, 77, + (114,220,0): 99, 137, 76, + (114,221,0): 97, 135, 74, + (114,222,0): 95, 133, 72, + (114,223,0): 93, 131, 72, + (114,224,0): 91, 125, 74, + (114,225,0): 80, 113, 66, + (114,226,0): 70, 103, 56, + (115,0,0): 105, 96, 81, + (115,1,0): 105, 96, 81, + (115,2,0): 105, 96, 81, + (115,3,0): 106, 97, 82, + (115,4,0): 106, 97, 82, + (115,5,0): 107, 98, 83, + (115,6,0): 107, 98, 83, + (115,7,0): 107, 98, 83, + (115,8,0): 106, 97, 82, + (115,9,0): 106, 97, 82, + (115,10,0): 106, 97, 82, + (115,11,0): 106, 97, 82, + (115,12,0): 106, 97, 82, + (115,13,0): 106, 97, 82, + (115,14,0): 106, 97, 82, + (115,15,0): 106, 97, 82, + (115,16,0): 107, 98, 83, + (115,17,0): 107, 98, 83, + (115,18,0): 107, 98, 83, + (115,19,0): 107, 98, 83, + (115,20,0): 107, 98, 83, + (115,21,0): 107, 98, 83, + (115,22,0): 107, 98, 83, + (115,23,0): 107, 98, 83, + (115,24,0): 108, 99, 84, + (115,25,0): 108, 99, 84, + (115,26,0): 108, 99, 84, + (115,27,0): 108, 99, 84, + (115,28,0): 108, 99, 84, + (115,29,0): 108, 99, 84, + (115,30,0): 108, 99, 84, + (115,31,0): 110, 98, 84, + (115,32,0): 114, 100, 87, + (115,33,0): 111, 97, 84, + (115,34,0): 109, 95, 82, + (115,35,0): 107, 95, 83, + (115,36,0): 107, 97, 87, + (115,37,0): 108, 99, 90, + (115,38,0): 108, 101, 91, + (115,39,0): 106, 102, 93, + (115,40,0): 106, 102, 93, + (115,41,0): 120, 116, 105, + (115,42,0): 136, 132, 120, + (115,43,0): 145, 141, 129, + (115,44,0): 149, 143, 129, + (115,45,0): 146, 140, 126, + (115,46,0): 137, 130, 114, + (115,47,0): 125, 122, 103, + (115,48,0): 96, 99, 78, + (115,49,0): 79, 84, 62, + (115,50,0): 68, 71, 50, + (115,51,0): 70, 69, 49, + (115,52,0): 72, 67, 48, + (115,53,0): 70, 61, 44, + (115,54,0): 76, 60, 44, + (115,55,0): 86, 67, 52, + (115,56,0): 80, 57, 43, + (115,57,0): 82, 54, 42, + (115,58,0): 86, 52, 42, + (115,59,0): 89, 53, 41, + (115,60,0): 92, 54, 43, + (115,61,0): 97, 57, 47, + (115,62,0): 101, 61, 49, + (115,63,0): 109, 61, 49, + (115,64,0): 136, 76, 66, + (115,65,0): 157, 83, 74, + (115,66,0): 173, 86, 79, + (115,67,0): 181, 79, 75, + (115,68,0): 188, 70, 68, + (115,69,0): 196, 66, 66, + (115,70,0): 208, 68, 67, + (115,71,0): 216, 70, 70, + (115,72,0): 212, 64, 62, + (115,73,0): 213, 65, 63, + (115,74,0): 214, 66, 62, + (115,75,0): 216, 68, 64, + (115,76,0): 217, 69, 67, + (115,77,0): 219, 69, 68, + (115,78,0): 219, 69, 68, + (115,79,0): 221, 69, 68, + (115,80,0): 222, 68, 68, + (115,81,0): 221, 69, 68, + (115,82,0): 221, 69, 68, + (115,83,0): 221, 69, 68, + (115,84,0): 221, 69, 68, + (115,85,0): 221, 69, 68, + (115,86,0): 221, 69, 66, + (115,87,0): 220, 71, 67, + (115,88,0): 219, 70, 66, + (115,89,0): 218, 69, 65, + (115,90,0): 217, 68, 62, + (115,91,0): 217, 68, 62, + (115,92,0): 218, 67, 60, + (115,93,0): 218, 67, 60, + (115,94,0): 219, 68, 61, + (115,95,0): 217, 68, 62, + (115,96,0): 214, 67, 60, + (115,97,0): 211, 70, 63, + (115,98,0): 201, 70, 62, + (115,99,0): 186, 65, 56, + (115,100,0): 167, 59, 49, + (115,101,0): 152, 56, 44, + (115,102,0): 140, 57, 43, + (115,103,0): 133, 60, 45, + (115,104,0): 131, 64, 48, + (115,105,0): 127, 64, 49, + (115,106,0): 126, 63, 48, + (115,107,0): 127, 61, 47, + (115,108,0): 131, 58, 49, + (115,109,0): 132, 58, 47, + (115,110,0): 135, 57, 47, + (115,111,0): 136, 58, 46, + (115,112,0): 132, 58, 45, + (115,113,0): 132, 59, 44, + (115,114,0): 132, 59, 44, + (115,115,0): 131, 58, 43, + (115,116,0): 130, 58, 44, + (115,117,0): 130, 58, 44, + (115,118,0): 127, 57, 45, + (115,119,0): 127, 57, 45, + (115,120,0): 127, 57, 45, + (115,121,0): 127, 57, 45, + (115,122,0): 126, 58, 47, + (115,123,0): 126, 58, 47, + (115,124,0): 126, 58, 47, + (115,125,0): 126, 58, 47, + (115,126,0): 126, 58, 47, + (115,127,0): 126, 58, 47, + (115,128,0): 125, 57, 48, + (115,129,0): 124, 57, 48, + (115,130,0): 125, 57, 48, + (115,131,0): 123, 56, 47, + (115,132,0): 123, 56, 47, + (115,133,0): 123, 56, 47, + (115,134,0): 123, 56, 47, + (115,135,0): 120, 56, 46, + (115,136,0): 123, 59, 49, + (115,137,0): 121, 59, 48, + (115,138,0): 121, 59, 48, + (115,139,0): 121, 59, 48, + (115,140,0): 120, 58, 47, + (115,141,0): 120, 58, 47, + (115,142,0): 120, 58, 47, + (115,143,0): 118, 58, 47, + (115,144,0): 115, 55, 45, + (115,145,0): 115, 55, 45, + (115,146,0): 115, 55, 45, + (115,147,0): 114, 54, 44, + (115,148,0): 113, 53, 43, + (115,149,0): 111, 53, 42, + (115,150,0): 111, 53, 42, + (115,151,0): 109, 52, 41, + (115,152,0): 106, 49, 38, + (115,153,0): 111, 54, 43, + (115,154,0): 108, 51, 40, + (115,155,0): 104, 50, 38, + (115,156,0): 107, 53, 41, + (115,157,0): 104, 50, 38, + (115,158,0): 108, 54, 42, + (115,159,0): 124, 70, 60, + (115,160,0): 138, 79, 71, + (115,161,0): 140, 79, 74, + (115,162,0): 141, 80, 75, + (115,163,0): 143, 82, 77, + (115,164,0): 144, 83, 78, + (115,165,0): 145, 86, 80, + (115,166,0): 144, 87, 80, + (115,167,0): 140, 90, 81, + (115,168,0): 137, 93, 82, + (115,169,0): 133, 97, 85, + (115,170,0): 121, 95, 80, + (115,171,0): 105, 90, 71, + (115,172,0): 100, 95, 73, + (115,173,0): 100, 104, 79, + (115,174,0): 92, 102, 75, + (115,175,0): 78, 93, 64, + (115,176,0): 69, 85, 56, + (115,177,0): 65, 81, 52, + (115,178,0): 61, 77, 48, + (115,179,0): 60, 75, 46, + (115,180,0): 63, 77, 51, + (115,181,0): 67, 81, 55, + (115,182,0): 70, 82, 58, + (115,183,0): 71, 83, 59, + (115,184,0): 66, 76, 52, + (115,185,0): 62, 71, 50, + (115,186,0): 58, 65, 47, + (115,187,0): 57, 61, 44, + (115,188,0): 57, 61, 46, + (115,189,0): 57, 61, 46, + (115,190,0): 56, 60, 45, + (115,191,0): 55, 59, 45, + (115,192,0): 55, 61, 51, + (115,193,0): 54, 61, 53, + (115,194,0): 54, 59, 52, + (115,195,0): 54, 60, 50, + (115,196,0): 58, 60, 49, + (115,197,0): 59, 61, 47, + (115,198,0): 60, 63, 44, + (115,199,0): 60, 65, 42, + (115,200,0): 74, 83, 52, + (115,201,0): 86, 101, 62, + (115,202,0): 98, 120, 73, + (115,203,0): 106, 134, 76, + (115,204,0): 110, 145, 81, + (115,205,0): 115, 155, 84, + (115,206,0): 119, 161, 87, + (115,207,0): 120, 162, 90, + (115,208,0): 123, 162, 97, + (115,209,0): 114, 152, 91, + (115,210,0): 101, 139, 78, + (115,211,0): 92, 130, 69, + (115,212,0): 90, 128, 67, + (115,213,0): 92, 130, 69, + (115,214,0): 92, 130, 69, + (115,215,0): 90, 128, 67, + (115,216,0): 95, 133, 72, + (115,217,0): 96, 134, 73, + (115,218,0): 97, 135, 74, + (115,219,0): 98, 136, 75, + (115,220,0): 97, 135, 74, + (115,221,0): 96, 134, 73, + (115,222,0): 94, 132, 71, + (115,223,0): 93, 131, 74, + (115,224,0): 90, 124, 74, + (115,225,0): 78, 111, 64, + (115,226,0): 69, 102, 55, + (116,0,0): 104, 97, 81, + (116,1,0): 104, 97, 81, + (116,2,0): 104, 97, 81, + (116,3,0): 105, 98, 82, + (116,4,0): 105, 98, 82, + (116,5,0): 106, 99, 83, + (116,6,0): 106, 99, 83, + (116,7,0): 106, 99, 83, + (116,8,0): 105, 98, 82, + (116,9,0): 105, 98, 82, + (116,10,0): 105, 98, 82, + (116,11,0): 105, 98, 82, + (116,12,0): 105, 98, 82, + (116,13,0): 105, 98, 82, + (116,14,0): 105, 98, 82, + (116,15,0): 105, 98, 82, + (116,16,0): 107, 98, 83, + (116,17,0): 107, 98, 83, + (116,18,0): 107, 98, 83, + (116,19,0): 107, 98, 83, + (116,20,0): 107, 98, 83, + (116,21,0): 107, 98, 83, + (116,22,0): 107, 98, 83, + (116,23,0): 107, 98, 83, + (116,24,0): 108, 99, 84, + (116,25,0): 108, 99, 84, + (116,26,0): 108, 99, 84, + (116,27,0): 108, 99, 84, + (116,28,0): 108, 99, 84, + (116,29,0): 108, 99, 84, + (116,30,0): 108, 99, 84, + (116,31,0): 108, 99, 84, + (116,32,0): 114, 102, 88, + (116,33,0): 116, 104, 92, + (116,34,0): 115, 103, 91, + (116,35,0): 109, 99, 89, + (116,36,0): 106, 97, 88, + (116,37,0): 108, 101, 93, + (116,38,0): 115, 110, 104, + (116,39,0): 122, 119, 112, + (116,40,0): 129, 126, 119, + (116,41,0): 144, 141, 134, + (116,42,0): 160, 157, 148, + (116,43,0): 168, 165, 156, + (116,44,0): 171, 167, 156, + (116,45,0): 168, 164, 153, + (116,46,0): 163, 157, 145, + (116,47,0): 153, 150, 135, + (116,48,0): 122, 123, 107, + (116,49,0): 99, 102, 83, + (116,50,0): 79, 82, 63, + (116,51,0): 71, 74, 55, + (116,52,0): 69, 72, 53, + (116,53,0): 66, 69, 50, + (116,54,0): 66, 69, 50, + (116,55,0): 69, 72, 53, + (116,56,0): 75, 76, 60, + (116,57,0): 74, 72, 57, + (116,58,0): 71, 68, 53, + (116,59,0): 68, 62, 48, + (116,60,0): 65, 57, 44, + (116,61,0): 65, 55, 43, + (116,62,0): 64, 54, 42, + (116,63,0): 70, 52, 40, + (116,64,0): 85, 53, 42, + (116,65,0): 113, 66, 56, + (116,66,0): 142, 79, 72, + (116,67,0): 160, 79, 75, + (116,68,0): 175, 73, 71, + (116,69,0): 191, 71, 73, + (116,70,0): 204, 69, 73, + (116,71,0): 211, 66, 69, + (116,72,0): 213, 64, 66, + (116,73,0): 215, 65, 66, + (116,74,0): 216, 66, 65, + (116,75,0): 217, 67, 66, + (116,76,0): 218, 69, 65, + (116,77,0): 218, 69, 65, + (116,78,0): 218, 69, 65, + (116,79,0): 218, 69, 65, + (116,80,0): 221, 69, 68, + (116,81,0): 221, 68, 70, + (116,82,0): 221, 68, 70, + (116,83,0): 219, 69, 70, + (116,84,0): 219, 69, 68, + (116,85,0): 219, 69, 68, + (116,86,0): 219, 69, 68, + (116,87,0): 217, 69, 67, + (116,88,0): 218, 70, 66, + (116,89,0): 217, 69, 65, + (116,90,0): 214, 70, 62, + (116,91,0): 213, 69, 61, + (116,92,0): 213, 69, 61, + (116,93,0): 213, 69, 61, + (116,94,0): 213, 69, 61, + (116,95,0): 214, 70, 62, + (116,96,0): 212, 65, 58, + (116,97,0): 211, 67, 59, + (116,98,0): 206, 69, 61, + (116,99,0): 193, 66, 57, + (116,100,0): 174, 62, 51, + (116,101,0): 158, 57, 45, + (116,102,0): 145, 59, 46, + (116,103,0): 138, 60, 47, + (116,104,0): 132, 63, 48, + (116,105,0): 129, 63, 47, + (116,106,0): 128, 62, 46, + (116,107,0): 128, 61, 45, + (116,108,0): 129, 59, 47, + (116,109,0): 132, 58, 45, + (116,110,0): 134, 58, 45, + (116,111,0): 135, 59, 46, + (116,112,0): 132, 58, 45, + (116,113,0): 131, 59, 45, + (116,114,0): 130, 58, 44, + (116,115,0): 130, 58, 44, + (116,116,0): 130, 58, 44, + (116,117,0): 129, 57, 43, + (116,118,0): 127, 57, 45, + (116,119,0): 127, 57, 45, + (116,120,0): 126, 58, 47, + (116,121,0): 126, 58, 47, + (116,122,0): 126, 58, 47, + (116,123,0): 126, 58, 47, + (116,124,0): 125, 58, 49, + (116,125,0): 125, 58, 49, + (116,126,0): 125, 58, 49, + (116,127,0): 125, 58, 49, + (116,128,0): 124, 57, 49, + (116,129,0): 122, 58, 49, + (116,130,0): 124, 57, 49, + (116,131,0): 121, 57, 48, + (116,132,0): 121, 57, 48, + (116,133,0): 120, 56, 47, + (116,134,0): 120, 56, 47, + (116,135,0): 118, 55, 46, + (116,136,0): 121, 58, 49, + (116,137,0): 121, 58, 49, + (116,138,0): 120, 57, 48, + (116,139,0): 118, 58, 48, + (116,140,0): 118, 58, 48, + (116,141,0): 117, 57, 47, + (116,142,0): 117, 57, 47, + (116,143,0): 116, 58, 47, + (116,144,0): 114, 55, 47, + (116,145,0): 113, 54, 46, + (116,146,0): 113, 54, 46, + (116,147,0): 112, 53, 45, + (116,148,0): 111, 52, 44, + (116,149,0): 110, 51, 43, + (116,150,0): 110, 51, 43, + (116,151,0): 109, 52, 43, + (116,152,0): 106, 49, 40, + (116,153,0): 109, 55, 45, + (116,154,0): 106, 52, 42, + (116,155,0): 104, 50, 40, + (116,156,0): 106, 52, 42, + (116,157,0): 102, 50, 39, + (116,158,0): 106, 54, 43, + (116,159,0): 125, 68, 59, + (116,160,0): 141, 78, 71, + (116,161,0): 143, 78, 72, + (116,162,0): 144, 81, 74, + (116,163,0): 144, 84, 76, + (116,164,0): 144, 85, 79, + (116,165,0): 142, 87, 80, + (116,166,0): 138, 89, 82, + (116,167,0): 131, 91, 81, + (116,168,0): 123, 89, 77, + (116,169,0): 118, 92, 79, + (116,170,0): 107, 90, 74, + (116,171,0): 93, 85, 66, + (116,172,0): 89, 88, 68, + (116,173,0): 89, 94, 72, + (116,174,0): 79, 89, 65, + (116,175,0): 63, 75, 51, + (116,176,0): 58, 72, 47, + (116,177,0): 55, 69, 46, + (116,178,0): 52, 66, 43, + (116,179,0): 53, 65, 43, + (116,180,0): 56, 68, 46, + (116,181,0): 61, 73, 51, + (116,182,0): 67, 76, 55, + (116,183,0): 69, 78, 57, + (116,184,0): 66, 75, 54, + (116,185,0): 63, 72, 53, + (116,186,0): 60, 69, 50, + (116,187,0): 58, 65, 47, + (116,188,0): 56, 63, 47, + (116,189,0): 55, 62, 46, + (116,190,0): 53, 60, 44, + (116,191,0): 52, 58, 44, + (116,192,0): 53, 60, 52, + (116,193,0): 53, 60, 53, + (116,194,0): 54, 59, 53, + (116,195,0): 54, 59, 52, + (116,196,0): 57, 59, 48, + (116,197,0): 58, 60, 47, + (116,198,0): 59, 62, 45, + (116,199,0): 59, 64, 41, + (116,200,0): 71, 80, 49, + (116,201,0): 82, 97, 58, + (116,202,0): 96, 118, 71, + (116,203,0): 105, 133, 75, + (116,204,0): 111, 146, 82, + (116,205,0): 117, 157, 86, + (116,206,0): 121, 163, 89, + (116,207,0): 121, 163, 91, + (116,208,0): 120, 159, 96, + (116,209,0): 110, 145, 87, + (116,210,0): 96, 131, 73, + (116,211,0): 90, 125, 67, + (116,212,0): 91, 126, 68, + (116,213,0): 94, 129, 71, + (116,214,0): 94, 129, 71, + (116,215,0): 93, 128, 70, + (116,216,0): 96, 131, 73, + (116,217,0): 97, 132, 74, + (116,218,0): 98, 133, 75, + (116,219,0): 98, 133, 75, + (116,220,0): 97, 132, 74, + (116,221,0): 96, 131, 73, + (116,222,0): 95, 130, 72, + (116,223,0): 94, 129, 73, + (116,224,0): 87, 124, 73, + (116,225,0): 76, 112, 66, + (116,226,0): 66, 102, 56, + (117,0,0): 104, 97, 81, + (117,1,0): 104, 97, 81, + (117,2,0): 104, 97, 81, + (117,3,0): 105, 98, 82, + (117,4,0): 105, 98, 82, + (117,5,0): 106, 99, 83, + (117,6,0): 106, 99, 83, + (117,7,0): 106, 99, 83, + (117,8,0): 105, 98, 82, + (117,9,0): 105, 98, 82, + (117,10,0): 105, 98, 82, + (117,11,0): 105, 98, 82, + (117,12,0): 105, 98, 82, + (117,13,0): 105, 98, 82, + (117,14,0): 105, 98, 82, + (117,15,0): 105, 98, 82, + (117,16,0): 107, 98, 83, + (117,17,0): 107, 98, 83, + (117,18,0): 107, 98, 83, + (117,19,0): 107, 98, 83, + (117,20,0): 107, 98, 83, + (117,21,0): 107, 98, 83, + (117,22,0): 107, 98, 83, + (117,23,0): 107, 98, 83, + (117,24,0): 108, 99, 84, + (117,25,0): 108, 99, 84, + (117,26,0): 108, 99, 84, + (117,27,0): 108, 99, 84, + (117,28,0): 108, 99, 84, + (117,29,0): 108, 99, 84, + (117,30,0): 108, 99, 84, + (117,31,0): 108, 99, 84, + (117,32,0): 107, 97, 85, + (117,33,0): 110, 100, 90, + (117,34,0): 112, 102, 92, + (117,35,0): 108, 99, 90, + (117,36,0): 107, 100, 92, + (117,37,0): 114, 109, 103, + (117,38,0): 132, 129, 124, + (117,39,0): 145, 144, 140, + (117,40,0): 167, 163, 160, + (117,41,0): 181, 177, 174, + (117,42,0): 196, 193, 188, + (117,43,0): 201, 198, 193, + (117,44,0): 201, 196, 190, + (117,45,0): 197, 192, 186, + (117,46,0): 192, 185, 177, + (117,47,0): 185, 178, 168, + (117,48,0): 164, 156, 143, + (117,49,0): 136, 130, 114, + (117,50,0): 102, 99, 84, + (117,51,0): 80, 81, 63, + (117,52,0): 70, 73, 56, + (117,53,0): 62, 69, 51, + (117,54,0): 59, 68, 49, + (117,55,0): 58, 70, 50, + (117,56,0): 56, 69, 51, + (117,57,0): 56, 69, 51, + (117,58,0): 56, 67, 50, + (117,59,0): 58, 66, 51, + (117,60,0): 60, 66, 52, + (117,61,0): 64, 67, 56, + (117,62,0): 67, 69, 58, + (117,63,0): 71, 69, 57, + (117,64,0): 64, 52, 40, + (117,65,0): 83, 56, 47, + (117,66,0): 104, 61, 54, + (117,67,0): 129, 68, 65, + (117,68,0): 163, 79, 79, + (117,69,0): 192, 87, 91, + (117,70,0): 204, 81, 86, + (117,71,0): 202, 67, 73, + (117,72,0): 211, 71, 74, + (117,73,0): 214, 70, 70, + (117,74,0): 216, 70, 70, + (117,75,0): 218, 70, 68, + (117,76,0): 219, 70, 66, + (117,77,0): 219, 70, 66, + (117,78,0): 220, 68, 63, + (117,79,0): 220, 68, 65, + (117,80,0): 221, 69, 68, + (117,81,0): 221, 68, 70, + (117,82,0): 219, 69, 70, + (117,83,0): 219, 69, 70, + (117,84,0): 218, 68, 67, + (117,85,0): 218, 68, 67, + (117,86,0): 218, 68, 67, + (117,87,0): 217, 69, 67, + (117,88,0): 217, 69, 65, + (117,89,0): 215, 70, 65, + (117,90,0): 214, 69, 64, + (117,91,0): 212, 69, 61, + (117,92,0): 211, 68, 60, + (117,93,0): 210, 69, 60, + (117,94,0): 211, 70, 61, + (117,95,0): 212, 69, 61, + (117,96,0): 212, 63, 56, + (117,97,0): 213, 64, 57, + (117,98,0): 208, 67, 58, + (117,99,0): 198, 67, 57, + (117,100,0): 182, 65, 55, + (117,101,0): 165, 61, 48, + (117,102,0): 150, 61, 47, + (117,103,0): 140, 61, 46, + (117,104,0): 134, 62, 47, + (117,105,0): 130, 63, 47, + (117,106,0): 129, 62, 46, + (117,107,0): 128, 61, 45, + (117,108,0): 129, 60, 45, + (117,109,0): 131, 59, 45, + (117,110,0): 132, 58, 45, + (117,111,0): 133, 59, 46, + (117,112,0): 130, 58, 44, + (117,113,0): 130, 58, 44, + (117,114,0): 130, 58, 44, + (117,115,0): 130, 58, 44, + (117,116,0): 129, 57, 43, + (117,117,0): 127, 58, 43, + (117,118,0): 127, 57, 45, + (117,119,0): 126, 56, 44, + (117,120,0): 126, 58, 47, + (117,121,0): 126, 58, 47, + (117,122,0): 126, 58, 47, + (117,123,0): 126, 58, 47, + (117,124,0): 125, 58, 49, + (117,125,0): 125, 58, 49, + (117,126,0): 125, 58, 49, + (117,127,0): 125, 58, 49, + (117,128,0): 122, 58, 49, + (117,129,0): 122, 58, 49, + (117,130,0): 121, 57, 48, + (117,131,0): 121, 57, 48, + (117,132,0): 120, 56, 47, + (117,133,0): 118, 55, 46, + (117,134,0): 118, 55, 46, + (117,135,0): 116, 56, 46, + (117,136,0): 119, 56, 47, + (117,137,0): 117, 57, 47, + (117,138,0): 117, 57, 47, + (117,139,0): 115, 57, 46, + (117,140,0): 116, 56, 46, + (117,141,0): 115, 57, 46, + (117,142,0): 114, 56, 45, + (117,143,0): 114, 56, 45, + (117,144,0): 113, 54, 46, + (117,145,0): 113, 54, 46, + (117,146,0): 112, 53, 45, + (117,147,0): 111, 52, 44, + (117,148,0): 110, 51, 43, + (117,149,0): 109, 52, 43, + (117,150,0): 108, 51, 42, + (117,151,0): 106, 52, 42, + (117,152,0): 104, 50, 40, + (117,153,0): 108, 54, 44, + (117,154,0): 105, 51, 41, + (117,155,0): 102, 50, 39, + (117,156,0): 104, 52, 41, + (117,157,0): 101, 49, 38, + (117,158,0): 105, 53, 42, + (117,159,0): 123, 66, 57, + (117,160,0): 142, 77, 71, + (117,161,0): 146, 77, 72, + (117,162,0): 145, 80, 74, + (117,163,0): 143, 84, 76, + (117,164,0): 141, 86, 79, + (117,165,0): 135, 88, 78, + (117,166,0): 129, 89, 79, + (117,167,0): 124, 92, 81, + (117,168,0): 115, 92, 78, + (117,169,0): 107, 91, 76, + (117,170,0): 96, 87, 70, + (117,171,0): 86, 83, 66, + (117,172,0): 80, 83, 66, + (117,173,0): 74, 81, 63, + (117,174,0): 64, 73, 54, + (117,175,0): 52, 64, 44, + (117,176,0): 51, 60, 43, + (117,177,0): 50, 59, 42, + (117,178,0): 48, 57, 40, + (117,179,0): 48, 57, 40, + (117,180,0): 50, 59, 42, + (117,181,0): 53, 62, 45, + (117,182,0): 57, 66, 49, + (117,183,0): 60, 69, 52, + (117,184,0): 63, 72, 55, + (117,185,0): 63, 72, 53, + (117,186,0): 62, 71, 52, + (117,187,0): 58, 70, 50, + (117,188,0): 58, 67, 50, + (117,189,0): 53, 64, 47, + (117,190,0): 51, 62, 45, + (117,191,0): 49, 60, 44, + (117,192,0): 51, 58, 51, + (117,193,0): 51, 57, 53, + (117,194,0): 52, 57, 53, + (117,195,0): 52, 57, 50, + (117,196,0): 56, 57, 49, + (117,197,0): 57, 59, 46, + (117,198,0): 59, 62, 45, + (117,199,0): 59, 64, 42, + (117,200,0): 67, 76, 47, + (117,201,0): 79, 94, 55, + (117,202,0): 93, 115, 68, + (117,203,0): 105, 132, 77, + (117,204,0): 112, 147, 83, + (117,205,0): 119, 159, 89, + (117,206,0): 121, 163, 89, + (117,207,0): 119, 161, 89, + (117,208,0): 113, 152, 89, + (117,209,0): 102, 137, 79, + (117,210,0): 90, 125, 67, + (117,211,0): 88, 123, 65, + (117,212,0): 92, 127, 69, + (117,213,0): 93, 128, 70, + (117,214,0): 93, 128, 70, + (117,215,0): 94, 129, 71, + (117,216,0): 96, 131, 73, + (117,217,0): 96, 131, 73, + (117,218,0): 96, 131, 73, + (117,219,0): 96, 131, 73, + (117,220,0): 96, 131, 73, + (117,221,0): 95, 130, 72, + (117,222,0): 94, 129, 71, + (117,223,0): 93, 128, 74, + (117,224,0): 85, 121, 73, + (117,225,0): 74, 110, 64, + (117,226,0): 65, 101, 57, + (118,0,0): 104, 97, 81, + (118,1,0): 104, 97, 81, + (118,2,0): 104, 97, 81, + (118,3,0): 105, 98, 82, + (118,4,0): 105, 98, 82, + (118,5,0): 106, 99, 83, + (118,6,0): 106, 99, 83, + (118,7,0): 106, 99, 83, + (118,8,0): 105, 98, 82, + (118,9,0): 105, 98, 82, + (118,10,0): 105, 98, 82, + (118,11,0): 105, 98, 82, + (118,12,0): 105, 98, 82, + (118,13,0): 105, 98, 82, + (118,14,0): 105, 98, 82, + (118,15,0): 105, 98, 82, + (118,16,0): 107, 98, 83, + (118,17,0): 107, 98, 83, + (118,18,0): 107, 98, 83, + (118,19,0): 107, 98, 83, + (118,20,0): 107, 98, 83, + (118,21,0): 107, 98, 83, + (118,22,0): 107, 98, 83, + (118,23,0): 107, 98, 83, + (118,24,0): 108, 99, 84, + (118,25,0): 108, 99, 84, + (118,26,0): 108, 99, 84, + (118,27,0): 108, 99, 84, + (118,28,0): 108, 99, 84, + (118,29,0): 108, 99, 84, + (118,30,0): 108, 99, 84, + (118,31,0): 108, 98, 86, + (118,32,0): 106, 96, 86, + (118,33,0): 106, 97, 88, + (118,34,0): 107, 100, 90, + (118,35,0): 107, 103, 94, + (118,36,0): 117, 112, 106, + (118,37,0): 136, 133, 128, + (118,38,0): 159, 158, 154, + (118,39,0): 176, 176, 174, + (118,40,0): 195, 194, 192, + (118,41,0): 211, 210, 208, + (118,42,0): 226, 225, 223, + (118,43,0): 231, 230, 228, + (118,44,0): 231, 227, 224, + (118,45,0): 227, 222, 218, + (118,46,0): 222, 214, 211, + (118,47,0): 217, 206, 200, + (118,48,0): 206, 188, 178, + (118,49,0): 184, 165, 151, + (118,50,0): 151, 135, 122, + (118,51,0): 121, 109, 93, + (118,52,0): 95, 89, 73, + (118,53,0): 75, 76, 58, + (118,54,0): 64, 69, 49, + (118,55,0): 59, 68, 47, + (118,56,0): 62, 74, 54, + (118,57,0): 61, 72, 55, + (118,58,0): 61, 70, 53, + (118,59,0): 59, 67, 52, + (118,60,0): 59, 62, 53, + (118,61,0): 58, 59, 51, + (118,62,0): 57, 56, 51, + (118,63,0): 58, 55, 48, + (118,64,0): 63, 60, 51, + (118,65,0): 69, 59, 50, + (118,66,0): 81, 53, 49, + (118,67,0): 99, 55, 52, + (118,68,0): 137, 71, 72, + (118,69,0): 177, 92, 95, + (118,70,0): 199, 96, 100, + (118,71,0): 202, 87, 90, + (118,72,0): 205, 81, 83, + (118,73,0): 209, 79, 79, + (118,74,0): 213, 78, 75, + (118,75,0): 216, 77, 74, + (118,76,0): 219, 74, 71, + (118,77,0): 221, 72, 68, + (118,78,0): 224, 69, 65, + (118,79,0): 223, 68, 66, + (118,80,0): 222, 68, 68, + (118,81,0): 221, 68, 70, + (118,82,0): 221, 68, 70, + (118,83,0): 220, 67, 69, + (118,84,0): 220, 67, 69, + (118,85,0): 219, 66, 68, + (118,86,0): 219, 67, 66, + (118,87,0): 217, 67, 66, + (118,88,0): 218, 68, 67, + (118,89,0): 216, 68, 64, + (118,90,0): 213, 68, 63, + (118,91,0): 212, 69, 63, + (118,92,0): 211, 68, 60, + (118,93,0): 210, 69, 60, + (118,94,0): 211, 70, 61, + (118,95,0): 212, 69, 61, + (118,96,0): 217, 64, 58, + (118,97,0): 217, 64, 58, + (118,98,0): 209, 66, 58, + (118,99,0): 200, 67, 58, + (118,100,0): 188, 67, 58, + (118,101,0): 172, 64, 52, + (118,102,0): 153, 59, 47, + (118,103,0): 140, 57, 43, + (118,104,0): 137, 61, 47, + (118,105,0): 131, 62, 46, + (118,106,0): 129, 62, 45, + (118,107,0): 128, 61, 44, + (118,108,0): 129, 60, 44, + (118,109,0): 131, 59, 44, + (118,110,0): 131, 59, 44, + (118,111,0): 132, 60, 45, + (118,112,0): 130, 58, 44, + (118,113,0): 130, 58, 44, + (118,114,0): 130, 58, 44, + (118,115,0): 129, 57, 43, + (118,116,0): 127, 57, 45, + (118,117,0): 127, 57, 45, + (118,118,0): 126, 56, 46, + (118,119,0): 125, 57, 46, + (118,120,0): 126, 58, 47, + (118,121,0): 126, 58, 47, + (118,122,0): 125, 58, 49, + (118,123,0): 125, 58, 49, + (118,124,0): 125, 58, 49, + (118,125,0): 125, 58, 49, + (118,126,0): 125, 58, 49, + (118,127,0): 125, 58, 49, + (118,128,0): 122, 58, 49, + (118,129,0): 121, 58, 49, + (118,130,0): 120, 57, 48, + (118,131,0): 120, 57, 48, + (118,132,0): 119, 56, 47, + (118,133,0): 116, 56, 46, + (118,134,0): 115, 55, 45, + (118,135,0): 114, 56, 45, + (118,136,0): 116, 56, 46, + (118,137,0): 115, 57, 46, + (118,138,0): 114, 56, 45, + (118,139,0): 113, 56, 45, + (118,140,0): 114, 56, 45, + (118,141,0): 112, 55, 44, + (118,142,0): 112, 55, 44, + (118,143,0): 112, 55, 44, + (118,144,0): 111, 54, 45, + (118,145,0): 111, 54, 45, + (118,146,0): 110, 53, 44, + (118,147,0): 110, 53, 44, + (118,148,0): 109, 52, 43, + (118,149,0): 108, 51, 42, + (118,150,0): 107, 50, 41, + (118,151,0): 105, 51, 41, + (118,152,0): 103, 49, 39, + (118,153,0): 107, 55, 44, + (118,154,0): 104, 52, 41, + (118,155,0): 101, 49, 38, + (118,156,0): 104, 52, 41, + (118,157,0): 98, 48, 37, + (118,158,0): 102, 52, 41, + (118,159,0): 122, 65, 56, + (118,160,0): 144, 77, 71, + (118,161,0): 146, 77, 72, + (118,162,0): 145, 80, 74, + (118,163,0): 142, 85, 76, + (118,164,0): 136, 88, 78, + (118,165,0): 129, 89, 79, + (118,166,0): 120, 90, 79, + (118,167,0): 114, 92, 78, + (118,168,0): 107, 94, 78, + (118,169,0): 94, 87, 71, + (118,170,0): 82, 80, 65, + (118,171,0): 75, 78, 61, + (118,172,0): 67, 74, 58, + (118,173,0): 57, 66, 49, + (118,174,0): 50, 58, 43, + (118,175,0): 48, 56, 41, + (118,176,0): 49, 55, 43, + (118,177,0): 49, 55, 45, + (118,178,0): 48, 54, 44, + (118,179,0): 47, 53, 43, + (118,180,0): 47, 53, 41, + (118,181,0): 48, 56, 43, + (118,182,0): 50, 58, 43, + (118,183,0): 52, 60, 45, + (118,184,0): 57, 68, 52, + (118,185,0): 59, 70, 53, + (118,186,0): 61, 72, 55, + (118,187,0): 60, 73, 55, + (118,188,0): 59, 70, 53, + (118,189,0): 54, 67, 49, + (118,190,0): 51, 64, 44, + (118,191,0): 49, 62, 45, + (118,192,0): 46, 56, 48, + (118,193,0): 48, 54, 50, + (118,194,0): 49, 54, 50, + (118,195,0): 50, 55, 49, + (118,196,0): 55, 56, 50, + (118,197,0): 57, 59, 48, + (118,198,0): 58, 60, 46, + (118,199,0): 58, 63, 41, + (118,200,0): 63, 72, 43, + (118,201,0): 75, 89, 53, + (118,202,0): 91, 113, 67, + (118,203,0): 104, 131, 76, + (118,204,0): 113, 147, 86, + (118,205,0): 119, 158, 91, + (118,206,0): 119, 161, 89, + (118,207,0): 115, 156, 86, + (118,208,0): 103, 141, 80, + (118,209,0): 94, 129, 73, + (118,210,0): 85, 120, 64, + (118,211,0): 87, 122, 66, + (118,212,0): 91, 126, 70, + (118,213,0): 91, 126, 70, + (118,214,0): 91, 126, 70, + (118,215,0): 93, 128, 72, + (118,216,0): 95, 130, 74, + (118,217,0): 95, 130, 74, + (118,218,0): 95, 130, 74, + (118,219,0): 95, 130, 74, + (118,220,0): 94, 129, 73, + (118,221,0): 94, 129, 73, + (118,222,0): 93, 128, 72, + (118,223,0): 93, 128, 74, + (118,224,0): 85, 118, 73, + (118,225,0): 74, 107, 64, + (118,226,0): 64, 96, 55, + (119,0,0): 104, 97, 81, + (119,1,0): 104, 97, 81, + (119,2,0): 104, 97, 81, + (119,3,0): 105, 98, 82, + (119,4,0): 105, 98, 82, + (119,5,0): 106, 99, 83, + (119,6,0): 106, 99, 83, + (119,7,0): 106, 99, 83, + (119,8,0): 105, 98, 82, + (119,9,0): 105, 98, 82, + (119,10,0): 105, 98, 82, + (119,11,0): 105, 98, 82, + (119,12,0): 105, 98, 82, + (119,13,0): 105, 98, 82, + (119,14,0): 105, 98, 82, + (119,15,0): 105, 98, 82, + (119,16,0): 107, 98, 83, + (119,17,0): 107, 98, 83, + (119,18,0): 107, 98, 83, + (119,19,0): 107, 98, 83, + (119,20,0): 107, 98, 83, + (119,21,0): 107, 98, 83, + (119,22,0): 107, 98, 83, + (119,23,0): 107, 98, 83, + (119,24,0): 108, 99, 84, + (119,25,0): 108, 99, 84, + (119,26,0): 108, 99, 84, + (119,27,0): 108, 99, 84, + (119,28,0): 108, 99, 84, + (119,29,0): 108, 99, 84, + (119,30,0): 108, 99, 84, + (119,31,0): 108, 98, 86, + (119,32,0): 112, 103, 94, + (119,33,0): 110, 103, 95, + (119,34,0): 108, 103, 97, + (119,35,0): 116, 113, 106, + (119,36,0): 135, 132, 127, + (119,37,0): 161, 160, 156, + (119,38,0): 188, 188, 186, + (119,39,0): 206, 208, 207, + (119,40,0): 207, 207, 207, + (119,41,0): 224, 224, 224, + (119,42,0): 242, 242, 242, + (119,43,0): 250, 248, 249, + (119,44,0): 251, 247, 246, + (119,45,0): 247, 243, 240, + (119,46,0): 241, 236, 233, + (119,47,0): 240, 226, 223, + (119,48,0): 232, 208, 198, + (119,49,0): 221, 193, 181, + (119,50,0): 193, 171, 157, + (119,51,0): 162, 145, 129, + (119,52,0): 125, 117, 98, + (119,53,0): 94, 92, 71, + (119,54,0): 75, 77, 55, + (119,55,0): 67, 72, 50, + (119,56,0): 65, 73, 50, + (119,57,0): 65, 73, 52, + (119,58,0): 64, 71, 53, + (119,59,0): 66, 68, 55, + (119,60,0): 65, 65, 55, + (119,61,0): 66, 61, 57, + (119,62,0): 67, 57, 55, + (119,63,0): 65, 57, 54, + (119,64,0): 59, 58, 53, + (119,65,0): 66, 61, 55, + (119,66,0): 71, 53, 49, + (119,67,0): 76, 45, 43, + (119,68,0): 102, 54, 54, + (119,69,0): 145, 81, 82, + (119,70,0): 181, 102, 105, + (119,71,0): 199, 109, 109, + (119,72,0): 192, 92, 92, + (119,73,0): 199, 90, 87, + (119,74,0): 206, 87, 83, + (119,75,0): 211, 84, 78, + (119,76,0): 216, 78, 75, + (119,77,0): 222, 74, 72, + (119,78,0): 225, 70, 68, + (119,79,0): 226, 68, 67, + (119,80,0): 221, 68, 70, + (119,81,0): 219, 69, 70, + (119,82,0): 219, 69, 70, + (119,83,0): 220, 67, 69, + (119,84,0): 220, 67, 69, + (119,85,0): 219, 66, 68, + (119,86,0): 219, 67, 66, + (119,87,0): 219, 67, 66, + (119,88,0): 220, 68, 67, + (119,89,0): 217, 67, 66, + (119,90,0): 215, 67, 63, + (119,91,0): 212, 67, 62, + (119,92,0): 212, 67, 62, + (119,93,0): 211, 68, 60, + (119,94,0): 210, 69, 60, + (119,95,0): 213, 69, 61, + (119,96,0): 221, 66, 61, + (119,97,0): 219, 65, 57, + (119,98,0): 210, 66, 58, + (119,99,0): 202, 68, 59, + (119,100,0): 191, 69, 58, + (119,101,0): 176, 65, 54, + (119,102,0): 156, 58, 45, + (119,103,0): 139, 53, 38, + (119,104,0): 138, 60, 47, + (119,105,0): 133, 61, 46, + (119,106,0): 130, 61, 45, + (119,107,0): 128, 61, 44, + (119,108,0): 129, 60, 44, + (119,109,0): 129, 60, 44, + (119,110,0): 131, 60, 42, + (119,111,0): 132, 60, 45, + (119,112,0): 130, 58, 44, + (119,113,0): 130, 58, 44, + (119,114,0): 130, 58, 44, + (119,115,0): 127, 58, 43, + (119,116,0): 127, 57, 45, + (119,117,0): 126, 56, 44, + (119,118,0): 125, 57, 46, + (119,119,0): 125, 57, 46, + (119,120,0): 126, 58, 47, + (119,121,0): 126, 58, 47, + (119,122,0): 125, 58, 49, + (119,123,0): 125, 58, 49, + (119,124,0): 125, 58, 49, + (119,125,0): 125, 58, 49, + (119,126,0): 125, 58, 49, + (119,127,0): 123, 59, 49, + (119,128,0): 121, 58, 49, + (119,129,0): 119, 59, 49, + (119,130,0): 120, 57, 48, + (119,131,0): 117, 57, 47, + (119,132,0): 116, 56, 46, + (119,133,0): 115, 57, 46, + (119,134,0): 114, 56, 45, + (119,135,0): 113, 55, 44, + (119,136,0): 114, 56, 45, + (119,137,0): 113, 56, 45, + (119,138,0): 112, 55, 44, + (119,139,0): 110, 56, 44, + (119,140,0): 112, 55, 44, + (119,141,0): 109, 55, 43, + (119,142,0): 111, 54, 43, + (119,143,0): 111, 54, 43, + (119,144,0): 111, 54, 45, + (119,145,0): 111, 54, 45, + (119,146,0): 110, 53, 44, + (119,147,0): 109, 52, 43, + (119,148,0): 108, 51, 42, + (119,149,0): 106, 52, 42, + (119,150,0): 105, 51, 41, + (119,151,0): 104, 52, 41, + (119,152,0): 102, 50, 39, + (119,153,0): 107, 55, 44, + (119,154,0): 104, 52, 41, + (119,155,0): 99, 49, 38, + (119,156,0): 101, 51, 40, + (119,157,0): 98, 48, 37, + (119,158,0): 101, 51, 40, + (119,159,0): 120, 66, 56, + (119,160,0): 142, 77, 71, + (119,161,0): 146, 79, 73, + (119,162,0): 142, 82, 74, + (119,163,0): 138, 85, 77, + (119,164,0): 131, 88, 79, + (119,165,0): 122, 90, 79, + (119,166,0): 113, 91, 77, + (119,167,0): 104, 92, 76, + (119,168,0): 90, 84, 68, + (119,169,0): 73, 74, 58, + (119,170,0): 63, 67, 52, + (119,171,0): 62, 68, 54, + (119,172,0): 57, 65, 50, + (119,173,0): 48, 56, 43, + (119,174,0): 47, 55, 42, + (119,175,0): 54, 60, 50, + (119,176,0): 52, 55, 48, + (119,177,0): 53, 56, 49, + (119,178,0): 53, 55, 50, + (119,179,0): 52, 55, 48, + (119,180,0): 50, 53, 46, + (119,181,0): 48, 54, 44, + (119,182,0): 48, 56, 45, + (119,183,0): 49, 57, 44, + (119,184,0): 54, 65, 51, + (119,185,0): 58, 69, 53, + (119,186,0): 61, 74, 57, + (119,187,0): 62, 75, 57, + (119,188,0): 60, 73, 55, + (119,189,0): 55, 70, 51, + (119,190,0): 50, 65, 44, + (119,191,0): 49, 62, 45, + (119,192,0): 44, 54, 46, + (119,193,0): 46, 52, 48, + (119,194,0): 48, 53, 49, + (119,195,0): 49, 54, 48, + (119,196,0): 54, 55, 49, + (119,197,0): 56, 58, 47, + (119,198,0): 58, 60, 46, + (119,199,0): 58, 63, 43, + (119,200,0): 60, 69, 42, + (119,201,0): 73, 87, 52, + (119,202,0): 89, 111, 65, + (119,203,0): 103, 130, 77, + (119,204,0): 112, 146, 86, + (119,205,0): 118, 157, 92, + (119,206,0): 117, 158, 88, + (119,207,0): 112, 153, 85, + (119,208,0): 96, 134, 73, + (119,209,0): 88, 123, 67, + (119,210,0): 83, 118, 62, + (119,211,0): 87, 122, 66, + (119,212,0): 91, 126, 70, + (119,213,0): 89, 124, 68, + (119,214,0): 89, 124, 68, + (119,215,0): 92, 127, 71, + (119,216,0): 95, 130, 74, + (119,217,0): 95, 130, 74, + (119,218,0): 94, 129, 73, + (119,219,0): 94, 129, 73, + (119,220,0): 94, 129, 73, + (119,221,0): 93, 128, 72, + (119,222,0): 93, 128, 72, + (119,223,0): 93, 127, 76, + (119,224,0): 83, 116, 73, + (119,225,0): 72, 104, 65, + (119,226,0): 63, 93, 55, + (120,0,0): 105, 99, 83, + (120,1,0): 105, 99, 83, + (120,2,0): 105, 99, 83, + (120,3,0): 105, 99, 83, + (120,4,0): 105, 99, 83, + (120,5,0): 105, 99, 83, + (120,6,0): 105, 99, 83, + (120,7,0): 105, 99, 83, + (120,8,0): 105, 99, 83, + (120,9,0): 105, 99, 83, + (120,10,0): 105, 99, 83, + (120,11,0): 105, 99, 83, + (120,12,0): 105, 99, 83, + (120,13,0): 105, 99, 83, + (120,14,0): 105, 99, 83, + (120,15,0): 106, 99, 83, + (120,16,0): 107, 98, 83, + (120,17,0): 107, 98, 83, + (120,18,0): 107, 98, 83, + (120,19,0): 108, 99, 84, + (120,20,0): 108, 99, 84, + (120,21,0): 109, 100, 85, + (120,22,0): 109, 100, 85, + (120,23,0): 109, 100, 85, + (120,24,0): 109, 100, 85, + (120,25,0): 109, 100, 85, + (120,26,0): 109, 100, 85, + (120,27,0): 109, 100, 85, + (120,28,0): 109, 100, 85, + (120,29,0): 109, 100, 85, + (120,30,0): 109, 100, 85, + (120,31,0): 108, 100, 87, + (120,32,0): 105, 98, 90, + (120,33,0): 103, 100, 93, + (120,34,0): 118, 115, 110, + (120,35,0): 147, 146, 142, + (120,36,0): 175, 175, 173, + (120,37,0): 196, 198, 197, + (120,38,0): 218, 220, 219, + (120,39,0): 234, 238, 239, + (120,40,0): 243, 244, 246, + (120,41,0): 246, 247, 249, + (120,42,0): 252, 252, 254, + (120,43,0): 255, 255, 255, + (120,44,0): 255, 255, 253, + (120,45,0): 255, 251, 250, + (120,46,0): 252, 247, 244, + (120,47,0): 253, 242, 236, + (120,48,0): 247, 225, 212, + (120,49,0): 242, 216, 199, + (120,50,0): 224, 202, 181, + (120,51,0): 198, 182, 159, + (120,52,0): 170, 160, 135, + (120,53,0): 136, 132, 105, + (120,54,0): 98, 98, 70, + (120,55,0): 69, 72, 45, + (120,56,0): 68, 72, 47, + (120,57,0): 67, 71, 48, + (120,58,0): 70, 69, 49, + (120,59,0): 71, 68, 53, + (120,60,0): 70, 60, 51, + (120,61,0): 67, 54, 48, + (120,62,0): 70, 52, 50, + (120,63,0): 73, 57, 57, + (120,64,0): 65, 60, 57, + (120,65,0): 66, 61, 58, + (120,66,0): 70, 56, 55, + (120,67,0): 75, 54, 53, + (120,68,0): 101, 69, 70, + (120,69,0): 147, 105, 106, + (120,70,0): 198, 147, 146, + (120,71,0): 233, 172, 169, + (120,72,0): 211, 140, 136, + (120,73,0): 199, 119, 112, + (120,74,0): 191, 96, 90, + (120,75,0): 195, 86, 81, + (120,76,0): 210, 82, 79, + (120,77,0): 219, 77, 76, + (120,78,0): 225, 71, 73, + (120,79,0): 225, 69, 72, + (120,80,0): 220, 70, 71, + (120,81,0): 220, 74, 75, + (120,82,0): 217, 68, 70, + (120,83,0): 210, 60, 62, + (120,84,0): 215, 62, 64, + (120,85,0): 225, 72, 74, + (120,86,0): 225, 71, 73, + (120,87,0): 216, 62, 64, + (120,88,0): 218, 64, 64, + (120,89,0): 218, 64, 64, + (120,90,0): 217, 65, 64, + (120,91,0): 215, 66, 62, + (120,92,0): 215, 66, 62, + (120,93,0): 212, 64, 60, + (120,94,0): 209, 64, 59, + (120,95,0): 211, 64, 57, + (120,96,0): 222, 67, 62, + (120,97,0): 219, 65, 57, + (120,98,0): 211, 64, 57, + (120,99,0): 202, 65, 57, + (120,100,0): 190, 66, 56, + (120,101,0): 176, 64, 53, + (120,102,0): 159, 58, 46, + (120,103,0): 144, 56, 42, + (120,104,0): 140, 61, 48, + (120,105,0): 135, 62, 47, + (120,106,0): 131, 62, 46, + (120,107,0): 129, 62, 45, + (120,108,0): 128, 61, 44, + (120,109,0): 127, 60, 43, + (120,110,0): 129, 61, 42, + (120,111,0): 129, 60, 44, + (120,112,0): 127, 58, 43, + (120,113,0): 127, 57, 45, + (120,114,0): 127, 57, 45, + (120,115,0): 126, 56, 44, + (120,116,0): 126, 56, 46, + (120,117,0): 124, 56, 45, + (120,118,0): 124, 56, 45, + (120,119,0): 124, 56, 45, + (120,120,0): 124, 57, 48, + (120,121,0): 124, 57, 48, + (120,122,0): 124, 57, 48, + (120,123,0): 124, 57, 48, + (120,124,0): 122, 58, 49, + (120,125,0): 122, 58, 49, + (120,126,0): 122, 58, 49, + (120,127,0): 122, 58, 49, + (120,128,0): 121, 61, 53, + (120,129,0): 119, 60, 52, + (120,130,0): 119, 59, 51, + (120,131,0): 117, 58, 50, + (120,132,0): 116, 57, 49, + (120,133,0): 113, 56, 47, + (120,134,0): 112, 55, 46, + (120,135,0): 112, 55, 46, + (120,136,0): 111, 54, 45, + (120,137,0): 109, 55, 45, + (120,138,0): 109, 55, 45, + (120,139,0): 108, 56, 45, + (120,140,0): 109, 55, 45, + (120,141,0): 108, 56, 45, + (120,142,0): 109, 55, 45, + (120,143,0): 109, 55, 45, + (120,144,0): 105, 50, 43, + (120,145,0): 109, 54, 47, + (120,146,0): 112, 57, 50, + (120,147,0): 111, 56, 49, + (120,148,0): 107, 52, 45, + (120,149,0): 103, 50, 42, + (120,150,0): 103, 50, 42, + (120,151,0): 104, 51, 43, + (120,152,0): 101, 48, 40, + (120,153,0): 105, 55, 46, + (120,154,0): 100, 50, 41, + (120,155,0): 93, 45, 35, + (120,156,0): 96, 48, 38, + (120,157,0): 95, 47, 37, + (120,158,0): 98, 50, 40, + (120,159,0): 115, 62, 54, + (120,160,0): 140, 79, 74, + (120,161,0): 143, 80, 75, + (120,162,0): 136, 81, 74, + (120,163,0): 129, 82, 74, + (120,164,0): 125, 89, 77, + (120,165,0): 118, 95, 81, + (120,166,0): 102, 89, 73, + (120,167,0): 84, 78, 62, + (120,168,0): 68, 69, 53, + (120,169,0): 62, 69, 53, + (120,170,0): 58, 67, 50, + (120,171,0): 53, 64, 48, + (120,172,0): 52, 60, 47, + (120,173,0): 51, 59, 48, + (120,174,0): 52, 58, 48, + (120,175,0): 52, 58, 48, + (120,176,0): 54, 56, 51, + (120,177,0): 55, 56, 51, + (120,178,0): 54, 54, 52, + (120,179,0): 52, 54, 49, + (120,180,0): 51, 53, 48, + (120,181,0): 49, 54, 47, + (120,182,0): 47, 54, 46, + (120,183,0): 46, 54, 43, + (120,184,0): 46, 57, 43, + (120,185,0): 50, 61, 45, + (120,186,0): 54, 67, 50, + (120,187,0): 58, 71, 54, + (120,188,0): 58, 73, 54, + (120,189,0): 56, 71, 52, + (120,190,0): 52, 67, 46, + (120,191,0): 49, 63, 46, + (120,192,0): 42, 52, 43, + (120,193,0): 44, 50, 46, + (120,194,0): 45, 50, 46, + (120,195,0): 46, 51, 45, + (120,196,0): 52, 53, 47, + (120,197,0): 55, 57, 46, + (120,198,0): 58, 60, 47, + (120,199,0): 58, 63, 43, + (120,200,0): 54, 62, 38, + (120,201,0): 68, 82, 49, + (120,202,0): 87, 108, 67, + (120,203,0): 104, 130, 82, + (120,204,0): 115, 148, 93, + (120,205,0): 119, 158, 95, + (120,206,0): 114, 155, 87, + (120,207,0): 107, 148, 82, + (120,208,0): 91, 126, 68, + (120,209,0): 88, 121, 68, + (120,210,0): 84, 117, 64, + (120,211,0): 84, 117, 64, + (120,212,0): 87, 120, 67, + (120,213,0): 90, 123, 70, + (120,214,0): 91, 124, 71, + (120,215,0): 90, 123, 70, + (120,216,0): 94, 127, 74, + (120,217,0): 98, 131, 78, + (120,218,0): 98, 131, 78, + (120,219,0): 94, 127, 74, + (120,220,0): 92, 125, 72, + (120,221,0): 95, 128, 75, + (120,222,0): 96, 129, 76, + (120,223,0): 94, 126, 77, + (120,224,0): 83, 113, 75, + (120,225,0): 70, 100, 66, + (120,226,0): 61, 88, 55, + (121,0,0): 105, 99, 83, + (121,1,0): 105, 99, 83, + (121,2,0): 105, 99, 83, + (121,3,0): 105, 99, 83, + (121,4,0): 105, 99, 83, + (121,5,0): 105, 99, 83, + (121,6,0): 105, 99, 83, + (121,7,0): 105, 99, 83, + (121,8,0): 105, 99, 83, + (121,9,0): 105, 99, 83, + (121,10,0): 105, 99, 83, + (121,11,0): 105, 99, 83, + (121,12,0): 105, 99, 83, + (121,13,0): 105, 99, 83, + (121,14,0): 105, 99, 83, + (121,15,0): 105, 99, 83, + (121,16,0): 107, 98, 83, + (121,17,0): 107, 98, 83, + (121,18,0): 107, 98, 83, + (121,19,0): 108, 99, 84, + (121,20,0): 108, 99, 84, + (121,21,0): 109, 100, 85, + (121,22,0): 109, 100, 85, + (121,23,0): 109, 100, 85, + (121,24,0): 109, 100, 85, + (121,25,0): 109, 100, 85, + (121,26,0): 109, 100, 85, + (121,27,0): 109, 100, 85, + (121,28,0): 109, 100, 85, + (121,29,0): 109, 100, 85, + (121,30,0): 109, 100, 85, + (121,31,0): 108, 100, 89, + (121,32,0): 103, 100, 93, + (121,33,0): 111, 110, 106, + (121,34,0): 134, 133, 131, + (121,35,0): 164, 164, 162, + (121,36,0): 193, 195, 194, + (121,37,0): 214, 218, 219, + (121,38,0): 234, 238, 239, + (121,39,0): 247, 251, 252, + (121,40,0): 247, 251, 254, + (121,41,0): 248, 252, 255, + (121,42,0): 252, 253, 255, + (121,43,0): 254, 254, 254, + (121,44,0): 255, 255, 253, + (121,45,0): 255, 254, 250, + (121,46,0): 255, 252, 249, + (121,47,0): 255, 250, 243, + (121,48,0): 255, 240, 224, + (121,49,0): 251, 235, 212, + (121,50,0): 237, 223, 197, + (121,51,0): 215, 205, 178, + (121,52,0): 192, 187, 157, + (121,53,0): 164, 163, 132, + (121,54,0): 130, 131, 99, + (121,55,0): 103, 106, 75, + (121,56,0): 76, 81, 51, + (121,57,0): 71, 74, 47, + (121,58,0): 69, 67, 46, + (121,59,0): 71, 66, 47, + (121,60,0): 72, 62, 50, + (121,61,0): 73, 58, 51, + (121,62,0): 76, 57, 53, + (121,63,0): 75, 60, 57, + (121,64,0): 66, 56, 55, + (121,65,0): 71, 62, 63, + (121,66,0): 81, 69, 69, + (121,67,0): 96, 80, 80, + (121,68,0): 124, 104, 103, + (121,69,0): 166, 140, 139, + (121,70,0): 207, 178, 174, + (121,71,0): 232, 197, 191, + (121,72,0): 255, 213, 207, + (121,73,0): 234, 177, 168, + (121,74,0): 201, 131, 123, + (121,75,0): 188, 99, 93, + (121,76,0): 199, 87, 85, + (121,77,0): 213, 83, 83, + (121,78,0): 219, 74, 77, + (121,79,0): 216, 67, 69, + (121,80,0): 213, 71, 70, + (121,81,0): 210, 70, 69, + (121,82,0): 215, 73, 72, + (121,83,0): 219, 75, 75, + (121,84,0): 218, 70, 70, + (121,85,0): 212, 62, 63, + (121,86,0): 214, 61, 63, + (121,87,0): 221, 67, 69, + (121,88,0): 217, 63, 63, + (121,89,0): 217, 63, 63, + (121,90,0): 218, 64, 64, + (121,91,0): 218, 64, 64, + (121,92,0): 217, 65, 62, + (121,93,0): 214, 65, 61, + (121,94,0): 212, 64, 60, + (121,95,0): 212, 63, 57, + (121,96,0): 220, 65, 60, + (121,97,0): 219, 64, 59, + (121,98,0): 211, 64, 57, + (121,99,0): 203, 66, 58, + (121,100,0): 191, 67, 59, + (121,101,0): 177, 65, 54, + (121,102,0): 160, 59, 49, + (121,103,0): 146, 56, 45, + (121,104,0): 140, 61, 48, + (121,105,0): 135, 62, 47, + (121,106,0): 131, 62, 46, + (121,107,0): 129, 62, 45, + (121,108,0): 128, 61, 44, + (121,109,0): 127, 60, 43, + (121,110,0): 129, 60, 44, + (121,111,0): 129, 60, 44, + (121,112,0): 127, 58, 43, + (121,113,0): 127, 57, 45, + (121,114,0): 127, 57, 45, + (121,115,0): 126, 56, 44, + (121,116,0): 125, 57, 46, + (121,117,0): 124, 56, 45, + (121,118,0): 124, 56, 45, + (121,119,0): 124, 56, 45, + (121,120,0): 124, 57, 48, + (121,121,0): 124, 57, 48, + (121,122,0): 124, 57, 48, + (121,123,0): 124, 57, 48, + (121,124,0): 122, 58, 49, + (121,125,0): 123, 59, 50, + (121,126,0): 123, 59, 50, + (121,127,0): 122, 59, 50, + (121,128,0): 119, 60, 52, + (121,129,0): 117, 60, 51, + (121,130,0): 117, 58, 50, + (121,131,0): 115, 58, 49, + (121,132,0): 114, 57, 48, + (121,133,0): 110, 56, 46, + (121,134,0): 111, 54, 45, + (121,135,0): 109, 55, 45, + (121,136,0): 109, 55, 45, + (121,137,0): 108, 56, 45, + (121,138,0): 108, 56, 45, + (121,139,0): 108, 56, 45, + (121,140,0): 108, 56, 45, + (121,141,0): 106, 56, 45, + (121,142,0): 108, 56, 45, + (121,143,0): 108, 56, 45, + (121,144,0): 107, 54, 46, + (121,145,0): 110, 55, 48, + (121,146,0): 111, 56, 49, + (121,147,0): 110, 57, 49, + (121,148,0): 108, 55, 47, + (121,149,0): 105, 52, 44, + (121,150,0): 103, 50, 42, + (121,151,0): 101, 51, 42, + (121,152,0): 99, 49, 40, + (121,153,0): 100, 52, 42, + (121,154,0): 95, 47, 37, + (121,155,0): 94, 46, 36, + (121,156,0): 98, 50, 40, + (121,157,0): 94, 46, 36, + (121,158,0): 96, 48, 38, + (121,159,0): 112, 62, 53, + (121,160,0): 129, 74, 69, + (121,161,0): 135, 82, 76, + (121,162,0): 135, 88, 82, + (121,163,0): 126, 88, 79, + (121,164,0): 114, 86, 75, + (121,165,0): 100, 82, 68, + (121,166,0): 81, 74, 58, + (121,167,0): 62, 63, 47, + (121,168,0): 58, 65, 49, + (121,169,0): 54, 65, 48, + (121,170,0): 53, 64, 48, + (121,171,0): 51, 62, 48, + (121,172,0): 52, 60, 49, + (121,173,0): 52, 60, 49, + (121,174,0): 53, 59, 49, + (121,175,0): 55, 58, 51, + (121,176,0): 55, 57, 52, + (121,177,0): 55, 55, 53, + (121,178,0): 55, 55, 53, + (121,179,0): 53, 55, 50, + (121,180,0): 52, 54, 49, + (121,181,0): 49, 54, 47, + (121,182,0): 47, 54, 46, + (121,183,0): 47, 55, 44, + (121,184,0): 46, 57, 43, + (121,185,0): 49, 60, 46, + (121,186,0): 52, 65, 48, + (121,187,0): 56, 69, 52, + (121,188,0): 57, 72, 53, + (121,189,0): 56, 71, 52, + (121,190,0): 52, 69, 50, + (121,191,0): 52, 66, 49, + (121,192,0): 46, 56, 47, + (121,193,0): 46, 53, 46, + (121,194,0): 46, 51, 45, + (121,195,0): 45, 50, 43, + (121,196,0): 50, 51, 43, + (121,197,0): 52, 54, 43, + (121,198,0): 56, 58, 45, + (121,199,0): 57, 61, 44, + (121,200,0): 55, 63, 40, + (121,201,0): 68, 81, 51, + (121,202,0): 87, 108, 69, + (121,203,0): 104, 130, 85, + (121,204,0): 116, 149, 96, + (121,205,0): 119, 157, 98, + (121,206,0): 112, 152, 89, + (121,207,0): 103, 143, 80, + (121,208,0): 89, 124, 68, + (121,209,0): 87, 120, 67, + (121,210,0): 84, 117, 64, + (121,211,0): 84, 117, 64, + (121,212,0): 86, 119, 66, + (121,213,0): 89, 122, 69, + (121,214,0): 89, 122, 69, + (121,215,0): 89, 122, 69, + (121,216,0): 91, 124, 71, + (121,217,0): 95, 128, 75, + (121,218,0): 95, 128, 75, + (121,219,0): 92, 125, 72, + (121,220,0): 91, 124, 71, + (121,221,0): 94, 127, 74, + (121,222,0): 94, 127, 74, + (121,223,0): 94, 123, 77, + (121,224,0): 82, 109, 74, + (121,225,0): 70, 95, 66, + (121,226,0): 59, 84, 55, + (122,0,0): 105, 99, 83, + (122,1,0): 105, 99, 83, + (122,2,0): 105, 99, 83, + (122,3,0): 105, 99, 83, + (122,4,0): 105, 99, 83, + (122,5,0): 105, 99, 83, + (122,6,0): 105, 99, 83, + (122,7,0): 105, 99, 83, + (122,8,0): 105, 99, 83, + (122,9,0): 105, 99, 83, + (122,10,0): 105, 99, 83, + (122,11,0): 105, 99, 83, + (122,12,0): 105, 99, 83, + (122,13,0): 105, 99, 83, + (122,14,0): 105, 99, 83, + (122,15,0): 105, 99, 83, + (122,16,0): 107, 98, 83, + (122,17,0): 107, 98, 83, + (122,18,0): 107, 98, 83, + (122,19,0): 108, 99, 84, + (122,20,0): 108, 99, 84, + (122,21,0): 109, 100, 85, + (122,22,0): 109, 100, 85, + (122,23,0): 109, 100, 85, + (122,24,0): 109, 100, 85, + (122,25,0): 109, 100, 85, + (122,26,0): 109, 100, 85, + (122,27,0): 109, 100, 85, + (122,28,0): 109, 100, 85, + (122,29,0): 110, 101, 86, + (122,30,0): 110, 101, 86, + (122,31,0): 108, 102, 90, + (122,32,0): 101, 100, 95, + (122,33,0): 121, 123, 120, + (122,34,0): 151, 153, 152, + (122,35,0): 178, 182, 183, + (122,36,0): 205, 209, 210, + (122,37,0): 228, 233, 236, + (122,38,0): 244, 249, 252, + (122,39,0): 250, 255, 255, + (122,40,0): 251, 255, 255, + (122,41,0): 252, 255, 255, + (122,42,0): 253, 254, 255, + (122,43,0): 254, 254, 254, + (122,44,0): 255, 254, 252, + (122,45,0): 255, 255, 251, + (122,46,0): 255, 255, 250, + (122,47,0): 255, 255, 244, + (122,48,0): 254, 252, 231, + (122,49,0): 250, 249, 221, + (122,50,0): 239, 240, 209, + (122,51,0): 225, 229, 196, + (122,52,0): 210, 216, 180, + (122,53,0): 188, 196, 159, + (122,54,0): 160, 168, 131, + (122,55,0): 135, 145, 108, + (122,56,0): 96, 103, 69, + (122,57,0): 81, 88, 55, + (122,58,0): 68, 71, 44, + (122,59,0): 68, 67, 46, + (122,60,0): 74, 68, 52, + (122,61,0): 76, 68, 55, + (122,62,0): 75, 65, 56, + (122,63,0): 73, 62, 58, + (122,64,0): 68, 58, 57, + (122,65,0): 84, 74, 75, + (122,66,0): 107, 95, 95, + (122,67,0): 130, 118, 118, + (122,68,0): 157, 146, 144, + (122,69,0): 192, 178, 175, + (122,70,0): 219, 206, 200, + (122,71,0): 234, 220, 211, + (122,72,0): 248, 228, 217, + (122,73,0): 255, 240, 229, + (122,74,0): 255, 224, 214, + (122,75,0): 234, 167, 159, + (122,76,0): 190, 101, 97, + (122,77,0): 177, 67, 68, + (122,78,0): 198, 72, 75, + (122,79,0): 219, 86, 89, + (122,80,0): 216, 88, 85, + (122,81,0): 207, 79, 76, + (122,82,0): 202, 70, 66, + (122,83,0): 204, 69, 66, + (122,84,0): 210, 70, 69, + (122,85,0): 214, 70, 70, + (122,86,0): 216, 68, 68, + (122,87,0): 217, 67, 68, + (122,88,0): 214, 61, 63, + (122,89,0): 216, 62, 64, + (122,90,0): 217, 63, 63, + (122,91,0): 217, 63, 63, + (122,92,0): 217, 65, 64, + (122,93,0): 214, 64, 63, + (122,94,0): 213, 65, 61, + (122,95,0): 213, 64, 58, + (122,96,0): 217, 64, 58, + (122,97,0): 217, 64, 58, + (122,98,0): 210, 66, 58, + (122,99,0): 203, 69, 60, + (122,100,0): 192, 68, 60, + (122,101,0): 178, 66, 55, + (122,102,0): 161, 60, 50, + (122,103,0): 147, 57, 46, + (122,104,0): 142, 60, 48, + (122,105,0): 137, 61, 48, + (122,106,0): 131, 62, 47, + (122,107,0): 129, 62, 46, + (122,108,0): 127, 61, 45, + (122,109,0): 126, 60, 44, + (122,110,0): 128, 61, 45, + (122,111,0): 128, 61, 45, + (122,112,0): 127, 57, 45, + (122,113,0): 127, 57, 45, + (122,114,0): 126, 58, 47, + (122,115,0): 125, 57, 46, + (122,116,0): 125, 57, 46, + (122,117,0): 124, 56, 45, + (122,118,0): 123, 56, 47, + (122,119,0): 123, 56, 47, + (122,120,0): 125, 58, 49, + (122,121,0): 125, 58, 49, + (122,122,0): 123, 59, 50, + (122,123,0): 123, 59, 50, + (122,124,0): 123, 59, 50, + (122,125,0): 123, 59, 50, + (122,126,0): 122, 59, 52, + (122,127,0): 120, 60, 52, + (122,128,0): 116, 59, 50, + (122,129,0): 113, 59, 49, + (122,130,0): 114, 57, 48, + (122,131,0): 111, 57, 47, + (122,132,0): 110, 56, 46, + (122,133,0): 108, 56, 45, + (122,134,0): 108, 54, 44, + (122,135,0): 107, 55, 44, + (122,136,0): 108, 56, 45, + (122,137,0): 106, 56, 45, + (122,138,0): 106, 56, 45, + (122,139,0): 106, 56, 45, + (122,140,0): 106, 56, 45, + (122,141,0): 105, 57, 45, + (122,142,0): 106, 56, 45, + (122,143,0): 106, 56, 45, + (122,144,0): 110, 57, 49, + (122,145,0): 109, 56, 48, + (122,146,0): 109, 56, 48, + (122,147,0): 109, 56, 48, + (122,148,0): 109, 56, 48, + (122,149,0): 105, 55, 46, + (122,150,0): 102, 52, 43, + (122,151,0): 99, 49, 40, + (122,152,0): 100, 50, 41, + (122,153,0): 97, 49, 39, + (122,154,0): 93, 45, 35, + (122,155,0): 95, 48, 38, + (122,156,0): 99, 52, 42, + (122,157,0): 92, 45, 35, + (122,158,0): 95, 48, 38, + (122,159,0): 115, 68, 60, + (122,160,0): 125, 80, 74, + (122,161,0): 129, 86, 80, + (122,162,0): 126, 89, 81, + (122,163,0): 112, 84, 73, + (122,164,0): 94, 74, 63, + (122,165,0): 79, 67, 55, + (122,166,0): 63, 60, 45, + (122,167,0): 52, 54, 40, + (122,168,0): 50, 59, 42, + (122,169,0): 48, 59, 43, + (122,170,0): 49, 60, 46, + (122,171,0): 50, 61, 47, + (122,172,0): 52, 60, 49, + (122,173,0): 52, 60, 49, + (122,174,0): 53, 59, 49, + (122,175,0): 55, 58, 51, + (122,176,0): 55, 57, 52, + (122,177,0): 55, 57, 54, + (122,178,0): 54, 56, 51, + (122,179,0): 53, 55, 50, + (122,180,0): 53, 55, 50, + (122,181,0): 50, 55, 48, + (122,182,0): 48, 55, 47, + (122,183,0): 48, 56, 45, + (122,184,0): 46, 57, 43, + (122,185,0): 48, 59, 45, + (122,186,0): 50, 63, 46, + (122,187,0): 54, 67, 50, + (122,188,0): 55, 69, 52, + (122,189,0): 56, 71, 52, + (122,190,0): 56, 71, 52, + (122,191,0): 57, 70, 53, + (122,192,0): 52, 62, 51, + (122,193,0): 51, 58, 50, + (122,194,0): 47, 52, 45, + (122,195,0): 44, 50, 40, + (122,196,0): 47, 48, 40, + (122,197,0): 49, 51, 40, + (122,198,0): 53, 55, 42, + (122,199,0): 54, 58, 41, + (122,200,0): 54, 62, 39, + (122,201,0): 68, 81, 53, + (122,202,0): 89, 109, 74, + (122,203,0): 107, 132, 90, + (122,204,0): 119, 151, 102, + (122,205,0): 119, 156, 102, + (122,206,0): 108, 147, 90, + (122,207,0): 95, 135, 75, + (122,208,0): 87, 120, 67, + (122,209,0): 87, 117, 67, + (122,210,0): 84, 114, 64, + (122,211,0): 84, 114, 64, + (122,212,0): 86, 116, 66, + (122,213,0): 88, 118, 68, + (122,214,0): 89, 119, 69, + (122,215,0): 89, 119, 69, + (122,216,0): 90, 120, 70, + (122,217,0): 93, 123, 73, + (122,218,0): 95, 125, 75, + (122,219,0): 93, 123, 73, + (122,220,0): 93, 123, 73, + (122,221,0): 95, 125, 75, + (122,222,0): 94, 124, 74, + (122,223,0): 90, 119, 75, + (122,224,0): 78, 101, 72, + (122,225,0): 65, 87, 64, + (122,226,0): 54, 76, 53, + (123,0,0): 105, 99, 83, + (123,1,0): 105, 99, 83, + (123,2,0): 105, 99, 83, + (123,3,0): 105, 99, 83, + (123,4,0): 105, 99, 83, + (123,5,0): 105, 99, 83, + (123,6,0): 105, 99, 83, + (123,7,0): 105, 99, 83, + (123,8,0): 105, 99, 83, + (123,9,0): 105, 99, 83, + (123,10,0): 105, 99, 83, + (123,11,0): 105, 99, 83, + (123,12,0): 105, 99, 83, + (123,13,0): 105, 99, 83, + (123,14,0): 105, 99, 83, + (123,15,0): 105, 99, 83, + (123,16,0): 106, 99, 83, + (123,17,0): 107, 98, 83, + (123,18,0): 107, 98, 83, + (123,19,0): 108, 99, 84, + (123,20,0): 108, 99, 84, + (123,21,0): 109, 100, 85, + (123,22,0): 109, 100, 85, + (123,23,0): 109, 100, 85, + (123,24,0): 109, 100, 85, + (123,25,0): 109, 100, 85, + (123,26,0): 109, 100, 85, + (123,27,0): 110, 101, 86, + (123,28,0): 110, 101, 86, + (123,29,0): 110, 101, 86, + (123,30,0): 110, 101, 86, + (123,31,0): 109, 103, 91, + (123,32,0): 106, 107, 102, + (123,33,0): 131, 135, 136, + (123,34,0): 163, 167, 168, + (123,35,0): 185, 190, 193, + (123,36,0): 208, 213, 216, + (123,37,0): 229, 237, 239, + (123,38,0): 243, 251, 253, + (123,39,0): 245, 253, 255, + (123,40,0): 251, 255, 255, + (123,41,0): 251, 255, 255, + (123,42,0): 252, 255, 255, + (123,43,0): 252, 254, 251, + (123,44,0): 253, 254, 249, + (123,45,0): 254, 253, 248, + (123,46,0): 255, 254, 247, + (123,47,0): 255, 255, 243, + (123,48,0): 248, 253, 230, + (123,49,0): 244, 253, 222, + (123,50,0): 238, 247, 216, + (123,51,0): 230, 242, 206, + (123,52,0): 221, 233, 195, + (123,53,0): 206, 218, 180, + (123,54,0): 182, 193, 153, + (123,55,0): 161, 171, 134, + (123,56,0): 128, 135, 101, + (123,57,0): 102, 109, 76, + (123,58,0): 77, 81, 54, + (123,59,0): 70, 72, 48, + (123,60,0): 72, 74, 53, + (123,61,0): 75, 73, 58, + (123,62,0): 72, 68, 57, + (123,63,0): 68, 64, 55, + (123,64,0): 80, 70, 68, + (123,65,0): 106, 96, 95, + (123,66,0): 139, 129, 128, + (123,67,0): 164, 154, 153, + (123,68,0): 183, 175, 172, + (123,69,0): 203, 198, 194, + (123,70,0): 223, 218, 212, + (123,71,0): 234, 230, 221, + (123,72,0): 247, 238, 229, + (123,73,0): 255, 249, 239, + (123,74,0): 255, 246, 235, + (123,75,0): 255, 215, 207, + (123,76,0): 245, 178, 172, + (123,77,0): 227, 141, 140, + (123,78,0): 200, 100, 100, + (123,79,0): 176, 68, 66, + (123,80,0): 194, 83, 76, + (123,81,0): 200, 85, 78, + (123,82,0): 199, 82, 73, + (123,83,0): 195, 72, 65, + (123,84,0): 199, 72, 66, + (123,85,0): 211, 77, 74, + (123,86,0): 213, 74, 71, + (123,87,0): 207, 63, 62, + (123,88,0): 210, 62, 62, + (123,89,0): 212, 62, 63, + (123,90,0): 213, 63, 62, + (123,91,0): 216, 64, 63, + (123,92,0): 214, 64, 63, + (123,93,0): 214, 64, 63, + (123,94,0): 213, 65, 61, + (123,95,0): 213, 65, 61, + (123,96,0): 214, 62, 57, + (123,97,0): 213, 64, 58, + (123,98,0): 210, 67, 61, + (123,99,0): 204, 69, 63, + (123,100,0): 192, 69, 62, + (123,101,0): 178, 65, 57, + (123,102,0): 162, 61, 53, + (123,103,0): 149, 59, 50, + (123,104,0): 142, 60, 49, + (123,105,0): 137, 61, 48, + (123,106,0): 131, 62, 47, + (123,107,0): 129, 62, 46, + (123,108,0): 127, 61, 47, + (123,109,0): 126, 60, 44, + (123,110,0): 128, 61, 45, + (123,111,0): 128, 61, 45, + (123,112,0): 127, 57, 45, + (123,113,0): 127, 57, 45, + (123,114,0): 126, 58, 47, + (123,115,0): 125, 57, 46, + (123,116,0): 125, 57, 46, + (123,117,0): 124, 56, 45, + (123,118,0): 123, 56, 47, + (123,119,0): 123, 56, 47, + (123,120,0): 126, 59, 50, + (123,121,0): 126, 59, 50, + (123,122,0): 124, 60, 51, + (123,123,0): 123, 59, 50, + (123,124,0): 123, 59, 50, + (123,125,0): 123, 59, 50, + (123,126,0): 122, 59, 52, + (123,127,0): 120, 60, 52, + (123,128,0): 114, 57, 48, + (123,129,0): 111, 57, 47, + (123,130,0): 111, 57, 47, + (123,131,0): 109, 57, 46, + (123,132,0): 108, 56, 45, + (123,133,0): 107, 55, 44, + (123,134,0): 106, 54, 43, + (123,135,0): 104, 54, 43, + (123,136,0): 105, 55, 44, + (123,137,0): 105, 55, 44, + (123,138,0): 105, 55, 44, + (123,139,0): 104, 56, 44, + (123,140,0): 104, 56, 44, + (123,141,0): 104, 56, 44, + (123,142,0): 104, 56, 44, + (123,143,0): 104, 56, 44, + (123,144,0): 109, 59, 50, + (123,145,0): 108, 55, 47, + (123,146,0): 106, 53, 45, + (123,147,0): 105, 55, 46, + (123,148,0): 106, 56, 47, + (123,149,0): 106, 56, 47, + (123,150,0): 102, 52, 43, + (123,151,0): 97, 49, 39, + (123,152,0): 101, 53, 43, + (123,153,0): 97, 50, 40, + (123,154,0): 93, 46, 36, + (123,155,0): 97, 50, 40, + (123,156,0): 98, 51, 41, + (123,157,0): 89, 42, 32, + (123,158,0): 97, 50, 40, + (123,159,0): 121, 78, 69, + (123,160,0): 129, 92, 86, + (123,161,0): 118, 87, 82, + (123,162,0): 105, 78, 71, + (123,163,0): 87, 67, 58, + (123,164,0): 73, 60, 51, + (123,165,0): 64, 58, 46, + (123,166,0): 58, 59, 45, + (123,167,0): 56, 60, 46, + (123,168,0): 48, 56, 41, + (123,169,0): 47, 58, 42, + (123,170,0): 51, 59, 46, + (123,171,0): 52, 60, 47, + (123,172,0): 53, 61, 50, + (123,173,0): 53, 59, 49, + (123,174,0): 54, 57, 48, + (123,175,0): 54, 57, 48, + (123,176,0): 55, 57, 52, + (123,177,0): 54, 56, 51, + (123,178,0): 54, 56, 51, + (123,179,0): 52, 57, 50, + (123,180,0): 51, 56, 49, + (123,181,0): 51, 57, 47, + (123,182,0): 49, 57, 46, + (123,183,0): 49, 57, 46, + (123,184,0): 46, 57, 43, + (123,185,0): 47, 58, 44, + (123,186,0): 48, 61, 44, + (123,187,0): 50, 63, 46, + (123,188,0): 53, 66, 49, + (123,189,0): 55, 69, 52, + (123,190,0): 59, 72, 54, + (123,191,0): 60, 73, 56, + (123,192,0): 57, 67, 56, + (123,193,0): 55, 63, 52, + (123,194,0): 50, 56, 46, + (123,195,0): 45, 51, 39, + (123,196,0): 46, 48, 37, + (123,197,0): 47, 49, 36, + (123,198,0): 50, 52, 38, + (123,199,0): 52, 56, 39, + (123,200,0): 52, 60, 39, + (123,201,0): 69, 82, 56, + (123,202,0): 93, 112, 80, + (123,203,0): 114, 139, 100, + (123,204,0): 123, 154, 110, + (123,205,0): 119, 156, 105, + (123,206,0): 102, 141, 88, + (123,207,0): 85, 124, 69, + (123,208,0): 83, 115, 65, + (123,209,0): 84, 114, 64, + (123,210,0): 83, 113, 63, + (123,211,0): 83, 113, 63, + (123,212,0): 84, 114, 64, + (123,213,0): 85, 115, 65, + (123,214,0): 86, 116, 66, + (123,215,0): 86, 116, 66, + (123,216,0): 87, 117, 67, + (123,217,0): 91, 121, 71, + (123,218,0): 93, 123, 73, + (123,219,0): 92, 122, 72, + (123,220,0): 94, 124, 74, + (123,221,0): 95, 125, 75, + (123,222,0): 92, 122, 72, + (123,223,0): 87, 114, 73, + (123,224,0): 73, 93, 68, + (123,225,0): 61, 78, 60, + (123,226,0): 49, 66, 48, + (124,0,0): 103, 100, 83, + (124,1,0): 103, 100, 83, + (124,2,0): 103, 100, 83, + (124,3,0): 103, 100, 83, + (124,4,0): 103, 100, 83, + (124,5,0): 103, 100, 83, + (124,6,0): 103, 100, 83, + (124,7,0): 103, 100, 83, + (124,8,0): 103, 100, 83, + (124,9,0): 103, 100, 83, + (124,10,0): 103, 100, 83, + (124,11,0): 103, 100, 83, + (124,12,0): 103, 100, 83, + (124,13,0): 103, 100, 83, + (124,14,0): 103, 100, 83, + (124,15,0): 105, 99, 83, + (124,16,0): 106, 99, 83, + (124,17,0): 107, 98, 83, + (124,18,0): 107, 98, 83, + (124,19,0): 108, 99, 84, + (124,20,0): 108, 99, 84, + (124,21,0): 109, 100, 85, + (124,22,0): 109, 100, 85, + (124,23,0): 109, 100, 85, + (124,24,0): 109, 100, 85, + (124,25,0): 109, 100, 85, + (124,26,0): 109, 100, 85, + (124,27,0): 110, 101, 86, + (124,28,0): 110, 101, 86, + (124,29,0): 111, 102, 87, + (124,30,0): 111, 102, 87, + (124,31,0): 110, 103, 93, + (124,32,0): 113, 113, 111, + (124,33,0): 135, 140, 143, + (124,34,0): 164, 169, 172, + (124,35,0): 183, 191, 194, + (124,36,0): 205, 213, 216, + (124,37,0): 227, 237, 239, + (124,38,0): 242, 252, 254, + (124,39,0): 244, 254, 255, + (124,40,0): 248, 255, 255, + (124,41,0): 250, 255, 255, + (124,42,0): 251, 255, 252, + (124,43,0): 253, 255, 250, + (124,44,0): 252, 253, 245, + (124,45,0): 250, 252, 241, + (124,46,0): 249, 249, 237, + (124,47,0): 246, 248, 234, + (124,48,0): 246, 255, 232, + (124,49,0): 243, 255, 228, + (124,50,0): 240, 253, 225, + (124,51,0): 238, 249, 217, + (124,52,0): 233, 244, 210, + (124,53,0): 222, 232, 197, + (124,54,0): 202, 210, 173, + (124,55,0): 182, 190, 153, + (124,56,0): 157, 163, 129, + (124,57,0): 125, 130, 98, + (124,58,0): 89, 93, 66, + (124,59,0): 71, 76, 53, + (124,60,0): 70, 75, 55, + (124,61,0): 70, 74, 57, + (124,62,0): 67, 71, 57, + (124,63,0): 65, 67, 56, + (124,64,0): 98, 95, 88, + (124,65,0): 133, 125, 122, + (124,66,0): 170, 162, 159, + (124,67,0): 192, 184, 181, + (124,68,0): 203, 195, 193, + (124,69,0): 213, 208, 205, + (124,70,0): 230, 225, 221, + (124,71,0): 241, 238, 233, + (124,72,0): 249, 246, 239, + (124,73,0): 250, 243, 233, + (124,74,0): 251, 237, 226, + (124,75,0): 255, 236, 227, + (124,76,0): 255, 242, 234, + (124,77,0): 255, 224, 219, + (124,78,0): 233, 165, 162, + (124,79,0): 182, 105, 99, + (124,80,0): 164, 76, 64, + (124,81,0): 178, 82, 68, + (124,82,0): 192, 90, 78, + (124,83,0): 199, 92, 82, + (124,84,0): 197, 83, 73, + (124,85,0): 190, 69, 61, + (124,86,0): 193, 64, 59, + (124,87,0): 202, 67, 64, + (124,88,0): 203, 64, 61, + (124,89,0): 206, 64, 62, + (124,90,0): 209, 63, 63, + (124,91,0): 210, 64, 64, + (124,92,0): 211, 66, 63, + (124,93,0): 211, 66, 63, + (124,94,0): 211, 66, 63, + (124,95,0): 211, 66, 61, + (124,96,0): 211, 63, 59, + (124,97,0): 210, 65, 60, + (124,98,0): 208, 69, 64, + (124,99,0): 201, 69, 64, + (124,100,0): 189, 67, 62, + (124,101,0): 175, 64, 57, + (124,102,0): 160, 62, 53, + (124,103,0): 149, 61, 51, + (124,104,0): 142, 60, 49, + (124,105,0): 137, 60, 50, + (124,106,0): 131, 61, 49, + (124,107,0): 129, 61, 48, + (124,108,0): 127, 61, 49, + (124,109,0): 126, 60, 46, + (124,110,0): 127, 61, 47, + (124,111,0): 127, 61, 47, + (124,112,0): 126, 58, 47, + (124,113,0): 126, 58, 47, + (124,114,0): 126, 58, 47, + (124,115,0): 125, 57, 46, + (124,116,0): 124, 57, 48, + (124,117,0): 123, 56, 47, + (124,118,0): 123, 56, 47, + (124,119,0): 123, 56, 47, + (124,120,0): 124, 60, 51, + (124,121,0): 124, 60, 51, + (124,122,0): 124, 60, 51, + (124,123,0): 123, 59, 50, + (124,124,0): 122, 59, 52, + (124,125,0): 121, 58, 51, + (124,126,0): 121, 58, 51, + (124,127,0): 119, 59, 51, + (124,128,0): 110, 55, 48, + (124,129,0): 109, 56, 48, + (124,130,0): 108, 55, 47, + (124,131,0): 108, 55, 47, + (124,132,0): 107, 54, 46, + (124,133,0): 104, 54, 45, + (124,134,0): 104, 54, 45, + (124,135,0): 104, 54, 45, + (124,136,0): 105, 55, 46, + (124,137,0): 104, 56, 46, + (124,138,0): 104, 56, 46, + (124,139,0): 103, 56, 46, + (124,140,0): 103, 56, 46, + (124,141,0): 103, 56, 46, + (124,142,0): 103, 56, 46, + (124,143,0): 104, 56, 46, + (124,144,0): 107, 57, 50, + (124,145,0): 104, 54, 47, + (124,146,0): 102, 52, 45, + (124,147,0): 103, 53, 46, + (124,148,0): 105, 55, 48, + (124,149,0): 104, 55, 48, + (124,150,0): 101, 52, 45, + (124,151,0): 98, 49, 42, + (124,152,0): 99, 50, 43, + (124,153,0): 98, 51, 43, + (124,154,0): 95, 48, 40, + (124,155,0): 93, 49, 40, + (124,156,0): 93, 49, 40, + (124,157,0): 86, 42, 33, + (124,158,0): 98, 54, 45, + (124,159,0): 123, 85, 76, + (124,160,0): 116, 89, 82, + (124,161,0): 97, 78, 72, + (124,162,0): 78, 63, 56, + (124,163,0): 65, 55, 46, + (124,164,0): 61, 54, 44, + (124,165,0): 59, 57, 45, + (124,166,0): 57, 59, 46, + (124,167,0): 57, 60, 49, + (124,168,0): 51, 57, 45, + (124,169,0): 51, 59, 46, + (124,170,0): 53, 59, 47, + (124,171,0): 54, 60, 48, + (124,172,0): 54, 60, 48, + (124,173,0): 55, 58, 47, + (124,174,0): 53, 56, 45, + (124,175,0): 52, 55, 46, + (124,176,0): 54, 57, 48, + (124,177,0): 52, 57, 50, + (124,178,0): 51, 56, 49, + (124,179,0): 51, 57, 47, + (124,180,0): 51, 57, 47, + (124,181,0): 50, 58, 47, + (124,182,0): 49, 57, 46, + (124,183,0): 49, 57, 44, + (124,184,0): 46, 57, 43, + (124,185,0): 46, 57, 43, + (124,186,0): 47, 58, 44, + (124,187,0): 48, 59, 45, + (124,188,0): 51, 62, 46, + (124,189,0): 54, 67, 50, + (124,190,0): 58, 69, 53, + (124,191,0): 60, 71, 55, + (124,192,0): 61, 69, 56, + (124,193,0): 58, 66, 53, + (124,194,0): 53, 59, 47, + (124,195,0): 48, 54, 40, + (124,196,0): 48, 50, 37, + (124,197,0): 47, 49, 36, + (124,198,0): 49, 51, 37, + (124,199,0): 49, 53, 36, + (124,200,0): 50, 58, 37, + (124,201,0): 71, 83, 59, + (124,202,0): 98, 117, 87, + (124,203,0): 119, 143, 107, + (124,204,0): 124, 155, 114, + (124,205,0): 113, 149, 103, + (124,206,0): 92, 130, 81, + (124,207,0): 74, 112, 61, + (124,208,0): 79, 111, 62, + (124,209,0): 81, 110, 62, + (124,210,0): 81, 110, 62, + (124,211,0): 81, 110, 62, + (124,212,0): 81, 110, 62, + (124,213,0): 81, 110, 62, + (124,214,0): 83, 112, 64, + (124,215,0): 83, 112, 64, + (124,216,0): 87, 116, 68, + (124,217,0): 91, 120, 72, + (124,218,0): 93, 122, 74, + (124,219,0): 93, 122, 74, + (124,220,0): 95, 124, 76, + (124,221,0): 95, 124, 76, + (124,222,0): 90, 119, 71, + (124,223,0): 82, 108, 69, + (124,224,0): 65, 82, 63, + (124,225,0): 54, 67, 57, + (124,226,0): 43, 56, 46, + (125,0,0): 103, 100, 83, + (125,1,0): 103, 100, 83, + (125,2,0): 103, 100, 83, + (125,3,0): 103, 100, 83, + (125,4,0): 103, 100, 83, + (125,5,0): 103, 100, 83, + (125,6,0): 103, 100, 83, + (125,7,0): 103, 100, 83, + (125,8,0): 103, 100, 83, + (125,9,0): 103, 100, 83, + (125,10,0): 103, 100, 83, + (125,11,0): 103, 100, 83, + (125,12,0): 103, 100, 83, + (125,13,0): 103, 100, 83, + (125,14,0): 103, 100, 83, + (125,15,0): 105, 99, 83, + (125,16,0): 106, 99, 83, + (125,17,0): 107, 98, 83, + (125,18,0): 107, 98, 83, + (125,19,0): 108, 99, 84, + (125,20,0): 108, 99, 84, + (125,21,0): 109, 100, 85, + (125,22,0): 109, 100, 85, + (125,23,0): 109, 100, 85, + (125,24,0): 109, 100, 85, + (125,25,0): 109, 100, 85, + (125,26,0): 110, 101, 86, + (125,27,0): 110, 101, 86, + (125,28,0): 111, 102, 87, + (125,29,0): 112, 103, 88, + (125,30,0): 112, 103, 88, + (125,31,0): 110, 103, 93, + (125,32,0): 108, 110, 109, + (125,33,0): 122, 130, 133, + (125,34,0): 147, 154, 160, + (125,35,0): 171, 181, 183, + (125,36,0): 196, 206, 208, + (125,37,0): 220, 230, 232, + (125,38,0): 237, 247, 249, + (125,39,0): 244, 254, 255, + (125,40,0): 245, 254, 253, + (125,41,0): 246, 255, 252, + (125,42,0): 250, 255, 250, + (125,43,0): 251, 255, 249, + (125,44,0): 251, 254, 243, + (125,45,0): 248, 250, 237, + (125,46,0): 245, 246, 232, + (125,47,0): 241, 244, 227, + (125,48,0): 244, 253, 234, + (125,49,0): 244, 253, 232, + (125,50,0): 244, 252, 229, + (125,51,0): 243, 249, 223, + (125,52,0): 242, 246, 219, + (125,53,0): 233, 236, 205, + (125,54,0): 216, 215, 185, + (125,55,0): 197, 196, 165, + (125,56,0): 177, 176, 146, + (125,57,0): 143, 142, 114, + (125,58,0): 101, 103, 79, + (125,59,0): 77, 80, 59, + (125,60,0): 71, 75, 58, + (125,61,0): 70, 77, 61, + (125,62,0): 71, 79, 66, + (125,63,0): 74, 82, 71, + (125,64,0): 122, 123, 115, + (125,65,0): 158, 155, 148, + (125,66,0): 195, 190, 184, + (125,67,0): 215, 207, 204, + (125,68,0): 222, 212, 211, + (125,69,0): 230, 220, 219, + (125,70,0): 243, 235, 233, + (125,71,0): 252, 247, 244, + (125,72,0): 243, 240, 235, + (125,73,0): 254, 251, 244, + (125,74,0): 255, 255, 246, + (125,75,0): 255, 251, 241, + (125,76,0): 255, 243, 234, + (125,77,0): 255, 237, 229, + (125,78,0): 255, 226, 218, + (125,79,0): 255, 210, 199, + (125,80,0): 212, 143, 127, + (125,81,0): 181, 100, 81, + (125,82,0): 162, 75, 58, + (125,83,0): 178, 85, 70, + (125,84,0): 190, 88, 74, + (125,85,0): 182, 71, 60, + (125,86,0): 182, 63, 55, + (125,87,0): 199, 74, 68, + (125,88,0): 199, 67, 62, + (125,89,0): 202, 67, 63, + (125,90,0): 205, 66, 63, + (125,91,0): 208, 66, 64, + (125,92,0): 208, 66, 62, + (125,93,0): 208, 66, 62, + (125,94,0): 208, 66, 62, + (125,95,0): 208, 65, 61, + (125,96,0): 210, 65, 60, + (125,97,0): 210, 67, 63, + (125,98,0): 206, 68, 65, + (125,99,0): 197, 68, 63, + (125,100,0): 184, 65, 61, + (125,101,0): 170, 61, 56, + (125,102,0): 158, 59, 53, + (125,103,0): 149, 60, 52, + (125,104,0): 142, 59, 51, + (125,105,0): 137, 60, 50, + (125,106,0): 131, 61, 51, + (125,107,0): 129, 61, 50, + (125,108,0): 127, 61, 49, + (125,109,0): 126, 60, 48, + (125,110,0): 127, 61, 49, + (125,111,0): 127, 61, 47, + (125,112,0): 126, 58, 47, + (125,113,0): 126, 58, 47, + (125,114,0): 126, 58, 47, + (125,115,0): 125, 57, 46, + (125,116,0): 124, 57, 48, + (125,117,0): 123, 56, 47, + (125,118,0): 123, 56, 47, + (125,119,0): 123, 56, 47, + (125,120,0): 124, 60, 51, + (125,121,0): 123, 59, 50, + (125,122,0): 123, 59, 50, + (125,123,0): 122, 58, 49, + (125,124,0): 121, 58, 51, + (125,125,0): 120, 57, 50, + (125,126,0): 119, 56, 49, + (125,127,0): 117, 57, 49, + (125,128,0): 110, 55, 48, + (125,129,0): 108, 55, 47, + (125,130,0): 108, 55, 47, + (125,131,0): 106, 56, 47, + (125,132,0): 105, 55, 46, + (125,133,0): 105, 55, 46, + (125,134,0): 104, 54, 45, + (125,135,0): 103, 55, 45, + (125,136,0): 103, 55, 45, + (125,137,0): 103, 55, 45, + (125,138,0): 102, 55, 45, + (125,139,0): 102, 55, 45, + (125,140,0): 102, 55, 45, + (125,141,0): 102, 55, 45, + (125,142,0): 102, 55, 45, + (125,143,0): 102, 55, 45, + (125,144,0): 104, 55, 48, + (125,145,0): 104, 54, 47, + (125,146,0): 103, 53, 46, + (125,147,0): 103, 53, 46, + (125,148,0): 103, 54, 47, + (125,149,0): 104, 55, 48, + (125,150,0): 103, 54, 47, + (125,151,0): 102, 53, 46, + (125,152,0): 97, 50, 42, + (125,153,0): 101, 54, 46, + (125,154,0): 94, 50, 41, + (125,155,0): 92, 48, 39, + (125,156,0): 96, 52, 43, + (125,157,0): 97, 53, 44, + (125,158,0): 105, 61, 52, + (125,159,0): 117, 83, 74, + (125,160,0): 88, 71, 64, + (125,161,0): 69, 62, 54, + (125,162,0): 60, 53, 47, + (125,163,0): 57, 53, 44, + (125,164,0): 59, 56, 47, + (125,165,0): 56, 58, 47, + (125,166,0): 53, 55, 44, + (125,167,0): 51, 54, 43, + (125,168,0): 54, 57, 46, + (125,169,0): 53, 59, 47, + (125,170,0): 55, 58, 47, + (125,171,0): 54, 57, 46, + (125,172,0): 54, 57, 46, + (125,173,0): 53, 56, 45, + (125,174,0): 53, 55, 44, + (125,175,0): 51, 54, 43, + (125,176,0): 50, 56, 44, + (125,177,0): 49, 57, 44, + (125,178,0): 50, 56, 46, + (125,179,0): 49, 57, 44, + (125,180,0): 49, 57, 46, + (125,181,0): 49, 57, 44, + (125,182,0): 49, 57, 44, + (125,183,0): 49, 57, 44, + (125,184,0): 46, 57, 43, + (125,185,0): 46, 57, 43, + (125,186,0): 46, 57, 43, + (125,187,0): 47, 58, 44, + (125,188,0): 48, 59, 43, + (125,189,0): 51, 62, 46, + (125,190,0): 54, 65, 49, + (125,191,0): 55, 66, 50, + (125,192,0): 60, 68, 53, + (125,193,0): 58, 67, 50, + (125,194,0): 56, 63, 47, + (125,195,0): 53, 59, 45, + (125,196,0): 52, 54, 41, + (125,197,0): 50, 52, 39, + (125,198,0): 49, 51, 37, + (125,199,0): 48, 52, 37, + (125,200,0): 48, 55, 37, + (125,201,0): 72, 84, 62, + (125,202,0): 101, 120, 92, + (125,203,0): 117, 141, 109, + (125,204,0): 116, 146, 108, + (125,205,0): 102, 137, 95, + (125,206,0): 82, 119, 75, + (125,207,0): 66, 104, 57, + (125,208,0): 75, 107, 60, + (125,209,0): 78, 107, 59, + (125,210,0): 80, 109, 61, + (125,211,0): 80, 109, 61, + (125,212,0): 78, 107, 59, + (125,213,0): 78, 107, 59, + (125,214,0): 79, 108, 60, + (125,215,0): 81, 110, 62, + (125,216,0): 86, 115, 67, + (125,217,0): 90, 119, 71, + (125,218,0): 93, 122, 74, + (125,219,0): 94, 123, 75, + (125,220,0): 95, 124, 76, + (125,221,0): 95, 124, 76, + (125,222,0): 86, 115, 67, + (125,223,0): 78, 102, 66, + (125,224,0): 59, 73, 56, + (125,225,0): 48, 59, 51, + (125,226,0): 38, 47, 42, + (126,0,0): 103, 100, 83, + (126,1,0): 103, 100, 83, + (126,2,0): 103, 100, 83, + (126,3,0): 103, 100, 83, + (126,4,0): 103, 100, 83, + (126,5,0): 103, 100, 83, + (126,6,0): 103, 100, 83, + (126,7,0): 103, 100, 83, + (126,8,0): 103, 100, 83, + (126,9,0): 103, 100, 83, + (126,10,0): 103, 100, 83, + (126,11,0): 103, 100, 83, + (126,12,0): 103, 100, 83, + (126,13,0): 103, 100, 83, + (126,14,0): 103, 100, 83, + (126,15,0): 105, 99, 83, + (126,16,0): 106, 99, 83, + (126,17,0): 107, 98, 83, + (126,18,0): 107, 98, 83, + (126,19,0): 108, 99, 84, + (126,20,0): 108, 99, 84, + (126,21,0): 109, 100, 85, + (126,22,0): 109, 100, 85, + (126,23,0): 109, 100, 85, + (126,24,0): 109, 100, 85, + (126,25,0): 109, 100, 85, + (126,26,0): 110, 101, 86, + (126,27,0): 110, 101, 86, + (126,28,0): 111, 102, 87, + (126,29,0): 112, 103, 88, + (126,30,0): 113, 104, 89, + (126,31,0): 111, 104, 94, + (126,32,0): 104, 105, 107, + (126,33,0): 109, 116, 122, + (126,34,0): 133, 140, 148, + (126,35,0): 163, 172, 177, + (126,36,0): 191, 200, 205, + (126,37,0): 211, 222, 226, + (126,38,0): 229, 240, 242, + (126,39,0): 240, 252, 252, + (126,40,0): 242, 252, 251, + (126,41,0): 245, 254, 249, + (126,42,0): 248, 255, 247, + (126,43,0): 250, 255, 246, + (126,44,0): 252, 255, 242, + (126,45,0): 250, 253, 236, + (126,46,0): 248, 249, 231, + (126,47,0): 246, 247, 231, + (126,48,0): 246, 246, 234, + (126,49,0): 247, 247, 235, + (126,50,0): 250, 247, 232, + (126,51,0): 252, 246, 230, + (126,52,0): 253, 245, 226, + (126,53,0): 247, 236, 214, + (126,54,0): 231, 216, 195, + (126,55,0): 213, 198, 175, + (126,56,0): 192, 177, 154, + (126,57,0): 158, 147, 125, + (126,58,0): 117, 110, 91, + (126,59,0): 90, 87, 70, + (126,60,0): 80, 81, 67, + (126,61,0): 83, 86, 75, + (126,62,0): 91, 98, 90, + (126,63,0): 99, 109, 100, + (126,64,0): 146, 154, 141, + (126,65,0): 176, 179, 168, + (126,66,0): 210, 207, 198, + (126,67,0): 230, 223, 217, + (126,68,0): 242, 228, 227, + (126,69,0): 249, 235, 235, + (126,70,0): 255, 241, 244, + (126,71,0): 255, 248, 249, + (126,72,0): 255, 253, 251, + (126,73,0): 255, 251, 248, + (126,74,0): 249, 248, 243, + (126,75,0): 247, 247, 237, + (126,76,0): 251, 249, 237, + (126,77,0): 255, 252, 240, + (126,78,0): 255, 253, 241, + (126,79,0): 255, 249, 234, + (126,80,0): 255, 224, 203, + (126,81,0): 234, 168, 144, + (126,82,0): 183, 111, 89, + (126,83,0): 168, 87, 68, + (126,84,0): 174, 85, 69, + (126,85,0): 183, 82, 70, + (126,86,0): 185, 77, 65, + (126,87,0): 191, 74, 65, + (126,88,0): 195, 71, 63, + (126,89,0): 198, 69, 63, + (126,90,0): 202, 69, 64, + (126,91,0): 203, 68, 64, + (126,92,0): 205, 68, 62, + (126,93,0): 204, 67, 61, + (126,94,0): 203, 66, 60, + (126,95,0): 204, 65, 60, + (126,96,0): 209, 67, 63, + (126,97,0): 208, 69, 64, + (126,98,0): 204, 69, 65, + (126,99,0): 194, 67, 61, + (126,100,0): 179, 61, 57, + (126,101,0): 166, 59, 53, + (126,102,0): 156, 59, 53, + (126,103,0): 149, 60, 54, + (126,104,0): 140, 60, 51, + (126,105,0): 135, 61, 52, + (126,106,0): 133, 60, 53, + (126,107,0): 129, 61, 52, + (126,108,0): 127, 60, 51, + (126,109,0): 126, 60, 48, + (126,110,0): 127, 61, 49, + (126,111,0): 127, 61, 49, + (126,112,0): 126, 58, 47, + (126,113,0): 126, 58, 47, + (126,114,0): 126, 58, 47, + (126,115,0): 125, 57, 46, + (126,116,0): 124, 57, 48, + (126,117,0): 123, 56, 47, + (126,118,0): 123, 56, 47, + (126,119,0): 123, 56, 47, + (126,120,0): 123, 59, 50, + (126,121,0): 123, 59, 50, + (126,122,0): 121, 58, 51, + (126,123,0): 120, 57, 50, + (126,124,0): 119, 56, 49, + (126,125,0): 118, 55, 48, + (126,126,0): 118, 55, 48, + (126,127,0): 115, 55, 47, + (126,128,0): 110, 55, 48, + (126,129,0): 106, 56, 47, + (126,130,0): 106, 56, 47, + (126,131,0): 106, 56, 47, + (126,132,0): 106, 56, 47, + (126,133,0): 104, 56, 46, + (126,134,0): 104, 56, 46, + (126,135,0): 104, 56, 46, + (126,136,0): 103, 55, 45, + (126,137,0): 102, 55, 45, + (126,138,0): 102, 55, 45, + (126,139,0): 102, 55, 45, + (126,140,0): 100, 56, 45, + (126,141,0): 100, 56, 45, + (126,142,0): 100, 56, 45, + (126,143,0): 102, 55, 45, + (126,144,0): 103, 54, 47, + (126,145,0): 104, 55, 48, + (126,146,0): 105, 56, 49, + (126,147,0): 105, 56, 49, + (126,148,0): 104, 55, 48, + (126,149,0): 105, 56, 49, + (126,150,0): 106, 59, 51, + (126,151,0): 108, 61, 53, + (126,152,0): 103, 56, 48, + (126,153,0): 107, 60, 52, + (126,154,0): 98, 54, 45, + (126,155,0): 97, 53, 44, + (126,156,0): 111, 67, 58, + (126,157,0): 120, 76, 67, + (126,158,0): 116, 73, 64, + (126,159,0): 110, 77, 68, + (126,160,0): 67, 57, 48, + (126,161,0): 53, 54, 46, + (126,162,0): 52, 53, 47, + (126,163,0): 56, 57, 49, + (126,164,0): 56, 59, 50, + (126,165,0): 52, 55, 46, + (126,166,0): 49, 52, 43, + (126,167,0): 50, 53, 44, + (126,168,0): 53, 56, 45, + (126,169,0): 53, 56, 45, + (126,170,0): 53, 55, 44, + (126,171,0): 52, 54, 43, + (126,172,0): 52, 54, 43, + (126,173,0): 52, 54, 43, + (126,174,0): 52, 54, 41, + (126,175,0): 51, 55, 41, + (126,176,0): 47, 55, 40, + (126,177,0): 46, 57, 41, + (126,178,0): 48, 56, 43, + (126,179,0): 46, 57, 41, + (126,180,0): 46, 57, 43, + (126,181,0): 46, 57, 41, + (126,182,0): 48, 56, 41, + (126,183,0): 48, 56, 41, + (126,184,0): 49, 57, 42, + (126,185,0): 48, 56, 41, + (126,186,0): 48, 56, 43, + (126,187,0): 47, 55, 42, + (126,188,0): 48, 56, 43, + (126,189,0): 49, 57, 44, + (126,190,0): 51, 59, 46, + (126,191,0): 52, 60, 45, + (126,192,0): 57, 66, 49, + (126,193,0): 58, 67, 48, + (126,194,0): 59, 66, 48, + (126,195,0): 58, 65, 49, + (126,196,0): 58, 60, 46, + (126,197,0): 54, 56, 42, + (126,198,0): 50, 52, 38, + (126,199,0): 47, 51, 36, + (126,200,0): 50, 57, 39, + (126,201,0): 73, 85, 63, + (126,202,0): 99, 117, 91, + (126,203,0): 109, 132, 103, + (126,204,0): 102, 132, 98, + (126,205,0): 87, 121, 84, + (126,206,0): 73, 110, 69, + (126,207,0): 63, 100, 56, + (126,208,0): 72, 103, 59, + (126,209,0): 76, 105, 59, + (126,210,0): 78, 107, 61, + (126,211,0): 78, 107, 61, + (126,212,0): 76, 105, 59, + (126,213,0): 76, 105, 59, + (126,214,0): 77, 106, 60, + (126,215,0): 79, 108, 62, + (126,216,0): 85, 114, 68, + (126,217,0): 89, 118, 72, + (126,218,0): 91, 120, 74, + (126,219,0): 93, 122, 76, + (126,220,0): 94, 123, 77, + (126,221,0): 92, 121, 75, + (126,222,0): 81, 110, 64, + (126,223,0): 71, 95, 59, + (126,224,0): 54, 66, 52, + (126,225,0): 43, 52, 47, + (126,226,0): 34, 40, 38, + (127,0,0): 103, 100, 83, + (127,1,0): 103, 100, 83, + (127,2,0): 103, 100, 83, + (127,3,0): 103, 100, 83, + (127,4,0): 103, 100, 83, + (127,5,0): 103, 100, 83, + (127,6,0): 103, 100, 83, + (127,7,0): 103, 100, 83, + (127,8,0): 103, 100, 83, + (127,9,0): 103, 100, 83, + (127,10,0): 103, 100, 83, + (127,11,0): 103, 100, 83, + (127,12,0): 103, 100, 83, + (127,13,0): 103, 100, 83, + (127,14,0): 103, 100, 83, + (127,15,0): 105, 99, 83, + (127,16,0): 106, 99, 83, + (127,17,0): 106, 99, 83, + (127,18,0): 106, 98, 85, + (127,19,0): 108, 98, 86, + (127,20,0): 108, 98, 86, + (127,21,0): 109, 99, 87, + (127,22,0): 109, 100, 85, + (127,23,0): 109, 100, 85, + (127,24,0): 109, 100, 85, + (127,25,0): 108, 101, 85, + (127,26,0): 109, 102, 86, + (127,27,0): 110, 103, 87, + (127,28,0): 111, 103, 90, + (127,29,0): 110, 104, 92, + (127,30,0): 111, 104, 94, + (127,31,0): 109, 106, 101, + (127,32,0): 107, 111, 114, + (127,33,0): 109, 116, 122, + (127,34,0): 131, 138, 144, + (127,35,0): 165, 174, 179, + (127,36,0): 195, 204, 209, + (127,37,0): 213, 223, 225, + (127,38,0): 230, 238, 241, + (127,39,0): 244, 252, 254, + (127,40,0): 244, 253, 250, + (127,41,0): 247, 253, 249, + (127,42,0): 249, 254, 247, + (127,43,0): 250, 255, 244, + (127,44,0): 252, 255, 242, + (127,45,0): 252, 255, 241, + (127,46,0): 252, 255, 238, + (127,47,0): 253, 254, 240, + (127,48,0): 251, 248, 239, + (127,49,0): 254, 250, 241, + (127,50,0): 255, 249, 239, + (127,51,0): 255, 250, 237, + (127,52,0): 255, 249, 233, + (127,53,0): 255, 242, 223, + (127,54,0): 239, 224, 203, + (127,55,0): 221, 206, 183, + (127,56,0): 193, 178, 155, + (127,57,0): 162, 151, 129, + (127,58,0): 124, 117, 98, + (127,59,0): 98, 95, 78, + (127,60,0): 88, 90, 76, + (127,61,0): 93, 99, 87, + (127,62,0): 109, 119, 110, + (127,63,0): 124, 134, 125, + (127,64,0): 165, 173, 162, + (127,65,0): 187, 193, 181, + (127,66,0): 215, 215, 207, + (127,67,0): 235, 230, 226, + (127,68,0): 250, 238, 238, + (127,69,0): 255, 244, 244, + (127,70,0): 255, 245, 247, + (127,71,0): 254, 244, 245, + (127,72,0): 253, 247, 247, + (127,73,0): 250, 249, 247, + (127,74,0): 250, 252, 247, + (127,75,0): 251, 255, 249, + (127,76,0): 250, 253, 244, + (127,77,0): 244, 247, 238, + (127,78,0): 247, 249, 238, + (127,79,0): 255, 252, 239, + (127,80,0): 255, 242, 225, + (127,81,0): 255, 242, 224, + (127,82,0): 250, 201, 184, + (127,83,0): 188, 129, 113, + (127,84,0): 157, 85, 71, + (127,85,0): 171, 85, 72, + (127,86,0): 183, 85, 74, + (127,87,0): 177, 69, 59, + (127,88,0): 192, 74, 64, + (127,89,0): 198, 71, 64, + (127,90,0): 201, 70, 62, + (127,91,0): 202, 69, 62, + (127,92,0): 202, 67, 61, + (127,93,0): 201, 66, 60, + (127,94,0): 199, 66, 59, + (127,95,0): 200, 65, 59, + (127,96,0): 207, 70, 62, + (127,97,0): 205, 71, 62, + (127,98,0): 199, 71, 62, + (127,99,0): 188, 67, 59, + (127,100,0): 173, 62, 53, + (127,101,0): 159, 58, 50, + (127,102,0): 149, 59, 51, + (127,103,0): 145, 62, 54, + (127,104,0): 138, 61, 53, + (127,105,0): 132, 62, 52, + (127,106,0): 130, 62, 53, + (127,107,0): 129, 61, 52, + (127,108,0): 127, 60, 51, + (127,109,0): 126, 60, 48, + (127,110,0): 128, 60, 49, + (127,111,0): 128, 60, 49, + (127,112,0): 126, 58, 47, + (127,113,0): 126, 58, 47, + (127,114,0): 126, 58, 49, + (127,115,0): 125, 57, 48, + (127,116,0): 124, 57, 48, + (127,117,0): 123, 56, 47, + (127,118,0): 123, 56, 47, + (127,119,0): 123, 56, 47, + (127,120,0): 122, 58, 49, + (127,121,0): 122, 58, 49, + (127,122,0): 120, 57, 50, + (127,123,0): 119, 56, 49, + (127,124,0): 118, 55, 48, + (127,125,0): 117, 54, 47, + (127,126,0): 117, 54, 47, + (127,127,0): 113, 54, 46, + (127,128,0): 109, 56, 48, + (127,129,0): 107, 57, 48, + (127,130,0): 106, 56, 47, + (127,131,0): 106, 56, 47, + (127,132,0): 105, 57, 47, + (127,133,0): 105, 57, 47, + (127,134,0): 105, 57, 47, + (127,135,0): 104, 56, 46, + (127,136,0): 103, 55, 45, + (127,137,0): 102, 55, 45, + (127,138,0): 103, 55, 45, + (127,139,0): 102, 55, 45, + (127,140,0): 102, 55, 45, + (127,141,0): 102, 55, 45, + (127,142,0): 102, 55, 45, + (127,143,0): 102, 55, 45, + (127,144,0): 102, 53, 46, + (127,145,0): 106, 56, 49, + (127,146,0): 109, 59, 52, + (127,147,0): 107, 58, 51, + (127,148,0): 106, 57, 50, + (127,149,0): 106, 58, 48, + (127,150,0): 109, 62, 52, + (127,151,0): 111, 67, 56, + (127,152,0): 108, 64, 53, + (127,153,0): 111, 68, 59, + (127,154,0): 100, 60, 50, + (127,155,0): 99, 61, 50, + (127,156,0): 122, 86, 74, + (127,157,0): 134, 100, 90, + (127,158,0): 121, 87, 77, + (127,159,0): 98, 76, 65, + (127,160,0): 62, 58, 49, + (127,161,0): 51, 56, 49, + (127,162,0): 52, 57, 50, + (127,163,0): 55, 60, 53, + (127,164,0): 52, 58, 48, + (127,165,0): 47, 53, 43, + (127,166,0): 50, 53, 44, + (127,167,0): 57, 60, 51, + (127,168,0): 51, 54, 43, + (127,169,0): 50, 53, 42, + (127,170,0): 50, 52, 41, + (127,171,0): 48, 51, 40, + (127,172,0): 49, 51, 40, + (127,173,0): 50, 53, 42, + (127,174,0): 52, 54, 43, + (127,175,0): 52, 55, 44, + (127,176,0): 46, 54, 41, + (127,177,0): 44, 55, 41, + (127,178,0): 47, 55, 42, + (127,179,0): 45, 56, 42, + (127,180,0): 47, 55, 42, + (127,181,0): 47, 55, 42, + (127,182,0): 47, 55, 42, + (127,183,0): 47, 55, 42, + (127,184,0): 49, 57, 44, + (127,185,0): 48, 56, 43, + (127,186,0): 48, 56, 45, + (127,187,0): 47, 55, 44, + (127,188,0): 47, 55, 44, + (127,189,0): 47, 55, 44, + (127,190,0): 48, 56, 45, + (127,191,0): 48, 56, 43, + (127,192,0): 55, 63, 48, + (127,193,0): 57, 66, 49, + (127,194,0): 60, 69, 52, + (127,195,0): 61, 68, 52, + (127,196,0): 59, 65, 51, + (127,197,0): 56, 60, 46, + (127,198,0): 50, 54, 39, + (127,199,0): 45, 52, 36, + (127,200,0): 50, 59, 42, + (127,201,0): 74, 86, 66, + (127,202,0): 99, 114, 91, + (127,203,0): 104, 124, 97, + (127,204,0): 93, 118, 88, + (127,205,0): 79, 109, 75, + (127,206,0): 70, 102, 65, + (127,207,0): 65, 97, 58, + (127,208,0): 72, 100, 59, + (127,209,0): 75, 104, 60, + (127,210,0): 78, 107, 63, + (127,211,0): 78, 107, 63, + (127,212,0): 75, 104, 60, + (127,213,0): 74, 103, 57, + (127,214,0): 76, 105, 61, + (127,215,0): 78, 107, 61, + (127,216,0): 84, 113, 69, + (127,217,0): 87, 116, 72, + (127,218,0): 90, 119, 75, + (127,219,0): 91, 120, 76, + (127,220,0): 93, 122, 78, + (127,221,0): 90, 118, 77, + (127,222,0): 78, 106, 65, + (127,223,0): 67, 91, 59, + (127,224,0): 50, 62, 52, + (127,225,0): 41, 47, 47, + (127,226,0): 31, 37, 37, + (128,0,0): 104, 101, 86, + (128,1,0): 104, 101, 86, + (128,2,0): 104, 101, 86, + (128,3,0): 104, 101, 86, + (128,4,0): 104, 101, 86, + (128,5,0): 104, 101, 86, + (128,6,0): 104, 101, 86, + (128,7,0): 104, 101, 86, + (128,8,0): 104, 101, 86, + (128,9,0): 104, 101, 86, + (128,10,0): 104, 101, 86, + (128,11,0): 104, 101, 86, + (128,12,0): 104, 101, 86, + (128,13,0): 104, 101, 86, + (128,14,0): 104, 101, 86, + (128,15,0): 104, 101, 86, + (128,16,0): 106, 100, 86, + (128,17,0): 106, 100, 86, + (128,18,0): 106, 100, 88, + (128,19,0): 108, 100, 89, + (128,20,0): 108, 99, 90, + (128,21,0): 109, 101, 90, + (128,22,0): 109, 101, 88, + (128,23,0): 109, 102, 86, + (128,24,0): 103, 96, 78, + (128,25,0): 106, 101, 82, + (128,26,0): 110, 107, 88, + (128,27,0): 111, 108, 93, + (128,28,0): 104, 101, 92, + (128,29,0): 102, 101, 97, + (128,30,0): 115, 113, 114, + (128,31,0): 129, 130, 134, + (128,32,0): 137, 142, 146, + (128,33,0): 149, 157, 160, + (128,34,0): 170, 178, 181, + (128,35,0): 194, 199, 202, + (128,36,0): 215, 220, 223, + (128,37,0): 233, 237, 238, + (128,38,0): 245, 246, 248, + (128,39,0): 248, 250, 249, + (128,40,0): 252, 254, 253, + (128,41,0): 254, 254, 252, + (128,42,0): 255, 255, 250, + (128,43,0): 253, 254, 246, + (128,44,0): 250, 253, 242, + (128,45,0): 249, 252, 241, + (128,46,0): 250, 253, 242, + (128,47,0): 251, 254, 243, + (128,48,0): 249, 250, 242, + (128,49,0): 250, 250, 242, + (128,50,0): 249, 249, 237, + (128,51,0): 252, 250, 235, + (128,52,0): 254, 252, 231, + (128,53,0): 249, 247, 222, + (128,54,0): 233, 229, 202, + (128,55,0): 213, 212, 182, + (128,56,0): 186, 185, 155, + (128,57,0): 152, 152, 124, + (128,58,0): 113, 116, 89, + (128,59,0): 95, 100, 77, + (128,60,0): 98, 107, 88, + (128,61,0): 114, 125, 108, + (128,62,0): 132, 144, 130, + (128,63,0): 145, 155, 144, + (128,64,0): 180, 185, 178, + (128,65,0): 202, 204, 199, + (128,66,0): 226, 227, 222, + (128,67,0): 240, 239, 235, + (128,68,0): 247, 243, 242, + (128,69,0): 251, 247, 246, + (128,70,0): 253, 249, 248, + (128,71,0): 252, 248, 247, + (128,72,0): 255, 254, 252, + (128,73,0): 254, 254, 252, + (128,74,0): 254, 254, 252, + (128,75,0): 253, 255, 250, + (128,76,0): 254, 255, 250, + (128,77,0): 254, 255, 250, + (128,78,0): 254, 255, 250, + (128,79,0): 254, 255, 250, + (128,80,0): 251, 253, 248, + (128,81,0): 255, 253, 248, + (128,82,0): 255, 251, 246, + (128,83,0): 255, 229, 223, + (128,84,0): 215, 166, 159, + (128,85,0): 163, 96, 88, + (128,86,0): 155, 68, 61, + (128,87,0): 178, 75, 66, + (128,88,0): 193, 79, 69, + (128,89,0): 195, 71, 61, + (128,90,0): 198, 67, 57, + (128,91,0): 201, 68, 59, + (128,92,0): 205, 72, 63, + (128,93,0): 206, 73, 64, + (128,94,0): 203, 72, 64, + (128,95,0): 202, 71, 61, + (128,96,0): 198, 71, 56, + (128,97,0): 195, 72, 56, + (128,98,0): 190, 73, 56, + (128,99,0): 181, 71, 56, + (128,100,0): 166, 69, 53, + (128,101,0): 154, 66, 52, + (128,102,0): 144, 66, 53, + (128,103,0): 139, 67, 53, + (128,104,0): 133, 67, 53, + (128,105,0): 129, 67, 54, + (128,106,0): 127, 65, 52, + (128,107,0): 127, 63, 51, + (128,108,0): 128, 62, 50, + (128,109,0): 128, 60, 49, + (128,110,0): 129, 59, 49, + (128,111,0): 129, 59, 49, + (128,112,0): 127, 57, 49, + (128,113,0): 126, 58, 49, + (128,114,0): 124, 57, 49, + (128,115,0): 123, 56, 48, + (128,116,0): 122, 55, 47, + (128,117,0): 122, 55, 47, + (128,118,0): 119, 55, 46, + (128,119,0): 118, 54, 45, + (128,120,0): 119, 55, 46, + (128,121,0): 119, 55, 46, + (128,122,0): 119, 56, 47, + (128,123,0): 119, 56, 47, + (128,124,0): 118, 55, 46, + (128,125,0): 117, 54, 45, + (128,126,0): 113, 53, 43, + (128,127,0): 110, 51, 43, + (128,128,0): 108, 55, 47, + (128,129,0): 105, 56, 49, + (128,130,0): 105, 56, 49, + (128,131,0): 104, 55, 48, + (128,132,0): 104, 55, 48, + (128,133,0): 103, 54, 47, + (128,134,0): 103, 54, 47, + (128,135,0): 103, 54, 47, + (128,136,0): 102, 53, 46, + (128,137,0): 103, 54, 47, + (128,138,0): 105, 55, 48, + (128,139,0): 105, 56, 49, + (128,140,0): 104, 55, 48, + (128,141,0): 103, 54, 47, + (128,142,0): 101, 52, 45, + (128,143,0): 101, 51, 44, + (128,144,0): 104, 51, 45, + (128,145,0): 106, 53, 47, + (128,146,0): 109, 56, 48, + (128,147,0): 107, 57, 48, + (128,148,0): 106, 58, 48, + (128,149,0): 105, 59, 46, + (128,150,0): 105, 61, 48, + (128,151,0): 107, 65, 51, + (128,152,0): 103, 66, 50, + (128,153,0): 106, 73, 58, + (128,154,0): 100, 72, 58, + (128,155,0): 118, 95, 79, + (128,156,0): 126, 107, 92, + (128,157,0): 138, 120, 106, + (128,158,0): 140, 127, 111, + (128,159,0): 82, 74, 61, + (128,160,0): 55, 57, 46, + (128,161,0): 52, 58, 48, + (128,162,0): 52, 58, 48, + (128,163,0): 51, 57, 47, + (128,164,0): 51, 57, 47, + (128,165,0): 51, 57, 47, + (128,166,0): 50, 56, 46, + (128,167,0): 50, 56, 46, + (128,168,0): 49, 55, 45, + (128,169,0): 49, 55, 45, + (128,170,0): 51, 54, 45, + (128,171,0): 48, 54, 44, + (128,172,0): 50, 53, 44, + (128,173,0): 47, 53, 43, + (128,174,0): 49, 52, 43, + (128,175,0): 47, 53, 43, + (128,176,0): 47, 52, 45, + (128,177,0): 46, 53, 45, + (128,178,0): 47, 52, 45, + (128,179,0): 46, 53, 45, + (128,180,0): 47, 52, 45, + (128,181,0): 47, 52, 45, + (128,182,0): 47, 52, 45, + (128,183,0): 47, 52, 45, + (128,184,0): 48, 53, 46, + (128,185,0): 47, 52, 45, + (128,186,0): 47, 52, 45, + (128,187,0): 46, 51, 44, + (128,188,0): 46, 51, 44, + (128,189,0): 47, 52, 45, + (128,190,0): 47, 52, 45, + (128,191,0): 47, 54, 46, + (128,192,0): 49, 59, 50, + (128,193,0): 51, 61, 50, + (128,194,0): 54, 64, 53, + (128,195,0): 56, 66, 55, + (128,196,0): 57, 68, 54, + (128,197,0): 55, 66, 52, + (128,198,0): 53, 64, 48, + (128,199,0): 51, 62, 45, + (128,200,0): 52, 63, 46, + (128,201,0): 68, 81, 61, + (128,202,0): 87, 101, 78, + (128,203,0): 91, 107, 81, + (128,204,0): 80, 98, 72, + (128,205,0): 69, 88, 60, + (128,206,0): 64, 84, 56, + (128,207,0): 66, 87, 54, + (128,208,0): 73, 99, 62, + (128,209,0): 75, 101, 62, + (128,210,0): 75, 102, 61, + (128,211,0): 75, 102, 61, + (128,212,0): 74, 101, 60, + (128,213,0): 74, 101, 58, + (128,214,0): 76, 103, 62, + (128,215,0): 79, 106, 63, + (128,216,0): 85, 112, 71, + (128,217,0): 89, 116, 75, + (128,218,0): 92, 118, 79, + (128,219,0): 93, 119, 80, + (128,220,0): 93, 119, 82, + (128,221,0): 87, 113, 78, + (128,222,0): 72, 98, 63, + (128,223,0): 59, 79, 54, + (128,224,0): 37, 48, 42, + (128,225,0): 38, 43, 46, + (128,226,0): 36, 41, 44, + (129,0,0): 104, 101, 86, + (129,1,0): 104, 101, 86, + (129,2,0): 104, 101, 86, + (129,3,0): 104, 101, 86, + (129,4,0): 104, 101, 86, + (129,5,0): 104, 101, 86, + (129,6,0): 104, 101, 86, + (129,7,0): 104, 101, 86, + (129,8,0): 104, 101, 86, + (129,9,0): 104, 101, 86, + (129,10,0): 104, 101, 86, + (129,11,0): 104, 101, 86, + (129,12,0): 104, 101, 86, + (129,13,0): 104, 101, 86, + (129,14,0): 104, 101, 86, + (129,15,0): 104, 101, 86, + (129,16,0): 104, 101, 86, + (129,17,0): 104, 101, 86, + (129,18,0): 106, 99, 89, + (129,19,0): 107, 100, 90, + (129,20,0): 108, 99, 92, + (129,21,0): 109, 100, 91, + (129,22,0): 109, 101, 90, + (129,23,0): 109, 102, 86, + (129,24,0): 105, 100, 81, + (129,25,0): 106, 104, 83, + (129,26,0): 109, 106, 87, + (129,27,0): 106, 107, 91, + (129,28,0): 103, 103, 95, + (129,29,0): 108, 108, 108, + (129,30,0): 126, 127, 132, + (129,31,0): 144, 147, 154, + (129,32,0): 167, 174, 180, + (129,33,0): 183, 193, 195, + (129,34,0): 208, 213, 216, + (129,35,0): 225, 230, 233, + (129,36,0): 241, 242, 244, + (129,37,0): 250, 251, 253, + (129,38,0): 255, 254, 255, + (129,39,0): 255, 254, 255, + (129,40,0): 254, 253, 251, + (129,41,0): 255, 254, 250, + (129,42,0): 255, 255, 250, + (129,43,0): 254, 255, 249, + (129,44,0): 251, 252, 244, + (129,45,0): 248, 251, 242, + (129,46,0): 246, 252, 242, + (129,47,0): 247, 253, 243, + (129,48,0): 247, 250, 241, + (129,49,0): 248, 250, 239, + (129,50,0): 248, 250, 237, + (129,51,0): 247, 250, 233, + (129,52,0): 249, 251, 229, + (129,53,0): 242, 245, 218, + (129,54,0): 223, 226, 195, + (129,55,0): 204, 208, 175, + (129,56,0): 180, 184, 151, + (129,57,0): 145, 150, 118, + (129,58,0): 107, 113, 85, + (129,59,0): 89, 97, 73, + (129,60,0): 95, 107, 85, + (129,61,0): 116, 129, 111, + (129,62,0): 140, 152, 138, + (129,63,0): 157, 167, 156, + (129,64,0): 191, 193, 188, + (129,65,0): 211, 211, 209, + (129,66,0): 231, 231, 229, + (129,67,0): 243, 243, 241, + (129,68,0): 247, 247, 245, + (129,69,0): 251, 251, 249, + (129,70,0): 252, 252, 250, + (129,71,0): 251, 251, 249, + (129,72,0): 254, 254, 252, + (129,73,0): 254, 254, 252, + (129,74,0): 254, 254, 252, + (129,75,0): 254, 254, 252, + (129,76,0): 254, 254, 252, + (129,77,0): 254, 254, 252, + (129,78,0): 254, 254, 252, + (129,79,0): 251, 255, 254, + (129,80,0): 241, 255, 255, + (129,81,0): 237, 251, 252, + (129,82,0): 247, 249, 248, + (129,83,0): 255, 248, 247, + (129,84,0): 255, 233, 230, + (129,85,0): 239, 190, 185, + (129,86,0): 196, 128, 119, + (129,87,0): 164, 80, 70, + (129,88,0): 176, 78, 65, + (129,89,0): 186, 76, 63, + (129,90,0): 193, 75, 63, + (129,91,0): 196, 74, 61, + (129,92,0): 194, 68, 56, + (129,93,0): 188, 61, 52, + (129,94,0): 190, 63, 54, + (129,95,0): 196, 70, 58, + (129,96,0): 196, 70, 55, + (129,97,0): 195, 74, 55, + (129,98,0): 191, 76, 58, + (129,99,0): 180, 73, 55, + (129,100,0): 166, 70, 54, + (129,101,0): 153, 67, 50, + (129,102,0): 144, 68, 54, + (129,103,0): 138, 71, 55, + (129,104,0): 130, 68, 55, + (129,105,0): 127, 67, 56, + (129,106,0): 126, 66, 55, + (129,107,0): 124, 64, 53, + (129,108,0): 126, 62, 52, + (129,109,0): 127, 60, 51, + (129,110,0): 128, 60, 49, + (129,111,0): 128, 60, 51, + (129,112,0): 125, 58, 50, + (129,113,0): 125, 58, 50, + (129,114,0): 122, 58, 49, + (129,115,0): 122, 58, 49, + (129,116,0): 121, 57, 48, + (129,117,0): 120, 56, 47, + (129,118,0): 118, 55, 46, + (129,119,0): 118, 55, 46, + (129,120,0): 117, 54, 45, + (129,121,0): 118, 55, 46, + (129,122,0): 116, 56, 46, + (129,123,0): 116, 56, 46, + (129,124,0): 116, 56, 46, + (129,125,0): 114, 54, 44, + (129,126,0): 111, 53, 42, + (129,127,0): 109, 52, 43, + (129,128,0): 108, 55, 47, + (129,129,0): 105, 56, 49, + (129,130,0): 106, 56, 49, + (129,131,0): 104, 55, 48, + (129,132,0): 105, 55, 48, + (129,133,0): 104, 55, 48, + (129,134,0): 103, 54, 47, + (129,135,0): 103, 54, 47, + (129,136,0): 101, 51, 44, + (129,137,0): 101, 51, 44, + (129,138,0): 103, 53, 46, + (129,139,0): 104, 54, 47, + (129,140,0): 106, 56, 49, + (129,141,0): 106, 56, 49, + (129,142,0): 106, 56, 49, + (129,143,0): 107, 57, 50, + (129,144,0): 107, 54, 48, + (129,145,0): 108, 55, 49, + (129,146,0): 107, 57, 48, + (129,147,0): 107, 59, 49, + (129,148,0): 107, 59, 47, + (129,149,0): 106, 62, 49, + (129,150,0): 106, 64, 48, + (129,151,0): 105, 68, 50, + (129,152,0): 103, 72, 54, + (129,153,0): 107, 80, 61, + (129,154,0): 103, 82, 65, + (129,155,0): 117, 102, 83, + (129,156,0): 129, 117, 101, + (129,157,0): 140, 133, 115, + (129,158,0): 134, 131, 114, + (129,159,0): 75, 76, 60, + (129,160,0): 54, 57, 46, + (129,161,0): 51, 57, 47, + (129,162,0): 51, 57, 47, + (129,163,0): 51, 57, 47, + (129,164,0): 50, 56, 46, + (129,165,0): 50, 56, 46, + (129,166,0): 50, 56, 46, + (129,167,0): 49, 55, 45, + (129,168,0): 49, 55, 45, + (129,169,0): 49, 55, 45, + (129,170,0): 49, 55, 45, + (129,171,0): 48, 54, 44, + (129,172,0): 48, 54, 44, + (129,173,0): 47, 53, 43, + (129,174,0): 47, 53, 43, + (129,175,0): 47, 53, 43, + (129,176,0): 47, 52, 46, + (129,177,0): 47, 52, 46, + (129,178,0): 47, 52, 46, + (129,179,0): 47, 52, 46, + (129,180,0): 47, 52, 46, + (129,181,0): 47, 52, 46, + (129,182,0): 47, 52, 46, + (129,183,0): 47, 52, 46, + (129,184,0): 48, 53, 47, + (129,185,0): 47, 52, 46, + (129,186,0): 46, 51, 45, + (129,187,0): 46, 51, 45, + (129,188,0): 46, 51, 45, + (129,189,0): 46, 51, 45, + (129,190,0): 47, 52, 46, + (129,191,0): 47, 54, 47, + (129,192,0): 46, 56, 48, + (129,193,0): 47, 58, 50, + (129,194,0): 49, 61, 51, + (129,195,0): 52, 64, 54, + (129,196,0): 54, 66, 54, + (129,197,0): 54, 66, 54, + (129,198,0): 54, 66, 52, + (129,199,0): 53, 66, 49, + (129,200,0): 54, 67, 49, + (129,201,0): 67, 80, 62, + (129,202,0): 80, 93, 73, + (129,203,0): 82, 96, 73, + (129,204,0): 73, 87, 64, + (129,205,0): 65, 79, 54, + (129,206,0): 66, 80, 55, + (129,207,0): 69, 85, 58, + (129,208,0): 74, 98, 64, + (129,209,0): 74, 100, 63, + (129,210,0): 75, 101, 64, + (129,211,0): 75, 101, 62, + (129,212,0): 73, 99, 60, + (129,213,0): 72, 99, 58, + (129,214,0): 73, 100, 59, + (129,215,0): 74, 101, 60, + (129,216,0): 83, 110, 69, + (129,217,0): 88, 114, 75, + (129,218,0): 92, 118, 81, + (129,219,0): 93, 119, 84, + (129,220,0): 91, 116, 84, + (129,221,0): 84, 109, 79, + (129,222,0): 67, 92, 62, + (129,223,0): 54, 73, 53, + (129,224,0): 38, 49, 45, + (129,225,0): 39, 44, 48, + (129,226,0): 37, 42, 46, + (130,0,0): 104, 101, 86, + (130,1,0): 104, 101, 86, + (130,2,0): 104, 101, 86, + (130,3,0): 104, 101, 86, + (130,4,0): 104, 101, 86, + (130,5,0): 104, 101, 86, + (130,6,0): 104, 101, 86, + (130,7,0): 104, 101, 86, + (130,8,0): 104, 101, 86, + (130,9,0): 104, 101, 86, + (130,10,0): 104, 101, 86, + (130,11,0): 104, 101, 86, + (130,12,0): 104, 101, 86, + (130,13,0): 104, 101, 86, + (130,14,0): 104, 101, 86, + (130,15,0): 104, 101, 86, + (130,16,0): 104, 101, 86, + (130,17,0): 104, 101, 86, + (130,18,0): 106, 99, 89, + (130,19,0): 107, 100, 90, + (130,20,0): 108, 99, 92, + (130,21,0): 109, 100, 91, + (130,22,0): 109, 101, 90, + (130,23,0): 109, 102, 86, + (130,24,0): 109, 104, 85, + (130,25,0): 107, 105, 84, + (130,26,0): 109, 106, 87, + (130,27,0): 106, 107, 91, + (130,28,0): 107, 107, 99, + (130,29,0): 119, 119, 119, + (130,30,0): 145, 146, 151, + (130,31,0): 167, 172, 178, + (130,32,0): 190, 197, 203, + (130,33,0): 209, 219, 221, + (130,34,0): 235, 240, 243, + (130,35,0): 246, 251, 254, + (130,36,0): 253, 254, 255, + (130,37,0): 254, 255, 255, + (130,38,0): 255, 254, 255, + (130,39,0): 255, 253, 254, + (130,40,0): 254, 253, 251, + (130,41,0): 255, 254, 250, + (130,42,0): 255, 255, 250, + (130,43,0): 253, 254, 248, + (130,44,0): 250, 251, 243, + (130,45,0): 245, 248, 239, + (130,46,0): 241, 247, 235, + (130,47,0): 241, 247, 235, + (130,48,0): 244, 247, 236, + (130,49,0): 245, 249, 235, + (130,50,0): 246, 248, 234, + (130,51,0): 245, 248, 229, + (130,52,0): 245, 247, 225, + (130,53,0): 238, 238, 212, + (130,54,0): 219, 219, 191, + (130,55,0): 201, 202, 171, + (130,56,0): 176, 177, 146, + (130,57,0): 147, 150, 121, + (130,58,0): 117, 121, 96, + (130,59,0): 107, 112, 90, + (130,60,0): 116, 123, 105, + (130,61,0): 136, 144, 129, + (130,62,0): 159, 167, 156, + (130,63,0): 174, 181, 173, + (130,64,0): 205, 207, 202, + (130,65,0): 222, 222, 220, + (130,66,0): 239, 239, 237, + (130,67,0): 248, 248, 246, + (130,68,0): 251, 251, 249, + (130,69,0): 254, 254, 252, + (130,70,0): 254, 254, 252, + (130,71,0): 253, 253, 251, + (130,72,0): 254, 254, 252, + (130,73,0): 254, 254, 252, + (130,74,0): 254, 254, 252, + (130,75,0): 254, 254, 252, + (130,76,0): 254, 254, 252, + (130,77,0): 254, 254, 252, + (130,78,0): 254, 254, 252, + (130,79,0): 253, 255, 254, + (130,80,0): 245, 250, 253, + (130,81,0): 251, 255, 255, + (130,82,0): 254, 254, 254, + (130,83,0): 255, 248, 246, + (130,84,0): 255, 250, 244, + (130,85,0): 255, 245, 235, + (130,86,0): 248, 204, 193, + (130,87,0): 215, 157, 143, + (130,88,0): 147, 75, 60, + (130,89,0): 164, 81, 65, + (130,90,0): 168, 75, 58, + (130,91,0): 167, 64, 49, + (130,92,0): 183, 71, 59, + (130,93,0): 207, 89, 77, + (130,94,0): 206, 84, 73, + (130,95,0): 189, 63, 51, + (130,96,0): 196, 68, 55, + (130,97,0): 198, 72, 58, + (130,98,0): 195, 75, 61, + (130,99,0): 185, 73, 59, + (130,100,0): 170, 66, 55, + (130,101,0): 157, 63, 51, + (130,102,0): 149, 65, 55, + (130,103,0): 144, 70, 59, + (130,104,0): 134, 66, 57, + (130,105,0): 129, 66, 57, + (130,106,0): 126, 66, 56, + (130,107,0): 123, 65, 54, + (130,108,0): 122, 64, 53, + (130,109,0): 122, 62, 52, + (130,110,0): 122, 62, 52, + (130,111,0): 122, 62, 52, + (130,112,0): 120, 60, 52, + (130,113,0): 120, 60, 52, + (130,114,0): 119, 59, 51, + (130,115,0): 119, 59, 51, + (130,116,0): 117, 58, 50, + (130,117,0): 116, 57, 49, + (130,118,0): 116, 57, 49, + (130,119,0): 116, 57, 49, + (130,120,0): 114, 57, 48, + (130,121,0): 114, 57, 48, + (130,122,0): 114, 57, 48, + (130,123,0): 114, 57, 48, + (130,124,0): 111, 57, 47, + (130,125,0): 110, 56, 46, + (130,126,0): 108, 54, 44, + (130,127,0): 107, 53, 43, + (130,128,0): 108, 55, 47, + (130,129,0): 106, 56, 49, + (130,130,0): 108, 55, 49, + (130,131,0): 106, 56, 49, + (130,132,0): 107, 54, 48, + (130,133,0): 105, 55, 48, + (130,134,0): 105, 55, 48, + (130,135,0): 104, 54, 47, + (130,136,0): 103, 53, 46, + (130,137,0): 103, 53, 46, + (130,138,0): 102, 53, 46, + (130,139,0): 103, 54, 47, + (130,140,0): 104, 55, 48, + (130,141,0): 105, 56, 49, + (130,142,0): 107, 58, 51, + (130,143,0): 107, 58, 51, + (130,144,0): 108, 59, 52, + (130,145,0): 106, 59, 51, + (130,146,0): 105, 58, 48, + (130,147,0): 104, 60, 49, + (130,148,0): 107, 63, 50, + (130,149,0): 106, 67, 52, + (130,150,0): 105, 68, 50, + (130,151,0): 102, 69, 50, + (130,152,0): 102, 73, 55, + (130,153,0): 108, 86, 65, + (130,154,0): 106, 89, 71, + (130,155,0): 117, 106, 86, + (130,156,0): 134, 127, 109, + (130,157,0): 145, 142, 123, + (130,158,0): 128, 127, 109, + (130,159,0): 69, 70, 54, + (130,160,0): 53, 56, 45, + (130,161,0): 50, 56, 46, + (130,162,0): 50, 56, 46, + (130,163,0): 50, 56, 46, + (130,164,0): 49, 55, 45, + (130,165,0): 49, 55, 45, + (130,166,0): 49, 55, 45, + (130,167,0): 48, 54, 44, + (130,168,0): 49, 55, 45, + (130,169,0): 49, 55, 45, + (130,170,0): 49, 55, 45, + (130,171,0): 48, 54, 44, + (130,172,0): 48, 54, 44, + (130,173,0): 47, 53, 43, + (130,174,0): 47, 53, 43, + (130,175,0): 47, 53, 43, + (130,176,0): 47, 52, 46, + (130,177,0): 47, 52, 46, + (130,178,0): 47, 52, 46, + (130,179,0): 47, 52, 46, + (130,180,0): 47, 52, 46, + (130,181,0): 47, 52, 46, + (130,182,0): 47, 52, 46, + (130,183,0): 47, 52, 46, + (130,184,0): 47, 52, 46, + (130,185,0): 47, 52, 46, + (130,186,0): 46, 51, 45, + (130,187,0): 45, 50, 44, + (130,188,0): 45, 50, 44, + (130,189,0): 46, 51, 45, + (130,190,0): 47, 52, 46, + (130,191,0): 46, 53, 46, + (130,192,0): 43, 53, 45, + (130,193,0): 43, 54, 46, + (130,194,0): 45, 57, 47, + (130,195,0): 47, 59, 49, + (130,196,0): 50, 62, 50, + (130,197,0): 52, 64, 52, + (130,198,0): 54, 66, 52, + (130,199,0): 55, 68, 51, + (130,200,0): 56, 69, 51, + (130,201,0): 63, 76, 58, + (130,202,0): 69, 82, 62, + (130,203,0): 67, 81, 58, + (130,204,0): 59, 73, 50, + (130,205,0): 56, 70, 45, + (130,206,0): 62, 76, 51, + (130,207,0): 68, 84, 57, + (130,208,0): 74, 95, 64, + (130,209,0): 74, 98, 64, + (130,210,0): 76, 100, 66, + (130,211,0): 75, 99, 63, + (130,212,0): 73, 97, 61, + (130,213,0): 71, 96, 57, + (130,214,0): 70, 95, 56, + (130,215,0): 71, 96, 57, + (130,216,0): 82, 107, 68, + (130,217,0): 88, 112, 76, + (130,218,0): 93, 117, 83, + (130,219,0): 94, 118, 86, + (130,220,0): 90, 113, 84, + (130,221,0): 80, 103, 75, + (130,222,0): 61, 84, 56, + (130,223,0): 46, 65, 46, + (130,224,0): 38, 49, 45, + (130,225,0): 39, 44, 48, + (130,226,0): 37, 42, 46, + (131,0,0): 104, 101, 86, + (131,1,0): 104, 101, 86, + (131,2,0): 104, 101, 86, + (131,3,0): 104, 101, 86, + (131,4,0): 104, 101, 86, + (131,5,0): 104, 101, 86, + (131,6,0): 104, 101, 86, + (131,7,0): 104, 101, 86, + (131,8,0): 104, 101, 86, + (131,9,0): 104, 101, 86, + (131,10,0): 104, 101, 86, + (131,11,0): 104, 101, 86, + (131,12,0): 104, 101, 86, + (131,13,0): 104, 101, 86, + (131,14,0): 104, 101, 86, + (131,15,0): 104, 101, 86, + (131,16,0): 104, 101, 86, + (131,17,0): 104, 101, 86, + (131,18,0): 106, 99, 89, + (131,19,0): 107, 100, 90, + (131,20,0): 108, 99, 92, + (131,21,0): 109, 100, 91, + (131,22,0): 109, 101, 90, + (131,23,0): 109, 102, 86, + (131,24,0): 110, 105, 86, + (131,25,0): 108, 106, 85, + (131,26,0): 108, 107, 87, + (131,27,0): 108, 109, 93, + (131,28,0): 112, 113, 105, + (131,29,0): 128, 130, 129, + (131,30,0): 158, 161, 166, + (131,31,0): 185, 190, 196, + (131,32,0): 195, 202, 208, + (131,33,0): 218, 228, 230, + (131,34,0): 244, 249, 252, + (131,35,0): 250, 255, 255, + (131,36,0): 251, 252, 254, + (131,37,0): 251, 252, 254, + (131,38,0): 253, 251, 252, + (131,39,0): 251, 250, 248, + (131,40,0): 255, 254, 252, + (131,41,0): 255, 255, 251, + (131,42,0): 255, 254, 249, + (131,43,0): 251, 252, 244, + (131,44,0): 245, 246, 238, + (131,45,0): 238, 241, 230, + (131,46,0): 233, 239, 227, + (131,47,0): 231, 237, 223, + (131,48,0): 237, 241, 226, + (131,49,0): 240, 244, 229, + (131,50,0): 241, 244, 227, + (131,51,0): 241, 244, 223, + (131,52,0): 242, 241, 220, + (131,53,0): 234, 234, 208, + (131,54,0): 216, 216, 188, + (131,55,0): 199, 199, 171, + (131,56,0): 178, 177, 149, + (131,57,0): 161, 161, 137, + (131,58,0): 145, 147, 125, + (131,59,0): 144, 147, 128, + (131,60,0): 156, 158, 145, + (131,61,0): 170, 173, 162, + (131,62,0): 182, 187, 180, + (131,63,0): 192, 197, 191, + (131,64,0): 220, 220, 218, + (131,65,0): 233, 233, 231, + (131,66,0): 246, 246, 244, + (131,67,0): 251, 251, 249, + (131,68,0): 253, 253, 251, + (131,69,0): 255, 255, 253, + (131,70,0): 255, 255, 253, + (131,71,0): 253, 253, 251, + (131,72,0): 254, 254, 252, + (131,73,0): 254, 254, 252, + (131,74,0): 254, 254, 252, + (131,75,0): 254, 254, 252, + (131,76,0): 254, 254, 252, + (131,77,0): 254, 254, 252, + (131,78,0): 254, 254, 252, + (131,79,0): 254, 254, 254, + (131,80,0): 251, 251, 253, + (131,81,0): 255, 254, 255, + (131,82,0): 255, 254, 255, + (131,83,0): 245, 240, 237, + (131,84,0): 246, 237, 230, + (131,85,0): 255, 249, 240, + (131,86,0): 255, 250, 236, + (131,87,0): 255, 238, 222, + (131,88,0): 232, 191, 173, + (131,89,0): 183, 127, 110, + (131,90,0): 148, 79, 63, + (131,91,0): 163, 80, 64, + (131,92,0): 185, 89, 75, + (131,93,0): 184, 78, 64, + (131,94,0): 180, 68, 56, + (131,95,0): 190, 69, 58, + (131,96,0): 193, 65, 54, + (131,97,0): 198, 70, 59, + (131,98,0): 197, 73, 63, + (131,99,0): 188, 71, 61, + (131,100,0): 173, 64, 57, + (131,101,0): 161, 60, 52, + (131,102,0): 152, 62, 54, + (131,103,0): 149, 66, 60, + (131,104,0): 139, 64, 59, + (131,105,0): 133, 66, 60, + (131,106,0): 128, 65, 58, + (131,107,0): 124, 65, 59, + (131,108,0): 121, 64, 57, + (131,109,0): 119, 64, 57, + (131,110,0): 117, 64, 56, + (131,111,0): 118, 63, 56, + (131,112,0): 118, 61, 52, + (131,113,0): 118, 61, 52, + (131,114,0): 118, 61, 52, + (131,115,0): 117, 60, 51, + (131,116,0): 115, 61, 51, + (131,117,0): 114, 60, 50, + (131,118,0): 114, 60, 50, + (131,119,0): 113, 59, 49, + (131,120,0): 111, 59, 48, + (131,121,0): 111, 59, 48, + (131,122,0): 111, 59, 48, + (131,123,0): 110, 58, 47, + (131,124,0): 107, 57, 46, + (131,125,0): 106, 56, 45, + (131,126,0): 106, 56, 45, + (131,127,0): 105, 55, 46, + (131,128,0): 109, 56, 50, + (131,129,0): 110, 55, 50, + (131,130,0): 109, 54, 49, + (131,131,0): 108, 55, 49, + (131,132,0): 108, 55, 49, + (131,133,0): 107, 54, 48, + (131,134,0): 105, 55, 48, + (131,135,0): 105, 55, 48, + (131,136,0): 108, 58, 51, + (131,137,0): 106, 57, 50, + (131,138,0): 104, 55, 48, + (131,139,0): 102, 55, 47, + (131,140,0): 102, 55, 47, + (131,141,0): 102, 55, 47, + (131,142,0): 104, 57, 49, + (131,143,0): 102, 58, 49, + (131,144,0): 106, 63, 54, + (131,145,0): 102, 62, 52, + (131,146,0): 101, 61, 49, + (131,147,0): 102, 62, 50, + (131,148,0): 104, 67, 51, + (131,149,0): 105, 69, 53, + (131,150,0): 102, 71, 51, + (131,151,0): 99, 71, 50, + (131,152,0): 99, 74, 54, + (131,153,0): 104, 86, 64, + (131,154,0): 105, 92, 73, + (131,155,0): 115, 107, 86, + (131,156,0): 133, 130, 111, + (131,157,0): 143, 142, 122, + (131,158,0): 112, 113, 95, + (131,159,0): 57, 61, 44, + (131,160,0): 52, 55, 44, + (131,161,0): 50, 56, 46, + (131,162,0): 49, 55, 45, + (131,163,0): 49, 55, 45, + (131,164,0): 49, 55, 45, + (131,165,0): 48, 54, 44, + (131,166,0): 48, 54, 44, + (131,167,0): 48, 54, 44, + (131,168,0): 49, 55, 45, + (131,169,0): 49, 55, 45, + (131,170,0): 49, 55, 45, + (131,171,0): 48, 54, 44, + (131,172,0): 48, 54, 44, + (131,173,0): 47, 53, 43, + (131,174,0): 47, 53, 43, + (131,175,0): 47, 53, 43, + (131,176,0): 46, 51, 45, + (131,177,0): 46, 51, 45, + (131,178,0): 46, 51, 45, + (131,179,0): 46, 51, 45, + (131,180,0): 46, 51, 45, + (131,181,0): 46, 51, 45, + (131,182,0): 46, 51, 45, + (131,183,0): 46, 51, 45, + (131,184,0): 46, 51, 45, + (131,185,0): 46, 51, 45, + (131,186,0): 45, 50, 44, + (131,187,0): 45, 50, 44, + (131,188,0): 45, 50, 44, + (131,189,0): 45, 50, 44, + (131,190,0): 46, 51, 45, + (131,191,0): 45, 52, 45, + (131,192,0): 42, 52, 44, + (131,193,0): 41, 52, 44, + (131,194,0): 42, 54, 44, + (131,195,0): 43, 55, 45, + (131,196,0): 46, 58, 46, + (131,197,0): 49, 61, 49, + (131,198,0): 52, 64, 50, + (131,199,0): 53, 65, 51, + (131,200,0): 54, 67, 50, + (131,201,0): 58, 71, 53, + (131,202,0): 60, 73, 55, + (131,203,0): 56, 69, 49, + (131,204,0): 50, 63, 43, + (131,205,0): 50, 64, 41, + (131,206,0): 56, 70, 47, + (131,207,0): 62, 78, 52, + (131,208,0): 68, 88, 60, + (131,209,0): 69, 93, 61, + (131,210,0): 75, 96, 65, + (131,211,0): 74, 98, 64, + (131,212,0): 75, 96, 63, + (131,213,0): 71, 95, 59, + (131,214,0): 72, 94, 58, + (131,215,0): 70, 94, 58, + (131,216,0): 83, 105, 69, + (131,217,0): 88, 112, 78, + (131,218,0): 96, 117, 86, + (131,219,0): 94, 117, 88, + (131,220,0): 90, 110, 83, + (131,221,0): 76, 99, 73, + (131,222,0): 57, 77, 52, + (131,223,0): 41, 58, 40, + (131,224,0): 38, 47, 44, + (131,225,0): 37, 42, 46, + (131,226,0): 35, 40, 44, + (132,0,0): 104, 101, 86, + (132,1,0): 104, 101, 86, + (132,2,0): 104, 101, 86, + (132,3,0): 104, 101, 86, + (132,4,0): 104, 101, 86, + (132,5,0): 104, 101, 86, + (132,6,0): 104, 101, 86, + (132,7,0): 104, 101, 86, + (132,8,0): 104, 101, 86, + (132,9,0): 104, 101, 86, + (132,10,0): 104, 101, 86, + (132,11,0): 104, 101, 86, + (132,12,0): 104, 101, 86, + (132,13,0): 104, 101, 86, + (132,14,0): 104, 101, 86, + (132,15,0): 104, 101, 86, + (132,16,0): 104, 101, 86, + (132,17,0): 104, 101, 86, + (132,18,0): 106, 99, 89, + (132,19,0): 107, 100, 90, + (132,20,0): 108, 99, 92, + (132,21,0): 109, 100, 91, + (132,22,0): 109, 101, 90, + (132,23,0): 109, 102, 86, + (132,24,0): 108, 103, 84, + (132,25,0): 107, 105, 84, + (132,26,0): 110, 109, 89, + (132,27,0): 111, 112, 96, + (132,28,0): 116, 117, 109, + (132,29,0): 133, 135, 134, + (132,30,0): 164, 167, 172, + (132,31,0): 191, 196, 202, + (132,32,0): 205, 212, 218, + (132,33,0): 229, 239, 241, + (132,34,0): 251, 255, 255, + (132,35,0): 251, 255, 255, + (132,36,0): 250, 251, 253, + (132,37,0): 252, 253, 255, + (132,38,0): 255, 253, 254, + (132,39,0): 253, 252, 250, + (132,40,0): 255, 255, 253, + (132,41,0): 255, 255, 251, + (132,42,0): 254, 253, 248, + (132,43,0): 247, 248, 240, + (132,44,0): 239, 240, 232, + (132,45,0): 231, 234, 223, + (132,46,0): 224, 230, 218, + (132,47,0): 222, 229, 213, + (132,48,0): 231, 235, 218, + (132,49,0): 234, 239, 219, + (132,50,0): 237, 240, 219, + (132,51,0): 236, 240, 217, + (132,52,0): 238, 238, 214, + (132,53,0): 232, 232, 208, + (132,54,0): 218, 216, 191, + (132,55,0): 204, 202, 177, + (132,56,0): 194, 189, 167, + (132,57,0): 183, 181, 160, + (132,58,0): 177, 174, 157, + (132,59,0): 182, 180, 167, + (132,60,0): 193, 190, 181, + (132,61,0): 201, 200, 195, + (132,62,0): 210, 211, 206, + (132,63,0): 217, 217, 215, + (132,64,0): 232, 232, 230, + (132,65,0): 242, 242, 240, + (132,66,0): 250, 250, 248, + (132,67,0): 252, 252, 250, + (132,68,0): 253, 253, 251, + (132,69,0): 255, 255, 253, + (132,70,0): 255, 255, 253, + (132,71,0): 252, 252, 250, + (132,72,0): 254, 254, 252, + (132,73,0): 254, 254, 252, + (132,74,0): 254, 254, 252, + (132,75,0): 254, 254, 252, + (132,76,0): 254, 254, 252, + (132,77,0): 254, 254, 252, + (132,78,0): 254, 254, 252, + (132,79,0): 255, 254, 252, + (132,80,0): 255, 251, 254, + (132,81,0): 255, 247, 250, + (132,82,0): 250, 246, 245, + (132,83,0): 248, 247, 243, + (132,84,0): 252, 255, 248, + (132,85,0): 254, 255, 248, + (132,86,0): 254, 255, 244, + (132,87,0): 253, 252, 234, + (132,88,0): 255, 254, 236, + (132,89,0): 245, 220, 200, + (132,90,0): 196, 155, 137, + (132,91,0): 157, 98, 80, + (132,92,0): 151, 75, 59, + (132,93,0): 165, 76, 60, + (132,94,0): 180, 80, 64, + (132,95,0): 186, 74, 60, + (132,96,0): 189, 65, 55, + (132,97,0): 196, 68, 59, + (132,98,0): 195, 71, 63, + (132,99,0): 188, 69, 61, + (132,100,0): 176, 63, 59, + (132,101,0): 166, 58, 55, + (132,102,0): 157, 59, 56, + (132,103,0): 152, 63, 59, + (132,104,0): 143, 62, 59, + (132,105,0): 137, 63, 60, + (132,106,0): 130, 65, 61, + (132,107,0): 124, 65, 61, + (132,108,0): 119, 66, 60, + (132,109,0): 115, 66, 59, + (132,110,0): 114, 67, 59, + (132,111,0): 115, 66, 59, + (132,112,0): 113, 63, 54, + (132,113,0): 115, 62, 54, + (132,114,0): 115, 62, 54, + (132,115,0): 114, 61, 53, + (132,116,0): 114, 61, 53, + (132,117,0): 114, 61, 53, + (132,118,0): 112, 62, 53, + (132,119,0): 111, 61, 52, + (132,120,0): 110, 62, 52, + (132,121,0): 109, 61, 51, + (132,122,0): 108, 60, 50, + (132,123,0): 107, 59, 49, + (132,124,0): 106, 59, 49, + (132,125,0): 105, 58, 48, + (132,126,0): 105, 58, 48, + (132,127,0): 106, 58, 48, + (132,128,0): 110, 55, 50, + (132,129,0): 112, 54, 50, + (132,130,0): 112, 54, 50, + (132,131,0): 109, 54, 49, + (132,132,0): 109, 54, 49, + (132,133,0): 108, 55, 49, + (132,134,0): 105, 55, 48, + (132,135,0): 105, 55, 48, + (132,136,0): 108, 59, 52, + (132,137,0): 107, 58, 51, + (132,138,0): 104, 57, 49, + (132,139,0): 101, 57, 48, + (132,140,0): 101, 57, 48, + (132,141,0): 101, 57, 48, + (132,142,0): 101, 58, 49, + (132,143,0): 100, 60, 50, + (132,144,0): 102, 66, 54, + (132,145,0): 99, 65, 53, + (132,146,0): 99, 67, 52, + (132,147,0): 100, 68, 53, + (132,148,0): 100, 71, 53, + (132,149,0): 100, 73, 54, + (132,150,0): 98, 73, 51, + (132,151,0): 95, 73, 50, + (132,152,0): 94, 76, 54, + (132,153,0): 101, 86, 63, + (132,154,0): 106, 98, 77, + (132,155,0): 114, 109, 87, + (132,156,0): 132, 131, 111, + (132,157,0): 132, 135, 114, + (132,158,0): 91, 96, 76, + (132,159,0): 51, 58, 40, + (132,160,0): 50, 56, 44, + (132,161,0): 50, 56, 46, + (132,162,0): 49, 55, 45, + (132,163,0): 49, 55, 45, + (132,164,0): 49, 55, 45, + (132,165,0): 48, 54, 44, + (132,166,0): 48, 54, 44, + (132,167,0): 48, 54, 44, + (132,168,0): 49, 55, 45, + (132,169,0): 49, 55, 45, + (132,170,0): 49, 55, 45, + (132,171,0): 48, 54, 44, + (132,172,0): 48, 54, 44, + (132,173,0): 47, 53, 43, + (132,174,0): 47, 53, 43, + (132,175,0): 47, 53, 43, + (132,176,0): 46, 51, 45, + (132,177,0): 46, 51, 45, + (132,178,0): 46, 51, 45, + (132,179,0): 46, 51, 45, + (132,180,0): 46, 51, 45, + (132,181,0): 46, 51, 45, + (132,182,0): 46, 51, 45, + (132,183,0): 46, 51, 45, + (132,184,0): 45, 50, 44, + (132,185,0): 45, 50, 44, + (132,186,0): 44, 49, 43, + (132,187,0): 44, 49, 43, + (132,188,0): 44, 49, 43, + (132,189,0): 44, 49, 43, + (132,190,0): 45, 50, 44, + (132,191,0): 44, 51, 44, + (132,192,0): 44, 54, 46, + (132,193,0): 43, 53, 45, + (132,194,0): 42, 52, 43, + (132,195,0): 42, 52, 43, + (132,196,0): 43, 53, 44, + (132,197,0): 46, 56, 45, + (132,198,0): 48, 59, 45, + (132,199,0): 50, 61, 47, + (132,200,0): 50, 61, 45, + (132,201,0): 53, 64, 47, + (132,202,0): 54, 65, 48, + (132,203,0): 53, 65, 45, + (132,204,0): 49, 61, 41, + (132,205,0): 49, 61, 41, + (132,206,0): 53, 65, 45, + (132,207,0): 56, 70, 47, + (132,208,0): 61, 79, 53, + (132,209,0): 64, 84, 56, + (132,210,0): 70, 89, 61, + (132,211,0): 72, 92, 64, + (132,212,0): 74, 93, 63, + (132,213,0): 73, 94, 61, + (132,214,0): 75, 94, 62, + (132,215,0): 75, 96, 63, + (132,216,0): 84, 103, 71, + (132,217,0): 91, 112, 81, + (132,218,0): 99, 118, 90, + (132,219,0): 97, 117, 90, + (132,220,0): 89, 107, 83, + (132,221,0): 74, 93, 71, + (132,222,0): 54, 71, 52, + (132,223,0): 38, 52, 37, + (132,224,0): 36, 45, 42, + (132,225,0): 36, 41, 44, + (132,226,0): 34, 39, 42, + (133,0,0): 104, 101, 86, + (133,1,0): 104, 101, 86, + (133,2,0): 104, 101, 86, + (133,3,0): 104, 101, 86, + (133,4,0): 104, 101, 86, + (133,5,0): 104, 101, 86, + (133,6,0): 104, 101, 86, + (133,7,0): 104, 101, 86, + (133,8,0): 104, 101, 86, + (133,9,0): 104, 101, 86, + (133,10,0): 104, 101, 86, + (133,11,0): 104, 101, 86, + (133,12,0): 104, 101, 86, + (133,13,0): 104, 101, 86, + (133,14,0): 104, 101, 86, + (133,15,0): 104, 101, 86, + (133,16,0): 104, 101, 86, + (133,17,0): 104, 101, 86, + (133,18,0): 106, 99, 89, + (133,19,0): 107, 100, 90, + (133,20,0): 108, 99, 92, + (133,21,0): 109, 100, 91, + (133,22,0): 109, 101, 90, + (133,23,0): 108, 102, 86, + (133,24,0): 106, 103, 84, + (133,25,0): 107, 106, 85, + (133,26,0): 108, 110, 89, + (133,27,0): 111, 114, 97, + (133,28,0): 115, 118, 109, + (133,29,0): 129, 133, 132, + (133,30,0): 159, 164, 168, + (133,31,0): 184, 191, 199, + (133,32,0): 213, 222, 227, + (133,33,0): 236, 246, 248, + (133,34,0): 251, 255, 255, + (133,35,0): 251, 255, 255, + (133,36,0): 250, 251, 255, + (133,37,0): 253, 254, 255, + (133,38,0): 255, 254, 255, + (133,39,0): 253, 252, 250, + (133,40,0): 255, 255, 251, + (133,41,0): 255, 255, 250, + (133,42,0): 252, 252, 244, + (133,43,0): 243, 245, 234, + (133,44,0): 235, 237, 226, + (133,45,0): 227, 231, 217, + (133,46,0): 221, 227, 213, + (133,47,0): 220, 227, 209, + (133,48,0): 228, 233, 211, + (133,49,0): 231, 236, 213, + (133,50,0): 233, 237, 214, + (133,51,0): 234, 236, 212, + (133,52,0): 235, 235, 211, + (133,53,0): 232, 230, 207, + (133,54,0): 223, 218, 196, + (133,55,0): 211, 206, 184, + (133,56,0): 211, 206, 186, + (133,57,0): 204, 198, 182, + (133,58,0): 203, 195, 184, + (133,59,0): 208, 201, 193, + (133,60,0): 215, 210, 206, + (133,61,0): 224, 219, 216, + (133,62,0): 234, 230, 229, + (133,63,0): 240, 239, 237, + (133,64,0): 243, 242, 240, + (133,65,0): 249, 249, 247, + (133,66,0): 253, 253, 251, + (133,67,0): 253, 253, 251, + (133,68,0): 253, 253, 251, + (133,69,0): 255, 255, 253, + (133,70,0): 254, 254, 252, + (133,71,0): 252, 252, 250, + (133,72,0): 254, 254, 252, + (133,73,0): 254, 254, 252, + (133,74,0): 254, 254, 252, + (133,75,0): 254, 254, 252, + (133,76,0): 254, 254, 252, + (133,77,0): 254, 254, 252, + (133,78,0): 254, 254, 252, + (133,79,0): 255, 253, 252, + (133,80,0): 255, 252, 253, + (133,81,0): 255, 246, 247, + (133,82,0): 253, 249, 248, + (133,83,0): 254, 255, 253, + (133,84,0): 249, 255, 253, + (133,85,0): 246, 255, 250, + (133,86,0): 237, 255, 243, + (133,87,0): 240, 254, 239, + (133,88,0): 235, 242, 226, + (133,89,0): 255, 255, 237, + (133,90,0): 255, 236, 217, + (133,91,0): 204, 166, 147, + (133,92,0): 163, 106, 87, + (133,93,0): 161, 90, 70, + (133,94,0): 170, 87, 69, + (133,95,0): 173, 76, 59, + (133,96,0): 182, 70, 58, + (133,97,0): 188, 70, 60, + (133,98,0): 189, 70, 62, + (133,99,0): 185, 70, 63, + (133,100,0): 178, 66, 62, + (133,101,0): 169, 61, 58, + (133,102,0): 161, 59, 57, + (133,103,0): 153, 59, 57, + (133,104,0): 149, 61, 60, + (133,105,0): 142, 62, 61, + (133,106,0): 133, 63, 61, + (133,107,0): 125, 64, 59, + (133,108,0): 120, 65, 60, + (133,109,0): 115, 66, 59, + (133,110,0): 112, 68, 59, + (133,111,0): 112, 68, 59, + (133,112,0): 112, 63, 56, + (133,113,0): 113, 63, 54, + (133,114,0): 113, 63, 54, + (133,115,0): 113, 63, 54, + (133,116,0): 113, 63, 54, + (133,117,0): 112, 62, 53, + (133,118,0): 111, 63, 53, + (133,119,0): 111, 63, 53, + (133,120,0): 111, 64, 54, + (133,121,0): 110, 63, 53, + (133,122,0): 109, 62, 52, + (133,123,0): 107, 60, 50, + (133,124,0): 104, 60, 49, + (133,125,0): 104, 60, 49, + (133,126,0): 104, 60, 49, + (133,127,0): 108, 60, 50, + (133,128,0): 111, 56, 51, + (133,129,0): 113, 54, 50, + (133,130,0): 112, 54, 50, + (133,131,0): 112, 54, 50, + (133,132,0): 109, 54, 49, + (133,133,0): 108, 55, 49, + (133,134,0): 106, 56, 49, + (133,135,0): 105, 56, 49, + (133,136,0): 104, 55, 48, + (133,137,0): 103, 56, 48, + (133,138,0): 101, 57, 48, + (133,139,0): 101, 58, 49, + (133,140,0): 100, 60, 50, + (133,141,0): 101, 63, 52, + (133,142,0): 102, 64, 53, + (133,143,0): 100, 66, 54, + (133,144,0): 94, 66, 52, + (133,145,0): 97, 71, 56, + (133,146,0): 99, 76, 58, + (133,147,0): 100, 77, 59, + (133,148,0): 99, 77, 56, + (133,149,0): 96, 75, 54, + (133,150,0): 93, 75, 51, + (133,151,0): 93, 77, 52, + (133,152,0): 93, 81, 57, + (133,153,0): 98, 88, 63, + (133,154,0): 109, 104, 82, + (133,155,0): 115, 115, 91, + (133,156,0): 128, 131, 110, + (133,157,0): 118, 123, 101, + (133,158,0): 70, 79, 58, + (133,159,0): 52, 61, 42, + (133,160,0): 51, 57, 45, + (133,161,0): 50, 56, 46, + (133,162,0): 50, 56, 46, + (133,163,0): 50, 56, 46, + (133,164,0): 49, 55, 45, + (133,165,0): 49, 55, 45, + (133,166,0): 49, 55, 45, + (133,167,0): 48, 54, 44, + (133,168,0): 49, 55, 45, + (133,169,0): 49, 55, 45, + (133,170,0): 49, 55, 45, + (133,171,0): 48, 54, 44, + (133,172,0): 48, 54, 44, + (133,173,0): 47, 53, 43, + (133,174,0): 47, 53, 43, + (133,175,0): 47, 53, 43, + (133,176,0): 45, 50, 44, + (133,177,0): 45, 50, 44, + (133,178,0): 45, 50, 44, + (133,179,0): 45, 50, 44, + (133,180,0): 45, 50, 44, + (133,181,0): 45, 50, 44, + (133,182,0): 45, 50, 44, + (133,183,0): 45, 50, 44, + (133,184,0): 45, 50, 44, + (133,185,0): 44, 49, 43, + (133,186,0): 43, 48, 42, + (133,187,0): 43, 48, 42, + (133,188,0): 43, 48, 42, + (133,189,0): 43, 48, 42, + (133,190,0): 44, 49, 43, + (133,191,0): 44, 51, 44, + (133,192,0): 46, 53, 46, + (133,193,0): 44, 54, 46, + (133,194,0): 42, 52, 43, + (133,195,0): 42, 52, 43, + (133,196,0): 42, 52, 43, + (133,197,0): 43, 53, 44, + (133,198,0): 45, 55, 44, + (133,199,0): 46, 57, 43, + (133,200,0): 45, 56, 42, + (133,201,0): 48, 59, 43, + (133,202,0): 52, 63, 47, + (133,203,0): 53, 64, 47, + (133,204,0): 52, 63, 46, + (133,205,0): 51, 63, 43, + (133,206,0): 51, 62, 45, + (133,207,0): 51, 64, 44, + (133,208,0): 55, 70, 47, + (133,209,0): 57, 75, 51, + (133,210,0): 64, 79, 56, + (133,211,0): 66, 84, 58, + (133,212,0): 71, 87, 60, + (133,213,0): 72, 91, 63, + (133,214,0): 77, 93, 66, + (133,215,0): 77, 96, 68, + (133,216,0): 85, 101, 74, + (133,217,0): 92, 111, 83, + (133,218,0): 100, 116, 90, + (133,219,0): 96, 114, 90, + (133,220,0): 88, 103, 82, + (133,221,0): 71, 88, 69, + (133,222,0): 52, 66, 49, + (133,223,0): 36, 50, 37, + (133,224,0): 36, 45, 42, + (133,225,0): 36, 41, 44, + (133,226,0): 34, 39, 42, + (134,0,0): 104, 101, 86, + (134,1,0): 104, 101, 86, + (134,2,0): 104, 101, 86, + (134,3,0): 104, 101, 86, + (134,4,0): 104, 101, 86, + (134,5,0): 104, 101, 86, + (134,6,0): 104, 101, 86, + (134,7,0): 104, 101, 86, + (134,8,0): 104, 101, 86, + (134,9,0): 104, 101, 86, + (134,10,0): 104, 101, 86, + (134,11,0): 104, 101, 86, + (134,12,0): 104, 101, 86, + (134,13,0): 104, 101, 86, + (134,14,0): 104, 101, 86, + (134,15,0): 104, 101, 86, + (134,16,0): 106, 100, 86, + (134,17,0): 106, 100, 86, + (134,18,0): 106, 99, 89, + (134,19,0): 107, 100, 90, + (134,20,0): 108, 99, 92, + (134,21,0): 109, 100, 91, + (134,22,0): 108, 102, 90, + (134,23,0): 108, 102, 86, + (134,24,0): 108, 105, 86, + (134,25,0): 108, 107, 86, + (134,26,0): 107, 109, 88, + (134,27,0): 107, 110, 93, + (134,28,0): 108, 114, 104, + (134,29,0): 121, 127, 125, + (134,30,0): 149, 157, 160, + (134,31,0): 174, 183, 190, + (134,32,0): 209, 218, 223, + (134,33,0): 233, 242, 247, + (134,34,0): 251, 255, 255, + (134,35,0): 248, 253, 255, + (134,36,0): 248, 249, 253, + (134,37,0): 254, 255, 255, + (134,38,0): 255, 254, 255, + (134,39,0): 249, 248, 246, + (134,40,0): 255, 255, 251, + (134,41,0): 254, 253, 248, + (134,42,0): 249, 249, 241, + (134,43,0): 241, 243, 232, + (134,44,0): 233, 235, 222, + (134,45,0): 227, 231, 216, + (134,46,0): 223, 230, 214, + (134,47,0): 224, 232, 211, + (134,48,0): 228, 233, 210, + (134,49,0): 231, 237, 211, + (134,50,0): 232, 236, 211, + (134,51,0): 231, 233, 209, + (134,52,0): 232, 232, 208, + (134,53,0): 231, 229, 206, + (134,54,0): 224, 219, 199, + (134,55,0): 215, 208, 190, + (134,56,0): 218, 211, 195, + (134,57,0): 217, 209, 198, + (134,58,0): 222, 212, 203, + (134,59,0): 230, 221, 216, + (134,60,0): 238, 228, 227, + (134,61,0): 243, 233, 234, + (134,62,0): 250, 241, 244, + (134,63,0): 255, 249, 251, + (134,64,0): 250, 249, 247, + (134,65,0): 254, 254, 252, + (134,66,0): 255, 255, 253, + (134,67,0): 253, 253, 251, + (134,68,0): 253, 253, 251, + (134,69,0): 255, 255, 253, + (134,70,0): 255, 255, 253, + (134,71,0): 252, 252, 250, + (134,72,0): 254, 254, 252, + (134,73,0): 254, 254, 252, + (134,74,0): 254, 254, 252, + (134,75,0): 254, 254, 252, + (134,76,0): 254, 254, 252, + (134,77,0): 254, 254, 252, + (134,78,0): 254, 254, 252, + (134,79,0): 255, 253, 252, + (134,80,0): 255, 250, 249, + (134,81,0): 255, 251, 250, + (134,82,0): 255, 254, 253, + (134,83,0): 252, 255, 253, + (134,84,0): 245, 255, 252, + (134,85,0): 234, 251, 245, + (134,86,0): 234, 255, 248, + (134,87,0): 242, 255, 253, + (134,88,0): 245, 255, 250, + (134,89,0): 239, 245, 231, + (134,90,0): 255, 250, 234, + (134,91,0): 255, 250, 232, + (134,92,0): 242, 204, 185, + (134,93,0): 171, 119, 98, + (134,94,0): 143, 81, 58, + (134,95,0): 170, 93, 73, + (134,96,0): 175, 80, 62, + (134,97,0): 179, 76, 61, + (134,98,0): 179, 75, 62, + (134,99,0): 179, 75, 64, + (134,100,0): 177, 73, 64, + (134,101,0): 172, 69, 62, + (134,102,0): 162, 63, 58, + (134,103,0): 154, 59, 55, + (134,104,0): 150, 61, 57, + (134,105,0): 143, 62, 58, + (134,106,0): 136, 63, 57, + (134,107,0): 129, 64, 58, + (134,108,0): 122, 65, 58, + (134,109,0): 117, 67, 58, + (134,110,0): 113, 69, 58, + (134,111,0): 113, 69, 60, + (134,112,0): 112, 63, 56, + (134,113,0): 113, 63, 56, + (134,114,0): 113, 63, 56, + (134,115,0): 113, 63, 56, + (134,116,0): 113, 63, 56, + (134,117,0): 113, 63, 56, + (134,118,0): 112, 63, 56, + (134,119,0): 112, 63, 56, + (134,120,0): 113, 66, 58, + (134,121,0): 112, 65, 57, + (134,122,0): 110, 63, 55, + (134,123,0): 108, 61, 53, + (134,124,0): 105, 61, 52, + (134,125,0): 106, 62, 53, + (134,126,0): 106, 62, 53, + (134,127,0): 110, 61, 54, + (134,128,0): 111, 56, 51, + (134,129,0): 114, 55, 51, + (134,130,0): 112, 54, 50, + (134,131,0): 112, 54, 50, + (134,132,0): 110, 55, 50, + (134,133,0): 108, 55, 49, + (134,134,0): 106, 56, 49, + (134,135,0): 105, 56, 49, + (134,136,0): 100, 56, 47, + (134,137,0): 100, 57, 48, + (134,138,0): 99, 59, 49, + (134,139,0): 100, 62, 51, + (134,140,0): 100, 64, 52, + (134,141,0): 99, 65, 53, + (134,142,0): 99, 65, 53, + (134,143,0): 95, 67, 53, + (134,144,0): 90, 69, 52, + (134,145,0): 95, 78, 60, + (134,146,0): 103, 86, 66, + (134,147,0): 104, 87, 67, + (134,148,0): 99, 83, 60, + (134,149,0): 94, 79, 56, + (134,150,0): 91, 79, 53, + (134,151,0): 92, 82, 55, + (134,152,0): 93, 86, 60, + (134,153,0): 93, 89, 62, + (134,154,0): 110, 108, 85, + (134,155,0): 116, 118, 94, + (134,156,0): 124, 129, 107, + (134,157,0): 99, 109, 85, + (134,158,0): 50, 62, 40, + (134,159,0): 54, 66, 46, + (134,160,0): 51, 59, 46, + (134,161,0): 51, 57, 47, + (134,162,0): 51, 57, 47, + (134,163,0): 51, 57, 47, + (134,164,0): 50, 56, 46, + (134,165,0): 50, 56, 46, + (134,166,0): 50, 56, 46, + (134,167,0): 49, 55, 45, + (134,168,0): 49, 55, 45, + (134,169,0): 49, 55, 45, + (134,170,0): 49, 55, 45, + (134,171,0): 48, 54, 44, + (134,172,0): 48, 54, 44, + (134,173,0): 47, 53, 43, + (134,174,0): 47, 53, 43, + (134,175,0): 47, 53, 43, + (134,176,0): 45, 50, 44, + (134,177,0): 45, 50, 44, + (134,178,0): 45, 50, 44, + (134,179,0): 45, 50, 44, + (134,180,0): 45, 50, 44, + (134,181,0): 45, 50, 44, + (134,182,0): 45, 50, 44, + (134,183,0): 45, 50, 44, + (134,184,0): 44, 49, 43, + (134,185,0): 44, 49, 43, + (134,186,0): 43, 48, 42, + (134,187,0): 42, 47, 41, + (134,188,0): 42, 47, 41, + (134,189,0): 43, 48, 42, + (134,190,0): 44, 49, 43, + (134,191,0): 43, 50, 43, + (134,192,0): 45, 52, 45, + (134,193,0): 43, 53, 45, + (134,194,0): 42, 52, 44, + (134,195,0): 42, 52, 44, + (134,196,0): 43, 53, 44, + (134,197,0): 43, 53, 44, + (134,198,0): 44, 54, 43, + (134,199,0): 45, 55, 44, + (134,200,0): 44, 54, 43, + (134,201,0): 47, 58, 44, + (134,202,0): 50, 61, 47, + (134,203,0): 54, 65, 49, + (134,204,0): 55, 66, 50, + (134,205,0): 55, 66, 49, + (134,206,0): 53, 64, 48, + (134,207,0): 52, 63, 46, + (134,208,0): 50, 63, 45, + (134,209,0): 52, 67, 46, + (134,210,0): 58, 71, 51, + (134,211,0): 61, 76, 53, + (134,212,0): 65, 79, 56, + (134,213,0): 68, 84, 58, + (134,214,0): 74, 88, 63, + (134,215,0): 76, 92, 66, + (134,216,0): 84, 98, 73, + (134,217,0): 92, 107, 84, + (134,218,0): 99, 113, 90, + (134,219,0): 94, 109, 88, + (134,220,0): 85, 98, 80, + (134,221,0): 68, 82, 65, + (134,222,0): 50, 62, 48, + (134,223,0): 35, 47, 37, + (134,224,0): 38, 47, 44, + (134,225,0): 38, 44, 44, + (134,226,0): 36, 42, 42, + (135,0,0): 104, 101, 86, + (135,1,0): 104, 101, 86, + (135,2,0): 104, 101, 86, + (135,3,0): 104, 101, 86, + (135,4,0): 104, 101, 86, + (135,5,0): 104, 101, 86, + (135,6,0): 104, 101, 86, + (135,7,0): 104, 101, 86, + (135,8,0): 104, 101, 86, + (135,9,0): 104, 101, 86, + (135,10,0): 104, 101, 86, + (135,11,0): 104, 101, 86, + (135,12,0): 104, 101, 86, + (135,13,0): 104, 101, 86, + (135,14,0): 104, 101, 86, + (135,15,0): 104, 101, 86, + (135,16,0): 106, 100, 86, + (135,17,0): 106, 100, 86, + (135,18,0): 106, 99, 89, + (135,19,0): 107, 100, 90, + (135,20,0): 108, 99, 92, + (135,21,0): 109, 100, 91, + (135,22,0): 108, 102, 90, + (135,23,0): 108, 102, 86, + (135,24,0): 111, 108, 89, + (135,25,0): 109, 108, 87, + (135,26,0): 106, 108, 87, + (135,27,0): 103, 107, 90, + (135,28,0): 102, 108, 98, + (135,29,0): 114, 123, 120, + (135,30,0): 142, 152, 154, + (135,31,0): 168, 177, 184, + (135,32,0): 201, 210, 215, + (135,33,0): 226, 235, 240, + (135,34,0): 247, 252, 255, + (135,35,0): 246, 251, 254, + (135,36,0): 249, 250, 254, + (135,37,0): 254, 255, 255, + (135,38,0): 255, 254, 255, + (135,39,0): 249, 248, 244, + (135,40,0): 255, 255, 250, + (135,41,0): 253, 253, 245, + (135,42,0): 248, 248, 238, + (135,43,0): 240, 242, 229, + (135,44,0): 233, 235, 221, + (135,45,0): 229, 233, 216, + (135,46,0): 227, 234, 216, + (135,47,0): 229, 237, 214, + (135,48,0): 230, 236, 210, + (135,49,0): 233, 237, 210, + (135,50,0): 234, 237, 210, + (135,51,0): 232, 232, 206, + (135,52,0): 232, 230, 207, + (135,53,0): 232, 227, 207, + (135,54,0): 225, 218, 200, + (135,55,0): 216, 208, 195, + (135,56,0): 216, 206, 196, + (135,57,0): 221, 210, 204, + (135,58,0): 234, 223, 219, + (135,59,0): 248, 237, 235, + (135,60,0): 255, 244, 246, + (135,61,0): 255, 245, 249, + (135,62,0): 255, 245, 251, + (135,63,0): 255, 249, 252, + (135,64,0): 254, 252, 253, + (135,65,0): 255, 255, 253, + (135,66,0): 255, 255, 253, + (135,67,0): 254, 254, 252, + (135,68,0): 254, 254, 252, + (135,69,0): 255, 255, 253, + (135,70,0): 255, 255, 253, + (135,71,0): 253, 253, 251, + (135,72,0): 254, 254, 252, + (135,73,0): 254, 254, 252, + (135,74,0): 254, 254, 252, + (135,75,0): 254, 254, 252, + (135,76,0): 254, 254, 252, + (135,77,0): 254, 254, 252, + (135,78,0): 254, 254, 252, + (135,79,0): 255, 254, 250, + (135,80,0): 255, 249, 247, + (135,81,0): 255, 249, 247, + (135,82,0): 251, 250, 248, + (135,83,0): 247, 251, 250, + (135,84,0): 245, 255, 254, + (135,85,0): 243, 255, 255, + (135,86,0): 240, 255, 255, + (135,87,0): 237, 253, 250, + (135,88,0): 240, 252, 248, + (135,89,0): 251, 255, 250, + (135,90,0): 255, 253, 241, + (135,91,0): 255, 242, 226, + (135,92,0): 255, 239, 219, + (135,93,0): 255, 225, 203, + (135,94,0): 216, 174, 150, + (135,95,0): 170, 114, 91, + (135,96,0): 164, 89, 68, + (135,97,0): 169, 84, 64, + (135,98,0): 168, 81, 62, + (135,99,0): 169, 82, 65, + (135,100,0): 173, 81, 66, + (135,101,0): 169, 77, 64, + (135,102,0): 161, 68, 60, + (135,103,0): 151, 61, 53, + (135,104,0): 149, 62, 55, + (135,105,0): 143, 63, 54, + (135,106,0): 137, 62, 56, + (135,107,0): 131, 64, 55, + (135,108,0): 125, 65, 55, + (135,109,0): 119, 67, 54, + (135,110,0): 116, 68, 56, + (135,111,0): 115, 69, 56, + (135,112,0): 113, 63, 56, + (135,113,0): 113, 63, 56, + (135,114,0): 115, 62, 56, + (135,115,0): 113, 63, 56, + (135,116,0): 113, 63, 56, + (135,117,0): 113, 63, 56, + (135,118,0): 113, 63, 56, + (135,119,0): 112, 63, 56, + (135,120,0): 115, 66, 59, + (135,121,0): 113, 66, 58, + (135,122,0): 111, 64, 56, + (135,123,0): 109, 62, 54, + (135,124,0): 108, 61, 53, + (135,125,0): 106, 62, 53, + (135,126,0): 109, 62, 54, + (135,127,0): 111, 62, 55, + (135,128,0): 111, 56, 51, + (135,129,0): 113, 55, 51, + (135,130,0): 111, 56, 51, + (135,131,0): 109, 56, 50, + (135,132,0): 109, 56, 50, + (135,133,0): 105, 56, 49, + (135,134,0): 104, 57, 49, + (135,135,0): 102, 58, 49, + (135,136,0): 102, 59, 50, + (135,137,0): 100, 62, 51, + (135,138,0): 100, 64, 52, + (135,139,0): 98, 66, 53, + (135,140,0): 96, 67, 53, + (135,141,0): 93, 65, 51, + (135,142,0): 92, 64, 50, + (135,143,0): 87, 66, 49, + (135,144,0): 84, 71, 52, + (135,145,0): 91, 83, 62, + (135,146,0): 102, 94, 71, + (135,147,0): 105, 94, 72, + (135,148,0): 98, 88, 63, + (135,149,0): 90, 83, 57, + (135,150,0): 90, 83, 55, + (135,151,0): 92, 87, 58, + (135,152,0): 90, 86, 59, + (135,153,0): 88, 87, 59, + (135,154,0): 107, 109, 85, + (135,155,0): 115, 119, 94, + (135,156,0): 117, 125, 102, + (135,157,0): 85, 97, 73, + (135,158,0): 38, 50, 28, + (135,159,0): 56, 68, 48, + (135,160,0): 51, 59, 46, + (135,161,0): 52, 58, 48, + (135,162,0): 52, 58, 48, + (135,163,0): 51, 57, 47, + (135,164,0): 51, 57, 47, + (135,165,0): 51, 57, 47, + (135,166,0): 50, 56, 46, + (135,167,0): 50, 56, 46, + (135,168,0): 49, 55, 45, + (135,169,0): 49, 55, 45, + (135,170,0): 49, 55, 45, + (135,171,0): 48, 54, 44, + (135,172,0): 48, 54, 44, + (135,173,0): 47, 53, 43, + (135,174,0): 47, 53, 43, + (135,175,0): 47, 53, 43, + (135,176,0): 45, 50, 44, + (135,177,0): 45, 50, 44, + (135,178,0): 45, 50, 44, + (135,179,0): 45, 50, 44, + (135,180,0): 45, 50, 44, + (135,181,0): 45, 50, 44, + (135,182,0): 45, 50, 44, + (135,183,0): 45, 50, 44, + (135,184,0): 44, 49, 43, + (135,185,0): 43, 48, 42, + (135,186,0): 43, 48, 42, + (135,187,0): 42, 47, 41, + (135,188,0): 42, 47, 41, + (135,189,0): 43, 48, 42, + (135,190,0): 43, 48, 42, + (135,191,0): 44, 49, 43, + (135,192,0): 43, 50, 43, + (135,193,0): 41, 51, 43, + (135,194,0): 42, 52, 44, + (135,195,0): 43, 53, 45, + (135,196,0): 43, 53, 44, + (135,197,0): 44, 54, 45, + (135,198,0): 45, 55, 46, + (135,199,0): 45, 55, 44, + (135,200,0): 44, 54, 43, + (135,201,0): 46, 56, 45, + (135,202,0): 50, 60, 49, + (135,203,0): 54, 65, 51, + (135,204,0): 57, 68, 54, + (135,205,0): 57, 68, 52, + (135,206,0): 55, 66, 52, + (135,207,0): 54, 65, 49, + (135,208,0): 48, 59, 43, + (135,209,0): 50, 63, 45, + (135,210,0): 53, 66, 48, + (135,211,0): 57, 70, 50, + (135,212,0): 60, 73, 53, + (135,213,0): 64, 78, 55, + (135,214,0): 70, 84, 61, + (135,215,0): 74, 88, 63, + (135,216,0): 82, 96, 73, + (135,217,0): 91, 104, 84, + (135,218,0): 97, 110, 90, + (135,219,0): 92, 105, 87, + (135,220,0): 81, 94, 77, + (135,221,0): 66, 78, 64, + (135,222,0): 47, 59, 47, + (135,223,0): 34, 44, 35, + (135,224,0): 42, 48, 44, + (135,225,0): 40, 46, 44, + (135,226,0): 38, 44, 44, + (136,0,0): 104, 101, 86, + (136,1,0): 104, 101, 86, + (136,2,0): 104, 101, 86, + (136,3,0): 104, 101, 86, + (136,4,0): 104, 101, 86, + (136,5,0): 104, 101, 86, + (136,6,0): 104, 101, 86, + (136,7,0): 104, 101, 86, + (136,8,0): 105, 102, 87, + (136,9,0): 105, 102, 87, + (136,10,0): 105, 102, 87, + (136,11,0): 105, 102, 87, + (136,12,0): 105, 102, 87, + (136,13,0): 105, 102, 87, + (136,14,0): 105, 102, 87, + (136,15,0): 105, 102, 87, + (136,16,0): 107, 101, 87, + (136,17,0): 107, 101, 87, + (136,18,0): 107, 100, 90, + (136,19,0): 108, 101, 91, + (136,20,0): 109, 100, 93, + (136,21,0): 110, 101, 92, + (136,22,0): 109, 103, 91, + (136,23,0): 109, 103, 87, + (136,24,0): 113, 110, 91, + (136,25,0): 107, 109, 87, + (136,26,0): 107, 110, 89, + (136,27,0): 107, 114, 96, + (136,28,0): 106, 114, 103, + (136,29,0): 112, 121, 118, + (136,30,0): 135, 145, 147, + (136,31,0): 159, 170, 176, + (136,32,0): 187, 196, 201, + (136,33,0): 208, 217, 222, + (136,34,0): 234, 239, 243, + (136,35,0): 246, 251, 254, + (136,36,0): 252, 253, 255, + (136,37,0): 254, 255, 255, + (136,38,0): 255, 254, 255, + (136,39,0): 254, 253, 249, + (136,40,0): 255, 255, 250, + (136,41,0): 254, 254, 246, + (136,42,0): 250, 250, 240, + (136,43,0): 246, 248, 235, + (136,44,0): 244, 246, 232, + (136,45,0): 240, 244, 227, + (136,46,0): 234, 241, 223, + (136,47,0): 231, 239, 216, + (136,48,0): 240, 246, 218, + (136,49,0): 237, 242, 212, + (136,50,0): 235, 238, 209, + (136,51,0): 236, 236, 210, + (136,52,0): 232, 230, 209, + (136,53,0): 225, 220, 201, + (136,54,0): 221, 213, 200, + (136,55,0): 222, 212, 202, + (136,56,0): 224, 211, 205, + (136,57,0): 231, 217, 216, + (136,58,0): 241, 227, 227, + (136,59,0): 249, 234, 237, + (136,60,0): 253, 241, 243, + (136,61,0): 255, 246, 250, + (136,62,0): 255, 248, 255, + (136,63,0): 255, 252, 255, + (136,64,0): 255, 253, 254, + (136,65,0): 254, 254, 252, + (136,66,0): 254, 254, 252, + (136,67,0): 254, 254, 252, + (136,68,0): 254, 254, 252, + (136,69,0): 254, 254, 252, + (136,70,0): 254, 254, 252, + (136,71,0): 254, 254, 252, + (136,72,0): 254, 254, 252, + (136,73,0): 254, 254, 252, + (136,74,0): 254, 254, 252, + (136,75,0): 254, 254, 252, + (136,76,0): 254, 254, 252, + (136,77,0): 254, 254, 252, + (136,78,0): 254, 254, 252, + (136,79,0): 254, 255, 250, + (136,80,0): 255, 254, 250, + (136,81,0): 255, 255, 251, + (136,82,0): 255, 255, 253, + (136,83,0): 254, 255, 255, + (136,84,0): 252, 255, 255, + (136,85,0): 250, 255, 255, + (136,86,0): 249, 254, 255, + (136,87,0): 249, 253, 255, + (136,88,0): 254, 255, 255, + (136,89,0): 254, 253, 251, + (136,90,0): 254, 249, 243, + (136,91,0): 255, 248, 238, + (136,92,0): 255, 249, 233, + (136,93,0): 255, 248, 226, + (136,94,0): 255, 241, 217, + (136,95,0): 255, 232, 207, + (136,96,0): 182, 132, 105, + (136,97,0): 162, 100, 75, + (136,98,0): 147, 83, 58, + (136,99,0): 155, 87, 64, + (136,100,0): 165, 93, 71, + (136,101,0): 160, 83, 65, + (136,102,0): 154, 75, 58, + (136,103,0): 155, 76, 61, + (136,104,0): 142, 63, 50, + (136,105,0): 141, 63, 50, + (136,106,0): 135, 63, 51, + (136,107,0): 128, 60, 47, + (136,108,0): 121, 59, 46, + (136,109,0): 116, 60, 45, + (136,110,0): 115, 63, 49, + (136,111,0): 115, 66, 52, + (136,112,0): 114, 61, 53, + (136,113,0): 114, 61, 55, + (136,114,0): 116, 61, 56, + (136,115,0): 115, 62, 56, + (136,116,0): 117, 64, 58, + (136,117,0): 117, 64, 58, + (136,118,0): 116, 63, 57, + (136,119,0): 113, 63, 56, + (136,120,0): 115, 65, 58, + (136,121,0): 113, 64, 57, + (136,122,0): 113, 64, 57, + (136,123,0): 113, 64, 57, + (136,124,0): 112, 63, 56, + (136,125,0): 110, 63, 55, + (136,126,0): 111, 62, 55, + (136,127,0): 111, 62, 55, + (136,128,0): 107, 57, 50, + (136,129,0): 109, 56, 50, + (136,130,0): 108, 58, 51, + (136,131,0): 108, 59, 52, + (136,132,0): 108, 59, 52, + (136,133,0): 104, 60, 51, + (136,134,0): 103, 60, 51, + (136,135,0): 99, 61, 50, + (136,136,0): 99, 63, 51, + (136,137,0): 94, 62, 49, + (136,138,0): 100, 71, 57, + (136,139,0): 99, 71, 57, + (136,140,0): 84, 61, 45, + (136,141,0): 78, 57, 40, + (136,142,0): 77, 56, 39, + (136,143,0): 64, 49, 30, + (136,144,0): 87, 81, 59, + (136,145,0): 80, 78, 55, + (136,146,0): 75, 73, 48, + (136,147,0): 79, 75, 50, + (136,148,0): 93, 89, 62, + (136,149,0): 105, 101, 74, + (136,150,0): 101, 97, 68, + (136,151,0): 86, 85, 55, + (136,152,0): 88, 88, 60, + (136,153,0): 93, 96, 67, + (136,154,0): 111, 115, 90, + (136,155,0): 122, 128, 102, + (136,156,0): 100, 108, 85, + (136,157,0): 61, 73, 49, + (136,158,0): 45, 57, 35, + (136,159,0): 50, 62, 42, + (136,160,0): 52, 60, 47, + (136,161,0): 53, 59, 49, + (136,162,0): 52, 58, 48, + (136,163,0): 52, 58, 48, + (136,164,0): 52, 58, 48, + (136,165,0): 51, 57, 47, + (136,166,0): 51, 57, 47, + (136,167,0): 51, 57, 47, + (136,168,0): 51, 57, 47, + (136,169,0): 51, 57, 47, + (136,170,0): 51, 57, 47, + (136,171,0): 50, 56, 46, + (136,172,0): 49, 55, 45, + (136,173,0): 49, 55, 45, + (136,174,0): 49, 55, 45, + (136,175,0): 48, 54, 44, + (136,176,0): 49, 54, 48, + (136,177,0): 49, 54, 48, + (136,178,0): 48, 53, 47, + (136,179,0): 48, 53, 47, + (136,180,0): 47, 52, 46, + (136,181,0): 47, 52, 46, + (136,182,0): 47, 52, 46, + (136,183,0): 47, 52, 46, + (136,184,0): 44, 49, 43, + (136,185,0): 44, 49, 43, + (136,186,0): 44, 49, 43, + (136,187,0): 44, 49, 43, + (136,188,0): 44, 49, 43, + (136,189,0): 44, 49, 43, + (136,190,0): 43, 48, 42, + (136,191,0): 43, 48, 42, + (136,192,0): 46, 53, 46, + (136,193,0): 45, 52, 45, + (136,194,0): 45, 52, 45, + (136,195,0): 44, 51, 44, + (136,196,0): 45, 52, 45, + (136,197,0): 45, 52, 44, + (136,198,0): 46, 53, 45, + (136,199,0): 46, 53, 45, + (136,200,0): 43, 50, 42, + (136,201,0): 45, 52, 44, + (136,202,0): 48, 55, 47, + (136,203,0): 53, 61, 50, + (136,204,0): 57, 65, 54, + (136,205,0): 61, 69, 56, + (136,206,0): 63, 71, 60, + (136,207,0): 63, 74, 60, + (136,208,0): 55, 66, 50, + (136,209,0): 53, 64, 47, + (136,210,0): 51, 62, 45, + (136,211,0): 49, 61, 41, + (136,212,0): 50, 62, 42, + (136,213,0): 57, 69, 47, + (136,214,0): 66, 78, 56, + (136,215,0): 73, 85, 63, + (136,216,0): 79, 91, 71, + (136,217,0): 86, 98, 78, + (136,218,0): 93, 104, 87, + (136,219,0): 89, 100, 84, + (136,220,0): 76, 87, 73, + (136,221,0): 60, 70, 59, + (136,222,0): 47, 57, 46, + (136,223,0): 41, 51, 42, + (136,224,0): 42, 48, 44, + (136,225,0): 41, 47, 43, + (136,226,0): 40, 46, 44, + (137,0,0): 104, 101, 86, + (137,1,0): 104, 101, 86, + (137,2,0): 104, 101, 86, + (137,3,0): 104, 101, 86, + (137,4,0): 104, 101, 86, + (137,5,0): 104, 101, 86, + (137,6,0): 104, 101, 86, + (137,7,0): 104, 101, 86, + (137,8,0): 105, 102, 87, + (137,9,0): 105, 102, 87, + (137,10,0): 105, 102, 87, + (137,11,0): 105, 102, 87, + (137,12,0): 105, 102, 87, + (137,13,0): 105, 102, 87, + (137,14,0): 105, 102, 87, + (137,15,0): 105, 102, 87, + (137,16,0): 107, 101, 87, + (137,17,0): 107, 101, 87, + (137,18,0): 107, 100, 90, + (137,19,0): 108, 101, 91, + (137,20,0): 109, 100, 93, + (137,21,0): 110, 101, 92, + (137,22,0): 109, 103, 91, + (137,23,0): 107, 104, 87, + (137,24,0): 111, 110, 90, + (137,25,0): 106, 108, 86, + (137,26,0): 107, 110, 89, + (137,27,0): 107, 114, 96, + (137,28,0): 106, 116, 105, + (137,29,0): 113, 124, 120, + (137,30,0): 137, 148, 150, + (137,31,0): 163, 174, 180, + (137,32,0): 190, 199, 204, + (137,33,0): 210, 219, 224, + (137,34,0): 235, 240, 244, + (137,35,0): 247, 252, 255, + (137,36,0): 253, 254, 255, + (137,37,0): 254, 255, 255, + (137,38,0): 255, 254, 252, + (137,39,0): 254, 253, 249, + (137,40,0): 255, 255, 250, + (137,41,0): 254, 254, 244, + (137,42,0): 251, 251, 239, + (137,43,0): 247, 249, 235, + (137,44,0): 244, 247, 230, + (137,45,0): 240, 245, 225, + (137,46,0): 234, 242, 221, + (137,47,0): 232, 237, 214, + (137,48,0): 234, 239, 209, + (137,49,0): 230, 235, 203, + (137,50,0): 228, 231, 202, + (137,51,0): 230, 230, 204, + (137,52,0): 227, 225, 204, + (137,53,0): 223, 217, 201, + (137,54,0): 222, 212, 202, + (137,55,0): 223, 212, 206, + (137,56,0): 230, 216, 215, + (137,57,0): 236, 222, 222, + (137,58,0): 245, 230, 233, + (137,59,0): 250, 238, 242, + (137,60,0): 255, 243, 247, + (137,61,0): 255, 246, 250, + (137,62,0): 255, 249, 253, + (137,63,0): 255, 251, 254, + (137,64,0): 255, 254, 252, + (137,65,0): 254, 254, 252, + (137,66,0): 254, 254, 252, + (137,67,0): 254, 254, 252, + (137,68,0): 254, 254, 252, + (137,69,0): 254, 254, 252, + (137,70,0): 254, 254, 252, + (137,71,0): 254, 254, 252, + (137,72,0): 254, 254, 252, + (137,73,0): 254, 254, 252, + (137,74,0): 254, 254, 252, + (137,75,0): 254, 254, 252, + (137,76,0): 254, 254, 252, + (137,77,0): 254, 254, 252, + (137,78,0): 254, 254, 252, + (137,79,0): 253, 255, 252, + (137,80,0): 250, 255, 249, + (137,81,0): 250, 255, 249, + (137,82,0): 253, 255, 252, + (137,83,0): 253, 254, 255, + (137,84,0): 253, 252, 255, + (137,85,0): 253, 250, 255, + (137,86,0): 255, 250, 255, + (137,87,0): 255, 248, 255, + (137,88,0): 255, 252, 255, + (137,89,0): 255, 250, 253, + (137,90,0): 255, 248, 246, + (137,91,0): 255, 249, 242, + (137,92,0): 255, 252, 239, + (137,93,0): 255, 252, 234, + (137,94,0): 254, 248, 226, + (137,95,0): 255, 241, 215, + (137,96,0): 255, 234, 206, + (137,97,0): 217, 178, 149, + (137,98,0): 163, 117, 91, + (137,99,0): 142, 92, 67, + (137,100,0): 146, 92, 66, + (137,101,0): 152, 92, 68, + (137,102,0): 152, 87, 67, + (137,103,0): 150, 83, 64, + (137,104,0): 138, 70, 51, + (137,105,0): 137, 68, 52, + (137,106,0): 135, 68, 51, + (137,107,0): 131, 68, 51, + (137,108,0): 126, 67, 51, + (137,109,0): 122, 66, 49, + (137,110,0): 118, 65, 49, + (137,111,0): 115, 63, 49, + (137,112,0): 117, 64, 56, + (137,113,0): 115, 62, 56, + (137,114,0): 117, 62, 57, + (137,115,0): 117, 64, 58, + (137,116,0): 116, 63, 57, + (137,117,0): 111, 61, 54, + (137,118,0): 112, 62, 55, + (137,119,0): 115, 65, 58, + (137,120,0): 113, 63, 56, + (137,121,0): 112, 63, 56, + (137,122,0): 112, 63, 56, + (137,123,0): 110, 63, 55, + (137,124,0): 111, 62, 55, + (137,125,0): 109, 62, 54, + (137,126,0): 110, 61, 54, + (137,127,0): 109, 62, 54, + (137,128,0): 107, 60, 52, + (137,129,0): 108, 61, 53, + (137,130,0): 109, 62, 54, + (137,131,0): 107, 63, 54, + (137,132,0): 106, 63, 54, + (137,133,0): 103, 65, 54, + (137,134,0): 101, 65, 53, + (137,135,0): 98, 66, 53, + (137,136,0): 100, 71, 57, + (137,137,0): 91, 65, 50, + (137,138,0): 94, 71, 55, + (137,139,0): 94, 73, 56, + (137,140,0): 78, 61, 43, + (137,141,0): 70, 55, 36, + (137,142,0): 71, 56, 37, + (137,143,0): 62, 54, 33, + (137,144,0): 76, 76, 52, + (137,145,0): 71, 75, 50, + (137,146,0): 68, 71, 44, + (137,147,0): 68, 68, 42, + (137,148,0): 77, 77, 49, + (137,149,0): 92, 91, 63, + (137,150,0): 98, 97, 67, + (137,151,0): 96, 97, 66, + (137,152,0): 89, 89, 61, + (137,153,0): 100, 103, 74, + (137,154,0): 115, 119, 94, + (137,155,0): 115, 121, 95, + (137,156,0): 88, 96, 73, + (137,157,0): 58, 68, 44, + (137,158,0): 47, 59, 37, + (137,159,0): 55, 67, 47, + (137,160,0): 54, 62, 49, + (137,161,0): 54, 60, 50, + (137,162,0): 54, 60, 50, + (137,163,0): 54, 60, 50, + (137,164,0): 53, 59, 49, + (137,165,0): 53, 59, 49, + (137,166,0): 53, 59, 49, + (137,167,0): 53, 59, 49, + (137,168,0): 53, 59, 49, + (137,169,0): 53, 59, 49, + (137,170,0): 53, 59, 49, + (137,171,0): 52, 58, 48, + (137,172,0): 52, 58, 48, + (137,173,0): 51, 57, 47, + (137,174,0): 51, 57, 47, + (137,175,0): 51, 57, 47, + (137,176,0): 50, 55, 49, + (137,177,0): 50, 55, 49, + (137,178,0): 50, 55, 49, + (137,179,0): 49, 54, 48, + (137,180,0): 49, 54, 48, + (137,181,0): 49, 54, 48, + (137,182,0): 48, 53, 47, + (137,183,0): 48, 53, 47, + (137,184,0): 46, 51, 45, + (137,185,0): 46, 51, 45, + (137,186,0): 45, 50, 44, + (137,187,0): 45, 50, 44, + (137,188,0): 44, 49, 43, + (137,189,0): 44, 49, 43, + (137,190,0): 43, 48, 42, + (137,191,0): 43, 48, 42, + (137,192,0): 42, 49, 42, + (137,193,0): 42, 49, 42, + (137,194,0): 41, 48, 41, + (137,195,0): 41, 48, 41, + (137,196,0): 41, 48, 41, + (137,197,0): 42, 49, 42, + (137,198,0): 43, 50, 42, + (137,199,0): 44, 51, 43, + (137,200,0): 46, 53, 45, + (137,201,0): 45, 52, 44, + (137,202,0): 46, 53, 45, + (137,203,0): 48, 55, 47, + (137,204,0): 52, 59, 51, + (137,205,0): 57, 65, 54, + (137,206,0): 63, 70, 62, + (137,207,0): 66, 74, 63, + (137,208,0): 59, 70, 56, + (137,209,0): 58, 69, 53, + (137,210,0): 55, 66, 49, + (137,211,0): 52, 63, 46, + (137,212,0): 51, 63, 43, + (137,213,0): 54, 66, 46, + (137,214,0): 60, 72, 50, + (137,215,0): 64, 76, 54, + (137,216,0): 76, 88, 68, + (137,217,0): 83, 95, 75, + (137,218,0): 89, 100, 84, + (137,219,0): 87, 98, 82, + (137,220,0): 76, 86, 75, + (137,221,0): 61, 71, 60, + (137,222,0): 49, 59, 50, + (137,223,0): 43, 53, 44, + (137,224,0): 44, 51, 44, + (137,225,0): 43, 49, 45, + (137,226,0): 42, 48, 44, + (138,0,0): 104, 101, 86, + (138,1,0): 104, 101, 86, + (138,2,0): 104, 101, 86, + (138,3,0): 104, 101, 86, + (138,4,0): 104, 101, 86, + (138,5,0): 104, 101, 86, + (138,6,0): 104, 101, 86, + (138,7,0): 104, 101, 86, + (138,8,0): 105, 102, 87, + (138,9,0): 105, 102, 87, + (138,10,0): 105, 102, 87, + (138,11,0): 105, 102, 87, + (138,12,0): 105, 102, 87, + (138,13,0): 105, 102, 87, + (138,14,0): 105, 102, 87, + (138,15,0): 105, 102, 87, + (138,16,0): 107, 101, 87, + (138,17,0): 107, 101, 87, + (138,18,0): 108, 99, 90, + (138,19,0): 109, 100, 91, + (138,20,0): 109, 100, 93, + (138,21,0): 110, 101, 92, + (138,22,0): 109, 103, 91, + (138,23,0): 107, 104, 87, + (138,24,0): 109, 108, 88, + (138,25,0): 105, 109, 86, + (138,26,0): 106, 111, 89, + (138,27,0): 107, 116, 97, + (138,28,0): 105, 117, 105, + (138,29,0): 113, 125, 121, + (138,30,0): 138, 152, 153, + (138,31,0): 165, 178, 184, + (138,32,0): 191, 202, 208, + (138,33,0): 212, 221, 226, + (138,34,0): 237, 242, 246, + (138,35,0): 247, 252, 255, + (138,36,0): 252, 253, 255, + (138,37,0): 253, 255, 254, + (138,38,0): 255, 254, 252, + (138,39,0): 254, 253, 248, + (138,40,0): 255, 255, 247, + (138,41,0): 253, 253, 243, + (138,42,0): 250, 251, 237, + (138,43,0): 247, 250, 233, + (138,44,0): 244, 247, 228, + (138,45,0): 239, 244, 222, + (138,46,0): 231, 239, 216, + (138,47,0): 229, 235, 209, + (138,48,0): 226, 231, 201, + (138,49,0): 222, 225, 194, + (138,50,0): 221, 221, 193, + (138,51,0): 222, 222, 198, + (138,52,0): 222, 219, 200, + (138,53,0): 221, 215, 203, + (138,54,0): 224, 213, 207, + (138,55,0): 228, 217, 215, + (138,56,0): 237, 225, 225, + (138,57,0): 242, 230, 234, + (138,58,0): 249, 237, 241, + (138,59,0): 254, 243, 247, + (138,60,0): 255, 246, 250, + (138,61,0): 255, 248, 251, + (138,62,0): 255, 249, 252, + (138,63,0): 255, 252, 252, + (138,64,0): 255, 254, 252, + (138,65,0): 254, 254, 252, + (138,66,0): 254, 254, 252, + (138,67,0): 254, 254, 252, + (138,68,0): 254, 254, 252, + (138,69,0): 254, 254, 252, + (138,70,0): 254, 254, 252, + (138,71,0): 254, 254, 252, + (138,72,0): 254, 254, 252, + (138,73,0): 254, 254, 252, + (138,74,0): 254, 254, 252, + (138,75,0): 254, 254, 252, + (138,76,0): 254, 254, 252, + (138,77,0): 254, 254, 252, + (138,78,0): 254, 254, 252, + (138,79,0): 253, 255, 252, + (138,80,0): 246, 255, 250, + (138,81,0): 246, 255, 250, + (138,82,0): 250, 254, 253, + (138,83,0): 253, 253, 253, + (138,84,0): 255, 250, 254, + (138,85,0): 255, 248, 255, + (138,86,0): 255, 246, 255, + (138,87,0): 255, 244, 254, + (138,88,0): 255, 249, 255, + (138,89,0): 255, 247, 252, + (138,90,0): 255, 247, 247, + (138,91,0): 255, 250, 245, + (138,92,0): 255, 255, 246, + (138,93,0): 255, 255, 242, + (138,94,0): 250, 253, 236, + (138,95,0): 250, 248, 227, + (138,96,0): 254, 240, 214, + (138,97,0): 255, 246, 219, + (138,98,0): 255, 235, 208, + (138,99,0): 223, 191, 166, + (138,100,0): 168, 131, 105, + (138,101,0): 132, 90, 66, + (138,102,0): 131, 83, 60, + (138,103,0): 145, 93, 71, + (138,104,0): 148, 93, 72, + (138,105,0): 139, 82, 62, + (138,106,0): 127, 70, 50, + (138,107,0): 118, 63, 42, + (138,108,0): 117, 62, 42, + (138,109,0): 118, 66, 45, + (138,110,0): 121, 70, 51, + (138,111,0): 120, 71, 54, + (138,112,0): 113, 63, 52, + (138,113,0): 110, 60, 51, + (138,114,0): 113, 60, 52, + (138,115,0): 116, 66, 57, + (138,116,0): 115, 65, 56, + (138,117,0): 111, 63, 53, + (138,118,0): 113, 65, 55, + (138,119,0): 120, 72, 62, + (138,120,0): 110, 62, 52, + (138,121,0): 109, 62, 52, + (138,122,0): 109, 62, 52, + (138,123,0): 107, 63, 52, + (138,124,0): 108, 61, 51, + (138,125,0): 106, 62, 51, + (138,126,0): 108, 61, 51, + (138,127,0): 106, 62, 51, + (138,128,0): 103, 63, 53, + (138,129,0): 103, 65, 54, + (138,130,0): 103, 65, 54, + (138,131,0): 103, 67, 55, + (138,132,0): 101, 67, 55, + (138,133,0): 99, 67, 54, + (138,134,0): 96, 67, 53, + (138,135,0): 94, 68, 53, + (138,136,0): 98, 75, 59, + (138,137,0): 85, 66, 49, + (138,138,0): 90, 73, 55, + (138,139,0): 96, 83, 64, + (138,140,0): 82, 71, 51, + (138,141,0): 67, 59, 38, + (138,142,0): 69, 61, 40, + (138,143,0): 70, 65, 43, + (138,144,0): 65, 69, 44, + (138,145,0): 66, 72, 46, + (138,146,0): 65, 69, 42, + (138,147,0): 60, 64, 37, + (138,148,0): 63, 66, 37, + (138,149,0): 78, 78, 50, + (138,150,0): 95, 96, 65, + (138,151,0): 105, 106, 75, + (138,152,0): 97, 97, 69, + (138,153,0): 110, 113, 84, + (138,154,0): 118, 122, 97, + (138,155,0): 103, 109, 83, + (138,156,0): 74, 79, 57, + (138,157,0): 52, 60, 37, + (138,158,0): 52, 61, 40, + (138,159,0): 61, 70, 51, + (138,160,0): 56, 62, 50, + (138,161,0): 56, 62, 52, + (138,162,0): 56, 62, 52, + (138,163,0): 56, 62, 52, + (138,164,0): 55, 61, 51, + (138,165,0): 55, 61, 51, + (138,166,0): 55, 61, 51, + (138,167,0): 54, 60, 50, + (138,168,0): 56, 62, 52, + (138,169,0): 56, 62, 52, + (138,170,0): 55, 61, 51, + (138,171,0): 55, 61, 51, + (138,172,0): 55, 61, 51, + (138,173,0): 54, 60, 50, + (138,174,0): 54, 60, 50, + (138,175,0): 54, 60, 50, + (138,176,0): 53, 58, 52, + (138,177,0): 52, 57, 51, + (138,178,0): 52, 57, 51, + (138,179,0): 52, 57, 51, + (138,180,0): 51, 56, 50, + (138,181,0): 51, 56, 50, + (138,182,0): 51, 56, 50, + (138,183,0): 50, 55, 49, + (138,184,0): 48, 53, 47, + (138,185,0): 48, 53, 47, + (138,186,0): 47, 52, 46, + (138,187,0): 46, 51, 45, + (138,188,0): 45, 50, 44, + (138,189,0): 44, 49, 43, + (138,190,0): 43, 48, 42, + (138,191,0): 43, 48, 42, + (138,192,0): 41, 46, 40, + (138,193,0): 41, 46, 40, + (138,194,0): 41, 46, 40, + (138,195,0): 41, 46, 40, + (138,196,0): 41, 46, 40, + (138,197,0): 42, 47, 41, + (138,198,0): 43, 48, 42, + (138,199,0): 44, 49, 43, + (138,200,0): 49, 54, 48, + (138,201,0): 47, 52, 46, + (138,202,0): 44, 49, 43, + (138,203,0): 44, 49, 43, + (138,204,0): 47, 52, 46, + (138,205,0): 54, 59, 52, + (138,206,0): 61, 66, 60, + (138,207,0): 65, 72, 64, + (138,208,0): 64, 75, 61, + (138,209,0): 62, 75, 58, + (138,210,0): 60, 73, 55, + (138,211,0): 56, 69, 51, + (138,212,0): 52, 65, 45, + (138,213,0): 50, 63, 43, + (138,214,0): 51, 65, 42, + (138,215,0): 53, 67, 44, + (138,216,0): 68, 81, 61, + (138,217,0): 75, 88, 68, + (138,218,0): 81, 94, 77, + (138,219,0): 81, 94, 77, + (138,220,0): 72, 84, 72, + (138,221,0): 60, 72, 60, + (138,222,0): 50, 62, 52, + (138,223,0): 46, 56, 47, + (138,224,0): 46, 53, 46, + (138,225,0): 46, 53, 46, + (138,226,0): 45, 52, 45, + (139,0,0): 103, 100, 85, + (139,1,0): 103, 100, 85, + (139,2,0): 104, 101, 86, + (139,3,0): 104, 101, 86, + (139,4,0): 104, 101, 86, + (139,5,0): 104, 101, 86, + (139,6,0): 105, 102, 87, + (139,7,0): 105, 102, 87, + (139,8,0): 105, 102, 87, + (139,9,0): 105, 102, 87, + (139,10,0): 105, 102, 87, + (139,11,0): 105, 102, 87, + (139,12,0): 105, 102, 87, + (139,13,0): 105, 102, 87, + (139,14,0): 105, 102, 87, + (139,15,0): 105, 102, 87, + (139,16,0): 107, 101, 87, + (139,17,0): 107, 101, 87, + (139,18,0): 108, 99, 90, + (139,19,0): 109, 100, 91, + (139,20,0): 109, 100, 93, + (139,21,0): 109, 102, 92, + (139,22,0): 109, 103, 91, + (139,23,0): 106, 105, 87, + (139,24,0): 107, 109, 88, + (139,25,0): 105, 109, 86, + (139,26,0): 106, 111, 89, + (139,27,0): 106, 115, 96, + (139,28,0): 104, 116, 104, + (139,29,0): 109, 124, 119, + (139,30,0): 136, 152, 152, + (139,31,0): 166, 179, 185, + (139,32,0): 191, 202, 208, + (139,33,0): 211, 220, 227, + (139,34,0): 235, 240, 246, + (139,35,0): 246, 251, 255, + (139,36,0): 252, 253, 255, + (139,37,0): 253, 255, 254, + (139,38,0): 255, 255, 253, + (139,39,0): 255, 254, 249, + (139,40,0): 254, 254, 246, + (139,41,0): 253, 253, 241, + (139,42,0): 250, 251, 237, + (139,43,0): 247, 250, 231, + (139,44,0): 244, 247, 226, + (139,45,0): 238, 243, 220, + (139,46,0): 229, 237, 213, + (139,47,0): 226, 232, 206, + (139,48,0): 219, 224, 192, + (139,49,0): 215, 218, 187, + (139,50,0): 214, 214, 188, + (139,51,0): 217, 215, 194, + (139,52,0): 221, 215, 199, + (139,53,0): 222, 215, 205, + (139,54,0): 229, 219, 217, + (139,55,0): 236, 224, 224, + (139,56,0): 247, 235, 239, + (139,57,0): 250, 239, 245, + (139,58,0): 255, 244, 250, + (139,59,0): 255, 248, 253, + (139,60,0): 255, 249, 252, + (139,61,0): 255, 250, 250, + (139,62,0): 255, 250, 250, + (139,63,0): 255, 252, 251, + (139,64,0): 255, 254, 252, + (139,65,0): 254, 254, 252, + (139,66,0): 254, 254, 252, + (139,67,0): 254, 254, 252, + (139,68,0): 254, 254, 252, + (139,69,0): 254, 254, 252, + (139,70,0): 254, 254, 252, + (139,71,0): 254, 254, 252, + (139,72,0): 254, 254, 252, + (139,73,0): 254, 254, 252, + (139,74,0): 254, 254, 252, + (139,75,0): 254, 254, 252, + (139,76,0): 254, 254, 252, + (139,77,0): 254, 254, 252, + (139,78,0): 254, 254, 252, + (139,79,0): 253, 255, 252, + (139,80,0): 247, 255, 253, + (139,81,0): 247, 255, 253, + (139,82,0): 250, 254, 253, + (139,83,0): 253, 253, 253, + (139,84,0): 255, 251, 253, + (139,85,0): 255, 248, 254, + (139,86,0): 255, 246, 253, + (139,87,0): 255, 244, 250, + (139,88,0): 255, 248, 251, + (139,89,0): 255, 247, 250, + (139,90,0): 255, 248, 248, + (139,91,0): 255, 252, 249, + (139,92,0): 255, 255, 248, + (139,93,0): 255, 255, 248, + (139,94,0): 250, 255, 244, + (139,95,0): 250, 252, 238, + (139,96,0): 255, 255, 237, + (139,97,0): 255, 248, 228, + (139,98,0): 253, 238, 219, + (139,99,0): 255, 239, 219, + (139,100,0): 255, 239, 217, + (139,101,0): 238, 210, 188, + (139,102,0): 176, 144, 121, + (139,103,0): 118, 82, 60, + (139,104,0): 117, 76, 54, + (139,105,0): 117, 75, 53, + (139,106,0): 119, 74, 53, + (139,107,0): 123, 78, 57, + (139,108,0): 125, 80, 59, + (139,109,0): 120, 75, 54, + (139,110,0): 107, 64, 45, + (139,111,0): 98, 55, 38, + (139,112,0): 123, 77, 64, + (139,113,0): 115, 68, 58, + (139,114,0): 113, 66, 56, + (139,115,0): 115, 68, 58, + (139,116,0): 111, 67, 56, + (139,117,0): 103, 59, 48, + (139,118,0): 100, 56, 45, + (139,119,0): 103, 61, 49, + (139,120,0): 105, 63, 51, + (139,121,0): 105, 63, 51, + (139,122,0): 105, 63, 51, + (139,123,0): 103, 63, 51, + (139,124,0): 102, 62, 50, + (139,125,0): 102, 62, 50, + (139,126,0): 102, 62, 50, + (139,127,0): 101, 63, 50, + (139,128,0): 98, 64, 52, + (139,129,0): 98, 66, 53, + (139,130,0): 96, 67, 53, + (139,131,0): 95, 67, 53, + (139,132,0): 95, 67, 53, + (139,133,0): 91, 68, 52, + (139,134,0): 90, 69, 52, + (139,135,0): 87, 68, 51, + (139,136,0): 88, 73, 54, + (139,137,0): 79, 66, 47, + (139,138,0): 92, 84, 63, + (139,139,0): 111, 105, 83, + (139,140,0): 99, 94, 72, + (139,141,0): 77, 75, 52, + (139,142,0): 73, 71, 48, + (139,143,0): 73, 75, 51, + (139,144,0): 62, 68, 42, + (139,145,0): 63, 72, 45, + (139,146,0): 64, 70, 42, + (139,147,0): 60, 66, 38, + (139,148,0): 60, 65, 35, + (139,149,0): 70, 73, 44, + (139,150,0): 88, 89, 58, + (139,151,0): 100, 101, 70, + (139,152,0): 109, 109, 81, + (139,153,0): 120, 120, 92, + (139,154,0): 116, 118, 94, + (139,155,0): 91, 95, 70, + (139,156,0): 64, 67, 46, + (139,157,0): 54, 59, 37, + (139,158,0): 56, 64, 43, + (139,159,0): 60, 67, 49, + (139,160,0): 57, 63, 51, + (139,161,0): 57, 63, 53, + (139,162,0): 57, 63, 53, + (139,163,0): 56, 62, 52, + (139,164,0): 56, 62, 52, + (139,165,0): 55, 61, 51, + (139,166,0): 55, 61, 51, + (139,167,0): 55, 61, 51, + (139,168,0): 57, 63, 53, + (139,169,0): 56, 62, 52, + (139,170,0): 56, 62, 52, + (139,171,0): 56, 62, 52, + (139,172,0): 56, 62, 52, + (139,173,0): 56, 62, 52, + (139,174,0): 56, 62, 52, + (139,175,0): 56, 62, 52, + (139,176,0): 55, 60, 54, + (139,177,0): 55, 60, 54, + (139,178,0): 55, 60, 54, + (139,179,0): 54, 59, 53, + (139,180,0): 54, 59, 53, + (139,181,0): 54, 59, 53, + (139,182,0): 53, 58, 52, + (139,183,0): 53, 58, 52, + (139,184,0): 51, 56, 50, + (139,185,0): 51, 56, 50, + (139,186,0): 49, 54, 48, + (139,187,0): 48, 53, 47, + (139,188,0): 47, 52, 46, + (139,189,0): 45, 50, 44, + (139,190,0): 44, 49, 43, + (139,191,0): 44, 49, 43, + (139,192,0): 43, 48, 42, + (139,193,0): 43, 48, 42, + (139,194,0): 42, 47, 41, + (139,195,0): 42, 47, 41, + (139,196,0): 43, 48, 42, + (139,197,0): 44, 49, 43, + (139,198,0): 45, 50, 44, + (139,199,0): 45, 50, 44, + (139,200,0): 48, 53, 47, + (139,201,0): 46, 51, 45, + (139,202,0): 43, 48, 42, + (139,203,0): 43, 48, 42, + (139,204,0): 45, 50, 46, + (139,205,0): 50, 55, 49, + (139,206,0): 56, 61, 57, + (139,207,0): 59, 66, 58, + (139,208,0): 64, 75, 61, + (139,209,0): 64, 77, 59, + (139,210,0): 64, 77, 59, + (139,211,0): 61, 74, 54, + (139,212,0): 56, 69, 49, + (139,213,0): 51, 64, 44, + (139,214,0): 49, 63, 40, + (139,215,0): 48, 62, 39, + (139,216,0): 60, 73, 53, + (139,217,0): 66, 79, 59, + (139,218,0): 72, 85, 67, + (139,219,0): 73, 86, 69, + (139,220,0): 68, 80, 66, + (139,221,0): 59, 71, 59, + (139,222,0): 50, 62, 52, + (139,223,0): 46, 58, 48, + (139,224,0): 45, 55, 47, + (139,225,0): 47, 54, 47, + (139,226,0): 46, 53, 46, + (140,0,0): 103, 100, 85, + (140,1,0): 103, 100, 85, + (140,2,0): 103, 100, 85, + (140,3,0): 104, 101, 86, + (140,4,0): 104, 101, 86, + (140,5,0): 105, 102, 87, + (140,6,0): 105, 102, 87, + (140,7,0): 105, 102, 87, + (140,8,0): 105, 102, 87, + (140,9,0): 105, 102, 87, + (140,10,0): 105, 102, 87, + (140,11,0): 105, 102, 87, + (140,12,0): 105, 102, 87, + (140,13,0): 105, 102, 87, + (140,14,0): 105, 102, 87, + (140,15,0): 105, 102, 87, + (140,16,0): 107, 101, 87, + (140,17,0): 108, 100, 87, + (140,18,0): 108, 99, 90, + (140,19,0): 109, 100, 91, + (140,20,0): 109, 100, 93, + (140,21,0): 109, 102, 92, + (140,22,0): 109, 103, 91, + (140,23,0): 106, 105, 87, + (140,24,0): 107, 109, 88, + (140,25,0): 105, 110, 87, + (140,26,0): 105, 113, 90, + (140,27,0): 103, 115, 95, + (140,28,0): 100, 114, 101, + (140,29,0): 106, 121, 116, + (140,30,0): 133, 149, 149, + (140,31,0): 163, 178, 183, + (140,32,0): 189, 200, 206, + (140,33,0): 210, 219, 226, + (140,34,0): 234, 239, 245, + (140,35,0): 244, 249, 253, + (140,36,0): 251, 252, 255, + (140,37,0): 253, 255, 254, + (140,38,0): 255, 255, 253, + (140,39,0): 255, 255, 250, + (140,40,0): 255, 255, 248, + (140,41,0): 255, 255, 243, + (140,42,0): 254, 255, 241, + (140,43,0): 251, 254, 235, + (140,44,0): 247, 250, 229, + (140,45,0): 240, 245, 222, + (140,46,0): 230, 238, 214, + (140,47,0): 226, 232, 204, + (140,48,0): 217, 220, 191, + (140,49,0): 213, 213, 185, + (140,50,0): 210, 208, 185, + (140,51,0): 212, 209, 190, + (140,52,0): 218, 212, 200, + (140,53,0): 224, 217, 209, + (140,54,0): 234, 224, 223, + (140,55,0): 244, 233, 237, + (140,56,0): 253, 242, 248, + (140,57,0): 255, 246, 251, + (140,58,0): 255, 250, 255, + (140,59,0): 255, 252, 255, + (140,60,0): 255, 253, 254, + (140,61,0): 254, 253, 251, + (140,62,0): 254, 253, 249, + (140,63,0): 254, 253, 249, + (140,64,0): 254, 254, 252, + (140,65,0): 254, 254, 252, + (140,66,0): 254, 254, 252, + (140,67,0): 254, 254, 252, + (140,68,0): 254, 254, 252, + (140,69,0): 254, 254, 252, + (140,70,0): 254, 254, 252, + (140,71,0): 254, 254, 252, + (140,72,0): 254, 254, 252, + (140,73,0): 254, 254, 252, + (140,74,0): 254, 254, 252, + (140,75,0): 254, 254, 252, + (140,76,0): 254, 254, 252, + (140,77,0): 254, 254, 252, + (140,78,0): 254, 254, 252, + (140,79,0): 253, 255, 254, + (140,80,0): 250, 255, 255, + (140,81,0): 250, 255, 255, + (140,82,0): 252, 255, 255, + (140,83,0): 255, 255, 255, + (140,84,0): 255, 253, 254, + (140,85,0): 255, 251, 251, + (140,86,0): 255, 249, 250, + (140,87,0): 255, 249, 248, + (140,88,0): 255, 248, 246, + (140,89,0): 255, 249, 247, + (140,90,0): 255, 250, 247, + (140,91,0): 255, 254, 249, + (140,92,0): 255, 255, 251, + (140,93,0): 255, 255, 251, + (140,94,0): 253, 255, 250, + (140,95,0): 252, 253, 248, + (140,96,0): 244, 241, 234, + (140,97,0): 255, 251, 243, + (140,98,0): 255, 253, 244, + (140,99,0): 255, 251, 241, + (140,100,0): 255, 248, 235, + (140,101,0): 255, 244, 228, + (140,102,0): 246, 227, 210, + (140,103,0): 228, 207, 188, + (140,104,0): 208, 183, 163, + (140,105,0): 183, 156, 135, + (140,106,0): 146, 118, 97, + (140,107,0): 118, 87, 67, + (140,108,0): 104, 73, 53, + (140,109,0): 104, 73, 53, + (140,110,0): 109, 76, 57, + (140,111,0): 112, 79, 60, + (140,112,0): 108, 71, 55, + (140,113,0): 105, 66, 51, + (140,114,0): 103, 66, 50, + (140,115,0): 106, 69, 53, + (140,116,0): 110, 73, 57, + (140,117,0): 110, 74, 58, + (140,118,0): 111, 75, 59, + (140,119,0): 111, 75, 59, + (140,120,0): 101, 65, 49, + (140,121,0): 99, 66, 49, + (140,122,0): 99, 66, 49, + (140,123,0): 99, 66, 49, + (140,124,0): 99, 66, 49, + (140,125,0): 99, 66, 49, + (140,126,0): 98, 67, 49, + (140,127,0): 96, 67, 51, + (140,128,0): 93, 70, 54, + (140,129,0): 92, 71, 54, + (140,130,0): 92, 71, 54, + (140,131,0): 90, 71, 54, + (140,132,0): 90, 71, 54, + (140,133,0): 87, 72, 53, + (140,134,0): 84, 71, 52, + (140,135,0): 82, 71, 51, + (140,136,0): 80, 72, 51, + (140,137,0): 78, 72, 50, + (140,138,0): 102, 100, 77, + (140,139,0): 126, 126, 102, + (140,140,0): 114, 114, 90, + (140,141,0): 86, 88, 64, + (140,142,0): 74, 76, 52, + (140,143,0): 71, 77, 51, + (140,144,0): 60, 69, 42, + (140,145,0): 60, 70, 43, + (140,146,0): 63, 72, 43, + (140,147,0): 65, 71, 43, + (140,148,0): 65, 70, 40, + (140,149,0): 68, 71, 42, + (140,150,0): 77, 78, 47, + (140,151,0): 84, 85, 54, + (140,152,0): 120, 119, 91, + (140,153,0): 123, 122, 94, + (140,154,0): 110, 110, 86, + (140,155,0): 85, 85, 61, + (140,156,0): 67, 66, 46, + (140,157,0): 63, 65, 44, + (140,158,0): 62, 65, 46, + (140,159,0): 58, 62, 45, + (140,160,0): 59, 62, 51, + (140,161,0): 57, 63, 53, + (140,162,0): 57, 63, 53, + (140,163,0): 56, 62, 52, + (140,164,0): 56, 62, 52, + (140,165,0): 55, 61, 51, + (140,166,0): 55, 61, 51, + (140,167,0): 55, 61, 51, + (140,168,0): 56, 62, 52, + (140,169,0): 56, 62, 52, + (140,170,0): 56, 62, 52, + (140,171,0): 56, 62, 52, + (140,172,0): 56, 62, 52, + (140,173,0): 56, 62, 52, + (140,174,0): 56, 62, 52, + (140,175,0): 56, 62, 52, + (140,176,0): 57, 62, 56, + (140,177,0): 57, 62, 56, + (140,178,0): 57, 62, 56, + (140,179,0): 56, 61, 55, + (140,180,0): 56, 61, 55, + (140,181,0): 56, 61, 55, + (140,182,0): 55, 60, 54, + (140,183,0): 55, 60, 54, + (140,184,0): 54, 59, 53, + (140,185,0): 53, 58, 52, + (140,186,0): 52, 57, 51, + (140,187,0): 51, 56, 50, + (140,188,0): 50, 55, 49, + (140,189,0): 48, 53, 47, + (140,190,0): 47, 52, 46, + (140,191,0): 47, 52, 46, + (140,192,0): 45, 50, 46, + (140,193,0): 45, 50, 46, + (140,194,0): 44, 49, 45, + (140,195,0): 43, 48, 44, + (140,196,0): 43, 48, 44, + (140,197,0): 44, 49, 45, + (140,198,0): 45, 50, 46, + (140,199,0): 45, 50, 46, + (140,200,0): 44, 49, 45, + (140,201,0): 44, 49, 45, + (140,202,0): 44, 49, 45, + (140,203,0): 44, 49, 45, + (140,204,0): 46, 50, 49, + (140,205,0): 48, 53, 49, + (140,206,0): 51, 55, 54, + (140,207,0): 52, 59, 52, + (140,208,0): 59, 71, 57, + (140,209,0): 61, 76, 57, + (140,210,0): 64, 79, 60, + (140,211,0): 64, 79, 58, + (140,212,0): 60, 75, 54, + (140,213,0): 55, 70, 47, + (140,214,0): 52, 67, 44, + (140,215,0): 50, 65, 42, + (140,216,0): 54, 69, 46, + (140,217,0): 58, 73, 52, + (140,218,0): 64, 79, 60, + (140,219,0): 66, 80, 63, + (140,220,0): 63, 77, 62, + (140,221,0): 56, 70, 55, + (140,222,0): 49, 63, 50, + (140,223,0): 45, 57, 45, + (140,224,0): 45, 55, 46, + (140,225,0): 46, 53, 45, + (140,226,0): 45, 52, 44, + (141,0,0): 102, 99, 84, + (141,1,0): 102, 99, 84, + (141,2,0): 103, 100, 85, + (141,3,0): 104, 101, 86, + (141,4,0): 104, 101, 86, + (141,5,0): 105, 102, 87, + (141,6,0): 106, 103, 88, + (141,7,0): 106, 103, 88, + (141,8,0): 105, 102, 87, + (141,9,0): 105, 102, 87, + (141,10,0): 105, 102, 87, + (141,11,0): 105, 102, 87, + (141,12,0): 105, 102, 87, + (141,13,0): 105, 102, 87, + (141,14,0): 105, 102, 87, + (141,15,0): 105, 102, 87, + (141,16,0): 108, 100, 87, + (141,17,0): 108, 100, 87, + (141,18,0): 108, 99, 90, + (141,19,0): 109, 100, 91, + (141,20,0): 109, 100, 93, + (141,21,0): 109, 102, 92, + (141,22,0): 109, 103, 91, + (141,23,0): 106, 105, 87, + (141,24,0): 107, 109, 88, + (141,25,0): 105, 110, 87, + (141,26,0): 105, 113, 90, + (141,27,0): 103, 115, 95, + (141,28,0): 98, 112, 99, + (141,29,0): 103, 120, 114, + (141,30,0): 130, 148, 148, + (141,31,0): 163, 178, 183, + (141,32,0): 192, 203, 209, + (141,33,0): 212, 221, 228, + (141,34,0): 235, 240, 246, + (141,35,0): 245, 250, 254, + (141,36,0): 251, 252, 255, + (141,37,0): 253, 255, 254, + (141,38,0): 255, 255, 253, + (141,39,0): 255, 255, 250, + (141,40,0): 255, 255, 248, + (141,41,0): 255, 255, 244, + (141,42,0): 255, 255, 243, + (141,43,0): 255, 255, 239, + (141,44,0): 250, 253, 232, + (141,45,0): 242, 247, 224, + (141,46,0): 231, 240, 213, + (141,47,0): 226, 232, 204, + (141,48,0): 215, 218, 189, + (141,49,0): 209, 209, 181, + (141,50,0): 205, 203, 180, + (141,51,0): 206, 203, 186, + (141,52,0): 214, 207, 197, + (141,53,0): 222, 215, 209, + (141,54,0): 236, 226, 227, + (141,55,0): 247, 238, 243, + (141,56,0): 255, 245, 253, + (141,57,0): 255, 249, 255, + (141,58,0): 255, 252, 255, + (141,59,0): 255, 254, 255, + (141,60,0): 255, 254, 252, + (141,61,0): 253, 254, 249, + (141,62,0): 253, 254, 248, + (141,63,0): 253, 255, 249, + (141,64,0): 254, 255, 250, + (141,65,0): 254, 254, 252, + (141,66,0): 254, 254, 252, + (141,67,0): 254, 254, 252, + (141,68,0): 254, 254, 252, + (141,69,0): 254, 254, 252, + (141,70,0): 254, 254, 252, + (141,71,0): 254, 254, 252, + (141,72,0): 254, 254, 252, + (141,73,0): 254, 254, 252, + (141,74,0): 254, 254, 252, + (141,75,0): 254, 254, 252, + (141,76,0): 254, 254, 252, + (141,77,0): 254, 254, 252, + (141,78,0): 254, 254, 252, + (141,79,0): 254, 254, 254, + (141,80,0): 253, 254, 255, + (141,81,0): 254, 255, 255, + (141,82,0): 254, 255, 255, + (141,83,0): 254, 255, 255, + (141,84,0): 254, 255, 253, + (141,85,0): 254, 255, 250, + (141,86,0): 253, 254, 248, + (141,87,0): 253, 253, 245, + (141,88,0): 251, 251, 241, + (141,89,0): 252, 252, 244, + (141,90,0): 254, 253, 248, + (141,91,0): 255, 254, 250, + (141,92,0): 255, 255, 253, + (141,93,0): 254, 254, 254, + (141,94,0): 254, 252, 255, + (141,95,0): 254, 252, 255, + (141,96,0): 251, 246, 252, + (141,97,0): 255, 250, 254, + (141,98,0): 254, 248, 250, + (141,99,0): 249, 244, 241, + (141,100,0): 253, 246, 240, + (141,101,0): 255, 254, 244, + (141,102,0): 255, 254, 241, + (141,103,0): 255, 254, 237, + (141,104,0): 255, 248, 230, + (141,105,0): 252, 239, 220, + (141,106,0): 242, 227, 208, + (141,107,0): 226, 209, 189, + (141,108,0): 205, 187, 167, + (141,109,0): 179, 161, 141, + (141,110,0): 155, 134, 115, + (141,111,0): 140, 117, 99, + (141,112,0): 122, 93, 75, + (141,113,0): 125, 94, 76, + (141,114,0): 116, 85, 67, + (141,115,0): 97, 68, 50, + (141,116,0): 87, 58, 40, + (141,117,0): 89, 60, 42, + (141,118,0): 91, 62, 44, + (141,119,0): 88, 61, 42, + (141,120,0): 96, 69, 50, + (141,121,0): 96, 69, 50, + (141,122,0): 96, 69, 50, + (141,123,0): 95, 70, 50, + (141,124,0): 96, 71, 51, + (141,125,0): 96, 71, 51, + (141,126,0): 96, 71, 51, + (141,127,0): 93, 72, 51, + (141,128,0): 92, 75, 55, + (141,129,0): 92, 77, 58, + (141,130,0): 92, 77, 58, + (141,131,0): 89, 76, 57, + (141,132,0): 88, 77, 57, + (141,133,0): 85, 77, 56, + (141,134,0): 82, 76, 54, + (141,135,0): 81, 76, 54, + (141,136,0): 78, 76, 53, + (141,137,0): 81, 81, 57, + (141,138,0): 105, 107, 83, + (141,139,0): 124, 128, 103, + (141,140,0): 109, 113, 88, + (141,141,0): 83, 89, 63, + (141,142,0): 70, 76, 50, + (141,143,0): 62, 71, 44, + (141,144,0): 60, 70, 43, + (141,145,0): 60, 70, 43, + (141,146,0): 63, 72, 43, + (141,147,0): 68, 74, 46, + (141,148,0): 69, 74, 44, + (141,149,0): 68, 71, 42, + (141,150,0): 72, 73, 42, + (141,151,0): 76, 77, 46, + (141,152,0): 121, 120, 92, + (141,153,0): 116, 115, 87, + (141,154,0): 102, 100, 77, + (141,155,0): 84, 82, 59, + (141,156,0): 76, 73, 54, + (141,157,0): 75, 74, 54, + (141,158,0): 70, 69, 51, + (141,159,0): 60, 61, 45, + (141,160,0): 60, 63, 52, + (141,161,0): 57, 63, 53, + (141,162,0): 57, 63, 53, + (141,163,0): 57, 63, 53, + (141,164,0): 56, 62, 52, + (141,165,0): 56, 62, 52, + (141,166,0): 56, 62, 52, + (141,167,0): 56, 62, 52, + (141,168,0): 55, 61, 51, + (141,169,0): 55, 61, 51, + (141,170,0): 56, 62, 52, + (141,171,0): 56, 62, 52, + (141,172,0): 56, 62, 52, + (141,173,0): 56, 62, 52, + (141,174,0): 57, 63, 53, + (141,175,0): 57, 63, 53, + (141,176,0): 58, 63, 57, + (141,177,0): 58, 63, 57, + (141,178,0): 58, 63, 57, + (141,179,0): 58, 63, 57, + (141,180,0): 57, 62, 56, + (141,181,0): 57, 62, 56, + (141,182,0): 57, 62, 56, + (141,183,0): 56, 61, 55, + (141,184,0): 56, 61, 55, + (141,185,0): 56, 61, 55, + (141,186,0): 55, 60, 54, + (141,187,0): 54, 59, 53, + (141,188,0): 53, 58, 52, + (141,189,0): 52, 57, 51, + (141,190,0): 51, 56, 50, + (141,191,0): 51, 56, 50, + (141,192,0): 47, 52, 48, + (141,193,0): 46, 51, 47, + (141,194,0): 45, 50, 46, + (141,195,0): 44, 49, 45, + (141,196,0): 43, 48, 44, + (141,197,0): 43, 48, 44, + (141,198,0): 43, 48, 44, + (141,199,0): 43, 48, 44, + (141,200,0): 43, 48, 44, + (141,201,0): 44, 49, 45, + (141,202,0): 45, 49, 48, + (141,203,0): 46, 50, 49, + (141,204,0): 47, 51, 50, + (141,205,0): 47, 51, 50, + (141,206,0): 47, 51, 50, + (141,207,0): 45, 52, 45, + (141,208,0): 51, 63, 49, + (141,209,0): 55, 70, 51, + (141,210,0): 61, 76, 55, + (141,211,0): 64, 79, 58, + (141,212,0): 63, 78, 55, + (141,213,0): 60, 75, 52, + (141,214,0): 57, 72, 49, + (141,215,0): 56, 71, 48, + (141,216,0): 53, 68, 45, + (141,217,0): 56, 71, 48, + (141,218,0): 60, 75, 54, + (141,219,0): 62, 77, 58, + (141,220,0): 60, 74, 57, + (141,221,0): 55, 69, 54, + (141,222,0): 49, 63, 50, + (141,223,0): 45, 57, 45, + (141,224,0): 44, 54, 45, + (141,225,0): 46, 53, 45, + (141,226,0): 45, 52, 44, + (142,0,0): 102, 99, 84, + (142,1,0): 102, 99, 84, + (142,2,0): 103, 100, 85, + (142,3,0): 104, 101, 86, + (142,4,0): 104, 101, 86, + (142,5,0): 105, 102, 87, + (142,6,0): 106, 103, 88, + (142,7,0): 106, 103, 88, + (142,8,0): 105, 102, 87, + (142,9,0): 105, 102, 87, + (142,10,0): 105, 102, 87, + (142,11,0): 105, 102, 87, + (142,12,0): 105, 102, 87, + (142,13,0): 105, 102, 87, + (142,14,0): 105, 102, 87, + (142,15,0): 105, 102, 87, + (142,16,0): 108, 100, 87, + (142,17,0): 108, 100, 87, + (142,18,0): 108, 99, 90, + (142,19,0): 109, 100, 91, + (142,20,0): 109, 100, 93, + (142,21,0): 109, 102, 92, + (142,22,0): 109, 103, 91, + (142,23,0): 106, 105, 87, + (142,24,0): 106, 108, 87, + (142,25,0): 104, 109, 86, + (142,26,0): 104, 114, 90, + (142,27,0): 102, 115, 95, + (142,28,0): 99, 113, 100, + (142,29,0): 104, 121, 115, + (142,30,0): 133, 151, 151, + (142,31,0): 165, 183, 187, + (142,32,0): 199, 210, 216, + (142,33,0): 218, 227, 234, + (142,34,0): 240, 245, 251, + (142,35,0): 248, 253, 255, + (142,36,0): 252, 253, 255, + (142,37,0): 253, 255, 254, + (142,38,0): 255, 255, 253, + (142,39,0): 255, 254, 249, + (142,40,0): 255, 255, 245, + (142,41,0): 255, 255, 242, + (142,42,0): 255, 255, 240, + (142,43,0): 252, 255, 236, + (142,44,0): 248, 251, 230, + (142,45,0): 239, 244, 221, + (142,46,0): 226, 235, 208, + (142,47,0): 221, 227, 199, + (142,48,0): 213, 213, 185, + (142,49,0): 206, 204, 179, + (142,50,0): 201, 196, 176, + (142,51,0): 202, 196, 180, + (142,52,0): 208, 201, 191, + (142,53,0): 218, 210, 207, + (142,54,0): 233, 224, 227, + (142,55,0): 246, 237, 242, + (142,56,0): 255, 246, 254, + (142,57,0): 255, 249, 255, + (142,58,0): 255, 252, 255, + (142,59,0): 255, 254, 255, + (142,60,0): 254, 254, 252, + (142,61,0): 252, 254, 249, + (142,62,0): 251, 255, 247, + (142,63,0): 252, 255, 248, + (142,64,0): 253, 255, 250, + (142,65,0): 254, 254, 252, + (142,66,0): 254, 254, 252, + (142,67,0): 254, 254, 252, + (142,68,0): 254, 254, 252, + (142,69,0): 254, 254, 252, + (142,70,0): 254, 254, 252, + (142,71,0): 254, 254, 252, + (142,72,0): 254, 254, 252, + (142,73,0): 254, 254, 252, + (142,74,0): 254, 254, 252, + (142,75,0): 254, 254, 252, + (142,76,0): 254, 254, 252, + (142,77,0): 254, 254, 252, + (142,78,0): 254, 254, 252, + (142,79,0): 254, 254, 254, + (142,80,0): 254, 251, 255, + (142,81,0): 255, 252, 255, + (142,82,0): 254, 253, 255, + (142,83,0): 253, 255, 254, + (142,84,0): 250, 255, 250, + (142,85,0): 247, 255, 248, + (142,86,0): 246, 255, 243, + (142,87,0): 245, 255, 240, + (142,88,0): 243, 254, 238, + (142,89,0): 245, 255, 242, + (142,90,0): 250, 255, 246, + (142,91,0): 253, 255, 250, + (142,92,0): 255, 253, 254, + (142,93,0): 255, 251, 255, + (142,94,0): 255, 249, 255, + (142,95,0): 255, 248, 255, + (142,96,0): 252, 241, 255, + (142,97,0): 254, 245, 255, + (142,98,0): 255, 250, 255, + (142,99,0): 255, 253, 255, + (142,100,0): 255, 252, 255, + (142,101,0): 252, 251, 249, + (142,102,0): 248, 248, 240, + (142,103,0): 245, 245, 233, + (142,104,0): 255, 255, 241, + (142,105,0): 255, 255, 239, + (142,106,0): 255, 255, 237, + (142,107,0): 255, 255, 237, + (142,108,0): 255, 252, 234, + (142,109,0): 255, 246, 229, + (142,110,0): 251, 239, 223, + (142,111,0): 248, 235, 218, + (142,112,0): 249, 228, 209, + (142,113,0): 255, 230, 208, + (142,114,0): 227, 202, 180, + (142,115,0): 165, 143, 120, + (142,116,0): 116, 94, 71, + (142,117,0): 101, 79, 56, + (142,118,0): 98, 76, 53, + (142,119,0): 92, 72, 48, + (142,120,0): 94, 74, 50, + (142,121,0): 92, 74, 50, + (142,122,0): 92, 74, 50, + (142,123,0): 93, 75, 51, + (142,124,0): 93, 75, 51, + (142,125,0): 94, 76, 52, + (142,126,0): 94, 76, 52, + (142,127,0): 92, 77, 54, + (142,128,0): 89, 78, 56, + (142,129,0): 87, 79, 58, + (142,130,0): 87, 79, 58, + (142,131,0): 86, 80, 58, + (142,132,0): 85, 79, 57, + (142,133,0): 83, 78, 56, + (142,134,0): 80, 78, 55, + (142,135,0): 78, 78, 54, + (142,136,0): 77, 79, 55, + (142,137,0): 80, 84, 59, + (142,138,0): 96, 102, 76, + (142,139,0): 102, 111, 84, + (142,140,0): 85, 94, 67, + (142,141,0): 69, 79, 52, + (142,142,0): 65, 75, 48, + (142,143,0): 60, 70, 43, + (142,144,0): 63, 73, 46, + (142,145,0): 63, 73, 46, + (142,146,0): 67, 76, 47, + (142,147,0): 72, 78, 50, + (142,148,0): 72, 77, 47, + (142,149,0): 70, 73, 44, + (142,150,0): 79, 80, 49, + (142,151,0): 89, 88, 58, + (142,152,0): 113, 109, 82, + (142,153,0): 106, 102, 75, + (142,154,0): 97, 92, 70, + (142,155,0): 91, 86, 64, + (142,156,0): 89, 84, 65, + (142,157,0): 84, 81, 62, + (142,158,0): 77, 74, 57, + (142,159,0): 66, 67, 51, + (142,160,0): 61, 64, 53, + (142,161,0): 59, 65, 55, + (142,162,0): 59, 65, 55, + (142,163,0): 59, 65, 55, + (142,164,0): 58, 64, 54, + (142,165,0): 58, 64, 54, + (142,166,0): 58, 64, 54, + (142,167,0): 57, 63, 53, + (142,168,0): 56, 62, 52, + (142,169,0): 56, 62, 52, + (142,170,0): 56, 62, 52, + (142,171,0): 57, 63, 53, + (142,172,0): 57, 63, 53, + (142,173,0): 58, 64, 54, + (142,174,0): 58, 64, 54, + (142,175,0): 58, 64, 54, + (142,176,0): 59, 64, 58, + (142,177,0): 59, 64, 58, + (142,178,0): 59, 64, 58, + (142,179,0): 58, 63, 57, + (142,180,0): 58, 63, 57, + (142,181,0): 57, 62, 56, + (142,182,0): 57, 62, 56, + (142,183,0): 57, 62, 56, + (142,184,0): 58, 63, 57, + (142,185,0): 58, 63, 57, + (142,186,0): 57, 62, 56, + (142,187,0): 57, 62, 56, + (142,188,0): 56, 61, 55, + (142,189,0): 56, 61, 55, + (142,190,0): 55, 60, 54, + (142,191,0): 55, 60, 54, + (142,192,0): 52, 57, 53, + (142,193,0): 50, 55, 51, + (142,194,0): 49, 54, 50, + (142,195,0): 47, 52, 48, + (142,196,0): 45, 50, 46, + (142,197,0): 44, 49, 45, + (142,198,0): 43, 47, 46, + (142,199,0): 43, 47, 46, + (142,200,0): 44, 48, 47, + (142,201,0): 44, 48, 47, + (142,202,0): 45, 49, 48, + (142,203,0): 46, 50, 49, + (142,204,0): 46, 50, 51, + (142,205,0): 46, 50, 51, + (142,206,0): 45, 49, 50, + (142,207,0): 43, 49, 45, + (142,208,0): 43, 57, 42, + (142,209,0): 47, 64, 45, + (142,210,0): 54, 72, 50, + (142,211,0): 59, 77, 55, + (142,212,0): 61, 79, 55, + (142,213,0): 60, 78, 52, + (142,214,0): 58, 76, 50, + (142,215,0): 58, 76, 50, + (142,216,0): 53, 71, 47, + (142,217,0): 55, 73, 49, + (142,218,0): 58, 76, 54, + (142,219,0): 60, 77, 58, + (142,220,0): 58, 75, 57, + (142,221,0): 54, 71, 55, + (142,222,0): 48, 64, 51, + (142,223,0): 45, 59, 46, + (142,224,0): 45, 55, 46, + (142,225,0): 46, 53, 45, + (142,226,0): 45, 52, 44, + (143,0,0): 99, 100, 82, + (143,1,0): 99, 100, 82, + (143,2,0): 100, 101, 83, + (143,3,0): 101, 102, 84, + (143,4,0): 101, 102, 86, + (143,5,0): 104, 102, 87, + (143,6,0): 105, 103, 88, + (143,7,0): 105, 103, 88, + (143,8,0): 104, 102, 87, + (143,9,0): 105, 102, 87, + (143,10,0): 105, 102, 87, + (143,11,0): 105, 102, 87, + (143,12,0): 105, 102, 87, + (143,13,0): 105, 102, 87, + (143,14,0): 105, 102, 87, + (143,15,0): 107, 101, 87, + (143,16,0): 107, 101, 87, + (143,17,0): 107, 101, 87, + (143,18,0): 108, 100, 89, + (143,19,0): 108, 101, 91, + (143,20,0): 109, 100, 93, + (143,21,0): 109, 102, 92, + (143,22,0): 107, 103, 91, + (143,23,0): 106, 105, 87, + (143,24,0): 105, 107, 86, + (143,25,0): 104, 109, 87, + (143,26,0): 104, 114, 90, + (143,27,0): 103, 116, 96, + (143,28,0): 100, 113, 103, + (143,29,0): 106, 123, 117, + (143,30,0): 137, 155, 157, + (143,31,0): 170, 187, 194, + (143,32,0): 205, 216, 222, + (143,33,0): 223, 232, 239, + (143,34,0): 242, 249, 255, + (143,35,0): 250, 255, 255, + (143,36,0): 251, 255, 255, + (143,37,0): 253, 255, 254, + (143,38,0): 254, 255, 250, + (143,39,0): 254, 254, 246, + (143,40,0): 250, 250, 238, + (143,41,0): 250, 251, 237, + (143,42,0): 250, 251, 233, + (143,43,0): 248, 250, 229, + (143,44,0): 244, 246, 225, + (143,45,0): 234, 238, 215, + (143,46,0): 223, 227, 202, + (143,47,0): 217, 219, 195, + (143,48,0): 211, 209, 184, + (143,49,0): 204, 199, 177, + (143,50,0): 197, 190, 172, + (143,51,0): 198, 190, 177, + (143,52,0): 204, 195, 188, + (143,53,0): 214, 206, 204, + (143,54,0): 230, 221, 224, + (143,55,0): 244, 234, 242, + (143,56,0): 253, 246, 254, + (143,57,0): 254, 249, 255, + (143,58,0): 255, 253, 255, + (143,59,0): 254, 254, 255, + (143,60,0): 253, 253, 251, + (143,61,0): 252, 254, 249, + (143,62,0): 251, 255, 249, + (143,63,0): 252, 255, 250, + (143,64,0): 253, 255, 252, + (143,65,0): 254, 254, 252, + (143,66,0): 254, 254, 252, + (143,67,0): 254, 254, 252, + (143,68,0): 254, 254, 252, + (143,69,0): 254, 254, 252, + (143,70,0): 254, 254, 252, + (143,71,0): 254, 254, 252, + (143,72,0): 254, 254, 252, + (143,73,0): 254, 254, 252, + (143,74,0): 254, 254, 252, + (143,75,0): 254, 254, 252, + (143,76,0): 255, 254, 252, + (143,77,0): 255, 254, 252, + (143,78,0): 255, 254, 252, + (143,79,0): 255, 253, 254, + (143,80,0): 255, 250, 255, + (143,81,0): 255, 251, 255, + (143,82,0): 254, 252, 255, + (143,83,0): 252, 254, 253, + (143,84,0): 249, 255, 251, + (143,85,0): 246, 255, 247, + (143,86,0): 244, 255, 244, + (143,87,0): 243, 255, 241, + (143,88,0): 242, 254, 240, + (143,89,0): 245, 255, 242, + (143,90,0): 250, 255, 246, + (143,91,0): 254, 255, 250, + (143,92,0): 255, 252, 251, + (143,93,0): 255, 249, 252, + (143,94,0): 255, 247, 255, + (143,95,0): 255, 246, 255, + (143,96,0): 255, 248, 255, + (143,97,0): 255, 247, 255, + (143,98,0): 255, 249, 255, + (143,99,0): 255, 252, 255, + (143,100,0): 253, 252, 255, + (143,101,0): 251, 253, 252, + (143,102,0): 250, 255, 251, + (143,103,0): 252, 255, 250, + (143,104,0): 244, 250, 240, + (143,105,0): 244, 250, 238, + (143,106,0): 247, 249, 236, + (143,107,0): 247, 248, 234, + (143,108,0): 248, 246, 231, + (143,109,0): 251, 248, 231, + (143,110,0): 255, 250, 234, + (143,111,0): 255, 253, 234, + (143,112,0): 253, 241, 219, + (143,113,0): 255, 251, 228, + (143,114,0): 236, 220, 197, + (143,115,0): 158, 142, 119, + (143,116,0): 96, 80, 55, + (143,117,0): 82, 66, 41, + (143,118,0): 88, 72, 47, + (143,119,0): 88, 72, 47, + (143,120,0): 91, 77, 51, + (143,121,0): 91, 77, 51, + (143,122,0): 90, 78, 52, + (143,123,0): 90, 78, 52, + (143,124,0): 91, 79, 53, + (143,125,0): 91, 79, 53, + (143,126,0): 92, 80, 54, + (143,127,0): 91, 81, 56, + (143,128,0): 85, 79, 55, + (143,129,0): 84, 79, 57, + (143,130,0): 84, 79, 57, + (143,131,0): 81, 79, 56, + (143,132,0): 80, 78, 55, + (143,133,0): 78, 78, 54, + (143,134,0): 75, 77, 53, + (143,135,0): 73, 77, 52, + (143,136,0): 74, 78, 53, + (143,137,0): 76, 82, 56, + (143,138,0): 83, 92, 65, + (143,139,0): 80, 89, 60, + (143,140,0): 64, 73, 44, + (143,141,0): 59, 70, 40, + (143,142,0): 65, 76, 46, + (143,143,0): 63, 74, 42, + (143,144,0): 67, 78, 46, + (143,145,0): 68, 79, 47, + (143,146,0): 72, 81, 50, + (143,147,0): 76, 83, 50, + (143,148,0): 73, 78, 48, + (143,149,0): 74, 77, 46, + (143,150,0): 89, 90, 59, + (143,151,0): 107, 106, 78, + (143,152,0): 102, 101, 73, + (143,153,0): 98, 94, 69, + (143,154,0): 94, 89, 67, + (143,155,0): 95, 90, 70, + (143,156,0): 96, 91, 71, + (143,157,0): 90, 85, 66, + (143,158,0): 83, 78, 59, + (143,159,0): 76, 73, 56, + (143,160,0): 65, 66, 52, + (143,161,0): 64, 66, 53, + (143,162,0): 64, 66, 53, + (143,163,0): 62, 65, 54, + (143,164,0): 62, 65, 54, + (143,165,0): 62, 65, 54, + (143,166,0): 61, 64, 55, + (143,167,0): 61, 64, 55, + (143,168,0): 57, 63, 53, + (143,169,0): 57, 63, 53, + (143,170,0): 57, 63, 53, + (143,171,0): 58, 64, 54, + (143,172,0): 58, 64, 54, + (143,173,0): 58, 66, 55, + (143,174,0): 58, 66, 55, + (143,175,0): 58, 66, 55, + (143,176,0): 59, 64, 57, + (143,177,0): 59, 64, 57, + (143,178,0): 59, 64, 58, + (143,179,0): 58, 63, 56, + (143,180,0): 58, 63, 57, + (143,181,0): 57, 62, 55, + (143,182,0): 57, 62, 56, + (143,183,0): 57, 62, 55, + (143,184,0): 59, 64, 58, + (143,185,0): 59, 64, 57, + (143,186,0): 59, 64, 58, + (143,187,0): 59, 64, 57, + (143,188,0): 58, 63, 57, + (143,189,0): 58, 63, 56, + (143,190,0): 58, 63, 57, + (143,191,0): 58, 63, 57, + (143,192,0): 56, 63, 56, + (143,193,0): 55, 61, 57, + (143,194,0): 52, 59, 52, + (143,195,0): 51, 56, 50, + (143,196,0): 49, 54, 48, + (143,197,0): 47, 52, 46, + (143,198,0): 46, 51, 47, + (143,199,0): 46, 51, 47, + (143,200,0): 46, 50, 49, + (143,201,0): 46, 50, 49, + (143,202,0): 44, 50, 46, + (143,203,0): 44, 50, 46, + (143,204,0): 43, 50, 43, + (143,205,0): 43, 50, 42, + (143,206,0): 44, 52, 41, + (143,207,0): 41, 54, 37, + (143,208,0): 36, 54, 30, + (143,209,0): 41, 61, 33, + (143,210,0): 50, 70, 43, + (143,211,0): 56, 76, 49, + (143,212,0): 59, 79, 54, + (143,213,0): 59, 77, 53, + (143,214,0): 59, 77, 53, + (143,215,0): 59, 77, 53, + (143,216,0): 56, 74, 50, + (143,217,0): 57, 75, 51, + (143,218,0): 59, 77, 53, + (143,219,0): 60, 78, 54, + (143,220,0): 60, 78, 56, + (143,221,0): 55, 72, 53, + (143,222,0): 49, 66, 48, + (143,223,0): 46, 60, 45, + (143,224,0): 46, 56, 45, + (143,225,0): 47, 54, 46, + (143,226,0): 46, 53, 45, + (144,0,0): 92, 102, 78, + (144,1,0): 93, 103, 79, + (144,2,0): 95, 103, 80, + (144,3,0): 96, 104, 81, + (144,4,0): 98, 106, 85, + (144,5,0): 101, 106, 86, + (144,6,0): 103, 106, 87, + (144,7,0): 104, 107, 88, + (144,8,0): 102, 103, 85, + (144,9,0): 104, 103, 85, + (144,10,0): 104, 101, 86, + (144,11,0): 104, 101, 86, + (144,12,0): 106, 100, 86, + (144,13,0): 107, 101, 87, + (144,14,0): 107, 101, 89, + (144,15,0): 108, 102, 88, + (144,16,0): 107, 101, 87, + (144,17,0): 106, 103, 88, + (144,18,0): 109, 103, 91, + (144,19,0): 108, 104, 93, + (144,20,0): 109, 102, 94, + (144,21,0): 106, 102, 91, + (144,22,0): 104, 100, 88, + (144,23,0): 102, 100, 85, + (144,24,0): 102, 103, 85, + (144,25,0): 103, 108, 86, + (144,26,0): 102, 111, 90, + (144,27,0): 98, 111, 93, + (144,28,0): 99, 112, 103, + (144,29,0): 114, 130, 127, + (144,30,0): 150, 168, 172, + (144,31,0): 185, 199, 208, + (144,32,0): 209, 219, 228, + (144,33,0): 224, 233, 240, + (144,34,0): 240, 247, 253, + (144,35,0): 247, 252, 255, + (144,36,0): 247, 253, 251, + (144,37,0): 250, 255, 251, + (144,38,0): 252, 255, 248, + (144,39,0): 252, 254, 243, + (144,40,0): 248, 249, 235, + (144,41,0): 250, 251, 235, + (144,42,0): 249, 248, 230, + (144,43,0): 243, 240, 221, + (144,44,0): 239, 236, 217, + (144,45,0): 236, 233, 214, + (144,46,0): 224, 222, 201, + (144,47,0): 214, 209, 189, + (144,48,0): 216, 208, 189, + (144,49,0): 203, 191, 175, + (144,50,0): 188, 179, 164, + (144,51,0): 188, 178, 169, + (144,52,0): 195, 184, 180, + (144,53,0): 205, 195, 196, + (144,54,0): 219, 210, 215, + (144,55,0): 233, 223, 231, + (144,56,0): 250, 243, 251, + (144,57,0): 253, 248, 255, + (144,58,0): 254, 251, 255, + (144,59,0): 255, 254, 255, + (144,60,0): 254, 254, 255, + (144,61,0): 252, 254, 253, + (144,62,0): 251, 253, 250, + (144,63,0): 252, 254, 251, + (144,64,0): 254, 254, 254, + (144,65,0): 254, 254, 254, + (144,66,0): 254, 254, 254, + (144,67,0): 254, 254, 254, + (144,68,0): 254, 254, 254, + (144,69,0): 254, 254, 254, + (144,70,0): 255, 254, 252, + (144,71,0): 255, 254, 252, + (144,72,0): 255, 255, 253, + (144,73,0): 255, 255, 253, + (144,74,0): 255, 255, 251, + (144,75,0): 255, 254, 250, + (144,76,0): 255, 253, 250, + (144,77,0): 255, 252, 249, + (144,78,0): 255, 252, 249, + (144,79,0): 255, 252, 249, + (144,80,0): 255, 254, 255, + (144,81,0): 255, 253, 254, + (144,82,0): 253, 253, 253, + (144,83,0): 253, 253, 253, + (144,84,0): 254, 255, 255, + (144,85,0): 254, 255, 253, + (144,86,0): 251, 255, 252, + (144,87,0): 249, 254, 248, + (144,88,0): 253, 255, 250, + (144,89,0): 251, 252, 246, + (144,90,0): 253, 252, 247, + (144,91,0): 255, 255, 250, + (144,92,0): 255, 254, 248, + (144,93,0): 255, 249, 244, + (144,94,0): 255, 247, 243, + (144,95,0): 255, 250, 249, + (144,96,0): 255, 251, 255, + (144,97,0): 255, 252, 255, + (144,98,0): 254, 253, 255, + (144,99,0): 254, 255, 255, + (144,100,0): 254, 255, 255, + (144,101,0): 251, 255, 252, + (144,102,0): 251, 255, 252, + (144,103,0): 250, 254, 253, + (144,104,0): 252, 255, 255, + (144,105,0): 252, 255, 255, + (144,106,0): 255, 255, 253, + (144,107,0): 255, 254, 249, + (144,108,0): 255, 254, 242, + (144,109,0): 255, 254, 237, + (144,110,0): 255, 254, 234, + (144,111,0): 255, 254, 232, + (144,112,0): 251, 245, 223, + (144,113,0): 255, 252, 230, + (144,114,0): 233, 225, 202, + (144,115,0): 145, 137, 114, + (144,116,0): 86, 79, 53, + (144,117,0): 88, 78, 51, + (144,118,0): 85, 76, 47, + (144,119,0): 83, 74, 45, + (144,120,0): 87, 78, 49, + (144,121,0): 87, 78, 49, + (144,122,0): 85, 78, 49, + (144,123,0): 85, 78, 49, + (144,124,0): 84, 79, 50, + (144,125,0): 84, 79, 50, + (144,126,0): 84, 78, 52, + (144,127,0): 83, 79, 52, + (144,128,0): 81, 77, 50, + (144,129,0): 82, 78, 53, + (144,130,0): 80, 78, 53, + (144,131,0): 80, 80, 54, + (144,132,0): 77, 79, 55, + (144,133,0): 75, 79, 54, + (144,134,0): 72, 77, 54, + (144,135,0): 71, 76, 53, + (144,136,0): 74, 80, 54, + (144,137,0): 70, 79, 52, + (144,138,0): 65, 74, 45, + (144,139,0): 61, 70, 39, + (144,140,0): 62, 72, 38, + (144,141,0): 68, 75, 42, + (144,142,0): 70, 77, 43, + (144,143,0): 68, 78, 41, + (144,144,0): 77, 88, 48, + (144,145,0): 75, 87, 47, + (144,146,0): 70, 81, 41, + (144,147,0): 67, 77, 40, + (144,148,0): 79, 86, 52, + (144,149,0): 94, 99, 67, + (144,150,0): 96, 99, 68, + (144,151,0): 90, 90, 62, + (144,152,0): 89, 89, 63, + (144,153,0): 91, 89, 66, + (144,154,0): 95, 90, 68, + (144,155,0): 95, 90, 70, + (144,156,0): 95, 88, 69, + (144,157,0): 92, 85, 66, + (144,158,0): 88, 81, 62, + (144,159,0): 85, 78, 59, + (144,160,0): 75, 70, 51, + (144,161,0): 71, 68, 49, + (144,162,0): 68, 65, 48, + (144,163,0): 65, 63, 48, + (144,164,0): 64, 62, 49, + (144,165,0): 62, 62, 50, + (144,166,0): 63, 63, 53, + (144,167,0): 63, 65, 54, + (144,168,0): 60, 63, 54, + (144,169,0): 58, 64, 54, + (144,170,0): 58, 64, 54, + (144,171,0): 57, 65, 54, + (144,172,0): 57, 65, 52, + (144,173,0): 55, 66, 52, + (144,174,0): 55, 66, 52, + (144,175,0): 55, 66, 52, + (144,176,0): 58, 66, 55, + (144,177,0): 57, 65, 54, + (144,178,0): 57, 64, 56, + (144,179,0): 56, 64, 53, + (144,180,0): 56, 63, 55, + (144,181,0): 57, 65, 54, + (144,182,0): 57, 64, 56, + (144,183,0): 58, 66, 55, + (144,184,0): 58, 65, 57, + (144,185,0): 58, 66, 55, + (144,186,0): 57, 64, 56, + (144,187,0): 58, 66, 55, + (144,188,0): 59, 66, 58, + (144,189,0): 60, 68, 57, + (144,190,0): 61, 68, 60, + (144,191,0): 62, 69, 61, + (144,192,0): 56, 66, 58, + (144,193,0): 55, 65, 57, + (144,194,0): 55, 65, 56, + (144,195,0): 55, 63, 52, + (144,196,0): 53, 61, 48, + (144,197,0): 51, 59, 46, + (144,198,0): 50, 56, 46, + (144,199,0): 49, 54, 48, + (144,200,0): 46, 52, 48, + (144,201,0): 47, 53, 49, + (144,202,0): 45, 55, 47, + (144,203,0): 45, 57, 45, + (144,204,0): 46, 59, 41, + (144,205,0): 48, 64, 38, + (144,206,0): 54, 71, 39, + (144,207,0): 55, 77, 39, + (144,208,0): 59, 86, 43, + (144,209,0): 59, 88, 44, + (144,210,0): 60, 86, 49, + (144,211,0): 59, 84, 52, + (144,212,0): 59, 82, 56, + (144,213,0): 60, 79, 57, + (144,214,0): 61, 78, 59, + (144,215,0): 61, 79, 57, + (144,216,0): 58, 76, 54, + (144,217,0): 63, 81, 55, + (144,218,0): 68, 86, 60, + (144,219,0): 68, 87, 59, + (144,220,0): 67, 87, 60, + (144,221,0): 64, 84, 59, + (144,222,0): 55, 74, 52, + (144,223,0): 46, 63, 44, + (144,224,0): 45, 55, 44, + (144,225,0): 44, 51, 43, + (144,226,0): 41, 48, 40, + (145,0,0): 89, 103, 77, + (145,1,0): 90, 104, 78, + (145,2,0): 92, 104, 80, + (145,3,0): 93, 105, 81, + (145,4,0): 97, 107, 83, + (145,5,0): 98, 108, 84, + (145,6,0): 103, 108, 88, + (145,7,0): 103, 108, 88, + (145,8,0): 103, 104, 86, + (145,9,0): 103, 104, 86, + (145,10,0): 105, 102, 87, + (145,11,0): 105, 102, 87, + (145,12,0): 107, 101, 87, + (145,13,0): 108, 102, 88, + (145,14,0): 109, 101, 90, + (145,15,0): 109, 103, 89, + (145,16,0): 108, 102, 88, + (145,17,0): 106, 103, 88, + (145,18,0): 107, 103, 91, + (145,19,0): 108, 104, 93, + (145,20,0): 107, 103, 94, + (145,21,0): 106, 102, 91, + (145,22,0): 104, 102, 90, + (145,23,0): 101, 102, 86, + (145,24,0): 104, 105, 87, + (145,25,0): 103, 108, 86, + (145,26,0): 103, 112, 93, + (145,27,0): 102, 115, 98, + (145,28,0): 106, 119, 110, + (145,29,0): 121, 137, 136, + (145,30,0): 156, 171, 178, + (145,31,0): 186, 200, 209, + (145,32,0): 208, 218, 227, + (145,33,0): 224, 233, 238, + (145,34,0): 240, 247, 253, + (145,35,0): 246, 254, 255, + (145,36,0): 249, 255, 253, + (145,37,0): 249, 255, 249, + (145,38,0): 251, 254, 245, + (145,39,0): 249, 253, 239, + (145,40,0): 249, 250, 236, + (145,41,0): 248, 249, 231, + (145,42,0): 246, 243, 226, + (145,43,0): 238, 235, 216, + (145,44,0): 235, 230, 211, + (145,45,0): 230, 225, 206, + (145,46,0): 221, 214, 196, + (145,47,0): 210, 201, 184, + (145,48,0): 203, 191, 175, + (145,49,0): 193, 179, 166, + (145,50,0): 184, 172, 160, + (145,51,0): 187, 174, 166, + (145,52,0): 194, 183, 181, + (145,53,0): 205, 195, 196, + (145,54,0): 219, 208, 214, + (145,55,0): 228, 221, 228, + (145,56,0): 251, 243, 254, + (145,57,0): 253, 247, 255, + (145,58,0): 254, 251, 255, + (145,59,0): 255, 254, 255, + (145,60,0): 254, 253, 255, + (145,61,0): 252, 253, 255, + (145,62,0): 252, 254, 253, + (145,63,0): 252, 254, 253, + (145,64,0): 254, 254, 254, + (145,65,0): 254, 254, 254, + (145,66,0): 254, 254, 254, + (145,67,0): 254, 254, 254, + (145,68,0): 254, 254, 254, + (145,69,0): 254, 254, 254, + (145,70,0): 255, 254, 252, + (145,71,0): 255, 254, 252, + (145,72,0): 255, 255, 253, + (145,73,0): 255, 255, 253, + (145,74,0): 255, 253, 250, + (145,75,0): 255, 253, 250, + (145,76,0): 255, 253, 250, + (145,77,0): 255, 252, 249, + (145,78,0): 255, 252, 248, + (145,79,0): 255, 253, 248, + (145,80,0): 255, 254, 253, + (145,81,0): 255, 254, 252, + (145,82,0): 253, 253, 253, + (145,83,0): 253, 253, 253, + (145,84,0): 255, 255, 255, + (145,85,0): 255, 255, 255, + (145,86,0): 254, 254, 254, + (145,87,0): 253, 253, 253, + (145,88,0): 255, 255, 253, + (145,89,0): 255, 255, 251, + (145,90,0): 255, 252, 249, + (145,91,0): 254, 247, 241, + (145,92,0): 245, 236, 229, + (145,93,0): 238, 228, 219, + (145,94,0): 244, 231, 222, + (145,95,0): 250, 241, 234, + (145,96,0): 255, 252, 253, + (145,97,0): 254, 254, 255, + (145,98,0): 253, 255, 254, + (145,99,0): 254, 255, 253, + (145,100,0): 252, 255, 251, + (145,101,0): 251, 255, 250, + (145,102,0): 251, 255, 254, + (145,103,0): 250, 254, 255, + (145,104,0): 252, 255, 255, + (145,105,0): 252, 255, 255, + (145,106,0): 255, 254, 255, + (145,107,0): 254, 254, 252, + (145,108,0): 255, 253, 244, + (145,109,0): 255, 254, 236, + (145,110,0): 255, 253, 231, + (145,111,0): 255, 254, 229, + (145,112,0): 248, 246, 223, + (145,113,0): 254, 252, 231, + (145,114,0): 229, 224, 202, + (145,115,0): 141, 137, 112, + (145,116,0): 83, 77, 51, + (145,117,0): 84, 79, 50, + (145,118,0): 82, 75, 46, + (145,119,0): 81, 74, 45, + (145,120,0): 85, 79, 47, + (145,121,0): 85, 79, 47, + (145,122,0): 84, 79, 49, + (145,123,0): 84, 79, 49, + (145,124,0): 83, 79, 50, + (145,125,0): 83, 79, 50, + (145,126,0): 81, 80, 52, + (145,127,0): 81, 80, 52, + (145,128,0): 81, 77, 50, + (145,129,0): 79, 78, 50, + (145,130,0): 80, 78, 53, + (145,131,0): 78, 81, 54, + (145,132,0): 77, 79, 55, + (145,133,0): 74, 80, 54, + (145,134,0): 72, 77, 54, + (145,135,0): 69, 77, 53, + (145,136,0): 71, 80, 53, + (145,137,0): 69, 78, 49, + (145,138,0): 65, 74, 45, + (145,139,0): 63, 73, 39, + (145,140,0): 66, 73, 40, + (145,141,0): 70, 77, 43, + (145,142,0): 74, 80, 44, + (145,143,0): 74, 82, 43, + (145,144,0): 75, 86, 43, + (145,145,0): 75, 88, 42, + (145,146,0): 82, 93, 51, + (145,147,0): 89, 100, 60, + (145,148,0): 93, 101, 64, + (145,149,0): 87, 94, 60, + (145,150,0): 83, 88, 58, + (145,151,0): 83, 86, 57, + (145,152,0): 85, 85, 61, + (145,153,0): 86, 86, 62, + (145,154,0): 90, 85, 65, + (145,155,0): 91, 86, 66, + (145,156,0): 92, 85, 66, + (145,157,0): 92, 84, 65, + (145,158,0): 90, 82, 61, + (145,159,0): 89, 81, 60, + (145,160,0): 82, 76, 54, + (145,161,0): 80, 74, 52, + (145,162,0): 75, 70, 51, + (145,163,0): 72, 67, 48, + (145,164,0): 67, 64, 49, + (145,165,0): 65, 63, 50, + (145,166,0): 66, 64, 52, + (145,167,0): 63, 65, 54, + (145,168,0): 61, 62, 54, + (145,169,0): 58, 64, 54, + (145,170,0): 58, 64, 54, + (145,171,0): 57, 65, 54, + (145,172,0): 55, 66, 52, + (145,173,0): 55, 66, 52, + (145,174,0): 54, 67, 50, + (145,175,0): 54, 67, 50, + (145,176,0): 58, 66, 55, + (145,177,0): 57, 65, 54, + (145,178,0): 57, 65, 54, + (145,179,0): 56, 64, 53, + (145,180,0): 56, 64, 53, + (145,181,0): 57, 65, 54, + (145,182,0): 57, 65, 54, + (145,183,0): 58, 66, 55, + (145,184,0): 58, 66, 55, + (145,185,0): 58, 66, 55, + (145,186,0): 58, 66, 55, + (145,187,0): 58, 66, 55, + (145,188,0): 59, 67, 56, + (145,189,0): 60, 68, 57, + (145,190,0): 61, 69, 58, + (145,191,0): 60, 70, 59, + (145,192,0): 61, 71, 63, + (145,193,0): 60, 72, 62, + (145,194,0): 60, 70, 59, + (145,195,0): 60, 71, 55, + (145,196,0): 60, 68, 53, + (145,197,0): 58, 66, 51, + (145,198,0): 57, 63, 51, + (145,199,0): 56, 61, 54, + (145,200,0): 55, 62, 55, + (145,201,0): 52, 62, 54, + (145,202,0): 51, 61, 52, + (145,203,0): 48, 62, 45, + (145,204,0): 51, 67, 41, + (145,205,0): 57, 77, 42, + (145,206,0): 66, 89, 47, + (145,207,0): 71, 97, 49, + (145,208,0): 79, 112, 59, + (145,209,0): 76, 110, 59, + (145,210,0): 76, 105, 61, + (145,211,0): 70, 97, 62, + (145,212,0): 66, 89, 63, + (145,213,0): 60, 82, 61, + (145,214,0): 59, 76, 58, + (145,215,0): 58, 75, 56, + (145,216,0): 61, 79, 57, + (145,217,0): 68, 86, 60, + (145,218,0): 74, 93, 65, + (145,219,0): 76, 95, 65, + (145,220,0): 75, 95, 67, + (145,221,0): 72, 92, 64, + (145,222,0): 60, 83, 57, + (145,223,0): 51, 70, 48, + (145,224,0): 43, 53, 42, + (145,225,0): 43, 50, 42, + (145,226,0): 40, 47, 39, + (146,0,0): 89, 103, 77, + (146,1,0): 90, 104, 78, + (146,2,0): 92, 104, 80, + (146,3,0): 94, 106, 82, + (146,4,0): 97, 107, 83, + (146,5,0): 99, 109, 85, + (146,6,0): 103, 108, 88, + (146,7,0): 104, 109, 89, + (146,8,0): 105, 106, 88, + (146,9,0): 105, 106, 88, + (146,10,0): 107, 104, 89, + (146,11,0): 107, 104, 89, + (146,12,0): 108, 102, 88, + (146,13,0): 109, 103, 89, + (146,14,0): 110, 102, 91, + (146,15,0): 110, 104, 90, + (146,16,0): 108, 102, 88, + (146,17,0): 107, 104, 89, + (146,18,0): 107, 103, 91, + (146,19,0): 107, 103, 92, + (146,20,0): 107, 103, 94, + (146,21,0): 106, 102, 91, + (146,22,0): 104, 102, 90, + (146,23,0): 101, 102, 86, + (146,24,0): 104, 105, 87, + (146,25,0): 101, 106, 84, + (146,26,0): 100, 109, 90, + (146,27,0): 103, 116, 99, + (146,28,0): 111, 124, 115, + (146,29,0): 127, 143, 142, + (146,30,0): 157, 172, 179, + (146,31,0): 182, 196, 205, + (146,32,0): 204, 214, 223, + (146,33,0): 221, 230, 235, + (146,34,0): 239, 246, 252, + (146,35,0): 246, 254, 255, + (146,36,0): 249, 255, 253, + (146,37,0): 248, 255, 248, + (146,38,0): 248, 251, 242, + (146,39,0): 245, 249, 235, + (146,40,0): 244, 245, 231, + (146,41,0): 241, 242, 224, + (146,42,0): 236, 233, 216, + (146,43,0): 226, 223, 204, + (146,44,0): 222, 217, 198, + (146,45,0): 216, 211, 192, + (146,46,0): 208, 201, 183, + (146,47,0): 199, 190, 173, + (146,48,0): 192, 180, 164, + (146,49,0): 188, 174, 161, + (146,50,0): 187, 175, 163, + (146,51,0): 194, 181, 173, + (146,52,0): 204, 193, 191, + (146,53,0): 215, 205, 206, + (146,54,0): 227, 216, 222, + (146,55,0): 234, 227, 234, + (146,56,0): 251, 243, 254, + (146,57,0): 253, 247, 255, + (146,58,0): 254, 251, 255, + (146,59,0): 254, 253, 255, + (146,60,0): 253, 252, 255, + (146,61,0): 252, 253, 255, + (146,62,0): 252, 254, 253, + (146,63,0): 253, 255, 254, + (146,64,0): 254, 254, 254, + (146,65,0): 254, 254, 254, + (146,66,0): 254, 254, 254, + (146,67,0): 254, 254, 254, + (146,68,0): 254, 254, 254, + (146,69,0): 254, 254, 254, + (146,70,0): 255, 254, 252, + (146,71,0): 255, 254, 252, + (146,72,0): 255, 255, 253, + (146,73,0): 255, 254, 252, + (146,74,0): 255, 253, 250, + (146,75,0): 255, 253, 250, + (146,76,0): 255, 252, 249, + (146,77,0): 255, 252, 249, + (146,78,0): 255, 252, 248, + (146,79,0): 255, 253, 248, + (146,80,0): 255, 254, 253, + (146,81,0): 254, 253, 251, + (146,82,0): 252, 252, 252, + (146,83,0): 253, 253, 253, + (146,84,0): 254, 254, 254, + (146,85,0): 255, 255, 255, + (146,86,0): 254, 254, 254, + (146,87,0): 253, 253, 253, + (146,88,0): 255, 255, 253, + (146,89,0): 255, 255, 251, + (146,90,0): 255, 253, 250, + (146,91,0): 249, 242, 236, + (146,92,0): 232, 223, 216, + (146,93,0): 223, 213, 204, + (146,94,0): 234, 221, 212, + (146,95,0): 246, 237, 230, + (146,96,0): 255, 252, 253, + (146,97,0): 254, 254, 255, + (146,98,0): 253, 255, 254, + (146,99,0): 254, 255, 253, + (146,100,0): 252, 255, 251, + (146,101,0): 251, 255, 250, + (146,102,0): 251, 255, 254, + (146,103,0): 250, 254, 255, + (146,104,0): 252, 255, 255, + (146,105,0): 252, 255, 255, + (146,106,0): 255, 254, 255, + (146,107,0): 254, 254, 252, + (146,108,0): 255, 253, 244, + (146,109,0): 255, 254, 236, + (146,110,0): 255, 253, 231, + (146,111,0): 255, 254, 229, + (146,112,0): 249, 247, 224, + (146,113,0): 254, 252, 231, + (146,114,0): 228, 223, 201, + (146,115,0): 138, 134, 109, + (146,116,0): 80, 74, 48, + (146,117,0): 82, 77, 48, + (146,118,0): 82, 75, 46, + (146,119,0): 82, 75, 46, + (146,120,0): 84, 78, 46, + (146,121,0): 85, 79, 47, + (146,122,0): 84, 79, 49, + (146,123,0): 85, 80, 50, + (146,124,0): 84, 80, 51, + (146,125,0): 83, 79, 50, + (146,126,0): 81, 80, 52, + (146,127,0): 80, 79, 51, + (146,128,0): 81, 77, 50, + (146,129,0): 79, 78, 50, + (146,130,0): 80, 78, 53, + (146,131,0): 77, 80, 53, + (146,132,0): 77, 79, 55, + (146,133,0): 74, 80, 54, + (146,134,0): 73, 78, 55, + (146,135,0): 70, 78, 54, + (146,136,0): 72, 81, 54, + (146,137,0): 69, 78, 49, + (146,138,0): 67, 76, 47, + (146,139,0): 66, 76, 42, + (146,140,0): 70, 77, 44, + (146,141,0): 73, 80, 46, + (146,142,0): 79, 85, 49, + (146,143,0): 81, 89, 50, + (146,144,0): 80, 91, 48, + (146,145,0): 85, 98, 52, + (146,146,0): 103, 116, 73, + (146,147,0): 119, 130, 90, + (146,148,0): 112, 120, 83, + (146,149,0): 88, 95, 61, + (146,150,0): 76, 81, 51, + (146,151,0): 78, 81, 52, + (146,152,0): 80, 80, 56, + (146,153,0): 81, 81, 57, + (146,154,0): 84, 79, 59, + (146,155,0): 85, 80, 60, + (146,156,0): 87, 80, 61, + (146,157,0): 88, 81, 62, + (146,158,0): 91, 83, 62, + (146,159,0): 92, 84, 63, + (146,160,0): 89, 83, 61, + (146,161,0): 86, 80, 58, + (146,162,0): 81, 76, 57, + (146,163,0): 77, 72, 53, + (146,164,0): 71, 68, 53, + (146,165,0): 68, 66, 53, + (146,166,0): 67, 65, 53, + (146,167,0): 63, 65, 54, + (146,168,0): 61, 62, 54, + (146,169,0): 58, 64, 54, + (146,170,0): 58, 64, 54, + (146,171,0): 57, 65, 54, + (146,172,0): 55, 66, 52, + (146,173,0): 55, 66, 52, + (146,174,0): 54, 67, 50, + (146,175,0): 54, 67, 50, + (146,176,0): 58, 66, 55, + (146,177,0): 58, 66, 55, + (146,178,0): 57, 65, 54, + (146,179,0): 57, 65, 54, + (146,180,0): 57, 65, 54, + (146,181,0): 57, 65, 54, + (146,182,0): 58, 66, 55, + (146,183,0): 58, 66, 55, + (146,184,0): 58, 66, 55, + (146,185,0): 58, 66, 55, + (146,186,0): 58, 66, 55, + (146,187,0): 58, 66, 55, + (146,188,0): 59, 67, 56, + (146,189,0): 60, 68, 57, + (146,190,0): 62, 70, 59, + (146,191,0): 60, 70, 59, + (146,192,0): 64, 74, 66, + (146,193,0): 63, 75, 65, + (146,194,0): 64, 74, 63, + (146,195,0): 64, 75, 59, + (146,196,0): 65, 73, 58, + (146,197,0): 63, 71, 56, + (146,198,0): 63, 69, 57, + (146,199,0): 62, 67, 60, + (146,200,0): 62, 69, 62, + (146,201,0): 57, 67, 59, + (146,202,0): 54, 64, 55, + (146,203,0): 52, 66, 49, + (146,204,0): 57, 73, 47, + (146,205,0): 66, 86, 51, + (146,206,0): 80, 103, 61, + (146,207,0): 88, 114, 66, + (146,208,0): 94, 127, 74, + (146,209,0): 91, 125, 74, + (146,210,0): 87, 116, 72, + (146,211,0): 77, 104, 69, + (146,212,0): 67, 90, 64, + (146,213,0): 57, 79, 58, + (146,214,0): 54, 71, 53, + (146,215,0): 52, 69, 50, + (146,216,0): 60, 78, 56, + (146,217,0): 69, 87, 61, + (146,218,0): 77, 96, 68, + (146,219,0): 82, 101, 71, + (146,220,0): 82, 102, 74, + (146,221,0): 78, 98, 70, + (146,222,0): 65, 88, 62, + (146,223,0): 56, 75, 53, + (146,224,0): 47, 57, 46, + (146,225,0): 47, 54, 46, + (146,226,0): 44, 51, 43, + (147,0,0): 89, 103, 77, + (147,1,0): 90, 104, 78, + (147,2,0): 92, 104, 80, + (147,3,0): 94, 106, 82, + (147,4,0): 98, 108, 84, + (147,5,0): 100, 110, 86, + (147,6,0): 104, 109, 89, + (147,7,0): 105, 110, 90, + (147,8,0): 107, 108, 90, + (147,9,0): 107, 108, 90, + (147,10,0): 109, 106, 91, + (147,11,0): 108, 105, 90, + (147,12,0): 110, 104, 90, + (147,13,0): 110, 104, 90, + (147,14,0): 111, 103, 92, + (147,15,0): 111, 105, 91, + (147,16,0): 109, 103, 89, + (147,17,0): 107, 104, 89, + (147,18,0): 107, 103, 91, + (147,19,0): 107, 103, 92, + (147,20,0): 106, 102, 93, + (147,21,0): 106, 102, 91, + (147,22,0): 104, 102, 90, + (147,23,0): 102, 103, 87, + (147,24,0): 102, 103, 85, + (147,25,0): 97, 102, 80, + (147,26,0): 95, 104, 85, + (147,27,0): 100, 113, 96, + (147,28,0): 112, 125, 116, + (147,29,0): 127, 143, 142, + (147,30,0): 151, 166, 173, + (147,31,0): 171, 185, 194, + (147,32,0): 199, 209, 218, + (147,33,0): 217, 226, 231, + (147,34,0): 237, 244, 250, + (147,35,0): 245, 253, 255, + (147,36,0): 248, 254, 252, + (147,37,0): 245, 252, 245, + (147,38,0): 243, 246, 237, + (147,39,0): 238, 242, 228, + (147,40,0): 234, 235, 221, + (147,41,0): 228, 229, 211, + (147,42,0): 221, 218, 201, + (147,43,0): 212, 209, 190, + (147,44,0): 208, 203, 184, + (147,45,0): 202, 197, 178, + (147,46,0): 195, 188, 170, + (147,47,0): 189, 180, 163, + (147,48,0): 196, 184, 168, + (147,49,0): 198, 184, 171, + (147,50,0): 203, 191, 179, + (147,51,0): 213, 200, 192, + (147,52,0): 224, 213, 211, + (147,53,0): 234, 224, 225, + (147,54,0): 244, 233, 239, + (147,55,0): 248, 241, 248, + (147,56,0): 252, 244, 255, + (147,57,0): 253, 247, 255, + (147,58,0): 254, 251, 255, + (147,59,0): 254, 253, 255, + (147,60,0): 253, 252, 255, + (147,61,0): 251, 252, 254, + (147,62,0): 252, 254, 253, + (147,63,0): 253, 255, 254, + (147,64,0): 254, 254, 254, + (147,65,0): 254, 254, 254, + (147,66,0): 254, 254, 254, + (147,67,0): 254, 254, 254, + (147,68,0): 254, 254, 254, + (147,69,0): 254, 254, 254, + (147,70,0): 255, 254, 252, + (147,71,0): 255, 254, 252, + (147,72,0): 255, 254, 252, + (147,73,0): 255, 254, 252, + (147,74,0): 255, 253, 250, + (147,75,0): 255, 252, 249, + (147,76,0): 255, 252, 249, + (147,77,0): 255, 252, 249, + (147,78,0): 255, 251, 247, + (147,79,0): 255, 252, 247, + (147,80,0): 255, 253, 252, + (147,81,0): 253, 252, 250, + (147,82,0): 251, 251, 251, + (147,83,0): 252, 252, 252, + (147,84,0): 254, 254, 254, + (147,85,0): 255, 255, 255, + (147,86,0): 254, 254, 254, + (147,87,0): 253, 253, 253, + (147,88,0): 254, 253, 251, + (147,89,0): 255, 255, 251, + (147,90,0): 255, 253, 250, + (147,91,0): 250, 243, 237, + (147,92,0): 234, 225, 218, + (147,93,0): 227, 217, 208, + (147,94,0): 239, 226, 217, + (147,95,0): 251, 242, 235, + (147,96,0): 255, 252, 253, + (147,97,0): 254, 254, 255, + (147,98,0): 253, 255, 254, + (147,99,0): 254, 255, 253, + (147,100,0): 252, 255, 251, + (147,101,0): 251, 255, 250, + (147,102,0): 251, 255, 254, + (147,103,0): 250, 254, 255, + (147,104,0): 252, 255, 255, + (147,105,0): 252, 255, 255, + (147,106,0): 255, 254, 255, + (147,107,0): 254, 254, 252, + (147,108,0): 255, 253, 244, + (147,109,0): 255, 254, 236, + (147,110,0): 255, 252, 230, + (147,111,0): 255, 253, 228, + (147,112,0): 252, 250, 227, + (147,113,0): 255, 254, 233, + (147,114,0): 228, 223, 201, + (147,115,0): 137, 133, 108, + (147,116,0): 80, 74, 48, + (147,117,0): 82, 77, 48, + (147,118,0): 84, 77, 48, + (147,119,0): 84, 77, 48, + (147,120,0): 84, 78, 46, + (147,121,0): 85, 79, 47, + (147,122,0): 85, 80, 50, + (147,123,0): 85, 80, 50, + (147,124,0): 84, 80, 51, + (147,125,0): 83, 79, 50, + (147,126,0): 80, 79, 51, + (147,127,0): 79, 78, 50, + (147,128,0): 81, 77, 50, + (147,129,0): 79, 78, 50, + (147,130,0): 79, 77, 52, + (147,131,0): 76, 79, 52, + (147,132,0): 76, 78, 54, + (147,133,0): 74, 80, 54, + (147,134,0): 74, 79, 56, + (147,135,0): 71, 79, 55, + (147,136,0): 74, 83, 56, + (147,137,0): 71, 80, 51, + (147,138,0): 70, 79, 50, + (147,139,0): 72, 82, 48, + (147,140,0): 76, 83, 50, + (147,141,0): 78, 85, 51, + (147,142,0): 85, 91, 55, + (147,143,0): 91, 99, 60, + (147,144,0): 103, 114, 71, + (147,145,0): 115, 128, 82, + (147,146,0): 135, 148, 105, + (147,147,0): 144, 156, 116, + (147,148,0): 133, 143, 106, + (147,149,0): 110, 117, 83, + (147,150,0): 90, 95, 65, + (147,151,0): 82, 87, 57, + (147,152,0): 79, 79, 55, + (147,153,0): 78, 78, 54, + (147,154,0): 80, 75, 55, + (147,155,0): 79, 74, 54, + (147,156,0): 82, 75, 56, + (147,157,0): 85, 78, 59, + (147,158,0): 89, 81, 60, + (147,159,0): 91, 83, 62, + (147,160,0): 90, 84, 62, + (147,161,0): 88, 82, 60, + (147,162,0): 84, 79, 60, + (147,163,0): 80, 75, 56, + (147,164,0): 74, 71, 56, + (147,165,0): 71, 69, 56, + (147,166,0): 69, 67, 55, + (147,167,0): 65, 67, 56, + (147,168,0): 61, 62, 54, + (147,169,0): 58, 64, 54, + (147,170,0): 58, 64, 54, + (147,171,0): 57, 65, 54, + (147,172,0): 55, 66, 52, + (147,173,0): 55, 66, 52, + (147,174,0): 54, 67, 50, + (147,175,0): 54, 67, 50, + (147,176,0): 59, 67, 56, + (147,177,0): 58, 66, 55, + (147,178,0): 57, 65, 54, + (147,179,0): 57, 65, 54, + (147,180,0): 57, 65, 54, + (147,181,0): 57, 65, 54, + (147,182,0): 58, 66, 55, + (147,183,0): 59, 67, 56, + (147,184,0): 59, 67, 56, + (147,185,0): 58, 66, 55, + (147,186,0): 58, 66, 55, + (147,187,0): 59, 67, 56, + (147,188,0): 59, 67, 56, + (147,189,0): 61, 69, 58, + (147,190,0): 62, 70, 59, + (147,191,0): 61, 71, 60, + (147,192,0): 61, 71, 63, + (147,193,0): 60, 72, 62, + (147,194,0): 62, 72, 61, + (147,195,0): 62, 73, 57, + (147,196,0): 64, 72, 57, + (147,197,0): 63, 71, 56, + (147,198,0): 63, 69, 57, + (147,199,0): 63, 68, 61, + (147,200,0): 61, 68, 61, + (147,201,0): 57, 67, 59, + (147,202,0): 54, 64, 55, + (147,203,0): 52, 66, 49, + (147,204,0): 57, 73, 47, + (147,205,0): 68, 88, 53, + (147,206,0): 82, 105, 63, + (147,207,0): 91, 117, 69, + (147,208,0): 89, 122, 69, + (147,209,0): 87, 121, 70, + (147,210,0): 84, 113, 69, + (147,211,0): 73, 100, 65, + (147,212,0): 62, 85, 59, + (147,213,0): 51, 73, 52, + (147,214,0): 48, 65, 47, + (147,215,0): 46, 63, 44, + (147,216,0): 54, 72, 50, + (147,217,0): 64, 82, 56, + (147,218,0): 75, 94, 66, + (147,219,0): 82, 101, 71, + (147,220,0): 83, 103, 75, + (147,221,0): 79, 99, 71, + (147,222,0): 65, 88, 62, + (147,223,0): 54, 73, 51, + (147,224,0): 49, 59, 48, + (147,225,0): 48, 55, 47, + (147,226,0): 45, 52, 44, + (148,0,0): 89, 103, 77, + (148,1,0): 90, 104, 78, + (148,2,0): 92, 104, 80, + (148,3,0): 94, 106, 82, + (148,4,0): 98, 108, 84, + (148,5,0): 100, 110, 86, + (148,6,0): 105, 110, 90, + (148,7,0): 106, 111, 91, + (148,8,0): 109, 110, 92, + (148,9,0): 108, 109, 91, + (148,10,0): 110, 107, 92, + (148,11,0): 109, 106, 91, + (148,12,0): 110, 104, 90, + (148,13,0): 110, 104, 90, + (148,14,0): 112, 104, 93, + (148,15,0): 111, 105, 91, + (148,16,0): 109, 103, 89, + (148,17,0): 107, 104, 89, + (148,18,0): 106, 102, 90, + (148,19,0): 106, 102, 91, + (148,20,0): 105, 101, 92, + (148,21,0): 105, 101, 90, + (148,22,0): 104, 102, 90, + (148,23,0): 102, 103, 87, + (148,24,0): 103, 104, 86, + (148,25,0): 97, 102, 80, + (148,26,0): 94, 103, 84, + (148,27,0): 100, 113, 96, + (148,28,0): 112, 125, 116, + (148,29,0): 125, 141, 140, + (148,30,0): 145, 160, 167, + (148,31,0): 161, 175, 184, + (148,32,0): 194, 204, 213, + (148,33,0): 214, 223, 228, + (148,34,0): 234, 241, 247, + (148,35,0): 243, 251, 253, + (148,36,0): 245, 251, 249, + (148,37,0): 242, 249, 242, + (148,38,0): 239, 242, 233, + (148,39,0): 233, 237, 223, + (148,40,0): 227, 228, 214, + (148,41,0): 218, 219, 201, + (148,42,0): 211, 208, 191, + (148,43,0): 204, 201, 182, + (148,44,0): 201, 196, 177, + (148,45,0): 195, 190, 171, + (148,46,0): 190, 183, 165, + (148,47,0): 187, 178, 161, + (148,48,0): 202, 190, 174, + (148,49,0): 209, 195, 182, + (148,50,0): 218, 206, 194, + (148,51,0): 229, 216, 208, + (148,52,0): 238, 227, 225, + (148,53,0): 248, 238, 239, + (148,54,0): 255, 245, 251, + (148,55,0): 255, 249, 255, + (148,56,0): 252, 244, 255, + (148,57,0): 253, 247, 255, + (148,58,0): 253, 250, 255, + (148,59,0): 253, 252, 255, + (148,60,0): 252, 251, 255, + (148,61,0): 251, 252, 254, + (148,62,0): 252, 254, 253, + (148,63,0): 254, 255, 255, + (148,64,0): 254, 254, 254, + (148,65,0): 254, 254, 254, + (148,66,0): 254, 254, 254, + (148,67,0): 254, 254, 254, + (148,68,0): 254, 254, 254, + (148,69,0): 254, 254, 254, + (148,70,0): 255, 254, 252, + (148,71,0): 255, 254, 252, + (148,72,0): 255, 254, 252, + (148,73,0): 255, 254, 252, + (148,74,0): 255, 252, 249, + (148,75,0): 255, 252, 249, + (148,76,0): 255, 252, 249, + (148,77,0): 255, 251, 248, + (148,78,0): 255, 251, 247, + (148,79,0): 255, 252, 247, + (148,80,0): 255, 252, 251, + (148,81,0): 252, 251, 249, + (148,82,0): 251, 251, 251, + (148,83,0): 252, 252, 252, + (148,84,0): 254, 254, 254, + (148,85,0): 255, 255, 255, + (148,86,0): 254, 254, 254, + (148,87,0): 253, 253, 253, + (148,88,0): 254, 253, 251, + (148,89,0): 254, 253, 249, + (148,90,0): 255, 252, 249, + (148,91,0): 254, 247, 241, + (148,92,0): 245, 236, 229, + (148,93,0): 239, 229, 220, + (148,94,0): 247, 234, 225, + (148,95,0): 254, 245, 238, + (148,96,0): 255, 252, 253, + (148,97,0): 254, 254, 255, + (148,98,0): 253, 255, 254, + (148,99,0): 254, 255, 253, + (148,100,0): 252, 255, 251, + (148,101,0): 251, 255, 250, + (148,102,0): 251, 255, 254, + (148,103,0): 250, 254, 255, + (148,104,0): 251, 255, 255, + (148,105,0): 251, 255, 255, + (148,106,0): 254, 253, 255, + (148,107,0): 254, 254, 252, + (148,108,0): 255, 254, 245, + (148,109,0): 255, 254, 236, + (148,110,0): 255, 252, 230, + (148,111,0): 255, 252, 227, + (148,112,0): 254, 252, 229, + (148,113,0): 255, 255, 235, + (148,114,0): 229, 224, 202, + (148,115,0): 138, 134, 109, + (148,116,0): 81, 75, 49, + (148,117,0): 84, 79, 50, + (148,118,0): 86, 79, 50, + (148,119,0): 87, 80, 51, + (148,120,0): 84, 78, 46, + (148,121,0): 85, 79, 47, + (148,122,0): 86, 81, 51, + (148,123,0): 86, 81, 51, + (148,124,0): 85, 81, 52, + (148,125,0): 83, 79, 50, + (148,126,0): 79, 78, 50, + (148,127,0): 78, 77, 49, + (148,128,0): 81, 77, 50, + (148,129,0): 79, 78, 50, + (148,130,0): 79, 77, 52, + (148,131,0): 76, 79, 52, + (148,132,0): 76, 78, 54, + (148,133,0): 74, 80, 54, + (148,134,0): 74, 79, 56, + (148,135,0): 73, 81, 57, + (148,136,0): 76, 85, 58, + (148,137,0): 73, 82, 53, + (148,138,0): 74, 83, 54, + (148,139,0): 78, 88, 54, + (148,140,0): 81, 88, 55, + (148,141,0): 82, 89, 55, + (148,142,0): 91, 97, 61, + (148,143,0): 99, 107, 68, + (148,144,0): 129, 142, 98, + (148,145,0): 146, 162, 115, + (148,146,0): 161, 174, 131, + (148,147,0): 157, 169, 129, + (148,148,0): 148, 158, 121, + (148,149,0): 138, 145, 111, + (148,150,0): 115, 120, 90, + (148,151,0): 90, 95, 65, + (148,152,0): 80, 80, 56, + (148,153,0): 78, 78, 54, + (148,154,0): 78, 73, 53, + (148,155,0): 76, 71, 51, + (148,156,0): 78, 71, 52, + (148,157,0): 81, 74, 55, + (148,158,0): 86, 78, 57, + (148,159,0): 88, 80, 59, + (148,160,0): 88, 82, 60, + (148,161,0): 86, 80, 58, + (148,162,0): 83, 78, 59, + (148,163,0): 80, 75, 56, + (148,164,0): 76, 73, 58, + (148,165,0): 73, 71, 58, + (148,166,0): 71, 69, 57, + (148,167,0): 67, 69, 58, + (148,168,0): 61, 62, 54, + (148,169,0): 58, 64, 54, + (148,170,0): 58, 64, 54, + (148,171,0): 57, 65, 54, + (148,172,0): 55, 66, 52, + (148,173,0): 55, 66, 52, + (148,174,0): 54, 67, 50, + (148,175,0): 54, 67, 50, + (148,176,0): 59, 67, 56, + (148,177,0): 59, 67, 56, + (148,178,0): 58, 66, 55, + (148,179,0): 57, 65, 54, + (148,180,0): 57, 65, 54, + (148,181,0): 58, 66, 55, + (148,182,0): 59, 67, 56, + (148,183,0): 59, 67, 56, + (148,184,0): 59, 67, 56, + (148,185,0): 59, 67, 56, + (148,186,0): 59, 67, 56, + (148,187,0): 59, 67, 56, + (148,188,0): 60, 68, 57, + (148,189,0): 61, 69, 58, + (148,190,0): 62, 70, 59, + (148,191,0): 61, 71, 60, + (148,192,0): 59, 69, 61, + (148,193,0): 58, 70, 60, + (148,194,0): 60, 70, 59, + (148,195,0): 60, 71, 55, + (148,196,0): 62, 70, 55, + (148,197,0): 61, 69, 54, + (148,198,0): 62, 68, 56, + (148,199,0): 61, 66, 59, + (148,200,0): 58, 65, 58, + (148,201,0): 55, 65, 57, + (148,202,0): 53, 63, 54, + (148,203,0): 52, 66, 49, + (148,204,0): 57, 73, 47, + (148,205,0): 66, 86, 51, + (148,206,0): 78, 101, 59, + (148,207,0): 85, 111, 63, + (148,208,0): 83, 116, 63, + (148,209,0): 81, 115, 64, + (148,210,0): 79, 108, 64, + (148,211,0): 69, 96, 61, + (148,212,0): 57, 80, 54, + (148,213,0): 46, 68, 47, + (148,214,0): 44, 61, 43, + (148,215,0): 44, 61, 42, + (148,216,0): 49, 67, 45, + (148,217,0): 60, 78, 52, + (148,218,0): 73, 92, 64, + (148,219,0): 80, 99, 69, + (148,220,0): 82, 102, 74, + (148,221,0): 78, 98, 70, + (148,222,0): 63, 86, 60, + (148,223,0): 52, 71, 49, + (148,224,0): 43, 53, 42, + (148,225,0): 43, 50, 42, + (148,226,0): 40, 47, 39 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "IMAGE" + } + } + ATTRIBUTE "IMAGE_SUBCLASS" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "IMAGE_TRUECOLOR" + } + } + ATTRIBUTE "IMAGE_VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "1.2" + } + } + ATTRIBUTE "INTERLACE_MODE" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "INTERLACE_PIXEL" + } + } + } + DATASET "image8bit" { + DATATYPE H5T_STD_U8LE + DATASPACE SIMPLE { ( 400, 300 ) / ( 400, 300 ) } + DATA { + (0,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (0,294): 1, 1, 1, 1, 1, 1, + (1,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (1,294): 1, 1, 1, 1, 1, 1, + (2,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (2,294): 1, 1, 1, 1, 1, 1, + (3,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (3,294): 1, 1, 1, 1, 1, 1, + (4,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (4,294): 1, 1, 1, 1, 1, 1, + (5,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (5,294): 1, 1, 1, 1, 1, 1, + (6,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (6,294): 1, 1, 1, 1, 1, 1, + (7,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (7,294): 1, 1, 1, 1, 1, 1, + (8,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (8,294): 1, 1, 1, 1, 1, 1, + (9,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (9,294): 1, 1, 1, 1, 1, 1, + (10,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (10,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (11,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (12,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (13,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (14,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (15,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (16,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (17,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (18,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (19,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (20,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (21,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (22,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (23,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (24,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (25,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (26,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (27,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (28,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (29,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (30,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (31,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (32,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (33,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (34,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (35,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (36,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (37,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (38,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (39,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (40,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (41,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (42,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (43,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (44,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (45,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (46,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (47,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (48,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (49,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (50,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (51,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (52,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (53,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (54,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (55,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (56,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (57,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (58,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (59,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (60,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (61,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (62,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (63,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (64,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (65,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (66,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (67,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (68,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (69,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,0): 12, 8, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (70,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,0): 61, 52, 39, 25, 10, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,19): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,40): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,82): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,103): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,123): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,143): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,163): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,183): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,203): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,223): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (71,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,0): 93, 86, 77, 65, 48, 16, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,19): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,40): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,82): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,103): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,123): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,143): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,163): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,183): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,203): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,223): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (72,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,0): 108, 106, 104, 99, 88, 48, 23, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,18): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,39): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,60): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,102): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,122): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,142): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,162): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,182): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,202): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,222): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,242): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,262): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (73,282): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,0): 109, 107, 106, 106, 105, 98, 60, 26, 5, 1, 1, 1, 1, 1, 1, 1, 1, + (74,17): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,38): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,59): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,80): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (74,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,0): 107, 105, 104, 104, 105, 105, 100, 73, 37, 6, 1, 1, 1, 1, 1, 1, + (75,16): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,37): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,58): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,79): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,100): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,120): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,140): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,160): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,180): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,200): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,220): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (75,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,0): 108, 105, 104, 104, 105, 105, 104, 93, 69, 29, 3, 1, 1, 1, 1, + (76,15): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,36): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,57): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,78): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,99): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,120): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,140): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,160): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,180): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,200): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,220): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (76,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,0): 109, 105, 103, 103, 104, 106, 106, 103, 89, 59, 12, 4, 1, 1, 1, + (77,15): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,36): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,57): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,78): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,99): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,120): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,140): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,160): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,180): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,200): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,220): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (77,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,0): 111, 105, 103, 103, 104, 106, 107, 106, 100, 86, 29, 10, 2, 1, + (78,14): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,35): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,56): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,77): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,98): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,119): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,139): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,159): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,179): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,199): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,219): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,239): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (78,299): 1, + (79,0): 113, 105, 102, 101, 102, 105, 107, 108, 106, 100, 55, 20, 5, 1, + (79,14): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,35): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,56): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,77): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,98): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,119): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,139): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,159): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,179): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,199): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,219): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,239): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (79,299): 1, + (80,0): 115, 107, 102, 101, 100, 101, 104, 107, 108, 107, 88, 42, 15, + (80,13): 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,34): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,55): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,76): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,97): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,118): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,138): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,158): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,178): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,198): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,218): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,238): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (80,298): 1, 1, + (81,0): 118, 109, 103, 100, 99, 100, 102, 105, 108, 108, 99, 63, 30, 7, + (81,14): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,35): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,56): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,77): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,98): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,119): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,139): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,159): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,179): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,199): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,219): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,239): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (81,299): 1, + (82,0): 119, 111, 104, 100, 97, 100, 101, 103, 106, 109, 105, 82, 48, + (82,13): 17, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,137): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,157): 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 5, 6, 7, 7, 8, 9, + (82,177): 9, 9, 9, 9, 8, 7, 7, 6, 4, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (82,197): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,217): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,237): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,257): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (82,297): 1, 1, 1, + (83,0): 119, 113, 106, 100, 97, 100, 101, 102, 104, 108, 108, 95, 65, + (83,13): 30, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,137): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,157): 1, 1, 1, 1, 1, 2, 3, 4, 6, 7, 9, 11, 13, 16, 18, 20, 22, 24, + (83,175): 26, 27, 27, 28, 28, 27, 25, 24, 22, 20, 16, 13, 11, 8, 6, 3, + (83,191): 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,211): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (83,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,0): 119, 115, 109, 102, 97, 100, 103, 104, 104, 106, 108, 103, 79, + (84,13): 46, 15, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,137): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,157): 1, 1, 1, 3, 4, 6, 9, 12, 17, 21, 25, 30, 34, 40, 44, 48, 52, + (84,174): 55, 58, 60, 61, 62, 62, 60, 58, 56, 52, 48, 41, 35, 29, 23, + (84,189): 18, 11, 7, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,209): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (84,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,0): 115, 114, 111, 106, 99, 97, 104, 106, 106, 106, 107, 106, 91, + (85,13): 65, 30, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,137): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + (85,157): 6, 9, 13, 20, 26, 33, 41, 49, 59, 66, 74, 80, 87, 94, 98, + (85,172): 102, 106, 109, 112, 113, 114, 115, 115, 115, 114, 112, 109, + (85,184): 105, 98, 91, 82, 72, 61, 46, 36, 26, 18, 12, 5, 2, 1, 1, 1, + (85,200): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,220): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (85,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,0): 109, 111, 110, 107, 103, 97, 104, 107, 108, 107, 107, 107, 97, + (86,13): 77, 44, 16, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,137): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 6, 11, 17, + (86,157): 24, 31, 40, 52, 62, 71, 79, 87, 95, 100, 104, 107, 110, 113, + (86,171): 115, 117, 119, 120, 121, 122, 123, 124, 124, 125, 125, 124, + (86,183): 124, 123, 120, 118, 113, 108, 101, 87, 75, 62, 49, 36, 21, + (86,196): 13, 7, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,216): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,236): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (86,296): 1, 1, 1, 1, + (87,0): 102, 104, 106, 107, 106, 98, 101, 106, 109, 108, 108, 107, 101, + (87,13): 85, 56, 27, 14, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,95): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,136): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 6, 10, 15, 22, + (87,155): 33, 43, 53, 64, 74, 85, 93, 99, 104, 109, 113, 115, 117, 119, + (87,169): 120, 121, 122, 123, 124, 124, 125, 126, 126, 127, 128, 128, + (87,181): 129, 129, 129, 129, 129, 129, 127, 125, 122, 115, 106, 96, + (87,193): 84, 70, 50, 37, 25, 16, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,211): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (87,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,0): 95, 97, 101, 104, 106, 100, 99, 104, 109, 110, 108, 108, 104, + (88,13): 92, 67, 38, 23, 12, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,95): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,136): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 6, 12, 18, 27, 36, 48, + (88,155): 63, 75, 85, 95, 103, 110, 113, 116, 117, 118, 119, 120, 120, + (88,168): 121, 121, 122, 122, 122, 123, 123, 124, 124, 125, 126, 126, + (88,180): 127, 128, 129, 129, 130, 130, 130, 131, 131, 130, 129, 127, + (88,192): 122, 114, 104, 85, 69, 53, 38, 25, 11, 6, 3, 1, 1, 1, 1, 1, + (88,208): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,228): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,248): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (88,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,0): 90, 92, 95, 99, 105, 105, 98, 102, 108, 111, 110, 109, 106, 98, + (89,14): 79, 48, 33, 19, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,137): 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 10, 17, 29, 41, 55, 69, 83, + (89,155): 99, 107, 112, 115, 116, 117, 118, 118, 119, 119, 120, 120, + (89,167): 120, 120, 120, 119, 119, 119, 119, 119, 119, 119, 120, 121, + (89,179): 122, 123, 124, 126, 127, 128, 129, 130, 131, 131, 131, 131, + (89,191): 131, 131, 129, 128, 120, 108, 91, 73, 53, 31, 18, 10, 5, 1, + (89,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (89,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,0): 89, 90, 93, 96, 99, 105, 100, 98, 101, 110, 111, 110, 108, 101, + (90,14): 85, 68, 54, 37, 21, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,137): 1, 1, 1, 1, 1, 1, 1, 3, 9, 16, 26, 38, 52, 74, 88, 100, 109, + (90,154): 114, 115, 116, 117, 117, 118, 118, 117, 117, 115, 113, 111, + (90,166): 110, 109, 108, 108, 108, 109, 109, 110, 110, 111, 112, 113, + (90,178): 114, 115, 116, 117, 118, 119, 121, 123, 124, 126, 128, 129, + (90,190): 131, 131, 131, 131, 132, 131, 130, 127, 120, 108, 83, 62, 43, + (90,203): 26, 14, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,223): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (90,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,0): 88, 89, 91, 95, 98, 104, 103, 99, 98, 106, 110, 110, 108, 102, + (91,14): 90, 71, 62, 50, 36, 18, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,137): 1, 1, 1, 1, 1, 4, 8, 15, 29, 42, 58, 73, 88, 102, 108, 111, + (91,153): 114, 116, 116, 116, 116, 115, 113, 110, 108, 107, 106, 105, + (91,165): 105, 105, 106, 106, 107, 107, 108, 109, 109, 110, 111, 112, + (91,177): 113, 114, 115, 116, 117, 118, 119, 120, 121, 123, 124, 125, + (91,189): 126, 128, 129, 130, 131, 132, 132, 132, 131, 129, 126, 115, + (91,201): 101, 83, 63, 44, 21, 11, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,219): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,239): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (91,299): 1, + (92,0): 87, 88, 90, 93, 99, 103, 104, 101, 97, 99, 107, 109, 108, 103, + (92,14): 92, 74, 65, 57, 47, 31, 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,137): 1, 1, 1, 3, 8, 15, 25, 38, 59, 74, 88, 99, 107, 114, 115, + (92,152): 115, 115, 115, 113, 111, 109, 107, 105, 103, 102, 102, 102, + (92,164): 102, 103, 104, 105, 106, 108, 109, 111, 112, 113, 114, 116, + (92,176): 117, 118, 118, 119, 119, 120, 120, 120, 121, 122, 122, 123, + (92,188): 124, 125, 126, 128, 129, 130, 131, 132, 132, 133, 133, 133, + (92,200): 130, 124, 113, 99, 81, 53, 34, 20, 10, 4, 1, 1, 1, 1, 1, 1, + (92,216): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,236): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (92,296): 1, 1, 1, 1, + (93,0): 87, 87, 88, 92, 100, 103, 104, 103, 99, 93, 101, 104, 105, 101, + (93,14): 93, 75, 66, 60, 54, 44, 18, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,95): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,136): 1, 1, 2, 4, 11, 22, 35, 51, 68, 90, 102, 110, 114, 115, 115, + (93,151): 115, 113, 111, 110, 106, 103, 100, 99, 98, 99, 100, 101, 102, + (93,164): 104, 106, 108, 110, 113, 115, 118, 120, 123, 124, 126, 128, + (93,176): 129, 130, 130, 130, 130, 129, 129, 128, 127, 126, 126, 126, + (93,188): 126, 126, 126, 127, 128, 129, 130, 131, 132, 133, 133, 134, + (93,200): 134, 133, 131, 125, 115, 90, 68, 46, 27, 13, 3, 1, 1, 1, 1, + (93,215): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,235): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,255): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (93,295): 1, 1, 1, 1, 1, + (94,0): 87, 87, 88, 92, 102, 105, 105, 104, 102, 95, 90, 97, 99, 97, + (94,14): 93, 76, 66, 61, 57, 54, 32, 13, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,95): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,136): 1, 2, 6, 12, 28, 46, 66, 86, 104, 113, 114, 115, 115, 115, + (94,150): 114, 112, 107, 102, 98, 95, 95, 96, 96, 98, 99, 101, 103, + (94,163): 106, 109, 114, 119, 124, 129, 133, 138, 142, 145, 148, 150, + (94,175): 152, 153, 153, 153, 152, 150, 149, 147, 144, 142, 138, 136, + (94,187): 133, 131, 129, 128, 128, 128, 129, 129, 130, 131, 132, 133, + (94,199): 134, 134, 135, 135, 134, 133, 125, 108, 84, 58, 33, 11, 5, 1, + (94,213): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,233): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (94,293): 1, 1, 1, 1, 1, 1, 1, + (95,0): 90, 90, 91, 95, 104, 108, 107, 106, 104, 102, 91, 86, 86, 89, + (95,14): 89, 83, 71, 63, 60, 58, 48, 25, 10, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (95,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,95): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,136): 5, 13, 26, 44, 74, 94, 107, 113, 114, 115, 115, 114, 112, + (95,149): 108, 100, 96, 94, 93, 93, 95, 96, 97, 100, 103, 110, 117, + (95,162): 125, 133, 141, 151, 158, 164, 169, 174, 178, 181, 183, 185, + (95,174): 186, 187, 187, 187, 187, 186, 185, 183, 182, 179, 176, 172, + (95,186): 168, 164, 159, 154, 148, 143, 139, 136, 133, 132, 132, 132, + (95,198): 133, 133, 134, 135, 135, 135, 135, 134, 132, 125, 110, 87, + (95,210): 49, 25, 11, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (95,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,0): 93, 93, 96, 102, 107, 108, 107, 106, 105, 104, 96, 88, 83, 81, + (96,14): 82, 80, 75, 69, 64, 61, 55, 35, 16, 4, 1, 1, 1, 1, 1, 1, 1, 1, + (96,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,95): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 9, + (96,136): 20, 38, 59, 81, 101, 108, 112, 114, 114, 113, 110, 105, 100, + (96,149): 96, 93, 92, 92, 93, 94, 98, 102, 109, 117, 127, 139, 149, + (96,162): 157, 164, 171, 178, 182, 185, 187, 189, 191, 192, 193, 193, + (96,174): 194, 194, 194, 193, 193, 193, 192, 191, 189, 188, 186, 184, + (96,186): 181, 179, 176, 173, 169, 164, 160, 155, 150, 143, 140, 137, + (96,198): 135, 134, 134, 135, 135, 135, 135, 135, 134, 132, 127, 117, + (96,210): 89, 61, 36, 17, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (96,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,0): 96, 97, 101, 106, 109, 109, 107, 106, 105, 105, 101, 95, 87, + (97,13): 80, 77, 76, 75, 71, 67, 63, 59, 43, 23, 7, 1, 1, 1, 1, 1, 1, + (97,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,72): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,114): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, + (97,134): 9, 27, 47, 69, 88, 103, 112, 113, 113, 113, 111, 105, 100, + (97,147): 96, 92, 90, 91, 92, 94, 98, 103, 114, 123, 134, 145, 155, + (97,160): 167, 174, 179, 184, 188, 192, 193, 195, 195, 196, 196, 196, + (97,172): 196, 196, 195, 195, 194, 194, 193, 193, 192, 192, 191, 190, + (97,184): 189, 188, 186, 185, 183, 182, 179, 177, 174, 170, 166, 160, + (97,196): 155, 150, 145, 141, 138, 136, 136, 135, 135, 135, 135, 135, + (97,208): 134, 131, 117, 96, 71, 44, 22, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (97,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (97,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,0): 99, 100, 104, 109, 110, 108, 106, 105, 105, 105, 104, 101, 95, + (98,13): 86, 76, 72, 72, 71, 69, 66, 62, 50, 30, 11, 2, 1, 1, 1, 1, 1, + (98,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,72): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,114): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 13, + (98,134): 26, 55, 78, 96, 108, 112, 113, 112, 111, 108, 103, 95, 91, + (98,147): 89, 89, 89, 93, 97, 103, 112, 122, 139, 152, 163, 172, 180, + (98,160): 187, 190, 193, 195, 196, 196, 196, 196, 196, 196, 195, 194, + (98,172): 193, 192, 191, 189, 188, 187, 186, 186, 185, 185, 185, 185, + (98,184): 185, 185, 184, 184, 183, 183, 182, 181, 181, 179, 178, 174, + (98,196): 170, 165, 159, 153, 146, 142, 139, 137, 136, 136, 135, 135, + (98,208): 135, 135, 132, 123, 105, 80, 51, 19, 8, 3, 1, 1, 1, 1, 1, 1, + (98,224): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (98,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,0): 102, 103, 107, 110, 110, 104, 103, 103, 104, 105, 105, 105, + (99,12): 101, 94, 81, 70, 69, 69, 68, 67, 64, 56, 36, 15, 2, 1, 1, 1, + (99,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,112): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + (99,132): 14, 30, 55, 93, 104, 110, 113, 114, 112, 110, 104, 97, 90, + (99,145): 87, 87, 87, 89, 91, 99, 110, 124, 140, 155, 171, 180, 186, + (99,158): 190, 193, 195, 196, 197, 197, 197, 197, 196, 195, 193, 192, + (99,170): 189, 186, 184, 181, 179, 175, 173, 172, 170, 169, 169, 169, + (99,182): 170, 171, 173, 175, 177, 178, 179, 180, 181, 181, 181, 180, + (99,194): 179, 178, 178, 176, 173, 170, 162, 155, 149, 143, 139, 137, + (99,206): 136, 136, 135, 135, 135, 134, 129, 116, 92, 47, 23, 9, 2, 1, + (99,220): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (99,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,0): 103, 105, 108, 110, 110, 103, 101, 102, 103, 105, 105, 105, + (100,12): 103, 98, 87, 70, 68, 67, 67, 66, 65, 60, 42, 20, 4, 1, 1, 1, + (100,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,108): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,128): 1, 1, 7, 23, 47, 75, 100, 109, 112, 113, 113, 111, 104, 95, + (100,142): 89, 86, 84, 86, 88, 92, 100, 111, 135, 151, 165, 177, 185, + (100,155): 191, 194, 195, 196, 197, 197, 196, 195, 194, 192, 189, 185, + (100,167): 181, 177, 172, 165, 159, 154, 149, 144, 138, 134, 130, 127, + (100,179): 125, 123, 123, 124, 125, 127, 132, 136, 141, 146, 151, 158, + (100,191): 164, 169, 173, 176, 177, 177, 177, 176, 175, 174, 172, 168, + (100,203): 163, 156, 146, 141, 138, 136, 136, 135, 135, 135, 132, 128, + (100,215): 104, 68, 37, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,233): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (100,293): 1, 1, 1, 1, 1, 1, 1, + (101,0): 104, 105, 107, 109, 110, 103, 101, 101, 102, 104, 104, 104, + (101,12): 101, 95, 86, 70, 67, 66, 66, 66, 65, 61, 44, 23, 4, 1, 1, 1, + (101,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,108): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,128): 2, 7, 27, 54, 79, 97, 107, 112, 112, 111, 108, 101, 92, 87, + (101,142): 85, 85, 86, 90, 99, 112, 128, 144, 164, 175, 183, 188, 193, + (101,155): 195, 196, 196, 196, 195, 194, 192, 189, 185, 180, 173, 167, + (101,167): 160, 153, 145, 135, 128, 122, 115, 110, 103, 99, 95, 92, 89, + (101,180): 87, 87, 87, 87, 88, 91, 94, 98, 103, 108, 117, 125, 133, + (101,193): 141, 149, 159, 165, 170, 173, 174, 174, 173, 172, 170, 167, + (101,205): 161, 154, 148, 142, 138, 136, 136, 135, 134, 133, 124, 104, + (101,217): 76, 45, 18, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,236): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (101,296): 1, 1, 1, 1, + (102,0): 103, 105, 107, 109, 110, 105, 102, 101, 102, 104, 104, 102, + (102,12): 97, 91, 84, 71, 66, 65, 65, 65, 65, 62, 46, 24, 5, 1, 1, 1, + (102,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,108): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + (102,128): 10, 24, 58, 82, 98, 107, 111, 112, 110, 105, 98, 91, 84, 83, + (102,142): 84, 87, 92, 106, 122, 138, 155, 170, 182, 188, 192, 195, + (102,154): 196, 196, 196, 195, 193, 191, 186, 182, 176, 169, 162, 151, + (102,166): 142, 133, 124, 115, 104, 97, 91, 85, 80, 76, 73, 71, 69, 67, + (102,180): 66, 66, 66, 66, 66, 68, 69, 72, 74, 78, 84, 89, 96, 103, + (102,194): 112, 125, 135, 145, 153, 161, 168, 171, 172, 172, 171, 168, + (102,206): 164, 159, 154, 147, 141, 138, 136, 135, 135, 133, 124, 107, + (102,218): 81, 48, 15, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,237): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,257): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (102,297): 1, 1, 1, + (103,0): 103, 104, 106, 108, 109, 106, 103, 102, 103, 104, 103, 99, 92, + (103,13): 85, 82, 74, 67, 64, 64, 65, 65, 62, 46, 24, 5, 1, 1, 1, 1, 1, + (103,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,110): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 10, 26, + (103,129): 51, 88, 101, 108, 111, 112, 109, 103, 96, 88, 84, 81, 84, + (103,142): 88, 95, 107, 130, 150, 165, 177, 187, 192, 195, 196, 196, + (103,154): 196, 195, 193, 190, 187, 182, 174, 166, 157, 148, 137, 123, + (103,166): 112, 103, 93, 85, 76, 71, 67, 63, 61, 59, 58, 57, 57, 57, + (103,180): 57, 57, 57, 57, 57, 57, 58, 58, 59, 60, 62, 64, 67, 72, 78, + (103,195): 88, 98, 110, 121, 134, 150, 158, 164, 168, 170, 171, 170, + (103,207): 168, 165, 159, 150, 144, 140, 137, 136, 135, 133, 127, 112, + (103,219): 85, 39, 18, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,238): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (103,298): 1, 1, + (104,0): 102, 103, 105, 106, 107, 107, 105, 104, 104, 105, 104, 93, 85, + (104,13): 80, 80, 78, 69, 65, 64, 65, 65, 62, 45, 23, 4, 1, 1, 1, 1, 1, + (104,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (104,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (104,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (104,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (104,110): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 25, 52, + (104,129): 86, 106, 109, 110, 111, 111, 103, 92, 85, 81, 80, 82, 87, + (104,142): 98, 114, 135, 161, 175, 185, 191, 195, 197, 197, 197, 196, + (104,154): 194, 191, 187, 182, 176, 169, 156, 144, 132, 120, 107, 91, + (104,166): 81, 73, 66, 61, 57, 56, 55, 55, 54, 54, 54, 54, 54, 55, 55, + (104,181): 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, 57, 58, 59, 60, 62, + (104,196): 66, 72, 80, 92, 112, 129, 143, 156, 165, 170, 171, 171, 170, + (104,209): 169, 163, 155, 147, 141, 137, 136, 135, 134, 130, 122, 79, + (104,221): 42, 17, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (104,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (104,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (104,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,0): 100, 101, 102, 103, 104, 107, 106, 106, 107, 108, 97, 85, 80, + (105,13): 80, 81, 80, 73, 67, 64, 65, 65, 61, 42, 19, 3, 1, 1, 1, 1, 1, + (105,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,110): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 33, 64, 92, + (105,129): 106, 109, 110, 110, 107, 101, 87, 82, 79, 79, 82, 93, 110, + (105,142): 131, 153, 171, 186, 191, 195, 197, 197, 197, 195, 193, 190, + (105,154): 187, 180, 172, 162, 151, 138, 119, 104, 91, 80, 70, 61, 58, + (105,167): 55, 54, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, 54, 54, + (105,182): 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 56, 57, 57, 57, 58, + (105,197): 59, 60, 62, 68, 76, 89, 105, 123, 145, 159, 166, 170, 170, + (105,210): 169, 167, 164, 157, 148, 140, 137, 136, 135, 133, 124, 94, + (105,222): 58, 26, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (105,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,0): 99, 99, 99, 100, 102, 103, 105, 106, 107, 109, 91, 82, 80, 81, + (106,14): 82, 80, 72, 67, 65, 65, 65, 57, 36, 14, 2, 1, 1, 1, 1, 1, 1, + (106,31): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,71): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,111): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 6, 31, 64, 88, 103, + (106,129): 108, 109, 109, 105, 98, 89, 81, 79, 79, 84, 93, 116, 138, + (106,142): 157, 174, 185, 194, 196, 197, 197, 196, 193, 191, 187, 182, + (106,154): 176, 164, 151, 138, 123, 108, 90, 78, 69, 63, 58, 55, 54, + (106,167): 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 54, 54, 54, 54, 54, + (106,182): 54, 54, 54, 55, 55, 55, 55, 55, 55, 56, 56, 56, 56, 57, 57, + (106,197): 58, 58, 59, 61, 64, 69, 76, 86, 106, 124, 139, 153, 164, + (106,210): 168, 168, 168, 165, 160, 150, 144, 139, 136, 135, 131, 119, + (106,222): 94, 62, 26, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (106,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,0): 98, 98, 97, 97, 99, 100, 103, 105, 107, 109, 88, 81, 80, 81, + (107,14): 81, 78, 70, 66, 65, 65, 64, 52, 30, 10, 2, 1, 1, 1, 1, 1, 1, + (107,31): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,71): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,111): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 7, 21, 61, 87, 101, 107, + (107,129): 109, 109, 105, 98, 89, 81, 77, 79, 85, 96, 113, 142, 162, + (107,142): 177, 187, 194, 197, 197, 196, 195, 193, 189, 184, 178, 169, + (107,154): 159, 141, 125, 110, 96, 82, 69, 62, 58, 55, 53, 52, 52, 52, + (107,168): 52, 52, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + (107,183): 53, 53, 54, 54, 54, 54, 54, 54, 55, 55, 55, 56, 56, 56, 57, + (107,198): 57, 57, 58, 59, 60, 62, 66, 78, 90, 105, 122, 139, 156, 164, + (107,212): 168, 168, 166, 160, 154, 147, 142, 137, 135, 131, 118, 95, + (107,224): 61, 19, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (107,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,0): 98, 97, 96, 95, 96, 98, 100, 103, 106, 109, 90, 82, 81, 81, + (108,14): 78, 74, 68, 66, 65, 66, 63, 44, 22, 6, 1, 1, 1, 1, 1, 1, 1, + (108,31): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,71): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,111): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 19, 45, 88, 101, 107, + (108,128): 108, 108, 106, 98, 88, 81, 77, 78, 84, 97, 115, 138, 167, + (108,141): 181, 190, 195, 198, 198, 196, 194, 191, 188, 182, 174, 164, + (108,153): 151, 137, 114, 98, 84, 73, 64, 57, 54, 53, 52, 52, 52, 52, + (108,167): 52, 52, 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 53, 52, 52, + (108,182): 52, 52, 52, 52, 52, 53, 53, 53, 53, 53, 54, 54, 54, 55, 55, + (108,197): 56, 56, 56, 57, 57, 58, 58, 59, 62, 66, 75, 89, 106, 132, + (108,211): 148, 159, 165, 167, 166, 163, 157, 150, 143, 137, 135, 131, + (108,223): 120, 98, 47, 21, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (108,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,0): 98, 97, 96, 95, 95, 96, 96, 99, 104, 109, 98, 83, 80, 80, 73, + (109,15): 70, 67, 66, 66, 66, 60, 33, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,113): 1, 1, 1, 1, 1, 1, 1, 1, 2, 15, 39, 75, 103, 106, 108, 108, + (109,129): 107, 99, 87, 80, 76, 75, 82, 96, 117, 141, 165, 185, 192, + (109,142): 196, 198, 198, 196, 193, 190, 187, 182, 172, 160, 144, 127, + (109,154): 109, 87, 74, 65, 58, 54, 52, 52, 52, 52, 52, 52, 52, 52, 52, + (109,169): 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 51, 51, + (109,184): 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, 53, 53, 54, 54, 55, + (109,199): 55, 56, 57, 57, 57, 58, 58, 59, 61, 65, 71, 94, 116, 136, + (109,213): 153, 164, 167, 168, 166, 162, 153, 141, 138, 135, 132, 126, + (109,225): 88, 46, 18, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (109,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,0): 97, 97, 96, 95, 95, 95, 95, 96, 100, 107, 107, 79, 76, 80, 73, + (110,15): 70, 68, 67, 66, 64, 40, 17, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,113): 1, 1, 1, 1, 1, 1, 1, 2, 14, 41, 73, 100, 107, 108, 107, 105, + (110,129): 99, 85, 78, 75, 76, 80, 101, 126, 150, 172, 188, 196, 198, + (110,142): 199, 198, 195, 191, 188, 183, 176, 167, 147, 129, 110, 92, + (110,154): 77, 63, 58, 54, 52, 52, 51, 51, 51, 51, 51, 51, 52, 52, 52, + (110,169): 52, 52, 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 51, 51, 51, + (110,184): 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, + (110,199): 53, 53, 54, 55, 56, 56, 57, 58, 58, 59, 60, 64, 72, 87, 108, + (110,214): 132, 158, 165, 167, 166, 164, 157, 148, 141, 137, 134, 125, + (110,226): 96, 58, 23, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (110,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,0): 97, 97, 96, 95, 95, 95, 95, 96, 98, 102, 108, 78, 75, 80, 75, + (111,15): 71, 69, 67, 63, 54, 23, 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,113): 1, 1, 1, 1, 1, 1, 1, 8, 32, 64, 91, 104, 107, 107, 105, 99, + (111,129): 90, 77, 75, 76, 82, 94, 125, 150, 171, 186, 194, 198, 199, + (111,142): 197, 195, 191, 186, 181, 173, 162, 147, 122, 104, 87, 74, + (111,154): 63, 56, 54, 52, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, + (111,169): 52, 52, 52, 52, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + (111,184): 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, + (111,199): 51, 52, 52, 53, 54, 54, 56, 56, 57, 58, 59, 60, 63, 70, 80, + (111,214): 96, 125, 144, 157, 164, 165, 164, 159, 151, 143, 138, 132, + (111,226): 120, 93, 58, 21, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (111,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,0): 97, 97, 96, 96, 96, 96, 95, 95, 96, 99, 108, 80, 75, 78, 76, + (112,15): 72, 69, 64, 55, 38, 11, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,113): 1, 1, 1, 1, 1, 1, 3, 21, 55, 83, 101, 106, 107, 105, 99, 91, + (112,129): 81, 74, 75, 81, 94, 114, 149, 171, 185, 194, 198, 199, 197, + (112,142): 194, 191, 187, 180, 171, 158, 143, 124, 99, 83, 71, 62, 56, + (112,155): 53, 52, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 52, 52, 52, + (112,170): 52, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + (112,185): 50, 50, 50, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, + (112,200): 51, 51, 51, 52, 52, 54, 54, 55, 56, 57, 58, 60, 62, 66, 73, + (112,215): 92, 113, 132, 149, 160, 166, 164, 159, 153, 145, 137, 132, + (112,227): 117, 92, 54, 14, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (112,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,0): 96, 97, 96, 96, 96, 97, 96, 95, 95, 96, 107, 87, 77, 74, 77, + (113,15): 72, 67, 58, 43, 22, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,34): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,94): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,114): 1, 1, 1, 1, 3, 8, 41, 76, 96, 105, 107, 105, 100, 92, 83, + (113,129): 74, 73, 78, 91, 111, 138, 171, 186, 194, 198, 199, 198, 194, + (113,142): 190, 186, 181, 171, 157, 140, 121, 101, 78, 67, 59, 55, 52, + (113,155): 51, 51, 51, 50, 50, 50, 51, 51, 51, 51, 52, 52, 52, 52, 52, + (113,170): 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 49, 49, 49, + (113,185): 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, 49, 49, 49, 50, + (113,200): 50, 50, 50, 51, 51, 52, 52, 53, 54, 56, 57, 58, 59, 60, 62, + (113,215): 69, 83, 102, 123, 145, 161, 164, 164, 161, 154, 144, 138, + (113,227): 132, 119, 92, 38, 15, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (113,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,0): 96, 96, 96, 96, 96, 97, 98, 97, 95, 95, 103, 101, 83, 69, 75, + (114,15): 69, 61, 47, 29, 11, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,34): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,94): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,114): 1, 1, 1, 2, 7, 17, 65, 91, 103, 106, 106, 102, 95, 84, 76, + (114,129): 72, 74, 86, 107, 133, 161, 188, 195, 198, 199, 198, 195, + (114,141): 190, 186, 181, 174, 158, 139, 118, 98, 79, 63, 57, 54, 52, + (114,154): 51, 51, 50, 50, 50, 50, 50, 51, 51, 51, 52, 52, 52, 52, 52, + (114,169): 51, 51, 50, 50, 50, 50, 50, 49, 49, 49, 49, 49, 49, 48, 48, + (114,184): 48, 47, 47, 47, 47, 47, 46, 46, 46, 46, 46, 46, 47, 47, 47, + (114,199): 48, 49, 49, 50, 50, 50, 51, 51, 51, 52, 53, 55, 56, 57, 58, + (114,214): 59, 61, 65, 75, 91, 114, 147, 159, 164, 164, 163, 155, 145, + (114,227): 139, 133, 125, 79, 36, 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (114,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,0): 96, 96, 96, 96, 96, 97, 99, 99, 98, 95, 96, 103, 90, 72, 66, + (115,15): 65, 53, 36, 19, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,34): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,94): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,114): 1, 1, 1, 4, 16, 42, 92, 101, 105, 106, 103, 94, 83, 75, 71, + (115,129): 72, 85, 108, 135, 162, 185, 198, 199, 198, 197, 195, 189, + (115,141): 184, 178, 170, 157, 132, 110, 90, 74, 62, 54, 53, 52, 51, + (115,154): 51, 50, 50, 50, 50, 50, 51, 51, 52, 52, 52, 52, 52, 51, 51, + (115,169): 50, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 47, + (115,184): 47, 47, 47, 47, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, 45, + (115,199): 45, 46, 46, 47, 48, 49, 50, 50, 51, 51, 51, 52, 53, 54, 56, + (115,214): 57, 59, 60, 62, 66, 74, 101, 126, 146, 160, 165, 164, 159, + (115,227): 150, 142, 136, 124, 88, 48, 15, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (115,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (115,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,0): 96, 96, 96, 95, 95, 97, 99, 101, 101, 97, 96, 102, 98, 86, 65, + (116,15): 57, 49, 34, 18, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,34): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,94): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,114): 1, 1, 1, 10, 30, 64, 99, 104, 105, 103, 99, 87, 77, 72, 72, + (116,129): 76, 101, 129, 156, 179, 194, 199, 199, 197, 195, 191, 184, + (116,141): 178, 169, 157, 139, 111, 91, 75, 63, 56, 53, 52, 51, 51, 50, + (116,155): 50, 50, 50, 50, 51, 52, 52, 52, 52, 52, 52, 51, 50, 50, 49, + (116,170): 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 47, 47, 47, + (116,185): 47, 47, 47, 47, 47, 46, 46, 46, 46, 46, 45, 45, 45, 45, 45, + (116,200): 45, 45, 45, 46, 46, 48, 49, 50, 50, 51, 51, 52, 52, 53, 54, + (116,215): 57, 58, 60, 62, 65, 77, 95, 117, 138, 156, 164, 163, 159, + (116,228): 152, 143, 133, 117, 85, 47, 13, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (116,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,0): 95, 95, 95, 95, 95, 97, 99, 101, 103, 101, 96, 99, 101, 94, + (117,14): 72, 50, 41, 29, 16, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,113): 1, 1, 1, 4, 19, 45, 82, 103, 105, 104, 100, 94, 80, 73, 72, + (117,128): 75, 86, 120, 149, 173, 190, 199, 199, 198, 195, 191, 186, + (117,140): 179, 170, 158, 141, 120, 91, 75, 64, 56, 53, 52, 51, 50, 50, + (117,154): 50, 50, 50, 50, 51, 51, 52, 52, 52, 52, 52, 51, 50, 50, 49, + (117,169): 49, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, + (117,184): 48, 48, 48, 48, 48, 48, 48, 48, 47, 47, 47, 47, 46, 46, 45, + (117,199): 45, 44, 44, 44, 44, 45, 45, 46, 47, 49, 50, 51, 51, 51, 52, + (117,214): 53, 54, 56, 58, 59, 61, 66, 75, 91, 111, 134, 156, 162, 162, + (117,228): 159, 152, 141, 132, 113, 83, 42, 8, 2, 1, 1, 1, 1, 1, 1, 1, + (117,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (117,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,0): 95, 95, 95, 95, 95, 97, 99, 101, 104, 104, 98, 98, 100, 98, + (118,14): 84, 48, 34, 22, 13, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,113): 1, 1, 1, 8, 30, 60, 95, 105, 105, 102, 96, 88, 74, 71, 73, + (118,128): 82, 100, 139, 167, 186, 197, 200, 198, 196, 192, 187, 181, + (118,140): 172, 160, 143, 123, 100, 75, 63, 56, 53, 52, 51, 50, 50, 50, + (118,154): 49, 50, 50, 51, 52, 52, 53, 53, 52, 52, 51, 50, 49, 49, 49, + (118,169): 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, 48, + (118,184): 48, 48, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 47, 47, + (118,199): 46, 45, 45, 44, 44, 44, 44, 44, 45, 46, 48, 49, 50, 51, 51, + (118,214): 51, 52, 53, 55, 57, 59, 61, 64, 72, 85, 105, 137, 153, 161, + (118,228): 162, 160, 149, 141, 132, 114, 80, 25, 9, 2, 1, 1, 1, 1, 1, + (118,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (118,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,0): 95, 95, 94, 95, 95, 97, 99, 102, 104, 106, 103, 98, 99, 101, + (119,14): 98, 57, 33, 17, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,113): 1, 1, 2, 15, 43, 76, 101, 106, 103, 98, 91, 81, 70, 70, 77, + (119,128): 92, 117, 159, 183, 195, 200, 200, 196, 193, 188, 183, 176, + (119,140): 164, 147, 126, 104, 82, 63, 56, 53, 52, 51, 50, 50, 49, 49, + (119,154): 49, 50, 51, 52, 52, 53, 53, 53, 52, 51, 50, 49, 49, 49, 49, + (119,169): 49, 49, 49, 49, 49, 48, 48, 48, 48, 48, 48, 49, 49, 49, 49, + (119,184): 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 50, 51, 51, 50, 50, + (119,199): 49, 47, 46, 45, 44, 44, 44, 44, 44, 44, 45, 47, 48, 50, 51, + (119,214): 51, 51, 52, 53, 54, 56, 59, 61, 63, 68, 77, 106, 134, 152, + (119,228): 162, 163, 160, 150, 140, 131, 119, 59, 22, 5, 1, 1, 1, 1, 1, + (119,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (119,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,0): 94, 94, 94, 95, 95, 99, 102, 104, 105, 107, 107, 102, 100, + (120,13): 100, 103, 89, 47, 20, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,31): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,71): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,111): 1, 1, 1, 1, 5, 27, 61, 92, 104, 105, 100, 93, 83, 73, 68, + (120,126): 74, 88, 111, 142, 182, 194, 200, 200, 198, 193, 188, 182, + (120,138): 175, 167, 147, 125, 102, 82, 65, 55, 53, 52, 51, 50, 49, 49, + (120,152): 49, 49, 50, 51, 52, 53, 53, 53, 53, 52, 51, 50, 49, 49, 49, + (120,167): 49, 49, 49, 49, 49, 49, 48, 48, 48, 49, 49, 49, 49, 49, 49, + (120,182): 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 50, 50, 50, 51, 51, + (120,197): 51, 52, 52, 52, 51, 50, 48, 46, 44, 44, 43, 43, 43, 44, 45, + (120,212): 47, 48, 50, 51, 51, 52, 52, 52, 55, 58, 60, 62, 64, 73, 93, + (120,227): 119, 143, 160, 163, 161, 153, 143, 133, 115, 66, 28, 5, 1, + (120,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (120,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,0): 94, 94, 94, 95, 96, 101, 103, 105, 107, 107, 108, 105, 102, + (121,13): 100, 102, 97, 67, 34, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,31): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,71): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,111): 1, 1, 1, 1, 9, 39, 72, 97, 104, 104, 96, 87, 78, 70, 69, 79, + (121,127): 99, 127, 160, 191, 198, 200, 198, 195, 190, 183, 177, 168, + (121,139): 157, 131, 108, 87, 70, 58, 53, 52, 51, 50, 49, 49, 49, 49, + (121,153): 50, 51, 52, 53, 53, 53, 53, 52, 51, 50, 49, 49, 49, 49, 49, + (121,168): 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, + (121,183): 47, 47, 46, 46, 46, 46, 46, 47, 47, 48, 48, 49, 50, 51, 51, + (121,198): 52, 52, 53, 53, 52, 52, 50, 48, 46, 45, 44, 43, 43, 44, 44, + (121,213): 46, 47, 50, 51, 51, 52, 52, 53, 54, 57, 59, 62, 66, 75, 91, + (121,228): 114, 140, 159, 161, 159, 153, 142, 127, 101, 61, 23, 3, 1, + (121,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (121,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,0): 93, 94, 94, 95, 97, 102, 104, 106, 107, 108, 109, 108, 104, + (122,13): 101, 102, 101, 84, 51, 18, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,110): 1, 1, 1, 1, 2, 16, 51, 81, 100, 103, 102, 92, 82, 74, 69, + (122,125): 72, 87, 113, 144, 176, 198, 200, 199, 196, 192, 186, 179, + (122,137): 171, 160, 145, 115, 92, 74, 62, 55, 52, 51, 50, 50, 49, 49, + (122,151): 49, 50, 50, 52, 53, 53, 53, 53, 53, 51, 50, 50, 49, 49, 49, + (122,166): 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 47, + (122,181): 46, 46, 45, 44, 44, 44, 44, 44, 45, 45, 46, 47, 48, 48, 50, + (122,196): 50, 51, 52, 52, 53, 53, 54, 53, 53, 51, 50, 48, 46, 44, 43, + (122,211): 43, 43, 44, 45, 47, 49, 50, 51, 52, 52, 53, 54, 56, 59, 62, + (122,226): 66, 74, 89, 112, 145, 156, 160, 159, 152, 136, 122, 92, 53, + (122,239): 15, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (122,299): 1, + (123,0): 93, 94, 94, 96, 98, 103, 105, 107, 107, 108, 109, 109, 106, + (123,13): 103, 101, 102, 96, 68, 32, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (123,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (123,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (123,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (123,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (123,110): 1, 1, 1, 1, 3, 25, 63, 88, 102, 103, 99, 88, 78, 72, 69, 75, + (123,126): 97, 127, 160, 188, 202, 200, 198, 194, 189, 181, 174, 164, + (123,138): 150, 131, 99, 79, 65, 56, 53, 51, 51, 50, 49, 49, 49, 49, + (123,152): 50, 51, 53, 53, 54, 53, 53, 52, 51, 50, 49, 49, 49, 49, 49, + (123,167): 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 46, 45, 44, + (123,182): 43, 43, 43, 43, 43, 43, 44, 44, 45, 46, 46, 47, 48, 49, 50, + (123,197): 51, 52, 52, 53, 54, 54, 54, 54, 54, 53, 51, 49, 47, 44, 44, + (123,212): 43, 43, 44, 45, 47, 49, 50, 51, 52, 52, 52, 54, 56, 60, 62, + (123,227): 66, 72, 85, 120, 143, 156, 161, 160, 146, 135, 116, 86, 38, + (123,240): 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (123,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (123,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,0): 92, 93, 94, 96, 100, 105, 106, 107, 108, 108, 109, 109, 108, + (124,13): 106, 101, 102, 101, 83, 52, 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,110): 1, 1, 1, 2, 5, 33, 74, 95, 102, 103, 95, 83, 75, 70, 69, 80, + (124,126): 109, 143, 174, 197, 203, 199, 195, 191, 185, 177, 168, 155, + (124,138): 138, 116, 84, 68, 58, 54, 52, 51, 50, 49, 49, 49, 49, 50, + (124,152): 51, 52, 53, 54, 54, 53, 52, 51, 50, 49, 49, 49, 49, 49, 49, + (124,167): 49, 49, 49, 49, 49, 50, 50, 50, 49, 48, 47, 45, 43, 42, 42, + (124,182): 42, 42, 42, 43, 43, 43, 44, 44, 45, 46, 47, 47, 48, 49, 50, + (124,197): 51, 52, 52, 53, 54, 54, 54, 55, 55, 55, 54, 53, 51, 47, 45, + (124,212): 44, 43, 43, 43, 44, 46, 48, 50, 52, 52, 52, 52, 53, 56, 60, + (124,227): 62, 65, 69, 88, 119, 143, 158, 162, 158, 144, 132, 112, 77, + (124,240): 15, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (124,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,0): 92, 93, 95, 97, 102, 106, 107, 107, 107, 108, 108, 109, 109, + (125,13): 108, 103, 102, 102, 96, 77, 35, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,110): 1, 1, 1, 3, 8, 49, 83, 98, 101, 101, 90, 79, 73, 70, 71, 91, + (125,126): 128, 162, 188, 201, 202, 196, 192, 187, 180, 170, 158, 142, + (125,138): 121, 96, 69, 59, 54, 52, 51, 50, 49, 48, 48, 48, 49, 51, 52, + (125,153): 53, 54, 54, 53, 53, 52, 50, 49, 49, 49, 49, 49, 49, 49, 49, + (125,168): 49, 49, 50, 50, 50, 50, 49, 47, 44, 43, 42, 41, 42, 42, 42, + (125,183): 43, 43, 44, 45, 46, 47, 47, 48, 49, 49, 49, 50, 50, 51, 51, + (125,198): 52, 52, 53, 54, 54, 54, 55, 55, 55, 55, 55, 54, 52, 50, 47, + (125,213): 45, 43, 43, 43, 44, 45, 47, 50, 51, 52, 52, 52, 53, 55, 58, + (125,228): 62, 64, 69, 83, 109, 137, 157, 161, 157, 145, 131, 118, 57, + (125,241): 20, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (125,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,0): 92, 94, 96, 99, 103, 107, 107, 107, 107, 107, 107, 108, 109, + (126,13): 108, 106, 102, 102, 100, 86, 54, 10, 3, 1, 1, 1, 1, 1, 1, 1, + (126,29): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,69): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,89): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,109): 1, 1, 1, 1, 4, 13, 60, 88, 99, 101, 100, 85, 76, 71, 70, 73, + (126,125): 102, 142, 174, 195, 202, 201, 194, 189, 183, 175, 164, 150, + (126,137): 130, 107, 83, 62, 56, 53, 52, 51, 49, 48, 48, 48, 49, 50, + (126,151): 52, 53, 54, 54, 54, 53, 52, 51, 50, 49, 49, 49, 49, 49, 49, + (126,166): 49, 49, 49, 50, 50, 50, 49, 48, 46, 43, 42, 41, 41, 41, 42, + (126,181): 43, 44, 45, 46, 47, 48, 48, 49, 49, 50, 50, 50, 50, 50, 51, + (126,196): 51, 52, 52, 53, 53, 54, 54, 55, 55, 55, 55, 55, 55, 55, 54, + (126,211): 52, 50, 48, 46, 44, 43, 43, 44, 45, 48, 50, 51, 52, 52, 53, + (126,226): 54, 55, 58, 62, 66, 72, 86, 108, 138, 159, 159, 154, 143, + (126,239): 127, 94, 46, 16, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,257): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (126,297): 1, 1, 1, + (127,0): 92, 94, 96, 100, 104, 107, 107, 107, 107, 106, 106, 107, 108, + (127,13): 109, 108, 103, 103, 102, 94, 73, 17, 6, 1, 1, 1, 1, 1, 1, 1, + (127,29): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (127,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (127,69): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (127,89): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (127,109): 1, 1, 1, 1, 6, 19, 69, 91, 100, 100, 98, 82, 74, 70, 71, 77, + (127,125): 115, 155, 183, 199, 202, 199, 191, 186, 180, 171, 157, 140, + (127,137): 118, 94, 73, 57, 54, 52, 51, 50, 49, 48, 48, 48, 49, 51, 52, + (127,152): 53, 54, 54, 54, 53, 52, 51, 50, 49, 49, 49, 49, 49, 49, 49, + (127,167): 49, 50, 50, 50, 49, 48, 46, 43, 41, 41, 41, 41, 42, 44, 45, + (127,182): 46, 47, 48, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 51, 51, + (127,197): 51, 52, 52, 53, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, 54, + (127,212): 52, 50, 48, 45, 44, 43, 43, 44, 45, 48, 50, 51, 52, 53, 53, + (127,227): 54, 56, 58, 63, 66, 73, 87, 111, 146, 157, 158, 152, 140, + (127,240): 116, 75, 37, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (127,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (127,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (127,299): 1, + (128,0): 92, 94, 97, 101, 105, 107, 107, 107, 107, 106, 105, 106, 107, + (128,13): 109, 109, 104, 103, 102, 99, 88, 29, 9, 2, 1, 1, 1, 1, 1, 1, + (128,29): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (128,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (128,69): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (128,89): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (128,109): 1, 1, 1, 2, 8, 25, 77, 94, 100, 99, 95, 78, 72, 69, 72, 82, + (128,125): 128, 167, 190, 201, 202, 196, 188, 182, 176, 166, 150, 129, + (128,137): 106, 83, 64, 54, 53, 51, 50, 49, 48, 48, 48, 49, 50, 51, 53, + (128,152): 53, 54, 54, 53, 52, 51, 50, 50, 49, 49, 49, 49, 49, 49, 49, + (128,167): 50, 50, 50, 50, 48, 46, 43, 41, 40, 41, 42, 43, 44, 46, 48, + (128,182): 48, 49, 49, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + (128,197): 51, 51, 51, 52, 53, 54, 54, 55, 55, 55, 55, 55, 55, 55, 55, + (128,212): 54, 53, 51, 47, 45, 44, 43, 43, 44, 46, 48, 50, 52, 53, 53, + (128,227): 53, 54, 56, 60, 63, 67, 73, 85, 124, 147, 157, 158, 152, + (128,240): 130, 103, 62, 24, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (128,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (128,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (128,298): 1, 1, + (129,0): 93, 95, 98, 102, 106, 107, 107, 107, 106, 105, 104, 105, 106, + (129,13): 108, 109, 105, 103, 103, 101, 97, 46, 16, 3, 1, 1, 1, 1, 1, + (129,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (129,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (129,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (129,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (129,108): 1, 1, 1, 1, 2, 11, 32, 84, 96, 100, 98, 93, 75, 70, 68, 73, + (129,124): 89, 141, 177, 196, 202, 201, 193, 186, 179, 172, 162, 141, + (129,136): 118, 94, 73, 59, 53, 52, 51, 50, 48, 48, 48, 48, 49, 50, 52, + (129,151): 53, 53, 54, 54, 53, 52, 51, 50, 50, 50, 49, 49, 49, 49, 49, + (129,166): 50, 50, 50, 50, 49, 46, 43, 41, 40, 40, 41, 43, 45, 47, 48, + (129,181): 49, 49, 49, 50, 50, 50, 50, 50, 50, 51, 51, 51, 50, 50, 50, + (129,196): 50, 49, 49, 49, 50, 51, 53, 53, 54, 55, 55, 55, 55, 55, 55, + (129,211): 55, 55, 54, 53, 50, 47, 45, 44, 43, 43, 44, 46, 48, 50, 52, + (129,226): 53, 53, 54, 54, 57, 61, 64, 67, 71, 93, 127, 149, 160, 160, + (129,240): 142, 126, 90, 47, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (129,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (129,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (129,298): 1, 1, + (130,0): 93, 95, 98, 103, 107, 107, 107, 106, 106, 105, 103, 104, 105, + (130,13): 106, 109, 107, 104, 103, 102, 101, 65, 27, 8, 1, 1, 1, 1, 1, + (130,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (130,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (130,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (130,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (130,108): 1, 1, 1, 1, 3, 15, 42, 90, 97, 100, 97, 88, 72, 69, 69, 78, + (130,124): 100, 157, 186, 199, 202, 201, 189, 182, 175, 166, 154, 128, + (130,136): 103, 81, 64, 55, 52, 51, 50, 49, 48, 48, 48, 49, 49, 51, 53, + (130,151): 53, 53, 53, 53, 53, 51, 50, 50, 50, 50, 50, 49, 49, 50, 50, + (130,166): 50, 50, 50, 50, 46, 42, 40, 40, 40, 42, 44, 46, 48, 48, 49, + (130,181): 49, 49, 50, 50, 51, 52, 53, 54, 55, 56, 56, 55, 54, 53, 51, + (130,196): 50, 49, 49, 48, 47, 47, 48, 50, 51, 53, 54, 54, 55, 55, 55, + (130,211): 55, 55, 55, 54, 52, 50, 48, 46, 44, 43, 44, 44, 46, 48, 51, + (130,226): 52, 53, 53, 54, 55, 58, 61, 64, 67, 73, 92, 122, 149, 161, + (130,240): 159, 140, 120, 88, 35, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (130,257): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (130,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (130,297): 1, 1, 1, + (131,0): 94, 95, 99, 103, 107, 107, 107, 106, 105, 104, 103, 103, 104, + (131,13): 105, 108, 107, 104, 103, 102, 102, 78, 34, 11, 2, 1, 1, 1, 1, + (131,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (131,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (131,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (131,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (131,108): 1, 1, 1, 1, 5, 19, 49, 93, 98, 99, 95, 85, 70, 68, 70, 82, + (131,124): 109, 167, 190, 200, 201, 199, 186, 179, 171, 161, 147, 118, + (131,136): 93, 73, 59, 54, 52, 51, 50, 48, 48, 48, 48, 49, 50, 51, 53, + (131,151): 53, 53, 53, 53, 52, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, + (131,166): 50, 50, 50, 48, 42, 40, 40, 40, 41, 44, 46, 47, 48, 48, 49, + (131,181): 49, 50, 51, 53, 58, 62, 67, 71, 74, 77, 77, 76, 74, 71, 65, + (131,196): 60, 56, 52, 49, 47, 47, 47, 47, 48, 50, 51, 53, 54, 54, 55, + (131,211): 55, 55, 55, 54, 53, 52, 50, 47, 45, 44, 44, 44, 45, 46, 49, + (131,226): 51, 52, 53, 54, 55, 57, 59, 62, 65, 69, 78, 99, 126, 154, + (131,240): 161, 153, 136, 108, 68, 15, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (131,257): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (131,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (131,297): 1, 1, 1, + (132,0): 94, 95, 99, 103, 107, 107, 107, 106, 105, 103, 103, 103, 103, + (132,13): 105, 108, 108, 104, 103, 103, 102, 87, 42, 15, 2, 1, 1, 1, 1, + (132,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (132,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (132,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (132,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (132,108): 1, 1, 1, 1, 7, 23, 55, 94, 98, 98, 94, 83, 69, 68, 72, 87, + (132,124): 118, 175, 194, 201, 201, 197, 183, 176, 168, 156, 139, 108, + (132,136): 85, 67, 56, 53, 51, 50, 49, 48, 48, 48, 48, 49, 50, 51, 53, + (132,151): 53, 53, 53, 53, 52, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, + (132,166): 50, 50, 49, 45, 40, 39, 39, 40, 42, 46, 47, 48, 48, 48, 49, + (132,181): 51, 53, 58, 64, 73, 80, 86, 91, 96, 100, 101, 101, 100, 97, + (132,195): 91, 84, 76, 69, 61, 54, 50, 48, 46, 47, 48, 49, 51, 52, 53, + (132,210): 54, 54, 54, 54, 54, 54, 53, 51, 49, 47, 45, 44, 44, 44, 45, + (132,225): 48, 50, 52, 53, 53, 54, 56, 58, 60, 63, 67, 71, 82, 103, + (132,239): 134, 160, 159, 147, 127, 99, 34, 12, 3, 1, 1, 1, 1, 1, 1, 1, + (132,255): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (132,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (132,295): 1, 1, 1, 1, 1, + (133,0): 94, 96, 99, 104, 107, 107, 107, 106, 104, 103, 102, 102, 103, + (133,13): 104, 108, 108, 104, 103, 103, 102, 93, 50, 20, 3, 1, 1, 1, 1, + (133,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (133,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, + (133,68): 2, 2, 2, 2, 2, 2, 3, 5, 6, 7, 7, 6, 5, 3, 2, 1, 1, 1, 1, 1, + (133,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (133,108): 1, 1, 1, 2, 8, 26, 61, 95, 98, 98, 93, 81, 69, 68, 73, 91, + (133,124): 126, 183, 196, 201, 200, 195, 181, 173, 164, 151, 131, 99, + (133,136): 77, 62, 55, 53, 51, 50, 49, 48, 48, 48, 49, 49, 50, 51, 52, + (133,151): 53, 53, 53, 53, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, + (133,166): 50, 49, 47, 42, 39, 39, 40, 41, 44, 47, 47, 48, 48, 48, 50, + (133,181): 54, 60, 68, 77, 88, 96, 102, 108, 112, 117, 119, 121, 121, + (133,194): 121, 117, 111, 103, 94, 83, 69, 61, 54, 50, 47, 47, 48, 49, + (133,208): 50, 52, 53, 53, 54, 54, 54, 54, 53, 52, 50, 48, 46, 44, 44, + (133,223): 44, 44, 46, 49, 51, 52, 53, 54, 55, 57, 59, 62, 66, 68, 72, + (133,238): 84, 108, 150, 159, 155, 142, 122, 61, 25, 7, 1, 1, 1, 1, 1, + (133,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (133,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (133,293): 1, 1, 1, 1, 1, 1, 1, + (134,0): 94, 96, 99, 104, 107, 107, 107, 106, 104, 103, 102, 102, 102, + (134,13): 104, 108, 108, 105, 103, 103, 103, 97, 58, 25, 4, 1, 1, 1, 1, + (134,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (134,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 6, 6, 6, + (134,68): 5, 5, 4, 4, 4, 6, 8, 14, 18, 21, 21, 19, 14, 9, 5, 2, 1, 1, + (134,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (134,106): 1, 1, 1, 1, 1, 2, 10, 29, 67, 96, 98, 97, 91, 79, 68, 68, + (134,122): 75, 95, 134, 189, 198, 202, 199, 192, 179, 170, 160, 145, + (134,134): 123, 90, 70, 59, 54, 52, 51, 49, 48, 48, 48, 48, 49, 50, 50, + (134,149): 51, 52, 52, 53, 53, 52, 51, 50, 50, 50, 50, 50, 50, 50, 50, + (134,164): 50, 50, 50, 48, 45, 40, 39, 39, 40, 43, 46, 47, 47, 47, 48, + (134,179): 49, 54, 62, 71, 82, 90, 98, 103, 108, 112, 116, 120, 123, + (134,192): 125, 127, 129, 131, 131, 129, 124, 114, 96, 82, 69, 58, 50, + (134,205): 47, 47, 47, 48, 50, 52, 52, 53, 53, 54, 54, 53, 53, 51, 50, + (134,220): 47, 45, 44, 44, 44, 45, 47, 50, 52, 53, 54, 54, 56, 58, 61, + (134,235): 65, 68, 70, 74, 82, 127, 153, 161, 154, 134, 93, 44, 15, 3, + (134,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (134,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (134,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (135,0): 94, 96, 99, 103, 107, 107, 107, 106, 104, 102, 102, 102, 102, + (135,13): 104, 108, 108, 105, 103, 103, 103, 100, 65, 30, 5, 1, 1, 1, + (135,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (135,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 9, 14, 23, 30, 36, 41, 44, + (135,65): 45, 44, 41, 37, 33, 28, 27, 28, 32, 41, 57, 69, 76, 79, 79, + (135,80): 71, 57, 41, 25, 12, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (135,99): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 12, 34, 74, 97, 98, + (135,117): 96, 90, 77, 68, 68, 76, 99, 143, 193, 200, 202, 198, 189, + (135,130): 176, 167, 154, 137, 113, 80, 64, 56, 53, 52, 50, 49, 48, 48, + (135,144): 48, 48, 49, 50, 51, 51, 52, 52, 52, 52, 52, 51, 50, 50, 50, + (135,159): 50, 50, 50, 50, 50, 50, 51, 49, 46, 42, 39, 38, 39, 42, 45, + (135,174): 46, 47, 47, 47, 49, 53, 63, 73, 81, 87, 92, 99, 103, 107, + (135,188): 109, 112, 115, 118, 121, 125, 128, 132, 133, 134, 134, 134, + (135,200): 130, 119, 104, 88, 71, 56, 50, 48, 47, 48, 50, 51, 52, 53, + (135,214): 53, 53, 53, 53, 52, 51, 49, 47, 45, 44, 43, 44, 46, 48, 50, + (135,229): 53, 54, 54, 55, 57, 59, 65, 67, 69, 70, 73, 90, 129, 152, + (135,243): 160, 156, 125, 77, 37, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (135,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (135,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (136,0): 94, 95, 99, 103, 107, 107, 107, 106, 105, 103, 102, 102, 103, + (136,13): 105, 108, 108, 104, 102, 102, 103, 101, 69, 33, 6, 1, 1, 1, + (136,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (136,47): 1, 1, 1, 1, 1, 1, 2, 3, 10, 20, 32, 44, 55, 65, 70, 74, 77, + (136,64): 79, 80, 79, 78, 76, 73, 69, 65, 64, 67, 73, 85, 91, 95, 97, + (136,79): 98, 96, 90, 82, 70, 53, 25, 12, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (136,97): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 14, 38, 78, 97, + (136,116): 98, 96, 89, 76, 67, 68, 77, 102, 149, 195, 200, 202, 197, + (136,129): 187, 174, 164, 150, 131, 106, 74, 61, 54, 52, 52, 50, 48, + (136,142): 48, 48, 48, 48, 49, 50, 50, 51, 51, 52, 52, 52, 52, 51, 50, + (136,157): 50, 50, 50, 50, 50, 50, 50, 51, 50, 48, 44, 40, 38, 38, 40, + (136,172): 43, 46, 46, 46, 47, 48, 51, 57, 68, 75, 81, 87, 90, 92, 91, + (136,187): 89, 87, 86, 86, 89, 93, 98, 105, 116, 123, 129, 133, 135, + (136,200): 135, 132, 126, 116, 100, 76, 63, 54, 49, 47, 48, 50, 51, 52, + (136,214): 52, 53, 53, 53, 52, 52, 50, 48, 46, 45, 44, 44, 45, 47, 49, + (136,229): 52, 54, 54, 55, 56, 58, 63, 67, 69, 70, 72, 79, 105, 135, + (136,243): 158, 161, 138, 104, 61, 23, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (136,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (136,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (137,0): 94, 95, 98, 103, 107, 107, 107, 107, 105, 103, 103, 102, 104, + (137,13): 106, 109, 108, 103, 102, 102, 104, 102, 72, 35, 7, 1, 1, 1, + (137,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (137,47): 1, 1, 1, 1, 2, 5, 12, 23, 41, 53, 64, 73, 80, 86, 88, 90, 92, + (137,64): 93, 94, 94, 93, 93, 92, 90, 88, 88, 89, 92, 98, 101, 103, + (137,78): 105, 105, 105, 104, 101, 95, 85, 64, 43, 23, 9, 2, 1, 1, 1, + (137,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 16, + (137,113): 42, 81, 97, 98, 96, 88, 75, 67, 68, 78, 104, 152, 196, 201, + (137,127): 202, 197, 185, 172, 162, 146, 125, 99, 69, 59, 54, 52, 51, + (137,140): 49, 48, 48, 48, 48, 49, 49, 50, 50, 51, 51, 51, 52, 51, 51, + (137,155): 51, 50, 50, 50, 50, 50, 50, 50, 51, 51, 50, 47, 43, 39, 38, + (137,170): 38, 41, 44, 46, 46, 46, 46, 49, 53, 60, 70, 75, 79, 81, 80, + (137,185): 75, 70, 67, 64, 62, 62, 64, 66, 70, 75, 86, 96, 106, 117, + (137,199): 127, 135, 137, 136, 132, 124, 103, 84, 68, 57, 50, 48, 49, + (137,212): 50, 51, 52, 53, 53, 53, 52, 52, 50, 49, 47, 45, 44, 44, 44, + (137,227): 46, 48, 51, 53, 54, 54, 55, 57, 61, 67, 70, 71, 72, 74, 87, + (137,242): 115, 145, 162, 152, 125, 85, 42, 11, 1, 1, 1, 1, 1, 1, 1, 1, + (137,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (137,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (137,298): 1, 1, + (138,0): 93, 95, 98, 102, 107, 107, 107, 107, 106, 104, 103, 103, 105, + (138,13): 107, 109, 108, 103, 101, 102, 104, 103, 74, 37, 7, 2, 2, 1, + (138,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (138,47): 1, 1, 1, 4, 11, 22, 36, 53, 74, 83, 88, 90, 91, 91, 91, 91, + (138,63): 92, 93, 94, 95, 96, 96, 97, 99, 99, 99, 100, 101, 103, 104, + (138,77): 105, 105, 106, 106, 106, 105, 105, 104, 97, 79, 54, 29, 9, 1, + (138,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (138,111): 4, 19, 45, 84, 98, 98, 95, 88, 74, 67, 68, 79, 106, 155, + (138,125): 197, 202, 202, 196, 183, 170, 159, 142, 120, 93, 65, 57, 53, + (138,138): 52, 51, 49, 48, 48, 48, 48, 49, 49, 50, 50, 51, 51, 51, 51, + (138,153): 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 51, 51, 50, 46, 41, + (138,168): 38, 37, 39, 42, 45, 46, 46, 46, 47, 49, 55, 61, 69, 73, 73, + (138,183): 71, 65, 56, 52, 49, 47, 47, 47, 47, 48, 49, 51, 57, 65, 76, + (138,198): 90, 105, 123, 131, 136, 139, 139, 128, 110, 90, 71, 57, 49, + (138,211): 49, 49, 50, 51, 52, 52, 53, 52, 52, 51, 49, 48, 46, 45, 44, + (138,226): 44, 45, 47, 50, 53, 54, 54, 55, 56, 60, 66, 70, 73, 73, 73, + (138,241): 76, 95, 125, 157, 162, 142, 107, 66, 23, 3, 1, 1, 1, 1, 1, + (138,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (138,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (138,296): 1, 1, 1, 1, + (139,0): 93, 95, 97, 101, 106, 107, 107, 108, 107, 105, 104, 105, 107, + (139,13): 109, 109, 106, 101, 101, 102, 105, 103, 75, 38, 8, 3, 3, 1, + (139,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (139,47): 1, 1, 2, 13, 34, 57, 77, 87, 90, 91, 92, 91, 90, 86, 84, 84, + (139,63): 83, 84, 87, 90, 93, 95, 98, 100, 101, 102, 103, 103, 104, + (139,76): 105, 105, 105, 105, 105, 105, 106, 106, 106, 105, 103, 93, + (139,88): 69, 28, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (139,108): 1, 1, 1, 4, 21, 48, 85, 98, 98, 95, 88, 74, 67, 67, 79, 107, + (139,124): 156, 198, 202, 201, 195, 182, 168, 157, 138, 115, 88, 62, + (139,136): 56, 53, 52, 51, 49, 48, 48, 48, 48, 49, 49, 50, 50, 50, 51, + (139,151): 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 51, 51, 51, 49, + (139,166): 44, 40, 38, 37, 39, 43, 45, 46, 46, 46, 47, 50, 55, 61, 67, + (139,181): 67, 64, 57, 48, 45, 44, 44, 43, 43, 44, 44, 44, 44, 45, 45, + (139,196): 47, 50, 55, 66, 92, 114, 129, 139, 142, 142, 135, 118, 95, + (139,209): 71, 53, 50, 49, 49, 50, 52, 52, 52, 52, 52, 51, 50, 49, 47, + (139,224): 45, 44, 44, 45, 46, 49, 53, 54, 54, 55, 56, 59, 64, 70, 74, + (139,239): 76, 74, 74, 80, 101, 144, 164, 152, 128, 92, 41, 7, 2, 1, 1, + (139,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (139,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (139,294): 1, 1, 1, 1, 1, 1, + (140,0): 92, 95, 97, 100, 106, 107, 107, 108, 108, 108, 107, 108, 108, + (140,13): 109, 109, 103, 100, 100, 102, 105, 102, 73, 37, 9, 6, 7, 3, + (140,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (140,47): 4, 13, 31, 68, 82, 88, 90, 91, 88, 82, 75, 70, 65, 62, 61, + (140,62): 61, 62, 64, 68, 73, 79, 86, 93, 100, 102, 103, 104, 104, 104, + (140,76): 103, 103, 103, 102, 102, 102, 102, 103, 104, 105, 105, 104, + (140,88): 100, 90, 30, 10, 2, 1, 1, 3, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (140,107): 1, 1, 1, 1, 5, 23, 51, 85, 98, 98, 95, 88, 75, 67, 67, 79, + (140,123): 107, 156, 198, 202, 201, 195, 181, 165, 153, 134, 109, 83, + (140,135): 59, 55, 52, 51, 50, 48, 48, 48, 48, 48, 49, 50, 50, 50, 50, + (140,150): 50, 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 51, 51, 51, 51, + (140,165): 49, 43, 39, 37, 37, 40, 44, 45, 45, 45, 45, 46, 50, 54, 59, + (140,180): 59, 57, 51, 46, 44, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, + (140,195): 44, 44, 44, 45, 46, 51, 64, 85, 110, 133, 143, 145, 142, + (140,208): 131, 108, 73, 59, 52, 49, 50, 51, 52, 52, 52, 52, 52, 51, + (140,222): 49, 48, 46, 45, 44, 44, 45, 47, 51, 53, 54, 55, 55, 58, 62, + (140,237): 69, 75, 80, 79, 76, 76, 83, 103, 158, 163, 151, 121, 75, 20, + (140,251): 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (140,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (140,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (141,0): 92, 94, 96, 99, 106, 107, 107, 108, 108, 108, 109, 109, 109, + (141,13): 109, 108, 101, 100, 100, 102, 105, 101, 69, 36, 12, 9, 9, 4, + (141,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 11, + (141,47): 29, 50, 69, 82, 87, 88, 86, 82, 74, 69, 65, 62, 60, 58, 57, + (141,62): 58, 59, 61, 65, 70, 77, 85, 93, 100, 101, 102, 102, 102, 103, + (141,76): 102, 102, 102, 102, 101, 100, 99, 99, 99, 101, 102, 103, 103, + (141,89): 100, 73, 34, 12, 2, 1, 2, 7, 9, 8, 5, 2, 1, 1, 1, 1, 1, 1, 1, + (141,108): 1, 1, 1, 5, 24, 52, 85, 98, 98, 95, 88, 75, 67, 68, 78, 106, + (141,124): 156, 198, 202, 201, 194, 180, 164, 151, 131, 105, 79, 58, + (141,136): 54, 52, 51, 50, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, + (141,151): 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, + (141,166): 42, 38, 37, 37, 41, 44, 45, 45, 45, 45, 46, 49, 53, 55, 55, + (141,181): 51, 47, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 44, 44, + (141,196): 44, 44, 44, 44, 46, 50, 59, 74, 97, 130, 141, 145, 142, 133, + (141,210): 101, 76, 61, 52, 50, 50, 51, 52, 52, 52, 52, 51, 50, 49, 47, + (141,225): 45, 44, 44, 45, 46, 51, 53, 54, 55, 55, 57, 61, 67, 73, 81, + (141,240): 83, 80, 77, 78, 85, 140, 159, 156, 136, 103, 38, 14, 4, 1, + (141,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (141,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (141,294): 1, 1, 1, 1, 1, 1, + (142,0): 91, 94, 96, 98, 105, 107, 107, 107, 108, 109, 109, 109, 109, + (142,13): 108, 106, 100, 99, 100, 102, 104, 99, 65, 35, 15, 13, 12, 4, + (142,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 20, 39, + (142,47): 57, 73, 84, 86, 85, 82, 78, 73, 66, 63, 60, 58, 57, 56, 56, + (142,62): 57, 58, 60, 64, 70, 77, 85, 94, 100, 101, 101, 102, 102, 102, + (142,76): 102, 101, 100, 98, 97, 96, 95, 95, 95, 96, 97, 99, 101, 103, + (142,90): 95, 66, 36, 11, 3, 3, 8, 15, 20, 19, 12, 5, 2, 1, 1, 1, 1, 1, + (142,108): 1, 1, 1, 5, 24, 52, 85, 98, 98, 95, 88, 76, 67, 68, 77, 103, + (142,124): 154, 198, 202, 201, 194, 180, 164, 150, 128, 103, 76, 57, + (142,136): 54, 52, 51, 50, 48, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, + (142,151): 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, + (142,166): 41, 38, 37, 37, 41, 44, 45, 45, 45, 45, 45, 48, 50, 51, 51, + (142,181): 47, 45, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + (142,196): 43, 43, 43, 43, 43, 44, 47, 54, 67, 101, 125, 139, 146, 145, + (142,210): 126, 99, 76, 59, 52, 50, 51, 51, 52, 52, 52, 52, 51, 49, 48, + (142,225): 45, 45, 44, 45, 46, 50, 53, 54, 55, 55, 56, 60, 65, 72, 81, + (142,240): 86, 84, 81, 78, 77, 113, 148, 159, 150, 127, 61, 26, 8, 2, + (142,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (142,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (142,294): 1, 1, 1, 1, 1, 1, + (143,0): 89, 93, 95, 97, 104, 106, 106, 107, 108, 109, 109, 109, 108, + (143,13): 106, 103, 99, 98, 100, 103, 104, 96, 60, 33, 18, 17, 13, 4, + (143,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 8, 19, 47, + (143,46): 69, 79, 82, 83, 82, 79, 74, 70, 67, 63, 61, 59, 58, 57, 56, + (143,61): 56, 56, 58, 60, 65, 71, 78, 87, 95, 101, 101, 102, 102, 103, + (143,75): 102, 100, 97, 95, 93, 91, 90, 90, 91, 92, 93, 93, 95, 97, + (143,89): 101, 102, 93, 66, 34, 11, 5, 7, 17, 29, 36, 29, 17, 8, 3, 1, + (143,105): 1, 1, 1, 1, 1, 1, 5, 23, 52, 85, 98, 98, 95, 89, 76, 67, 68, + (143,122): 76, 100, 151, 198, 202, 202, 194, 180, 163, 149, 126, 100, + (143,134): 74, 56, 53, 52, 51, 50, 48, 48, 48, 49, 49, 50, 50, 50, 50, + (143,149): 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + (143,164): 51, 48, 41, 38, 37, 37, 41, 43, 44, 44, 44, 44, 45, 47, 48, + (143,179): 49, 48, 45, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, + (143,194): 43, 43, 43, 43, 43, 43, 43, 43, 43, 45, 48, 68, 99, 124, + (143,208): 141, 148, 144, 123, 97, 72, 56, 51, 51, 51, 52, 52, 52, 52, + (143,222): 51, 50, 48, 46, 45, 45, 45, 45, 49, 52, 54, 55, 55, 56, 59, + (143,237): 65, 72, 81, 88, 88, 85, 81, 76, 88, 132, 156, 161, 145, 86, + (143,251): 42, 15, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (143,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (143,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (144,0): 88, 93, 95, 97, 102, 106, 106, 106, 106, 108, 108, 108, 107, + (144,13): 104, 99, 97, 97, 100, 103, 104, 93, 55, 32, 22, 20, 11, 4, 1, + (144,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 24, 56, 77, 81, + (144,47): 82, 81, 78, 72, 70, 68, 66, 64, 63, 61, 59, 58, 57, 56, 56, + (144,62): 57, 59, 62, 67, 72, 79, 88, 96, 103, 105, 105, 104, 103, 99, + (144,76): 94, 90, 87, 85, 84, 84, 85, 87, 90, 92, 92, 93, 93, 95, 101, + (144,91): 102, 97, 76, 32, 10, 11, 15, 26, 50, 53, 40, 22, 7, 2, 1, 1, + (144,107): 1, 1, 1, 1, 4, 22, 50, 83, 98, 98, 96, 89, 77, 67, 67, 74, + (144,123): 97, 146, 198, 203, 202, 195, 180, 163, 148, 125, 99, 73, 56, + (144,136): 53, 52, 51, 50, 48, 48, 48, 49, 49, 50, 50, 50, 50, 50, 50, + (144,151): 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 48, + (144,166): 41, 38, 36, 37, 41, 43, 44, 44, 44, 44, 44, 45, 47, 47, 46, + (144,181): 44, 44, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 42, + (144,196): 42, 42, 42, 42, 42, 42, 42, 43, 43, 47, 67, 97, 127, 145, + (144,210): 149, 142, 120, 92, 65, 52, 51, 51, 51, 52, 52, 52, 51, 50, + (144,224): 49, 46, 45, 45, 45, 45, 48, 51, 54, 55, 55, 56, 58, 64, 71, + (144,239): 79, 90, 91, 89, 85, 79, 77, 115, 148, 165, 157, 113, 61, 26, + (144,253): 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (144,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (144,293): 1, 1, 1, 1, 1, 1, 1, + (145,0): 85, 92, 94, 96, 100, 106, 106, 106, 105, 105, 106, 106, 104, + (145,13): 100, 96, 96, 97, 100, 103, 103, 84, 50, 32, 25, 22, 8, 3, 1, + (145,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 18, 46, 72, 80, 79, + (145,46): 75, 73, 72, 71, 69, 68, 67, 66, 65, 64, 63, 61, 59, 57, 56, + (145,61): 56, 59, 62, 66, 70, 78, 89, 99, 106, 107, 106, 104, 100, 95, + (145,75): 86, 83, 81, 80, 80, 80, 81, 83, 86, 89, 91, 92, 92, 92, 93, + (145,90): 94, 100, 102, 101, 96, 53, 30, 23, 26, 32, 64, 66, 58, 39, + (145,104): 12, 2, 1, 1, 1, 1, 1, 3, 18, 44, 79, 97, 98, 96, 91, 79, 67, + (145,121): 67, 72, 91, 136, 195, 202, 202, 196, 182, 164, 147, 124, 98, + (145,134): 71, 55, 53, 52, 51, 49, 49, 48, 49, 49, 49, 50, 50, 50, 50, + (145,149): 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, + (145,164): 51, 48, 42, 38, 36, 36, 40, 42, 44, 44, 44, 44, 44, 44, 45, + (145,179): 45, 45, 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 43, 42, 42, + (145,194): 42, 42, 42, 41, 40, 40, 39, 40, 40, 41, 42, 43, 46, 63, 91, + (145,209): 128, 147, 148, 141, 123, 90, 59, 53, 51, 51, 52, 52, 52, 52, + (145,223): 51, 49, 47, 46, 45, 45, 45, 47, 51, 53, 55, 55, 56, 57, 63, + (145,238): 70, 77, 90, 93, 94, 92, 85, 76, 87, 123, 157, 164, 142, 92, + (145,252): 48, 16, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (145,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (145,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (146,0): 83, 92, 94, 95, 98, 106, 106, 106, 104, 103, 103, 103, 100, + (146,13): 97, 96, 95, 98, 101, 103, 102, 76, 46, 32, 26, 21, 5, 2, 1, + (146,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 24, 52, 69, 76, 76, 74, + (146,46): 73, 72, 72, 73, 71, 69, 68, 67, 67, 66, 64, 61, 59, 57, 57, + (146,61): 58, 62, 66, 70, 80, 92, 100, 105, 107, 106, 103, 97, 91, 85, + (146,75): 80, 78, 76, 75, 74, 75, 77, 80, 83, 87, 91, 92, 92, 92, 93, + (146,90): 94, 96, 99, 101, 101, 89, 71, 51, 36, 37, 51, 65, 67, 59, 40, + (146,105): 9, 3, 1, 1, 1, 1, 2, 15, 39, 75, 97, 98, 97, 92, 81, 68, 67, + (146,122): 70, 87, 127, 191, 202, 203, 197, 183, 165, 148, 125, 98, 71, + (146,135): 55, 53, 52, 51, 49, 49, 48, 49, 49, 50, 50, 50, 50, 50, 50, + (146,150): 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + (146,165): 49, 42, 38, 36, 36, 39, 42, 43, 44, 43, 43, 43, 44, 44, 45, + (146,180): 45, 45, 44, 44, 44, 44, 44, 44, 44, 43, 43, 42, 42, 42, 41, + (146,195): 41, 41, 40, 39, 38, 37, 37, 38, 39, 41, 42, 44, 51, 68, 101, + (146,210): 139, 146, 146, 136, 113, 72, 59, 53, 52, 52, 52, 52, 52, 51, + (146,224): 50, 48, 46, 45, 45, 45, 47, 50, 53, 55, 55, 56, 57, 62, 70, + (146,239): 77, 89, 94, 97, 95, 91, 79, 80, 108, 142, 165, 155, 115, 69, + (146,253): 28, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (146,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (146,293): 1, 1, 1, 1, 1, 1, 1, + (147,0): 81, 91, 94, 95, 97, 105, 106, 106, 105, 102, 101, 100, 98, 96, + (147,14): 95, 96, 99, 101, 102, 99, 67, 44, 32, 26, 17, 3, 1, 1, 1, 1, + (147,30): 1, 1, 1, 1, 1, 1, 1, 1, 6, 18, 52, 70, 75, 75, 73, 74, 77, + (147,47): 77, 76, 75, 73, 70, 69, 69, 68, 66, 64, 61, 59, 58, 59, 62, + (147,62): 67, 72, 78, 90, 100, 105, 107, 106, 102, 96, 89, 83, 78, 73, + (147,76): 71, 69, 68, 68, 70, 72, 76, 80, 84, 90, 91, 92, 92, 93, 94, + (147,91): 95, 96, 99, 101, 101, 93, 79, 64, 51, 50, 61, 68, 68, 60, 28, + (147,106): 11, 3, 1, 1, 1, 2, 11, 32, 69, 95, 97, 97, 93, 83, 68, 67, + (147,122): 69, 83, 117, 186, 200, 204, 198, 185, 166, 149, 126, 99, 72, + (147,135): 55, 53, 51, 51, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, + (147,150): 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + (147,165): 50, 43, 39, 36, 36, 38, 41, 42, 43, 43, 43, 43, 43, 44, 44, + (147,180): 45, 44, 44, 44, 44, 44, 44, 44, 43, 43, 42, 42, 41, 40, 40, + (147,195): 40, 40, 39, 38, 37, 36, 35, 35, 36, 38, 41, 42, 45, 54, 75, + (147,210): 124, 141, 147, 143, 131, 89, 67, 56, 52, 52, 52, 52, 52, 52, + (147,224): 51, 48, 47, 45, 45, 45, 46, 50, 53, 55, 56, 56, 57, 62, 69, + (147,239): 77, 87, 95, 98, 98, 96, 84, 79, 94, 123, 161, 161, 135, 90, + (147,253): 44, 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (147,272): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (147,292): 1, 1, 1, 1, 1, 1, 1, 1, + (148,0): 79, 90, 94, 94, 95, 104, 105, 106, 105, 102, 99, 98, 97, 96, + (148,14): 96, 97, 100, 101, 100, 93, 59, 41, 31, 24, 12, 1, 1, 1, 1, 1, + (148,30): 1, 1, 1, 1, 1, 1, 1, 6, 18, 42, 74, 75, 74, 72, 75, 80, 84, + (148,47): 85, 82, 76, 73, 71, 70, 69, 68, 66, 64, 61, 60, 60, 63, 67, + (148,62): 72, 78, 86, 99, 104, 106, 105, 103, 95, 87, 81, 75, 71, 66, + (148,76): 63, 62, 62, 63, 65, 68, 72, 76, 81, 88, 90, 92, 92, 93, 95, + (148,91): 95, 95, 96, 98, 100, 100, 98, 90, 71, 60, 60, 66, 71, 72, 51, + (148,106): 25, 9, 3, 1, 1, 1, 8, 26, 61, 94, 97, 97, 94, 86, 70, 67, + (148,122): 68, 79, 107, 179, 198, 204, 199, 187, 167, 150, 127, 100, + (148,134): 73, 55, 53, 51, 51, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, + (148,149): 50, 50, 50, 50, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, + (148,164): 51, 50, 45, 40, 37, 36, 37, 39, 41, 42, 43, 43, 43, 43, 43, + (148,179): 44, 44, 44, 44, 44, 44, 44, 44, 43, 43, 42, 41, 40, 40, 40, + (148,194): 39, 39, 39, 38, 38, 37, 34, 33, 33, 33, 35, 40, 41, 43, 46, + (148,209): 55, 103, 132, 144, 147, 143, 108, 78, 61, 53, 52, 52, 52, + (148,222): 52, 52, 51, 49, 47, 46, 45, 45, 46, 49, 53, 55, 56, 56, 57, + (148,237): 61, 68, 77, 86, 94, 99, 100, 100, 90, 81, 84, 106, 153, 164, + (148,251): 150, 111, 64, 21, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (148,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (148,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (149,0): 77, 90, 94, 94, 94, 102, 105, 106, 105, 102, 99, 97, 96, 96, + (149,14): 96, 98, 100, 101, 97, 86, 50, 37, 29, 20, 7, 1, 1, 1, 1, 1, + (149,30): 1, 1, 1, 1, 1, 1, 2, 16, 39, 71, 76, 72, 70, 74, 84, 92, 92, + (149,47): 90, 86, 77, 73, 71, 70, 70, 68, 66, 64, 63, 62, 62, 66, 70, + (149,62): 77, 85, 94, 104, 105, 105, 103, 96, 84, 78, 72, 67, 61, 58, + (149,76): 58, 59, 60, 61, 62, 64, 67, 72, 77, 85, 89, 91, 92, 93, 95, + (149,91): 96, 96, 95, 94, 94, 95, 95, 94, 93, 77, 69, 67, 71, 76, 73, + (149,106): 46, 22, 6, 2, 1, 1, 5, 19, 52, 91, 96, 97, 95, 89, 72, 67, + (149,122): 67, 75, 96, 170, 196, 205, 201, 190, 170, 152, 129, 102, 75, + (149,135): 55, 53, 51, 51, 49, 49, 49, 49, 49, 50, 50, 50, 50, 50, 50, + (149,150): 50, 49, 49, 50, 50, 50, 51, 51, 51, 51, 51, 51, 51, 51, 51, + (149,165): 51, 46, 41, 37, 36, 37, 38, 40, 41, 42, 43, 43, 43, 43, 43, + (149,180): 43, 44, 44, 44, 44, 44, 43, 42, 41, 40, 40, 40, 39, 39, 39, + (149,195): 39, 38, 38, 37, 36, 33, 32, 31, 31, 32, 37, 40, 42, 44, 46, + (149,210): 78, 119, 140, 147, 147, 126, 91, 68, 55, 52, 52, 52, 52, 52, + (149,224): 52, 49, 47, 46, 45, 45, 46, 49, 52, 55, 56, 56, 57, 61, 67, + (149,239): 77, 86, 93, 99, 102, 102, 96, 84, 81, 95, 138, 164, 159, + (149,252): 130, 86, 34, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (149,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (149,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (150,0): 75, 89, 93, 93, 94, 99, 103, 105, 106, 105, 100, 98, 97, 97, + (150,14): 97, 100, 100, 99, 92, 74, 43, 30, 22, 14, 3, 1, 1, 1, 1, 1, + (150,30): 1, 1, 1, 1, 1, 2, 15, 43, 68, 75, 71, 70, 77, 87, 98, 101, + (150,46): 100, 95, 88, 81, 74, 73, 73, 72, 71, 67, 65, 64, 64, 66, 74, + (150,61): 85, 95, 103, 107, 106, 101, 95, 87, 79, 71, 65, 59, 56, 55, + (150,75): 56, 56, 56, 56, 55, 56, 57, 60, 64, 69, 77, 84, 88, 90, 92, + (150,90): 94, 97, 98, 98, 98, 97, 95, 93, 92, 91, 90, 83, 77, 74, 75, + (150,105): 79, 75, 54, 28, 7, 1, 1, 3, 12, 36, 84, 94, 97, 96, 92, 75, + (150,121): 69, 67, 71, 83, 155, 190, 204, 203, 193, 173, 156, 133, 106, + (150,134): 78, 56, 53, 51, 51, 50, 49, 49, 49, 49, 50, 50, 50, 50, 50, + (150,149): 50, 50, 49, 49, 50, 50, 50, 51, 51, 52, 52, 51, 51, 51, 51, + (150,164): 52, 51, 49, 44, 39, 37, 37, 38, 38, 39, 39, 41, 42, 42, 43, + (150,179): 43, 43, 43, 43, 43, 42, 41, 40, 40, 40, 40, 40, 40, 40, 40, + (150,194): 39, 39, 39, 38, 37, 36, 33, 31, 29, 29, 29, 33, 38, 41, 43, + (150,209): 44, 56, 96, 127, 145, 147, 140, 109, 81, 60, 53, 52, 52, 52, + (150,223): 52, 52, 50, 48, 47, 46, 46, 46, 49, 52, 55, 56, 56, 57, 60, + (150,238): 67, 76, 86, 91, 98, 102, 103, 102, 90, 83, 87, 109, 160, + (150,251): 161, 147, 114, 58, 12, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (150,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (150,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (151,0): 73, 88, 93, 93, 93, 97, 101, 104, 106, 106, 102, 101, 100, 99, + (151,14): 99, 100, 100, 96, 85, 65, 35, 25, 17, 9, 1, 1, 1, 1, 1, 1, 1, + (151,31): 1, 1, 1, 1, 9, 37, 59, 72, 73, 70, 74, 85, 96, 104, 106, 104, + (151,47): 99, 93, 87, 81, 79, 77, 75, 72, 68, 67, 69, 74, 84, 93, 99, + (151,62): 101, 102, 102, 95, 88, 83, 77, 70, 59, 56, 53, 52, 51, 51, + (151,76): 50, 51, 51, 53, 54, 55, 57, 59, 63, 70, 77, 82, 86, 89, 92, + (151,91): 95, 97, 98, 99, 99, 99, 98, 97, 95, 93, 90, 84, 78, 76, 78, + (151,106): 77, 69, 51, 23, 3, 1, 2, 8, 24, 74, 91, 96, 96, 94, 79, 70, + (151,122): 67, 69, 77, 139, 182, 202, 204, 196, 177, 160, 137, 110, 81, + (151,135): 57, 53, 51, 51, 50, 49, 49, 49, 49, 50, 50, 51, 50, 50, 50, + (151,150): 50, 49, 49, 49, 50, 50, 51, 51, 52, 52, 52, 51, 51, 51, 52, + (151,165): 52, 50, 46, 41, 38, 37, 38, 38, 38, 38, 39, 40, 40, 41, 41, + (151,180): 42, 42, 41, 41, 40, 39, 39, 39, 40, 40, 40, 41, 41, 42, 42, + (151,195): 42, 42, 41, 40, 38, 34, 31, 29, 28, 28, 31, 36, 40, 42, 44, + (151,210): 51, 82, 116, 141, 147, 143, 120, 91, 66, 54, 53, 53, 53, 52, + (151,224): 52, 51, 49, 47, 46, 46, 46, 49, 52, 55, 56, 57, 57, 60, 66, + (151,239): 76, 85, 90, 96, 101, 104, 103, 95, 86, 84, 94, 151, 159, + (151,252): 154, 130, 80, 21, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (151,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (151,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (152,0): 72, 87, 93, 93, 92, 95, 98, 103, 106, 106, 104, 102, 101, 101, + (152,14): 101, 101, 99, 91, 75, 53, 27, 20, 12, 5, 1, 1, 1, 1, 1, 1, 1, + (152,31): 1, 1, 1, 3, 24, 53, 68, 73, 71, 70, 80, 92, 102, 107, 108, + (152,46): 105, 101, 97, 91, 86, 83, 81, 77, 74, 72, 77, 82, 89, 96, + (152,60): 101, 101, 98, 95, 92, 85, 78, 70, 63, 57, 51, 48, 47, 45, 44, + (152,75): 44, 44, 46, 48, 50, 52, 53, 54, 55, 57, 63, 69, 75, 81, 84, + (152,90): 87, 90, 93, 95, 98, 100, 101, 101, 100, 99, 97, 96, 92, 88, + (152,104): 83, 80, 79, 76, 67, 45, 11, 4, 2, 5, 15, 62, 86, 95, 96, 95, + (152,120): 82, 72, 67, 68, 73, 122, 173, 198, 205, 199, 180, 164, 141, + (152,133): 115, 85, 59, 54, 52, 51, 50, 49, 49, 49, 49, 50, 51, 51, 51, + (152,148): 50, 50, 50, 50, 49, 50, 50, 50, 51, 51, 52, 52, 52, 51, 51, + (152,163): 51, 52, 52, 51, 49, 44, 39, 38, 38, 38, 38, 38, 38, 38, 39, + (152,178): 39, 39, 40, 39, 39, 39, 39, 39, 39, 40, 40, 41, 43, 44, 44, + (152,193): 45, 45, 46, 46, 45, 44, 42, 37, 32, 29, 28, 28, 29, 34, 39, + (152,208): 42, 43, 48, 71, 105, 136, 147, 145, 128, 101, 73, 56, 53, + (152,221): 53, 53, 53, 52, 51, 49, 47, 46, 46, 47, 49, 52, 55, 56, 57, + (152,236): 57, 60, 66, 76, 85, 89, 94, 99, 104, 104, 99, 90, 83, 86, + (152,250): 138, 156, 158, 142, 102, 33, 12, 3, 1, 1, 1, 1, 1, 1, 1, 1, + (152,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (152,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (153,0): 71, 87, 92, 92, 92, 93, 96, 101, 105, 106, 105, 103, 102, 102, + (153,14): 102, 101, 96, 83, 64, 40, 20, 14, 8, 3, 1, 1, 1, 1, 1, 1, 1, + (153,31): 1, 1, 3, 8, 44, 65, 73, 72, 69, 73, 87, 98, 106, 109, 108, + (153,46): 106, 103, 100, 95, 90, 87, 84, 82, 80, 81, 89, 95, 100, 101, + (153,60): 100, 96, 90, 85, 79, 72, 65, 57, 51, 46, 44, 42, 40, 38, 37, + (153,75): 37, 39, 41, 43, 46, 48, 50, 51, 52, 53, 56, 61, 67, 73, 78, + (153,90): 82, 85, 87, 91, 94, 98, 100, 101, 102, 101, 101, 100, 99, 97, + (153,104): 92, 84, 82, 80, 76, 66, 26, 10, 3, 4, 8, 48, 79, 93, 96, 96, + (153,120): 86, 74, 68, 67, 70, 107, 161, 192, 205, 202, 185, 168, 146, + (153,133): 120, 90, 61, 55, 52, 51, 50, 49, 49, 49, 49, 50, 51, 51, 51, + (153,148): 51, 50, 50, 50, 50, 50, 50, 50, 51, 51, 52, 52, 52, 52, 51, + (153,163): 51, 51, 52, 52, 51, 48, 42, 39, 38, 38, 38, 38, 38, 38, 38, + (153,178): 38, 38, 38, 38, 38, 38, 38, 39, 40, 41, 42, 44, 45, 46, 47, + (153,193): 47, 48, 49, 49, 49, 49, 47, 41, 34, 30, 28, 28, 29, 33, 38, + (153,208): 41, 43, 46, 63, 96, 130, 146, 146, 134, 108, 79, 58, 53, 53, + (153,222): 53, 53, 53, 51, 49, 48, 47, 47, 47, 50, 53, 55, 57, 57, 58, + (153,237): 60, 66, 75, 85, 88, 93, 97, 103, 104, 102, 93, 85, 84, 122, + (153,251): 151, 160, 150, 123, 48, 18, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (153,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (153,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (154,0): 70, 86, 92, 92, 91, 91, 92, 98, 104, 106, 105, 104, 103, 103, + (154,14): 102, 101, 88, 71, 50, 28, 13, 9, 5, 1, 1, 1, 1, 1, 1, 1, 1, + (154,31): 1, 1, 6, 19, 63, 72, 73, 71, 69, 76, 92, 103, 108, 110, 108, + (154,46): 107, 105, 102, 99, 95, 92, 91, 90, 91, 96, 98, 99, 99, 98, + (154,60): 93, 89, 83, 75, 65, 52, 46, 43, 42, 40, 37, 35, 35, 34, 34, + (154,75): 34, 35, 36, 38, 40, 44, 46, 48, 48, 49, 50, 53, 58, 65, 71, + (154,90): 78, 80, 82, 84, 87, 94, 98, 101, 102, 102, 101, 101, 100, 99, + (154,104): 98, 91, 86, 83, 81, 78, 51, 20, 7, 4, 5, 32, 69, 88, 96, 96, + (154,120): 89, 77, 70, 67, 68, 92, 147, 185, 204, 204, 189, 173, 152, + (154,133): 126, 96, 64, 56, 52, 51, 50, 49, 49, 49, 49, 50, 51, 51, 51, + (154,148): 51, 51, 50, 50, 50, 50, 50, 50, 51, 51, 52, 52, 52, 52, 51, + (154,163): 51, 51, 52, 52, 52, 50, 47, 40, 39, 39, 39, 39, 38, 38, 38, + (154,178): 38, 38, 38, 38, 38, 38, 39, 41, 43, 44, 46, 47, 47, 48, 48, + (154,193): 48, 48, 49, 51, 52, 52, 51, 46, 38, 32, 28, 28, 29, 33, 38, + (154,208): 41, 43, 45, 58, 89, 124, 145, 146, 138, 114, 85, 61, 54, 53, + (154,222): 53, 53, 53, 52, 50, 48, 47, 47, 47, 50, 53, 56, 57, 57, 58, + (154,237): 61, 66, 75, 85, 88, 91, 95, 101, 104, 103, 96, 87, 83, 107, + (154,251): 145, 159, 156, 140, 66, 27, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (154,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (154,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (155,0): 69, 86, 91, 91, 91, 89, 88, 92, 98, 105, 106, 105, 105, 103, + (155,14): 101, 89, 71, 50, 30, 14, 7, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (155,32): 4, 16, 42, 73, 75, 72, 68, 68, 79, 95, 104, 109, 109, 109, + (155,46): 108, 107, 106, 105, 103, 102, 101, 100, 100, 99, 98, 97, 93, + (155,59): 86, 72, 63, 55, 48, 43, 40, 38, 37, 36, 35, 35, 34, 34, 34, + (155,74): 34, 34, 34, 34, 35, 37, 40, 42, 44, 45, 45, 45, 45, 47, 51, + (155,89): 56, 66, 72, 77, 80, 81, 84, 90, 95, 99, 101, 101, 101, 101, + (155,103): 101, 102, 101, 97, 92, 87, 85, 76, 46, 21, 6, 6, 16, 52, 79, + (155,118): 94, 95, 93, 81, 72, 67, 67, 78, 124, 169, 201, 207, 195, + (155,131): 180, 160, 136, 105, 69, 58, 53, 51, 50, 49, 49, 49, 49, 49, + (155,145): 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 51, 52, 52, + (155,160): 52, 52, 52, 51, 51, 51, 52, 52, 52, 51, 46, 42, 40, 40, 40, + (155,175): 40, 40, 39, 39, 39, 39, 40, 41, 42, 44, 46, 46, 47, 47, 47, + (155,190): 48, 48, 48, 48, 48, 49, 51, 53, 53, 53, 50, 41, 34, 30, 29, + (155,205): 30, 33, 38, 41, 43, 45, 55, 84, 118, 144, 146, 140, 119, 91, + (155,219): 64, 54, 54, 53, 53, 53, 52, 50, 49, 48, 48, 48, 51, 54, 56, + (155,234): 57, 57, 58, 61, 67, 75, 84, 87, 89, 92, 97, 103, 103, 99, + (155,248): 91, 84, 93, 135, 155, 159, 153, 92, 42, 14, 3, 1, 1, 1, 1, + (155,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (155,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (156,0): 68, 85, 91, 91, 90, 88, 85, 85, 90, 100, 103, 103, 101, 97, + (156,14): 91, 74, 53, 33, 17, 9, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, + (156,33): 27, 59, 75, 74, 70, 67, 67, 80, 95, 104, 108, 109, 109, 108, + (156,47): 108, 107, 106, 104, 102, 101, 100, 99, 96, 91, 82, 72, 62, + (156,60): 51, 46, 43, 40, 38, 37, 37, 37, 38, 38, 38, 38, 38, 38, 37, + (156,75): 36, 35, 35, 35, 36, 38, 40, 41, 43, 43, 43, 43, 43, 44, 46, + (156,90): 52, 58, 64, 71, 75, 80, 83, 89, 94, 98, 99, 100, 100, 100, + (156,104): 100, 101, 99, 96, 93, 89, 84, 66, 39, 15, 7, 12, 38, 67, 89, + (156,119): 95, 94, 85, 75, 68, 67, 72, 107, 153, 193, 207, 199, 185, + (156,132): 167, 143, 114, 75, 61, 54, 51, 50, 49, 49, 49, 49, 49, 50, + (156,146): 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 51, 52, 53, 53, + (156,161): 52, 52, 52, 51, 51, 52, 52, 52, 52, 50, 46, 43, 42, 41, 41, + (156,176): 42, 42, 42, 42, 43, 43, 44, 45, 46, 47, 47, 47, 47, 48, 48, + (156,191): 48, 48, 49, 49, 50, 52, 54, 55, 55, 51, 42, 35, 31, 30, 31, + (156,206): 35, 39, 42, 43, 45, 54, 83, 117, 143, 146, 141, 121, 93, 66, + (156,220): 55, 54, 53, 53, 53, 52, 51, 49, 48, 48, 49, 51, 54, 57, 57, + (156,235): 58, 58, 61, 67, 76, 83, 85, 87, 89, 94, 102, 103, 100, 94, + (156,249): 84, 89, 126, 150, 161, 157, 110, 55, 21, 4, 1, 1, 1, 1, 1, + (156,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (156,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (157,0): 67, 84, 90, 91, 90, 89, 82, 79, 81, 89, 94, 95, 91, 84, 75, + (157,15): 51, 33, 20, 11, 7, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 17, + (157,33): 40, 70, 77, 72, 68, 66, 67, 80, 94, 103, 108, 109, 108, 108, + (157,47): 108, 107, 105, 103, 101, 99, 95, 90, 79, 70, 61, 53, 46, 41, + (157,61): 40, 39, 39, 40, 41, 42, 43, 44, 44, 45, 45, 44, 43, 42, 40, + (157,76): 38, 37, 36, 35, 37, 38, 40, 41, 42, 42, 42, 42, 42, 42, 44, + (157,91): 48, 52, 57, 63, 69, 74, 80, 87, 94, 98, 99, 99, 99, 99, 100, + (157,106): 100, 99, 96, 93, 90, 80, 56, 30, 11, 11, 27, 55, 82, 94, 94, + (157,121): 88, 79, 70, 66, 69, 92, 137, 181, 205, 203, 191, 174, 152, + (157,134): 123, 82, 65, 55, 52, 50, 49, 49, 49, 49, 49, 50, 51, 52, 52, + (157,149): 52, 52, 52, 51, 51, 50, 50, 50, 51, 52, 53, 53, 53, 52, 52, + (157,164): 51, 51, 52, 52, 52, 52, 52, 50, 47, 45, 43, 42, 43, 43, 43, + (157,179): 44, 44, 45, 45, 46, 46, 47, 47, 47, 47, 48, 48, 48, 49, 49, + (157,194): 50, 51, 54, 55, 56, 56, 51, 42, 35, 31, 31, 32, 36, 39, 42, + (157,209): 43, 45, 55, 83, 117, 143, 145, 141, 121, 94, 66, 55, 54, 53, + (157,223): 53, 53, 52, 51, 50, 49, 49, 49, 52, 55, 57, 58, 58, 58, 62, + (157,238): 68, 76, 82, 84, 85, 87, 91, 100, 102, 101, 96, 85, 87, 117, + (157,252): 144, 161, 160, 126, 69, 29, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (157,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (157,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (158,0): 67, 84, 90, 90, 90, 89, 81, 74, 71, 75, 80, 80, 74, 65, 53, + (158,15): 28, 17, 11, 8, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 7, 27, 53, + (158,34): 75, 77, 70, 66, 65, 66, 80, 93, 101, 106, 107, 107, 107, 106, + (158,48): 104, 102, 98, 94, 89, 82, 72, 58, 50, 44, 41, 40, 40, 41, 42, + (158,63): 43, 44, 47, 48, 49, 49, 50, 50, 50, 50, 49, 48, 45, 43, 40, + (158,78): 38, 36, 36, 37, 38, 39, 41, 41, 41, 41, 41, 41, 41, 42, 43, + (158,93): 45, 49, 57, 62, 69, 76, 85, 94, 97, 98, 99, 99, 99, 100, 100, + (158,108): 99, 96, 93, 89, 73, 48, 18, 12, 19, 44, 72, 92, 93, 91, 82, + (158,123): 72, 66, 67, 81, 119, 166, 202, 205, 195, 181, 160, 132, 90, + (158,136): 69, 58, 52, 50, 49, 49, 49, 49, 49, 50, 51, 52, 52, 53, 53, + (158,151): 53, 52, 51, 51, 51, 51, 51, 52, 53, 53, 53, 53, 52, 52, 51, + (158,166): 51, 52, 52, 52, 52, 52, 51, 49, 47, 45, 44, 44, 44, 45, 45, + (158,181): 46, 46, 46, 47, 47, 47, 48, 48, 48, 49, 49, 50, 50, 51, 54, + (158,196): 56, 57, 57, 57, 51, 41, 35, 32, 32, 33, 37, 40, 43, 44, 46, + (158,211): 58, 86, 119, 143, 145, 140, 120, 93, 66, 55, 54, 54, 53, 53, + (158,225): 52, 51, 50, 49, 49, 50, 53, 56, 58, 58, 58, 59, 62, 68, 77, + (158,240): 81, 82, 83, 84, 87, 98, 101, 101, 97, 87, 86, 109, 138, 160, + (158,254): 161, 139, 83, 39, 10, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (158,272): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (158,292): 1, 1, 1, 1, 1, 1, 1, 1, + (159,0): 66, 83, 89, 90, 90, 89, 81, 71, 64, 62, 63, 58, 50, 39, 26, + (159,15): 17, 14, 10, 7, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 12, 37, + (159,33): 63, 78, 77, 68, 65, 64, 65, 78, 90, 98, 103, 105, 105, 103, + (159,47): 102, 99, 95, 86, 76, 66, 56, 48, 43, 42, 41, 41, 41, 45, 46, + (159,62): 48, 49, 49, 49, 50, 50, 50, 51, 51, 52, 52, 52, 52, 50, 48, + (159,77): 45, 42, 39, 36, 36, 37, 38, 40, 40, 41, 41, 41, 41, 41, 41, + (159,92): 41, 41, 42, 44, 47, 53, 60, 69, 84, 92, 96, 98, 98, 99, 99, + (159,107): 100, 99, 99, 96, 94, 87, 68, 32, 15, 17, 33, 59, 87, 93, 92, + (159,122): 85, 76, 67, 66, 73, 103, 146, 195, 205, 200, 188, 169, 143, + (159,135): 99, 75, 61, 53, 51, 50, 49, 49, 49, 49, 50, 51, 52, 53, 54, + (159,150): 54, 54, 53, 52, 51, 51, 51, 51, 52, 53, 53, 53, 53, 53, 52, + (159,165): 51, 51, 51, 52, 52, 53, 53, 52, 52, 50, 48, 47, 46, 46, 46, + (159,180): 46, 46, 46, 47, 47, 48, 48, 48, 48, 49, 50, 50, 51, 52, 53, + (159,195): 56, 58, 58, 58, 57, 48, 39, 34, 32, 32, 34, 38, 41, 43, 44, + (159,210): 47, 61, 91, 122, 143, 144, 138, 118, 91, 66, 55, 54, 54, 53, + (159,224): 53, 53, 51, 50, 50, 50, 51, 54, 57, 58, 58, 58, 59, 62, 69, + (159,239): 77, 80, 80, 81, 82, 84, 95, 100, 101, 98, 89, 86, 102, 132, + (159,253): 158, 162, 149, 97, 49, 14, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (159,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (159,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (160,0): 66, 82, 88, 89, 89, 90, 87, 74, 60, 53, 49, 41, 35, 30, 24, + (160,15): 17, 14, 9, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 22, 50, 74, + (160,34): 80, 75, 67, 63, 63, 63, 71, 79, 84, 87, 88, 87, 81, 76, 70, + (160,49): 62, 53, 48, 45, 44, 43, 43, 44, 45, 47, 49, 49, 49, 49, 49, + (160,64): 49, 49, 49, 50, 50, 51, 52, 52, 53, 54, 54, 54, 54, 52, 49, + (160,79): 46, 41, 38, 36, 36, 37, 39, 39, 40, 40, 40, 40, 40, 40, 40, + (160,94): 41, 41, 42, 43, 45, 48, 60, 75, 87, 95, 98, 99, 99, 99, 100, + (160,109): 99, 98, 97, 95, 85, 64, 23, 20, 25, 42, 74, 92, 92, 89, 82, + (160,124): 70, 66, 68, 85, 119, 175, 206, 204, 195, 180, 158, 114, 86, + (160,137): 67, 56, 51, 50, 49, 49, 49, 48, 49, 51, 52, 53, 54, 55, 55, + (160,152): 55, 54, 53, 52, 52, 52, 52, 53, 54, 54, 54, 53, 53, 52, 51, + (160,167): 51, 51, 51, 52, 52, 53, 53, 53, 53, 52, 51, 50, 49, 49, 48, + (160,182): 48, 48, 48, 49, 49, 49, 50, 51, 52, 52, 53, 54, 56, 59, 59, + (160,197): 59, 57, 53, 43, 37, 34, 34, 34, 37, 41, 43, 45, 45, 50, 70, + (160,212): 101, 129, 144, 144, 134, 112, 85, 63, 55, 54, 54, 54, 54, + (160,225): 53, 52, 51, 51, 51, 52, 56, 58, 58, 59, 59, 59, 63, 70, 77, + (160,240): 78, 78, 78, 78, 80, 91, 98, 100, 98, 91, 85, 95, 124, 154, + (160,254): 162, 156, 114, 65, 23, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (160,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (160,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (161,0): 65, 81, 87, 88, 88, 90, 88, 79, 66, 54, 49, 42, 37, 32, 27, + (161,15): 19, 15, 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 33, 59, 78, + (161,34): 81, 74, 66, 62, 61, 61, 65, 69, 72, 72, 71, 68, 62, 58, 54, + (161,49): 50, 47, 45, 44, 44, 45, 46, 47, 48, 48, 49, 49, 48, 48, 48, + (161,64): 48, 48, 48, 48, 49, 50, 51, 52, 53, 55, 56, 57, 57, 55, 53, + (161,79): 50, 46, 42, 39, 37, 36, 37, 38, 38, 39, 39, 40, 40, 40, 40, + (161,94): 40, 41, 41, 41, 42, 43, 48, 56, 68, 82, 93, 98, 99, 99, 100, + (161,109): 100, 99, 98, 97, 92, 82, 39, 27, 25, 35, 59, 88, 91, 90, 85, + (161,124): 74, 66, 67, 76, 102, 154, 200, 204, 200, 188, 169, 127, 96, + (161,137): 74, 59, 52, 50, 49, 49, 49, 48, 49, 50, 52, 53, 55, 56, 56, + (161,152): 56, 56, 55, 53, 53, 53, 53, 53, 54, 54, 54, 54, 53, 52, 51, + (161,167): 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 53, 52, 52, 51, 51, + (161,182): 51, 51, 51, 51, 51, 52, 52, 53, 53, 54, 55, 56, 58, 59, 59, + (161,197): 58, 55, 49, 39, 36, 35, 35, 36, 40, 43, 44, 45, 46, 54, 80, + (161,212): 110, 135, 144, 143, 129, 105, 80, 61, 55, 54, 54, 54, 54, + (161,225): 53, 52, 52, 52, 52, 54, 57, 58, 59, 59, 59, 59, 64, 70, 77, + (161,240): 77, 76, 75, 76, 77, 88, 96, 99, 98, 92, 85, 92, 120, 150, + (161,254): 163, 159, 125, 76, 31, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (161,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (161,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (162,0): 65, 80, 86, 87, 87, 89, 89, 84, 73, 59, 52, 47, 41, 36, 32, + (162,15): 22, 16, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 15, 43, 67, + (162,33): 81, 82, 73, 65, 61, 60, 59, 60, 61, 61, 60, 58, 55, 51, 49, + (162,48): 47, 45, 45, 45, 45, 46, 47, 48, 48, 49, 49, 48, 48, 48, 48, + (162,63): 48, 47, 47, 47, 48, 48, 49, 51, 52, 54, 55, 57, 58, 59, 59, + (162,78): 57, 55, 50, 46, 43, 40, 37, 37, 37, 38, 38, 39, 39, 39, 39, + (162,93): 40, 40, 40, 40, 40, 41, 41, 43, 46, 54, 65, 80, 93, 97, 99, + (162,108): 99, 100, 99, 98, 98, 96, 92, 59, 36, 28, 32, 46, 82, 88, 90, + (162,123): 87, 79, 67, 66, 70, 88, 129, 191, 202, 202, 195, 179, 141, + (162,136): 108, 82, 64, 54, 50, 50, 49, 49, 48, 49, 50, 51, 53, 55, 57, + (162,151): 57, 57, 57, 57, 55, 54, 54, 54, 54, 54, 54, 54, 54, 54, 53, + (162,166): 52, 51, 51, 51, 51, 51, 52, 52, 53, 53, 53, 53, 53, 53, 53, + (162,181): 53, 53, 53, 53, 53, 53, 53, 54, 54, 55, 56, 57, 58, 59, 60, + (162,196): 58, 55, 50, 44, 37, 36, 36, 36, 38, 42, 44, 45, 46, 48, 63, + (162,211): 92, 119, 139, 144, 141, 122, 97, 74, 59, 55, 54, 54, 54, 54, + (162,225): 53, 52, 52, 52, 53, 56, 58, 59, 59, 59, 59, 60, 65, 71, 76, + (162,240): 76, 74, 74, 73, 74, 85, 94, 98, 97, 93, 85, 90, 115, 145, + (162,254): 163, 161, 135, 88, 39, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (162,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (162,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (163,0): 64, 79, 85, 86, 86, 89, 89, 87, 80, 66, 57, 53, 48, 43, 39, + (163,15): 27, 17, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 22, 53, 74, + (163,33): 83, 83, 72, 65, 61, 59, 57, 56, 55, 54, 52, 50, 48, 46, 46, + (163,48): 45, 45, 45, 46, 47, 48, 48, 49, 49, 49, 49, 49, 49, 48, 48, + (163,63): 47, 47, 47, 47, 48, 48, 49, 52, 54, 55, 57, 58, 60, 61, 61, + (163,78): 61, 59, 54, 50, 47, 43, 40, 37, 37, 37, 38, 38, 39, 39, 39, + (163,93): 39, 39, 39, 39, 39, 40, 40, 41, 42, 44, 50, 62, 82, 92, 97, + (163,108): 99, 99, 99, 99, 98, 98, 96, 78, 49, 35, 32, 38, 72, 85, 89, + (163,123): 88, 83, 69, 66, 67, 78, 105, 176, 197, 204, 200, 189, 155, + (163,136): 122, 93, 70, 57, 51, 50, 49, 49, 48, 48, 49, 51, 53, 55, 58, + (163,151): 58, 59, 58, 58, 57, 56, 55, 55, 55, 55, 55, 55, 55, 55, 54, + (163,166): 52, 51, 51, 51, 50, 51, 51, 51, 52, 53, 53, 53, 53, 53, 54, + (163,181): 54, 54, 54, 54, 54, 54, 55, 55, 55, 56, 58, 59, 59, 60, 59, + (163,196): 56, 51, 45, 40, 36, 36, 37, 38, 41, 44, 45, 46, 48, 52, 75, + (163,211): 105, 128, 142, 144, 137, 113, 88, 68, 57, 55, 54, 54, 54, + (163,224): 54, 53, 53, 53, 53, 54, 58, 59, 60, 60, 59, 59, 60, 65, 71, + (163,239): 76, 76, 73, 72, 71, 72, 82, 93, 97, 97, 93, 85, 88, 111, + (163,253): 141, 163, 162, 143, 98, 48, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (163,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (163,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (164,0): 62, 78, 83, 84, 85, 87, 89, 89, 85, 76, 64, 60, 56, 52, 45, + (164,15): 33, 19, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 30, 62, 79, + (164,33): 85, 84, 71, 65, 61, 59, 56, 52, 51, 49, 47, 46, 46, 45, 45, + (164,48): 45, 45, 47, 48, 48, 49, 49, 50, 51, 51, 51, 51, 49, 49, 48, + (164,63): 47, 47, 47, 47, 48, 49, 50, 54, 57, 59, 60, 61, 62, 62, 63, + (164,78): 63, 62, 60, 55, 50, 46, 44, 40, 38, 38, 38, 38, 39, 39, 38, + (164,93): 38, 37, 37, 37, 38, 38, 39, 40, 41, 42, 43, 45, 63, 81, 92, + (164,108): 97, 99, 99, 99, 99, 98, 98, 91, 63, 44, 34, 35, 60, 80, 88, + (164,123): 89, 87, 73, 67, 66, 71, 85, 156, 190, 203, 203, 197, 169, + (164,136): 136, 105, 79, 61, 52, 50, 49, 49, 48, 48, 49, 50, 52, 54, + (164,150): 58, 59, 60, 60, 59, 58, 57, 57, 56, 56, 55, 55, 55, 55, 55, + (164,165): 54, 53, 52, 51, 51, 50, 50, 50, 50, 51, 52, 52, 53, 53, 53, + (164,180): 54, 54, 54, 55, 55, 55, 55, 55, 56, 57, 58, 59, 59, 59, 59, + (164,195): 56, 51, 45, 41, 38, 37, 37, 39, 41, 44, 46, 46, 47, 51, 59, + (164,210): 90, 119, 136, 144, 143, 130, 102, 79, 62, 55, 55, 54, 54, + (164,223): 54, 54, 54, 54, 54, 54, 56, 59, 60, 60, 60, 59, 59, 61, 66, + (164,238): 72, 75, 75, 72, 70, 70, 70, 80, 91, 96, 97, 94, 85, 87, 108, + (164,253): 136, 163, 163, 150, 108, 57, 15, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (164,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (164,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (165,0): 60, 75, 81, 82, 82, 85, 88, 89, 88, 83, 72, 66, 62, 58, 52, + (165,15): 39, 21, 9, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 9, 43, 72, 84, + (165,33): 86, 85, 71, 65, 62, 59, 56, 50, 48, 47, 46, 46, 46, 46, 46, + (165,48): 46, 47, 49, 49, 50, 51, 51, 52, 52, 52, 52, 51, 48, 47, 47, + (165,63): 47, 47, 48, 50, 52, 55, 58, 60, 61, 61, 62, 62, 63, 63, 64, + (165,78): 64, 64, 63, 61, 57, 51, 47, 44, 42, 41, 41, 40, 39, 39, 38, + (165,93): 38, 37, 37, 37, 37, 38, 38, 39, 40, 41, 42, 42, 44, 55, 72, + (165,108): 88, 97, 98, 98, 99, 98, 98, 96, 82, 59, 41, 38, 47, 71, 84, + (165,123): 88, 88, 80, 70, 66, 67, 72, 120, 169, 196, 206, 204, 186, + (165,136): 157, 125, 95, 71, 55, 52, 50, 49, 49, 48, 48, 49, 51, 53, + (165,150): 57, 59, 60, 61, 61, 60, 60, 59, 58, 57, 57, 57, 57, 56, 56, + (165,165): 55, 54, 53, 52, 51, 50, 50, 49, 49, 49, 49, 50, 50, 51, 52, + (165,180): 52, 53, 53, 53, 54, 55, 55, 56, 57, 57, 58, 58, 58, 57, 53, + (165,195): 47, 43, 40, 39, 38, 39, 41, 43, 45, 46, 47, 48, 51, 61, 78, + (165,210): 112, 133, 142, 143, 139, 112, 86, 68, 57, 55, 55, 55, 55, + (165,223): 54, 54, 54, 55, 55, 56, 59, 61, 61, 61, 60, 60, 60, 62, 67, + (165,238): 73, 75, 74, 70, 69, 68, 69, 77, 89, 95, 96, 94, 85, 86, 104, + (165,253): 131, 162, 164, 156, 119, 69, 21, 3, 1, 1, 1, 1, 1, 1, 1, 1, + (165,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (165,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (166,0): 57, 73, 79, 80, 80, 82, 86, 88, 88, 86, 78, 73, 69, 65, 59, + (166,15): 45, 25, 10, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 14, 52, 77, 86, + (166,33): 87, 85, 71, 65, 62, 60, 56, 50, 48, 46, 46, 45, 46, 46, 47, + (166,48): 48, 49, 50, 50, 51, 51, 52, 52, 51, 51, 49, 48, 47, 46, 47, + (166,63): 48, 49, 53, 55, 57, 58, 59, 60, 61, 61, 62, 62, 63, 63, 63, + (166,78): 63, 63, 63, 63, 60, 57, 52, 46, 44, 43, 42, 41, 40, 40, 39, + (166,93): 38, 37, 37, 37, 38, 38, 38, 39, 40, 41, 41, 42, 42, 46, 55, + (166,108): 69, 88, 97, 98, 98, 98, 98, 97, 90, 70, 50, 40, 44, 63, 78, + (166,123): 87, 88, 83, 73, 67, 66, 68, 98, 149, 184, 202, 206, 196, + (166,136): 172, 142, 110, 82, 60, 54, 51, 49, 49, 48, 48, 49, 50, 52, + (166,150): 56, 58, 60, 61, 62, 62, 61, 60, 60, 59, 58, 58, 58, 58, 57, + (166,165): 57, 55, 54, 52, 51, 50, 49, 49, 49, 48, 48, 49, 49, 50, 50, + (166,180): 51, 51, 52, 52, 53, 54, 54, 55, 56, 56, 56, 55, 52, 49, 46, + (166,195): 43, 41, 40, 40, 40, 42, 44, 45, 46, 47, 48, 51, 60, 76, 97, + (166,210): 127, 138, 142, 138, 129, 96, 75, 62, 56, 55, 55, 55, 55, 55, + (166,224): 55, 55, 56, 57, 58, 60, 62, 62, 61, 60, 60, 60, 62, 68, 73, + (166,239): 74, 73, 70, 68, 68, 68, 76, 88, 94, 95, 93, 84, 86, 102, + (166,253): 128, 161, 165, 159, 126, 79, 27, 3, 1, 1, 1, 1, 1, 1, 1, 1, + (166,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (166,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (167,0): 55, 71, 77, 78, 77, 78, 85, 88, 88, 87, 81, 77, 74, 70, 65, + (167,15): 48, 26, 11, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 7, 18, 60, 80, 88, + (167,33): 89, 86, 72, 66, 63, 61, 58, 51, 48, 46, 45, 45, 46, 46, 47, + (167,48): 48, 50, 50, 51, 51, 51, 51, 51, 50, 49, 47, 46, 46, 48, 49, + (167,63): 51, 54, 56, 58, 59, 59, 60, 60, 60, 60, 60, 60, 60, 60, 60, + (167,78): 61, 61, 62, 62, 61, 59, 55, 50, 47, 45, 43, 42, 41, 40, 39, + (167,93): 38, 38, 38, 38, 39, 40, 40, 40, 40, 41, 41, 42, 42, 43, 46, + (167,108): 55, 70, 90, 96, 98, 98, 98, 98, 94, 79, 60, 43, 44, 56, 72, + (167,123): 85, 87, 85, 77, 69, 65, 65, 82, 127, 167, 196, 206, 203, + (167,136): 185, 159, 128, 96, 68, 58, 52, 50, 49, 48, 48, 48, 49, 50, + (167,150): 54, 57, 59, 61, 62, 63, 62, 62, 61, 60, 59, 59, 59, 59, 59, + (167,165): 58, 57, 55, 54, 52, 50, 49, 49, 48, 47, 47, 47, 47, 48, 48, + (167,180): 49, 49, 50, 51, 51, 52, 52, 53, 52, 52, 50, 49, 46, 44, 43, + (167,195): 41, 41, 41, 42, 43, 44, 46, 46, 47, 48, 50, 59, 75, 94, 115, + (167,210): 136, 140, 138, 130, 113, 81, 66, 58, 55, 55, 55, 55, 55, 55, + (167,224): 56, 56, 57, 59, 60, 62, 62, 62, 61, 60, 60, 60, 63, 69, 73, + (167,239): 74, 72, 69, 68, 68, 68, 75, 87, 93, 94, 93, 84, 85, 100, + (167,253): 125, 160, 166, 161, 133, 88, 33, 5, 2, 1, 1, 1, 1, 1, 1, 1, + (167,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (167,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (168,0): 52, 68, 74, 75, 74, 75, 82, 87, 88, 88, 84, 81, 77, 73, 68, + (168,15): 48, 25, 10, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 9, 23, 66, 83, 90, + (168,33): 90, 87, 73, 66, 63, 62, 60, 53, 48, 46, 46, 45, 46, 46, 47, + (168,48): 48, 49, 50, 50, 51, 50, 50, 49, 47, 47, 46, 47, 48, 51, 53, + (168,63): 56, 57, 58, 58, 58, 58, 58, 57, 56, 55, 55, 54, 54, 54, 55, + (168,78): 55, 56, 58, 59, 59, 59, 57, 53, 49, 46, 44, 43, 42, 41, 40, + (168,93): 39, 39, 39, 40, 41, 42, 42, 42, 42, 42, 42, 43, 43, 42, 43, + (168,108): 45, 52, 77, 90, 96, 98, 98, 98, 97, 86, 69, 48, 45, 52, 67, + (168,123): 81, 87, 86, 80, 72, 66, 64, 71, 104, 147, 185, 204, 207, + (168,136): 196, 175, 146, 113, 78, 64, 55, 51, 50, 49, 48, 48, 48, 49, + (168,150): 52, 55, 58, 61, 62, 63, 63, 63, 62, 62, 61, 60, 60, 60, 60, + (168,165): 59, 58, 57, 55, 54, 51, 50, 49, 48, 47, 46, 46, 45, 45, 46, + (168,180): 46, 47, 47, 48, 48, 48, 48, 48, 47, 46, 45, 43, 42, 42, 42, + (168,195): 41, 42, 43, 44, 45, 46, 47, 47, 48, 50, 58, 75, 94, 113, + (168,209): 130, 140, 138, 131, 117, 95, 68, 59, 56, 55, 55, 55, 56, 56, + (168,223): 56, 57, 58, 59, 61, 62, 63, 63, 62, 61, 60, 60, 60, 64, 69, + (168,238): 73, 73, 71, 69, 68, 68, 68, 75, 86, 92, 94, 92, 84, 84, 98, + (168,253): 123, 159, 167, 163, 138, 96, 40, 6, 2, 1, 1, 1, 1, 1, 1, 1, + (168,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (168,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (169,0): 49, 64, 70, 71, 71, 72, 79, 85, 88, 88, 85, 82, 79, 74, 67, + (169,15): 45, 22, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 3, 10, 26, 72, 86, 91, + (169,33): 91, 88, 74, 67, 64, 63, 61, 55, 50, 47, 46, 45, 46, 46, 47, + (169,48): 48, 49, 50, 49, 49, 48, 47, 46, 46, 46, 47, 50, 54, 56, 57, + (169,63): 58, 58, 58, 57, 55, 54, 52, 49, 48, 47, 47, 46, 46, 46, 47, + (169,78): 47, 48, 51, 52, 54, 56, 56, 55, 51, 48, 46, 44, 43, 42, 41, + (169,93): 40, 40, 40, 42, 43, 44, 44, 44, 44, 45, 45, 45, 44, 43, 43, + (169,108): 43, 44, 57, 78, 91, 97, 98, 98, 97, 91, 77, 54, 46, 49, 62, + (169,123): 77, 86, 86, 83, 75, 67, 63, 66, 84, 123, 167, 200, 208, 203, + (169,137): 189, 165, 133, 92, 72, 60, 53, 50, 49, 49, 48, 48, 48, 50, + (169,151): 53, 56, 60, 62, 63, 64, 64, 63, 63, 62, 61, 61, 61, 60, 60, + (169,166): 59, 58, 57, 55, 53, 51, 49, 48, 47, 45, 44, 44, 43, 42, 42, + (169,181): 42, 42, 42, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 42, 43, + (169,196): 44, 45, 46, 47, 47, 48, 48, 50, 54, 75, 97, 115, 129, 138, + (169,210): 139, 132, 118, 99, 76, 59, 56, 55, 55, 56, 56, 56, 57, 58, + (169,224): 59, 60, 61, 63, 63, 63, 63, 63, 61, 60, 60, 61, 66, 70, 73, + (169,239): 73, 70, 68, 68, 68, 68, 74, 85, 91, 93, 91, 83, 84, 96, 121, + (169,254): 158, 168, 165, 143, 104, 47, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (169,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (169,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (170,0): 46, 58, 64, 65, 65, 66, 74, 81, 86, 87, 85, 81, 77, 69, 58, + (170,15): 35, 16, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 14, 33, 76, 87, 92, + (170,33): 92, 90, 76, 68, 64, 63, 63, 59, 54, 49, 46, 45, 45, 45, 46, + (170,48): 46, 46, 46, 46, 46, 46, 46, 47, 50, 53, 55, 57, 58, 57, 57, + (170,63): 55, 52, 49, 47, 45, 44, 43, 43, 42, 42, 42, 43, 43, 43, 43, + (170,78): 43, 43, 44, 45, 46, 47, 47, 48, 48, 48, 46, 45, 43, 43, 42, + (170,93): 42, 42, 43, 43, 44, 44, 44, 44, 45, 46, 48, 52, 51, 49, 46, + (170,108): 43, 43, 44, 57, 75, 90, 97, 98, 98, 94, 83, 60, 47, 48, 58, + (170,123): 71, 85, 86, 85, 79, 71, 64, 63, 70, 96, 134, 178, 207, 208, + (170,137): 202, 187, 161, 118, 91, 71, 59, 52, 49, 49, 49, 48, 48, 48, + (170,151): 50, 53, 56, 59, 63, 64, 64, 64, 64, 64, 63, 63, 63, 62, 62, + (170,166): 61, 60, 58, 56, 54, 52, 50, 49, 47, 45, 44, 43, 42, 42, 41, + (170,181): 40, 40, 40, 40, 40, 40, 40, 40, 41, 42, 42, 44, 45, 46, 47, + (170,196): 47, 47, 47, 48, 49, 50, 54, 64, 82, 110, 124, 133, 137, 138, + (170,210): 128, 112, 93, 75, 60, 56, 55, 56, 56, 56, 57, 58, 59, 60, + (170,224): 61, 63, 64, 64, 64, 64, 64, 62, 61, 60, 60, 62, 67, 71, 73, + (170,239): 73, 69, 68, 68, 68, 68, 74, 84, 90, 91, 90, 83, 83, 95, 119, + (170,254): 157, 169, 166, 149, 113, 56, 10, 3, 1, 1, 1, 1, 1, 1, 1, 1, + (170,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (170,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (171,0): 43, 53, 58, 60, 60, 60, 66, 75, 81, 83, 82, 78, 71, 61, 48, + (171,15): 25, 11, 3, 1, 1, 1, 1, 1, 1, 1, 1, 2, 6, 16, 37, 79, 88, 92, + (171,33): 92, 91, 79, 69, 64, 63, 63, 61, 58, 54, 49, 47, 46, 46, 46, + (171,48): 46, 46, 46, 46, 47, 48, 51, 54, 56, 57, 57, 57, 54, 51, 49, + (171,63): 47, 45, 44, 43, 42, 42, 42, 42, 42, 42, 42, 42, 42, 43, 43, + (171,78): 43, 43, 44, 44, 45, 45, 46, 46, 46, 45, 45, 44, 43, 43, 43, + (171,93): 43, 43, 44, 44, 44, 45, 45, 45, 45, 46, 49, 55, 58, 57, 53, + (171,108): 48, 44, 43, 48, 62, 80, 94, 98, 97, 94, 84, 63, 47, 48, 56, + (171,123): 68, 83, 86, 85, 81, 74, 66, 62, 66, 81, 110, 155, 195, 205, + (171,137): 207, 198, 180, 140, 110, 86, 68, 57, 51, 50, 49, 48, 48, 48, + (171,151): 48, 50, 52, 55, 59, 62, 63, 64, 65, 64, 64, 64, 64, 64, 64, + (171,166): 63, 62, 61, 59, 56, 54, 52, 50, 48, 46, 45, 44, 43, 42, 41, + (171,181): 41, 41, 41, 41, 41, 42, 43, 44, 45, 46, 46, 47, 47, 47, 48, + (171,196): 48, 48, 48, 49, 52, 60, 73, 90, 109, 128, 133, 136, 136, + (171,209): 130, 109, 91, 75, 63, 57, 55, 56, 56, 57, 58, 59, 60, 61, + (171,223): 62, 63, 64, 65, 65, 64, 64, 63, 62, 61, 61, 61, 63, 69, 72, + (171,238): 73, 72, 69, 68, 68, 68, 69, 74, 84, 89, 91, 89, 82, 82, 94, + (171,253): 118, 156, 169, 167, 152, 118, 62, 12, 4, 1, 1, 1, 1, 1, 1, + (171,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (171,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (172,0): 41, 48, 52, 53, 53, 51, 56, 63, 70, 73, 72, 67, 59, 48, 35, + (172,15): 14, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 2, 7, 18, 39, 81, 89, 93, + (172,33): 93, 91, 81, 70, 65, 63, 63, 63, 61, 58, 55, 52, 49, 48, 48, + (172,48): 48, 49, 50, 51, 53, 54, 56, 57, 56, 55, 53, 50, 47, 46, 44, + (172,63): 43, 42, 42, 41, 41, 41, 41, 42, 42, 42, 42, 42, 42, 43, 43, + (172,78): 43, 43, 43, 44, 44, 45, 45, 45, 45, 45, 44, 44, 44, 44, 44, + (172,93): 44, 44, 44, 45, 45, 45, 45, 46, 47, 49, 52, 58, 65, 65, 63, + (172,108): 57, 49, 44, 45, 53, 67, 87, 96, 96, 94, 85, 64, 47, 48, 54, + (172,123): 66, 81, 86, 86, 83, 77, 69, 63, 63, 71, 91, 129, 178, 198, + (172,137): 207, 206, 196, 163, 132, 104, 81, 64, 54, 51, 50, 49, 48, + (172,150): 48, 48, 48, 50, 52, 56, 59, 61, 63, 64, 64, 64, 64, 64, 64, + (172,165): 64, 64, 64, 63, 62, 59, 58, 56, 54, 52, 50, 48, 47, 46, 45, + (172,180): 45, 44, 44, 44, 45, 45, 46, 46, 47, 47, 48, 48, 48, 48, 48, + (172,195): 48, 48, 49, 51, 56, 67, 83, 99, 114, 127, 136, 136, 133, + (172,208): 125, 112, 89, 74, 64, 57, 55, 56, 57, 57, 58, 59, 61, 62, + (172,222): 63, 64, 65, 65, 65, 65, 64, 64, 63, 62, 61, 61, 61, 65, 70, + (172,237): 72, 73, 72, 68, 68, 68, 68, 69, 73, 83, 88, 89, 88, 81, 82, + (172,252): 93, 118, 156, 170, 168, 155, 124, 68, 14, 5, 1, 1, 1, 1, 1, + (172,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (172,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (173,0): 40, 43, 45, 46, 46, 42, 43, 47, 51, 53, 53, 48, 40, 30, 20, 5, + (173,16): 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 7, 19, 42, 83, 90, 93, 93, + (173,34): 91, 83, 72, 65, 62, 62, 63, 63, 62, 60, 58, 54, 53, 53, 53, + (173,49): 53, 55, 57, 58, 58, 57, 55, 52, 49, 46, 44, 42, 42, 41, 41, + (173,64): 41, 41, 41, 41, 41, 41, 42, 42, 42, 42, 43, 43, 43, 43, 43, + (173,79): 43, 44, 44, 44, 44, 45, 45, 45, 45, 45, 44, 44, 44, 44, 45, + (173,94): 45, 45, 45, 46, 47, 48, 49, 53, 56, 60, 65, 73, 73, 72, 68, + (173,109): 59, 46, 45, 47, 56, 74, 92, 93, 92, 83, 63, 47, 47, 53, 64, + (173,124): 80, 86, 86, 84, 79, 72, 64, 62, 65, 77, 103, 156, 184, 202, + (173,138): 209, 206, 184, 156, 126, 99, 76, 59, 54, 51, 50, 49, 48, 48, + (173,152): 48, 48, 49, 52, 55, 57, 60, 62, 63, 64, 64, 64, 64, 64, 64, + (173,167): 64, 64, 63, 62, 60, 59, 57, 56, 54, 52, 51, 50, 50, 49, 49, + (173,182): 49, 49, 49, 50, 49, 49, 49, 49, 49, 49, 48, 49, 49, 49, 52, + (173,197): 55, 62, 72, 92, 109, 122, 132, 136, 137, 132, 122, 107, 90, + (173,210): 70, 62, 58, 56, 56, 57, 58, 59, 60, 61, 63, 64, 65, 66, 66, + (173,225): 66, 65, 65, 64, 64, 63, 61, 61, 61, 61, 67, 71, 72, 72, 71, + (173,240): 68, 68, 68, 69, 69, 73, 82, 87, 88, 87, 81, 81, 93, 117, + (173,254): 156, 170, 169, 157, 128, 74, 17, 6, 1, 1, 1, 1, 1, 1, 1, 1, + (173,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (173,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (174,0): 38, 39, 39, 39, 39, 31, 29, 27, 26, 24, 22, 17, 12, 7, 4, 1, + (174,16): 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 8, 21, 46, 84, 91, 93, 93, + (174,34): 91, 85, 75, 67, 61, 61, 61, 62, 62, 62, 61, 60, 60, 59, 59, + (174,49): 59, 59, 59, 58, 55, 50, 45, 43, 42, 42, 41, 41, 41, 41, 41, + (174,64): 41, 41, 41, 41, 42, 42, 42, 43, 43, 44, 44, 45, 45, 45, 45, + (174,79): 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 46, 46, 46, 46, 46, + (174,94): 46, 47, 47, 48, 50, 52, 56, 62, 68, 75, 79, 82, 83, 82, 80, + (174,109): 74, 52, 47, 46, 49, 57, 82, 87, 86, 78, 59, 45, 46, 52, 63, + (174,124): 79, 86, 86, 85, 81, 75, 67, 63, 63, 68, 81, 129, 165, 191, + (174,138): 206, 212, 202, 179, 151, 121, 93, 68, 59, 54, 51, 50, 49, + (174,151): 48, 48, 48, 48, 49, 50, 52, 55, 58, 61, 62, 63, 64, 64, 64, + (174,166): 64, 64, 64, 63, 62, 61, 61, 60, 59, 57, 56, 56, 55, 54, 53, + (174,181): 53, 52, 52, 51, 51, 50, 50, 49, 49, 49, 49, 49, 49, 50, 52, + (174,196): 59, 70, 84, 101, 123, 131, 135, 136, 137, 133, 119, 102, 84, + (174,209): 68, 59, 57, 56, 57, 57, 59, 60, 61, 62, 63, 65, 66, 67, 67, + (174,224): 67, 66, 65, 65, 64, 64, 62, 61, 61, 61, 62, 69, 72, 73, 72, + (174,239): 70, 68, 68, 68, 69, 70, 73, 81, 86, 87, 86, 80, 81, 93, 117, + (174,254): 156, 171, 169, 160, 132, 79, 20, 7, 1, 1, 1, 1, 1, 1, 1, 1, + (174,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (174,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (175,0): 37, 36, 34, 32, 30, 25, 22, 18, 15, 13, 8, 7, 5, 3, 3, 2, 2, + (175,17): 1, 1, 1, 1, 1, 2, 2, 3, 3, 5, 11, 24, 47, 85, 91, 93, 93, 92, + (175,35): 86, 77, 68, 61, 57, 58, 59, 61, 61, 61, 61, 60, 59, 58, 56, + (175,50): 49, 44, 42, 42, 42, 41, 41, 41, 41, 40, 40, 41, 41, 41, 41, + (175,65): 42, 43, 45, 46, 48, 50, 52, 54, 55, 56, 58, 58, 58, 58, 58, + (175,80): 58, 57, 56, 55, 53, 52, 51, 51, 50, 50, 50, 50, 51, 52, 53, + (175,95): 56, 59, 62, 66, 71, 80, 86, 92, 98, 105, 106, 103, 99, 95, + (175,109): 92, 73, 56, 48, 47, 49, 59, 66, 67, 63, 52, 44, 44, 51, 63, + (175,124): 79, 87, 87, 85, 82, 78, 70, 65, 62, 62, 65, 94, 131, 165, + (175,138): 191, 207, 212, 202, 184, 158, 129, 93, 74, 61, 54, 51, 49, + (175,151): 49, 48, 48, 48, 48, 48, 48, 49, 50, 52, 54, 56, 57, 59, 60, + (175,166): 61, 61, 62, 62, 61, 61, 60, 59, 58, 57, 56, 56, 55, 54, 53, + (175,181): 52, 52, 51, 50, 50, 49, 49, 49, 49, 49, 50, 52, 57, 64, 81, + (175,196): 97, 112, 125, 133, 135, 136, 136, 132, 124, 101, 83, 71, 63, + (175,209): 59, 57, 57, 58, 59, 60, 61, 63, 64, 65, 67, 68, 68, 68, 67, + (175,224): 67, 66, 65, 65, 64, 63, 62, 61, 61, 62, 65, 71, 72, 72, 72, + (175,239): 70, 68, 68, 69, 70, 71, 73, 80, 84, 86, 85, 80, 80, 92, 117, + (175,254): 156, 171, 170, 162, 137, 86, 23, 8, 2, 1, 1, 1, 1, 1, 1, 1, + (175,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (175,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (176,0): 37, 35, 33, 30, 28, 24, 21, 18, 14, 12, 9, 8, 7, 6, 5, 4, 3, + (176,17): 3, 2, 2, 2, 2, 2, 3, 3, 4, 5, 11, 24, 47, 84, 90, 93, 93, 92, + (176,35): 87, 78, 69, 61, 56, 54, 55, 56, 57, 57, 55, 54, 51, 49, 47, + (176,50): 45, 44, 43, 43, 42, 40, 40, 40, 40, 40, 42, 43, 45, 47, 49, + (176,65): 53, 55, 58, 60, 62, 65, 67, 69, 70, 72, 73, 74, 75, 75, 76, + (176,80): 76, 75, 75, 75, 74, 73, 72, 71, 71, 70, 71, 71, 73, 74, 77, + (176,95): 80, 84, 89, 94, 99, 107, 112, 117, 121, 124, 125, 123, 118, + (176,108): 111, 105, 91, 69, 55, 48, 48, 51, 53, 52, 49, 43, 41, 42, + (176,122): 51, 65, 80, 87, 87, 86, 83, 79, 72, 68, 64, 61, 61, 74, 104, + (176,137): 138, 170, 195, 210, 208, 199, 182, 158, 121, 96, 77, 64, 56, + (176,150): 52, 51, 50, 49, 49, 48, 48, 48, 48, 49, 50, 50, 51, 52, 53, + (176,165): 55, 55, 56, 56, 56, 56, 56, 56, 55, 54, 54, 53, 52, 52, 51, + (176,180): 50, 50, 50, 49, 49, 49, 49, 50, 51, 52, 58, 65, 74, 86, 100, + (176,195): 116, 124, 130, 133, 136, 135, 130, 121, 109, 93, 76, 68, 63, + (176,208): 59, 58, 58, 59, 60, 61, 62, 64, 66, 67, 68, 68, 69, 68, 68, + (176,223): 67, 67, 66, 65, 64, 64, 63, 62, 62, 62, 64, 67, 72, 72, 72, + (176,238): 71, 69, 69, 69, 70, 71, 71, 73, 79, 83, 85, 84, 79, 80, 92, + (176,253): 117, 157, 172, 171, 163, 140, 91, 26, 9, 2, 1, 1, 1, 1, 1, + (176,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (176,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (177,0): 37, 35, 32, 29, 27, 23, 21, 19, 17, 16, 14, 13, 12, 11, 10, 7, + (177,16): 6, 5, 4, 3, 3, 3, 3, 3, 3, 4, 6, 13, 26, 49, 83, 90, 93, 93, + (177,34): 92, 88, 80, 71, 62, 55, 52, 51, 51, 52, 52, 52, 51, 51, 50, + (177,49): 49, 47, 44, 41, 40, 39, 39, 40, 41, 43, 46, 49, 53, 56, 59, + (177,64): 61, 65, 67, 70, 72, 74, 77, 78, 80, 82, 83, 85, 86, 87, 88, + (177,79): 89, 90, 90, 91, 92, 92, 92, 93, 93, 93, 94, 95, 97, 99, 101, + (177,94): 104, 109, 113, 117, 122, 127, 133, 136, 139, 141, 143, 142, + (177,106): 141, 136, 129, 121, 109, 86, 66, 52, 49, 48, 47, 44, 40, 38, + (177,120): 38, 41, 52, 67, 81, 87, 88, 86, 84, 80, 74, 70, 66, 63, 59, + (177,135): 64, 82, 110, 143, 175, 202, 208, 207, 198, 183, 150, 124, + (177,147): 101, 82, 67, 56, 53, 52, 51, 50, 49, 49, 49, 49, 49, 49, 49, + (177,162): 49, 50, 50, 51, 51, 51, 51, 52, 52, 51, 51, 51, 51, 51, 50, + (177,177): 50, 50, 50, 49, 49, 49, 50, 51, 53, 56, 60, 66, 73, 86, 96, + (177,192): 106, 116, 125, 133, 135, 135, 134, 130, 120, 109, 96, 84, + (177,204): 73, 64, 61, 59, 59, 59, 60, 61, 62, 64, 65, 67, 68, 69, 69, + (177,219): 69, 69, 68, 68, 67, 66, 65, 65, 64, 63, 63, 62, 62, 64, 66, + (177,234): 70, 72, 72, 72, 71, 69, 69, 70, 71, 72, 72, 74, 78, 82, 83, + (177,249): 83, 79, 80, 92, 118, 158, 172, 171, 164, 142, 95, 29, 10, 2, + (177,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (177,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (178,0): 36, 34, 31, 28, 27, 24, 23, 22, 21, 21, 20, 20, 19, 17, 16, + (178,15): 14, 11, 9, 7, 5, 4, 3, 3, 4, 4, 5, 8, 15, 29, 52, 83, 90, 93, + (178,33): 93, 93, 90, 83, 73, 63, 55, 50, 49, 48, 48, 49, 50, 51, 51, + (178,48): 51, 49, 46, 41, 37, 36, 37, 39, 42, 45, 49, 54, 60, 64, 67, + (178,63): 70, 73, 75, 77, 79, 81, 82, 84, 86, 88, 89, 91, 93, 94, 96, + (178,78): 97, 99, 100, 102, 103, 105, 106, 108, 110, 111, 113, 115, + (178,90): 117, 120, 123, 126, 130, 135, 139, 143, 146, 150, 153, 156, + (178,102): 157, 159, 159, 158, 156, 153, 147, 137, 126, 105, 81, 60, + (178,114): 50, 48, 45, 40, 36, 35, 36, 41, 55, 70, 83, 88, 88, 87, 85, + (178,129): 82, 77, 72, 69, 65, 60, 60, 66, 85, 114, 148, 186, 201, 208, + (178,143): 208, 201, 178, 155, 130, 106, 85, 66, 59, 55, 52, 51, 50, + (178,156): 50, 49, 49, 49, 49, 49, 49, 49, 49, 49, 48, 48, 48, 48, 49, + (178,171): 49, 49, 49, 49, 49, 49, 50, 50, 51, 52, 54, 56, 59, 63, 70, + (178,186): 77, 85, 94, 105, 119, 127, 134, 137, 138, 136, 133, 128, + (178,198): 122, 113, 95, 82, 72, 66, 62, 60, 60, 59, 60, 61, 62, 64, + (178,212): 65, 67, 68, 70, 70, 70, 70, 70, 69, 68, 68, 67, 66, 65, 65, + (178,227): 64, 63, 63, 63, 64, 66, 68, 71, 72, 72, 71, 70, 69, 69, 71, + (178,242): 73, 73, 74, 74, 78, 81, 82, 81, 79, 80, 92, 119, 160, 172, + (178,256): 172, 165, 144, 100, 31, 11, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (178,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (178,293): 1, 1, 1, 1, 1, 1, 1, + (179,0): 36, 34, 31, 28, 27, 25, 25, 24, 24, 24, 24, 24, 24, 24, 23, + (179,15): 22, 20, 17, 13, 8, 5, 4, 4, 4, 5, 7, 10, 18, 33, 56, 83, 89, + (179,32): 92, 93, 93, 91, 86, 77, 65, 56, 51, 49, 48, 48, 50, 52, 52, + (179,47): 48, 41, 34, 32, 33, 34, 36, 38, 43, 49, 54, 60, 64, 69, 72, + (179,62): 74, 76, 78, 80, 82, 83, 85, 86, 89, 91, 92, 94, 96, 98, 100, + (179,77): 102, 103, 105, 107, 109, 111, 112, 114, 117, 119, 121, 124, + (179,89): 126, 131, 135, 139, 143, 147, 152, 155, 158, 161, 164, 167, + (179,101): 168, 169, 170, 171, 171, 169, 167, 163, 154, 141, 126, 100, + (179,113): 73, 52, 49, 45, 40, 36, 35, 36, 44, 58, 73, 84, 88, 88, 87, + (179,128): 86, 83, 79, 74, 71, 67, 62, 60, 59, 66, 84, 115, 162, 188, + (179,142): 204, 211, 212, 201, 184, 162, 137, 112, 84, 69, 60, 55, 53, + (179,155): 51, 51, 50, 50, 49, 49, 49, 48, 48, 48, 48, 48, 48, 48, 48, + (179,170): 48, 49, 49, 49, 50, 50, 51, 52, 53, 55, 60, 66, 74, 84, 95, + (179,185): 110, 121, 130, 136, 140, 141, 142, 141, 140, 137, 131, 120, + (179,197): 106, 92, 78, 67, 64, 62, 61, 60, 60, 60, 61, 62, 63, 66, 68, + (179,212): 69, 70, 71, 71, 71, 71, 70, 70, 69, 68, 68, 67, 66, 65, 65, + (179,227): 64, 64, 64, 64, 66, 68, 71, 72, 72, 72, 71, 70, 70, 70, 73, + (179,242): 74, 75, 75, 75, 77, 79, 81, 80, 78, 79, 93, 120, 161, 173, + (179,256): 172, 166, 146, 103, 34, 12, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (179,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (179,293): 1, 1, 1, 1, 1, 1, 1, + (180,0): 36, 33, 30, 27, 27, 25, 25, 25, 25, 25, 25, 26, 25, 25, 25, + (180,15): 24, 24, 24, 24, 23, 17, 12, 9, 8, 12, 20, 27, 35, 44, 58, 79, + (180,31): 87, 91, 91, 91, 91, 89, 84, 75, 63, 54, 53, 53, 54, 54, 51, + (180,46): 43, 36, 31, 31, 33, 35, 36, 37, 40, 46, 52, 58, 64, 69, 74, + (180,61): 77, 80, 82, 85, 88, 91, 93, 96, 99, 102, 105, 107, 110, 112, + (180,75): 115, 117, 119, 121, 123, 125, 127, 129, 131, 133, 136, 139, + (180,87): 142, 145, 149, 155, 159, 162, 165, 168, 171, 172, 174, 175, + (180,99): 176, 177, 178, 178, 179, 179, 179, 178, 178, 176, 173, 161, + (180,111): 150, 130, 102, 68, 52, 48, 42, 37, 35, 37, 47, 61, 75, 85, + (180,125): 89, 90, 89, 87, 84, 80, 77, 74, 71, 67, 62, 60, 59, 62, 72, + (180,140): 113, 148, 178, 200, 210, 212, 207, 198, 184, 164, 134, 112, + (180,152): 92, 75, 64, 57, 55, 53, 52, 51, 51, 50, 50, 50, 50, 50, 51, + (180,167): 51, 52, 53, 55, 58, 61, 65, 71, 80, 89, 98, 107, 117, 129, + (180,181): 135, 140, 142, 144, 145, 146, 146, 145, 143, 139, 133, 123, + (180,193): 111, 98, 81, 73, 68, 64, 63, 62, 61, 61, 61, 61, 62, 63, 65, + (180,208): 67, 69, 71, 72, 72, 72, 72, 72, 71, 71, 70, 70, 69, 68, 68, + (180,223): 67, 66, 65, 65, 65, 65, 65, 67, 69, 71, 72, 72, 72, 71, 71, + (180,238): 70, 70, 72, 76, 77, 78, 77, 76, 77, 78, 79, 79, 78, 79, 93, + (180,253): 121, 163, 174, 173, 167, 148, 107, 37, 14, 3, 1, 1, 1, 1, 1, + (180,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (180,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (181,0): 37, 33, 30, 27, 26, 25, 25, 26, 26, 26, 27, 27, 28, 27, 27, + (181,15): 25, 24, 24, 24, 24, 23, 22, 21, 20, 22, 35, 45, 52, 57, 63, + (181,30): 77, 84, 89, 90, 90, 90, 89, 86, 81, 72, 63, 60, 58, 57, 54, + (181,45): 44, 36, 32, 32, 33, 35, 36, 37, 38, 40, 48, 55, 63, 69, 75, + (181,60): 81, 84, 88, 91, 94, 98, 101, 104, 107, 110, 114, 116, 119, + (181,73): 121, 124, 127, 129, 131, 134, 136, 139, 142, 145, 148, 152, + (181,85): 157, 161, 165, 168, 171, 174, 175, 176, 177, 177, 178, 179, + (181,97): 179, 179, 180, 180, 180, 180, 180, 180, 180, 180, 180, 180, + (181,109): 179, 173, 164, 150, 126, 92, 59, 51, 45, 41, 38, 39, 47, 61, + (181,123): 75, 86, 91, 91, 91, 89, 86, 81, 77, 75, 73, 70, 66, 62, 60, + (181,138): 59, 62, 80, 109, 140, 170, 195, 209, 210, 207, 201, 193, + (181,150): 175, 157, 139, 121, 104, 87, 78, 71, 67, 64, 62, 62, 63, 64, + (181,164): 66, 70, 74, 79, 85, 91, 99, 106, 112, 118, 123, 128, 131, + (181,177): 135, 138, 141, 143, 144, 144, 144, 143, 139, 134, 127, 120, + (181,189): 112, 100, 92, 85, 79, 74, 68, 65, 63, 62, 62, 61, 61, 62, + (181,203): 63, 64, 66, 68, 70, 71, 72, 73, 73, 73, 73, 73, 72, 72, 71, + (181,218): 71, 70, 69, 68, 68, 67, 67, 66, 66, 67, 67, 68, 70, 71, 72, + (181,233): 72, 72, 72, 71, 71, 71, 71, 74, 79, 80, 80, 79, 77, 77, 78, + (181,248): 78, 78, 77, 79, 94, 123, 165, 174, 173, 168, 150, 110, 39, + (181,261): 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (181,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (182,0): 38, 34, 30, 27, 26, 25, 25, 26, 26, 27, 27, 27, 28, 29, 29, + (182,15): 27, 25, 24, 24, 24, 24, 25, 27, 31, 35, 46, 57, 66, 72, 75, + (182,30): 81, 85, 87, 88, 89, 89, 89, 88, 85, 79, 70, 66, 62, 56, 49, + (182,45): 36, 32, 31, 32, 34, 36, 37, 38, 39, 41, 50, 59, 67, 75, 81, + (182,60): 87, 90, 94, 98, 101, 105, 109, 112, 115, 118, 121, 124, 126, + (182,73): 129, 131, 135, 137, 140, 143, 146, 150, 154, 158, 163, 167, + (182,85): 172, 175, 178, 179, 181, 181, 181, 181, 181, 181, 181, 181, + (182,97): 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, 181, + (182,109): 181, 179, 174, 165, 148, 118, 75, 59, 49, 43, 41, 41, 48, + (182,122): 60, 74, 85, 92, 93, 92, 90, 87, 82, 78, 76, 74, 72, 69, 65, + (182,137): 62, 59, 58, 64, 80, 103, 131, 162, 191, 202, 207, 207, 205, + (182,150): 196, 187, 175, 163, 149, 132, 122, 114, 108, 104, 101, 101, + (182,162): 103, 104, 107, 112, 116, 120, 124, 128, 133, 136, 139, 141, + (182,174): 143, 144, 144, 144, 142, 140, 135, 130, 126, 121, 116, 108, + (182,186): 102, 96, 90, 84, 76, 71, 68, 66, 64, 63, 62, 62, 62, 62, 63, + (182,201): 64, 65, 67, 69, 71, 72, 73, 74, 74, 74, 74, 74, 74, 74, 73, + (182,216): 72, 72, 71, 71, 70, 69, 69, 68, 68, 68, 68, 69, 69, 70, 71, + (182,231): 72, 72, 72, 72, 72, 71, 71, 71, 72, 77, 82, 84, 84, 82, 77, + (182,246): 77, 77, 77, 77, 77, 78, 95, 125, 166, 175, 174, 168, 151, + (182,259): 113, 41, 15, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (182,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (182,298): 1, 1, + (183,0): 40, 36, 32, 28, 26, 25, 25, 25, 26, 26, 26, 26, 27, 29, 30, + (183,15): 29, 26, 24, 23, 23, 23, 24, 28, 34, 39, 47, 59, 71, 81, 85, + (183,30): 86, 86, 87, 87, 88, 88, 88, 87, 86, 83, 76, 69, 62, 53, 42, + (183,45): 32, 31, 31, 32, 35, 37, 38, 39, 40, 43, 54, 64, 72, 79, 85, + (183,60): 91, 95, 99, 103, 107, 112, 115, 118, 121, 124, 128, 131, 133, + (183,73): 136, 139, 143, 146, 149, 152, 155, 161, 166, 171, 175, 178, + (183,85): 182, 183, 183, 183, 183, 182, 182, 182, 181, 181, 181, 181, + (183,97): 182, 182, 182, 182, 182, 182, 182, 182, 181, 181, 181, 181, + (183,109): 181, 181, 180, 176, 165, 145, 98, 72, 55, 47, 44, 44, 49, + (183,122): 59, 73, 85, 93, 94, 94, 92, 89, 84, 80, 77, 75, 73, 71, 69, + (183,137): 65, 61, 58, 59, 63, 75, 94, 120, 158, 181, 195, 203, 205, + (183,150): 204, 201, 197, 191, 184, 173, 165, 158, 153, 148, 145, 145, + (183,162): 145, 147, 148, 150, 151, 152, 151, 151, 149, 146, 144, 140, + (183,174): 137, 133, 130, 126, 121, 116, 108, 102, 96, 89, 83, 76, 72, + (183,187): 69, 67, 65, 64, 64, 63, 63, 63, 63, 63, 64, 64, 65, 67, 69, + (183,202): 70, 72, 73, 75, 75, 76, 76, 76, 75, 75, 75, 75, 74, 74, 73, + (183,217): 72, 72, 72, 71, 70, 70, 70, 70, 70, 70, 71, 71, 72, 72, 72, + (183,232): 72, 72, 72, 72, 71, 71, 72, 73, 81, 86, 88, 87, 86, 78, 77, + (183,247): 76, 76, 76, 76, 78, 96, 127, 168, 176, 174, 169, 152, 115, + (183,260): 43, 16, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (183,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (183,299): 1, + (184,0): 45, 42, 36, 30, 26, 24, 24, 24, 24, 25, 24, 24, 26, 28, 29, + (184,15): 29, 26, 24, 23, 23, 24, 24, 23, 23, 24, 32, 48, 64, 77, 85, + (184,30): 89, 89, 89, 88, 88, 87, 86, 86, 85, 83, 77, 69, 59, 48, 36, + (184,45): 31, 31, 31, 33, 36, 39, 40, 41, 42, 44, 57, 67, 76, 83, 89, + (184,60): 95, 100, 105, 109, 113, 118, 122, 125, 128, 132, 136, 139, + (184,72): 142, 145, 148, 153, 157, 160, 165, 169, 177, 181, 184, 186, + (184,84): 186, 185, 184, 184, 183, 182, 181, 181, 181, 181, 181, 182, + (184,96): 182, 183, 183, 184, 185, 185, 184, 184, 183, 182, 181, 181, + (184,108): 181, 181, 182, 182, 181, 178, 168, 127, 91, 66, 51, 46, 46, + (184,121): 49, 58, 71, 84, 93, 95, 95, 94, 91, 86, 82, 79, 76, 73, 72, + (184,136): 71, 68, 65, 60, 59, 59, 62, 68, 81, 112, 141, 167, 188, 199, + (184,150): 203, 201, 199, 197, 194, 190, 187, 183, 180, 176, 173, 170, + (184,162): 167, 165, 162, 159, 157, 154, 151, 148, 142, 135, 127, 119, + (184,174): 110, 98, 90, 83, 78, 73, 69, 68, 66, 65, 65, 64, 64, 64, 64, + (184,189): 63, 63, 63, 63, 63, 64, 65, 66, 68, 69, 71, 73, 74, 75, 76, + (184,204): 77, 77, 77, 77, 77, 77, 76, 76, 75, 75, 75, 74, 73, 73, 73, + (184,219): 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + (184,234): 72, 72, 72, 72, 73, 75, 86, 90, 92, 92, 90, 80, 77, 76, 76, + (184,249): 76, 76, 78, 97, 129, 170, 176, 174, 169, 152, 117, 45, 17, + (184,262): 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (184,282): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (185,0): 26, 33, 36, 37, 36, 34, 32, 30, 30, 30, 32, 32, 32, 30, 29, + (185,15): 23, 22, 22, 22, 23, 26, 28, 28, 28, 26, 25, 27, 33, 44, 59, + (185,30): 77, 83, 87, 89, 89, 88, 87, 86, 84, 82, 77, 69, 59, 48, 37, + (185,45): 32, 32, 33, 36, 41, 42, 42, 42, 44, 49, 65, 76, 85, 92, 98, + (185,60): 106, 111, 116, 120, 125, 130, 134, 137, 141, 144, 149, 153, + (185,72): 156, 160, 163, 169, 173, 179, 184, 189, 191, 190, 190, 188, + (185,84): 187, 183, 181, 180, 180, 180, 180, 181, 182, 184, 186, 189, + (185,96): 191, 194, 196, 198, 199, 199, 199, 198, 196, 192, 188, 184, + (185,108): 182, 181, 181, 181, 182, 182, 181, 166, 131, 95, 66, 50, 47, + (185,121): 48, 54, 65, 80, 93, 96, 97, 97, 94, 89, 85, 81, 78, 75, 72, + (185,136): 72, 71, 69, 66, 61, 60, 59, 60, 61, 68, 84, 105, 128, 151, + (185,150): 175, 185, 191, 192, 192, 189, 186, 183, 179, 176, 171, 167, + (185,162): 163, 158, 152, 141, 131, 120, 108, 97, 84, 78, 73, 70, 67, + (185,175): 66, 65, 65, 64, 64, 64, 64, 64, 64, 65, 65, 65, 65, 66, 66, + (185,190): 67, 69, 70, 71, 73, 74, 75, 76, 77, 77, 78, 79, 79, 79, 79, + (185,205): 79, 78, 78, 77, 77, 76, 76, 75, 75, 75, 74, 74, 74, 74, 74, + (185,220): 73, 73, 73, 73, 73, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + (185,235): 72, 73, 74, 77, 81, 92, 97, 99, 98, 96, 84, 78, 76, 75, 75, + (185,250): 75, 78, 99, 132, 172, 177, 175, 169, 153, 119, 47, 18, 4, 1, + (185,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (185,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (186,0): 16, 18, 19, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 21, + (186,15): 21, 21, 23, 25, 29, 34, 36, 36, 36, 35, 30, 29, 29, 33, 37, + (186,30): 46, 53, 61, 70, 79, 86, 87, 86, 85, 83, 78, 72, 63, 52, 41, + (186,45): 37, 38, 41, 44, 45, 43, 42, 43, 47, 56, 73, 83, 91, 98, 104, + (186,60): 112, 117, 121, 126, 130, 136, 140, 144, 148, 151, 156, 160, + (186,72): 163, 168, 172, 179, 184, 188, 191, 192, 192, 189, 186, 183, + (186,84): 180, 179, 179, 179, 180, 182, 185, 188, 190, 193, 196, 200, + (186,96): 203, 205, 207, 209, 210, 211, 211, 210, 209, 206, 202, 197, + (186,108): 192, 186, 182, 181, 182, 182, 182, 177, 157, 126, 92, 62, + (186,120): 49, 49, 52, 60, 74, 90, 96, 99, 99, 98, 92, 87, 83, 79, 76, + (186,135): 73, 72, 72, 71, 69, 65, 63, 61, 59, 59, 61, 67, 76, 89, 104, + (186,150): 125, 138, 149, 158, 164, 166, 166, 163, 159, 154, 145, 136, + (186,162): 127, 117, 107, 96, 89, 83, 79, 75, 71, 70, 68, 68, 67, 67, + (186,176): 68, 69, 69, 70, 71, 72, 72, 73, 74, 74, 75, 75, 76, 77, 77, + (186,191): 78, 78, 79, 79, 80, 80, 80, 80, 81, 80, 80, 80, 80, 79, 79, + (186,206): 78, 78, 77, 77, 76, 76, 75, 75, 75, 75, 74, 74, 74, 74, 74, + (186,221): 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 72, 72, 72, 73, 73, + (186,236): 75, 78, 81, 86, 97, 103, 104, 104, 101, 87, 80, 76, 75, 74, + (186,250): 75, 78, 100, 134, 173, 178, 175, 170, 154, 120, 48, 18, 5, + (186,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (186,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (187,0): 19, 19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 21, 22, 23, + (187,15): 25, 27, 30, 34, 37, 41, 42, 43, 42, 42, 38, 35, 33, 32, 31, + (187,30): 34, 37, 42, 49, 57, 65, 72, 78, 82, 82, 80, 76, 70, 63, 53, + (187,45): 50, 51, 52, 51, 47, 43, 42, 46, 53, 66, 81, 89, 97, 104, 110, + (187,60): 117, 122, 127, 132, 136, 143, 147, 151, 155, 159, 164, 167, + (187,72): 172, 178, 183, 189, 192, 193, 194, 192, 187, 182, 179, 178, + (187,84): 176, 178, 180, 183, 185, 188, 191, 194, 197, 200, 203, 207, + (187,96): 210, 212, 214, 215, 217, 217, 217, 217, 216, 215, 212, 208, + (187,108): 203, 197, 188, 184, 182, 182, 182, 181, 173, 153, 122, 86, + (187,120): 56, 51, 50, 55, 65, 85, 93, 98, 100, 100, 96, 90, 85, 81, + (187,134): 77, 74, 73, 72, 71, 70, 68, 66, 64, 61, 59, 58, 60, 63, 68, + (187,149): 75, 87, 97, 106, 115, 122, 127, 127, 125, 121, 116, 107, 99, + (187,162): 92, 86, 80, 74, 72, 70, 70, 70, 71, 72, 73, 74, 75, 76, 77, + (187,177): 77, 78, 79, 79, 80, 80, 81, 81, 81, 82, 82, 82, 82, 83, 83, + (187,192): 83, 83, 83, 82, 82, 82, 82, 82, 81, 81, 80, 80, 79, 78, 78, + (187,207): 78, 77, 77, 76, 76, 76, 75, 75, 75, 75, 75, 74, 74, 74, 74, + (187,222): 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, 74, 75, 78, + (187,237): 82, 87, 92, 103, 108, 110, 110, 107, 91, 82, 77, 75, 74, 74, + (187,251): 78, 101, 136, 175, 179, 175, 170, 154, 121, 49, 19, 5, 1, 1, + (187,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (187,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (188,0): 29, 28, 28, 27, 26, 26, 25, 25, 25, 25, 25, 26, 27, 28, 30, + (188,15): 33, 37, 40, 42, 45, 46, 47, 47, 47, 47, 46, 43, 40, 38, 35, + (188,30): 34, 34, 33, 34, 37, 42, 51, 62, 70, 73, 75, 76, 74, 70, 64, + (188,45): 61, 59, 57, 52, 46, 42, 45, 52, 63, 76, 89, 96, 103, 110, + (188,59): 116, 123, 129, 134, 139, 144, 150, 154, 159, 163, 167, 172, + (188,71): 177, 183, 189, 193, 196, 196, 194, 191, 186, 179, 175, 174, + (188,83): 175, 177, 181, 184, 188, 191, 193, 196, 199, 202, 205, 209, + (188,95): 213, 215, 216, 218, 219, 219, 220, 220, 220, 220, 220, 219, + (188,107): 216, 213, 209, 199, 190, 185, 183, 182, 182, 181, 171, 151, + (188,119): 118, 72, 58, 51, 52, 57, 76, 88, 96, 101, 102, 100, 95, 89, + (188,133): 83, 78, 75, 74, 73, 72, 71, 70, 69, 67, 64, 61, 59, 59, 59, + (188,148): 60, 61, 64, 68, 73, 78, 84, 88, 88, 86, 84, 80, 74, 71, 70, + (188,163): 69, 69, 70, 71, 72, 73, 75, 77, 79, 81, 82, 83, 84, 85, 85, + (188,178): 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, 84, + (188,193): 84, 84, 83, 83, 82, 82, 81, 81, 80, 80, 79, 79, 78, 78, 77, + (188,208): 77, 77, 76, 76, 76, 76, 75, 75, 75, 75, 75, 75, 74, 74, 74, + (188,223): 74, 73, 73, 73, 73, 73, 73, 74, 74, 74, 75, 76, 78, 82, 87, + (188,238): 93, 98, 109, 114, 116, 116, 113, 96, 84, 78, 75, 74, 74, 78, + (188,252): 103, 139, 176, 179, 175, 170, 154, 122, 50, 19, 5, 1, 1, 1, + (188,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (188,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (189,0): 38, 38, 38, 37, 37, 36, 36, 35, 35, 35, 35, 36, 37, 39, 40, + (189,15): 43, 45, 46, 47, 48, 50, 50, 50, 50, 50, 49, 48, 46, 44, 42, + (189,30): 39, 37, 35, 34, 34, 34, 35, 37, 42, 48, 59, 65, 66, 65, 63, + (189,45): 58, 52, 46, 42, 40, 42, 51, 64, 76, 86, 96, 103, 110, 117, + (189,59): 123, 130, 136, 141, 147, 152, 158, 163, 167, 171, 175, 182, + (189,71): 188, 194, 198, 199, 198, 195, 189, 182, 173, 172, 172, 174, + (189,83): 177, 183, 189, 190, 192, 193, 194, 198, 201, 205, 210, 213, + (189,95): 217, 219, 220, 220, 221, 221, 221, 221, 221, 221, 221, 222, + (189,107): 221, 219, 216, 210, 202, 193, 185, 183, 183, 182, 181, 172, + (189,119): 153, 101, 72, 56, 50, 51, 63, 80, 92, 99, 103, 103, 100, 94, + (189,133): 87, 80, 76, 74, 73, 72, 71, 71, 71, 70, 68, 65, 61, 59, 59, + (189,148): 59, 60, 60, 61, 62, 63, 64, 65, 65, 65, 65, 65, 65, 66, 67, + (189,163): 69, 71, 74, 77, 79, 81, 83, 84, 85, 85, 86, 86, 86, 86, 86, + (189,178): 86, 86, 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 85, 85, 84, + (189,193): 84, 84, 83, 82, 82, 81, 80, 80, 79, 79, 78, 78, 78, 77, 77, + (189,208): 77, 77, 76, 76, 76, 76, 76, 76, 76, 76, 76, 75, 75, 75, 75, + (189,223): 75, 75, 75, 75, 75, 75, 75, 75, 76, 77, 78, 79, 83, 88, 94, + (189,238): 100, 105, 114, 120, 122, 122, 120, 101, 87, 79, 75, 73, 74, + (189,251): 78, 104, 141, 177, 180, 176, 170, 155, 122, 50, 19, 5, 1, 1, + (189,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (189,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (190,0): 51, 51, 50, 50, 50, 49, 49, 49, 49, 49, 49, 49, 50, 51, 52, + (190,15): 54, 55, 56, 57, 58, 60, 60, 60, 60, 60, 59, 57, 56, 54, 52, + (190,30): 50, 48, 46, 44, 42, 39, 38, 37, 37, 37, 38, 39, 39, 39, 39, + (190,45): 39, 39, 40, 42, 46, 61, 72, 81, 89, 95, 106, 113, 120, 126, + (190,59): 131, 139, 145, 150, 155, 161, 167, 171, 176, 180, 186, 195, + (190,71): 200, 201, 201, 199, 190, 177, 170, 167, 168, 172, 179, 184, + (190,83): 188, 190, 191, 191, 192, 193, 196, 203, 209, 213, 216, 218, + (190,95): 219, 219, 219, 218, 216, 213, 213, 213, 214, 216, 219, 221, + (190,107): 222, 223, 223, 219, 215, 207, 198, 188, 183, 183, 183, 181, + (190,119): 177, 147, 110, 79, 58, 50, 51, 62, 77, 91, 100, 104, 104, + (190,132): 102, 97, 90, 80, 76, 74, 72, 72, 71, 71, 71, 70, 69, 67, 64, + (190,147): 63, 61, 61, 61, 60, 60, 60, 61, 61, 62, 63, 64, 65, 68, 71, + (190,162): 73, 75, 76, 77, 76, 75, 73, 70, 67, 66, 66, 67, 68, 69, 71, + (190,177): 74, 77, 79, 81, 81, 82, 82, 83, 83, 83, 83, 83, 83, 82, 82, + (190,192): 82, 82, 81, 81, 80, 80, 80, 79, 79, 79, 78, 78, 78, 78, 78, + (190,207): 78, 78, 79, 79, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, + (190,222): 80, 80, 80, 80, 79, 80, 80, 80, 81, 82, 83, 84, 87, 92, 97, + (190,237): 103, 109, 113, 121, 127, 129, 130, 128, 110, 93, 82, 76, 73, + (190,250): 74, 79, 106, 144, 178, 180, 176, 170, 155, 123, 51, 20, 5, + (190,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (190,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (191,0): 60, 60, 60, 60, 59, 59, 59, 59, 58, 58, 59, 59, 59, 60, 61, + (191,15): 62, 63, 64, 65, 65, 66, 67, 67, 67, 66, 65, 64, 63, 61, 60, + (191,30): 58, 56, 55, 53, 51, 49, 48, 46, 45, 43, 43, 43, 43, 43, 44, + (191,45): 46, 48, 52, 58, 65, 76, 83, 90, 97, 104, 114, 121, 127, 132, + (191,59): 138, 146, 152, 157, 162, 168, 174, 179, 184, 190, 197, 201, + (191,71): 202, 201, 196, 186, 171, 168, 167, 168, 173, 183, 186, 188, + (191,83): 189, 190, 189, 189, 191, 194, 200, 207, 211, 214, 216, 217, + (191,95): 215, 212, 208, 203, 199, 196, 194, 195, 196, 198, 203, 209, + (191,107): 215, 219, 222, 222, 220, 216, 208, 199, 187, 184, 183, 182, + (191,119): 181, 169, 141, 109, 80, 58, 50, 54, 63, 76, 92, 102, 103, + (191,132): 103, 101, 97, 88, 82, 77, 74, 72, 71, 71, 71, 70, 70, 69, + (191,146): 68, 66, 65, 64, 62, 61, 61, 61, 61, 62, 63, 65, 67, 70, 73, + (191,161): 74, 74, 73, 70, 65, 61, 57, 54, 52, 50, 49, 48, 47, 47, 49, + (191,176): 50, 52, 54, 56, 62, 66, 71, 74, 77, 79, 80, 81, 81, 81, 81, + (191,191): 81, 81, 81, 81, 80, 80, 80, 80, 79, 79, 79, 80, 80, 81, 82, + (191,206): 82, 83, 84, 85, 86, 86, 86, 87, 87, 87, 87, 88, 88, 87, 87, + (191,221): 87, 87, 86, 86, 86, 86, 86, 86, 86, 87, 88, 89, 91, 95, 99, + (191,236): 105, 110, 115, 118, 124, 131, 134, 135, 134, 117, 98, 84, + (191,248): 77, 73, 74, 79, 108, 145, 179, 180, 176, 170, 155, 123, 51, + (191,261): 20, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (191,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (192,0): 70, 70, 69, 69, 69, 69, 68, 68, 68, 68, 68, 68, 69, 69, 70, + (192,15): 71, 71, 72, 72, 73, 73, 73, 73, 73, 73, 72, 71, 70, 69, 67, + (192,30): 65, 64, 63, 61, 60, 58, 57, 56, 55, 53, 52, 52, 52, 53, 55, + (192,45): 58, 62, 66, 72, 78, 86, 92, 99, 106, 113, 122, 128, 134, 139, + (192,59): 145, 153, 159, 164, 170, 174, 181, 187, 193, 198, 203, 203, + (192,71): 200, 191, 181, 171, 163, 165, 170, 176, 182, 188, 189, 189, + (192,83): 188, 186, 186, 187, 191, 196, 202, 209, 211, 213, 213, 211, + (192,95): 206, 200, 195, 190, 186, 184, 184, 185, 186, 189, 194, 198, + (192,107): 204, 210, 216, 222, 223, 221, 217, 209, 196, 188, 185, 183, + (192,119): 183, 179, 163, 138, 107, 77, 55, 52, 54, 63, 77, 95, 100, + (192,132): 102, 102, 100, 95, 89, 84, 79, 75, 72, 72, 71, 71, 70, 70, + (192,146): 69, 68, 67, 66, 64, 63, 62, 62, 63, 65, 67, 69, 71, 73, 74, + (192,161): 72, 69, 65, 61, 57, 55, 53, 53, 52, 52, 53, 53, 52, 51, 49, + (192,176): 47, 45, 44, 44, 47, 50, 54, 57, 61, 67, 70, 74, 76, 78, 79, + (192,191): 80, 80, 80, 80, 80, 80, 80, 80, 81, 81, 82, 83, 84, 86, 88, + (192,206): 89, 90, 91, 92, 93, 94, 94, 94, 95, 95, 95, 95, 95, 95, 95, + (192,221): 95, 94, 94, 94, 93, 93, 93, 93, 93, 94, 95, 97, 99, 102, + (192,235): 106, 111, 115, 119, 122, 127, 134, 138, 140, 139, 125, 103, + (192,247): 88, 78, 74, 74, 80, 109, 147, 180, 181, 176, 170, 154, 123, + (192,260): 51, 20, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (192,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (192,299): 1, + (193,0): 79, 79, 79, 79, 79, 78, 78, 78, 78, 78, 78, 78, 78, 78, 79, + (193,15): 79, 79, 80, 80, 80, 81, 81, 80, 80, 80, 79, 78, 77, 76, 75, + (193,30): 73, 72, 71, 70, 69, 68, 67, 66, 65, 64, 64, 64, 65, 66, 68, + (193,45): 72, 75, 80, 84, 89, 95, 102, 109, 115, 122, 129, 135, 141, + (193,58): 146, 152, 160, 166, 171, 177, 181, 189, 195, 201, 205, 205, + (193,70): 200, 190, 177, 165, 160, 163, 170, 178, 185, 189, 189, 188, + (193,82): 186, 184, 183, 183, 186, 191, 198, 204, 208, 210, 210, 208, + (193,94): 203, 195, 189, 184, 180, 178, 178, 180, 181, 183, 186, 189, + (193,106): 192, 195, 200, 207, 218, 222, 223, 222, 218, 206, 195, 188, + (193,118): 185, 184, 183, 178, 162, 137, 105, 69, 57, 51, 53, 61, 83, + (193,131): 94, 99, 101, 101, 99, 95, 91, 86, 81, 76, 74, 73, 72, 71, + (193,145): 71, 70, 70, 69, 68, 66, 66, 66, 66, 67, 70, 72, 74, 74, 74, + (193,160): 71, 66, 61, 57, 54, 53, 54, 55, 57, 59, 62, 64, 66, 67, 66, + (193,175): 62, 58, 53, 48, 44, 41, 40, 40, 42, 45, 51, 56, 61, 65, 69, + (193,190): 72, 74, 76, 77, 78, 79, 80, 80, 81, 82, 83, 85, 87, 89, 91, + (193,205): 94, 95, 97, 98, 99, 100, 101, 101, 102, 102, 103, 103, 103, + (193,218): 103, 103, 102, 102, 102, 102, 101, 101, 101, 100, 101, 101, + (193,230): 101, 102, 104, 106, 109, 113, 116, 120, 123, 125, 129, 137, + (193,242): 142, 144, 144, 133, 110, 92, 79, 74, 74, 80, 110, 149, 180, + (193,255): 181, 176, 169, 154, 123, 50, 19, 5, 1, 1, 1, 1, 1, 1, 1, 1, + (193,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (193,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (194,0): 89, 89, 88, 88, 88, 88, 88, 87, 87, 87, 87, 87, 87, 87, 87, + (194,15): 88, 88, 88, 88, 88, 88, 88, 88, 87, 87, 86, 85, 84, 83, 82, + (194,30): 81, 80, 79, 78, 77, 76, 76, 75, 75, 75, 75, 75, 76, 78, 80, + (194,45): 83, 86, 90, 94, 99, 107, 113, 119, 124, 129, 137, 142, 148, + (194,58): 153, 159, 167, 173, 178, 183, 188, 198, 204, 206, 206, 204, + (194,70): 188, 168, 159, 157, 159, 171, 182, 188, 190, 189, 187, 183, + (194,82): 181, 180, 180, 181, 185, 192, 198, 204, 206, 206, 205, 201, + (194,94): 196, 187, 182, 178, 176, 176, 177, 179, 181, 183, 186, 189, + (194,106): 192, 195, 198, 200, 209, 217, 222, 224, 223, 216, 205, 195, + (194,118): 187, 184, 184, 183, 177, 163, 137, 93, 70, 55, 49, 51, 64, + (194,131): 82, 94, 99, 99, 98, 96, 94, 92, 88, 83, 80, 76, 74, 73, 72, + (194,146): 71, 71, 71, 70, 70, 71, 72, 73, 75, 76, 76, 75, 74, 71, 62, + (194,161): 56, 53, 52, 52, 53, 53, 55, 56, 59, 63, 67, 72, 76, 80, 82, + (194,176): 80, 75, 68, 59, 48, 42, 39, 37, 37, 38, 39, 42, 45, 50, 57, + (194,191): 62, 66, 70, 73, 76, 78, 80, 81, 82, 84, 87, 89, 92, 95, 98, + (194,206): 99, 101, 102, 103, 104, 105, 106, 107, 108, 108, 109, 109, + (194,218): 109, 109, 109, 109, 108, 108, 108, 108, 107, 107, 107, 108, + (194,230): 108, 109, 110, 112, 114, 117, 119, 122, 125, 128, 131, 139, + (194,242): 145, 149, 149, 141, 117, 97, 81, 75, 75, 81, 111, 150, 181, + (194,255): 181, 176, 170, 154, 122, 50, 19, 5, 1, 1, 1, 1, 1, 1, 1, 1, + (194,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (194,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (195,0): 101, 101, 101, 101, 101, 101, 100, 100, 100, 100, 100, 99, 99, + (195,13): 99, 99, 99, 99, 99, 99, 99, 98, 98, 98, 97, 97, 96, 95, 94, + (195,28): 93, 92, 91, 90, 90, 89, 88, 88, 87, 87, 87, 87, 88, 89, 90, + (195,43): 92, 94, 98, 101, 105, 109, 113, 119, 124, 129, 134, 140, 147, + (195,56): 152, 157, 163, 169, 177, 182, 187, 193, 200, 207, 208, 206, + (195,68): 198, 182, 154, 153, 155, 161, 176, 189, 190, 190, 188, 183, + (195,80): 178, 178, 179, 179, 179, 181, 186, 192, 199, 202, 203, 203, + (195,92): 200, 195, 187, 178, 174, 172, 172, 174, 178, 182, 187, 192, + (195,104): 195, 198, 199, 199, 200, 201, 204, 209, 216, 222, 224, 223, + (195,116): 217, 207, 197, 187, 184, 184, 183, 179, 170, 135, 104, 78, + (195,128): 59, 49, 50, 59, 74, 88, 96, 95, 94, 94, 92, 91, 89, 87, 85, + (195,143): 83, 81, 79, 78, 78, 77, 77, 77, 78, 78, 78, 78, 77, 75, 71, + (195,158): 65, 57, 52, 51, 51, 52, 52, 52, 53, 53, 53, 53, 57, 63, 71, + (195,173): 78, 85, 91, 92, 91, 87, 81, 71, 63, 56, 49, 44, 39, 38, 38, + (195,188): 38, 39, 40, 42, 45, 49, 53, 60, 66, 71, 75, 79, 83, 86, 89, + (195,203): 92, 95, 99, 100, 102, 103, 104, 106, 107, 108, 109, 110, + (195,215): 111, 112, 112, 112, 113, 113, 113, 113, 113, 113, 112, 112, + (195,227): 113, 113, 113, 114, 115, 115, 116, 118, 120, 121, 124, 127, + (195,239): 130, 133, 141, 148, 153, 154, 149, 128, 105, 85, 76, 75, 82, + (195,252): 113, 152, 182, 182, 176, 170, 154, 121, 48, 19, 5, 1, 1, 1, + (195,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (195,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (196,0): 111, 111, 111, 110, 110, 110, 110, 110, 109, 109, 109, 109, + (196,12): 108, 108, 108, 108, 107, 107, 107, 107, 106, 106, 105, 105, + (196,24): 104, 103, 103, 102, 101, 100, 99, 98, 98, 97, 96, 96, 96, 96, + (196,38): 96, 97, 98, 99, 100, 102, 104, 108, 111, 114, 118, 122, 128, + (196,51): 133, 138, 143, 147, 154, 159, 164, 170, 176, 183, 188, 194, + (196,63): 201, 207, 208, 206, 193, 176, 157, 150, 154, 165, 178, 187, + (196,75): 190, 189, 186, 181, 178, 177, 177, 177, 178, 178, 180, 187, + (196,87): 193, 198, 201, 202, 201, 196, 189, 180, 173, 171, 171, 174, + (196,99): 178, 188, 196, 202, 207, 211, 213, 213, 212, 210, 207, 206, + (196,111): 209, 213, 218, 223, 225, 222, 215, 206, 195, 186, 185, 184, + (196,123): 183, 179, 160, 133, 105, 80, 61, 49, 52, 59, 71, 84, 92, 92, + (196,137): 91, 90, 88, 88, 87, 86, 85, 83, 82, 81, 81, 80, 80, 80, 80, + (196,152): 79, 79, 78, 74, 69, 63, 57, 52, 51, 51, 51, 52, 52, 52, 52, + (196,167): 53, 53, 53, 56, 61, 68, 77, 87, 96, 100, 100, 98, 93, 84, + (196,181): 76, 68, 61, 54, 48, 45, 42, 41, 39, 40, 41, 43, 46, 49, 55, + (196,196): 61, 66, 71, 76, 81, 85, 89, 92, 95, 99, 101, 102, 104, 105, + (196,210): 107, 108, 110, 111, 112, 113, 113, 114, 114, 114, 114, 114, + (196,222): 114, 114, 114, 114, 114, 114, 114, 115, 115, 116, 117, 118, + (196,234): 119, 121, 122, 125, 129, 132, 136, 142, 150, 156, 158, 155, + (196,246): 136, 112, 89, 77, 76, 82, 114, 153, 182, 182, 176, 170, 153, + (196,259): 119, 47, 18, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (196,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (196,298): 1, 1, + (197,0): 120, 120, 120, 120, 120, 120, 119, 119, 119, 119, 118, 118, + (197,12): 118, 117, 117, 116, 116, 116, 115, 115, 114, 114, 113, 112, + (197,24): 112, 111, 110, 109, 108, 108, 107, 106, 105, 105, 105, 104, + (197,36): 104, 105, 105, 106, 107, 108, 110, 112, 114, 117, 121, 124, + (197,48): 128, 132, 137, 141, 146, 150, 155, 161, 166, 171, 177, 182, + (197,60): 189, 196, 202, 207, 209, 206, 191, 173, 157, 147, 153, 166, + (197,72): 178, 187, 191, 189, 185, 180, 177, 176, 176, 176, 177, 178, + (197,84): 178, 181, 188, 194, 198, 200, 200, 197, 191, 183, 175, 171, + (197,96): 171, 173, 179, 187, 200, 208, 214, 219, 222, 223, 223, 221, + (197,108): 220, 217, 212, 211, 213, 216, 221, 225, 224, 220, 214, 204, + (197,120): 191, 187, 185, 184, 183, 175, 157, 133, 106, 81, 58, 52, 52, + (197,133): 58, 69, 82, 87, 87, 86, 85, 84, 84, 84, 84, 84, 83, 82, 82, + (197,148): 81, 81, 81, 80, 78, 77, 74, 67, 61, 56, 52, 50, 50, 50, 51, + (197,163): 51, 51, 51, 51, 52, 53, 53, 55, 60, 67, 77, 87, 100, 105, + (197,177): 107, 106, 103, 94, 86, 78, 70, 63, 56, 52, 48, 46, 44, 43, + (197,191): 43, 43, 45, 48, 54, 59, 64, 69, 74, 80, 85, 89, 92, 96, 99, + (197,206): 102, 104, 106, 107, 110, 111, 113, 114, 115, 116, 117, 117, + (197,218): 117, 117, 117, 117, 116, 116, 116, 116, 116, 116, 116, 116, + (197,230): 117, 118, 118, 119, 120, 123, 124, 127, 131, 135, 139, 144, + (197,242): 152, 159, 162, 159, 145, 120, 94, 78, 77, 83, 115, 153, 182, + (197,255): 182, 177, 170, 153, 118, 46, 17, 4, 1, 1, 1, 1, 1, 1, 1, 1, + (197,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (197,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (198,0): 130, 130, 130, 129, 129, 129, 129, 129, 128, 128, 127, 127, + (198,12): 127, 126, 126, 125, 125, 124, 123, 123, 122, 121, 121, 120, + (198,24): 119, 118, 117, 117, 116, 115, 114, 114, 113, 113, 113, 113, + (198,36): 113, 113, 114, 114, 116, 117, 119, 121, 123, 127, 130, 133, + (198,48): 137, 140, 145, 149, 153, 157, 162, 168, 173, 178, 184, 188, + (198,60): 196, 203, 208, 210, 208, 194, 169, 153, 145, 149, 164, 180, + (198,72): 188, 190, 189, 184, 179, 176, 175, 175, 176, 177, 177, 178, + (198,84): 179, 182, 188, 194, 197, 198, 197, 193, 186, 178, 171, 170, + (198,96): 172, 178, 187, 199, 212, 219, 224, 226, 228, 228, 228, 228, + (198,108): 227, 225, 220, 216, 215, 216, 219, 224, 225, 224, 220, 212, + (198,120): 198, 190, 187, 185, 185, 183, 174, 157, 134, 107, 76, 60, + (198,132): 53, 52, 55, 69, 77, 81, 82, 81, 79, 79, 79, 80, 80, 81, 81, + (198,147): 81, 81, 80, 79, 77, 75, 71, 67, 58, 53, 51, 49, 49, 50, 50, + (198,162): 49, 49, 48, 49, 50, 52, 53, 53, 55, 59, 67, 77, 88, 102, + (198,176): 109, 113, 113, 111, 102, 94, 86, 78, 71, 63, 58, 55, 52, 50, + (198,190): 48, 47, 47, 48, 50, 55, 60, 65, 69, 74, 80, 85, 89, 93, 97, + (198,205): 101, 103, 106, 108, 110, 113, 115, 116, 118, 119, 120, 121, + (198,217): 121, 121, 121, 120, 120, 120, 119, 119, 118, 118, 118, 118, + (198,229): 118, 119, 120, 120, 121, 123, 126, 127, 130, 133, 138, 143, + (198,241): 147, 154, 161, 165, 164, 152, 128, 100, 80, 78, 84, 115, + (198,253): 154, 183, 182, 177, 170, 152, 116, 44, 17, 4, 1, 1, 1, 1, 1, + (198,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (198,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (199,0): 139, 139, 139, 139, 139, 139, 138, 138, 138, 137, 137, 136, + (199,12): 136, 135, 135, 134, 133, 132, 132, 131, 130, 129, 128, 128, + (199,24): 127, 126, 125, 124, 123, 123, 122, 122, 121, 121, 121, 121, + (199,36): 121, 121, 122, 123, 125, 126, 128, 130, 132, 136, 139, 142, + (199,48): 145, 149, 153, 157, 161, 165, 168, 174, 180, 185, 190, 194, + (199,60): 205, 210, 211, 209, 204, 164, 147, 142, 146, 158, 185, 190, + (199,72): 191, 189, 185, 177, 175, 175, 175, 175, 176, 178, 179, 180, + (199,84): 181, 183, 188, 193, 196, 196, 195, 190, 182, 174, 169, 170, + (199,96): 174, 184, 197, 210, 222, 226, 228, 229, 229, 230, 230, 229, + (199,108): 229, 229, 228, 223, 220, 218, 219, 223, 225, 225, 224, 219, + (199,120): 206, 196, 189, 186, 185, 185, 183, 175, 159, 136, 101, 78, + (199,132): 62, 53, 50, 55, 62, 70, 75, 75, 73, 71, 70, 70, 72, 75, 77, + (199,147): 78, 78, 78, 75, 72, 67, 62, 56, 50, 49, 48, 48, 49, 49, 48, + (199,162): 47, 46, 46, 46, 49, 51, 52, 53, 55, 59, 67, 78, 90, 105, + (199,176): 113, 118, 119, 117, 109, 102, 94, 86, 78, 69, 64, 60, 57, + (199,189): 55, 54, 54, 55, 56, 57, 60, 63, 67, 71, 75, 81, 86, 90, 94, + (199,204): 98, 103, 105, 108, 111, 113, 116, 118, 120, 121, 123, 124, + (199,216): 125, 125, 125, 125, 125, 125, 124, 124, 123, 123, 122, 122, + (199,228): 122, 122, 122, 123, 124, 125, 126, 129, 131, 134, 137, 142, + (199,240): 147, 150, 156, 163, 167, 167, 160, 136, 106, 82, 80, 85, + (199,252): 116, 155, 183, 182, 177, 170, 152, 114, 43, 16, 4, 1, 1, 1, + (199,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (199,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (200,0): 152, 152, 152, 152, 151, 151, 151, 151, 150, 150, 149, 149, + (200,12): 148, 147, 147, 145, 145, 144, 143, 142, 141, 140, 139, 138, + (200,24): 137, 136, 135, 134, 133, 133, 132, 132, 131, 131, 131, 131, + (200,36): 132, 132, 133, 134, 136, 138, 140, 142, 144, 147, 150, 153, + (200,48): 156, 159, 163, 167, 170, 173, 177, 184, 188, 193, 198, 206, + (200,60): 212, 212, 208, 194, 162, 138, 138, 148, 165, 186, 191, 190, + (200,72): 187, 182, 176, 174, 174, 175, 176, 179, 182, 183, 183, 183, + (200,84): 183, 184, 188, 192, 194, 195, 193, 185, 176, 170, 169, 171, + (200,96): 182, 197, 211, 223, 229, 229, 229, 230, 230, 230, 230, 230, + (200,108): 230, 230, 229, 228, 226, 223, 221, 223, 225, 226, 226, 224, + (200,120): 216, 206, 196, 189, 186, 186, 186, 184, 179, 168, 141, 116, + (200,132): 92, 72, 57, 49, 50, 53, 57, 64, 68, 67, 65, 62, 60, 57, 58, + (200,147): 59, 60, 60, 59, 58, 55, 52, 49, 47, 47, 47, 47, 47, 46, 44, + (200,162): 43, 43, 43, 45, 48, 51, 53, 53, 55, 61, 70, 81, 93, 109, + (200,176): 117, 123, 125, 124, 117, 109, 101, 93, 85, 76, 70, 66, 63, + (200,189): 62, 61, 62, 63, 64, 66, 69, 71, 73, 76, 79, 84, 89, 94, 98, + (200,204): 102, 106, 109, 112, 114, 117, 120, 122, 123, 125, 126, 127, + (200,216): 128, 128, 129, 129, 130, 130, 130, 130, 129, 129, 129, 129, + (200,228): 129, 129, 130, 130, 131, 132, 134, 137, 139, 142, 144, 149, + (200,240): 154, 156, 160, 165, 170, 170, 166, 146, 116, 86, 82, 88, + (200,252): 118, 155, 183, 182, 177, 169, 150, 111, 40, 15, 3, 1, 1, 1, + (200,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (200,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (201,0): 161, 161, 161, 161, 161, 161, 160, 160, 160, 159, 159, 158, + (201,12): 157, 156, 156, 154, 153, 152, 151, 150, 149, 148, 147, 146, + (201,24): 144, 143, 142, 141, 141, 140, 139, 139, 139, 139, 139, 139, + (201,36): 139, 140, 141, 142, 144, 146, 148, 150, 152, 156, 158, 161, + (201,48): 164, 166, 170, 173, 176, 180, 184, 190, 194, 199, 206, 212, + (201,60): 213, 209, 191, 165, 141, 136, 148, 165, 181, 190, 190, 186, + (201,72): 181, 177, 175, 174, 175, 178, 182, 186, 187, 187, 185, 184, + (201,84): 183, 184, 188, 191, 193, 193, 191, 181, 173, 169, 168, 174, + (201,96): 190, 206, 219, 226, 229, 229, 229, 229, 229, 229, 229, 229, + (201,108): 229, 230, 229, 229, 228, 226, 224, 224, 225, 226, 226, 225, + (201,120): 220, 212, 203, 194, 188, 186, 186, 186, 184, 180, 163, 144, + (201,132): 122, 100, 79, 60, 54, 52, 53, 56, 59, 60, 60, 59, 58, 55, + (201,146): 53, 52, 50, 49, 48, 48, 47, 46, 45, 45, 46, 46, 46, 45, 43, + (201,161): 42, 41, 41, 42, 46, 49, 51, 53, 54, 56, 63, 73, 85, 97, 113, + (201,176): 121, 127, 130, 129, 121, 113, 105, 96, 87, 78, 73, 69, 67, + (201,189): 66, 66, 67, 68, 70, 71, 73, 74, 76, 79, 82, 88, 93, 97, 101, + (201,204): 105, 109, 112, 114, 117, 120, 122, 124, 126, 127, 128, 130, + (201,216): 130, 131, 131, 131, 132, 132, 132, 132, 132, 133, 133, 134, + (201,228): 134, 135, 135, 137, 138, 139, 140, 143, 146, 149, 151, 155, + (201,240): 160, 162, 164, 168, 172, 172, 170, 152, 124, 91, 85, 90, + (201,252): 119, 156, 183, 182, 177, 169, 149, 108, 38, 14, 3, 1, 1, 1, + (201,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (201,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (202,0): 171, 171, 171, 171, 170, 170, 170, 170, 169, 169, 168, 167, + (202,12): 166, 166, 165, 163, 162, 161, 160, 158, 157, 156, 154, 153, + (202,24): 152, 151, 150, 149, 148, 148, 147, 147, 146, 146, 146, 147, + (202,36): 147, 148, 149, 150, 152, 154, 156, 158, 161, 164, 166, 169, + (202,48): 171, 173, 177, 180, 183, 186, 191, 195, 200, 206, 212, 214, + (202,60): 211, 193, 167, 144, 133, 144, 164, 180, 189, 190, 186, 181, + (202,72): 177, 175, 174, 175, 179, 185, 190, 193, 193, 192, 188, 185, + (202,84): 184, 184, 188, 190, 192, 192, 189, 178, 171, 168, 168, 178, + (202,96): 198, 213, 224, 228, 229, 229, 229, 229, 229, 229, 229, 229, + (202,108): 229, 229, 229, 229, 229, 228, 226, 225, 226, 226, 226, 226, + (202,120): 223, 218, 209, 200, 192, 187, 187, 187, 186, 185, 178, 165, + (202,132): 148, 128, 107, 82, 68, 59, 54, 53, 54, 56, 56, 57, 56, 54, + (202,146): 52, 49, 47, 46, 44, 43, 43, 42, 42, 43, 43, 43, 43, 42, 41, + (202,161): 41, 41, 41, 43, 47, 50, 52, 53, 54, 58, 67, 77, 89, 102, + (202,175): 117, 127, 133, 135, 134, 125, 116, 107, 98, 89, 80, 75, 72, + (202,188): 70, 70, 70, 71, 72, 74, 75, 76, 77, 79, 82, 86, 92, 97, 101, + (202,203): 104, 107, 112, 115, 117, 120, 123, 125, 127, 129, 130, 132, + (202,215): 133, 133, 134, 134, 134, 135, 135, 135, 135, 135, 136, 137, + (202,227): 138, 138, 139, 141, 142, 143, 145, 147, 150, 153, 155, 158, + (202,239): 161, 166, 167, 169, 171, 174, 174, 172, 158, 132, 96, 87, + (202,251): 92, 121, 157, 183, 182, 177, 169, 147, 105, 36, 13, 3, 1, 1, + (202,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (202,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (203,0): 180, 180, 180, 180, 180, 180, 180, 179, 179, 178, 177, 177, + (203,12): 176, 175, 174, 172, 171, 169, 168, 167, 165, 163, 162, 161, + (203,24): 159, 158, 157, 156, 155, 155, 154, 154, 154, 154, 154, 154, + (203,36): 155, 155, 157, 158, 160, 162, 164, 166, 168, 171, 174, 176, + (203,48): 178, 180, 184, 186, 189, 193, 196, 201, 207, 212, 215, 214, + (203,60): 201, 169, 145, 133, 136, 161, 180, 189, 190, 188, 180, 177, + (203,72): 175, 174, 175, 179, 186, 193, 199, 200, 200, 197, 191, 185, + (203,84): 183, 184, 187, 190, 191, 191, 186, 175, 169, 167, 168, 184, + (203,96): 205, 219, 227, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (203,108): 229, 229, 229, 229, 229, 229, 228, 227, 227, 227, 227, 227, + (203,120): 225, 221, 215, 207, 198, 189, 188, 187, 187, 187, 186, 180, + (203,132): 169, 155, 136, 109, 91, 75, 64, 57, 54, 53, 54, 54, 54, 54, + (203,146): 52, 50, 48, 46, 44, 42, 41, 40, 40, 40, 41, 41, 41, 41, 40, + (203,161): 41, 41, 42, 45, 49, 52, 53, 54, 55, 61, 72, 83, 94, 106, + (203,175): 123, 133, 139, 141, 138, 129, 118, 108, 98, 89, 80, 76, 74, + (203,188): 73, 73, 73, 74, 75, 76, 77, 78, 80, 83, 86, 91, 96, 100, + (203,202): 104, 107, 110, 115, 118, 121, 123, 126, 129, 131, 132, 134, + (203,214): 135, 136, 137, 137, 138, 138, 138, 138, 138, 138, 139, 140, + (203,226): 140, 141, 142, 144, 145, 147, 149, 150, 152, 156, 159, 161, + (203,238): 164, 167, 171, 173, 174, 175, 176, 176, 175, 163, 140, 102, + (203,250): 91, 95, 123, 158, 183, 182, 177, 168, 146, 101, 33, 12, 3, + (203,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (203,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (204,0): 190, 190, 190, 190, 190, 189, 189, 189, 188, 188, 187, 186, + (204,12): 185, 184, 183, 181, 180, 178, 177, 175, 173, 171, 169, 168, + (204,24): 166, 164, 163, 162, 161, 161, 160, 160, 160, 160, 160, 160, + (204,36): 161, 162, 163, 165, 167, 170, 172, 174, 176, 179, 181, 183, + (204,48): 185, 187, 189, 192, 195, 199, 201, 208, 214, 216, 215, 213, + (204,60): 174, 142, 131, 135, 149, 184, 189, 190, 188, 182, 176, 174, + (204,72): 173, 174, 177, 187, 196, 203, 207, 208, 207, 201, 193, 185, + (204,84): 183, 183, 187, 189, 190, 189, 184, 173, 167, 167, 169, 191, + (204,96): 212, 223, 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (204,108): 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, 227, 227, + (204,120): 226, 224, 219, 213, 204, 192, 189, 187, 187, 187, 188, 187, + (204,132): 183, 175, 163, 140, 121, 102, 85, 70, 59, 53, 51, 51, 52, + (204,145): 52, 52, 51, 50, 48, 45, 43, 42, 41, 40, 40, 40, 40, 40, 40, + (204,160): 41, 41, 43, 45, 48, 51, 53, 54, 55, 56, 66, 78, 89, 100, + (204,174): 112, 130, 141, 146, 146, 143, 131, 119, 108, 97, 88, 80, 77, + (204,187): 76, 75, 75, 76, 76, 77, 77, 78, 80, 83, 87, 91, 96, 101, + (204,201): 104, 107, 111, 114, 118, 121, 124, 127, 129, 132, 134, 135, + (204,213): 137, 138, 139, 140, 140, 141, 141, 142, 142, 143, 143, 144, + (204,225): 145, 145, 146, 147, 148, 150, 151, 153, 155, 157, 160, 163, + (204,237): 166, 169, 172, 176, 178, 178, 178, 178, 178, 177, 168, 146, + (204,249): 108, 94, 99, 126, 160, 184, 182, 177, 167, 144, 97, 30, 11, + (204,262): 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (204,282): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (205,0): 202, 202, 202, 202, 202, 202, 202, 202, 201, 201, 200, 199, + (205,12): 198, 196, 195, 193, 191, 189, 188, 186, 184, 182, 180, 179, + (205,24): 177, 176, 175, 174, 173, 172, 172, 171, 171, 171, 171, 172, + (205,36): 173, 174, 175, 177, 179, 181, 183, 185, 186, 189, 190, 192, + (205,48): 193, 195, 197, 200, 203, 206, 210, 217, 217, 216, 208, 185, + (205,60): 133, 129, 136, 154, 183, 191, 190, 186, 181, 175, 172, 172, + (205,72): 175, 181, 190, 202, 208, 212, 215, 215, 214, 205, 194, 185, + (205,84): 182, 183, 185, 187, 188, 188, 181, 171, 166, 166, 170, 199, + (205,96): 217, 226, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (205,108): 229, 229, 229, 229, 229, 229, 229, 229, 229, 228, 228, 228, + (205,120): 227, 225, 223, 219, 213, 201, 193, 189, 188, 188, 188, 188, + (205,132): 188, 187, 183, 172, 158, 143, 126, 108, 87, 75, 64, 57, 53, + (205,145): 53, 52, 52, 51, 51, 50, 48, 47, 46, 44, 43, 43, 43, 43, 43, + (205,160): 45, 46, 48, 50, 51, 53, 54, 55, 57, 61, 77, 89, 99, 109, + (205,174): 122, 143, 153, 156, 154, 147, 131, 117, 104, 93, 85, 79, 77, + (205,187): 76, 76, 77, 77, 78, 78, 80, 82, 87, 91, 95, 98, 102, 106, + (205,201): 109, 112, 116, 119, 124, 127, 129, 132, 134, 137, 138, 140, + (205,213): 141, 142, 143, 143, 144, 145, 146, 147, 148, 149, 150, 151, + (205,225): 153, 154, 155, 156, 157, 159, 160, 161, 163, 164, 167, 169, + (205,237): 171, 173, 176, 181, 182, 182, 182, 181, 180, 179, 173, 154, + (205,249): 117, 100, 104, 130, 162, 184, 181, 177, 166, 140, 91, 26, 9, + (205,262): 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (205,282): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (206,0): 212, 212, 212, 212, 212, 212, 212, 212, 211, 211, 210, 209, + (206,12): 207, 206, 205, 202, 200, 198, 196, 194, 191, 188, 186, 184, + (206,24): 182, 180, 179, 178, 177, 177, 177, 176, 176, 176, 177, 177, + (206,36): 178, 179, 181, 182, 185, 187, 189, 190, 192, 194, 196, 198, + (206,48): 199, 201, 204, 207, 209, 212, 215, 218, 218, 209, 189, 149, + (206,60): 128, 134, 153, 175, 189, 190, 187, 181, 176, 171, 171, 175, + (206,72): 182, 190, 199, 208, 212, 215, 216, 217, 215, 206, 195, 186, + (206,84): 182, 182, 184, 186, 187, 186, 180, 169, 165, 166, 171, 203, + (206,96): 220, 227, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (206,108): 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (206,120): 227, 226, 224, 221, 217, 207, 199, 193, 189, 188, 188, 188, + (206,132): 189, 189, 188, 184, 176, 166, 154, 139, 118, 104, 90, 78, + (206,144): 68, 59, 56, 54, 53, 52, 51, 50, 50, 49, 48, 47, 47, 47, 47, + (206,159): 48, 48, 49, 50, 52, 53, 54, 54, 56, 62, 71, 87, 97, 106, + (206,173): 118, 133, 156, 162, 163, 158, 147, 127, 112, 100, 90, 83, + (206,185): 78, 77, 77, 77, 78, 79, 80, 83, 85, 88, 93, 96, 99, 102, + (206,199): 106, 110, 113, 117, 120, 124, 128, 131, 134, 136, 138, 140, + (206,211): 142, 143, 144, 145, 146, 147, 148, 149, 151, 152, 154, 155, + (206,223): 156, 158, 159, 160, 162, 163, 164, 165, 167, 168, 169, 170, + (206,235): 172, 174, 175, 176, 178, 182, 184, 184, 184, 183, 182, 181, + (206,247): 175, 159, 123, 105, 109, 134, 164, 184, 181, 176, 164, 137, + (206,259): 86, 24, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (206,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (206,298): 1, 1, + (207,0): 221, 221, 221, 222, 222, 222, 222, 222, 221, 221, 220, 218, + (207,12): 217, 215, 214, 211, 209, 207, 205, 203, 200, 197, 195, 192, + (207,24): 190, 187, 186, 184, 183, 183, 182, 182, 182, 182, 182, 183, + (207,36): 185, 186, 188, 190, 193, 195, 197, 199, 200, 202, 204, 205, + (207,48): 207, 208, 211, 213, 215, 216, 218, 219, 214, 192, 162, 132, + (207,60): 130, 150, 171, 187, 191, 188, 182, 176, 171, 169, 173, 181, + (207,72): 190, 199, 206, 212, 215, 216, 217, 217, 216, 207, 196, 186, + (207,84): 182, 182, 184, 185, 186, 185, 179, 168, 164, 165, 172, 206, + (207,96): 221, 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (207,108): 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (207,120): 228, 226, 224, 223, 220, 213, 205, 198, 192, 189, 188, 188, + (207,132): 189, 190, 190, 190, 187, 182, 174, 164, 147, 133, 119, 105, + (207,144): 92, 77, 70, 64, 59, 56, 53, 52, 51, 51, 50, 50, 50, 50, 50, + (207,159): 50, 51, 51, 52, 53, 54, 55, 57, 62, 71, 83, 97, 105, 116, + (207,173): 130, 148, 168, 171, 168, 159, 144, 121, 106, 95, 86, 81, 78, + (207,186): 78, 78, 79, 81, 83, 86, 88, 91, 94, 98, 101, 104, 107, 110, + (207,200): 115, 119, 122, 126, 129, 133, 135, 138, 140, 142, 144, 145, + (207,212): 146, 148, 149, 151, 152, 153, 155, 157, 159, 160, 162, 163, + (207,224): 165, 166, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + (207,236): 178, 179, 180, 181, 184, 185, 186, 186, 185, 183, 182, 178, + (207,248): 162, 129, 110, 114, 137, 166, 184, 181, 176, 163, 133, 81, + (207,260): 21, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (207,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (208,0): 231, 231, 231, 231, 232, 232, 232, 232, 231, 231, 230, 229, + (208,12): 227, 225, 223, 220, 218, 215, 213, 210, 207, 205, 203, 200, + (208,24): 198, 195, 193, 192, 190, 189, 189, 188, 188, 188, 189, 191, + (208,36): 192, 194, 197, 199, 202, 204, 205, 207, 208, 210, 211, 212, + (208,48): 213, 214, 216, 217, 218, 219, 219, 217, 201, 169, 138, 127, + (208,60): 143, 170, 185, 190, 189, 184, 176, 171, 168, 170, 179, 189, + (208,72): 198, 205, 210, 214, 216, 217, 218, 218, 216, 208, 197, 187, + (208,84): 182, 181, 183, 184, 184, 184, 178, 168, 163, 165, 172, 208, + (208,96): 222, 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (208,108): 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 229, + (208,120): 228, 226, 225, 223, 222, 217, 211, 204, 197, 191, 188, 188, + (208,132): 189, 189, 190, 192, 192, 190, 188, 183, 171, 160, 147, 134, + (208,144): 120, 103, 91, 81, 73, 66, 60, 57, 55, 53, 52, 52, 52, 51, + (208,158): 52, 52, 52, 53, 54, 54, 55, 58, 64, 73, 83, 94, 105, 114, + (208,172): 128, 145, 165, 179, 178, 170, 157, 138, 114, 100, 89, 83, + (208,184): 79, 78, 79, 81, 83, 85, 89, 92, 95, 97, 100, 103, 106, 109, + (208,198): 112, 116, 121, 124, 128, 131, 134, 137, 140, 142, 144, 145, + (208,210): 148, 149, 151, 152, 154, 156, 158, 160, 162, 164, 166, 168, + (208,222): 169, 171, 172, 174, 175, 175, 176, 177, 178, 179, 179, 180, + (208,234): 181, 182, 182, 183, 183, 183, 185, 186, 187, 187, 186, 185, + (208,246): 184, 180, 166, 135, 115, 119, 141, 168, 183, 181, 176, 161, + (208,258): 129, 75, 18, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (208,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (208,297): 1, 1, 1, + (209,0): 240, 241, 241, 241, 242, 242, 241, 241, 241, 241, 241, 240, + (209,12): 239, 237, 235, 231, 227, 223, 219, 215, 212, 209, 207, 206, + (209,24): 204, 202, 200, 199, 198, 197, 196, 196, 196, 197, 197, 199, + (209,36): 201, 203, 205, 207, 209, 210, 211, 212, 213, 214, 214, 215, + (209,48): 216, 217, 218, 219, 219, 220, 219, 213, 173, 142, 127, 130, + (209,60): 170, 186, 191, 189, 186, 179, 170, 167, 168, 173, 189, 196, + (209,72): 203, 208, 212, 216, 217, 218, 218, 218, 216, 209, 198, 187, + (209,84): 181, 181, 182, 183, 183, 183, 178, 167, 163, 164, 171, 208, + (209,96): 222, 228, 229, 229, 229, 229, 229, 229, 229, 229, 229, 229, + (209,108): 229, 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, + (209,120): 229, 227, 225, 224, 223, 221, 216, 209, 202, 195, 190, 188, + (209,132): 188, 188, 189, 191, 193, 194, 194, 193, 188, 181, 171, 161, + (209,144): 148, 131, 118, 106, 95, 85, 74, 68, 63, 59, 56, 54, 54, 53, + (209,158): 54, 54, 55, 55, 55, 56, 57, 66, 77, 87, 97, 104, 114, 127, + (209,172): 144, 163, 182, 187, 182, 169, 151, 129, 105, 93, 85, 80, 79, + (209,185): 80, 82, 85, 88, 91, 95, 98, 100, 102, 105, 108, 111, 115, + (209,198): 118, 122, 127, 130, 134, 137, 139, 142, 144, 146, 148, 150, + (209,210): 152, 154, 155, 157, 160, 163, 165, 168, 170, 172, 174, 176, + (209,222): 177, 178, 179, 180, 181, 182, 182, 183, 183, 184, 184, 184, + (209,234): 185, 185, 185, 186, 186, 186, 187, 187, 188, 188, 187, 186, + (209,246): 185, 181, 169, 141, 121, 124, 145, 170, 183, 181, 176, 159, + (209,258): 125, 70, 16, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (209,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (209,297): 1, 1, 1, + (210,0): 252, 251, 249, 246, 244, 241, 240, 239, 239, 240, 241, 241, + (210,12): 242, 243, 243, 242, 241, 240, 237, 233, 226, 221, 216, 212, + (210,24): 210, 207, 206, 205, 204, 204, 203, 203, 203, 204, 204, 206, + (210,36): 208, 210, 212, 214, 215, 215, 216, 216, 217, 217, 218, 219, + (210,48): 220, 221, 221, 221, 221, 219, 214, 162, 133, 125, 136, 166, + (210,60): 192, 191, 189, 185, 181, 166, 164, 166, 172, 185, 195, 201, + (210,72): 207, 212, 216, 218, 219, 219, 219, 219, 217, 209, 199, 189, + (210,84): 182, 181, 181, 182, 182, 182, 178, 168, 163, 163, 168, 206, + (210,96): 222, 228, 229, 229, 228, 229, 229, 229, 229, 229, 229, 229, + (210,108): 229, 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, + (210,120): 229, 227, 226, 224, 223, 222, 220, 216, 210, 202, 194, 191, + (210,132): 189, 188, 188, 189, 191, 193, 195, 197, 197, 195, 191, 185, + (210,144): 177, 163, 152, 140, 128, 117, 104, 95, 87, 81, 75, 69, 66, + (210,157): 64, 62, 61, 61, 62, 65, 70, 78, 90, 97, 103, 110, 118, 135, + (210,171): 153, 172, 187, 196, 192, 177, 157, 134, 112, 91, 84, 82, 81, + (210,184): 82, 87, 91, 95, 98, 100, 103, 105, 107, 110, 113, 117, 120, + (210,197): 124, 128, 131, 135, 138, 141, 143, 146, 148, 150, 152, 154, + (210,209): 157, 160, 162, 165, 168, 171, 174, 176, 178, 180, 182, 183, + (210,221): 185, 186, 186, 187, 187, 187, 187, 187, 187, 187, 187, 187, + (210,233): 187, 187, 187, 187, 187, 187, 188, 188, 188, 188, 189, 188, + (210,245): 187, 186, 183, 172, 147, 127, 131, 150, 172, 183, 180, 175, + (210,257): 155, 118, 62, 13, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (210,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (210,295): 1, 1, 1, 1, 1, + (211,0): 180, 181, 182, 185, 190, 194, 199, 200, 200, 198, 196, 198, + (211,12): 201, 205, 211, 220, 227, 233, 236, 235, 233, 230, 226, 221, + (211,24): 217, 213, 210, 209, 208, 207, 207, 207, 207, 208, 209, 213, + (211,36): 215, 216, 216, 216, 215, 215, 215, 215, 215, 217, 218, 219, + (211,48): 219, 216, 203, 192, 178, 161, 143, 124, 124, 141, 165, 186, + (211,60): 192, 189, 186, 181, 173, 162, 162, 168, 177, 188, 198, 205, + (211,72): 211, 215, 218, 219, 219, 219, 219, 219, 217, 211, 201, 191, + (211,84): 184, 180, 181, 181, 181, 181, 178, 169, 163, 161, 165, 200, + (211,96): 220, 227, 228, 228, 228, 228, 229, 229, 229, 229, 229, 229, + (211,108): 229, 229, 229, 229, 229, 230, 230, 230, 230, 230, 230, 230, + (211,120): 229, 227, 226, 224, 223, 222, 222, 219, 214, 208, 199, 194, + (211,132): 191, 189, 188, 188, 190, 191, 194, 196, 198, 199, 198, 195, + (211,144): 190, 180, 170, 160, 149, 139, 125, 115, 107, 99, 92, 85, 81, + (211,157): 78, 76, 76, 78, 81, 85, 90, 96, 102, 107, 114, 125, 138, + (211,170): 158, 175, 189, 198, 200, 187, 165, 140, 117, 99, 86, 84, 83, + (211,183): 85, 89, 94, 98, 100, 103, 105, 108, 110, 113, 116, 119, 124, + (211,196): 128, 131, 135, 138, 142, 144, 147, 149, 151, 154, 157, 159, + (211,208): 162, 164, 168, 171, 174, 177, 179, 182, 184, 186, 187, 188, + (211,220): 188, 189, 189, 189, 189, 189, 189, 189, 189, 189, 188, 188, + (211,232): 188, 188, 188, 188, 188, 188, 188, 188, 188, 189, 189, 189, + (211,244): 189, 188, 187, 184, 174, 150, 132, 136, 154, 175, 183, 180, + (211,256): 174, 151, 112, 56, 10, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (211,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (211,293): 1, 1, 1, 1, 1, 1, 1, + (212,0): 148, 162, 177, 189, 197, 202, 206, 207, 207, 205, 204, 204, + (212,12): 204, 204, 204, 208, 214, 220, 226, 232, 235, 234, 232, 228, + (212,24): 224, 219, 216, 213, 212, 211, 210, 211, 212, 214, 216, 219, + (212,36): 218, 217, 212, 202, 197, 198, 201, 203, 203, 198, 187, 175, + (212,48): 160, 145, 132, 128, 125, 121, 115, 121, 140, 164, 184, 193, + (212,60): 190, 186, 182, 176, 164, 159, 162, 170, 180, 190, 202, 209, + (212,72): 214, 217, 219, 219, 219, 219, 219, 219, 218, 212, 204, 194, + (212,84): 186, 181, 180, 180, 181, 180, 178, 170, 163, 160, 162, 193, + (212,96): 216, 226, 228, 228, 228, 228, 228, 229, 229, 229, 229, 230, + (212,108): 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, + (212,120): 229, 227, 226, 224, 223, 223, 222, 221, 218, 212, 203, 197, + (212,132): 193, 190, 189, 188, 189, 190, 192, 194, 198, 200, 201, 201, + (212,144): 198, 192, 185, 176, 167, 157, 144, 134, 126, 118, 111, 103, + (212,156): 99, 97, 95, 95, 96, 99, 102, 105, 108, 114, 122, 133, 146, + (212,169): 160, 179, 192, 201, 203, 198, 173, 146, 122, 103, 90, 85, + (212,181): 86, 88, 92, 97, 101, 104, 106, 108, 110, 114, 117, 120, 124, + (212,194): 127, 132, 136, 139, 142, 145, 148, 151, 153, 155, 158, 161, + (212,206): 164, 167, 170, 173, 177, 180, 183, 185, 187, 189, 189, 190, + (212,218): 191, 191, 192, 192, 192, 192, 192, 191, 191, 191, 191, 191, + (212,230): 190, 190, 190, 190, 190, 189, 189, 189, 189, 189, 189, 189, + (212,242): 189, 189, 189, 188, 188, 185, 176, 153, 137, 140, 158, 177, + (212,254): 183, 180, 173, 147, 105, 49, 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, + (212,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (212,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (213,0): 152, 178, 200, 216, 224, 226, 226, 226, 226, 226, 226, 225, + (213,12): 222, 217, 211, 207, 206, 209, 214, 223, 232, 234, 234, 232, + (213,24): 230, 225, 222, 219, 216, 215, 215, 216, 218, 220, 222, 217, + (213,36): 205, 194, 182, 165, 154, 155, 156, 157, 153, 140, 123, 105, + (213,48): 86, 71, 71, 80, 94, 108, 119, 141, 168, 185, 194, 193, 186, + (213,61): 184, 178, 169, 157, 157, 163, 172, 183, 193, 206, 213, 216, + (213,73): 218, 219, 219, 219, 219, 219, 219, 219, 214, 207, 197, 189, + (213,85): 182, 180, 180, 180, 180, 178, 171, 164, 160, 160, 184, 211, + (213,97): 224, 228, 228, 228, 228, 228, 228, 228, 229, 229, 230, 230, + (213,109): 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 230, 228, + (213,121): 227, 225, 224, 223, 223, 223, 222, 220, 215, 207, 200, 195, + (213,133): 192, 190, 189, 188, 189, 190, 193, 197, 200, 203, 204, 204, + (213,145): 200, 195, 188, 181, 172, 160, 151, 143, 136, 129, 122, 118, + (213,157): 116, 114, 113, 113, 114, 115, 118, 121, 131, 143, 156, 170, + (213,169): 182, 197, 204, 206, 201, 188, 151, 124, 105, 92, 87, 88, 91, + (213,182): 95, 100, 104, 108, 110, 112, 114, 117, 121, 125, 128, 132, + (213,194): 136, 141, 144, 147, 149, 152, 155, 157, 160, 163, 166, 170, + (213,206): 173, 177, 180, 183, 186, 188, 190, 192, 193, 193, 194, 194, + (213,218): 194, 194, 195, 195, 195, 195, 195, 194, 194, 194, 194, 194, + (213,230): 193, 193, 192, 192, 192, 192, 191, 191, 191, 191, 191, 190, + (213,242): 190, 190, 190, 189, 188, 186, 177, 156, 141, 145, 162, 179, + (213,254): 183, 180, 171, 143, 98, 43, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (213,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (213,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (214,0): 186, 210, 221, 226, 227, 227, 226, 226, 225, 225, 225, 225, + (214,12): 225, 225, 224, 217, 210, 207, 207, 210, 225, 231, 234, 234, + (214,24): 234, 230, 228, 225, 222, 220, 221, 223, 224, 224, 222, 202, + (214,36): 160, 129, 109, 98, 83, 72, 62, 50, 36, 23, 23, 28, 39, 54, + (214,50): 80, 99, 114, 128, 143, 177, 190, 195, 193, 189, 184, 181, + (214,62): 172, 161, 153, 154, 162, 173, 184, 196, 210, 215, 217, 218, + (214,74): 218, 219, 219, 219, 219, 219, 219, 217, 210, 202, 192, 184, + (214,86): 181, 180, 179, 179, 178, 172, 165, 160, 158, 174, 205, 222, + (214,98): 228, 228, 228, 228, 227, 227, 228, 228, 229, 229, 230, 230, + (214,110): 230, 230, 230, 230, 230, 230, 230, 230, 230, 229, 228, 226, + (214,122): 225, 224, 223, 223, 223, 223, 221, 218, 209, 203, 198, 194, + (214,134): 191, 189, 189, 189, 190, 192, 197, 200, 203, 205, 206, 205, + (214,146): 201, 196, 190, 184, 174, 166, 159, 152, 145, 139, 134, 131, + (214,158): 127, 125, 123, 123, 126, 132, 141, 159, 171, 181, 190, 199, + (214,170): 208, 210, 205, 192, 165, 123, 103, 92, 88, 88, 93, 98, 103, + (214,183): 107, 109, 112, 114, 117, 120, 124, 129, 133, 137, 141, 145, + (214,195): 149, 151, 154, 156, 159, 163, 166, 169, 173, 176, 181, 184, + (214,207): 187, 190, 192, 194, 195, 195, 196, 196, 197, 198, 198, 199, + (214,219): 199, 199, 199, 199, 199, 199, 199, 199, 199, 198, 198, 197, + (214,231): 197, 196, 196, 196, 195, 195, 194, 193, 193, 192, 192, 191, + (214,243): 191, 190, 189, 189, 187, 178, 159, 145, 150, 165, 180, 183, + (214,255): 179, 170, 138, 91, 37, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (214,272): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (214,292): 1, 1, 1, 1, 1, 1, 1, 1, + (215,0): 197, 216, 224, 226, 226, 224, 223, 223, 223, 224, 224, 224, + (215,12): 224, 225, 225, 224, 218, 212, 207, 207, 211, 220, 228, 233, + (215,24): 234, 233, 232, 229, 227, 227, 230, 230, 218, 184, 115, 59, + (215,36): 41, 27, 18, 11, 8, 5, 4, 6, 10, 28, 49, 73, 97, 118, 135, + (215,51): 141, 152, 166, 185, 196, 196, 193, 189, 184, 182, 174, 162, + (215,63): 152, 150, 152, 160, 172, 186, 201, 214, 216, 217, 217, 217, + (215,75): 218, 219, 219, 219, 220, 220, 219, 215, 208, 199, 188, 183, + (215,87): 180, 179, 179, 178, 174, 167, 161, 158, 162, 190, 212, 226, + (215,99): 228, 228, 227, 227, 227, 227, 227, 228, 228, 229, 229, 229, + (215,111): 229, 230, 230, 230, 230, 229, 229, 229, 228, 226, 225, 224, + (215,123): 224, 224, 223, 223, 223, 222, 218, 210, 203, 198, 194, 191, + (215,135): 189, 189, 189, 190, 193, 198, 201, 204, 207, 209, 209, 207, + (215,147): 204, 199, 192, 183, 176, 169, 163, 157, 149, 145, 143, 141, + (215,159): 141, 146, 153, 162, 171, 180, 188, 194, 200, 206, 211, 211, + (215,171): 204, 182, 151, 117, 95, 92, 92, 94, 99, 107, 111, 114, 116, + (215,184): 118, 122, 125, 129, 133, 138, 143, 147, 151, 154, 157, 160, + (215,196): 163, 166, 169, 173, 178, 181, 185, 188, 191, 194, 196, 197, + (215,208): 198, 199, 200, 200, 201, 202, 203, 204, 204, 204, 205, 205, + (215,220): 205, 206, 206, 206, 206, 206, 206, 205, 205, 204, 204, 203, + (215,232): 202, 202, 201, 200, 200, 199, 198, 197, 196, 195, 194, 193, + (215,244): 192, 190, 189, 187, 179, 161, 151, 156, 170, 182, 183, 179, + (215,256): 166, 130, 80, 29, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (215,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (215,294): 1, 1, 1, 1, 1, 1, + (216,0): 205, 219, 225, 226, 225, 223, 223, 223, 223, 224, 224, 224, + (216,12): 224, 224, 225, 225, 222, 216, 210, 207, 211, 219, 227, 232, + (216,24): 234, 234, 233, 232, 231, 231, 226, 189, 138, 87, 47, 24, 17, + (216,37): 12, 8, 6, 4, 5, 13, 27, 50, 83, 103, 120, 133, 141, 152, 162, + (216,52): 175, 186, 194, 197, 194, 189, 185, 183, 181, 167, 156, 149, + (216,64): 148, 150, 158, 172, 188, 205, 216, 216, 216, 216, 216, 217, + (216,76): 219, 219, 219, 220, 220, 220, 218, 214, 206, 193, 186, 182, + (216,88): 179, 179, 177, 175, 169, 163, 158, 159, 177, 200, 220, 227, + (216,100): 228, 227, 227, 227, 227, 227, 227, 227, 227, 228, 228, 228, + (216,112): 228, 228, 228, 228, 228, 227, 227, 226, 225, 225, 224, 224, + (216,124): 224, 224, 224, 223, 220, 216, 207, 201, 196, 193, 190, 189, + (216,136): 190, 191, 194, 197, 202, 206, 209, 211, 212, 212, 210, 207, + (216,148): 204, 198, 190, 184, 178, 173, 168, 164, 163, 163, 164, 167, + (216,160): 172, 177, 183, 188, 192, 199, 204, 209, 211, 212, 199, 171, + (216,172): 142, 116, 101, 94, 95, 98, 103, 108, 114, 116, 119, 122, + (216,184): 125, 131, 135, 140, 144, 148, 154, 157, 161, 164, 168, 173, + (216,196): 176, 180, 184, 187, 191, 193, 196, 197, 199, 200, 201, 202, + (216,208): 203, 203, 204, 205, 205, 205, 206, 206, 206, 207, 207, 207, + (216,220): 207, 207, 208, 208, 208, 208, 208, 208, 207, 207, 207, 207, + (216,232): 206, 205, 205, 204, 203, 202, 201, 200, 199, 197, 196, 195, + (216,244): 193, 191, 190, 187, 180, 162, 154, 160, 172, 183, 183, 178, + (216,256): 162, 123, 72, 24, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (216,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (216,294): 1, 1, 1, 1, 1, 1, + (217,0): 207, 220, 225, 226, 225, 222, 222, 223, 224, 225, 224, 224, + (217,12): 224, 224, 225, 225, 223, 217, 211, 209, 211, 219, 227, 233, + (217,24): 234, 234, 234, 233, 230, 222, 171, 117, 70, 34, 16, 8, 6, 5, + (217,38): 4, 3, 6, 19, 39, 65, 92, 120, 134, 145, 153, 159, 171, 181, + (217,52): 190, 196, 197, 195, 190, 186, 184, 183, 176, 160, 151, 147, + (217,64): 147, 149, 157, 172, 191, 209, 217, 216, 215, 213, 213, 216, + (217,76): 218, 219, 220, 220, 220, 221, 220, 217, 212, 200, 191, 185, + (217,88): 180, 179, 177, 176, 172, 166, 159, 157, 166, 187, 210, 225, + (217,100): 228, 227, 227, 227, 227, 226, 226, 226, 226, 227, 227, 227, + (217,112): 227, 227, 227, 227, 226, 226, 226, 225, 225, 224, 224, 224, + (217,124): 224, 224, 223, 221, 217, 211, 203, 197, 194, 191, 191, 192, + (217,136): 194, 197, 200, 204, 208, 210, 212, 214, 214, 213, 211, 209, + (217,148): 206, 202, 197, 192, 188, 184, 181, 180, 179, 180, 182, 184, + (217,160): 189, 192, 195, 199, 203, 207, 210, 211, 206, 194, 161, 134, + (217,172): 114, 101, 97, 99, 104, 108, 113, 117, 121, 124, 128, 132, + (217,184): 136, 143, 148, 152, 156, 160, 165, 170, 174, 178, 182, 186, + (217,196): 190, 192, 195, 197, 199, 200, 201, 202, 203, 204, 204, 204, + (217,208): 205, 205, 206, 206, 206, 207, 207, 207, 207, 207, 207, 208, + (217,220): 208, 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, + (217,232): 209, 208, 208, 207, 206, 205, 204, 204, 202, 200, 199, 197, + (217,244): 194, 191, 190, 188, 180, 164, 158, 164, 175, 183, 183, 177, + (217,256): 158, 115, 64, 19, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (217,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (217,294): 1, 1, 1, 1, 1, 1, + (218,0): 206, 220, 225, 225, 225, 222, 221, 222, 224, 225, 224, 224, + (218,12): 224, 224, 225, 224, 222, 217, 212, 210, 214, 222, 229, 233, + (218,24): 235, 234, 233, 227, 210, 180, 95, 48, 22, 11, 6, 4, 4, 4, 4, + (218,39): 5, 18, 45, 75, 104, 126, 143, 151, 159, 166, 175, 187, 194, + (218,52): 198, 198, 196, 193, 187, 185, 184, 183, 170, 155, 148, 147, + (218,64): 147, 148, 156, 173, 194, 213, 216, 215, 212, 211, 211, 215, + (218,76): 217, 219, 219, 220, 220, 221, 221, 220, 217, 207, 197, 189, + (218,88): 183, 179, 177, 176, 173, 169, 161, 157, 159, 173, 195, 218, + (218,100): 226, 227, 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, + (218,112): 226, 226, 226, 225, 225, 225, 225, 225, 224, 224, 224, 224, + (218,124): 224, 223, 221, 217, 211, 205, 197, 193, 191, 190, 191, 195, + (218,136): 199, 202, 206, 209, 212, 213, 214, 215, 214, 213, 211, 209, + (218,148): 206, 204, 201, 198, 196, 194, 193, 192, 192, 193, 194, 196, + (218,160): 199, 201, 203, 206, 209, 211, 208, 199, 183, 159, 121, 106, + (218,172): 100, 100, 102, 108, 114, 118, 122, 125, 130, 134, 139, 145, + (218,184): 150, 157, 161, 166, 170, 174, 179, 183, 187, 191, 194, 198, + (218,196): 200, 201, 202, 203, 203, 203, 203, 204, 204, 204, 204, 204, + (218,208): 204, 204, 204, 204, 205, 205, 205, 206, 206, 207, 207, 207, + (218,220): 208, 208, 208, 208, 209, 209, 209, 209, 210, 210, 210, 210, + (218,232): 210, 210, 210, 209, 209, 208, 207, 206, 205, 203, 201, 199, + (218,244): 196, 192, 191, 188, 180, 165, 161, 168, 177, 184, 182, 176, + (218,256): 152, 106, 55, 15, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (218,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (218,294): 1, 1, 1, 1, 1, 1, + (219,0): 205, 219, 225, 225, 225, 222, 221, 221, 222, 224, 225, 225, + (219,12): 225, 225, 225, 222, 218, 215, 213, 212, 219, 228, 233, 235, + (219,24): 235, 234, 230, 207, 161, 88, 28, 15, 7, 4, 3, 3, 3, 3, 5, 10, + (219,40): 44, 81, 110, 130, 144, 157, 166, 174, 183, 191, 198, 199, + (219,52): 199, 197, 194, 188, 185, 184, 184, 183, 162, 151, 147, 147, + (219,64): 147, 148, 156, 174, 197, 214, 216, 213, 210, 207, 208, 213, + (219,76): 216, 217, 219, 220, 220, 221, 221, 221, 221, 215, 205, 195, + (219,88): 187, 180, 177, 176, 174, 171, 165, 157, 156, 161, 176, 203, + (219,100): 224, 226, 227, 227, 227, 226, 226, 226, 226, 226, 226, 225, + (219,112): 225, 225, 225, 225, 225, 225, 225, 225, 224, 224, 224, 224, + (219,124): 224, 222, 216, 209, 202, 196, 190, 188, 188, 190, 192, 197, + (219,136): 200, 204, 207, 210, 212, 213, 214, 214, 213, 212, 210, 208, + (219,148): 205, 203, 201, 200, 199, 198, 197, 197, 198, 199, 201, 203, + (219,160): 206, 208, 210, 211, 212, 208, 193, 166, 136, 111, 102, 102, + (219,172): 104, 108, 114, 119, 122, 125, 128, 133, 140, 146, 152, 158, + (219,184): 163, 170, 176, 181, 187, 191, 196, 199, 200, 201, 202, 202, + (219,196): 203, 203, 204, 204, 204, 203, 203, 202, 202, 201, 201, 201, + (219,208): 200, 200, 199, 199, 199, 200, 201, 202, 203, 204, 205, 206, + (219,220): 207, 207, 208, 208, 208, 209, 209, 209, 210, 210, 210, 210, + (219,232): 211, 211, 211, 211, 211, 210, 209, 209, 207, 206, 204, 201, + (219,244): 198, 193, 192, 188, 180, 166, 164, 172, 180, 184, 182, 175, + (219,256): 145, 97, 47, 11, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (219,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (219,294): 1, 1, 1, 1, 1, 1, + (220,0): 198, 216, 224, 225, 226, 222, 221, 221, 221, 221, 221, 221, + (220,12): 221, 220, 219, 217, 217, 217, 220, 225, 232, 234, 234, 234, + (220,24): 232, 216, 166, 106, 52, 21, 8, 4, 3, 2, 2, 3, 3, 5, 15, 39, + (220,40): 91, 117, 137, 152, 166, 180, 187, 193, 197, 199, 200, 199, + (220,52): 197, 193, 191, 186, 185, 185, 184, 180, 155, 149, 147, 147, + (220,64): 147, 148, 155, 176, 200, 216, 216, 210, 205, 202, 203, 208, + (220,76): 211, 214, 216, 218, 219, 220, 221, 221, 222, 220, 215, 207, + (220,88): 197, 187, 179, 177, 175, 173, 171, 161, 157, 156, 160, 171, + (220,100): 205, 219, 225, 227, 227, 226, 226, 226, 226, 226, 226, 225, + (220,112): 225, 225, 225, 225, 225, 225, 224, 224, 224, 223, 222, 220, + (220,124): 216, 207, 200, 194, 190, 187, 186, 186, 187, 189, 191, 195, + (220,136): 197, 199, 201, 202, 204, 204, 204, 204, 204, 203, 203, 202, + (220,148): 202, 202, 201, 201, 201, 201, 202, 204, 206, 207, 208, 208, + (220,160): 209, 209, 207, 201, 186, 149, 125, 111, 105, 104, 106, 111, + (220,172): 116, 121, 125, 132, 137, 144, 150, 157, 165, 171, 177, 182, + (220,184): 188, 194, 197, 199, 200, 201, 201, 202, 202, 202, 201, 199, + (220,196): 198, 196, 194, 192, 188, 184, 181, 177, 174, 171, 170, 169, + (220,208): 168, 168, 168, 169, 171, 173, 176, 180, 184, 187, 191, 195, + (220,220): 200, 202, 205, 206, 208, 209, 209, 209, 210, 210, 210, 210, + (220,232): 211, 212, 212, 212, 212, 212, 211, 211, 210, 208, 207, 204, + (220,244): 200, 194, 192, 188, 180, 168, 167, 176, 182, 184, 182, 171, + (220,256): 134, 84, 36, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (220,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (220,295): 1, 1, 1, 1, 1, + (221,0): 189, 211, 221, 224, 226, 224, 223, 222, 221, 221, 221, 221, + (221,12): 221, 221, 221, 221, 223, 226, 228, 230, 233, 232, 227, 215, + (221,24): 191, 127, 80, 45, 21, 9, 4, 2, 2, 2, 2, 2, 4, 14, 36, 73, + (221,40): 117, 139, 157, 171, 182, 191, 194, 197, 199, 200, 199, 197, + (221,52): 195, 193, 190, 186, 186, 186, 183, 176, 152, 150, 149, 149, + (221,64): 148, 149, 156, 178, 203, 216, 215, 208, 202, 198, 198, 202, + (221,76): 206, 209, 211, 214, 216, 218, 220, 220, 221, 221, 219, 214, + (221,88): 207, 196, 184, 179, 176, 174, 172, 166, 160, 157, 157, 160, + (221,100): 178, 201, 215, 223, 226, 226, 226, 225, 225, 225, 225, 225, + (221,112): 225, 225, 224, 224, 224, 223, 223, 222, 219, 216, 212, 208, + (221,124): 202, 196, 192, 189, 187, 186, 186, 186, 188, 189, 191, 193, + (221,136): 195, 196, 198, 199, 200, 201, 201, 202, 202, 202, 202, 203, + (221,148): 203, 203, 204, 205, 206, 206, 207, 207, 207, 207, 207, 206, + (221,160): 200, 187, 171, 153, 136, 120, 114, 111, 112, 116, 121, 126, + (221,172): 130, 134, 139, 146, 152, 159, 166, 174, 183, 188, 191, 194, + (221,184): 196, 199, 200, 200, 199, 198, 196, 192, 188, 184, 179, 172, + (221,196): 167, 162, 158, 154, 151, 149, 147, 145, 143, 141, 140, 139, + (221,208): 139, 139, 141, 142, 144, 146, 149, 154, 158, 163, 169, 175, + (221,220): 184, 189, 195, 199, 203, 206, 208, 209, 210, 210, 210, 210, + (221,232): 211, 211, 212, 213, 213, 212, 212, 212, 211, 210, 208, 206, + (221,244): 201, 195, 193, 187, 179, 169, 170, 179, 183, 184, 181, 168, + (221,256): 124, 73, 29, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (221,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (221,295): 1, 1, 1, 1, 1, + (222,0): 175, 202, 215, 221, 225, 224, 224, 223, 223, 222, 222, 222, + (222,12): 223, 223, 224, 225, 226, 228, 229, 228, 222, 205, 181, 149, + (222,24): 111, 56, 30, 14, 6, 3, 2, 1, 2, 2, 2, 3, 8, 30, 64, 104, 141, + (222,41): 160, 174, 185, 192, 196, 198, 199, 200, 199, 198, 196, 194, + (222,53): 192, 190, 186, 187, 187, 183, 173, 152, 152, 152, 151, 149, + (222,65): 149, 157, 180, 205, 216, 214, 205, 198, 194, 192, 195, 199, + (222,77): 202, 205, 208, 212, 215, 217, 218, 220, 221, 220, 218, 214, + (222,89): 206, 193, 185, 180, 176, 173, 170, 164, 159, 156, 155, 162, + (222,101): 178, 196, 211, 221, 225, 225, 225, 225, 224, 224, 223, 223, + (222,113): 222, 221, 220, 219, 218, 216, 214, 210, 207, 203, 199, 195, + (222,125): 191, 189, 188, 187, 186, 187, 188, 189, 191, 192, 195, 196, + (222,137): 198, 199, 200, 202, 202, 203, 204, 205, 206, 206, 206, 207, + (222,149): 207, 208, 208, 208, 208, 207, 205, 202, 197, 189, 180, 164, + (222,161): 151, 138, 126, 117, 113, 115, 117, 120, 125, 132, 138, 144, + (222,173): 150, 157, 167, 173, 179, 184, 189, 194, 196, 197, 198, 197, + (222,185): 193, 190, 185, 180, 175, 168, 163, 158, 154, 149, 144, 140, + (222,197): 137, 134, 132, 130, 129, 128, 128, 127, 126, 125, 125, 125, + (222,209): 125, 125, 126, 127, 129, 131, 134, 138, 142, 148, 154, 164, + (222,221): 172, 180, 188, 194, 201, 204, 207, 209, 210, 210, 210, 211, + (222,233): 211, 212, 213, 213, 213, 213, 213, 212, 211, 210, 207, 202, + (222,245): 195, 193, 187, 179, 171, 173, 181, 184, 184, 180, 163, 113, + (222,257): 63, 23, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (222,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (222,296): 1, 1, 1, 1, + (223,0): 157, 188, 204, 212, 220, 222, 223, 223, 223, 223, 223, 223, + (223,12): 224, 224, 224, 223, 221, 217, 210, 199, 176, 145, 108, 69, + (223,24): 34, 11, 6, 3, 1, 1, 1, 1, 1, 1, 1, 4, 19, 54, 95, 131, 161, + (223,41): 177, 187, 194, 197, 198, 199, 200, 199, 199, 197, 195, 194, + (223,53): 193, 190, 188, 188, 188, 183, 170, 154, 155, 155, 154, 150, + (223,65): 149, 158, 183, 207, 216, 213, 203, 195, 190, 186, 187, 191, + (223,77): 193, 196, 200, 204, 209, 212, 215, 217, 220, 220, 220, 219, + (223,89): 215, 204, 194, 186, 180, 175, 172, 168, 163, 158, 155, 153, + (223,101): 160, 173, 190, 207, 220, 222, 223, 224, 223, 222, 221, 220, + (223,113): 219, 218, 216, 214, 212, 210, 207, 203, 200, 197, 195, 193, + (223,125): 191, 191, 190, 190, 191, 192, 193, 195, 197, 198, 201, 202, + (223,137): 203, 205, 206, 207, 207, 208, 208, 209, 209, 210, 210, 209, + (223,149): 209, 207, 206, 203, 200, 196, 188, 181, 171, 159, 145, 129, + (223,161): 122, 118, 116, 117, 120, 124, 129, 134, 139, 148, 154, 162, + (223,173): 170, 178, 187, 191, 195, 196, 197, 195, 193, 190, 186, 181, + (223,185): 173, 166, 159, 152, 145, 138, 133, 130, 127, 125, 124, 123, + (223,197): 123, 122, 122, 121, 121, 121, 121, 121, 121, 121, 121, 121, + (223,209): 120, 119, 119, 119, 119, 120, 122, 124, 127, 130, 135, 145, + (223,221): 154, 163, 173, 182, 192, 198, 203, 206, 209, 209, 210, 210, + (223,233): 211, 212, 213, 213, 214, 214, 214, 213, 212, 211, 208, 202, + (223,245): 196, 193, 186, 178, 173, 175, 183, 185, 183, 179, 155, 102, + (223,257): 53, 17, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (223,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (223,296): 1, 1, 1, 1, + (224,0): 138, 167, 185, 197, 209, 215, 218, 220, 220, 221, 221, 221, + (224,12): 221, 220, 218, 212, 202, 183, 157, 123, 72, 42, 22, 10, 3, 2, + (224,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 8, 40, 83, 125, 154, 179, 190, + (224,42): 195, 197, 197, 199, 199, 199, 199, 198, 197, 196, 195, 194, + (224,54): 191, 189, 190, 189, 183, 168, 157, 158, 159, 157, 151, 150, + (224,66): 160, 185, 209, 215, 211, 201, 192, 186, 180, 179, 181, 182, + (224,78): 185, 189, 194, 200, 204, 208, 212, 217, 218, 220, 220, 219, + (224,90): 215, 206, 196, 187, 179, 174, 172, 168, 163, 156, 153, 152, + (224,102): 154, 162, 179, 206, 215, 221, 224, 223, 223, 221, 220, 219, + (224,114): 217, 214, 212, 210, 208, 206, 202, 200, 198, 196, 195, 195, + (224,126): 195, 197, 199, 201, 205, 207, 209, 211, 212, 213, 214, 214, + (224,138): 214, 214, 213, 213, 213, 212, 211, 210, 210, 209, 207, 205, + (224,150): 201, 195, 186, 176, 163, 146, 135, 127, 122, 119, 117, 117, + (224,162): 118, 120, 124, 133, 140, 148, 157, 165, 176, 183, 189, 193, + (224,174): 195, 197, 197, 197, 196, 193, 184, 174, 163, 152, 142, 133, + (224,186): 128, 126, 124, 123, 122, 122, 122, 121, 121, 121, 122, 122, + (224,198): 122, 123, 123, 123, 123, 123, 123, 123, 122, 122, 121, 121, + (224,210): 120, 119, 118, 118, 117, 117, 117, 118, 120, 122, 128, 136, + (224,222): 145, 156, 166, 180, 189, 196, 202, 206, 209, 209, 210, 211, + (224,234): 212, 213, 213, 214, 214, 214, 214, 213, 212, 209, 203, 197, + (224,246): 193, 186, 178, 174, 179, 185, 185, 182, 177, 146, 89, 43, + (224,258): 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (224,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (224,298): 1, 1, + (225,0): 114, 131, 144, 154, 166, 173, 177, 180, 180, 178, 172, 165, + (225,12): 154, 139, 121, 92, 70, 50, 34, 21, 10, 6, 3, 1, 1, 1, 1, 1, + (225,28): 1, 1, 1, 1, 1, 1, 3, 23, 78, 122, 155, 176, 193, 195, 196, + (225,43): 197, 197, 199, 199, 199, 199, 198, 198, 198, 197, 195, 192, + (225,55): 191, 192, 191, 184, 169, 163, 164, 164, 160, 151, 150, 164, + (225,67): 188, 210, 215, 209, 198, 189, 182, 173, 169, 167, 166, 167, + (225,79): 170, 175, 181, 187, 193, 199, 207, 211, 215, 218, 219, 219, + (225,91): 216, 211, 203, 193, 181, 176, 173, 170, 167, 158, 154, 151, + (225,103): 150, 150, 158, 174, 191, 206, 217, 220, 221, 221, 220, 219, + (225,115): 218, 216, 215, 214, 213, 212, 211, 211, 212, 213, 214, 214, + (225,127): 215, 215, 216, 216, 216, 215, 215, 215, 214, 213, 213, 212, + (225,139): 210, 208, 205, 202, 198, 193, 185, 177, 169, 161, 153, 141, + (225,151): 135, 130, 127, 125, 124, 124, 125, 126, 128, 133, 138, 144, + (225,163): 149, 154, 159, 165, 171, 178, 185, 191, 194, 197, 197, 196, + (225,175): 188, 177, 164, 151, 139, 129, 125, 123, 122, 121, 121, 121, + (225,187): 121, 121, 122, 124, 126, 128, 130, 132, 136, 138, 141, 143, + (225,199): 146, 148, 148, 148, 148, 146, 144, 141, 139, 135, 132, 127, + (225,211): 124, 122, 120, 118, 116, 115, 115, 115, 115, 117, 121, 127, + (225,223): 135, 145, 161, 172, 183, 192, 200, 205, 207, 209, 210, 211, + (225,235): 212, 213, 214, 214, 215, 214, 214, 213, 210, 203, 197, 193, + (225,247): 185, 178, 176, 182, 186, 185, 181, 174, 130, 72, 31, 7, 1, + (225,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (225,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (226,0): 102, 110, 115, 119, 123, 125, 122, 120, 115, 109, 100, 94, 86, + (226,13): 77, 67, 54, 44, 34, 25, 17, 9, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, + (226,31): 1, 1, 3, 7, 48, 105, 144, 170, 186, 195, 195, 196, 196, 197, + (226,45): 199, 199, 199, 199, 199, 200, 200, 198, 196, 193, 193, 194, + (226,57): 192, 186, 172, 168, 168, 167, 161, 150, 150, 166, 191, 211, + (226,69): 214, 208, 197, 188, 180, 170, 163, 159, 156, 155, 156, 158, + (226,81): 163, 169, 175, 182, 192, 199, 205, 211, 215, 218, 217, 215, + (226,93): 211, 206, 195, 186, 179, 174, 171, 166, 161, 157, 153, 150, + (226,105): 150, 155, 160, 167, 179, 194, 203, 210, 214, 215, 216, 216, + (226,117): 215, 215, 214, 214, 213, 213, 213, 213, 213, 213, 213, 212, + (226,129): 212, 210, 208, 205, 202, 198, 192, 187, 183, 178, 173, 167, + (226,141): 163, 158, 154, 150, 146, 143, 140, 137, 134, 131, 130, 128, + (226,153): 128, 127, 128, 130, 132, 136, 140, 146, 153, 161, 169, 177, + (226,165): 187, 191, 195, 197, 198, 194, 186, 175, 164, 153, 142, 136, + (226,177): 131, 127, 124, 122, 121, 121, 122, 123, 126, 129, 134, 139, + (226,189): 144, 152, 157, 162, 167, 171, 175, 178, 179, 180, 181, 182, + (226,201): 182, 181, 180, 179, 176, 173, 169, 164, 159, 151, 145, 138, + (226,213): 131, 125, 120, 117, 114, 113, 113, 113, 115, 119, 124, 133, + (226,225): 147, 159, 171, 182, 192, 201, 204, 207, 208, 210, 212, 213, + (226,237): 214, 215, 215, 215, 214, 213, 210, 203, 198, 191, 184, 178, + (226,249): 178, 185, 186, 184, 179, 170, 115, 59, 23, 5, 1, 1, 1, 1, 1, + (226,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (226,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (227,0): 94, 97, 98, 97, 95, 92, 88, 84, 80, 75, 69, 65, 61, 56, 51, + (227,15): 47, 42, 35, 28, 21, 12, 6, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (227,33): 5, 13, 76, 130, 162, 180, 192, 195, 195, 195, 196, 197, 199, + (227,46): 199, 199, 199, 200, 201, 201, 199, 197, 194, 195, 195, 194, + (227,58): 189, 177, 172, 172, 169, 161, 150, 150, 169, 193, 211, 214, + (227,70): 208, 196, 187, 178, 168, 159, 154, 148, 145, 144, 144, 147, + (227,82): 151, 157, 163, 174, 181, 190, 198, 205, 213, 215, 216, 215, + (227,94): 213, 206, 198, 190, 182, 176, 171, 168, 164, 159, 155, 151, + (227,106): 149, 148, 149, 154, 165, 171, 178, 183, 187, 193, 195, 197, + (227,118): 198, 199, 200, 199, 199, 198, 196, 194, 192, 190, 187, 184, + (227,130): 180, 176, 172, 169, 165, 160, 157, 153, 150, 146, 142, 140, + (227,142): 137, 135, 133, 132, 131, 130, 130, 130, 131, 132, 133, 135, + (227,154): 137, 142, 148, 154, 161, 167, 176, 182, 187, 192, 196, 197, + (227,166): 193, 187, 179, 171, 161, 152, 144, 135, 128, 123, 121, 120, + (227,178): 120, 121, 124, 128, 132, 138, 144, 152, 159, 165, 171, 176, + (227,190): 182, 186, 190, 193, 196, 198, 199, 200, 200, 201, 201, 201, + (227,202): 200, 200, 199, 197, 195, 192, 188, 184, 177, 169, 161, 152, + (227,214): 142, 131, 124, 118, 114, 112, 111, 111, 113, 117, 123, 135, + (227,226): 147, 159, 172, 184, 195, 200, 204, 207, 209, 211, 213, 214, + (227,238): 215, 215, 215, 215, 213, 209, 203, 198, 190, 183, 179, 180, + (227,250): 187, 186, 183, 176, 163, 99, 47, 17, 3, 1, 1, 1, 1, 1, 1, 1, + (227,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (227,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (228,0): 89, 89, 89, 87, 83, 75, 71, 68, 66, 65, 64, 64, 63, 62, 61, + (228,15): 58, 54, 47, 39, 30, 16, 8, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + (228,33): 8, 22, 104, 151, 175, 187, 195, 195, 194, 194, 195, 198, 200, + (228,46): 199, 199, 200, 201, 203, 202, 200, 197, 196, 197, 197, 196, + (228,58): 191, 181, 176, 175, 169, 160, 149, 150, 172, 195, 212, 214, + (228,70): 208, 196, 186, 178, 168, 157, 151, 144, 138, 135, 132, 133, + (228,82): 136, 139, 144, 153, 161, 169, 179, 189, 201, 208, 212, 214, + (228,94): 214, 213, 209, 203, 195, 186, 178, 174, 170, 167, 163, 157, + (228,106): 153, 150, 147, 145, 145, 146, 148, 151, 156, 163, 167, 170, + (228,118): 172, 173, 174, 174, 173, 171, 169, 166, 163, 160, 156, 152, + (228,130): 147, 144, 141, 139, 137, 135, 134, 133, 133, 132, 132, 132, + (228,142): 132, 132, 133, 133, 134, 135, 136, 137, 141, 144, 148, 153, + (228,154): 159, 167, 174, 182, 189, 196, 201, 201, 199, 195, 191, 181, + (228,166): 170, 158, 145, 133, 124, 120, 118, 118, 118, 120, 122, 125, + (228,178): 129, 134, 142, 149, 158, 166, 174, 184, 191, 196, 199, 202, + (228,190): 205, 206, 207, 207, 208, 208, 209, 209, 209, 209, 209, 209, + (228,202): 209, 209, 209, 208, 207, 206, 204, 202, 197, 191, 184, 175, + (228,214): 164, 149, 137, 127, 119, 114, 110, 109, 110, 112, 115, 125, + (228,226): 135, 148, 161, 174, 188, 196, 201, 205, 207, 210, 212, 214, + (228,238): 215, 215, 215, 215, 213, 209, 203, 197, 188, 182, 180, 182, + (228,250): 188, 186, 182, 173, 154, 82, 36, 12, 2, 1, 1, 1, 1, 1, 1, 1, + (228,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (228,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (229,0): 85, 86, 86, 85, 83, 74, 70, 67, 65, 65, 69, 73, 77, 80, 82, + (229,15): 78, 72, 64, 54, 41, 22, 11, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + (229,33): 12, 36, 129, 164, 182, 190, 196, 194, 192, 193, 195, 198, + (229,45): 200, 199, 199, 200, 202, 204, 203, 200, 198, 198, 199, 199, + (229,57): 197, 193, 185, 179, 176, 168, 158, 149, 150, 174, 197, 212, + (229,69): 213, 208, 196, 187, 178, 168, 157, 150, 142, 135, 131, 126, + (229,81): 124, 124, 125, 127, 132, 138, 146, 155, 165, 182, 194, 204, + (229,93): 212, 214, 215, 214, 213, 210, 204, 190, 181, 175, 171, 168, + (229,105): 166, 163, 160, 157, 152, 147, 145, 143, 142, 142, 141, 142, + (229,117): 142, 142, 142, 142, 142, 141, 141, 140, 139, 138, 137, 136, + (229,129): 136, 136, 135, 135, 135, 134, 134, 134, 134, 134, 134, 135, + (229,141): 135, 136, 137, 138, 141, 144, 147, 151, 155, 163, 171, 179, + (229,153): 187, 195, 203, 207, 210, 212, 211, 201, 185, 169, 153, 140, + (229,165): 128, 123, 119, 116, 115, 115, 115, 116, 117, 119, 125, 133, + (229,177): 143, 155, 167, 182, 191, 197, 201, 204, 206, 207, 208, 208, + (229,189): 209, 209, 209, 209, 209, 210, 210, 210, 210, 210, 210, 210, + (229,201): 210, 210, 210, 210, 210, 210, 210, 210, 210, 208, 206, 201, + (229,213): 195, 186, 171, 157, 142, 129, 119, 111, 108, 108, 108, 110, + (229,225): 116, 126, 137, 150, 164, 181, 190, 198, 202, 206, 209, 212, + (229,237): 214, 215, 215, 215, 215, 213, 208, 203, 195, 187, 182, 182, + (229,249): 184, 189, 185, 180, 168, 142, 66, 26, 7, 1, 1, 1, 1, 1, 1, + (229,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (229,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (230,0): 83, 84, 85, 85, 84, 77, 73, 71, 71, 74, 94, 102, 106, 106, + (230,14): 105, 95, 86, 74, 60, 45, 25, 12, 5, 1, 1, 1, 1, 1, 1, 1, 1, + (230,31): 1, 4, 19, 55, 150, 175, 187, 192, 196, 193, 191, 192, 194, + (230,44): 198, 198, 198, 199, 201, 204, 205, 203, 201, 201, 201, 202, + (230,56): 202, 199, 194, 187, 178, 173, 164, 155, 148, 150, 176, 198, + (230,68): 212, 213, 209, 200, 190, 180, 172, 160, 152, 144, 137, 131, + (230,80): 126, 122, 120, 119, 118, 119, 120, 122, 126, 131, 143, 155, + (230,92): 170, 184, 199, 210, 213, 214, 214, 214, 212, 206, 198, 188, + (230,104): 179, 172, 169, 166, 165, 163, 160, 158, 156, 153, 151, 149, + (230,116): 147, 146, 145, 144, 143, 142, 142, 141, 140, 140, 140, 140, + (230,128): 140, 140, 140, 140, 141, 142, 143, 143, 144, 145, 147, 149, + (230,140): 152, 154, 157, 161, 167, 175, 182, 189, 195, 201, 208, 211, + (230,152): 213, 214, 213, 199, 180, 162, 146, 136, 129, 124, 121, 118, + (230,164): 116, 114, 113, 113, 113, 114, 117, 124, 134, 146, 161, 180, + (230,176): 190, 197, 202, 205, 207, 207, 208, 208, 209, 209, 209, 209, + (230,188): 209, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + (230,200): 210, 210, 210, 210, 211, 211, 211, 211, 211, 211, 211, 210, + (230,212): 210, 208, 204, 194, 182, 167, 150, 134, 117, 110, 107, 106, + (230,224): 106, 109, 116, 126, 138, 151, 170, 183, 192, 199, 204, 208, + (230,236): 211, 213, 215, 216, 216, 215, 212, 207, 202, 192, 185, 183, + (230,248): 183, 187, 189, 184, 177, 159, 121, 45, 16, 4, 1, 1, 1, 1, 1, + (230,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (230,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (231,0): 83, 85, 86, 87, 86, 82, 79, 78, 81, 91, 112, 116, 117, 116, + (231,14): 111, 99, 87, 72, 57, 40, 23, 11, 4, 1, 1, 1, 1, 1, 1, 1, 1, + (231,31): 1, 5, 23, 64, 157, 177, 187, 192, 196, 193, 191, 191, 192, + (231,44): 195, 196, 197, 200, 203, 206, 206, 204, 203, 203, 204, 204, + (231,56): 202, 198, 191, 182, 172, 167, 160, 153, 148, 150, 175, 197, + (231,68): 211, 213, 210, 203, 196, 188, 179, 167, 158, 150, 143, 137, + (231,80): 130, 126, 123, 121, 119, 118, 118, 118, 119, 121, 125, 130, + (231,92): 138, 149, 163, 183, 195, 205, 211, 214, 214, 212, 209, 205, + (231,104): 200, 191, 184, 177, 172, 168, 164, 162, 160, 159, 157, 155, + (231,116): 153, 152, 151, 150, 149, 149, 149, 149, 148, 148, 148, 148, + (231,128): 148, 148, 149, 149, 150, 151, 153, 156, 159, 163, 168, 173, + (231,140): 180, 185, 190, 195, 199, 203, 205, 207, 208, 206, 188, 171, + (231,152): 159, 152, 149, 144, 139, 133, 128, 123, 119, 115, 112, 111, + (231,164): 111, 111, 113, 119, 128, 139, 157, 169, 179, 187, 193, 200, + (231,176): 203, 205, 207, 208, 208, 209, 209, 209, 210, 210, 211, 211, + (231,188): 211, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 212, + (231,200): 212, 212, 212, 211, 211, 211, 211, 211, 211, 211, 211, 211, + (231,212): 210, 210, 208, 203, 195, 182, 167, 149, 126, 115, 108, 105, + (231,224): 104, 106, 111, 119, 130, 142, 163, 177, 188, 196, 202, 207, + (231,236): 211, 213, 215, 216, 216, 215, 211, 206, 201, 190, 185, 183, + (231,248): 185, 189, 188, 182, 172, 148, 101, 31, 11, 2, 1, 1, 1, 1, 1, + (231,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (231,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (232,0): 83, 86, 89, 90, 90, 87, 85, 85, 91, 107, 124, 126, 126, 122, + (232,14): 114, 99, 83, 66, 50, 35, 18, 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (232,32): 5, 24, 68, 158, 177, 187, 192, 196, 194, 192, 191, 191, 193, + (232,45): 196, 198, 202, 206, 207, 207, 205, 205, 206, 206, 204, 199, + (232,57): 191, 181, 170, 164, 161, 156, 151, 147, 149, 173, 194, 209, + (232,69): 211, 210, 206, 201, 195, 189, 178, 170, 162, 155, 148, 139, + (232,81): 134, 130, 126, 123, 120, 118, 117, 117, 117, 117, 119, 122, + (232,93): 127, 135, 150, 163, 177, 190, 201, 209, 212, 213, 213, 211, + (232,105): 205, 200, 195, 190, 185, 178, 174, 171, 169, 166, 164, 162, + (232,117): 161, 160, 159, 158, 157, 157, 156, 157, 157, 158, 159, 161, + (232,129): 162, 166, 169, 172, 175, 178, 183, 186, 190, 193, 197, 201, + (232,141): 204, 205, 202, 193, 173, 167, 165, 164, 163, 153, 142, 135, + (232,153): 129, 126, 123, 120, 116, 113, 110, 109, 107, 108, 112, 118, + (232,165): 131, 142, 154, 164, 175, 188, 195, 201, 204, 206, 208, 208, + (232,177): 209, 209, 210, 210, 211, 211, 212, 213, 213, 214, 214, 214, + (232,189): 215, 215, 215, 215, 215, 216, 216, 216, 215, 215, 215, 215, + (232,201): 214, 214, 213, 213, 212, 212, 212, 211, 211, 211, 211, 211, + (232,213): 211, 210, 208, 203, 194, 181, 164, 137, 121, 111, 105, 103, + (232,225): 104, 108, 114, 123, 135, 155, 171, 184, 194, 201, 207, 210, + (232,237): 213, 215, 216, 216, 215, 210, 205, 199, 188, 185, 184, 186, + (232,249): 190, 186, 180, 165, 135, 82, 20, 7, 2, 1, 1, 1, 1, 1, 1, 1, + (232,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (232,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (233,0): 83, 89, 93, 95, 96, 93, 92, 94, 103, 122, 132, 133, 131, 124, + (233,14): 113, 93, 74, 56, 41, 28, 14, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (233,32): 5, 23, 66, 156, 175, 185, 191, 196, 196, 193, 192, 192, 194, + (233,45): 197, 201, 205, 208, 208, 208, 208, 208, 207, 206, 199, 188, + (233,57): 175, 163, 154, 154, 155, 154, 150, 146, 147, 168, 190, 206, + (233,69): 209, 209, 208, 205, 202, 199, 191, 185, 178, 171, 165, 154, + (233,81): 148, 142, 137, 132, 126, 123, 120, 118, 117, 116, 116, 116, + (233,93): 117, 118, 123, 132, 144, 159, 174, 191, 200, 206, 210, 212, + (233,105): 213, 213, 211, 208, 203, 197, 192, 188, 184, 182, 178, 177, + (233,117): 175, 174, 173, 172, 171, 171, 172, 172, 174, 176, 178, 180, + (233,129): 183, 187, 192, 196, 200, 204, 207, 206, 203, 199, 194, 189, + (233,141): 186, 183, 176, 162, 132, 125, 122, 122, 122, 124, 124, 123, + (233,153): 121, 117, 113, 109, 106, 103, 103, 108, 114, 122, 133, 145, + (233,165): 165, 180, 191, 199, 203, 206, 207, 208, 208, 209, 210, 210, + (233,177): 211, 211, 212, 213, 214, 214, 215, 216, 216, 217, 217, 217, + (233,189): 217, 218, 218, 218, 218, 218, 218, 218, 217, 217, 217, 217, + (233,201): 217, 216, 216, 215, 214, 214, 213, 212, 212, 211, 211, 211, + (233,213): 211, 210, 210, 208, 203, 193, 177, 149, 129, 115, 106, 102, + (233,225): 102, 105, 110, 118, 128, 149, 166, 181, 192, 200, 206, 210, + (233,237): 213, 215, 216, 217, 214, 209, 203, 196, 186, 185, 185, 188, + (233,249): 191, 184, 177, 156, 119, 62, 12, 4, 1, 1, 1, 1, 1, 1, 1, 1, + (233,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (233,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (234,0): 84, 93, 99, 102, 102, 99, 98, 105, 117, 134, 139, 138, 132, + (234,13): 121, 107, 80, 60, 44, 31, 18, 10, 4, 1, 1, 1, 1, 1, 1, 1, 1, + (234,30): 1, 1, 4, 20, 58, 150, 171, 182, 189, 197, 198, 197, 195, 195, + (234,44): 196, 202, 206, 209, 210, 210, 210, 210, 209, 207, 203, 185, + (234,56): 165, 149, 138, 132, 144, 150, 151, 149, 145, 145, 162, 184, + (234,68): 203, 207, 208, 208, 207, 206, 206, 203, 201, 197, 192, 186, + (234,80): 176, 168, 160, 153, 146, 138, 132, 128, 124, 120, 117, 116, + (234,92): 115, 115, 115, 115, 116, 118, 123, 132, 152, 169, 184, 197, + (234,104): 206, 212, 214, 214, 214, 214, 214, 213, 211, 208, 204, 200, + (234,116): 198, 196, 195, 195, 197, 198, 200, 201, 202, 205, 207, 209, + (234,128): 210, 211, 212, 213, 213, 212, 212, 208, 198, 181, 160, 138, + (234,140): 117, 110, 108, 111, 119, 129, 136, 138, 138, 133, 126, 118, + (234,152): 109, 100, 96, 93, 94, 95, 99, 106, 127, 149, 169, 186, 197, + (234,165): 203, 205, 207, 207, 208, 208, 209, 209, 210, 211, 212, 213, + (234,177): 214, 215, 216, 217, 217, 217, 218, 218, 218, 218, 218, 218, + (234,189): 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, 218, + (234,201): 218, 218, 218, 217, 217, 216, 215, 214, 213, 212, 211, 211, + (234,213): 211, 211, 210, 210, 207, 201, 189, 162, 139, 121, 108, 102, + (234,225): 100, 103, 107, 113, 122, 143, 163, 179, 191, 199, 206, 211, + (234,237): 214, 215, 216, 217, 213, 207, 201, 193, 186, 185, 187, 189, + (234,249): 191, 182, 173, 145, 101, 43, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (234,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (234,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (235,0): 85, 99, 106, 109, 109, 108, 110, 120, 133, 143, 144, 138, 128, + (235,13): 111, 87, 55, 42, 29, 19, 10, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (235,31): 1, 3, 14, 43, 133, 160, 173, 181, 192, 199, 200, 201, 202, + (235,44): 204, 209, 210, 211, 211, 211, 211, 209, 205, 194, 176, 141, + (235,56): 120, 108, 103, 103, 128, 142, 148, 148, 144, 142, 150, 172, + (235,68): 193, 201, 204, 206, 207, 207, 207, 207, 207, 207, 207, 206, + (235,80): 202, 197, 190, 183, 175, 165, 157, 150, 143, 136, 130, 125, + (235,92): 121, 119, 116, 115, 114, 114, 114, 114, 117, 120, 127, 136, + (235,104): 149, 167, 180, 192, 201, 208, 213, 216, 218, 220, 221, 221, + (235,116): 220, 219, 218, 217, 215, 215, 215, 215, 215, 214, 213, 212, + (235,128): 209, 205, 193, 175, 156, 137, 122, 106, 105, 108, 116, 129, + (235,140): 144, 148, 149, 149, 145, 137, 124, 111, 99, 92, 90, 89, 89, + (235,153): 90, 93, 102, 118, 139, 162, 183, 197, 202, 205, 206, 207, + (235,165): 208, 208, 209, 209, 210, 211, 213, 214, 215, 216, 217, 217, + (235,177): 217, 218, 218, 218, 218, 218, 218, 218, 219, 219, 219, 219, + (235,189): 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, + (235,201): 219, 219, 218, 218, 218, 218, 217, 216, 215, 214, 212, 212, + (235,213): 211, 211, 210, 210, 210, 207, 200, 176, 151, 130, 113, 102, + (235,225): 99, 101, 104, 108, 116, 139, 160, 177, 190, 199, 207, 211, + (235,237): 214, 216, 217, 216, 211, 205, 197, 190, 186, 186, 189, 190, + (235,249): 189, 178, 163, 124, 73, 23, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (235,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (235,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (236,0): 86, 102, 110, 113, 114, 115, 121, 131, 141, 147, 145, 134, + (236,12): 116, 94, 72, 53, 39, 25, 15, 8, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (236,30): 1, 1, 2, 9, 29, 114, 148, 163, 169, 177, 196, 202, 204, 206, + (236,44): 209, 211, 212, 212, 212, 211, 209, 202, 187, 166, 140, 116, + (236,56): 105, 98, 95, 95, 110, 132, 142, 145, 144, 140, 142, 159, 179, + (236,69): 191, 196, 201, 204, 205, 205, 207, 207, 208, 208, 208, 207, + (236,81): 205, 202, 198, 192, 183, 176, 169, 161, 154, 145, 140, 135, + (236,93): 130, 127, 122, 119, 117, 115, 114, 114, 115, 117, 119, 123, + (236,105): 129, 135, 142, 150, 159, 169, 176, 183, 188, 193, 196, 199, + (236,117): 200, 202, 202, 201, 198, 192, 184, 174, 160, 152, 144, 137, + (236,129): 130, 125, 124, 127, 131, 136, 142, 144, 145, 146, 149, 149, + (236,141): 141, 131, 120, 109, 101, 97, 93, 90, 89, 89, 94, 102, 114, + (236,154): 131, 158, 172, 184, 193, 200, 204, 206, 207, 208, 208, 209, + (236,166): 210, 212, 213, 214, 215, 216, 216, 217, 217, 218, 218, 218, + (236,178): 218, 218, 219, 219, 219, 220, 221, 222, 222, 223, 223, 224, + (236,190): 224, 224, 224, 224, 224, 223, 222, 221, 221, 220, 220, 219, + (236,202): 219, 219, 219, 219, 218, 218, 218, 217, 215, 214, 213, 212, + (236,214): 211, 210, 210, 210, 208, 205, 185, 160, 137, 118, 104, 99, + (236,226): 101, 102, 106, 113, 137, 159, 177, 191, 200, 208, 212, 215, + (236,238): 216, 217, 215, 209, 202, 195, 188, 186, 187, 190, 190, 185, + (236,250): 174, 150, 104, 53, 14, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (236,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (236,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (237,0): 87, 105, 114, 117, 118, 122, 131, 141, 147, 150, 143, 126, + (237,12): 106, 87, 71, 57, 44, 30, 17, 9, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, + (237,30): 1, 1, 1, 5, 16, 89, 134, 152, 156, 160, 180, 196, 203, 207, + (237,44): 210, 211, 212, 212, 211, 209, 198, 182, 160, 138, 121, 106, + (237,56): 99, 95, 92, 91, 98, 117, 133, 143, 144, 138, 137, 147, 162, + (237,69): 176, 182, 189, 194, 197, 198, 202, 204, 206, 207, 208, 208, + (237,81): 209, 208, 206, 203, 196, 191, 184, 176, 169, 159, 153, 147, + (237,93): 142, 139, 134, 130, 126, 123, 120, 117, 116, 114, 114, 113, + (237,105): 114, 116, 119, 123, 128, 134, 139, 143, 146, 149, 151, 153, + (237,117): 154, 154, 152, 149, 146, 143, 138, 132, 127, 127, 128, 128, + (237,129): 127, 129, 133, 139, 146, 152, 157, 157, 154, 148, 139, 125, + (237,141): 115, 107, 98, 91, 87, 87, 88, 91, 96, 107, 122, 138, 155, + (237,154): 171, 190, 198, 202, 205, 206, 207, 208, 209, 210, 211, 213, + (237,166): 214, 215, 216, 216, 217, 217, 218, 218, 218, 218, 218, 219, + (237,178): 220, 220, 221, 222, 223, 224, 225, 227, 227, 228, 229, 229, + (237,190): 230, 229, 229, 229, 229, 228, 227, 226, 225, 224, 223, 222, + (237,202): 221, 220, 219, 219, 219, 219, 219, 218, 217, 216, 214, 212, + (237,214): 211, 210, 210, 210, 209, 207, 192, 168, 144, 122, 106, 99, + (237,226): 100, 101, 104, 110, 137, 160, 179, 192, 201, 209, 213, 215, + (237,238): 216, 216, 213, 206, 199, 192, 187, 187, 189, 191, 189, 181, + (237,250): 169, 133, 83, 36, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (237,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (237,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (238,0): 88, 109, 118, 121, 122, 130, 141, 148, 151, 151, 138, 118, + (238,12): 102, 90, 83, 73, 60, 45, 31, 18, 7, 3, 2, 1, 1, 1, 1, 1, 1, + (238,29): 1, 1, 1, 1, 2, 7, 59, 115, 140, 146, 145, 157, 180, 194, 202, + (238,44): 207, 209, 209, 208, 205, 199, 178, 155, 135, 120, 114, 108, + (238,56): 104, 101, 98, 93, 93, 104, 122, 138, 143, 137, 133, 135, 143, + (238,69): 156, 163, 170, 176, 180, 182, 189, 193, 196, 200, 203, 205, + (238,81): 207, 209, 209, 208, 205, 201, 196, 190, 182, 173, 166, 159, + (238,93): 153, 149, 145, 142, 138, 135, 131, 126, 123, 120, 118, 117, + (238,105): 115, 114, 114, 114, 114, 114, 114, 115, 115, 115, 114, 114, + (238,117): 114, 113, 112, 111, 111, 112, 113, 115, 123, 132, 140, 148, + (238,129): 153, 159, 161, 163, 163, 162, 156, 149, 140, 129, 114, 96, + (238,141): 90, 87, 86, 86, 88, 91, 96, 105, 117, 140, 160, 177, 192, + (238,154): 200, 205, 206, 207, 208, 208, 209, 210, 212, 213, 214, 216, + (238,166): 217, 217, 217, 217, 218, 218, 218, 218, 219, 219, 220, 221, + (238,178): 222, 223, 225, 226, 227, 229, 230, 231, 232, 232, 233, 233, + (238,190): 233, 233, 233, 233, 233, 232, 231, 231, 230, 228, 227, 225, + (238,202): 224, 222, 221, 220, 219, 219, 219, 219, 218, 217, 215, 213, + (238,214): 212, 211, 210, 210, 210, 209, 197, 175, 150, 127, 107, 99, + (238,226): 99, 100, 103, 109, 138, 162, 180, 194, 203, 210, 214, 216, + (238,238): 216, 216, 211, 203, 196, 190, 187, 187, 190, 191, 187, 177, + (238,250): 160, 112, 62, 22, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (238,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (238,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (239,0): 90, 112, 121, 124, 126, 138, 148, 153, 153, 150, 130, 113, + (239,12): 106, 105, 106, 105, 89, 76, 60, 39, 16, 6, 2, 2, 1, 1, 1, 1, + (239,28): 1, 1, 1, 1, 1, 1, 3, 25, 92, 127, 139, 137, 132, 149, 172, + (239,43): 192, 198, 204, 204, 200, 192, 178, 148, 130, 122, 118, 116, + (239,55): 117, 121, 121, 114, 100, 93, 95, 109, 126, 139, 140, 132, + (239,67): 128, 128, 133, 140, 144, 148, 153, 154, 160, 167, 174, 181, + (239,79): 189, 196, 202, 206, 209, 210, 211, 210, 208, 203, 196, 187, + (239,91): 178, 169, 161, 155, 151, 149, 147, 146, 144, 141, 138, 135, + (239,103): 132, 130, 126, 123, 120, 118, 116, 115, 114, 114, 113, 113, + (239,115): 114, 115, 117, 121, 126, 135, 141, 145, 148, 151, 155, 159, + (239,127): 161, 163, 165, 166, 166, 165, 163, 159, 143, 124, 108, 96, + (239,139): 89, 86, 85, 85, 86, 87, 95, 102, 116, 133, 154, 184, 195, + (239,152): 202, 205, 206, 207, 207, 208, 209, 210, 213, 215, 216, 217, + (239,164): 217, 217, 217, 218, 218, 218, 218, 218, 219, 220, 221, 222, + (239,176): 223, 224, 225, 226, 228, 229, 230, 230, 231, 232, 233, 233, + (239,188): 234, 234, 234, 234, 234, 234, 233, 233, 233, 232, 232, 231, + (239,200): 230, 229, 228, 226, 224, 221, 220, 220, 219, 219, 219, 218, + (239,212): 217, 215, 212, 211, 210, 210, 210, 209, 201, 180, 156, 131, + (239,224): 109, 99, 99, 100, 103, 109, 141, 165, 183, 196, 204, 212, + (239,236): 215, 216, 216, 216, 208, 200, 193, 189, 187, 188, 192, 190, + (239,248): 184, 173, 146, 89, 42, 11, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (239,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (239,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (240,0): 93, 116, 126, 128, 131, 145, 153, 156, 154, 146, 124, 120, + (240,12): 121, 124, 125, 119, 110, 103, 92, 73, 49, 27, 12, 3, 1, 1, 1, + (240,27): 1, 1, 1, 1, 1, 1, 1, 1, 4, 38, 90, 133, 139, 119, 117, 124, + (240,43): 137, 152, 159, 162, 159, 151, 136, 126, 124, 123, 125, 134, + (240,55): 147, 150, 152, 150, 144, 114, 100, 98, 108, 132, 140, 137, + (240,67): 130, 122, 121, 119, 118, 118, 118, 117, 117, 119, 122, 127, + (240,79): 134, 149, 164, 180, 194, 204, 211, 214, 216, 216, 213, 208, + (240,91): 202, 193, 183, 172, 161, 156, 152, 150, 149, 148, 147, 146, + (240,103): 145, 145, 144, 144, 143, 143, 143, 143, 143, 143, 144, 144, + (240,115): 145, 147, 149, 151, 153, 155, 155, 157, 159, 163, 167, 170, + (240,127): 173, 174, 174, 170, 165, 155, 142, 125, 105, 97, 91, 88, 86, + (240,140): 85, 87, 89, 94, 103, 118, 139, 161, 182, 197, 204, 206, 207, + (240,153): 207, 208, 209, 210, 212, 214, 216, 217, 217, 217, 217, 217, + (240,165): 218, 218, 218, 218, 219, 220, 221, 222, 223, 224, 224, 225, + (240,177): 226, 226, 227, 228, 229, 230, 231, 232, 232, 233, 233, 233, + (240,189): 233, 233, 232, 232, 232, 232, 232, 232, 232, 232, 231, 231, + (240,201): 230, 229, 229, 228, 225, 223, 221, 220, 220, 219, 219, 218, + (240,213): 216, 214, 211, 210, 210, 210, 210, 204, 186, 161, 135, 112, + (240,225): 100, 99, 99, 103, 112, 148, 171, 187, 199, 207, 213, 216, + (240,237): 217, 216, 214, 203, 195, 191, 188, 188, 191, 192, 185, 175, + (240,249): 166, 115, 58, 22, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (240,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (240,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (241,0): 93, 118, 129, 131, 133, 148, 155, 157, 153, 142, 128, 129, + (241,12): 132, 136, 137, 131, 123, 115, 105, 91, 72, 52, 32, 15, 3, 1, + (241,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 14, 51, 97, 135, 130, 117, 113, + (241,43): 117, 126, 138, 140, 138, 134, 129, 126, 126, 130, 137, 144, + (241,55): 150, 152, 154, 154, 154, 142, 122, 106, 101, 112, 137, 138, + (241,67): 132, 124, 120, 117, 114, 113, 112, 112, 110, 110, 110, 110, + (241,79): 111, 114, 122, 134, 149, 166, 188, 200, 207, 212, 214, 213, + (241,91): 211, 207, 201, 194, 179, 171, 164, 158, 154, 152, 150, 149, + (241,103): 148, 148, 147, 147, 146, 146, 146, 146, 147, 147, 148, 149, + (241,115): 150, 152, 154, 157, 159, 163, 166, 169, 172, 174, 176, 177, + (241,127): 177, 175, 171, 161, 149, 137, 124, 112, 99, 93, 89, 87, 86, + (241,140): 88, 93, 100, 110, 124, 152, 173, 188, 198, 204, 206, 207, + (241,152): 208, 208, 210, 212, 214, 215, 216, 217, 217, 217, 217, 217, + (241,164): 218, 218, 218, 219, 220, 221, 222, 222, 223, 223, 224, 224, + (241,176): 225, 225, 225, 226, 227, 228, 229, 229, 230, 230, 230, 230, + (241,188): 229, 229, 229, 229, 228, 228, 229, 229, 229, 230, 230, 230, + (241,200): 230, 230, 230, 229, 228, 227, 225, 223, 221, 220, 220, 219, + (241,212): 219, 217, 214, 212, 211, 210, 210, 210, 205, 188, 164, 137, + (241,224): 113, 100, 99, 99, 104, 117, 155, 176, 191, 202, 209, 214, + (241,236): 216, 216, 215, 210, 199, 193, 189, 188, 189, 192, 192, 182, + (241,248): 168, 153, 85, 38, 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (241,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (241,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (242,0): 93, 120, 131, 133, 135, 149, 156, 158, 153, 141, 133, 136, + (242,12): 140, 144, 144, 141, 135, 128, 118, 105, 85, 70, 52, 32, 12, + (242,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 22, 56, 105, 134, 125, + (242,42): 115, 110, 112, 120, 126, 128, 129, 128, 128, 132, 137, 143, + (242,54): 148, 150, 152, 154, 156, 157, 155, 142, 123, 106, 101, 122, + (242,66): 134, 135, 129, 121, 117, 114, 112, 111, 110, 108, 106, 105, + (242,78): 103, 102, 100, 101, 105, 112, 122, 145, 167, 184, 198, 207, + (242,90): 213, 214, 213, 211, 207, 197, 188, 179, 171, 165, 160, 157, + (242,102): 156, 154, 153, 152, 151, 151, 151, 151, 151, 152, 153, 154, + (242,114): 155, 158, 160, 163, 165, 168, 171, 174, 177, 179, 180, 181, + (242,126): 179, 176, 172, 165, 151, 139, 127, 115, 104, 94, 90, 88, 88, + (242,139): 89, 95, 103, 116, 132, 152, 180, 194, 201, 205, 206, 207, + (242,151): 208, 210, 211, 213, 215, 216, 217, 217, 217, 217, 217, 217, + (242,163): 218, 218, 219, 220, 220, 221, 222, 223, 223, 223, 223, 223, + (242,175): 223, 223, 223, 224, 225, 226, 227, 228, 228, 228, 228, 228, + (242,187): 228, 227, 227, 227, 227, 227, 227, 227, 227, 227, 228, 228, + (242,199): 229, 229, 229, 229, 229, 228, 228, 226, 225, 223, 221, 220, + (242,211): 220, 219, 218, 215, 212, 211, 210, 210, 210, 206, 189, 165, + (242,223): 138, 114, 101, 99, 100, 107, 123, 163, 182, 195, 204, 211, + (242,235): 216, 216, 216, 213, 207, 195, 191, 189, 189, 190, 193, 188, + (242,247): 177, 159, 132, 58, 23, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (242,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (242,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (243,0): 93, 121, 132, 135, 137, 149, 156, 158, 153, 141, 137, 142, + (243,12): 147, 149, 150, 149, 145, 139, 130, 117, 95, 81, 67, 50, 27, + (243,25): 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 20, 58, 117, 128, 123, + (243,43): 114, 109, 108, 117, 123, 128, 130, 131, 137, 142, 145, 147, + (243,55): 149, 151, 153, 155, 157, 158, 156, 142, 121, 100, 103, 124, + (243,67): 135, 136, 126, 119, 116, 113, 112, 110, 109, 108, 106, 104, + (243,79): 102, 97, 94, 91, 89, 88, 101, 125, 149, 171, 189, 207, 212, + (243,92): 213, 214, 214, 209, 203, 195, 187, 178, 170, 166, 164, 161, + (243,104): 160, 158, 157, 156, 156, 156, 156, 157, 158, 160, 162, 166, + (243,116): 168, 171, 173, 176, 179, 180, 182, 183, 183, 182, 179, 174, + (243,128): 167, 158, 143, 132, 120, 109, 99, 90, 89, 89, 90, 94, 105, + (243,141): 119, 137, 158, 180, 199, 204, 206, 207, 207, 209, 210, 212, + (243,153): 214, 216, 217, 217, 217, 217, 217, 217, 217, 218, 218, 219, + (243,165): 220, 221, 221, 222, 222, 222, 222, 222, 221, 221, 221, 221, + (243,177): 222, 223, 224, 226, 226, 227, 227, 227, 227, 227, 227, 227, + (243,189): 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, 227, 228, + (243,201): 228, 229, 229, 228, 228, 227, 226, 224, 222, 220, 220, 219, + (243,213): 218, 215, 212, 211, 210, 210, 210, 206, 190, 165, 138, 115, + (243,225): 101, 99, 101, 110, 133, 171, 187, 199, 207, 212, 216, 216, + (243,237): 215, 210, 202, 192, 190, 189, 190, 191, 192, 181, 169, 146, + (243,249): 106, 34, 12, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (243,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (243,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (244,0): 91, 121, 133, 137, 138, 149, 156, 157, 153, 142, 141, 148, + (244,12): 152, 154, 154, 153, 152, 148, 141, 129, 104, 88, 75, 63, 50, + (244,25): 11, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 7, 65, 114, 131, + (244,43): 128, 117, 106, 107, 115, 125, 132, 137, 140, 142, 144, 145, + (244,55): 146, 148, 150, 154, 157, 159, 158, 155, 142, 111, 93, 107, + (244,67): 127, 140, 137, 123, 120, 117, 114, 113, 113, 112, 112, 110, + (244,79): 108, 100, 95, 90, 85, 81, 77, 85, 105, 130, 157, 191, 205, + (244,92): 211, 213, 215, 213, 211, 207, 201, 192, 182, 176, 171, 169, + (244,104): 167, 164, 163, 162, 161, 161, 161, 162, 163, 165, 167, 169, + (244,116): 171, 174, 177, 179, 183, 185, 186, 187, 186, 183, 178, 172, + (244,128): 163, 153, 138, 125, 112, 101, 94, 90, 90, 92, 96, 102, 119, + (244,141): 140, 162, 183, 200, 205, 206, 207, 208, 209, 211, 214, 216, + (244,153): 217, 217, 217, 217, 217, 217, 217, 217, 218, 219, 219, 220, + (244,165): 221, 221, 221, 222, 221, 221, 220, 219, 219, 219, 220, 221, + (244,177): 222, 223, 225, 226, 226, 227, 227, 227, 227, 227, 227, 227, + (244,189): 227, 227, 227, 226, 226, 226, 226, 226, 226, 226, 226, 226, + (244,201): 227, 227, 228, 228, 228, 227, 226, 225, 223, 221, 220, 220, + (244,213): 218, 215, 212, 211, 210, 210, 210, 206, 189, 165, 138, 115, + (244,225): 101, 100, 103, 116, 144, 179, 193, 203, 209, 215, 216, 216, + (244,237): 213, 207, 197, 190, 189, 189, 191, 193, 191, 174, 157, 129, + (244,249): 74, 16, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (244,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (244,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (245,0): 87, 118, 133, 137, 139, 148, 156, 157, 153, 146, 146, 152, + (245,12): 155, 155, 155, 154, 154, 153, 152, 150, 127, 101, 82, 68, 61, + (245,25): 35, 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 34, 81, + (245,43): 121, 133, 127, 115, 111, 113, 118, 127, 134, 138, 139, 139, + (245,55): 139, 141, 145, 151, 157, 160, 160, 159, 156, 149, 99, 91, + (245,67): 100, 119, 141, 139, 130, 125, 122, 120, 122, 125, 127, 129, + (245,79): 129, 124, 117, 106, 93, 82, 74, 69, 67, 73, 91, 137, 167, + (245,92): 190, 204, 212, 215, 213, 213, 211, 207, 198, 189, 182, 176, + (245,104): 172, 169, 167, 165, 164, 163, 164, 165, 166, 169, 171, 176, + (245,116): 179, 182, 184, 186, 188, 188, 188, 188, 187, 182, 176, 169, + (245,128): 159, 148, 131, 118, 107, 98, 93, 91, 93, 97, 105, 118, 147, + (245,141): 170, 189, 202, 206, 207, 207, 209, 210, 212, 216, 216, 217, + (245,153): 217, 217, 217, 217, 217, 217, 217, 218, 219, 219, 220, 220, + (245,165): 220, 220, 220, 219, 218, 217, 218, 218, 219, 219, 220, 222, + (245,177): 223, 225, 225, 226, 226, 226, 227, 227, 227, 227, 227, 227, + (245,189): 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, 226, + (245,201): 226, 226, 227, 227, 227, 227, 226, 225, 224, 222, 221, 220, + (245,213): 218, 215, 212, 211, 210, 210, 210, 206, 187, 161, 135, 114, + (245,225): 101, 102, 109, 128, 162, 189, 199, 207, 213, 216, 216, 215, + (245,237): 208, 200, 192, 189, 189, 190, 192, 192, 182, 165, 136, 94, + (245,249): 37, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (245,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (245,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (246,0): 84, 113, 130, 137, 140, 147, 155, 157, 154, 148, 149, 154, + (246,12): 155, 155, 154, 154, 154, 154, 155, 154, 146, 120, 93, 71, 62, + (246,25): 47, 21, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 10, 28, 56, + (246,44): 94, 119, 122, 123, 123, 123, 124, 126, 128, 128, 128, 130, + (246,56): 136, 142, 148, 155, 161, 161, 160, 159, 156, 132, 102, 91, + (246,68): 97, 114, 139, 137, 134, 130, 127, 128, 130, 132, 133, 133, + (246,80): 132, 131, 126, 117, 103, 81, 71, 64, 62, 63, 83, 114, 146, + (246,93): 177, 202, 213, 213, 213, 212, 210, 206, 202, 195, 188, 181, + (246,105): 176, 173, 171, 169, 168, 168, 168, 170, 172, 174, 179, 181, + (246,117): 184, 186, 188, 189, 189, 190, 189, 187, 182, 175, 167, 157, + (246,129): 145, 127, 114, 104, 97, 93, 93, 97, 105, 119, 138, 168, 187, + (246,142): 199, 205, 207, 208, 209, 211, 213, 215, 216, 217, 217, 217, + (246,154): 217, 217, 217, 217, 217, 218, 219, 219, 219, 220, 220, 219, + (246,166): 218, 217, 217, 217, 217, 217, 218, 219, 220, 222, 224, 225, + (246,178): 226, 226, 226, 226, 227, 227, 227, 227, 227, 227, 227, 227, + (246,190): 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, 226, 226, + (246,202): 226, 226, 227, 227, 226, 226, 225, 224, 222, 222, 220, 218, + (246,214): 215, 211, 211, 210, 210, 210, 204, 184, 158, 132, 112, 102, + (246,226): 103, 118, 142, 175, 195, 203, 210, 215, 216, 216, 211, 204, + (246,238): 196, 191, 190, 190, 191, 192, 191, 169, 152, 113, 64, 19, 2, + (246,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (246,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (246,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (247,0): 82, 107, 126, 137, 140, 147, 155, 157, 154, 149, 152, 155, + (247,12): 155, 155, 154, 154, 154, 155, 157, 158, 156, 138, 108, 77, + (247,24): 60, 52, 33, 14, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, + (247,43): 18, 42, 70, 94, 109, 118, 123, 128, 130, 131, 131, 132, 134, + (247,56): 139, 144, 149, 154, 160, 161, 162, 161, 159, 150, 123, 100, + (247,68): 87, 92, 117, 132, 137, 137, 134, 133, 133, 134, 135, 135, + (247,80): 136, 136, 136, 132, 124, 103, 84, 69, 58, 52, 54, 71, 98, + (247,93): 133, 171, 204, 210, 213, 213, 212, 210, 208, 203, 198, 191, + (247,105): 183, 179, 176, 174, 172, 170, 171, 171, 173, 176, 180, 184, + (247,117): 186, 188, 190, 190, 191, 190, 190, 188, 181, 174, 165, 154, + (247,129): 142, 123, 111, 102, 96, 93, 95, 103, 116, 134, 156, 184, + (247,141): 198, 204, 207, 208, 209, 211, 213, 215, 216, 217, 217, 217, + (247,153): 217, 217, 217, 217, 217, 218, 218, 219, 219, 219, 219, 218, + (247,165): 217, 216, 216, 216, 216, 217, 218, 219, 221, 223, 225, 225, + (247,177): 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, 226, + (247,189): 227, 227, 227, 227, 227, 227, 227, 227, 227, 227, 226, 226, + (247,201): 226, 226, 226, 226, 226, 226, 226, 225, 224, 223, 222, 220, + (247,213): 217, 214, 211, 211, 210, 210, 209, 201, 179, 154, 129, 109, + (247,225): 104, 107, 129, 159, 185, 199, 207, 213, 216, 216, 214, 207, + (247,237): 199, 193, 190, 190, 191, 192, 190, 184, 160, 133, 87, 39, 9, + (247,250): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (247,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (247,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (248,0): 81, 102, 121, 135, 141, 147, 154, 157, 155, 151, 154, 155, + (248,12): 155, 154, 153, 153, 154, 156, 159, 161, 161, 153, 125, 89, + (248,24): 58, 51, 42, 22, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (248,43): 1, 3, 19, 48, 70, 87, 101, 117, 125, 130, 135, 139, 143, 147, + (248,57): 150, 153, 155, 159, 161, 162, 162, 160, 158, 145, 120, 94, + (248,69): 80, 89, 113, 129, 138, 140, 137, 137, 136, 136, 136, 136, + (248,81): 137, 139, 139, 139, 128, 106, 83, 64, 51, 43, 44, 58, 85, + (248,94): 124, 180, 199, 210, 214, 214, 212, 210, 208, 205, 200, 191, + (248,106): 186, 181, 178, 175, 173, 172, 173, 174, 177, 182, 185, 188, + (248,118): 191, 191, 191, 191, 191, 190, 188, 181, 173, 163, 152, 139, + (248,130): 120, 109, 100, 96, 94, 100, 111, 128, 149, 172, 196, 204, + (248,142): 207, 208, 209, 210, 213, 215, 216, 217, 217, 217, 217, 217, + (248,154): 217, 217, 217, 218, 218, 218, 219, 218, 218, 217, 216, 215, + (248,166): 215, 215, 215, 216, 218, 219, 221, 223, 225, 226, 226, 226, + (248,178): 226, 226, 226, 226, 226, 226, 225, 225, 225, 225, 226, 226, + (248,190): 226, 226, 226, 227, 227, 227, 227, 227, 227, 227, 226, 226, + (248,202): 226, 226, 226, 226, 226, 225, 225, 223, 223, 222, 219, 216, + (248,214): 213, 211, 210, 210, 210, 209, 197, 173, 148, 126, 108, 106, + (248,226): 115, 144, 175, 193, 203, 211, 215, 216, 216, 211, 201, 195, + (248,238): 191, 190, 190, 192, 191, 186, 173, 151, 107, 59, 20, 3, 1, + (248,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (248,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (248,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (249,0): 80, 96, 115, 132, 142, 147, 154, 157, 155, 152, 155, 156, 155, + (249,13): 153, 153, 153, 154, 158, 162, 165, 166, 162, 143, 108, 57, + (249,25): 43, 43, 26, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (249,44): 1, 1, 2, 7, 18, 39, 72, 91, 109, 124, 138, 151, 155, 157, + (249,58): 157, 157, 159, 160, 162, 162, 162, 160, 157, 144, 120, 82, + (249,70): 72, 79, 103, 128, 141, 142, 140, 139, 137, 136, 136, 138, + (249,82): 139, 141, 142, 142, 133, 110, 82, 54, 41, 37, 37, 44, 65, + (249,95): 133, 177, 202, 213, 215, 214, 211, 210, 208, 206, 199, 192, + (249,107): 187, 182, 178, 175, 174, 175, 176, 178, 183, 187, 190, 191, + (249,119): 192, 192, 192, 191, 190, 187, 180, 172, 162, 150, 136, 117, + (249,131): 106, 99, 96, 96, 105, 122, 142, 164, 186, 205, 207, 208, + (249,143): 209, 210, 212, 214, 216, 216, 217, 217, 217, 217, 217, 217, + (249,155): 217, 217, 218, 218, 218, 218, 217, 216, 215, 215, 214, 214, + (249,167): 215, 215, 217, 220, 223, 225, 226, 226, 226, 226, 226, 226, + (249,179): 225, 225, 224, 224, 224, 224, 224, 224, 224, 224, 225, 225, + (249,191): 225, 226, 226, 226, 227, 227, 227, 227, 227, 226, 226, 226, + (249,203): 225, 225, 225, 225, 225, 224, 223, 223, 222, 219, 215, 212, + (249,215): 210, 210, 210, 210, 209, 192, 167, 142, 120, 108, 108, 131, + (249,227): 162, 188, 198, 208, 214, 216, 216, 215, 205, 196, 192, 190, + (249,239): 190, 192, 192, 190, 181, 161, 135, 77, 33, 7, 1, 1, 1, 1, 1, + (249,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (249,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (249,294): 1, 1, 1, 1, 1, 1, + (250,0): 81, 91, 109, 129, 143, 149, 155, 157, 156, 154, 155, 155, 154, + (250,13): 153, 153, 153, 155, 161, 168, 174, 175, 171, 161, 135, 85, + (250,25): 37, 39, 29, 14, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (250,44): 1, 1, 1, 1, 2, 3, 7, 15, 29, 48, 72, 106, 127, 141, 151, 155, + (250,60): 157, 159, 160, 161, 162, 161, 160, 158, 150, 130, 77, 67, 66, + (250,73): 80, 113, 141, 142, 143, 142, 140, 138, 139, 140, 142, 144, + (250,85): 145, 143, 135, 117, 85, 44, 36, 32, 30, 31, 52, 103, 156, + (250,98): 197, 215, 216, 214, 212, 210, 209, 206, 202, 196, 191, 185, + (250,110): 180, 177, 176, 177, 178, 184, 187, 190, 192, 192, 193, 192, + (250,122): 192, 190, 187, 180, 171, 160, 147, 133, 114, 104, 98, 97, + (250,134): 100, 117, 137, 158, 180, 199, 207, 208, 209, 210, 211, 214, + (250,146): 216, 216, 217, 217, 217, 217, 217, 217, 217, 217, 217, 218, + (250,158): 217, 217, 216, 215, 214, 214, 213, 214, 214, 216, 219, 222, + (250,170): 225, 226, 226, 226, 226, 226, 225, 224, 224, 223, 223, 223, + (250,182): 223, 223, 223, 223, 222, 222, 222, 222, 222, 223, 223, 224, + (250,194): 225, 226, 227, 227, 227, 227, 227, 226, 225, 225, 225, 225, + (250,206): 225, 224, 224, 223, 223, 220, 217, 213, 211, 210, 210, 210, + (250,218): 208, 205, 181, 159, 133, 113, 109, 118, 159, 184, 198, 203, + (250,230): 214, 216, 216, 214, 210, 196, 192, 191, 191, 191, 192, 190, + (250,242): 179, 164, 151, 89, 38, 11, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (250,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (250,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (250,299): 1, + (251,0): 81, 89, 107, 128, 144, 150, 155, 157, 157, 155, 156, 155, 154, + (251,13): 153, 153, 153, 155, 162, 169, 177, 179, 177, 169, 148, 110, + (251,25): 34, 27, 22, 15, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (251,44): 1, 1, 1, 1, 1, 1, 2, 5, 10, 18, 31, 59, 85, 108, 127, 140, + (251,60): 149, 153, 156, 158, 160, 161, 160, 159, 156, 149, 113, 79, + (251,72): 62, 59, 71, 115, 135, 143, 144, 143, 142, 142, 143, 144, 146, + (251,85): 147, 146, 140, 128, 107, 63, 41, 30, 27, 26, 33, 55, 98, 149, + (251,99): 196, 216, 216, 215, 213, 210, 207, 204, 200, 195, 189, 183, + (251,111): 180, 178, 178, 179, 184, 188, 191, 192, 193, 193, 193, 192, + (251,123): 190, 187, 179, 170, 159, 145, 130, 111, 102, 98, 99, 106, + (251,135): 126, 147, 169, 189, 203, 208, 209, 210, 211, 213, 215, 216, + (251,147): 216, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, 217, + (251,159): 216, 215, 214, 213, 213, 213, 214, 216, 219, 222, 225, 226, + (251,171): 226, 226, 226, 225, 224, 223, 223, 223, 223, 223, 223, 223, + (251,183): 222, 222, 221, 221, 220, 220, 220, 221, 221, 222, 223, 224, + (251,195): 225, 226, 227, 227, 227, 227, 226, 225, 225, 224, 224, 224, + (251,207): 224, 223, 223, 222, 219, 215, 212, 210, 210, 210, 209, 206, + (251,219): 199, 175, 145, 124, 113, 112, 146, 177, 193, 202, 209, 215, + (251,231): 216, 215, 211, 202, 193, 191, 191, 191, 192, 191, 183, 170, + (251,243): 151, 127, 52, 19, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (251,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (251,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (252,0): 81, 87, 106, 129, 145, 151, 156, 157, 157, 155, 156, 155, 154, + (252,13): 153, 153, 154, 155, 161, 169, 179, 182, 180, 175, 160, 129, + (252,25): 38, 22, 17, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (252,44): 1, 1, 1, 1, 1, 1, 1, 1, 2, 5, 10, 25, 46, 68, 91, 112, 129, + (252,61): 138, 145, 150, 154, 157, 158, 159, 158, 157, 139, 105, 74, + (252,73): 51, 45, 76, 112, 133, 144, 145, 145, 145, 146, 147, 149, 150, + (252,86): 149, 145, 136, 122, 81, 49, 31, 23, 22, 25, 32, 57, 97, 152, + (252,100): 205, 213, 216, 215, 212, 210, 206, 203, 199, 194, 187, 183, + (252,112): 181, 181, 181, 184, 189, 191, 192, 193, 193, 193, 192, 190, + (252,124): 187, 179, 169, 157, 144, 128, 109, 101, 99, 102, 111, 135, + (252,136): 157, 178, 195, 206, 209, 209, 210, 212, 214, 216, 216, 216, + (252,148): 216, 216, 216, 217, 217, 217, 217, 217, 217, 217, 216, 215, + (252,160): 214, 213, 212, 213, 213, 216, 219, 222, 224, 226, 226, 226, + (252,172): 225, 224, 223, 222, 222, 223, 223, 223, 223, 223, 222, 221, + (252,184): 220, 220, 220, 220, 220, 220, 220, 220, 221, 222, 223, 225, + (252,196): 226, 227, 227, 227, 226, 225, 225, 224, 224, 224, 224, 223, + (252,208): 223, 222, 220, 217, 213, 211, 210, 210, 209, 208, 203, 194, + (252,220): 161, 133, 119, 117, 126, 171, 190, 200, 206, 213, 216, 216, + (252,232): 212, 205, 196, 191, 191, 191, 191, 192, 187, 173, 158, 134, + (252,244): 91, 25, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (252,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (252,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (253,0): 81, 86, 106, 130, 146, 152, 156, 158, 157, 155, 156, 154, 154, + (253,13): 154, 154, 154, 155, 160, 167, 178, 183, 182, 180, 169, 144, + (253,25): 49, 22, 13, 10, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (253,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 6, 16, 32, 52, 75, 99, 114, + (253,62): 126, 135, 142, 149, 153, 155, 157, 158, 154, 132, 97, 60, 34, + (253,75): 39, 77, 111, 136, 145, 147, 148, 149, 150, 152, 153, 152, + (253,87): 149, 142, 131, 98, 61, 35, 20, 17, 20, 22, 31, 54, 98, 177, + (253,101): 203, 214, 217, 215, 212, 209, 206, 203, 199, 192, 187, 184, + (253,113): 183, 183, 184, 189, 191, 193, 193, 193, 193, 192, 190, 187, + (253,125): 179, 169, 156, 142, 126, 108, 101, 100, 106, 117, 143, 165, + (253,137): 185, 200, 208, 209, 210, 211, 213, 215, 216, 216, 216, 216, + (253,149): 216, 216, 216, 217, 217, 217, 217, 216, 216, 215, 214, 212, + (253,161): 212, 212, 213, 214, 218, 221, 224, 225, 226, 225, 224, 223, + (253,173): 222, 221, 221, 222, 223, 223, 223, 223, 222, 221, 220, 220, + (253,185): 220, 220, 220, 220, 220, 220, 220, 221, 221, 223, 225, 226, + (253,197): 227, 227, 227, 226, 225, 224, 224, 224, 223, 223, 223, 222, + (253,209): 221, 218, 214, 212, 210, 210, 209, 209, 206, 199, 184, 143, + (253,221): 125, 119, 126, 149, 189, 198, 205, 210, 215, 216, 213, 206, + (253,233): 198, 192, 191, 191, 191, 191, 190, 178, 162, 142, 108, 52, + (253,245): 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (253,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (253,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (254,0): 82, 87, 108, 132, 147, 153, 157, 158, 157, 156, 156, 155, 155, + (254,13): 155, 155, 155, 155, 157, 162, 173, 181, 182, 181, 174, 159, + (254,25): 69, 25, 8, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (254,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 7, 16, 31, 58, 78, 94, + (254,63): 108, 120, 133, 142, 149, 154, 156, 156, 151, 126, 86, 35, 18, + (254,76): 34, 73, 116, 143, 147, 149, 151, 152, 154, 156, 155, 153, + (254,88): 148, 140, 114, 78, 44, 19, 12, 13, 18, 23, 31, 48, 130, 182, + (254,102): 208, 217, 216, 215, 212, 209, 205, 201, 196, 191, 187, 186, + (254,114): 186, 187, 190, 191, 193, 193, 193, 193, 192, 190, 187, 178, + (254,126): 168, 155, 140, 124, 106, 101, 102, 110, 124, 150, 172, 191, + (254,138): 204, 209, 210, 211, 212, 214, 215, 216, 216, 216, 216, 216, + (254,150): 216, 216, 216, 216, 216, 216, 216, 215, 214, 213, 212, 212, + (254,162): 212, 213, 216, 220, 223, 225, 226, 226, 224, 223, 221, 221, + (254,174): 220, 221, 222, 223, 224, 224, 223, 221, 220, 220, 220, 220, + (254,186): 220, 220, 220, 220, 220, 220, 221, 222, 223, 225, 226, 227, + (254,198): 227, 227, 226, 225, 224, 223, 223, 223, 222, 222, 221, 220, + (254,210): 216, 212, 210, 210, 209, 209, 208, 204, 192, 167, 125, 121, + (254,222): 125, 143, 179, 199, 204, 209, 214, 216, 215, 208, 200, 193, + (254,234): 191, 191, 191, 191, 190, 185, 164, 152, 118, 70, 19, 1, 1, + (254,247): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (254,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (254,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (255,0): 83, 90, 113, 136, 147, 154, 157, 158, 157, 156, 156, 155, 156, + (255,13): 157, 157, 155, 155, 155, 157, 162, 178, 182, 182, 178, 165, + (255,25): 86, 31, 8, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (255,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 12, 23, 38, 54, + (255,64): 72, 95, 114, 130, 143, 151, 155, 154, 148, 124, 71, 14, 10, + (255,77): 22, 54, 106, 142, 147, 151, 153, 155, 156, 155, 153, 151, + (255,89): 147, 126, 99, 64, 32, 11, 7, 9, 14, 21, 28, 56, 122, 175, + (255,103): 208, 217, 216, 215, 213, 210, 206, 201, 198, 194, 191, 190, + (255,115): 190, 191, 192, 193, 193, 193, 193, 192, 190, 187, 178, 167, + (255,127): 153, 138, 121, 105, 102, 105, 115, 131, 158, 179, 196, 206, + (255,139): 210, 211, 211, 213, 214, 215, 216, 216, 216, 216, 216, 216, + (255,151): 216, 216, 216, 216, 216, 215, 214, 213, 212, 211, 212, 213, + (255,163): 215, 218, 222, 224, 225, 225, 224, 222, 220, 219, 219, 220, + (255,175): 222, 223, 224, 224, 224, 222, 221, 220, 220, 220, 220, 220, + (255,187): 220, 220, 220, 220, 220, 221, 222, 224, 226, 226, 227, 227, + (255,199): 226, 225, 223, 223, 222, 222, 222, 221, 221, 220, 216, 212, + (255,211): 210, 209, 209, 209, 208, 205, 191, 167, 134, 125, 127, 150, + (255,223): 179, 198, 205, 211, 214, 215, 215, 208, 198, 193, 192, 191, + (255,235): 191, 191, 189, 181, 167, 153, 119, 69, 23, 2, 1, 1, 1, 1, 1, + (255,250): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (255,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (255,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (256,0): 84, 95, 117, 139, 148, 155, 158, 158, 157, 156, 156, 156, 157, + (256,13): 158, 159, 157, 156, 155, 155, 158, 172, 180, 182, 179, 171, + (256,25): 98, 37, 10, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (256,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, 14, 23, + (256,64): 36, 60, 83, 106, 127, 141, 151, 153, 150, 134, 97, 22, 9, 9, + (256,78): 23, 52, 108, 133, 145, 151, 154, 155, 154, 152, 150, 146, + (256,90): 129, 103, 71, 38, 13, 6, 6, 9, 13, 22, 40, 79, 136, 187, 212, + (256,105): 216, 216, 215, 213, 210, 204, 201, 198, 195, 193, 193, 193, + (256,117): 193, 194, 194, 194, 193, 192, 190, 187, 178, 166, 153, 137, + (256,129): 120, 105, 103, 108, 119, 135, 162, 183, 198, 208, 210, 211, + (256,141): 212, 213, 214, 215, 216, 216, 216, 216, 216, 216, 216, 216, + (256,153): 216, 216, 216, 215, 214, 213, 211, 211, 212, 213, 215, 219, + (256,165): 223, 224, 224, 224, 223, 220, 219, 218, 219, 220, 223, 224, + (256,177): 224, 224, 224, 222, 221, 221, 220, 220, 220, 220, 220, 220, + (256,189): 220, 220, 221, 222, 224, 225, 226, 226, 226, 226, 225, 223, + (256,201): 222, 222, 221, 221, 221, 221, 219, 216, 212, 210, 209, 209, + (256,213): 208, 208, 206, 193, 169, 146, 132, 129, 151, 174, 194, 204, + (256,225): 210, 213, 215, 214, 211, 199, 194, 192, 192, 191, 191, 188, + (256,237): 180, 169, 159, 128, 76, 35, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (256,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (256,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (256,294): 1, 1, 1, 1, 1, 1, + (257,0): 85, 99, 122, 142, 149, 157, 159, 159, 157, 156, 156, 157, 158, + (257,13): 159, 159, 159, 157, 155, 155, 156, 166, 177, 182, 180, 174, + (257,25): 106, 42, 12, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (257,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 4, 8, + (257,64): 14, 30, 51, 77, 103, 127, 144, 148, 148, 137, 109, 28, 10, 3, + (257,78): 7, 19, 61, 97, 124, 141, 149, 152, 152, 150, 146, 142, 127, + (257,91): 105, 75, 42, 14, 6, 5, 6, 8, 13, 27, 52, 98, 151, 199, 214, + (257,106): 216, 215, 214, 213, 208, 204, 201, 199, 197, 195, 195, 195, + (257,118): 194, 194, 194, 194, 193, 190, 187, 177, 166, 152, 136, 119, + (257,130): 105, 104, 110, 122, 138, 165, 185, 200, 208, 211, 211, 212, + (257,142): 213, 214, 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, + (257,154): 216, 215, 214, 213, 212, 211, 211, 212, 213, 216, 219, 223, + (257,166): 223, 223, 223, 221, 218, 217, 217, 218, 220, 224, 224, 224, + (257,178): 224, 224, 223, 222, 222, 221, 220, 220, 220, 220, 220, 221, + (257,190): 222, 223, 224, 225, 226, 226, 226, 225, 224, 223, 221, 221, + (257,202): 221, 221, 221, 220, 218, 215, 212, 210, 208, 208, 208, 208, + (257,214): 206, 194, 172, 152, 138, 133, 148, 174, 192, 203, 208, 213, + (257,226): 214, 213, 210, 203, 194, 192, 192, 192, 192, 189, 181, 171, + (257,238): 158, 141, 86, 40, 13, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (257,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (257,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (257,296): 1, 1, 1, 1, + (258,0): 87, 104, 126, 144, 150, 158, 159, 159, 157, 156, 156, 157, + (258,12): 159, 160, 160, 159, 159, 157, 155, 155, 161, 174, 181, 181, + (258,24): 175, 111, 46, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (258,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (258,62): 1, 2, 3, 10, 24, 45, 71, 100, 126, 135, 137, 129, 107, 31, + (258,76): 10, 2, 2, 3, 20, 54, 87, 116, 136, 143, 145, 144, 141, 137, + (258,90): 122, 104, 75, 44, 14, 5, 5, 4, 5, 6, 17, 34, 65, 112, 175, + (258,105): 210, 214, 216, 215, 214, 212, 207, 205, 202, 200, 197, 197, + (258,117): 196, 195, 195, 194, 194, 193, 191, 187, 178, 166, 151, 135, + (258,129): 117, 106, 106, 112, 124, 141, 167, 187, 200, 209, 211, 212, + (258,141): 212, 213, 214, 215, 215, 216, 216, 216, 216, 216, 216, 216, + (258,153): 216, 216, 215, 214, 213, 212, 211, 211, 212, 213, 216, 219, + (258,165): 222, 222, 222, 221, 219, 216, 216, 216, 217, 220, 224, 225, + (258,177): 225, 225, 225, 224, 223, 223, 222, 222, 221, 221, 221, 222, + (258,189): 222, 224, 225, 225, 226, 226, 226, 225, 224, 222, 221, 220, + (258,201): 220, 220, 220, 219, 217, 214, 211, 209, 208, 208, 208, 207, + (258,213): 204, 198, 174, 152, 142, 140, 144, 174, 193, 203, 209, 212, + (258,225): 214, 213, 210, 204, 196, 192, 192, 192, 191, 190, 182, 171, + (258,237): 159, 140, 109, 41, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (258,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (258,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (258,294): 1, 1, 1, 1, 1, 1, + (259,0): 87, 110, 131, 147, 151, 158, 160, 159, 157, 156, 156, 158, + (259,12): 159, 160, 160, 160, 159, 158, 156, 155, 158, 171, 179, 181, + (259,24): 177, 115, 48, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (259,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (259,62): 1, 1, 1, 2, 5, 14, 30, 54, 94, 107, 111, 105, 92, 29, 10, 2, + (259,78): 1, 1, 3, 13, 37, 71, 108, 126, 133, 134, 132, 129, 116, 98, + (259,92): 73, 43, 13, 4, 4, 4, 4, 4, 7, 21, 45, 81, 134, 201, 211, 215, + (259,108): 216, 215, 214, 211, 207, 204, 203, 199, 198, 198, 197, 196, + (259,120): 195, 194, 193, 191, 187, 178, 166, 151, 134, 117, 107, 108, + (259,132): 114, 126, 143, 169, 187, 201, 209, 211, 212, 213, 213, 214, + (259,144): 215, 215, 216, 216, 216, 216, 216, 216, 216, 216, 216, 215, + (259,156): 214, 213, 212, 211, 211, 212, 213, 216, 219, 221, 221, 221, + (259,168): 220, 218, 215, 215, 215, 216, 220, 224, 225, 225, 225, 225, + (259,180): 225, 225, 224, 224, 224, 224, 224, 224, 225, 225, 225, 226, + (259,192): 226, 226, 226, 225, 223, 222, 221, 220, 220, 220, 219, 217, + (259,204): 216, 212, 210, 208, 208, 208, 208, 207, 205, 196, 178, 149, + (259,216): 144, 142, 148, 168, 197, 205, 209, 212, 214, 214, 210, 203, + (259,228): 196, 192, 192, 192, 191, 189, 184, 171, 162, 144, 111, 58, + (259,240): 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (259,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (259,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (260,0): 89, 118, 138, 149, 152, 159, 161, 159, 157, 157, 157, 158, + (260,12): 159, 160, 160, 160, 160, 159, 157, 155, 157, 169, 178, 181, + (260,24): 177, 117, 48, 14, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (260,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (260,62): 1, 1, 1, 1, 2, 2, 4, 7, 24, 36, 39, 37, 30, 10, 4, 2, 1, 1, + (260,80): 1, 2, 6, 16, 39, 80, 97, 106, 108, 106, 95, 80, 55, 29, 7, 2, + (260,96): 2, 3, 3, 3, 4, 7, 21, 47, 88, 169, 200, 213, 216, 216, 215, + (260,111): 214, 210, 207, 205, 203, 201, 199, 198, 197, 195, 194, 193, + (260,123): 191, 188, 178, 166, 151, 134, 117, 108, 109, 116, 127, 143, + (260,135): 168, 186, 200, 209, 211, 212, 213, 213, 214, 214, 215, 215, + (260,147): 215, 216, 216, 216, 216, 216, 216, 216, 215, 214, 213, 211, + (260,159): 211, 211, 211, 213, 215, 218, 220, 220, 219, 218, 216, 214, + (260,171): 213, 213, 215, 219, 224, 225, 225, 225, 225, 225, 225, 225, + (260,183): 225, 225, 225, 225, 225, 225, 225, 225, 226, 225, 225, 224, + (260,195): 222, 220, 220, 219, 218, 217, 215, 214, 212, 210, 208, 208, + (260,207): 208, 208, 207, 205, 198, 183, 166, 152, 147, 148, 161, 180, + (260,219): 199, 209, 211, 213, 213, 213, 208, 200, 195, 192, 192, 192, + (260,231): 191, 186, 180, 172, 160, 136, 94, 48, 11, 1, 1, 1, 1, 1, 1, + (260,246): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (260,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (260,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (261,0): 91, 124, 143, 151, 153, 160, 161, 159, 157, 157, 157, 158, + (261,12): 159, 160, 160, 160, 160, 159, 157, 155, 157, 169, 178, 181, + (261,24): 177, 114, 46, 13, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (261,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (261,62): 1, 1, 1, 1, 1, 1, 2, 3, 8, 12, 13, 12, 10, 4, 2, 1, 1, 1, 1, + (261,81): 1, 3, 6, 14, 37, 59, 74, 81, 82, 74, 61, 41, 20, 5, 2, 2, 2, + (261,98): 3, 3, 3, 5, 13, 30, 61, 133, 182, 206, 214, 216, 216, 215, + (261,112): 213, 210, 206, 204, 202, 201, 200, 199, 196, 195, 193, 191, + (261,124): 188, 179, 167, 152, 135, 118, 109, 110, 117, 128, 143, 166, + (261,136): 184, 198, 208, 211, 212, 213, 213, 214, 214, 215, 215, 215, + (261,148): 215, 216, 216, 216, 216, 216, 216, 215, 214, 213, 212, 211, + (261,160): 211, 211, 212, 214, 217, 218, 218, 218, 217, 215, 212, 212, + (261,172): 212, 213, 216, 223, 224, 225, 225, 225, 225, 225, 225, 225, + (261,184): 225, 225, 225, 225, 225, 225, 224, 224, 222, 221, 220, 218, + (261,196): 217, 216, 215, 214, 213, 212, 210, 210, 209, 208, 208, 207, + (261,208): 205, 203, 190, 176, 165, 157, 152, 155, 168, 184, 199, 208, + (261,220): 211, 212, 213, 212, 208, 199, 195, 193, 192, 192, 189, 185, + (261,232): 179, 172, 163, 133, 90, 50, 19, 4, 1, 1, 1, 1, 1, 1, 1, 1, + (261,248): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (261,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (261,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (262,0): 94, 129, 147, 153, 154, 160, 161, 160, 158, 157, 157, 158, + (262,12): 159, 159, 160, 160, 160, 159, 157, 156, 157, 169, 178, 181, + (262,24): 176, 108, 43, 12, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (262,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (262,62): 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, + (262,82): 1, 2, 4, 13, 28, 41, 51, 56, 51, 41, 27, 13, 4, 1, 1, 1, 2, + (262,99): 3, 3, 4, 7, 18, 39, 101, 158, 194, 212, 215, 216, 216, 215, + (262,113): 212, 209, 206, 204, 203, 201, 200, 197, 195, 194, 192, 188, + (262,125): 180, 168, 153, 136, 119, 110, 111, 117, 127, 141, 163, 181, + (262,137): 196, 206, 211, 212, 213, 213, 214, 214, 215, 215, 215, 215, + (262,149): 215, 216, 216, 216, 216, 216, 215, 214, 213, 212, 211, 211, + (262,161): 211, 212, 213, 215, 217, 217, 217, 216, 215, 212, 211, 211, + (262,173): 211, 213, 220, 223, 224, 225, 225, 225, 225, 225, 224, 224, + (262,185): 224, 224, 223, 223, 222, 221, 220, 218, 217, 216, 215, 214, + (262,197): 213, 212, 212, 210, 210, 209, 208, 208, 207, 205, 201, 195, + (262,209): 187, 174, 165, 159, 157, 159, 174, 189, 201, 208, 211, 212, + (262,221): 212, 210, 206, 201, 195, 193, 192, 191, 189, 184, 179, 171, + (262,233): 159, 139, 89, 48, 21, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (262,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (262,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (262,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (263,0): 98, 133, 150, 155, 156, 161, 161, 160, 158, 157, 157, 158, + (263,12): 158, 159, 160, 160, 160, 159, 157, 156, 157, 170, 179, 181, + (263,24): 174, 100, 38, 10, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (263,42): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (263,62): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (263,82): 1, 1, 2, 3, 7, 16, 24, 30, 28, 23, 15, 8, 3, 1, 1, 1, 1, 2, + (263,100): 2, 3, 4, 9, 22, 72, 128, 175, 206, 214, 215, 216, 216, 215, + (263,114): 212, 208, 207, 205, 203, 201, 198, 196, 194, 192, 189, 181, + (263,126): 170, 155, 138, 120, 111, 112, 117, 127, 139, 160, 177, 192, + (263,138): 204, 210, 212, 213, 213, 214, 214, 214, 214, 215, 215, 215, + (263,150): 215, 216, 216, 216, 216, 215, 214, 213, 212, 211, 211, 211, + (263,162): 211, 212, 214, 216, 216, 216, 215, 214, 211, 210, 209, 209, + (263,174): 210, 216, 221, 223, 224, 225, 225, 224, 224, 223, 223, 222, + (263,186): 222, 221, 220, 219, 217, 216, 215, 214, 213, 212, 211, 211, + (263,198): 210, 210, 209, 208, 208, 207, 206, 202, 197, 190, 181, 171, + (263,210): 163, 161, 162, 166, 175, 195, 205, 210, 212, 212, 212, 209, + (263,222): 205, 200, 195, 193, 192, 191, 188, 185, 178, 171, 157, 134, + (263,234): 99, 42, 17, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (263,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (263,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (263,293): 1, 1, 1, 1, 1, 1, 1, + (264,0): 102, 136, 151, 156, 157, 161, 161, 160, 158, 157, 157, 157, + (264,12): 158, 159, 159, 159, 159, 159, 157, 156, 158, 172, 180, 180, + (264,24): 171, 87, 32, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (264,43): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (264,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (264,83): 1, 1, 1, 2, 3, 5, 8, 9, 7, 5, 3, 2, 1, 1, 1, 1, 1, 2, 2, 3, + (264,103): 4, 7, 44, 98, 154, 197, 212, 215, 216, 216, 216, 216, 211, + (264,116): 209, 207, 205, 202, 200, 196, 194, 192, 190, 182, 171, 157, + (264,128): 140, 122, 113, 113, 117, 125, 137, 156, 172, 188, 200, 208, + (264,140): 211, 213, 213, 214, 214, 214, 214, 214, 215, 215, 215, 215, + (264,152): 215, 215, 215, 215, 215, 214, 213, 212, 211, 211, 211, 212, + (264,164): 213, 214, 215, 215, 214, 214, 211, 209, 208, 208, 208, 210, + (264,176): 216, 220, 223, 224, 224, 224, 223, 222, 222, 220, 219, 218, + (264,188): 217, 216, 214, 213, 212, 212, 211, 211, 210, 210, 209, 209, + (264,200): 208, 207, 206, 204, 200, 190, 181, 174, 168, 164, 163, 164, + (264,212): 172, 184, 200, 210, 211, 212, 212, 212, 209, 203, 198, 195, + (264,224): 193, 192, 190, 187, 183, 179, 172, 159, 130, 91, 45, 9, 3, + (264,237): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (264,257): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (264,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (264,297): 1, 1, 1, + (265,0): 108, 137, 152, 157, 158, 162, 162, 161, 159, 157, 157, 157, + (265,12): 158, 158, 159, 159, 159, 158, 157, 156, 160, 175, 181, 177, + (265,24): 162, 65, 22, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (265,43): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (265,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (265,83): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, + (265,103): 3, 5, 19, 58, 113, 168, 206, 214, 215, 216, 217, 217, 215, + (265,116): 212, 210, 208, 205, 201, 198, 195, 193, 191, 184, 174, 160, + (265,128): 144, 126, 114, 114, 117, 124, 133, 149, 164, 180, 193, 203, + (265,140): 209, 211, 213, 213, 214, 214, 214, 214, 214, 214, 215, 215, + (265,152): 215, 215, 215, 215, 215, 214, 214, 213, 212, 211, 211, 211, + (265,164): 212, 213, 213, 213, 213, 213, 211, 209, 208, 206, 206, 205, + (265,176): 207, 211, 215, 218, 221, 222, 221, 221, 220, 219, 218, 217, + (265,188): 215, 214, 213, 212, 211, 211, 210, 210, 209, 208, 207, 206, + (265,200): 202, 197, 192, 185, 179, 173, 170, 169, 168, 167, 176, 189, + (265,212): 200, 207, 211, 212, 212, 211, 209, 206, 199, 196, 194, 193, + (265,224): 192, 188, 184, 180, 176, 170, 145, 105, 63, 28, 7, 1, 1, 1, + (265,238): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (265,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (265,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (265,298): 1, 1, + (266,0): 111, 138, 152, 158, 159, 162, 162, 161, 159, 158, 157, 158, + (266,12): 158, 158, 159, 159, 159, 158, 157, 157, 164, 178, 182, 173, + (266,24): 146, 47, 15, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (266,43): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (266,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (266,83): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + (266,103): 2, 3, 12, 38, 83, 138, 194, 212, 214, 215, 216, 217, 216, + (266,116): 214, 212, 210, 206, 202, 198, 196, 193, 192, 185, 176, 163, + (266,128): 148, 130, 116, 115, 117, 123, 131, 144, 157, 172, 186, 197, + (266,140): 205, 209, 212, 213, 213, 214, 214, 214, 214, 214, 214, 215, + (266,152): 215, 215, 215, 215, 215, 215, 214, 213, 212, 212, 211, 211, + (266,164): 212, 212, 212, 212, 212, 212, 211, 209, 208, 206, 205, 204, + (266,176): 204, 205, 207, 209, 212, 214, 216, 216, 217, 216, 215, 215, + (266,188): 214, 213, 211, 210, 209, 208, 207, 205, 203, 200, 197, 194, + (266,200): 188, 184, 181, 178, 175, 172, 172, 174, 179, 185, 196, 203, + (266,212): 208, 210, 211, 211, 209, 207, 204, 200, 196, 194, 192, 189, + (266,224): 187, 183, 180, 173, 161, 140, 92, 54, 27, 10, 2, 1, 1, 1, 1, + (266,239): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (266,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (266,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (266,299): 1, + (267,0): 115, 139, 152, 159, 160, 163, 163, 161, 160, 158, 158, 158, + (267,12): 158, 158, 158, 159, 158, 158, 157, 157, 169, 180, 181, 165, + (267,24): 124, 31, 10, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (267,43): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (267,63): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (267,83): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (267,103): 1, 2, 6, 23, 57, 107, 171, 208, 212, 214, 215, 217, 217, + (267,116): 216, 214, 211, 208, 203, 199, 196, 194, 192, 186, 178, 166, + (267,128): 152, 134, 118, 116, 118, 122, 128, 139, 151, 164, 178, 190, + (267,140): 200, 206, 209, 212, 213, 213, 214, 214, 214, 214, 214, 214, + (267,152): 214, 215, 215, 215, 215, 215, 214, 214, 213, 212, 212, 212, + (267,164): 212, 212, 212, 212, 212, 212, 211, 209, 208, 207, 205, 203, + (267,176): 203, 202, 203, 203, 205, 206, 207, 208, 209, 209, 208, 208, + (267,188): 207, 206, 205, 204, 202, 200, 199, 196, 193, 191, 188, 185, + (267,200): 181, 179, 177, 176, 176, 178, 181, 187, 193, 200, 207, 210, + (267,212): 211, 211, 210, 208, 205, 202, 199, 196, 193, 190, 188, 185, + (267,224): 182, 178, 169, 152, 127, 93, 45, 22, 8, 2, 1, 1, 1, 1, 1, 1, + (267,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (267,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (267,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,0): 118, 139, 152, 159, 161, 163, 163, 162, 160, 158, 158, 158, + (268,12): 158, 158, 158, 159, 158, 158, 157, 159, 175, 181, 178, 154, + (268,24): 96, 17, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,104): 1, 2, 12, 36, 77, 139, 200, 209, 213, 214, 216, 217, 216, + (268,117): 215, 213, 209, 204, 200, 197, 195, 193, 188, 180, 170, 156, + (268,129): 139, 121, 118, 118, 121, 126, 135, 144, 156, 168, 181, 194, + (268,141): 200, 205, 209, 212, 213, 213, 213, 213, 214, 214, 214, 214, + (268,153): 214, 214, 215, 215, 215, 215, 214, 214, 213, 213, 212, 212, + (268,165): 212, 212, 212, 212, 211, 211, 210, 209, 207, 206, 204, 203, + (268,177): 202, 201, 200, 200, 200, 200, 200, 200, 200, 200, 200, 199, + (268,189): 198, 197, 195, 194, 192, 190, 187, 185, 183, 182, 181, 179, + (268,201): 179, 179, 181, 183, 189, 195, 201, 206, 210, 212, 211, 210, + (268,213): 209, 207, 204, 200, 197, 195, 193, 189, 186, 184, 180, 177, + (268,225): 165, 145, 116, 81, 45, 13, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,242): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,262): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (268,282): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,0): 120, 140, 152, 159, 161, 164, 164, 163, 161, 158, 158, 158, + (269,12): 158, 158, 158, 159, 158, 157, 158, 161, 181, 182, 173, 138, + (269,24): 64, 8, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,104): 1, 2, 5, 19, 49, 102, 187, 204, 212, 214, 214, 216, 216, + (269,117): 215, 213, 211, 205, 201, 198, 196, 194, 189, 182, 173, 161, + (269,129): 145, 124, 120, 119, 121, 125, 132, 138, 147, 158, 171, 185, + (269,141): 193, 200, 205, 209, 212, 213, 213, 213, 213, 213, 213, 214, + (269,153): 214, 214, 214, 214, 214, 214, 214, 214, 214, 213, 213, 212, + (269,165): 212, 212, 212, 211, 211, 211, 210, 209, 208, 207, 204, 203, + (269,177): 202, 201, 200, 198, 198, 197, 196, 195, 194, 194, 193, 192, + (269,189): 191, 190, 189, 188, 187, 186, 184, 184, 183, 182, 181, 182, + (269,201): 184, 187, 192, 198, 205, 209, 211, 211, 212, 211, 209, 207, + (269,213): 205, 202, 199, 196, 193, 190, 187, 184, 182, 180, 175, 167, + (269,225): 138, 101, 63, 31, 10, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,243): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,263): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (269,283): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,0): 123, 140, 152, 159, 162, 164, 164, 164, 162, 160, 158, 158, + (270,12): 158, 158, 159, 159, 158, 158, 161, 170, 183, 181, 152, 100, + (270,24): 29, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,104): 1, 1, 3, 9, 25, 59, 145, 188, 207, 213, 214, 215, 215, 215, + (270,118): 214, 211, 207, 203, 200, 197, 195, 191, 186, 178, 167, 154, + (270,130): 132, 124, 121, 121, 124, 129, 133, 138, 146, 156, 170, 180, + (270,142): 188, 195, 201, 207, 210, 211, 212, 213, 213, 213, 213, 213, + (270,154): 213, 213, 214, 214, 214, 214, 214, 214, 214, 213, 213, 213, + (270,166): 212, 212, 212, 211, 211, 210, 210, 209, 208, 207, 205, 204, + (270,178): 202, 200, 199, 198, 197, 196, 195, 194, 193, 192, 192, 191, + (270,190): 190, 189, 188, 187, 187, 186, 187, 188, 191, 194, 199, 203, + (270,202): 207, 209, 210, 211, 211, 211, 210, 208, 206, 204, 202, 199, + (270,214): 197, 193, 190, 186, 184, 182, 179, 174, 164, 145, 114, 65, + (270,226): 34, 14, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (270,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,0): 124, 139, 151, 159, 162, 165, 165, 164, 163, 161, 159, 159, + (271,12): 159, 159, 159, 159, 158, 159, 164, 177, 181, 171, 124, 64, + (271,24): 12, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,104): 1, 1, 2, 5, 15, 36, 103, 165, 198, 211, 213, 214, 215, 215, + (271,118): 214, 212, 208, 205, 201, 199, 196, 192, 188, 181, 173, 162, + (271,130): 141, 129, 124, 122, 124, 128, 131, 134, 139, 146, 158, 167, + (271,142): 176, 184, 192, 200, 204, 207, 210, 211, 212, 212, 212, 212, + (271,154): 213, 213, 213, 213, 213, 214, 214, 214, 214, 213, 213, 213, + (271,166): 213, 213, 212, 212, 212, 211, 211, 210, 210, 209, 208, 206, + (271,178): 205, 204, 202, 201, 200, 198, 197, 196, 195, 195, 194, 194, + (271,190): 193, 194, 194, 195, 195, 197, 199, 201, 203, 205, 207, 209, + (271,202): 209, 210, 210, 210, 209, 208, 206, 205, 202, 200, 197, 194, + (271,214): 190, 186, 184, 182, 180, 177, 168, 150, 124, 93, 60, 26, 13, + (271,227): 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,247): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (271,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,0): 125, 139, 150, 158, 162, 165, 165, 165, 164, 162, 160, 159, + (272,12): 159, 160, 160, 158, 158, 162, 170, 180, 179, 148, 91, 35, 5, + (272,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,105): 1, 1, 2, 7, 18, 68, 134, 180, 207, 213, 214, 214, 214, 214, + (272,119): 213, 209, 206, 203, 200, 197, 194, 190, 185, 178, 169, 150, + (272,131): 137, 128, 124, 124, 127, 129, 132, 135, 139, 148, 156, 164, + (272,143): 172, 180, 190, 196, 201, 205, 208, 210, 211, 212, 212, 212, + (272,155): 212, 212, 212, 212, 213, 213, 213, 213, 213, 213, 213, 213, + (272,167): 213, 213, 213, 212, 212, 212, 212, 211, 210, 210, 209, 208, + (272,179): 207, 206, 205, 204, 203, 203, 202, 201, 201, 201, 201, 201, + (272,191): 202, 202, 203, 204, 206, 207, 208, 209, 210, 210, 210, 209, + (272,203): 209, 209, 207, 206, 204, 203, 200, 197, 194, 191, 187, 184, + (272,215): 181, 179, 176, 170, 161, 135, 107, 77, 48, 25, 7, 3, 1, 1, + (272,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (272,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,0): 126, 139, 149, 157, 162, 165, 165, 165, 164, 163, 161, 161, + (273,12): 161, 161, 160, 158, 160, 167, 175, 181, 170, 115, 57, 14, 2, + (273,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,105): 1, 1, 1, 3, 7, 39, 98, 155, 197, 211, 213, 214, 214, 214, + (273,119): 213, 210, 207, 204, 201, 199, 195, 192, 188, 182, 175, 160, + (273,131): 146, 135, 128, 126, 126, 129, 131, 133, 135, 140, 146, 152, + (273,143): 160, 167, 178, 185, 191, 197, 201, 206, 208, 210, 211, 211, + (273,155): 211, 211, 212, 212, 212, 212, 212, 213, 213, 213, 213, 213, + (273,167): 213, 213, 213, 213, 213, 212, 212, 212, 212, 211, 211, 211, + (273,179): 211, 210, 209, 209, 209, 208, 208, 208, 208, 208, 208, 208, + (273,191): 209, 209, 209, 210, 210, 210, 210, 210, 210, 209, 209, 208, + (273,203): 207, 206, 204, 202, 200, 198, 195, 190, 187, 184, 181, 179, + (273,215): 176, 172, 163, 149, 128, 89, 59, 34, 16, 5, 1, 1, 1, 1, 1, + (273,230): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,250): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (273,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,0): 127, 138, 148, 156, 161, 164, 165, 165, 165, 164, 163, 163, + (274,12): 162, 161, 159, 159, 163, 172, 179, 178, 149, 72, 25, 3, 1, 1, + (274,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,106): 1, 1, 2, 3, 14, 61, 122, 177, 208, 213, 213, 214, 214, 214, + (274,120): 211, 209, 206, 203, 200, 196, 194, 190, 185, 180, 168, 156, + (274,132): 144, 134, 128, 128, 129, 130, 132, 133, 135, 138, 143, 148, + (274,144): 154, 164, 171, 179, 185, 192, 199, 203, 206, 208, 210, 210, + (274,156): 211, 211, 211, 211, 211, 211, 211, 212, 212, 212, 212, 212, + (274,168): 213, 213, 213, 213, 212, 212, 212, 212, 212, 212, 212, 212, + (274,180): 212, 212, 212, 211, 211, 211, 211, 211, 211, 211, 211, 211, + (274,192): 210, 210, 210, 210, 210, 209, 209, 208, 207, 206, 206, 204, + (274,204): 203, 201, 198, 194, 191, 187, 182, 180, 178, 177, 175, 169, + (274,216): 157, 136, 109, 76, 39, 18, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,233): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (274,293): 1, 1, 1, 1, 1, 1, 1, + (275,0): 127, 138, 147, 155, 160, 163, 164, 165, 165, 164, 164, 163, + (275,12): 161, 159, 159, 161, 170, 174, 172, 160, 76, 28, 6, 1, 1, 1, + (275,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,106): 1, 1, 1, 2, 7, 24, 70, 130, 191, 211, 213, 213, 214, 214, + (275,120): 212, 210, 208, 205, 202, 199, 196, 193, 189, 185, 178, 169, + (275,132): 158, 148, 138, 132, 131, 131, 132, 133, 135, 135, 137, 139, + (275,144): 142, 148, 154, 160, 167, 173, 182, 188, 193, 198, 202, 206, + (275,156): 208, 209, 209, 210, 210, 210, 210, 210, 210, 210, 211, 211, + (275,168): 211, 211, 211, 212, 212, 212, 212, 212, 212, 212, 212, 212, + (275,180): 212, 211, 211, 211, 211, 211, 211, 211, 210, 210, 210, 209, + (275,192): 209, 209, 208, 207, 207, 207, 206, 206, 204, 203, 200, 197, + (275,204): 194, 189, 185, 182, 179, 177, 176, 174, 171, 166, 156, 128, + (275,216): 100, 70, 42, 23, 5, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,234): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (275,294): 1, 1, 1, 1, 1, 1, + (276,0): 128, 138, 147, 153, 158, 163, 164, 164, 165, 164, 164, 162, + (276,12): 161, 160, 161, 167, 173, 171, 154, 111, 39, 15, 4, 1, 1, 1, + (276,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,106): 1, 1, 1, 1, 3, 13, 43, 89, 153, 204, 211, 213, 213, 213, + (276,120): 213, 211, 209, 207, 204, 201, 198, 195, 192, 188, 183, 176, + (276,132): 168, 159, 150, 140, 137, 135, 134, 134, 135, 136, 137, 138, + (276,144): 140, 143, 146, 150, 154, 160, 167, 173, 179, 184, 190, 196, + (276,156): 200, 203, 205, 207, 208, 209, 209, 209, 209, 209, 209, 209, + (276,168): 209, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, 210, + (276,180): 210, 210, 210, 210, 210, 209, 209, 209, 209, 209, 208, 208, + (276,192): 208, 207, 207, 206, 205, 204, 202, 200, 197, 194, 190, 187, + (276,204): 183, 179, 177, 175, 174, 172, 169, 162, 150, 133, 111, 77, + (276,216): 51, 31, 18, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,235): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,255): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (276,295): 1, 1, 1, 1, 1, + (277,0): 128, 139, 147, 152, 157, 161, 163, 164, 164, 164, 162, 161, + (277,12): 160, 161, 162, 170, 171, 156, 123, 73, 23, 10, 3, 1, 1, 1, 1, + (277,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,67): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,87): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,107): 1, 1, 1, 1, 6, 23, 56, 111, 185, 204, 212, 213, 213, 213, + (277,121): 212, 210, 208, 206, 203, 200, 197, 194, 191, 186, 182, 177, + (277,133): 170, 162, 152, 146, 143, 140, 138, 137, 138, 138, 139, 139, + (277,145): 141, 143, 145, 148, 151, 156, 161, 165, 170, 176, 183, 188, + (277,157): 192, 196, 199, 202, 204, 206, 207, 207, 208, 208, 208, 208, + (277,169): 208, 208, 208, 209, 209, 209, 209, 209, 209, 209, 209, 209, + (277,181): 209, 209, 208, 208, 208, 208, 207, 207, 207, 206, 206, 205, + (277,193): 204, 203, 200, 198, 196, 193, 190, 186, 183, 180, 177, 175, + (277,205): 173, 171, 169, 166, 161, 147, 131, 111, 89, 65, 36, 20, 11, + (277,218): 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,238): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (277,298): 1, 1, + (278,0): 129, 140, 147, 152, 155, 160, 162, 163, 164, 163, 161, 160, + (278,12): 161, 162, 164, 171, 162, 132, 91, 49, 19, 9, 3, 1, 1, 1, 1, + (278,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (278,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (278,67): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (278,87): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (278,107): 1, 1, 1, 1, 1, 10, 31, 69, 153, 190, 207, 212, 213, 213, + (278,121): 213, 211, 210, 208, 205, 202, 199, 197, 194, 190, 187, 183, + (278,133): 178, 173, 164, 158, 153, 149, 145, 142, 141, 141, 140, 141, + (278,145): 141, 142, 143, 145, 146, 149, 152, 155, 159, 163, 169, 174, + (278,157): 178, 183, 187, 193, 196, 199, 201, 203, 204, 205, 206, 206, + (278,169): 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, + (278,181): 207, 207, 206, 206, 206, 205, 205, 204, 203, 202, 200, 199, + (278,193): 197, 195, 191, 188, 185, 182, 179, 176, 173, 172, 170, 169, + (278,205): 166, 163, 157, 148, 136, 111, 88, 66, 45, 28, 9, 5, 3, 1, 1, + (278,220): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (278,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (278,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (278,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,0): 130, 141, 147, 151, 154, 159, 162, 163, 162, 160, 160, 161, + (279,12): 161, 163, 167, 169, 144, 107, 70, 44, 23, 11, 4, 1, 1, 1, 1, + (279,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,67): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,87): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,107): 1, 1, 1, 1, 1, 3, 12, 32, 108, 166, 198, 211, 213, 213, 213, + (279,122): 212, 211, 209, 207, 204, 201, 199, 196, 192, 190, 187, 185, + (279,134): 182, 175, 170, 166, 162, 158, 153, 150, 147, 145, 143, 142, + (279,146): 142, 143, 144, 145, 146, 149, 150, 152, 154, 158, 161, 165, + (279,158): 169, 172, 178, 182, 186, 190, 193, 197, 199, 201, 203, 204, + (279,170): 204, 205, 205, 205, 205, 205, 205, 205, 204, 204, 204, 204, + (279,182): 203, 203, 202, 201, 200, 199, 197, 196, 193, 190, 188, 185, + (279,194): 182, 178, 175, 173, 171, 169, 168, 167, 166, 165, 163, 157, + (279,206): 147, 132, 114, 91, 61, 41, 26, 15, 5, 1, 1, 1, 1, 1, 1, 1, + (279,222): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,242): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,262): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (279,282): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,0): 131, 142, 148, 151, 153, 159, 160, 159, 159, 160, 161, 159, + (280,12): 159, 162, 170, 155, 117, 90, 70, 52, 25, 12, 5, 1, 1, 1, 1, + (280,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,67): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,87): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,107): 1, 1, 1, 1, 1, 1, 3, 10, 48, 109, 163, 200, 211, 212, 213, + (280,122): 213, 212, 211, 209, 207, 204, 202, 199, 196, 193, 191, 190, + (280,134): 188, 185, 182, 179, 177, 175, 172, 169, 166, 163, 159, 154, + (280,146): 151, 148, 146, 146, 146, 148, 149, 150, 152, 154, 155, 157, + (280,158): 158, 160, 162, 165, 167, 169, 172, 175, 178, 181, 184, 186, + (280,170): 189, 191, 192, 194, 194, 195, 195, 195, 195, 194, 194, 192, + (280,182): 191, 190, 188, 186, 184, 182, 180, 178, 175, 173, 171, 169, + (280,194): 167, 166, 165, 164, 164, 163, 161, 158, 153, 144, 131, 107, + (280,206): 87, 68, 49, 31, 13, 9, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,224): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (280,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,0): 131, 143, 149, 151, 153, 158, 158, 159, 160, 161, 159, 157, + (281,12): 161, 167, 168, 131, 108, 95, 83, 65, 32, 16, 6, 1, 1, 1, 1, + (281,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,67): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,87): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,107): 1, 1, 1, 1, 1, 1, 1, 3, 24, 68, 121, 170, 203, 211, 212, + (281,122): 212, 212, 212, 210, 209, 206, 204, 202, 198, 196, 194, 192, + (281,134): 191, 190, 188, 186, 184, 183, 181, 180, 178, 176, 174, 171, + (281,146): 168, 164, 161, 157, 152, 151, 150, 150, 151, 153, 154, 155, + (281,158): 156, 158, 160, 161, 162, 164, 165, 167, 168, 169, 170, 172, + (281,170): 173, 174, 175, 177, 177, 178, 179, 179, 180, 180, 179, 179, + (281,182): 178, 177, 176, 174, 173, 171, 170, 168, 166, 165, 164, 163, + (281,194): 163, 162, 161, 159, 156, 152, 141, 129, 115, 100, 83, 60, + (281,206): 45, 32, 20, 10, 5, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (281,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,0): 133, 144, 149, 151, 153, 157, 158, 159, 160, 160, 156, 156, + (282,12): 164, 168, 158, 120, 113, 110, 105, 92, 52, 27, 11, 3, 1, 1, + (282,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,106): 1, 1, 1, 1, 1, 1, 1, 1, 1, 9, 35, 79, 130, 180, 207, 210, + (282,122): 212, 212, 212, 211, 210, 208, 206, 204, 201, 199, 196, 194, + (282,134): 193, 192, 191, 191, 190, 188, 188, 187, 186, 186, 185, 183, + (282,146): 181, 178, 176, 172, 167, 163, 160, 157, 155, 155, 155, 155, + (282,158): 156, 157, 158, 159, 160, 161, 162, 163, 163, 164, 164, 165, + (282,170): 165, 166, 166, 166, 167, 167, 167, 168, 168, 167, 167, 167, + (282,182): 166, 166, 165, 164, 163, 163, 162, 161, 160, 159, 159, 158, + (282,194): 157, 153, 148, 142, 134, 123, 105, 90, 73, 57, 43, 27, 19, + (282,207): 12, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,227): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,247): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (282,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,0): 134, 145, 149, 151, 153, 157, 159, 161, 161, 157, 154, 160, + (283,12): 168, 166, 144, 121, 127, 130, 130, 123, 84, 49, 23, 7, 1, 1, + (283,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,106): 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 12, 41, 85, 143, 194, 206, + (283,122): 211, 212, 212, 212, 211, 210, 208, 207, 204, 202, 199, 197, + (283,134): 195, 194, 193, 193, 193, 192, 192, 192, 192, 191, 191, 191, + (283,146): 190, 189, 188, 186, 183, 179, 175, 171, 166, 162, 161, 159, + (283,158): 159, 158, 159, 159, 160, 161, 161, 162, 162, 163, 163, 163, + (283,170): 163, 163, 162, 162, 162, 162, 161, 161, 161, 160, 160, 159, + (283,182): 159, 159, 158, 158, 158, 157, 157, 157, 156, 155, 154, 151, + (283,194): 148, 138, 128, 116, 102, 86, 65, 49, 35, 24, 15, 7, 5, 3, 1, + (283,209): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (283,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,0): 136, 146, 150, 151, 153, 157, 163, 163, 159, 153, 154, 169, + (284,12): 172, 160, 131, 135, 145, 150, 150, 148, 127, 82, 43, 15, 3, + (284,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 13, 42, 92, 166, 195, + (284,122): 208, 211, 212, 212, 212, 211, 210, 209, 207, 204, 202, 200, + (284,134): 197, 195, 195, 194, 194, 194, 195, 195, 195, 195, 195, 195, + (284,146): 195, 194, 194, 193, 193, 192, 191, 189, 186, 181, 177, 172, + (284,158): 168, 165, 162, 161, 161, 161, 162, 162, 163, 163, 163, 163, + (284,170): 163, 163, 163, 162, 162, 162, 161, 161, 160, 160, 159, 159, + (284,182): 158, 158, 158, 157, 156, 156, 155, 154, 153, 151, 147, 141, + (284,194): 133, 114, 99, 83, 66, 49, 29, 18, 11, 6, 2, 1, 1, 1, 1, 1, + (284,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,230): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,250): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (284,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,0): 137, 146, 150, 151, 154, 162, 164, 161, 156, 155, 168, 177, + (285,12): 163, 144, 135, 153, 155, 155, 153, 151, 146, 127, 86, 41, 10, + (285,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 10, 30, 96, 151, 187, + (285,123): 207, 211, 211, 212, 212, 211, 210, 209, 208, 206, 204, 202, + (285,135): 199, 197, 196, 195, 195, 195, 196, 196, 196, 196, 196, 196, + (285,147): 197, 197, 197, 197, 197, 197, 197, 196, 195, 193, 192, 190, + (285,159): 187, 184, 181, 179, 176, 174, 172, 171, 171, 170, 170, 170, + (285,171): 169, 169, 169, 168, 167, 167, 166, 166, 165, 164, 163, 163, + (285,183): 162, 161, 160, 159, 157, 156, 154, 150, 144, 134, 120, 102, + (285,195): 77, 60, 44, 30, 18, 8, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,213): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,233): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (285,293): 1, 1, 1, 1, 1, 1, 1, + (286,0): 138, 146, 150, 153, 158, 167, 164, 160, 158, 162, 179, 179, + (286,12): 159, 140, 144, 157, 157, 156, 153, 150, 147, 139, 110, 69, + (286,24): 22, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 12, 49, 97, + (286,122): 145, 185, 206, 211, 211, 212, 212, 212, 210, 209, 208, 207, + (286,134): 205, 203, 201, 199, 198, 197, 196, 196, 196, 196, 196, 196, + (286,146): 197, 197, 197, 198, 198, 198, 198, 198, 198, 198, 197, 197, + (286,158): 196, 196, 194, 193, 191, 190, 189, 187, 185, 184, 183, 183, + (286,170): 182, 181, 181, 180, 180, 179, 178, 178, 177, 177, 175, 174, + (286,182): 172, 170, 169, 165, 162, 159, 156, 152, 144, 132, 115, 96, + (286,194): 76, 52, 37, 24, 14, 7, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,212): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,232): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,272): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (286,292): 1, 1, 1, 1, 1, 1, 1, 1, + (287,0): 139, 147, 150, 154, 162, 169, 163, 161, 164, 174, 184, 174, + (287,12): 154, 140, 151, 160, 160, 157, 153, 149, 146, 143, 125, 91, + (287,24): 38, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 20, 53, 97, + (287,123): 143, 183, 207, 210, 211, 212, 212, 211, 211, 210, 209, 208, + (287,135): 206, 205, 203, 201, 200, 199, 199, 198, 198, 197, 197, 197, + (287,147): 198, 198, 198, 199, 199, 199, 199, 199, 199, 199, 199, 199, + (287,159): 200, 199, 199, 198, 198, 198, 197, 196, 195, 194, 193, 192, + (287,171): 191, 191, 190, 189, 188, 187, 186, 185, 184, 181, 179, 177, + (287,183): 174, 171, 167, 162, 157, 150, 141, 123, 105, 86, 67, 50, 31, + (287,196): 20, 11, 5, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,215): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,235): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,255): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (287,295): 1, 1, 1, 1, 1, + (288,0): 141, 147, 151, 156, 166, 170, 163, 164, 171, 185, 186, 166, + (288,12): 149, 142, 156, 163, 162, 157, 152, 147, 145, 143, 134, 107, + (288,24): 54, 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 21, 51, + (288,123): 92, 141, 189, 202, 209, 211, 211, 212, 211, 211, 210, 210, + (288,135): 209, 207, 206, 205, 204, 203, 202, 201, 200, 200, 199, 199, + (288,147): 199, 199, 200, 200, 200, 201, 201, 201, 200, 200, 201, 201, + (288,159): 201, 201, 201, 202, 202, 202, 202, 202, 202, 201, 201, 200, + (288,171): 199, 198, 197, 196, 194, 193, 191, 189, 186, 182, 179, 176, + (288,183): 172, 167, 159, 151, 142, 131, 116, 91, 72, 54, 39, 26, 15, + (288,196): 9, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,216): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,236): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (288,296): 1, 1, 1, 1, + (289,0): 143, 148, 152, 158, 170, 169, 164, 168, 177, 188, 186, 157, + (289,12): 145, 147, 159, 164, 163, 157, 151, 145, 143, 142, 137, 117, + (289,24): 70, 13, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 19, + (289,123): 44, 82, 147, 184, 203, 210, 210, 211, 212, 211, 211, 211, + (289,135): 210, 210, 209, 208, 207, 206, 205, 204, 203, 202, 202, 202, + (289,147): 202, 202, 202, 203, 203, 203, 203, 202, 202, 202, 202, 202, + (289,159): 201, 201, 202, 202, 203, 203, 204, 204, 204, 204, 204, 204, + (289,171): 203, 201, 200, 198, 195, 193, 190, 187, 184, 179, 175, 169, + (289,183): 162, 154, 137, 123, 107, 90, 73, 52, 37, 25, 15, 8, 5, 3, 1, + (289,198): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,218): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,238): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (289,298): 1, 1, + (290,0): 144, 148, 155, 163, 173, 166, 165, 173, 184, 189, 181, 150, + (290,12): 141, 147, 160, 161, 155, 149, 144, 143, 143, 142, 138, 122, + (290,24): 83, 19, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 10, + (290,124): 26, 68, 110, 150, 183, 204, 210, 211, 212, 212, 212, 212, + (290,136): 212, 211, 211, 211, 211, 211, 210, 210, 210, 209, 209, 208, + (290,148): 208, 208, 207, 207, 207, 206, 206, 205, 204, 203, 203, 202, + (290,160): 202, 202, 202, 203, 203, 203, 204, 204, 205, 205, 203, 201, + (290,172): 198, 195, 191, 185, 180, 172, 164, 154, 140, 128, 115, 102, + (290,184): 88, 71, 58, 44, 32, 23, 14, 10, 6, 2, 1, 1, 1, 1, 1, 1, 1, + (290,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (290,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,0): 144, 149, 157, 166, 173, 164, 165, 176, 187, 190, 173, 147, + (291,12): 141, 146, 155, 151, 147, 144, 143, 142, 141, 140, 137, 123, + (291,24): 88, 21, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, + (291,124): 9, 32, 60, 93, 127, 159, 189, 200, 206, 209, 211, 211, 212, + (291,137): 212, 212, 212, 212, 211, 211, 211, 211, 211, 211, 210, 210, + (291,149): 210, 209, 209, 208, 208, 207, 206, 205, 205, 204, 203, 202, + (291,161): 202, 202, 202, 203, 203, 202, 202, 201, 198, 191, 185, 178, + (291,173): 170, 161, 148, 138, 127, 116, 105, 89, 78, 67, 56, 45, 35, + (291,186): 26, 19, 13, 8, 5, 3, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (291,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,0): 146, 150, 159, 167, 170, 162, 167, 179, 189, 189, 164, 144, + (292,12): 139, 143, 146, 144, 142, 142, 141, 141, 139, 139, 136, 123, + (292,24): 90, 23, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,124): 2, 11, 27, 48, 74, 104, 140, 161, 177, 189, 198, 204, 206, + (292,137): 208, 209, 209, 210, 210, 210, 210, 210, 210, 210, 210, 210, + (292,149): 209, 209, 209, 208, 208, 207, 206, 205, 204, 203, 202, 201, + (292,161): 201, 201, 201, 200, 199, 196, 192, 186, 178, 164, 154, 143, + (292,173): 131, 119, 103, 91, 80, 70, 60, 48, 39, 31, 24, 19, 13, 8, 6, + (292,188): 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,208): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,228): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,248): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (292,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,0): 147, 151, 159, 166, 166, 160, 170, 181, 190, 188, 156, 141, + (293,12): 138, 139, 139, 140, 141, 141, 140, 139, 138, 137, 135, 122, + (293,24): 90, 23, 8, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,124): 1, 1, 7, 18, 33, 52, 83, 106, 128, 147, 163, 176, 183, 188, + (293,138): 192, 195, 197, 199, 200, 201, 201, 202, 202, 202, 203, 203, + (293,150): 203, 203, 203, 203, 203, 202, 201, 201, 200, 199, 197, 196, + (293,162): 195, 193, 190, 184, 177, 168, 157, 144, 126, 112, 99, 86, + (293,174): 74, 59, 49, 40, 32, 25, 19, 14, 9, 6, 5, 2, 1, 1, 1, 1, 1, + (293,191): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,211): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (293,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,0): 147, 152, 160, 165, 162, 159, 174, 184, 189, 184, 148, 139, + (294,12): 136, 136, 137, 141, 141, 140, 139, 137, 137, 136, 133, 120, + (294,24): 87, 22, 7, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,124): 1, 1, 1, 3, 8, 17, 34, 50, 66, 81, 96, 115, 128, 139, 149, + (294,139): 157, 165, 169, 172, 175, 178, 180, 182, 184, 186, 188, 189, + (294,151): 190, 191, 192, 192, 192, 192, 191, 190, 189, 187, 184, 179, + (294,163): 174, 166, 153, 140, 126, 112, 98, 80, 67, 55, 43, 33, 24, + (294,176): 18, 12, 8, 5, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,195): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,215): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,235): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,255): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (294,295): 1, 1, 1, 1, 1, + (295,0): 147, 152, 157, 159, 155, 159, 180, 187, 183, 172, 142, 137, + (295,12): 136, 138, 141, 141, 141, 140, 138, 137, 136, 136, 132, 115, + (295,24): 77, 17, 6, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,124): 1, 1, 1, 1, 1, 2, 6, 11, 18, 24, 31, 37, 41, 45, 50, 54, 60, + (295,141): 64, 67, 71, 74, 78, 81, 85, 89, 93, 100, 104, 108, 112, 115, + (295,155): 119, 121, 122, 122, 121, 117, 112, 106, 99, 91, 79, 70, 60, + (295,168): 50, 41, 30, 23, 17, 11, 6, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,186): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,206): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,226): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,246): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (295,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,0): 145, 151, 154, 154, 152, 168, 183, 184, 176, 163, 141, 139, + (296,12): 139, 141, 142, 142, 141, 140, 140, 138, 137, 136, 130, 110, + (296,24): 67, 13, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,124): 1, 1, 1, 1, 1, 1, 2, 4, 6, 9, 11, 14, 15, 17, 18, 20, 22, + (296,141): 23, 25, 26, 28, 30, 31, 33, 35, 38, 41, 44, 47, 50, 53, 56, + (296,156): 58, 60, 61, 61, 59, 56, 53, 49, 45, 38, 33, 27, 22, 17, 11, + (296,171): 8, 6, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,191): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,211): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (296,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,0): 142, 148, 150, 150, 153, 177, 183, 178, 167, 154, 141, 141, + (297,12): 142, 143, 142, 142, 142, 142, 142, 141, 139, 137, 128, 103, + (297,24): 55, 9, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,124): 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 4, 4, 4, 4, 5, 5, 6, 6, + (297,144): 7, 8, 8, 9, 10, 11, 12, 14, 15, 17, 18, 20, 21, 22, 23, 23, + (297,160): 23, 22, 20, 19, 17, 14, 11, 9, 7, 5, 3, 2, 1, 1, 1, 1, 1, 1, + (297,178): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,198): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,218): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,238): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,258): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,278): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (297,298): 1, 1, + (298,0): 138, 144, 147, 150, 158, 182, 179, 169, 157, 148, 143, 144, + (298,12): 143, 143, 143, 143, 145, 145, 145, 143, 141, 137, 123, 93, + (298,24): 43, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,124): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,144): 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 5, 5, 5, 5, 4, 4, + (298,164): 3, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,184): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,204): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,224): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (298,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,0): 138, 142, 145, 153, 171, 181, 171, 159, 150, 145, 145, 144, + (299,12): 143, 143, 143, 146, 148, 149, 148, 146, 143, 138, 117, 81, + (299,24): 31, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,124): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,144): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,164): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,184): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,204): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,224): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (299,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,0): 139, 143, 151, 162, 175, 168, 157, 150, 146, 145, 145, 143, + (300,12): 144, 146, 150, 156, 157, 155, 153, 149, 145, 136, 104, 62, + (300,24): 18, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,44): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,64): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,84): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,104): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,124): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,144): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,164): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,184): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,204): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,224): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,244): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,264): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (300,284): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,0): 142, 148, 158, 167, 170, 157, 150, 147, 146, 145, 143, 144, + (301,12): 148, 153, 157, 159, 158, 156, 153, 150, 146, 130, 92, 47, 12, + (301,25): 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (301,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,0): 145, 153, 161, 165, 159, 149, 147, 146, 145, 144, 143, 149, + (302,12): 154, 158, 160, 160, 159, 157, 154, 152, 146, 120, 78, 35, 7, + (302,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (302,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,0): 148, 157, 160, 158, 148, 145, 145, 145, 145, 144, 146, 155, + (303,12): 158, 159, 159, 159, 158, 157, 155, 153, 143, 108, 64, 24, 4, + (303,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (303,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,0): 148, 157, 154, 147, 143, 144, 145, 145, 145, 144, 155, 158, + (304,12): 157, 156, 155, 157, 157, 157, 156, 153, 139, 93, 49, 15, 3, + (304,25): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,45): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,65): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,85): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,105): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,125): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,145): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,165): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,185): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,205): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,225): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,245): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,265): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (304,285): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,0): 148, 148, 143, 138, 143, 144, 145, 144, 145, 148, 159, 153, + (305,12): 151, 150, 151, 153, 155, 156, 155, 151, 118, 68, 30, 7, 1, 1, + (305,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,106): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,146): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,166): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,186): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,206): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,226): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,246): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (305,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,0): 143, 139, 137, 138, 143, 144, 145, 145, 147, 153, 155, 151, + (306,12): 149, 149, 150, 151, 152, 152, 149, 141, 92, 47, 18, 4, 1, 1, + (306,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,106): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,146): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,166): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,186): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,206): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,226): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,246): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (306,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,0): 138, 134, 135, 138, 143, 145, 145, 145, 148, 154, 152, 150, + (307,12): 149, 149, 149, 149, 149, 147, 138, 121, 65, 29, 10, 2, 1, 1, + (307,26): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,46): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,66): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,86): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,106): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,126): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,146): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,166): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,186): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,206): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,226): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,246): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,266): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (307,286): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,0): 134, 131, 134, 138, 143, 145, 145, 145, 148, 153, 151, 150, + (308,12): 149, 149, 148, 147, 145, 138, 123, 94, 40, 16, 4, 1, 1, 1, 1, + (308,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,67): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,87): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,107): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,127): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,167): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,187): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,207): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,227): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,247): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (308,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,0): 130, 130, 134, 139, 143, 145, 144, 145, 148, 151, 150, 150, + (309,12): 149, 149, 148, 146, 140, 126, 101, 64, 19, 7, 2, 1, 1, 1, 1, + (309,27): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,47): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,67): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,87): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,107): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,127): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,147): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,167): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,187): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,207): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,227): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,247): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,267): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (309,287): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,0): 128, 130, 134, 139, 144, 145, 144, 146, 149, 150, 151, 150, + (310,12): 150, 149, 148, 144, 129, 101, 67, 31, 6, 2, 1, 1, 1, 1, 1, 1, + (310,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,108): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,128): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,148): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,188): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,208): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,228): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,248): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (310,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,0): 128, 130, 134, 139, 144, 145, 144, 146, 149, 150, 151, 151, + (311,12): 150, 148, 147, 141, 115, 81, 46, 17, 3, 1, 1, 1, 1, 1, 1, 1, + (311,28): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,48): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,68): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,88): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,108): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,128): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,148): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,168): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,188): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,208): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,228): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,248): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,268): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (311,288): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,0): 128, 130, 134, 139, 144, 145, 144, 146, 148, 150, 151, 150, + (312,12): 149, 148, 146, 135, 99, 61, 29, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,29): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,69): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,89): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,109): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,129): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,149): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,169): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,209): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (312,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,0): 128, 130, 134, 139, 145, 145, 144, 146, 148, 150, 151, 150, + (313,12): 148, 147, 145, 126, 82, 44, 16, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,29): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,69): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,89): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,109): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,129): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,149): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,169): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,209): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (313,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,0): 128, 130, 134, 140, 145, 145, 145, 146, 148, 150, 150, 149, + (314,12): 148, 146, 143, 112, 64, 28, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,29): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,69): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,89): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,109): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,129): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,149): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,169): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,209): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (314,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,0): 128, 130, 134, 139, 145, 145, 145, 146, 147, 149, 149, 148, + (315,12): 146, 143, 137, 87, 39, 13, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,29): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,49): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,69): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,89): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,109): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,129): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,149): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,169): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,189): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,209): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,229): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,249): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,269): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (315,289): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,0): 128, 129, 133, 139, 145, 145, 145, 146, 147, 149, 148, 146, + (316,12): 144, 140, 129, 62, 25, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,110): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,130): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,150): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,170): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,190): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,230): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,250): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (316,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,0): 128, 129, 133, 139, 145, 146, 146, 147, 148, 148, 147, 145, + (317,12): 143, 134, 112, 39, 14, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,110): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,130): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,150): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,170): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,190): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,230): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,250): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (317,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,0): 128, 128, 132, 138, 145, 146, 147, 147, 148, 147, 145, 144, + (318,12): 140, 124, 88, 21, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,30): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,50): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,70): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,90): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,110): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,130): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,150): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,170): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,190): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,210): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,230): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,250): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,270): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (318,290): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,0): 127, 128, 131, 137, 145, 146, 147, 147, 147, 145, 143, 142, + (319,12): 135, 111, 58, 7, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,31): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,71): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,111): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,131): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,151): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,171): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,191): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,211): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (319,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,0): 127, 127, 130, 136, 143, 146, 146, 145, 144, 142, 142, 139, + (320,12): 118, 78, 22, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,31): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,51): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,71): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,91): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,111): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,131): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,151): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,171): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,191): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,211): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,231): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,251): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,271): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (320,291): 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,0): 127, 127, 130, 134, 139, 144, 143, 142, 142, 142, 141, 130, + (321,12): 93, 46, 9, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,52): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,72): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,92): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,112): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,132): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,152): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,172): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,192): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,212): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,232): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,272): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (321,292): 1, 1, 1, 1, 1, 1, 1, 1, + (322,0): 127, 127, 130, 133, 137, 140, 140, 141, 141, 141, 137, 108, + (322,12): 64, 22, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,32): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,52): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,72): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,92): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,112): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,132): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,152): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,172): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,192): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,212): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,232): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,252): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,272): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (322,292): 1, 1, 1, 1, 1, 1, 1, 1, + (323,0): 128, 128, 129, 132, 135, 138, 139, 140, 140, 139, 123, 76, 35, + (323,13): 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,113): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,133): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,153): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,173): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,193): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,213): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,233): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (323,293): 1, 1, 1, 1, 1, 1, 1, + (324,0): 128, 128, 129, 132, 135, 136, 139, 140, 139, 136, 94, 39, 11, + (324,13): 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,33): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,53): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,73): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,93): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,113): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,133): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,153): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,173): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,193): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,213): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,233): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,253): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,273): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (324,293): 1, 1, 1, 1, 1, 1, 1, + (325,0): 129, 130, 131, 132, 134, 138, 139, 138, 129, 107, 29, 9, 2, 1, + (325,14): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,34): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,94): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,114): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,134): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,154): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,174): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,194): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,214): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,234): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (325,294): 1, 1, 1, 1, 1, 1, + (326,0): 130, 131, 132, 133, 136, 139, 138, 127, 101, 52, 10, 3, 1, 1, + (326,14): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,34): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,54): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,74): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,94): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,114): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,134): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,154): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,174): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,194): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,214): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,234): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,254): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,274): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (326,294): 1, 1, 1, 1, 1, 1, + (327,0): 132, 133, 134, 136, 138, 137, 126, 97, 59, 18, 2, 1, 1, 1, 1, + (327,15): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,35): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,55): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,75): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,95): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,115): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,135): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,155): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,175): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,195): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,215): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,235): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,255): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,275): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (327,295): 1, 1, 1, 1, 1, + (328,0): 135, 135, 136, 137, 137, 125, 97, 57, 20, 3, 1, 1, 1, 1, 1, 1, + (328,16): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,36): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,56): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,76): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,136): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,156): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,176): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,196): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,216): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,236): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (328,296): 1, 1, 1, 1, + (329,0): 137, 137, 137, 137, 134, 94, 44, 16, 3, 1, 1, 1, 1, 1, 1, 1, + (329,16): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,36): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,56): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,76): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,96): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,116): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,136): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,156): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,176): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,196): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,216): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,236): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,256): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,276): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (329,296): 1, 1, 1, 1, + (330,0): 136, 134, 125, 104, 66, 18, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,17): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,37): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,57): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,77): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,97): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,117): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,137): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,157): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,177): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,197): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,217): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,237): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,257): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,277): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (330,297): 1, 1, 1, + (331,0): 105, 88, 67, 45, 22, 6, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,19): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,39): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,59): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,79): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,99): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,119): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,139): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,159): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,179): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,199): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,219): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,239): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (331,299): 1, + (332,0): 55, 41, 26, 13, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,19): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,39): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,59): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,79): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,99): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,119): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,139): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,159): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,179): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,199): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,219): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,239): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,259): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,279): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (332,299): 1, + (333,0): 13, 7, 4, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,20): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,40): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,60): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,80): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,100): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,120): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,140): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,160): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,180): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,200): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,220): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,240): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,260): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (333,280): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (334,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (335,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (336,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (337,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (338,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (339,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (340,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (341,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (342,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (343,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (344,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (345,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (346,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (347,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (348,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (349,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (350,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (351,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (352,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (353,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (354,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (355,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (356,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (357,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (358,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (359,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (360,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (361,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (362,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (363,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (364,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (365,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (366,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (367,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (368,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (369,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (370,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (371,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (372,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (373,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (374,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (375,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (376,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (377,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (378,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (379,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (380,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (381,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (382,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (383,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (384,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (385,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (386,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (387,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (388,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (389,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (390,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (391,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (392,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (393,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (394,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (395,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (396,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (397,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (398,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,0): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,21): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,41): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,61): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,81): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,101): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,121): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,141): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,161): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,181): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,201): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,221): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,241): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,261): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + (399,281): 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "IMAGE" + } + } + ATTRIBUTE "IMAGE_SUBCLASS" { + DATATYPE H5T_STRING { + STRSIZE 14; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "IMAGE_INDEXED" + } + } + ATTRIBUTE "IMAGE_VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "1.2" + } + } + ATTRIBUTE "PALETTE" { + DATATYPE H5T_REFERENCE { H5T_STD_REF_OBJECT } + DATASPACE SCALAR + DATA { + DATASET "h5ex_image2.h5/palette" + DATA { + (0,0): 0, 0, 255, + (1,0): 1, 0, 254, + (2,0): 2, 0, 253, + (3,0): 3, 0, 252, + (4,0): 4, 0, 251, + (5,0): 5, 0, 250, + (6,0): 6, 0, 249, + (7,0): 7, 0, 248, + (8,0): 8, 0, 247, + (9,0): 9, 0, 246, + (10,0): 10, 0, 245, + (11,0): 11, 0, 244, + (12,0): 12, 0, 243, + (13,0): 13, 0, 242, + (14,0): 14, 0, 241, + (15,0): 15, 0, 240, + (16,0): 16, 0, 239, + (17,0): 17, 0, 238, + (18,0): 18, 0, 237, + (19,0): 19, 0, 236, + (20,0): 20, 0, 235, + (21,0): 21, 0, 234, + (22,0): 22, 0, 233, + (23,0): 23, 0, 232, + (24,0): 24, 0, 231, + (25,0): 25, 0, 230, + (26,0): 26, 0, 229, + (27,0): 27, 0, 228, + (28,0): 28, 0, 227, + (29,0): 29, 0, 226, + (30,0): 30, 0, 225, + (31,0): 31, 0, 224, + (32,0): 32, 0, 223, + (33,0): 33, 0, 222, + (34,0): 34, 0, 221, + (35,0): 35, 0, 220, + (36,0): 36, 0, 219, + (37,0): 37, 0, 218, + (38,0): 38, 0, 217, + (39,0): 39, 0, 216, + (40,0): 40, 0, 215, + (41,0): 41, 0, 214, + (42,0): 42, 0, 213, + (43,0): 43, 0, 212, + (44,0): 44, 0, 211, + (45,0): 45, 0, 210, + (46,0): 46, 0, 209, + (47,0): 47, 0, 208, + (48,0): 48, 0, 207, + (49,0): 49, 0, 206, + (50,0): 50, 0, 205, + (51,0): 51, 0, 204, + (52,0): 52, 0, 203, + (53,0): 53, 0, 202, + (54,0): 54, 0, 201, + (55,0): 55, 0, 200, + (56,0): 56, 0, 199, + (57,0): 57, 0, 198, + (58,0): 58, 0, 197, + (59,0): 59, 0, 196, + (60,0): 60, 0, 195, + (61,0): 61, 0, 194, + (62,0): 62, 0, 193, + (63,0): 63, 0, 192, + (64,0): 64, 0, 191, + (65,0): 65, 0, 190, + (66,0): 66, 0, 189, + (67,0): 67, 0, 188, + (68,0): 68, 0, 187, + (69,0): 69, 0, 186, + (70,0): 70, 0, 185, + (71,0): 71, 0, 184, + (72,0): 72, 0, 183, + (73,0): 73, 0, 182, + (74,0): 74, 0, 181, + (75,0): 75, 0, 180, + (76,0): 76, 0, 179, + (77,0): 77, 0, 178, + (78,0): 78, 0, 177, + (79,0): 79, 0, 176, + (80,0): 80, 0, 175, + (81,0): 81, 0, 174, + (82,0): 82, 0, 173, + (83,0): 83, 0, 172, + (84,0): 84, 0, 171, + (85,0): 85, 0, 170, + (86,0): 86, 0, 169, + (87,0): 87, 0, 168, + (88,0): 88, 0, 167, + (89,0): 89, 0, 166, + (90,0): 90, 0, 165, + (91,0): 91, 0, 164, + (92,0): 92, 0, 163, + (93,0): 93, 0, 162, + (94,0): 94, 0, 161, + (95,0): 95, 0, 160, + (96,0): 96, 0, 159, + (97,0): 97, 0, 158, + (98,0): 98, 0, 157, + (99,0): 99, 0, 156, + (100,0): 100, 0, 155, + (101,0): 101, 0, 154, + (102,0): 102, 0, 153, + (103,0): 103, 0, 152, + (104,0): 104, 0, 151, + (105,0): 105, 0, 150, + (106,0): 106, 0, 149, + (107,0): 107, 0, 148, + (108,0): 108, 0, 147, + (109,0): 109, 0, 146, + (110,0): 110, 0, 145, + (111,0): 111, 0, 144, + (112,0): 112, 0, 143, + (113,0): 113, 0, 142, + (114,0): 114, 0, 141, + (115,0): 115, 0, 140, + (116,0): 116, 0, 139, + (117,0): 117, 0, 138, + (118,0): 118, 0, 137, + (119,0): 119, 0, 136, + (120,0): 120, 0, 135, + (121,0): 121, 0, 134, + (122,0): 122, 0, 133, + (123,0): 123, 0, 132, + (124,0): 124, 0, 131, + (125,0): 125, 0, 130, + (126,0): 126, 0, 129, + (127,0): 127, 0, 128, + (128,0): 128, 0, 127, + (129,0): 129, 0, 126, + (130,0): 130, 0, 125, + (131,0): 131, 0, 124, + (132,0): 132, 0, 123, + (133,0): 133, 0, 122, + (134,0): 134, 0, 121, + (135,0): 135, 0, 120, + (136,0): 136, 0, 119, + (137,0): 137, 0, 118, + (138,0): 138, 0, 117, + (139,0): 139, 0, 116, + (140,0): 140, 0, 115, + (141,0): 141, 0, 114, + (142,0): 142, 0, 113, + (143,0): 143, 0, 112, + (144,0): 144, 0, 111, + (145,0): 145, 0, 110, + (146,0): 146, 0, 109, + (147,0): 147, 0, 108, + (148,0): 148, 0, 107, + (149,0): 149, 0, 106, + (150,0): 150, 0, 105, + (151,0): 151, 0, 104, + (152,0): 152, 0, 103, + (153,0): 153, 0, 102, + (154,0): 154, 0, 101, + (155,0): 155, 0, 100, + (156,0): 156, 0, 99, + (157,0): 157, 0, 98, + (158,0): 158, 0, 97, + (159,0): 159, 0, 96, + (160,0): 160, 0, 95, + (161,0): 161, 0, 94, + (162,0): 162, 0, 93, + (163,0): 163, 0, 92, + (164,0): 164, 0, 91, + (165,0): 165, 0, 90, + (166,0): 166, 0, 89, + (167,0): 167, 0, 88, + (168,0): 168, 0, 87, + (169,0): 169, 0, 86, + (170,0): 170, 0, 85, + (171,0): 171, 0, 84, + (172,0): 172, 0, 83, + (173,0): 173, 0, 82, + (174,0): 174, 0, 81, + (175,0): 175, 0, 80, + (176,0): 176, 0, 79, + (177,0): 177, 0, 78, + (178,0): 178, 0, 77, + (179,0): 179, 0, 76, + (180,0): 180, 0, 75, + (181,0): 181, 0, 74, + (182,0): 182, 0, 73, + (183,0): 183, 0, 72, + (184,0): 184, 0, 71, + (185,0): 185, 0, 70, + (186,0): 186, 0, 69, + (187,0): 187, 0, 68, + (188,0): 188, 0, 67, + (189,0): 189, 0, 66, + (190,0): 190, 0, 65, + (191,0): 191, 0, 64, + (192,0): 192, 0, 63, + (193,0): 193, 0, 62, + (194,0): 194, 0, 61, + (195,0): 195, 0, 60, + (196,0): 196, 0, 59, + (197,0): 197, 0, 58, + (198,0): 198, 0, 57, + (199,0): 199, 0, 56, + (200,0): 200, 0, 55, + (201,0): 201, 0, 54, + (202,0): 202, 0, 53, + (203,0): 203, 0, 52, + (204,0): 204, 0, 51, + (205,0): 205, 0, 50, + (206,0): 206, 0, 49, + (207,0): 207, 0, 48, + (208,0): 208, 0, 47, + (209,0): 209, 0, 46, + (210,0): 210, 0, 45, + (211,0): 211, 0, 44, + (212,0): 212, 0, 43, + (213,0): 213, 0, 42, + (214,0): 214, 0, 41, + (215,0): 215, 0, 40, + (216,0): 216, 0, 39, + (217,0): 217, 0, 38, + (218,0): 218, 0, 37, + (219,0): 219, 0, 36, + (220,0): 220, 0, 35, + (221,0): 221, 0, 34, + (222,0): 222, 0, 33, + (223,0): 223, 0, 32, + (224,0): 224, 0, 31, + (225,0): 225, 0, 30, + (226,0): 226, 0, 29, + (227,0): 227, 0, 28, + (228,0): 228, 0, 27, + (229,0): 229, 0, 26, + (230,0): 230, 0, 25, + (231,0): 231, 0, 24, + (232,0): 232, 0, 23, + (233,0): 233, 0, 22, + (234,0): 234, 0, 21, + (235,0): 235, 0, 20, + (236,0): 236, 0, 19, + (237,0): 237, 0, 18, + (238,0): 238, 0, 17, + (239,0): 239, 0, 16, + (240,0): 240, 0, 15, + (241,0): 241, 0, 14, + (242,0): 242, 0, 13, + (243,0): 243, 0, 12, + (244,0): 244, 0, 11, + (245,0): 245, 0, 10, + (246,0): 246, 0, 9, + (247,0): 247, 0, 8, + (248,0): 248, 0, 7, + (249,0): 249, 0, 6, + (250,0): 250, 0, 5, + (251,0): 251, 0, 4, + (252,0): 252, 0, 3, + (253,0): 253, 0, 2, + (254,0): 254, 0, 1, + (255,0): 255, 0, 0 + } + } + } + } + DATASET "palette" { + DATATYPE H5T_STD_U8LE + DATASPACE SIMPLE { ( 256, 3 ) / ( 256, 3 ) } + DATA { + (0,0): 0, 0, 255, + (1,0): 1, 0, 254, + (2,0): 2, 0, 253, + (3,0): 3, 0, 252, + (4,0): 4, 0, 251, + (5,0): 5, 0, 250, + (6,0): 6, 0, 249, + (7,0): 7, 0, 248, + (8,0): 8, 0, 247, + (9,0): 9, 0, 246, + (10,0): 10, 0, 245, + (11,0): 11, 0, 244, + (12,0): 12, 0, 243, + (13,0): 13, 0, 242, + (14,0): 14, 0, 241, + (15,0): 15, 0, 240, + (16,0): 16, 0, 239, + (17,0): 17, 0, 238, + (18,0): 18, 0, 237, + (19,0): 19, 0, 236, + (20,0): 20, 0, 235, + (21,0): 21, 0, 234, + (22,0): 22, 0, 233, + (23,0): 23, 0, 232, + (24,0): 24, 0, 231, + (25,0): 25, 0, 230, + (26,0): 26, 0, 229, + (27,0): 27, 0, 228, + (28,0): 28, 0, 227, + (29,0): 29, 0, 226, + (30,0): 30, 0, 225, + (31,0): 31, 0, 224, + (32,0): 32, 0, 223, + (33,0): 33, 0, 222, + (34,0): 34, 0, 221, + (35,0): 35, 0, 220, + (36,0): 36, 0, 219, + (37,0): 37, 0, 218, + (38,0): 38, 0, 217, + (39,0): 39, 0, 216, + (40,0): 40, 0, 215, + (41,0): 41, 0, 214, + (42,0): 42, 0, 213, + (43,0): 43, 0, 212, + (44,0): 44, 0, 211, + (45,0): 45, 0, 210, + (46,0): 46, 0, 209, + (47,0): 47, 0, 208, + (48,0): 48, 0, 207, + (49,0): 49, 0, 206, + (50,0): 50, 0, 205, + (51,0): 51, 0, 204, + (52,0): 52, 0, 203, + (53,0): 53, 0, 202, + (54,0): 54, 0, 201, + (55,0): 55, 0, 200, + (56,0): 56, 0, 199, + (57,0): 57, 0, 198, + (58,0): 58, 0, 197, + (59,0): 59, 0, 196, + (60,0): 60, 0, 195, + (61,0): 61, 0, 194, + (62,0): 62, 0, 193, + (63,0): 63, 0, 192, + (64,0): 64, 0, 191, + (65,0): 65, 0, 190, + (66,0): 66, 0, 189, + (67,0): 67, 0, 188, + (68,0): 68, 0, 187, + (69,0): 69, 0, 186, + (70,0): 70, 0, 185, + (71,0): 71, 0, 184, + (72,0): 72, 0, 183, + (73,0): 73, 0, 182, + (74,0): 74, 0, 181, + (75,0): 75, 0, 180, + (76,0): 76, 0, 179, + (77,0): 77, 0, 178, + (78,0): 78, 0, 177, + (79,0): 79, 0, 176, + (80,0): 80, 0, 175, + (81,0): 81, 0, 174, + (82,0): 82, 0, 173, + (83,0): 83, 0, 172, + (84,0): 84, 0, 171, + (85,0): 85, 0, 170, + (86,0): 86, 0, 169, + (87,0): 87, 0, 168, + (88,0): 88, 0, 167, + (89,0): 89, 0, 166, + (90,0): 90, 0, 165, + (91,0): 91, 0, 164, + (92,0): 92, 0, 163, + (93,0): 93, 0, 162, + (94,0): 94, 0, 161, + (95,0): 95, 0, 160, + (96,0): 96, 0, 159, + (97,0): 97, 0, 158, + (98,0): 98, 0, 157, + (99,0): 99, 0, 156, + (100,0): 100, 0, 155, + (101,0): 101, 0, 154, + (102,0): 102, 0, 153, + (103,0): 103, 0, 152, + (104,0): 104, 0, 151, + (105,0): 105, 0, 150, + (106,0): 106, 0, 149, + (107,0): 107, 0, 148, + (108,0): 108, 0, 147, + (109,0): 109, 0, 146, + (110,0): 110, 0, 145, + (111,0): 111, 0, 144, + (112,0): 112, 0, 143, + (113,0): 113, 0, 142, + (114,0): 114, 0, 141, + (115,0): 115, 0, 140, + (116,0): 116, 0, 139, + (117,0): 117, 0, 138, + (118,0): 118, 0, 137, + (119,0): 119, 0, 136, + (120,0): 120, 0, 135, + (121,0): 121, 0, 134, + (122,0): 122, 0, 133, + (123,0): 123, 0, 132, + (124,0): 124, 0, 131, + (125,0): 125, 0, 130, + (126,0): 126, 0, 129, + (127,0): 127, 0, 128, + (128,0): 128, 0, 127, + (129,0): 129, 0, 126, + (130,0): 130, 0, 125, + (131,0): 131, 0, 124, + (132,0): 132, 0, 123, + (133,0): 133, 0, 122, + (134,0): 134, 0, 121, + (135,0): 135, 0, 120, + (136,0): 136, 0, 119, + (137,0): 137, 0, 118, + (138,0): 138, 0, 117, + (139,0): 139, 0, 116, + (140,0): 140, 0, 115, + (141,0): 141, 0, 114, + (142,0): 142, 0, 113, + (143,0): 143, 0, 112, + (144,0): 144, 0, 111, + (145,0): 145, 0, 110, + (146,0): 146, 0, 109, + (147,0): 147, 0, 108, + (148,0): 148, 0, 107, + (149,0): 149, 0, 106, + (150,0): 150, 0, 105, + (151,0): 151, 0, 104, + (152,0): 152, 0, 103, + (153,0): 153, 0, 102, + (154,0): 154, 0, 101, + (155,0): 155, 0, 100, + (156,0): 156, 0, 99, + (157,0): 157, 0, 98, + (158,0): 158, 0, 97, + (159,0): 159, 0, 96, + (160,0): 160, 0, 95, + (161,0): 161, 0, 94, + (162,0): 162, 0, 93, + (163,0): 163, 0, 92, + (164,0): 164, 0, 91, + (165,0): 165, 0, 90, + (166,0): 166, 0, 89, + (167,0): 167, 0, 88, + (168,0): 168, 0, 87, + (169,0): 169, 0, 86, + (170,0): 170, 0, 85, + (171,0): 171, 0, 84, + (172,0): 172, 0, 83, + (173,0): 173, 0, 82, + (174,0): 174, 0, 81, + (175,0): 175, 0, 80, + (176,0): 176, 0, 79, + (177,0): 177, 0, 78, + (178,0): 178, 0, 77, + (179,0): 179, 0, 76, + (180,0): 180, 0, 75, + (181,0): 181, 0, 74, + (182,0): 182, 0, 73, + (183,0): 183, 0, 72, + (184,0): 184, 0, 71, + (185,0): 185, 0, 70, + (186,0): 186, 0, 69, + (187,0): 187, 0, 68, + (188,0): 188, 0, 67, + (189,0): 189, 0, 66, + (190,0): 190, 0, 65, + (191,0): 191, 0, 64, + (192,0): 192, 0, 63, + (193,0): 193, 0, 62, + (194,0): 194, 0, 61, + (195,0): 195, 0, 60, + (196,0): 196, 0, 59, + (197,0): 197, 0, 58, + (198,0): 198, 0, 57, + (199,0): 199, 0, 56, + (200,0): 200, 0, 55, + (201,0): 201, 0, 54, + (202,0): 202, 0, 53, + (203,0): 203, 0, 52, + (204,0): 204, 0, 51, + (205,0): 205, 0, 50, + (206,0): 206, 0, 49, + (207,0): 207, 0, 48, + (208,0): 208, 0, 47, + (209,0): 209, 0, 46, + (210,0): 210, 0, 45, + (211,0): 211, 0, 44, + (212,0): 212, 0, 43, + (213,0): 213, 0, 42, + (214,0): 214, 0, 41, + (215,0): 215, 0, 40, + (216,0): 216, 0, 39, + (217,0): 217, 0, 38, + (218,0): 218, 0, 37, + (219,0): 219, 0, 36, + (220,0): 220, 0, 35, + (221,0): 221, 0, 34, + (222,0): 222, 0, 33, + (223,0): 223, 0, 32, + (224,0): 224, 0, 31, + (225,0): 225, 0, 30, + (226,0): 226, 0, 29, + (227,0): 227, 0, 28, + (228,0): 228, 0, 27, + (229,0): 229, 0, 26, + (230,0): 230, 0, 25, + (231,0): 231, 0, 24, + (232,0): 232, 0, 23, + (233,0): 233, 0, 22, + (234,0): 234, 0, 21, + (235,0): 235, 0, 20, + (236,0): 236, 0, 19, + (237,0): 237, 0, 18, + (238,0): 238, 0, 17, + (239,0): 239, 0, 16, + (240,0): 240, 0, 15, + (241,0): 241, 0, 14, + (242,0): 242, 0, 13, + (243,0): 243, 0, 12, + (244,0): 244, 0, 11, + (245,0): 245, 0, 10, + (246,0): 246, 0, 9, + (247,0): 247, 0, 8, + (248,0): 248, 0, 7, + (249,0): 249, 0, 6, + (250,0): 250, 0, 5, + (251,0): 251, 0, 4, + (252,0): 252, 0, 3, + (253,0): 253, 0, 2, + (254,0): 254, 0, 1, + (255,0): 255, 0, 0 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 8; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "PALETTE" + } + } + ATTRIBUTE "PAL_VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "1.2" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_image2.tst b/HDF5Examples/C/HL/tfiles/h5ex_image2.tst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/HDF5Examples/C/HL/tfiles/h5ex_lite1.tst b/HDF5Examples/C/HL/tfiles/h5ex_lite1.tst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/HDF5Examples/C/HL/tfiles/h5ex_lite2.tst b/HDF5Examples/C/HL/tfiles/h5ex_lite2.tst new file mode 100644 index 00000000000..3475f24cfdd --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_lite2.tst @@ -0,0 +1,2 @@ + 1 2 3 + 4 5 6 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_lite3.ddl b/HDF5Examples/C/HL/tfiles/h5ex_lite3.ddl new file mode 100644 index 00000000000..fa44bb3f42b --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_lite3.ddl @@ -0,0 +1,18 @@ +HDF5 "h5ex_lite3.h5" { +GROUP "/" { + DATASET "dset" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 5 ) / ( 5 ) } + DATA { + (0): 0, 0, 0, 0, 0 + } + ATTRIBUTE "attr1" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 5 ) / ( 5 ) } + DATA { + (0): 1, 2, 3, 4, 5 + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_lite3.tst b/HDF5Examples/C/HL/tfiles/h5ex_lite3.tst new file mode 100644 index 00000000000..90e86c5e4cb --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_lite3.tst @@ -0,0 +1 @@ + 1 2 3 4 5 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_packet_table_FL.ddl b/HDF5Examples/C/HL/tfiles/h5ex_packet_table_FL.ddl new file mode 100644 index 00000000000..9b369380a55 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_packet_table_FL.ddl @@ -0,0 +1,11 @@ +HDF5 "h5ex_packet_table_FL.h5" { +GROUP "/" { + DATASET "Packet Test Dataset" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 5 ) / ( H5S_UNLIMITED ) } + DATA { + (0): 0, 1, 2, 3, 4 + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_packet_table_FL.tst b/HDF5Examples/C/HL/tfiles/h5ex_packet_table_FL.tst new file mode 100644 index 00000000000..0a3393dfb1a --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_packet_table_FL.tst @@ -0,0 +1,6 @@ +Number of packets in packet table after five appends: 5 +Packet 0's value is 0 +Packet 1's value is 1 +Packet 2's value is 2 +Packet 3's value is 3 +Packet 4's value is 4 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_01.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_01.ddl new file mode 100644 index 00000000000..f86d7bc3ff1 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_01.ddl @@ -0,0 +1,173 @@ +HDF5 "h5ex_table_01.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "three", + 30, + 30, + 3, + 30 + }, + (4): { + "four", + 40, + 40, + 4, + 40 + }, + (5): { + "five", + 50, + 50, + 5, + 50 + }, + (6): { + "six", + 60, + 60, + 6, + 60 + }, + (7): { + "seven", + 70, + 70, + 7, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_01.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_01.tst new file mode 100644 index 00000000000..b853e65e0ef --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_01.tst @@ -0,0 +1,8 @@ +zero 0 0 0.000000 0.000000 +one 10 10 1.000000 10.000000 +two 20 20 2.000000 20.000000 +three 30 30 3.000000 30.000000 +four 40 40 4.000000 40.000000 +five 50 50 5.000000 50.000000 +six 60 60 6.000000 60.000000 +seven 70 70 7.000000 70.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_02.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_02.ddl new file mode 100644 index 00000000000..c067eecfd4f --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_02.ddl @@ -0,0 +1,187 @@ +HDF5 "h5ex_table_02.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 10 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "three", + 30, + 30, + 3, + 30 + }, + (4): { + "four", + 40, + 40, + 4, + 40 + }, + (5): { + "five", + 50, + 50, + 5, + 50 + }, + (6): { + "six", + 60, + 60, + 6, + 60 + }, + (7): { + "seven", + 70, + 70, + 7, + 70 + }, + (8): { + "eight", + 80, + 80, + 8, + 80 + }, + (9): { + "nine", + 90, + 90, + 9, + 90 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_02.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_02.tst new file mode 100644 index 00000000000..8df7c110581 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_02.tst @@ -0,0 +1,10 @@ +zero 0 0 0.000000 0.000000 +one 10 10 1.000000 10.000000 +two 20 20 2.000000 20.000000 +three 30 30 3.000000 30.000000 +four 40 40 4.000000 40.000000 +five 50 50 5.000000 50.000000 +six 60 60 6.000000 60.000000 +seven 70 70 7.000000 70.000000 +eight 80 80 8.000000 80.000000 +nine 90 90 9.000000 90.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_03.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_03.ddl new file mode 100644 index 00000000000..4b3ea1da070 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_03.ddl @@ -0,0 +1,213 @@ +HDF5 "h5ex_table_03.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "no data", + -1, + -1, + -99, + -99 + }, + (3): { + "no data", + -1, + -1, + -99, + -99 + }, + (4): { + "no data", + -1, + -1, + -99, + -99 + }, + (5): { + "no data", + -1, + -1, + -99, + -99 + }, + (6): { + "no data", + -1, + -1, + -99, + -99 + }, + (7): { + "no data", + -1, + -1, + -99, + -99 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_03.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_03.tst new file mode 100644 index 00000000000..8ec28450daa --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_03.tst @@ -0,0 +1,8 @@ +zero 0 0 0.000000 0.000000 +one 10 10 1.000000 10.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_04.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_04.ddl new file mode 100644 index 00000000000..80131359235 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_04.ddl @@ -0,0 +1,213 @@ +HDF5 "h5ex_table_04.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "no data", + -1, + -1, + -99, + -99 + }, + (1): { + "no data", + -1, + -1, + -99, + -99 + }, + (2): { + "no data", + 0, + 0, + 0, + -99 + }, + (3): { + "no data", + 10, + 10, + 1, + -99 + }, + (4): { + "no data", + 20, + 20, + 2, + -99 + }, + (5): { + "no data", + -1, + -1, + -99, + -99 + }, + (6): { + "no data", + -1, + -1, + -99, + -99 + }, + (7): { + "no data", + -1, + -1, + -99, + -99 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_04.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_04.tst new file mode 100644 index 00000000000..79aa324b01a --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_04.tst @@ -0,0 +1,8 @@ +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data 0 0 0.000000 -99.000000 +no data 10 10 1.000000 -99.000000 +no data 20 20 2.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_05.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_05.ddl new file mode 100644 index 00000000000..9faaee7e691 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_05.ddl @@ -0,0 +1,213 @@ +HDF5 "h5ex_table_05.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "no data", + -1, + -1, + -99, + -99 + }, + (1): { + "no data", + -1, + -1, + -99, + -99 + }, + (2): { + "no data", + 0, + 0, + 0, + -99 + }, + (3): { + "no data", + 10, + 10, + 1, + -99 + }, + (4): { + "no data", + 20, + 20, + 2, + -99 + }, + (5): { + "no data", + -1, + -1, + -99, + -99 + }, + (6): { + "no data", + -1, + -1, + -99, + -99 + }, + (7): { + "no data", + -1, + -1, + -99, + -99 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_05.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_05.tst new file mode 100644 index 00000000000..79aa324b01a --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_05.tst @@ -0,0 +1,8 @@ +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data 0 0 0.000000 -99.000000 +no data 10 10 1.000000 -99.000000 +no data 20 20 2.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_06.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_06.ddl new file mode 100644 index 00000000000..31a4fcf57cb --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_06.ddl @@ -0,0 +1,213 @@ +HDF5 "h5ex_table_06.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "no data", + -1, + -1, + -99, + -99 + }, + (1): { + "no data", + -1, + -1, + -99, + -99 + }, + (2): { + "no data", + -1, + -1, + -99, + -99 + }, + (3): { + "no data", + -1, + -1, + -99, + -99 + }, + (4): { + "no data", + -1, + -1, + -99, + -99 + }, + (5): { + "no data", + -1, + -1, + -99, + -99 + }, + (6): { + "no data", + -1, + -1, + -99, + -99 + }, + (7): { + "no data", + -1, + -1, + -99, + -99 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_06.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_06.tst new file mode 100644 index 00000000000..ad5282de8da --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_06.tst @@ -0,0 +1 @@ +Table has 5 fields and 8 records diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_07.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_07.ddl new file mode 100644 index 00000000000..c764cdc6713 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_07.ddl @@ -0,0 +1,192 @@ +HDF5 "h5ex_table_07.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 5 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "six", + 60, + 60, + 6, + 60 + }, + (4): { + "seven", + 70, + 70, + 7, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_07.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_07.tst new file mode 100644 index 00000000000..da25e596074 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_07.tst @@ -0,0 +1 @@ +Table has 5 fields and 5 records diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_08.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_08.ddl new file mode 100644 index 00000000000..d5617d92ff4 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_08.ddl @@ -0,0 +1,187 @@ +HDF5 "h5ex_table_08.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 10 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "new", + 30, + 30, + 3, + 30 + }, + (4): { + "new", + 40, + 40, + 4, + 40 + }, + (5): { + "three", + 30, + 30, + 3, + 30 + }, + (6): { + "four", + 40, + 40, + 4, + 40 + }, + (7): { + "five", + 50, + 50, + 5, + 50 + }, + (8): { + "six", + 60, + 60, + 6, + 60 + }, + (9): { + "seven", + 70, + 70, + 7, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_08.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_08.tst new file mode 100644 index 00000000000..1a248964f73 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_08.tst @@ -0,0 +1,11 @@ +Table has 5 fields and 10 records +zero 0 0 0.000000 0.000000 +one 10 10 1.000000 10.000000 +two 20 20 2.000000 20.000000 +new 30 30 3.000000 30.000000 +new 40 40 4.000000 40.000000 +three 30 30 3.000000 30.000000 +four 40 40 4.000000 40.000000 +five 50 50 5.000000 50.000000 +six 60 60 6.000000 60.000000 +seven 70 70 7.000000 70.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_09.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_09.ddl new file mode 100644 index 00000000000..8f1d2b030c8 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_09.ddl @@ -0,0 +1,436 @@ +HDF5 "h5ex_table_09.h5" { +GROUP "/" { + DATASET "table1" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "three", + 30, + 30, + 3, + 30 + }, + (4): { + "four", + 40, + 40, + 4, + 40 + }, + (5): { + "five", + 50, + 50, + 5, + 50 + }, + (6): { + "six", + 60, + 60, + 6, + 60 + }, + (7): { + "seven", + 70, + 70, + 7, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } + DATASET "table2" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 10 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "no data", + -1, + -1, + -99, + -99 + }, + (1): { + "no data", + -1, + -1, + -99, + -99 + }, + (2): { + "no data", + -1, + -1, + -99, + -99 + }, + (3): { + "no data", + -1, + -1, + -99, + -99 + }, + (4): { + "no data", + -1, + -1, + -99, + -99 + }, + (5): { + "no data", + -1, + -1, + -99, + -99 + }, + (6): { + "three", + 30, + 30, + 3, + 30 + }, + (7): { + "four", + 40, + 40, + 4, + 40 + }, + (8): { + "no data", + -1, + -1, + -99, + -99 + }, + (9): { + "no data", + -1, + -1, + -99, + -99 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_09.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_09.tst new file mode 100644 index 00000000000..8ede443231f --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_09.tst @@ -0,0 +1,11 @@ +Table has 5 fields and 10 records +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 +three 30 30 3.000000 30.000000 +four 40 40 4.000000 40.000000 +no data -1 -1 -99.000000 -99.000000 +no data -1 -1 -99.000000 -99.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_10.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_10.ddl new file mode 100644 index 00000000000..34752fd3731 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_10.ddl @@ -0,0 +1,567 @@ +HDF5 "h5ex_table_10.h5" { +GROUP "/" { + DATASET "table1" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "three", + 30, + 30, + 3, + 30 + }, + (4): { + "four", + 40, + 40, + 4, + 40 + }, + (5): { + "five", + 50, + 50, + 5, + 50 + }, + (6): { + "six", + 60, + 60, + 6, + 60 + }, + (7): { + "seven", + 70, + 70, + 7, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } + DATASET "table2" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "three", + 30, + 30, + 3, + 30 + }, + (4): { + "four", + 40, + 40, + 4, + 40 + }, + (5): { + "five", + 50, + 50, + 5, + 50 + }, + (6): { + "six", + 60, + 60, + 6, + 60 + }, + (7): { + "seven", + 70, + 70, + 7, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } + DATASET "table3" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 16 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10 + }, + (2): { + "two", + 20, + 20, + 2, + 20 + }, + (3): { + "three", + 30, + 30, + 3, + 30 + }, + (4): { + "four", + 40, + 40, + 4, + 40 + }, + (5): { + "five", + 50, + 50, + 5, + 50 + }, + (6): { + "six", + 60, + 60, + 6, + 60 + }, + (7): { + "seven", + 70, + 70, + 7, + 70 + }, + (8): { + "zero", + 0, + 0, + 0, + 0 + }, + (9): { + "one", + 10, + 10, + 1, + 10 + }, + (10): { + "two", + 20, + 20, + 2, + 20 + }, + (11): { + "three", + 30, + 30, + 3, + 30 + }, + (12): { + "four", + 40, + 40, + 4, + 40 + }, + (13): { + "five", + 50, + 50, + 5, + 50 + }, + (14): { + "six", + 60, + 60, + 6, + 60 + }, + (15): { + "seven", + 70, + 70, + 7, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Merge table" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_10.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_10.tst new file mode 100644 index 00000000000..74797f1dca7 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_10.tst @@ -0,0 +1,17 @@ +Table has 5 fields and 16 records +zero 0 0 0.000000 0.000000 +one 10 10 1.000000 10.000000 +two 20 20 2.000000 20.000000 +three 30 30 3.000000 30.000000 +four 40 40 4.000000 40.000000 +five 50 50 5.000000 50.000000 +six 60 60 6.000000 60.000000 +seven 70 70 7.000000 70.000000 +zero 0 0 0.000000 0.000000 +one 10 10 1.000000 10.000000 +two 20 20 2.000000 20.000000 +three 30 30 3.000000 30.000000 +four 40 40 4.000000 40.000000 +five 50 50 5.000000 50.000000 +six 60 60 6.000000 60.000000 +seven 70 70 7.000000 70.000000 diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_11.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_11.ddl new file mode 100644 index 00000000000..fabfb2e836e --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_11.ddl @@ -0,0 +1,241 @@ +HDF5 "h5ex_table_11.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F32LE "Pressure"; + H5T_IEEE_F64LE "Temperature"; + H5T_STD_I32LE "New Field"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 1, + 10, + 1 + }, + (2): { + "two", + 20, + 20, + 2, + 20, + 2 + }, + (3): { + "three", + 30, + 30, + 3, + 30, + 3 + }, + (4): { + "four", + 40, + 40, + 4, + 40, + 4 + }, + (5): { + "five", + 50, + 50, + 5, + 50, + 5 + }, + (6): { + "six", + 60, + 60, + 6, + 60, + 6 + }, + (7): { + "seven", + 70, + 70, + 7, + 70, + 7 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Pressure" + } + } + ATTRIBUTE "FIELD_4_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): 0 + } + } + ATTRIBUTE "FIELD_4_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "FIELD_5_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -100 + } + } + ATTRIBUTE "FIELD_5_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "New Field" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_11.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_11.tst new file mode 100644 index 00000000000..7003e5850c2 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_11.tst @@ -0,0 +1 @@ +Table has 6 fields and 8 records diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_12.ddl b/HDF5Examples/C/HL/tfiles/h5ex_table_12.ddl new file mode 100644 index 00000000000..35553a9d52d --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_12.ddl @@ -0,0 +1,185 @@ +HDF5 "h5ex_table_12.h5" { +GROUP "/" { + DATASET "table" { + DATATYPE H5T_COMPOUND { + H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } "Name"; + H5T_STD_I32LE "Latitude"; + H5T_STD_I32LE "Longitude"; + H5T_IEEE_F64LE "Temperature"; + } + DATASPACE SIMPLE { ( 8 ) / ( H5S_UNLIMITED ) } + DATA { + (0): { + "zero", + 0, + 0, + 0 + }, + (1): { + "one", + 10, + 10, + 10 + }, + (2): { + "two", + 20, + 20, + 20 + }, + (3): { + "three", + 30, + 30, + 30 + }, + (4): { + "four", + 40, + 40, + 40 + }, + (5): { + "five", + 50, + 50, + 50 + }, + (6): { + "six", + 60, + 60, + 60 + }, + (7): { + "seven", + 70, + 70, + 70 + } + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "TABLE" + } + } + ATTRIBUTE "FIELD_0_FILL" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "no data" + } + } + ATTRIBUTE "FIELD_0_NAME" { + DATATYPE H5T_STRING { + STRSIZE 5; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Name" + } + } + ATTRIBUTE "FIELD_1_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_1_NAME" { + DATATYPE H5T_STRING { + STRSIZE 9; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Latitude" + } + } + ATTRIBUTE "FIELD_2_FILL" { + DATATYPE H5T_STD_I32LE + DATASPACE SCALAR + DATA { + (0): -1 + } + } + ATTRIBUTE "FIELD_2_NAME" { + DATATYPE H5T_STRING { + STRSIZE 10; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Longitude" + } + } + ATTRIBUTE "FIELD_3_FILL" { + DATATYPE H5T_IEEE_F64LE + DATASPACE SCALAR + DATA { + (0): -99 + } + } + ATTRIBUTE "FIELD_3_NAME" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Temperature" + } + } + ATTRIBUTE "TITLE" { + DATATYPE H5T_STRING { + STRSIZE 12; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Table Title" + } + } + ATTRIBUTE "VERSION" { + DATATYPE H5T_STRING { + STRSIZE 4; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "3.0" + } + } + } +} +} diff --git a/HDF5Examples/C/HL/tfiles/h5ex_table_12.tst b/HDF5Examples/C/HL/tfiles/h5ex_table_12.tst new file mode 100644 index 00000000000..64f8195f911 --- /dev/null +++ b/HDF5Examples/C/HL/tfiles/h5ex_table_12.tst @@ -0,0 +1 @@ +Table has 4 fields and 8 records diff --git a/hl/examples/image24pixel.txt b/HDF5Examples/C/HL/tfiles/image24pixel.txt similarity index 100% rename from hl/examples/image24pixel.txt rename to HDF5Examples/C/HL/tfiles/image24pixel.txt diff --git a/hl/examples/image8.txt b/HDF5Examples/C/HL/tfiles/image8.txt similarity index 100% rename from hl/examples/image8.txt rename to HDF5Examples/C/HL/tfiles/image8.txt diff --git a/HDF5Examples/C/Makefile.am b/HDF5Examples/C/Makefile.am index 778f802246c..9a3e8d008e6 100644 --- a/HDF5Examples/C/Makefile.am +++ b/HDF5Examples/C/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/Perf/CMakeLists.txt b/HDF5Examples/C/Perf/CMakeLists.txt index bf66de3f6de..f4153d08722 100644 --- a/HDF5Examples/C/Perf/CMakeLists.txt +++ b/HDF5Examples/C/Perf/CMakeLists.txt @@ -16,7 +16,7 @@ foreach (example ${examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) diff --git a/HDF5Examples/C/Perf/h5efc.c b/HDF5Examples/C/Perf/h5efc.c index 8e50c1d1867..56b0c0bfb36 100644 --- a/HDF5Examples/C/Perf/h5efc.c +++ b/HDF5Examples/C/Perf/h5efc.c @@ -9,7 +9,7 @@ #include "hdf5.h" -#define FILE "h5efc.h5" +#define FILENAME "h5efc.h5" #define EXT_FILE1 "h5efc1.h5" #define EXT_FILE2 "h5efc2.h5" #define EXT_FILE3 "h5efc3.h5" @@ -30,7 +30,7 @@ main(void) /* * Create a new file using the file access property list. */ - file1 = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); + file1 = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, fapl); /* * Create files to serve as targets for external links. diff --git a/HDF5Examples/C/TUTR/CMakeLists.txt b/HDF5Examples/C/TUTR/CMakeLists.txt index 10da2bf1797..232de9b742b 100644 --- a/HDF5Examples/C/TUTR/CMakeLists.txt +++ b/HDF5Examples/C/TUTR/CMakeLists.txt @@ -15,7 +15,7 @@ foreach (example_name ${examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_tutr_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -83,7 +83,7 @@ if (H5EX_BUILD_TESTING) ) macro (ADD_H5_TEST testname) - if (HDF5_ENABLE_USING_MEMCHECKER) + if (HDF5_USING_ANALYSIS_TOOL) add_test (NAME ${EXAMPLE_VARNAME}_tutr_${testname} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) else () add_test ( diff --git a/HDF5Examples/C/TUTR/C_sourcefiles.cmake b/HDF5Examples/C/TUTR/C_sourcefiles.cmake index 147ee7ab4aa..6e2822fb09a 100644 --- a/HDF5Examples/C/TUTR/C_sourcefiles.cmake +++ b/HDF5Examples/C/TUTR/C_sourcefiles.cmake @@ -17,6 +17,7 @@ set (examples h5_chunk_read h5_compound h5_group + h5_interm_group h5_select h5_attribute h5_mount diff --git a/HDF5Examples/C/TUTR/Makefile.am b/HDF5Examples/C/TUTR/Makefile.am index 508664b8773..0135ca51f10 100644 --- a/HDF5Examples/C/TUTR/Makefile.am +++ b/HDF5Examples/C/TUTR/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/TUTR/h5_attribute.c b/HDF5Examples/C/TUTR/h5_attribute.c index 6d3523d5b9e..c8144c63913 100644 --- a/HDF5Examples/C/TUTR/h5_attribute.c +++ b/HDF5Examples/C/TUTR/h5_attribute.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_chunk_read.c b/HDF5Examples/C/TUTR/h5_chunk_read.c index 9e5332e43af..1fb6050c41a 100644 --- a/HDF5Examples/C/TUTR/h5_chunk_read.c +++ b/HDF5Examples/C/TUTR/h5_chunk_read.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_cmprss.c b/HDF5Examples/C/TUTR/h5_cmprss.c index ffd319174d2..47fd389ab50 100644 --- a/HDF5Examples/C/TUTR/h5_cmprss.c +++ b/HDF5Examples/C/TUTR/h5_cmprss.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,10 +17,10 @@ #include "hdf5.h" -#define FILE "cmprss.h5" -#define RANK 2 -#define DIM0 100 -#define DIM1 20 +#define FILENAME "cmprss.h5" +#define RANK 2 +#define DIM0 100 +#define DIM1 20 int main(void) @@ -47,7 +47,7 @@ main(void) */ /* Create a file. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create dataset "Compressed Data" in the group using absolute name. */ dims[0] = DIM0; @@ -87,7 +87,7 @@ main(void) status = H5Fclose(file_id); /* Now reopen the file and dataset in the file. */ - file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dataset_id = H5Dopen2(file_id, "Compressed_Data", H5P_DEFAULT); /* Retrieve filter information. */ diff --git a/HDF5Examples/C/TUTR/h5_compound.c b/HDF5Examples/C/TUTR/h5_compound.c index 3ae19613f56..257af6c29db 100644 --- a/HDF5Examples/C/TUTR/h5_compound.c +++ b/HDF5Examples/C/TUTR/h5_compound.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_crtatt.c b/HDF5Examples/C/TUTR/h5_crtatt.c index 8534703feea..bef86077f1c 100644 --- a/HDF5Examples/C/TUTR/h5_crtatt.c +++ b/HDF5Examples/C/TUTR/h5_crtatt.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,7 +16,8 @@ */ #include "hdf5.h" -#define FILE "dset.h5" + +#define FILENAME "dset.h5" int main(void) @@ -32,7 +33,7 @@ main(void) attr_data[1] = 200; /* Open an existing file. */ - file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); /* Open an existing dataset. */ dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT); diff --git a/HDF5Examples/C/TUTR/h5_crtdat.c b/HDF5Examples/C/TUTR/h5_crtdat.c index d8ac072bba7..59fb5701c35 100644 --- a/HDF5Examples/C/TUTR/h5_crtdat.c +++ b/HDF5Examples/C/TUTR/h5_crtdat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,7 +16,8 @@ */ #include "hdf5.h" -#define FILE "dset.h5" + +#define FILENAME "dset.h5" int main(void) @@ -27,7 +28,7 @@ main(void) herr_t status; /* Create a new file using default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create the data space for the dataset. */ dims[0] = 4; diff --git a/HDF5Examples/C/TUTR/h5_crtgrp.c b/HDF5Examples/C/TUTR/h5_crtgrp.c index 3517bf3bc03..542161532b7 100644 --- a/HDF5Examples/C/TUTR/h5_crtgrp.c +++ b/HDF5Examples/C/TUTR/h5_crtgrp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,7 +16,8 @@ */ #include "hdf5.h" -#define FILE "group.h5" + +#define FILENAME "group.h5" int main(void) @@ -26,7 +27,7 @@ main(void) herr_t status; /* Create a new file using default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create a group named "/MyGroup" in the file. */ group_id = H5Gcreate2(file_id, "/MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); diff --git a/HDF5Examples/C/TUTR/h5_crtgrpar.c b/HDF5Examples/C/TUTR/h5_crtgrpar.c index 1b474299dec..a028d2a77ec 100644 --- a/HDF5Examples/C/TUTR/h5_crtgrpar.c +++ b/HDF5Examples/C/TUTR/h5_crtgrpar.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,7 +16,8 @@ */ #include "hdf5.h" -#define FILE "groups.h5" + +#define FILENAME "groups.h5" int main(void) @@ -26,7 +27,7 @@ main(void) herr_t status; /* Create a new file using default properties. */ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); /* Create group "MyGroup" in the root group using absolute name. */ group1_id = H5Gcreate2(file_id, "/MyGroup", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); diff --git a/HDF5Examples/C/TUTR/h5_crtgrpd.c b/HDF5Examples/C/TUTR/h5_crtgrpd.c index f1750d6e03e..e9c991b0d7d 100644 --- a/HDF5Examples/C/TUTR/h5_crtgrpd.c +++ b/HDF5Examples/C/TUTR/h5_crtgrpd.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,7 +16,8 @@ */ #include "hdf5.h" -#define FILE "groups.h5" + +#define FILENAME "groups.h5" int main(void) @@ -38,7 +39,7 @@ main(void) dset2_data[i][j] = j + 1; /* Open an existing file. */ - file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); /* Create the data space for the first dataset. */ dims[0] = 3; diff --git a/HDF5Examples/C/TUTR/h5_debug_trace.c b/HDF5Examples/C/TUTR/h5_debug_trace.c index ebc5c543f3b..cb16d5b5d67 100644 --- a/HDF5Examples/C/TUTR/h5_debug_trace.c +++ b/HDF5Examples/C/TUTR/h5_debug_trace.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_drivers.c b/HDF5Examples/C/TUTR/h5_drivers.c index 1c0ae37a827..b0b9adb009a 100644 --- a/HDF5Examples/C/TUTR/h5_drivers.c +++ b/HDF5Examples/C/TUTR/h5_drivers.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_dtransform.c b/HDF5Examples/C/TUTR/h5_dtransform.c index c93b073465e..a0964167cdd 100644 --- a/HDF5Examples/C/TUTR/h5_dtransform.c +++ b/HDF5Examples/C/TUTR/h5_dtransform.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_elink_unix2win.c b/HDF5Examples/C/TUTR/h5_elink_unix2win.c index 24525ff6f68..6225e8ff5fd 100644 --- a/HDF5Examples/C/TUTR/h5_elink_unix2win.c +++ b/HDF5Examples/C/TUTR/h5_elink_unix2win.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_extend.c b/HDF5Examples/C/TUTR/h5_extend.c index 0dde217db30..65ba0f4f6d3 100644 --- a/HDF5Examples/C/TUTR/h5_extend.c +++ b/HDF5Examples/C/TUTR/h5_extend.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_extend_write.c b/HDF5Examples/C/TUTR/h5_extend_write.c index 6c7afeb9c31..2f21f2a4dbf 100644 --- a/HDF5Examples/C/TUTR/h5_extend_write.c +++ b/HDF5Examples/C/TUTR/h5_extend_write.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_extlink.c b/HDF5Examples/C/TUTR/h5_extlink.c index e1f02cf4cfd..a35172059f8 100644 --- a/HDF5Examples/C/TUTR/h5_extlink.c +++ b/HDF5Examples/C/TUTR/h5_extlink.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_group.c b/HDF5Examples/C/TUTR/h5_group.c index b84fe10d7ea..4e718cdf5ef 100644 --- a/HDF5Examples/C/TUTR/h5_group.c +++ b/HDF5Examples/C/TUTR/h5_group.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_interm_group.c b/HDF5Examples/C/TUTR/h5_interm_group.c index 315e7825e9a..9845a89fe88 100644 --- a/HDF5Examples/C/TUTR/h5_interm_group.c +++ b/HDF5Examples/C/TUTR/h5_interm_group.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -53,7 +53,7 @@ main(void) /* * Check if group /G1 exists in the file. */ - if (H5Lexists(file, "/G1", H5P_DEFAULT) != FALSE) + if (H5Lexists(file, "/G1", H5P_DEFAULT) != false) printf("Group /G1 exists in the file\n"); /* @@ -64,13 +64,13 @@ main(void) /* Next commented call causes error stack to be printed out; the next one * works fine; is it a bug or a feature? EIP 04-25-07 */ - /* if (H5Lexists(g1_id, "G2/G3", H5P_DEFAULT) !=TRUE) { */ - if (H5Lexists(g1_id, "G2", H5P_DEFAULT) != TRUE) { + /* if (H5Lexists(g1_id, "G2/G3", H5P_DEFAULT) !=true) { */ + if (H5Lexists(g1_id, "G2", H5P_DEFAULT) != true) { grp_crt_plist = H5Pcreate(H5P_LINK_CREATE); /* Set flag for intermediate group creation */ - status = H5Pset_create_intermediate_group(grp_crt_plist, TRUE); + status = H5Pset_create_intermediate_group(grp_crt_plist, true); g3_id = H5Gcreate2(g1_id, "G2/G3", grp_crt_plist, H5P_DEFAULT, H5P_DEFAULT); H5Gclose(g3_id); } diff --git a/HDF5Examples/C/TUTR/h5_mount.c b/HDF5Examples/C/TUTR/h5_mount.c index 4be0b5a9900..541bc84d544 100644 --- a/HDF5Examples/C/TUTR/h5_mount.c +++ b/HDF5Examples/C/TUTR/h5_mount.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -20,8 +20,8 @@ #include "hdf5.h" -#define FILE1 "mount1.h5" -#define FILE2 "mount2.h5" +#define FILENAME1 "mount1.h5" +#define FILENAME2 "mount2.h5" #define RANK 2 #define NX 4 @@ -50,7 +50,7 @@ main(void) /* * Create first file and a group in it. */ - fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + fid1 = H5Fcreate(FILENAME1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); gid = H5Gcreate2(fid1, "/G", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); /* @@ -62,7 +62,7 @@ main(void) /* * Create second file and dataset "D" in it. */ - fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + fid2 = H5Fcreate(FILENAME2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); dims[0] = NX; dims[1] = NY; sid = H5Screate_simple(RANK, dims, NULL); @@ -83,8 +83,8 @@ main(void) /* * Reopen both files */ - fid1 = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); - fid2 = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT); + fid1 = H5Fopen(FILENAME1, H5F_ACC_RDONLY, H5P_DEFAULT); + fid2 = H5Fopen(FILENAME2, H5F_ACC_RDONLY, H5P_DEFAULT); /* * Mount second file under G in the first file. diff --git a/HDF5Examples/C/TUTR/h5_rdwt.c b/HDF5Examples/C/TUTR/h5_rdwt.c index 9947f595199..f1d6a362bac 100644 --- a/HDF5Examples/C/TUTR/h5_rdwt.c +++ b/HDF5Examples/C/TUTR/h5_rdwt.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,7 +16,8 @@ */ #include "hdf5.h" -#define FILE "dset.h5" + +#define FILENAME "dset.h5" int main(void) @@ -32,7 +33,7 @@ main(void) dset_data[i][j] = i * 6 + j + 1; /* Open an existing file. */ - file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); /* Open an existing dataset. */ dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT); diff --git a/HDF5Examples/C/TUTR/h5_read.c b/HDF5Examples/C/TUTR/h5_read.c index ad8e2d7033e..2d89910c9ea 100644 --- a/HDF5Examples/C/TUTR/h5_read.c +++ b/HDF5Examples/C/TUTR/h5_read.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_ref2reg_deprec.c b/HDF5Examples/C/TUTR/h5_ref2reg_deprec.c index a668e4b750c..522d64111a1 100644 --- a/HDF5Examples/C/TUTR/h5_ref2reg_deprec.c +++ b/HDF5Examples/C/TUTR/h5_ref2reg_deprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_ref_compat.c b/HDF5Examples/C/TUTR/h5_ref_compat.c index cce755bb429..3a07728dfee 100644 --- a/HDF5Examples/C/TUTR/h5_ref_compat.c +++ b/HDF5Examples/C/TUTR/h5_ref_compat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_ref_extern.c b/HDF5Examples/C/TUTR/h5_ref_extern.c index 691d2358fb2..35746706d59 100644 --- a/HDF5Examples/C/TUTR/h5_ref_extern.c +++ b/HDF5Examples/C/TUTR/h5_ref_extern.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_reference_deprec.c b/HDF5Examples/C/TUTR/h5_reference_deprec.c index 2f72cdbfeab..d279fd9b943 100644 --- a/HDF5Examples/C/TUTR/h5_reference_deprec.c +++ b/HDF5Examples/C/TUTR/h5_reference_deprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_select.c b/HDF5Examples/C/TUTR/h5_select.c index 12ea9518959..69252c78cf5 100644 --- a/HDF5Examples/C/TUTR/h5_select.c +++ b/HDF5Examples/C/TUTR/h5_select.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_shared_mesg.c b/HDF5Examples/C/TUTR/h5_shared_mesg.c index 03a1f8067e7..97c705977fc 100644 --- a/HDF5Examples/C/TUTR/h5_shared_mesg.c +++ b/HDF5Examples/C/TUTR/h5_shared_mesg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/h5_subset.c b/HDF5Examples/C/TUTR/h5_subset.c index 4df20910a41..e1d73b41694 100644 --- a/HDF5Examples/C/TUTR/h5_subset.c +++ b/HDF5Examples/C/TUTR/h5_subset.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,7 +17,7 @@ #include "hdf5.h" -#define FILE "subset.h5" +#define FILENAME "subset.h5" #define DATASETNAME "IntArray" #define RANK 2 @@ -52,7 +52,7 @@ main(void) * and dataset. * *****************************************************************/ - file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); dims[0] = DIM0; dims[1] = DIM1; @@ -86,7 +86,7 @@ main(void) * values to the dataset. *****************************************************/ - file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + file_id = H5Fopen(FILENAME, H5F_ACC_RDWR, H5P_DEFAULT); dataset_id = H5Dopen2(file_id, DATASETNAME, H5P_DEFAULT); /* Specify size and shape of subset to write. */ diff --git a/HDF5Examples/C/TUTR/h5_write.c b/HDF5Examples/C/TUTR/h5_write.c index 2f6de3afcf8..715c9742f12 100644 --- a/HDF5Examples/C/TUTR/h5_write.c +++ b/HDF5Examples/C/TUTR/h5_write.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/C/TUTR/run-all-ex.sh b/HDF5Examples/C/TUTR/run-all-ex.sh index afd4308d17b..250e2b3a3c0 100755 --- a/HDF5Examples/C/TUTR/run-all-ex.sh +++ b/HDF5Examples/C/TUTR/run-all-ex.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/TUTR/run-c-ex.sh.in b/HDF5Examples/C/TUTR/run-c-ex.sh.in index b51c5d607de..a67930b44bc 100644 --- a/HDF5Examples/C/TUTR/run-c-ex.sh.in +++ b/HDF5Examples/C/TUTR/run-c-ex.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/C/TUTR/testh5cc.sh.in b/HDF5Examples/C/TUTR/testh5cc.sh.in index 4b888c1d2a0..c4cda211291 100644 --- a/HDF5Examples/C/TUTR/testh5cc.sh.in +++ b/HDF5Examples/C/TUTR/testh5cc.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/CMakeLists.txt b/HDF5Examples/CMakeLists.txt index 5ce806f6253..3fd1a7eb0da 100644 --- a/HDF5Examples/CMakeLists.txt +++ b/HDF5Examples/CMakeLists.txt @@ -161,13 +161,18 @@ if (${H5_LIBVER_DIR} GREATER 16) set (H5EX_BUILD_JAVA OFF CACHE BOOL "Build examples JAVA support" FORCE) endif () + #----------------------------------------------------------------------------- + # Build the HL Examples + #----------------------------------------------------------------------------- + option (H5EX_BUILD_HL "Build examples HIGH Level support" OFF) + #----------------------------------------------------------------------------- # Build the CPP Examples #----------------------------------------------------------------------------- if (EXISTS "${H5EXAMPLES_SOURCE_DIR}/CXX" AND IS_DIRECTORY "${H5EXAMPLES_SOURCE_DIR}/CXX") - option (H5EX_BUILD_CPP_LIB "Build examples C++ support" OFF) + option (H5EX_BUILD_CXX "Build examples C++ support" OFF) else () - set (H5EX_BUILD_CPP_LIB OFF CACHE BOOL "Build examples C++ support" FORCE) + set (H5EX_BUILD_CXX OFF CACHE BOOL "Build examples C++ support" FORCE) endif () #----------------------------------------------------------------------------- @@ -193,9 +198,10 @@ if (${H5_LIBVER_DIR} GREATER 16) set (H5EX_BUILD_FILTERS OFF CACHE BOOL "Build examples PLUGIN filter support" FORCE) endif () else () + set (H5EX_BUILD_HL OFF CACHE BOOL "Build examples High Level support" FORCE) set (H5EX_BUILD_FORTRAN OFF} CACHE BOOL "Build examples FORTRAN support" FORCE) set (H5EX_BUILD_JAVA OFF CACHE BOOL "Build examples JAVA support" FORCE) - set (H5EX_BUILD_CPP_LIB OFF CACHE BOOL "Build examples C++ support" FORCE) + set (H5EX_BUILD_CXX OFF CACHE BOOL "Build examples C++ support" FORCE) set (H5EX_BUILD_FILTERS OFF CACHE BOOL "Build examples PLUGIN filter support" FORCE) endif () @@ -209,7 +215,7 @@ endif () if (H5EX_BUILD_JAVA AND HDF5_BUILD_JAVA) add_subdirectory (JAVA) endif () -if (H5EX_BUILD_CPP_LIB AND HDF5_BUILD_CPP_LIB) +if (H5EX_BUILD_CXX AND HDF5_BUILD_CPP_LIB) add_subdirectory (CXX) endif () if (H5EX_BUILD_PYTHON) diff --git a/HDF5Examples/CMakePresets.json b/HDF5Examples/CMakePresets.json index 1f722cc4e20..a7d85823da9 100644 --- a/HDF5Examples/CMakePresets.json +++ b/HDF5Examples/CMakePresets.json @@ -14,6 +14,13 @@ "H5EX_BUILD_TESTING": "ON" } }, + { + "name": "ci-StdHL", + "hidden": true, + "cacheVariables": { + "H5EX_BUILD_HL": "ON" + } + }, { "name": "ci-StdJava", "hidden": true, diff --git a/HDF5Examples/CTestConfig.cmake b/HDF5Examples/CTestConfig.cmake index aef6da8f657..3f5875e59c9 100644 --- a/HDF5Examples/CTestConfig.cmake +++ b/HDF5Examples/CTestConfig.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/CXX/CMakeLists.txt b/HDF5Examples/CXX/CMakeLists.txt index 79e8f6e6e8c..818e24d8d24 100644 --- a/HDF5Examples/CXX/CMakeLists.txt +++ b/HDF5Examples/CXX/CMakeLists.txt @@ -3,3 +3,8 @@ project (HDFCXX_EXAMPLES CXX) add_subdirectory (H5D) add_subdirectory (TUTR) + +#-- Add High Level Examples +if (H5EX_BUILD_HL AND HDF5_BUILD_HL_LIB) + add_subdirectory (HL) +endif () diff --git a/HDF5Examples/CXX/H5D/CMakeLists.txt b/HDF5Examples/CXX/H5D/CMakeLists.txt index 9799599500b..e2c23b3387a 100644 --- a/HDF5Examples/CXX/H5D/CMakeLists.txt +++ b/HDF5Examples/CXX/H5D/CMakeLists.txt @@ -16,7 +16,7 @@ if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.8") "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_cpp_ex_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) diff --git a/HDF5Examples/CXX/H5D/Makefile.am b/HDF5Examples/CXX/H5D/Makefile.am index b97b5d14cd1..6103485cfaa 100644 --- a/HDF5Examples/CXX/H5D/Makefile.am +++ b/HDF5Examples/CXX/H5D/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/CXX/H5D/chunks.cpp b/HDF5Examples/CXX/H5D/chunks.cpp index cc5d7c9fa65..2b4b09ff050 100644 --- a/HDF5Examples/CXX/H5D/chunks.cpp +++ b/HDF5Examples/CXX/H5D/chunks.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/H5D/compound.cpp b/HDF5Examples/CXX/H5D/compound.cpp index f9397a9151f..7585c9e3574 100644 --- a/HDF5Examples/CXX/H5D/compound.cpp +++ b/HDF5Examples/CXX/H5D/compound.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/H5D/create.cpp b/HDF5Examples/CXX/H5D/create.cpp index bd179f34318..1731e4c5383 100644 --- a/HDF5Examples/CXX/H5D/create.cpp +++ b/HDF5Examples/CXX/H5D/create.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/H5D/extend_ds.cpp b/HDF5Examples/CXX/H5D/extend_ds.cpp index 8449c757da7..093bf259532 100644 --- a/HDF5Examples/CXX/H5D/extend_ds.cpp +++ b/HDF5Examples/CXX/H5D/extend_ds.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/H5D/h5group.cpp b/HDF5Examples/CXX/H5D/h5group.cpp index 0779aa910c2..2afa5edd6c3 100644 --- a/HDF5Examples/CXX/H5D/h5group.cpp +++ b/HDF5Examples/CXX/H5D/h5group.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/H5D/readdata.cpp b/HDF5Examples/CXX/H5D/readdata.cpp index bfc03eeed25..a9f7d5db275 100644 --- a/HDF5Examples/CXX/H5D/readdata.cpp +++ b/HDF5Examples/CXX/H5D/readdata.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/H5D/testh5c++.sh.in b/HDF5Examples/CXX/H5D/testh5c++.sh.in index f3a973cabc9..ef8a1407f45 100644 --- a/HDF5Examples/CXX/H5D/testh5c++.sh.in +++ b/HDF5Examples/CXX/H5D/testh5c++.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/CXX/H5D/writedata.cpp b/HDF5Examples/CXX/H5D/writedata.cpp index 3f9d70b61d6..f446b2f390e 100644 --- a/HDF5Examples/CXX/H5D/writedata.cpp +++ b/HDF5Examples/CXX/H5D/writedata.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/HL/CMakeLists.txt b/HDF5Examples/CXX/HL/CMakeLists.txt new file mode 100644 index 00000000000..3cc2f48a980 --- /dev/null +++ b/HDF5Examples/CXX/HL/CMakeLists.txt @@ -0,0 +1,79 @@ +cmake_minimum_required (VERSION 3.18) +project (HDF5Examples_CXX_HL CXX) + +#----------------------------------------------------------------------------- +# Define Sources +#----------------------------------------------------------------------------- +include (C_sourcefiles.cmake) + +if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.8") + foreach (example_name ${common_examples}) + add_executable (${EXAMPLE_VARNAME}_cpp_ex_${example_name} ${PROJECT_SOURCE_DIR}/${example_name}.cpp) + target_compile_options(${EXAMPLE_VARNAME}_cpp_ex_${example_name} + PRIVATE + "$<$:-DH5_USE_16_API>" + "$<$:-DH5_USE_18_API>" + "$<$:-DH5_USE_110_API>" + "$<$:-DH5_USE_112_API>" + "$<$:-DH5_USE_114_API>" + "$<$:-DH5_USE_200_API>" + ) + if (H5_HAVE_PARALLEL) + target_include_directories (${EXAMPLE_VARNAME}_cpp_ex_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) + endif () + target_link_libraries (${EXAMPLE_VARNAME}_cpp_ex_${example_name} ${H5EX_HDF5_LINK_LIBS}) + endforeach () +endif () + +if (H5EX_BUILD_TESTING) + set (${EXAMPLE_VARNAME}_cpp_ex_CLEANFILES + packet_table.h5 + ) + add_test ( + NAME ${EXAMPLE_VARNAME}_cpp_ex-clear-objects + COMMAND ${CMAKE_COMMAND} + -E remove ${${EXAMPLE_VARNAME}_cpp_ex_CLEANFILES} + ) + set_tests_properties (${EXAMPLE_VARNAME}_cpp_ex-clear-objects PROPERTIES + FIXTURES_SETUP clear_${EXAMPLE_VARNAME}_cpp_ex + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + ) + add_test ( + NAME ${EXAMPLE_VARNAME}_cpp_ex-clean-objects + COMMAND ${CMAKE_COMMAND} + -E remove ${${EXAMPLE_VARNAME}_cpp_ex_CLEANFILES} + ) + set_tests_properties (${EXAMPLE_VARNAME}_cpp_ex-clean-objects PROPERTIES + FIXTURES_CLEANUP clear_${EXAMPLE_VARNAME}_cpp_ex + WORKING_DIRECTORY ${PROJECT_BINARY_DIR} + ) + + macro (ADD_H5_TEST testname) + if (HDF5_ENABLE_USING_MEMCHECKER) + add_test (NAME ${EXAMPLE_VARNAME}_cpp_ex_${testname} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + else () + add_test ( + NAME ${EXAMPLE_VARNAME}_cpp_ex_${testname} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$" + -D "TEST_ARGS:STRING=" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_EXPECT=0" + -D "TEST_SKIP_COMPARE=TRUE" + -D "TEST_OUTPUT=${testname}.out" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + endif () + set_tests_properties (${EXAMPLE_VARNAME}_cpp_ex_${testname} PROPERTIES FIXTURES_REQUIRED clear_${EXAMPLE_VARNAME}_cpp_ex) + if (last_test) + set_tests_properties (${EXAMPLE_VARNAME}_cpp_ex_${testname} PROPERTIES DEPENDS ${last_test}) + endif () + set (last_test "${EXAMPLE_VARNAME}_cpp_ex_${testname}") + endmacro () + + foreach (example_name ${common_examples}) + ADD_H5_TEST (${example_name}) + endforeach () +endif () diff --git a/HDF5Examples/CXX/HL/C_sourcefiles.cmake b/HDF5Examples/CXX/HL/C_sourcefiles.cmake new file mode 100644 index 00000000000..54b7f55b6cf --- /dev/null +++ b/HDF5Examples/CXX/HL/C_sourcefiles.cmake @@ -0,0 +1,6 @@ +#----------------------------------------------------------------------------- +# Define Sources, one file per application +#----------------------------------------------------------------------------- +set (common_examples + packet_table_FL +) diff --git a/hl/c++/examples/Makefile.am b/HDF5Examples/CXX/HL/Makefile.am similarity index 96% rename from hl/c++/examples/Makefile.am rename to HDF5Examples/CXX/HL/Makefile.am index a0690651bb4..ed4d55ba6d7 100644 --- a/hl/c++/examples/Makefile.am +++ b/HDF5Examples/CXX/HL/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/c++/examples/ptExampleFL.cpp b/HDF5Examples/CXX/HL/packet_table_FL.cpp similarity index 98% rename from hl/c++/examples/ptExampleFL.cpp rename to HDF5Examples/CXX/HL/packet_table_FL.cpp index cb407e21f65..5f7195dd068 100644 --- a/hl/c++/examples/ptExampleFL.cpp +++ b/HDF5Examples/CXX/HL/packet_table_FL.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/HL/tfiles/packet_table_FL.tst b/HDF5Examples/CXX/HL/tfiles/packet_table_FL.tst new file mode 100644 index 00000000000..ddcf3bb7aa9 --- /dev/null +++ b/HDF5Examples/CXX/HL/tfiles/packet_table_FL.tst @@ -0,0 +1,6 @@ +Number of packets in packet table after five appends: 5 +Packet 0's value is 0. +Packet 1's value is 1. +Packet 2's value is 2. +Packet 3's value is 3. +Packet 4's value is 4. diff --git a/HDF5Examples/CXX/Makefile.am b/HDF5Examples/CXX/Makefile.am index 1cbae2e1c5e..a0dd701b156 100644 --- a/HDF5Examples/CXX/Makefile.am +++ b/HDF5Examples/CXX/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/CXX/TUTR/CMakeLists.txt b/HDF5Examples/CXX/TUTR/CMakeLists.txt index 6310b163960..a8400295ea4 100644 --- a/HDF5Examples/CXX/TUTR/CMakeLists.txt +++ b/HDF5Examples/CXX/TUTR/CMakeLists.txt @@ -16,7 +16,7 @@ if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.8") "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_cpp_ex_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) diff --git a/HDF5Examples/CXX/TUTR/Makefile.am b/HDF5Examples/CXX/TUTR/Makefile.am index b97b5d14cd1..6103485cfaa 100644 --- a/HDF5Examples/CXX/TUTR/Makefile.am +++ b/HDF5Examples/CXX/TUTR/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/CXX/TUTR/h5tutr_cmprss.cpp b/HDF5Examples/CXX/TUTR/h5tutr_cmprss.cpp index 6d9c109f4ed..aafd0aa91da 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_cmprss.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_cmprss.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_crtatt.cpp b/HDF5Examples/CXX/TUTR/h5tutr_crtatt.cpp index 0b18de1f1e9..23ce84060d2 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_crtatt.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_crtatt.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_crtdat.cpp b/HDF5Examples/CXX/TUTR/h5tutr_crtdat.cpp index d23675f5f2c..5db56233c89 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_crtdat.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_crtdat.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp b/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp index 5b13dc3b005..1d157f876ca 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_crtgrp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_crtgrpar.cpp b/HDF5Examples/CXX/TUTR/h5tutr_crtgrpar.cpp index a1a74277794..81050d44380 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_crtgrpar.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_crtgrpar.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_crtgrpd.cpp b/HDF5Examples/CXX/TUTR/h5tutr_crtgrpd.cpp index 19bf99d2d29..81d970b9d89 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_crtgrpd.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_crtgrpd.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_extend.cpp b/HDF5Examples/CXX/TUTR/h5tutr_extend.cpp index 53588abc72a..36392b8192b 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_extend.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_extend.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_rdwt.cpp b/HDF5Examples/CXX/TUTR/h5tutr_rdwt.cpp index 3f441099631..b13a782dd05 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_rdwt.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_rdwt.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/h5tutr_subset.cpp b/HDF5Examples/CXX/TUTR/h5tutr_subset.cpp index 1f278f04f87..15ea6fffd7d 100644 --- a/HDF5Examples/CXX/TUTR/h5tutr_subset.cpp +++ b/HDF5Examples/CXX/TUTR/h5tutr_subset.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/CXX/TUTR/testh5c++.sh.in b/HDF5Examples/CXX/TUTR/testh5c++.sh.in index f3a973cabc9..ef8a1407f45 100644 --- a/HDF5Examples/CXX/TUTR/testh5c++.sh.in +++ b/HDF5Examples/CXX/TUTR/testh5c++.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/CMakeLists.txt b/HDF5Examples/FORTRAN/CMakeLists.txt index c860c877ec0..f3ded9c4865 100644 --- a/HDF5Examples/FORTRAN/CMakeLists.txt +++ b/HDF5Examples/FORTRAN/CMakeLists.txt @@ -12,3 +12,8 @@ add_subdirectory (${PROJECT_SOURCE_DIR}/H5T) if (H5_HAVE_PARALLEL AND HDF5_ENABLE_PARALLEL) add_subdirectory (${PROJECT_SOURCE_DIR}/H5PAR) endif () + +#-- Add High Level Examples +if (H5EX_BUILD_HL AND HDF5_BUILD_HL_LIB) + add_subdirectory (HL) +endif () diff --git a/HDF5Examples/FORTRAN/H5D/CMakeLists.txt b/HDF5Examples/FORTRAN/H5D/CMakeLists.txt index e7c59b420e2..b8d3166d19b 100644 --- a/HDF5Examples/FORTRAN/H5D/CMakeLists.txt +++ b/HDF5Examples/FORTRAN/H5D/CMakeLists.txt @@ -28,7 +28,7 @@ foreach (example_name ${common_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) @@ -73,7 +73,7 @@ if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.10") "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) @@ -116,14 +116,14 @@ endif () # endif () # endforeach () #endif () -#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") -# foreach (example_name ${1_16_examples}) +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) # if (H5EX_BUILD_TESTING) # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_f90_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} -# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst # ) # endif () # endforeach () @@ -216,12 +216,12 @@ if (HDF5_BUILD_TOOLS) # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () - #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_f90_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} - # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () endif () @@ -231,7 +231,7 @@ if (HDF5_BUILD_TOOLS) # endforeach () # foreach (example_name ${1_14_examples}) # endforeach () -# foreach (example_name ${1_16_examples}) +# foreach (example_name ${2_0_examples}) # endforeach () endif () endif () diff --git a/HDF5Examples/FORTRAN/H5D/Fortran_sourcefiles.cmake b/HDF5Examples/FORTRAN/H5D/Fortran_sourcefiles.cmake index b435e725251..1cced7b028e 100644 --- a/HDF5Examples/FORTRAN/H5D/Fortran_sourcefiles.cmake +++ b/HDF5Examples/FORTRAN/H5D/Fortran_sourcefiles.cmake @@ -19,7 +19,7 @@ set (common_examples h5ex_d_transform ) -if (HDF5_ENABLE_Z_LIB_SUPPORT) +if (HDF5_ENABLE_ZLIB_SUPPORT) set (common_examples ${common_examples} h5ex_d_gzip ) diff --git a/HDF5Examples/FORTRAN/H5D/Makefile.am b/HDF5Examples/FORTRAN/H5D/Makefile.am index c76ce8590de..472be0696c4 100644 --- a/HDF5Examples/FORTRAN/H5D/Makefile.am +++ b/HDF5Examples/FORTRAN/H5D/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5D/test-pc.sh b/HDF5Examples/FORTRAN/H5D/test-pc.sh index 8d77d9782ff..95edf49d52b 100755 --- a/HDF5Examples/FORTRAN/H5D/test-pc.sh +++ b/HDF5Examples/FORTRAN/H5D/test-pc.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5D/test.sh.in b/HDF5Examples/FORTRAN/H5D/test.sh.in index e67eccd5351..40b82854430 100755 --- a/HDF5Examples/FORTRAN/H5D/test.sh.in +++ b/HDF5Examples/FORTRAN/H5D/test.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5G/CMakeLists.txt b/HDF5Examples/FORTRAN/H5G/CMakeLists.txt index 6a58c5258ab..ec93540201b 100644 --- a/HDF5Examples/FORTRAN/H5G/CMakeLists.txt +++ b/HDF5Examples/FORTRAN/H5G/CMakeLists.txt @@ -28,7 +28,7 @@ foreach (example_name ${common_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) @@ -57,7 +57,7 @@ endforeach () # "$<$:-DH5_USE_110_API>" # "$<$:-DH5_USE_112_API>" # "$<$:-DH5_USE_114_API>" -# "$<$:-DH5_USE_116_API>" +# "$<$:-DH5_USE_200_API>" # ) # if (H5_HAVE_PARALLEL) # target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) @@ -110,14 +110,14 @@ endforeach () # endif () # endforeach () #endif () -#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") -# foreach (example_name ${1_16_examples}) +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) # if (H5EX_BUILD_TESTING) # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_f90_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} -# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst # ) # endif () # endforeach () @@ -165,7 +165,7 @@ endif () # endforeach () # foreach (example_name ${1_14_examples}) # endforeach () -# foreach (example_name ${1_16_examples}) +# foreach (example_name ${2_0_examples}) # endforeach () #endif () diff --git a/HDF5Examples/FORTRAN/H5G/Makefile.am b/HDF5Examples/FORTRAN/H5G/Makefile.am index cdf1647fcb7..5040378affc 100644 --- a/HDF5Examples/FORTRAN/H5G/Makefile.am +++ b/HDF5Examples/FORTRAN/H5G/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5G/test-pc.sh b/HDF5Examples/FORTRAN/H5G/test-pc.sh index 29781f3565d..4f04ef3f7ac 100755 --- a/HDF5Examples/FORTRAN/H5G/test-pc.sh +++ b/HDF5Examples/FORTRAN/H5G/test-pc.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5G/test.sh.in b/HDF5Examples/FORTRAN/H5G/test.sh.in index d0906df8b6e..a1b6ef6bf7a 100755 --- a/HDF5Examples/FORTRAN/H5G/test.sh.in +++ b/HDF5Examples/FORTRAN/H5G/test.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5PAR/CMakeLists.txt b/HDF5Examples/FORTRAN/H5PAR/CMakeLists.txt index e1d147d434c..f0af9764a31 100644 --- a/HDF5Examples/FORTRAN/H5PAR/CMakeLists.txt +++ b/HDF5Examples/FORTRAN/H5PAR/CMakeLists.txt @@ -28,7 +28,7 @@ foreach (example_name ${examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) target_link_libraries (${EXAMPLE_VARNAME}_f90_${example_name} ${H5EX_LINK_Fortran_LIBS}) diff --git a/HDF5Examples/FORTRAN/H5T/CMakeLists.txt b/HDF5Examples/FORTRAN/H5T/CMakeLists.txt index 14fd8528664..da887a27a43 100644 --- a/HDF5Examples/FORTRAN/H5T/CMakeLists.txt +++ b/HDF5Examples/FORTRAN/H5T/CMakeLists.txt @@ -23,7 +23,7 @@ include (Fortran_sourcefiles.cmake) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) @@ -50,7 +50,7 @@ foreach (example_name ${common_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) @@ -103,14 +103,14 @@ endforeach () # endif () # endforeach () #endif () -#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") -# foreach (example_name ${1_16_examples}) +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) # if (H5EX_BUILD_TESTING) # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_f90_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} -# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst # ) # endif () # endforeach () @@ -280,12 +280,12 @@ if (HDF5_BUILD_TOOLS) # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () - #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.16") + #if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") # add_custom_command ( # TARGET ${EXAMPLE_VARNAME}_f90_${example_name} # POST_BUILD # COMMAND ${CMAKE_COMMAND} - # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/116/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + # ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl # ) #endif () # endforeach () @@ -293,7 +293,7 @@ if (HDF5_BUILD_TOOLS) # endforeach () # foreach (example_name ${1_14_examples}) # endforeach () -# foreach (example_name ${1_16_examples}) +# foreach (example_name ${2_0_examples}) # endforeach () endif () diff --git a/HDF5Examples/FORTRAN/H5T/Makefile.am b/HDF5Examples/FORTRAN/H5T/Makefile.am index 7d9d96a89b6..00ed8d24f81 100644 --- a/HDF5Examples/FORTRAN/H5T/Makefile.am +++ b/HDF5Examples/FORTRAN/H5T/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5T/test-pc.sh b/HDF5Examples/FORTRAN/H5T/test-pc.sh index 12163a6f1f4..b8fb2b35b93 100755 --- a/HDF5Examples/FORTRAN/H5T/test-pc.sh +++ b/HDF5Examples/FORTRAN/H5T/test-pc.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/H5T/test.sh.in b/HDF5Examples/FORTRAN/H5T/test.sh.in index dc1f434923d..8050fbce837 100755 --- a/HDF5Examples/FORTRAN/H5T/test.sh.in +++ b/HDF5Examples/FORTRAN/H5T/test.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/HL/CMakeLists.txt b/HDF5Examples/FORTRAN/HL/CMakeLists.txt new file mode 100644 index 00000000000..5a3bb5bb1ac --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/CMakeLists.txt @@ -0,0 +1,223 @@ +cmake_minimum_required (VERSION 3.18) +project (HDF5Examples_FORTRAN_HL Fortran) + +# -------------------------------------------------------------------- +# Notes: When creating examples they should be prefixed +# with "f90_". This allows for easier filtering of the examples. +# -------------------------------------------------------------------- + +#----------------------------------------------------------------------------- +# Setup include Directories +#----------------------------------------------------------------------------- +set_directory_properties(PROPERTIES INCLUDE_DIRECTORIES + "${CMAKE_Fortran_MODULE_DIRECTORY}${H5EX_MOD_EXT};${HDF5_F90_BINARY_DIR};${PROJECT_BINARY_DIR};${CMAKE_LIBRARY_OUTPUT_DIRECTORY}" +) + +#----------------------------------------------------------------------------- +# Define Sources +#----------------------------------------------------------------------------- +include (Fortran_sourcefiles.cmake) + +foreach (example_name ${f03_examples}) + add_executable (${EXAMPLE_VARNAME}_f90_${example_name} ${PROJECT_SOURCE_DIR}/${example_name}.F90) + target_compile_options(${EXAMPLE_VARNAME}_f90_${example_name} + PRIVATE + "-DH5_LIBVER_DIR=${H5_LIBVER_DIR}" + "$<$:-DH5_USE_16_API>" + "$<$:-DH5_USE_18_API>" + "$<$:-DH5_USE_110_API>" + "$<$:-DH5_USE_112_API>" + "$<$:-DH5_USE_114_API>" + "$<$:-DH5_USE_200_API>" + ) + if (H5_HAVE_PARALLEL) + target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) + endif () + target_link_libraries (${EXAMPLE_VARNAME}_f90_${example_name} ${H5EX_LINK_Fortran_LIBS}) + set_target_properties (${EXAMPLE_VARNAME}_f90_${example_name} PROPERTIES LINKER_LANGUAGE Fortran) + if (H5EX_BUILD_TESTING) + add_custom_command ( + TARGET ${EXAMPLE_VARNAME}_f90_${example_name} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst + ) + endif () +endforeach () + +#if (H5EX_ENABLE_F2003) +# foreach (example_name ${f03examples}) +# add_executable (${EXAMPLE_VARNAME}_f90_${example_name} ${PROJECT_SOURCE_DIR}/${example_name}.c) +# target_compile_options(${EXAMPLE_VARNAME}_f90_${example_name} +# PRIVATE +# "$<$:-DH5_USE_16_API>" +# "$<$:-DH5_USE_18_API>" +# "$<$:-DH5_USE_110_API>" +# "$<$:-DH5_USE_112_API>" +# "$<$:-DH5_USE_114_API>" +# "$<$:-DH5_USE_200_API>" +# ) +# if (H5_HAVE_PARALLEL) +# target_include_directories (${EXAMPLE_VARNAME}_f90_${example_name} PUBLIC ${MPI_C_INCLUDE_DIRS}) +# endif () +# target_link_libraries (${EXAMPLE_VARNAME}_f90_${example_name} ${H5EX_LINK_Fortran_LIBS}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_f90_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/F03/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () + +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.10") +# foreach (example_name ${1_10_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_f90_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/110/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.12") +# foreach (example_name ${1_12_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_f90_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/112/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "1.14") +# foreach (example_name ${1_14_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_f90_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/114/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () +#if (HDF5_VERSION_MAJOR VERSION_GREATER_EQUAL "2.0") +# foreach (example_name ${2_0_examples}) +# if (H5EX_BUILD_TESTING) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_f90_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/200/${example_name}.tst ${PROJECT_BINARY_DIR}/${example_name}.tst +# ) +# endif () +# endforeach () +#endif () + +#if (HDF5_BUILD_TOOLS) +# foreach (example_name ${f03_examples}) +# add_custom_command ( +# TARGET ${EXAMPLE_VARNAME}_f90_${example_name} +# POST_BUILD +# COMMAND ${CMAKE_COMMAND} +# ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl +# ) +# endforeach () +#endif () + +#if (H5EX_ENABLE_F2003) + foreach (example_name ${f03examples}) + add_custom_command ( + TARGET ${EXAMPLE_VARNAME}_f90_${example_name} + POST_BUILD + COMMAND ${CMAKE_COMMAND} + ARGS -E copy_if_different ${PROJECT_SOURCE_DIR}/tfiles/${example_name}.ddl ${PROJECT_BINARY_DIR}/${example_name}.ddl + ) + endforeach () + +# foreach (example_name ${1_10_examples}) +# endforeach () +# foreach (example_name ${1_12_examples}) +# endforeach () +# foreach (example_name ${1_14_examples}) +# endforeach () +# foreach (example_name ${2_0_examples}) +# endforeach () +#endif () + +if (H5EX_BUILD_TESTING) + macro (ADD_DUMP_TEST testname) + add_test ( + NAME ${EXAMPLE_VARNAME}_f90_${testname}-clearall + COMMAND ${CMAKE_COMMAND} + -E remove + ${testname}.h5 + ) + if (HDF5_ENABLE_USING_MEMCHECKER) + add_test (NAME ${EXAMPLE_VARNAME}_f90_${testname} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) + set_tests_properties (${EXAMPLE_VARNAME}_f90_${testname} PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_f90_${testname}-clearall) + add_test ( + NAME ${EXAMPLE_VARNAME}_f90_${testname}-clean + COMMAND ${CMAKE_COMMAND} + -E remove + ${testname}.h5 + ) + set_tests_properties (${EXAMPLE_VARNAME}_f90_${testname}-clean PROPERTIES DEPENDS ${EXAMPLE_VARNAME}_f90_${testname}) + else () + add_test ( + NAME ${EXAMPLE_VARNAME}_f90_${testname} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=$" + -D "TEST_ARGS:STRING=" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_EXPECT=0" + -D "TEST_OUTPUT=${testname}.out" + -D "TEST_REFERENCE=${testname}.tst" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + if (last_test) + set_tests_properties (${EXAMPLE_VARNAME}_f90_${testname} PROPERTIES DEPENDS ${last_test}) + endif () + set (last_test "${EXAMPLE_VARNAME}_f90_${testname}") + if (HDF5_BUILD_TOOLS) + add_test ( + NAME ${EXAMPLE_VARNAME}_H5DUMP-f90_${testname} + COMMAND "${CMAKE_COMMAND}" + -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" + -D "TEST_PROGRAM=${H5EX_HDF5_DUMP_EXECUTABLE}" + -D "TEST_ARGS:STRING=${ARGN};${testname}.h5" + -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" + -D "TEST_OUTPUT=${testname}.ddl.out" + -D "TEST_EXPECT=0" + -D "TEST_SKIP_COMPARE=TRUE" + #-D "TEST_REFERENCE=${testname}.ddl" + -D "TEST_LIBRARY_DIRECTORY=${CMAKE_TEST_LIB_DIRECTORY}" + -P "${H5EX_RESOURCES_DIR}/runTest.cmake" + ) + set_tests_properties (${EXAMPLE_VARNAME}_H5DUMP-f90_${testname} PROPERTIES DEPENDS ${last_test}) + set (last_test "${EXAMPLE_VARNAME}_H5DUMP-f90_${testname}") + endif () + add_test ( + NAME ${EXAMPLE_VARNAME}_f90_${testname}-clean + COMMAND ${CMAKE_COMMAND} + -E remove + ${testname}.h5 + ) + set_tests_properties (${EXAMPLE_VARNAME}_f90_${testname}-clean PROPERTIES DEPENDS ${last_test}) + endif () + endmacro () + + foreach (example_name ${f03_examples}) + ADD_DUMP_TEST (${example_name}) + endforeach () + +endif () diff --git a/HDF5Examples/FORTRAN/HL/Fortran_sourcefiles.cmake b/HDF5Examples/FORTRAN/HL/Fortran_sourcefiles.cmake new file mode 100644 index 00000000000..4bf4e4401dd --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/Fortran_sourcefiles.cmake @@ -0,0 +1,6 @@ +#----------------------------------------------------------------------------- +# Define Sources, one file per application +#----------------------------------------------------------------------------- +set (f03_examples + exlite ex_ds1 +) diff --git a/HDF5Examples/FORTRAN/HL/Makefile.am b/HDF5Examples/FORTRAN/HL/Makefile.am new file mode 100644 index 00000000000..013a30fc8b3 --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/Makefile.am @@ -0,0 +1,20 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the LICENSE file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +## +## Makefile.am +## Run automake to generate a Makefile.in from this file. +## +noinst_PROGRAMS=exlite ex_ds1 +TEST_EXAMPLES_SCRIPT=$(INSTALL_SCRIPT_FILES) + +TESTS = test.sh + +CLEANFILES = Makefile test.sh diff --git a/hl/fortran/examples/ex_ds1.f90 b/HDF5Examples/FORTRAN/HL/ex_ds1.F90 similarity index 99% rename from hl/fortran/examples/ex_ds1.f90 rename to HDF5Examples/FORTRAN/HL/ex_ds1.F90 index b34467e40fb..a6905c4f37a 100644 --- a/hl/fortran/examples/ex_ds1.f90 +++ b/HDF5Examples/FORTRAN/HL/ex_ds1.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/examples/exlite.f90 b/HDF5Examples/FORTRAN/HL/exlite.F90 similarity index 97% rename from hl/fortran/examples/exlite.f90 rename to HDF5Examples/FORTRAN/HL/exlite.F90 index 7d080d1ebb9..addead3a49a 100644 --- a/hl/fortran/examples/exlite.f90 +++ b/HDF5Examples/FORTRAN/HL/exlite.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/HL/test-pc.sh b/HDF5Examples/FORTRAN/HL/test-pc.sh new file mode 100755 index 00000000000..d797074587f --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/test-pc.sh @@ -0,0 +1,120 @@ +#! /bin/sh +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the LICENSE file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. + +# This file is for use of h5cc created with the CMake process +# HDF5_HOME is expected to be set + +srcdir=.. +builddir=. +verbose=yes +nerrors=0 + +# HDF5 compile commands, assuming they are in your $PATH. +H5FC=$HDF5_HOME/bin/h5fc +LD_LIBRARY_PATH=$HDF5_HOME/lib +export LD_LIBRARY_PATH + +if ! test -f $H5FC; then + echo "Set paths for H5FC and LD_LIBRARY_PATH in test.sh" + echo "Set environment variable HDF5_HOME to the hdf5 install dir" + echo "h5fc was not found at $H5FC" + exit $EXIT_FAILURE +fi + +H5DUMP=`echo $H5FC | sed -e 's/\/[^/]*$/\/h5dump/'`; +H5_LIBVER=$($H5FC -showconfig | grep -i "HDF5 Version:" | sed 's/^.* //g' | sed 's/[-].*//g') +H5_APIVER=$($H5FC -showconfig | grep -i "Default API mapping:" | sed 's/^.* //g' | sed 's/v//g' | sed 's/1/1_/') + +H5_MAJORVER=$(echo $H5_LIBVER | cut -f1 -d'.' | sed -E 's/\./_/g') +H5_MINORVER=$(echo $H5_LIBVER | cut -f2 -d'.' | sed -E 's/\./_/g') +H5_RELEASEVER=$(echo $H5_LIBVER | cut -f3 -d'.' | sed -E 's/\./_/g') +H5_LIBVER_DIR=$H5_MAJORVER$H5_MINORVER + +# Shell commands used in Makefiles +RM="rm -rf" +DIFF="diff -c" +CMP="cmp -s" +GREP='grep' +CP="cp -p" # Use -p to preserve mode,ownership,timestamps +DIRNAME='dirname' +LS='ls' +AWK='awk' + +# setup plugin path +ENVCMD="env HDF5_PLUGIN_PATH=$LD_LIBRARY_PATH/plugin" + +TESTDIR=$builddir + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ;; + *c*,* ) ECHO_N=-n ECHO_C= ;; + *) ECHO_N= ECHO_C='\c' ;; +esac +ECHO_N="echo $ECHO_N" + + +exout() { + $* +} + +dumpout() { + $H5DUMP $* +} + +# compare current version, required version. +# returns if cur_ver < req_ver is true. +version_compare() { + version_lt=0 + if [ ! "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$2" ]; then + version_lt=1 + fi +} +topics="exlite ex_ds1" + +return_val=0 + +for topic in $topics +do + $H5FC $srcdir/$topic.F90 -o $topic +done + +for topic in $topics +do + fname=$topic + $ECHO_N "Testing FORTRAN/HL/$fname...$ECHO_C" + exout ./$fname >tmp.test + cmp -s tmp.test $srcdir/tfiles/$fname.tst + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + dumpout $fname.h5 >tmp.test + rm -f $fname.h5 + cmp -s tmp.test $srcdir/tfiles/$fname.ddl + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + echo " Passed" + fi + fi + return_val=`expr $status + $return_val` +done + + +rm -f tmp.test +echo "$return_val tests failed in /FORTRAN/HL/" +exit $return_val diff --git a/HDF5Examples/FORTRAN/HL/test.sh.in b/HDF5Examples/FORTRAN/HL/test.sh.in new file mode 100755 index 00000000000..07efb20f1bd --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/test.sh.in @@ -0,0 +1,85 @@ +#! /bin/sh +# +# Copyright by The HDF Group. +# Copyright by the Board of Trustees of the University of Illinois. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the LICENSE file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. + +srcdir=@srcdir@ + + +case $FC in +*/*) H5DUMP=`echo $FC | sed -e 's/\/[^/]*$/\/h5dump/'`; + test -x $H5DUMP || H5DUMP=h5dump;; +*) H5DUMP=h5dump;; +esac + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ;; + *c*,* ) ECHO_N=-n ECHO_C= ;; + *) ECHO_N= ECHO_C='\c' ;; +esac +ECHO_N="echo $ECHO_N" + + +exout() { + $* +} + +dumpout() { + $H5DUMP $* +} + +# compare current version, required version. +# returns if cur_ver < req_ver is true. +version_compare() { + version_lt=0 + if [ ! "$(printf '%s\n' "$1" "$2" | sort -V | head -n1)" = "$2" ]; then + version_lt=1 + fi +} + +H5_LIBVER=@H5_LIBVER@ +H5_LIBVER_DIR=@H5_LIBVER_DIR@ + +topics="exlite ex_ds1" + +return_val=0 + +for topic in $topics +do + fname=$topic + $ECHO_N "Testing FORTRAN/HL/$fname...$ECHO_C" + exout ./$fname >tmp.test + cmp -s tmp.test $srcdir/tfiles/$fname.tst + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + dumpout $targ $fname.h5 >tmp.test + rm -f $fname.h5 + cmp -s tmp.test $srcdir/tfiles/$fname.ddl + status=$? + if test $status -ne 0 + then + echo " FAILED!" + else + echo " Passed" + fi + fi + return_val=`expr $status + $return_val` +done + + +rm -f tmp.test +echo "$return_val tests failed in /FORTRAN/HL/" +exit $return_val diff --git a/HDF5Examples/FORTRAN/HL/tfiles/ex_ds1.ddl b/HDF5Examples/FORTRAN/HL/tfiles/ex_ds1.ddl new file mode 100644 index 00000000000..31cfedbd593 --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/tfiles/ex_ds1.ddl @@ -0,0 +1,107 @@ +HDF5 "ex_ds1.h5" { +GROUP "/" { + DATASET "MYDATA" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 3, 4 ) / ( 3, 4 ) } + DATA { + (0,0): 1, 2, 3, 4, + (1,0): 5, 6, 7, 8, + (2,0): 9, 10, 11, 12 + } + ATTRIBUTE "DIMENSION_LABELS" { + DATATYPE H5T_STRING { + STRSIZE H5T_VARIABLE; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SIMPLE { ( 2 ) / ( 2 ) } + DATA { + (0): "X", "Y" + } + } + ATTRIBUTE "DIMENSION_LIST" { + DATATYPE H5T_VLEN { H5T_REFERENCE { H5T_STD_REF_OBJECT } } + DATASPACE SIMPLE { ( 2 ) / ( 2 ) } + DATA { + (0): (), (DATASET 867087904 "/Yaxis") + } + } + } + DATASET "Xaxis" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SIMPLE { ( 3 ) / ( 3 ) } + DATA { + (0): 10, 20, 30 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "DIMENSION_SCALE" + } + } + ATTRIBUTE "NAME" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Set X" + } + } + } + DATASET "Yaxis" { + DATATYPE H5T_IEEE_F32LE + DATASPACE SIMPLE { ( 4 ) / ( 4 ) } + DATA { + (0): 10, 20, 50, 100 + } + ATTRIBUTE "CLASS" { + DATATYPE H5T_STRING { + STRSIZE 16; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "DIMENSION_SCALE" + } + } + ATTRIBUTE "NAME" { + DATATYPE H5T_STRING { + STRSIZE 6; + STRPAD H5T_STR_NULLTERM; + CSET H5T_CSET_ASCII; + CTYPE H5T_C_S1; + } + DATASPACE SCALAR + DATA { + (0): "Set Y" + } + } + ATTRIBUTE "REFERENCE_LIST" { + DATATYPE H5T_COMPOUND { + H5T_REFERENCE { H5T_STD_REF_OBJECT } "dataset"; + H5T_STD_U32LE "dimension"; + } + DATASPACE SIMPLE { ( 1 ) / ( 1 ) } + DATA { + (0): { + DATASET 867100928 "/MYDATA", + 1 + } + } + } + } +} +} diff --git a/HDF5Examples/FORTRAN/HL/tfiles/ex_ds1.tst b/HDF5Examples/FORTRAN/HL/tfiles/ex_ds1.tst new file mode 100644 index 00000000000..edacf4365fd --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/tfiles/ex_ds1.tst @@ -0,0 +1,26 @@ + +Attach Dimension Scale "Xaxis" to "MYDATA" at dimension 1 + + Is Xaxis attached to dimension 1 ... T + Total number of Dimension Scales Attached ... 1 + +Detach Dimension Scale "Xaxis" from "MYDATA" at dimension 1 + + Is Xaxis attached to dimension 1 ... F + +Set Dimension Scale "Xaxis" to "MYDATA" at dimension 1 + + The Dimension Scale name is ... Set X + +Setting Dimension Scale label "X" for dimension 1 + + Dimension Scale Label for dimension 1 is ... X + +Set Dimension Scale "Yaxis" to "MYDATA" at dimension 2 + + The Dimension Scale name is ... Set Y + +Setting Dimension Scale label "Y" for dimension 2 + + Dimension Scale Label for dimension 2 is ... Y + diff --git a/HDF5Examples/FORTRAN/HL/tfiles/exlite.ddl b/HDF5Examples/FORTRAN/HL/tfiles/exlite.ddl new file mode 100644 index 00000000000..8d8dcb34324 --- /dev/null +++ b/HDF5Examples/FORTRAN/HL/tfiles/exlite.ddl @@ -0,0 +1,11 @@ +HDF5 "exlite.h5" { +GROUP "/" { + DATASET "dset1" { + DATATYPE H5T_STD_I32LE + DATASPACE SIMPLE { ( 4 ) / ( 4 ) } + DATA { + (0): 1, 2, 3, 4 + } + } +} +} diff --git a/HDF5Examples/FORTRAN/HL/tfiles/exlite.tst b/HDF5Examples/FORTRAN/HL/tfiles/exlite.tst new file mode 100644 index 00000000000..e69de29bb2d diff --git a/HDF5Examples/FORTRAN/Makefile.am b/HDF5Examples/FORTRAN/Makefile.am index 778f802246c..9a3e8d008e6 100644 --- a/HDF5Examples/FORTRAN/Makefile.am +++ b/HDF5Examples/FORTRAN/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/TUTR/CMakeLists.txt b/HDF5Examples/FORTRAN/TUTR/CMakeLists.txt index 7c5b2189838..7e6d815a7a8 100644 --- a/HDF5Examples/FORTRAN/TUTR/CMakeLists.txt +++ b/HDF5Examples/FORTRAN/TUTR/CMakeLists.txt @@ -23,7 +23,7 @@ include (Fortran_sourcefiles.cmake) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_f90_tutr_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) @@ -42,7 +42,7 @@ foreach (example_name ${common_examples}) "$<$:-DH5_USE_110_API>" "$<$:-DH5_USE_112_API>" "$<$:-DH5_USE_114_API>" - "$<$:-DH5_USE_116_API>" + "$<$:-DH5_USE_200_API>" ) if (H5_HAVE_PARALLEL) target_include_directories (${EXAMPLE_VARNAME}_f90_tutr_${example_name} PUBLIC ${MPI_Fortran_INCLUDE_DIRS}) diff --git a/HDF5Examples/FORTRAN/TUTR/Makefile.am b/HDF5Examples/FORTRAN/TUTR/Makefile.am index e9a0fac041f..227f781cdac 100644 --- a/HDF5Examples/FORTRAN/TUTR/Makefile.am +++ b/HDF5Examples/FORTRAN/TUTR/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/TUTR/compound.f90 b/HDF5Examples/FORTRAN/TUTR/compound.f90 index 47cbaa521f4..996b532c832 100644 --- a/HDF5Examples/FORTRAN/TUTR/compound.f90 +++ b/HDF5Examples/FORTRAN/TUTR/compound.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/compound_complex_fortran2003.f90 b/HDF5Examples/FORTRAN/TUTR/compound_complex_fortran2003.f90 index c45c778a409..a3b666cbbcd 100644 --- a/HDF5Examples/FORTRAN/TUTR/compound_complex_fortran2003.f90 +++ b/HDF5Examples/FORTRAN/TUTR/compound_complex_fortran2003.f90 @@ -5,7 +5,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/compound_fortran2003.f90 b/HDF5Examples/FORTRAN/TUTR/compound_fortran2003.f90 index 50261f77af7..600b26ae3a7 100644 --- a/HDF5Examples/FORTRAN/TUTR/compound_fortran2003.f90 +++ b/HDF5Examples/FORTRAN/TUTR/compound_fortran2003.f90 @@ -5,7 +5,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_cmprss.f90 b/HDF5Examples/FORTRAN/TUTR/h5_cmprss.f90 index 45c0d71b8a2..d4cbd036e99 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_cmprss.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_cmprss.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_crtatt.f90 b/HDF5Examples/FORTRAN/TUTR/h5_crtatt.f90 index c8d313a40f6..ab145ac5b87 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_crtatt.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_crtatt.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_crtdat.f90 b/HDF5Examples/FORTRAN/TUTR/h5_crtdat.f90 index 6840bc7a72f..d27d4f5c702 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_crtdat.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_crtdat.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90 b/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90 index 4c63caae063..05e3ec19eb6 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_crtgrp.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_crtgrpar.f90 b/HDF5Examples/FORTRAN/TUTR/h5_crtgrpar.f90 index e6ece17cfeb..73ad24cbb51 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_crtgrpar.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_crtgrpar.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_crtgrpd.f90 b/HDF5Examples/FORTRAN/TUTR/h5_crtgrpd.f90 index 7d754cdad22..e5c8977af93 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_crtgrpd.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_crtgrpd.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_extend.f90 b/HDF5Examples/FORTRAN/TUTR/h5_extend.f90 index 47f767ee638..41d342d545f 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_extend.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_extend.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_rdwt.f90 b/HDF5Examples/FORTRAN/TUTR/h5_rdwt.f90 index 69678823c64..b9df071bcdb 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_rdwt.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_rdwt.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/h5_subset.f90 b/HDF5Examples/FORTRAN/TUTR/h5_subset.f90 index d5564ad5c8e..6d47420730c 100644 --- a/HDF5Examples/FORTRAN/TUTR/h5_subset.f90 +++ b/HDF5Examples/FORTRAN/TUTR/h5_subset.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/hyperslab.f90 b/HDF5Examples/FORTRAN/TUTR/hyperslab.f90 index 46d345d8f45..25eb1d1ad1b 100644 --- a/HDF5Examples/FORTRAN/TUTR/hyperslab.f90 +++ b/HDF5Examples/FORTRAN/TUTR/hyperslab.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/mountexample.f90 b/HDF5Examples/FORTRAN/TUTR/mountexample.f90 index b74364b4499..58cbd70bb6a 100644 --- a/HDF5Examples/FORTRAN/TUTR/mountexample.f90 +++ b/HDF5Examples/FORTRAN/TUTR/mountexample.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/nested_derived_type.f90 b/HDF5Examples/FORTRAN/TUTR/nested_derived_type.f90 index 1b8168fcf56..0941b428ecc 100644 --- a/HDF5Examples/FORTRAN/TUTR/nested_derived_type.f90 +++ b/HDF5Examples/FORTRAN/TUTR/nested_derived_type.f90 @@ -5,7 +5,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/refobjexample.f90 b/HDF5Examples/FORTRAN/TUTR/refobjexample.f90 index a8314402f99..729524accea 100644 --- a/HDF5Examples/FORTRAN/TUTR/refobjexample.f90 +++ b/HDF5Examples/FORTRAN/TUTR/refobjexample.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/refregexample.f90 b/HDF5Examples/FORTRAN/TUTR/refregexample.f90 index 7e9616f4ad8..fe5adbff556 100644 --- a/HDF5Examples/FORTRAN/TUTR/refregexample.f90 +++ b/HDF5Examples/FORTRAN/TUTR/refregexample.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/run-fortran-ex.sh.in b/HDF5Examples/FORTRAN/TUTR/run-fortran-ex.sh.in index d5411155e66..5a9c0e43c47 100644 --- a/HDF5Examples/FORTRAN/TUTR/run-fortran-ex.sh.in +++ b/HDF5Examples/FORTRAN/TUTR/run-fortran-ex.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/FORTRAN/TUTR/rwdset_fortran2003.f90 b/HDF5Examples/FORTRAN/TUTR/rwdset_fortran2003.f90 index e7853ab6f2b..294bd3ea4c2 100644 --- a/HDF5Examples/FORTRAN/TUTR/rwdset_fortran2003.f90 +++ b/HDF5Examples/FORTRAN/TUTR/rwdset_fortran2003.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/selectele.f90 b/HDF5Examples/FORTRAN/TUTR/selectele.f90 index 4c375a849c8..6982fb28ed1 100644 --- a/HDF5Examples/FORTRAN/TUTR/selectele.f90 +++ b/HDF5Examples/FORTRAN/TUTR/selectele.f90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/HDF5Examples/FORTRAN/TUTR/testh5fc.sh.in b/HDF5Examples/FORTRAN/TUTR/testh5fc.sh.in index f8f3706a4e7..7b265eea7d9 100644 --- a/HDF5Examples/FORTRAN/TUTR/testh5fc.sh.in +++ b/HDF5Examples/FORTRAN/TUTR/testh5fc.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Alloc.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Alloc.java index 09bb1804c8a..0264c944903 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Alloc.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Alloc.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Checksum.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Checksum.java index f4716ad3ecb..42e10b21116 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Checksum.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Checksum.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Chunk.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Chunk.java index 6ca26088be2..de5ff3e4fd4 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Chunk.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Chunk.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Compact.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Compact.java index cd70926e7db..c6243b29fd3 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Compact.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Compact.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_External.java b/HDF5Examples/JAVA/H5D/H5Ex_D_External.java index ebccc7a603b..8eefbafcff4 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_External.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_External.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_FillValue.java b/HDF5Examples/JAVA/H5D/H5Ex_D_FillValue.java index 84de8443f1c..c062320a075 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_FillValue.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_FillValue.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Gzip.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Gzip.java index da910154c54..f91c5ea2efe 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Gzip.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Gzip.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Hyperslab.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Hyperslab.java index 3803f1fa815..cbaee4c7fdd 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Hyperslab.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Hyperslab.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Nbit.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Nbit.java index e26894f46d8..c58f3c28a1e 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Nbit.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Nbit.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_ReadWrite.java b/HDF5Examples/JAVA/H5D/H5Ex_D_ReadWrite.java index f850252bffb..73d8547ca87 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_ReadWrite.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_ReadWrite.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Shuffle.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Shuffle.java index 13f5eeda3e8..d77bf259988 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Shuffle.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Shuffle.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Sofloat.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Sofloat.java index 17f6e3042f8..84fec74c469 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Sofloat.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Sofloat.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Soint.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Soint.java index 5691a8c2f23..80cf9f5afa0 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Soint.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Soint.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Szip.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Szip.java index 158df2c2cc6..a40ca484d73 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Szip.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Szip.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_Transform.java b/HDF5Examples/JAVA/H5D/H5Ex_D_Transform.java index 9ad7e791052..44f328cb548 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_Transform.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_Transform.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -26,7 +26,7 @@ public class H5Ex_D_Transform { - private static String FILE = "H5Ex_D_Transform.h5"; + private static String FILENAME = "H5Ex_D_Transform.h5"; private static String DATASET = "DS1"; private static final int DIM_X = 4; private static final int DIM_Y = 7; @@ -59,7 +59,7 @@ private static void writeData() // Create a new file using the default properties. try { - file_id = H5.H5Fcreate(FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, + file_id = H5.H5Fcreate(FILENAME, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); } catch (Exception e) { @@ -152,7 +152,7 @@ private static void readData() // Open an existing file using the default properties. try { - file_id = H5.H5Fopen(FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); + file_id = H5.H5Fopen(FILENAME, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); } catch (Exception e) { e.printStackTrace(); diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedAdd.java b/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedAdd.java index 13b929591ea..853d56536c5 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedAdd.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedAdd.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedGzip.java b/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedGzip.java index d15bbf8a101..66a9f853893 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedGzip.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedGzip.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedMod.java b/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedMod.java index 3adc116b6b1..d453096f51b 100644 --- a/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedMod.java +++ b/HDF5Examples/JAVA/H5D/H5Ex_D_UnlimitedMod.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5D/JavaDatasetExample.sh.in b/HDF5Examples/JAVA/H5D/JavaDatasetExample.sh.in index c2699a357f3..1969766be17 100644 --- a/HDF5Examples/JAVA/H5D/JavaDatasetExample.sh.in +++ b/HDF5Examples/JAVA/H5D/JavaDatasetExample.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/H5D/Java_sourcefiles.cmake b/HDF5Examples/JAVA/H5D/Java_sourcefiles.cmake index 2977d8597ef..4bdb766f6cf 100644 --- a/HDF5Examples/JAVA/H5D/Java_sourcefiles.cmake +++ b/HDF5Examples/JAVA/H5D/Java_sourcefiles.cmake @@ -29,7 +29,7 @@ set (HDF_JAVA_SZIP_EXAMPLES ) # detect whether the encoder is present. - if (${HDF5_ENABLE_Z_LIB_SUPPORT}) + if (${HDF5_ENABLE_ZLIB_SUPPORT}) set (HDF_JAVA_EXAMPLES ${HDF_JAVA_EXAMPLES} ${HDF_JAVA_ZLIB_EXAMPLES}) endif () diff --git a/HDF5Examples/JAVA/H5D/Makefile.am b/HDF5Examples/JAVA/H5D/Makefile.am index abcf64b5b83..7fbcea697a4 100644 --- a/HDF5Examples/JAVA/H5D/Makefile.am +++ b/HDF5Examples/JAVA/H5D/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Intermediate.java b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Intermediate.java index cf6d1b42319..7911a1b9bbe 100644 --- a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Intermediate.java +++ b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Intermediate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -25,7 +25,7 @@ public class H5Ex_G_Intermediate { - private static String FILE = "H5Ex_G_Intermediate.h5"; + private static String FILENAME = "H5Ex_G_Intermediate.h5"; private void CreateGroup() throws Exception { @@ -36,7 +36,7 @@ private void CreateGroup() throws Exception try { // Create a new file_id using the default properties. - file_id = H5.H5Fcreate(FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, + file_id = H5.H5Fcreate(FILENAME, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); // Create group_id creation property list and set it to allow creation of intermediate group_ids. diff --git a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Iterate.java b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Iterate.java index 9359483b066..77f69c6cd84 100644 --- a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Iterate.java +++ b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Iterate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Traverse.java b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Traverse.java index 0ef0e3945bd..83fdb43368a 100644 --- a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Traverse.java +++ b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Traverse.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -38,7 +38,7 @@ class opdata implements H5L_iterate_t { public class H5Ex_G_Traverse { - private static String FILE = "h5ex_g_traverse.h5"; + private static String FILENAME = "h5ex_g_traverse.h5"; public static H5L_iterate_cb iter_cb = new H5L_iter_callbackT(); private static void OpenGroup() @@ -49,7 +49,7 @@ private static void OpenGroup() // Open file and initialize the operator data structure. try { - file_id = H5.H5Fopen(FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); + file_id = H5.H5Fopen(FILENAME, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); if (file_id >= 0) { infobuf = H5.H5Oget_info(file_id); od.recurs = 0; diff --git a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Visit.java b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Visit.java index 8e81ff37b2b..f2c22f94f9d 100644 --- a/HDF5Examples/JAVA/H5G/110/H5Ex_G_Visit.java +++ b/HDF5Examples/JAVA/H5G/110/H5Ex_G_Visit.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -32,7 +32,7 @@ public class H5Ex_G_Visit { - private static String FILE = "groups/h5ex_g_visit.h5"; + private static String FILENAME = "groups/h5ex_g_visit.h5"; public static void main(String[] args) { @@ -51,7 +51,7 @@ private void VisitGroup() throws Exception try { // Open file - file_id = H5.H5Fopen(FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); + file_id = H5.H5Fopen(FILENAME, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); // Begin iteration using H5Ovisit System.out.println("Objects in the file:"); diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Compact.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Compact.java index 865040ea603..119c204e72e 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Compact.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Compact.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Corder.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Corder.java index 23d18404e6a..e8c079a839d 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Corder.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Corder.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -19,7 +19,7 @@ import hdf.hdf5lib.structs.H5G_info_t; public class H5Ex_G_Corder { - private static String FILE = "H5Ex_G_Corder.h5"; + private static String FILENAME = "H5Ex_G_Corder.h5"; private static void CreateGroup() throws Exception { @@ -34,7 +34,7 @@ private static void CreateGroup() throws Exception try { // Create a new file using default properties. - file_id = H5.H5Fcreate(FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, + file_id = H5.H5Fcreate(FILENAME, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); // Create group creation property list and enable link creation order tracking. diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Create.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Create.java index b842af6622d..0e28fc3d4ea 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Create.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Create.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Intermediate.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Intermediate.java index 54617255d44..9b7fc1a92c6 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Intermediate.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Intermediate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -25,7 +25,7 @@ public class H5Ex_G_Intermediate { - private static String FILE = "H5Ex_G_Intermediate.h5"; + private static String FILENAME = "H5Ex_G_Intermediate.h5"; private void CreateGroup() throws Exception { @@ -36,7 +36,7 @@ private void CreateGroup() throws Exception try { // Create a new file_id using the default properties. - file_id = H5.H5Fcreate(FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, + file_id = H5.H5Fcreate(FILENAME, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, HDF5Constants.H5P_DEFAULT); // Create group_id creation property list and set it to allow creation of intermediate group_ids. diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Iterate.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Iterate.java index 86d9eb48996..5a82eff55d9 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Iterate.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Iterate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Phase.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Phase.java index b21fc09e89f..da04981055a 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Phase.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Phase.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -24,7 +24,7 @@ conversion between compact and dense (indexed) groups. import hdf.hdf5lib.structs.H5G_info_t; public class H5Ex_G_Phase { - private static String FILE = "H5Ex_G_Phase.h5"; + private static String FILENAME = "H5Ex_G_Phase.h5"; private static int MAX_GROUPS = 7; private static int MAX_COMPACT = 5; private static int MIN_DENSE = 3; @@ -88,7 +88,8 @@ private static void CreateGroup() // Create a new file using the default properties. try { if (fapl_id >= 0) - file_id = H5.H5Fcreate(FILE, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, fapl_id); + file_id = + H5.H5Fcreate(FILENAME, HDF5Constants.H5F_ACC_TRUNC, HDF5Constants.H5P_DEFAULT, fapl_id); } catch (Exception e) { e.printStackTrace(); diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Traverse.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Traverse.java index ba1955b5693..d3d895f5623 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Traverse.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Traverse.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -38,7 +38,7 @@ class opdata implements H5L_iterate_opdata_t { public class H5Ex_G_Traverse { - private static String FILE = "h5ex_g_traverse.h5"; + private static String FILENAME = "h5ex_g_traverse.h5"; public static H5L_iterate_t iter_cb = new H5L_iter_callbackT(); private static void OpenGroup() @@ -49,7 +49,7 @@ private static void OpenGroup() // Open file and initialize the operator data structure. try { - file_id = H5.H5Fopen(FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); + file_id = H5.H5Fopen(FILENAME, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); if (file_id >= 0) { infobuf = H5.H5Oget_info(file_id); od.recurs = 0; diff --git a/HDF5Examples/JAVA/H5G/H5Ex_G_Visit.java b/HDF5Examples/JAVA/H5G/H5Ex_G_Visit.java index 7d37c591d04..44ed5ca25ea 100644 --- a/HDF5Examples/JAVA/H5G/H5Ex_G_Visit.java +++ b/HDF5Examples/JAVA/H5G/H5Ex_G_Visit.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -32,7 +32,7 @@ public class H5Ex_G_Visit { - private static String FILE = "groups/h5ex_g_visit.h5"; + private static String FILENAME = "groups/h5ex_g_visit.h5"; public static void main(String[] args) { @@ -51,7 +51,7 @@ private void VisitGroup() throws Exception try { // Open file - file_id = H5.H5Fopen(FILE, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); + file_id = H5.H5Fopen(FILENAME, HDF5Constants.H5F_ACC_RDONLY, HDF5Constants.H5P_DEFAULT); // Begin iteration using H5Ovisit System.out.println("Objects in the file:"); diff --git a/HDF5Examples/JAVA/H5G/JavaGroupExample.sh.in b/HDF5Examples/JAVA/H5G/JavaGroupExample.sh.in index 933f35ece16..a7d7765757a 100644 --- a/HDF5Examples/JAVA/H5G/JavaGroupExample.sh.in +++ b/HDF5Examples/JAVA/H5G/JavaGroupExample.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/H5G/Makefile.am b/HDF5Examples/JAVA/H5G/Makefile.am index d3b59cf3a8e..650dfca7217 100644 --- a/HDF5Examples/JAVA/H5G/Makefile.am +++ b/HDF5Examples/JAVA/H5G/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReference.java b/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReference.java index 0e147d8383d..0174fd91401 100644 --- a/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReference.java +++ b/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReference.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReferenceAttribute.java b/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReferenceAttribute.java index 9818dbaa8a4..0673dddab39 100644 --- a/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReferenceAttribute.java +++ b/HDF5Examples/JAVA/H5T/110/H5Ex_T_ObjectReferenceAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_Array.java b/HDF5Examples/JAVA/H5T/H5Ex_T_Array.java index 489367babf9..ed1197dccba 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_Array.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_Array.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_ArrayAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_ArrayAttribute.java index 9a2aca5ff98..b6d9d02fe64 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_ArrayAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_ArrayAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_Bit.java b/HDF5Examples/JAVA/H5T/H5Ex_T_Bit.java index 54a467eb6f3..ef786be02be 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_Bit.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_Bit.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_BitAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_BitAttribute.java index 5be1b914f12..1958ee3ed07 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_BitAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_BitAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_Commit.java b/HDF5Examples/JAVA/H5T/H5Ex_T_Commit.java index 379522cd5d2..6d9966725bc 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_Commit.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_Commit.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -47,7 +47,8 @@ enum H5T_class { H5T_ENUM(HDF5Constants.H5T_ENUM), // enumeration types H5T_VLEN(HDF5Constants.H5T_VLEN), // Variable-Length types H5T_ARRAY(HDF5Constants.H5T_ARRAY), // Array types - H5T_NCLASSES(11); // this must be last + H5T_COMPLEX(HDF5Constants.H5T_COMPLEX), // Complex number types + H5T_NCLASSES(12); // this must be last private static final Map lookup = new HashMap(); diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_Compound.java b/HDF5Examples/JAVA/H5T/H5Ex_T_Compound.java index 5bccd641127..8bb3089d89a 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_Compound.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_Compound.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_CompoundAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_CompoundAttribute.java index 86933ae6684..c67a36e1bca 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_CompoundAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_CompoundAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_Float.java b/HDF5Examples/JAVA/H5T/H5Ex_T_Float.java index e062588a265..1c71181e224 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_Float.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_Float.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_FloatAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_FloatAttribute.java index ffb8467ebdf..777b5f689f8 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_FloatAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_FloatAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_Integer.java b/HDF5Examples/JAVA/H5T/H5Ex_T_Integer.java index afae2b07c8d..06ce6561fbb 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_Integer.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_Integer.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_IntegerAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_IntegerAttribute.java index be4a878aac9..d597eb790d8 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_IntegerAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_IntegerAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReference.java b/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReference.java index 2b61794e80e..4b3888e5545 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReference.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReference.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReferenceAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReferenceAttribute.java index d2117bd4c11..1f8744d7e26 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReferenceAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_ObjectReferenceAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_Opaque.java b/HDF5Examples/JAVA/H5T/H5Ex_T_Opaque.java index c9628d685c9..aca76ea07be 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_Opaque.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_Opaque.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_OpaqueAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_OpaqueAttribute.java index 02f7bd5c865..bd19d8ad8e7 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_OpaqueAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_OpaqueAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReference.java b/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReference.java index 0c7f6abab1e..9d82541749f 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReference.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReference.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReferenceAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReferenceAttribute.java index f09f15f2064..495816401e8 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReferenceAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_RegionReferenceAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_String.java b/HDF5Examples/JAVA/H5T/H5Ex_T_String.java index fa164646d91..8827913fb75 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_String.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_String.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_StringAttribute.java b/HDF5Examples/JAVA/H5T/H5Ex_T_StringAttribute.java index 62f4aa0c778..9c13ab29909 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_StringAttribute.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_StringAttribute.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/H5Ex_T_VLString.java b/HDF5Examples/JAVA/H5T/H5Ex_T_VLString.java index d4d74e7c1f5..9adcf0b37f6 100644 --- a/HDF5Examples/JAVA/H5T/H5Ex_T_VLString.java +++ b/HDF5Examples/JAVA/H5T/H5Ex_T_VLString.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/H5T/JavaDatatypeExample.sh.in b/HDF5Examples/JAVA/H5T/JavaDatatypeExample.sh.in index 7683798b880..32fdb4871b3 100644 --- a/HDF5Examples/JAVA/H5T/JavaDatatypeExample.sh.in +++ b/HDF5Examples/JAVA/H5T/JavaDatatypeExample.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/H5T/Makefile.am b/HDF5Examples/JAVA/H5T/Makefile.am index 2e744ab220f..b8a220dfc9f 100644 --- a/HDF5Examples/JAVA/H5T/Makefile.am +++ b/HDF5Examples/JAVA/H5T/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/Makefile.am b/HDF5Examples/JAVA/Makefile.am index 691c81ca621..f9cb0e4687c 100644 --- a/HDF5Examples/JAVA/Makefile.am +++ b/HDF5Examples/JAVA/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/TUTR/110/HDF5FileStructure.java b/HDF5Examples/JAVA/TUTR/110/HDF5FileStructure.java index 326d94924cf..8bc54267a03 100644 --- a/HDF5Examples/JAVA/TUTR/110/HDF5FileStructure.java +++ b/HDF5Examples/JAVA/TUTR/110/HDF5FileStructure.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5AttributeCreate.java b/HDF5Examples/JAVA/TUTR/HDF5AttributeCreate.java index faa241898ec..f6b0be3dcd4 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5AttributeCreate.java +++ b/HDF5Examples/JAVA/TUTR/HDF5AttributeCreate.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5DatasetCreate.java b/HDF5Examples/JAVA/TUTR/HDF5DatasetCreate.java index 05fea5f1e6f..b6cac9fa494 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5DatasetCreate.java +++ b/HDF5Examples/JAVA/TUTR/HDF5DatasetCreate.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5DatasetRead.java b/HDF5Examples/JAVA/TUTR/HDF5DatasetRead.java index e0771a8badf..da56041d133 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5DatasetRead.java +++ b/HDF5Examples/JAVA/TUTR/HDF5DatasetRead.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5FileCreate.java b/HDF5Examples/JAVA/TUTR/HDF5FileCreate.java index fbfc2473f2d..64935a0ef21 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5FileCreate.java +++ b/HDF5Examples/JAVA/TUTR/HDF5FileCreate.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5FileStructure.java b/HDF5Examples/JAVA/TUTR/HDF5FileStructure.java index 1370340be1b..b70a8d99044 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5FileStructure.java +++ b/HDF5Examples/JAVA/TUTR/HDF5FileStructure.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5GroupAbsoluteRelativeCreate.java b/HDF5Examples/JAVA/TUTR/HDF5GroupAbsoluteRelativeCreate.java index 9061c31c44f..3cdffde6b73 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5GroupAbsoluteRelativeCreate.java +++ b/HDF5Examples/JAVA/TUTR/HDF5GroupAbsoluteRelativeCreate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5GroupCreate.java b/HDF5Examples/JAVA/TUTR/HDF5GroupCreate.java index 4a31c8f05e0..28b5d832e33 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5GroupCreate.java +++ b/HDF5Examples/JAVA/TUTR/HDF5GroupCreate.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5GroupDatasetCreate.java b/HDF5Examples/JAVA/TUTR/HDF5GroupDatasetCreate.java index b89cd9c5039..95147fa346e 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5GroupDatasetCreate.java +++ b/HDF5Examples/JAVA/TUTR/HDF5GroupDatasetCreate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/HDF5SubsetSelect.java b/HDF5Examples/JAVA/TUTR/HDF5SubsetSelect.java index e302cd18a0d..dda51d71bc8 100644 --- a/HDF5Examples/JAVA/TUTR/HDF5SubsetSelect.java +++ b/HDF5Examples/JAVA/TUTR/HDF5SubsetSelect.java @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/HDF5Examples/JAVA/TUTR/Makefile.am b/HDF5Examples/JAVA/TUTR/Makefile.am index fedb82f9d19..d68f5998c31 100644 --- a/HDF5Examples/JAVA/TUTR/Makefile.am +++ b/HDF5Examples/JAVA/TUTR/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/JAVA/TUTR/runExample.sh.in b/HDF5Examples/JAVA/TUTR/runExample.sh.in index 709613d1590..d5038a981c3 100644 --- a/HDF5Examples/JAVA/TUTR/runExample.sh.in +++ b/HDF5Examples/JAVA/TUTR/runExample.sh.in @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/Makefile.am b/HDF5Examples/Makefile.am index d8019c9558c..a3f09b2aafe 100644 --- a/HDF5Examples/Makefile.am +++ b/HDF5Examples/Makefile.am @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/config/cmake-presets/hidden-presets.json b/HDF5Examples/config/cmake-presets/hidden-presets.json index d38e802f1f6..b8523977923 100644 --- a/HDF5Examples/config/cmake-presets/hidden-presets.json +++ b/HDF5Examples/config/cmake-presets/hidden-presets.json @@ -108,6 +108,13 @@ "name": "ci-Intel", "hidden": true }, + { + "name": "ci-HL", + "hidden": true, + "cacheVariables": { + "H5EX_BUILD_HL": "ON" + } + }, { "name": "ci-Fortran", "hidden": true, @@ -132,7 +139,7 @@ "name": "ci-CPP", "hidden": true, "cacheVariables": { - "H5EX_BUILD_CPP_LIB": "ON" + "H5EX_BUILD_CXX": "ON" } }, { diff --git a/HDF5Examples/config/cmake/HDFExampleMacros.cmake b/HDF5Examples/config/cmake/HDFExampleMacros.cmake index dd2c46fba67..fb25f54731c 100644 --- a/HDF5Examples/config/cmake/HDFExampleMacros.cmake +++ b/HDF5Examples/config/cmake/HDFExampleMacros.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -34,7 +34,7 @@ macro (BASIC_SETTINGS varname) set (CMAKE_C_STANDARD 99) set (CMAKE_C_STANDARD_REQUIRED TRUE) - if (H5EX_BUILD_CPP_LIB) + if (H5EX_BUILD_CCXX) ENABLE_LANGUAGE (CXX) set (CMAKE_CXX_STANDARD 98) @@ -140,11 +140,20 @@ macro (HDF5_SUPPORT) set (H5EX_BUILD_JAVA OFF CACHE BOOL "Build Java support" FORCE) message (STATUS "Using static HDF5 - disable build of Java examples") endif () + if (H5EX_BUILD_HL) + set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} HL) + endif () if (H5EX_BUILD_FORTRAN) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Fortran) + if (H5EX_BUILD_HL) + set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Fortran_HL) + endif () endif () - if (H5EX_BUILD_CPP_LIB) + if (H5EX_BUILD_CXX) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} CXX) + if (H5EX_BUILD_HL) + set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} CXX_HL) + endif () endif () if (H5EX_BUILD_JAVA) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Java) @@ -161,14 +170,23 @@ macro (HDF5_SUPPORT) if (NOT HDF5_static_C_FOUND AND NOT HDF5_shared_C_FOUND) #find library from non-dual-binary package set (FIND_HDF_COMPONENTS C) + if (H5EX_BUILD_HL) + set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} HL) + endif () if (H5EX_BUILD_FORTRAN) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Fortran) + if (H5EX_BUILD_HL) + set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Fortran_HL) + endif () endif () if (H5EX_BUILD_JAVA) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} Java) endif () - if (H5EX_BUILD_CPP_LIB) + if (H5EX_BUILD_CXX) set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} CXX) + if (H5EX_BUILD_HL) + set (FIND_HDF_COMPONENTS ${FIND_HDF_COMPONENTS} CXX_HL) + endif () endif () message (STATUS "HDF5 find comps: ${FIND_HDF_COMPONENTS}") @@ -217,6 +235,22 @@ macro (HDF5_SUPPORT) set (H5EX_HDF5_DUMP_EXECUTABLE $) endif() + if (NOT HDF5_static_HL_FOUND AND NOT HDF5_shared_HL_FOUND) + set (H5EX_BUILD_HL OFF CACHE BOOL "Build High Level support" FORCE) + message (STATUS "HDF5 HL libs not found - disable build of HL examples") + else () + if (H5EX_BUILD_HL AND ${HDF5_BUILD_HL_LIB}) + if (BUILD_SHARED_LIBS AND HDF5_shared_HL_FOUND) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_SHARED_LIBRARY}) + elseif (HDF5_static_HL_FOUND) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_STATIC_LIBRARY}) + else () + set (H5EX_BUILD_HL OFF CACHE BOOL "Build High Level support" FORCE) + message (STATUS "HDF5 HL libs not found - disable build of HL examples") + endif () + endif () + endif () + if (NOT HDF5_static_Fortran_FOUND AND NOT HDF5_shared_Fortran_FOUND) set (H5EX_BUILD_FORTRAN OFF CACHE BOOL "Build FORTRAN support" FORCE) message (STATUS "HDF5 Fortran libs not found - disable build of Fortran examples") @@ -224,14 +258,43 @@ macro (HDF5_SUPPORT) if (H5EX_BUILD_FORTRAN AND ${HDF5_BUILD_FORTRAN}) if (BUILD_SHARED_LIBS AND HDF5_shared_Fortran_FOUND) set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_FORTRAN_SHARED_LIBRARY}) + if (H5EX_BUILD_HL AND ${HDF5_BUILD_HL_LIB}) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_FORTRAN_HL_SHARED_LIBRARY}) + endif () elseif (HDF5_static_Fortran_FOUND) set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_FORTRAN_STATIC_LIBRARY}) + if (H5EX_BUILD_HL AND ${HDF5_BUILD_HL_LIB}) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_FORTRAN_HL_STATIC_LIBRARY}) + endif () else () set (H5EX_BUILD_FORTRAN OFF CACHE BOOL "Build FORTRAN support" FORCE) message (STATUS "HDF5 Fortran libs not found - disable build of Fortran examples") endif () endif () endif () + + if (NOT HDF5_static_CXX_FOUND AND NOT HDF5_shared_CXX_FOUND) + set (H5EX_BUILD_CXX OFF CACHE BOOL "Build CXX support" FORCE) + message (STATUS "HDF5 CXX libs not found - disable build of CXX examples") + else () + if (H5EX_BUILD_CXX AND ${HDF5_BUILD_CXX}) + if (BUILD_SHARED_LIBS AND HDF5_shared_CXX_FOUND) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_CXX_SHARED_LIBRARY}) + if (H5EX_BUILD_HL AND ${HDF5_BUILD_HL_LIB}) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_CXX_HL_SHARED_LIBRARY}) + endif () + elseif (HDF5_static_CXX_FOUND) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_CXX_STATIC_LIBRARY}) + if (H5EX_BUILD_HL AND ${HDF5_BUILD_HL_LIB}) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_CXX_HL_STATIC_LIBRARY}) + endif () + else () + set (H5EX_BUILD_CXX OFF CACHE BOOL "Build CXX support" FORCE) + message (STATUS "HDF5 CXX libs not found - disable build of CXX examples") + endif () + endif () + endif () + if (H5EX_BUILD_JAVA AND HDF5_Java_FOUND) if (${HDF5_BUILD_JAVA}) set (CMAKE_JAVA_INCLUDE_PATH "${CMAKE_JAVA_INCLUDE_PATH};${HDF5_JAVA_INCLUDE_DIRS}") @@ -356,10 +419,10 @@ macro (APIVersion version xyapi) endif () #----------------------------------------------------------------------------- - # Option to use 1.16.x API + # Option to use 2.0.x API #----------------------------------------------------------------------------- - option (${EXAMPLE_VARNAME}_USE_116_API "Use the HDF5 1.16.x API" OFF) - if (${EXAMPLE_VARNAME}_USE_116_API AND ${xyapi} GREATER 116) - set (${xyapi} "116") + option (${EXAMPLE_VARNAME}_USE_200_API "Use the HDF5 2.x.y API" OFF) + if (${EXAMPLE_VARNAME}_USE_200_API AND ${xyapi} GREATER 200) + set (${xyapi} "200") endif () endmacro () diff --git a/HDF5Examples/config/cmake/HDFMacros.cmake b/HDF5Examples/config/cmake/HDFMacros.cmake index b9ef2df03a7..a2d0fbbb53d 100644 --- a/HDF5Examples/config/cmake/HDFMacros.cmake +++ b/HDF5Examples/config/cmake/HDFMacros.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/config/cmake/cacheinit.cmake b/HDF5Examples/config/cmake/cacheinit.cmake index 0ef3a0e1b9c..872462d54b0 100644 --- a/HDF5Examples/config/cmake/cacheinit.cmake +++ b/HDF5Examples/config/cmake/cacheinit.cmake @@ -10,8 +10,12 @@ set (H5EX_BUILD_TESTING ON CACHE BOOL "Build HDF5 Unit Testing" FORCE) #set (H5EX_ENABLE_PARALLEL ON CACHE BOOL "Enable parallel build (requires MPI)" FORCE) +#set (H5EX_BUILD_HL ON CACHE BOOL "Build High Level support" FORCE) + #set (H5EX_BUILD_FORTRAN ON CACHE BOOL "Build FORTRAN support" FORCE) +#set (H5EX_BUILD_CXX ON CACHE BOOL "Build C++ support" FORCE) + #set (H5EX_BUILD_FILTERS ON CACHE BOOL "Build filter support" FORCE) #set (H5EX_ENABLE_F2003 ON CACHE BOOL "Enable FORTRAN 2003 Standard" FORCE) diff --git a/HDF5Examples/config/cmake/grepTest.cmake b/HDF5Examples/config/cmake/grepTest.cmake index 4031a1bde03..07791c652a5 100644 --- a/HDF5Examples/config/cmake/grepTest.cmake +++ b/HDF5Examples/config/cmake/grepTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/config/cmake/jrunTest.cmake b/HDF5Examples/config/cmake/jrunTest.cmake index d7d83d4f709..95b2648dc48 100644 --- a/HDF5Examples/config/cmake/jrunTest.cmake +++ b/HDF5Examples/config/cmake/jrunTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/config/cmake/runTest.cmake b/HDF5Examples/config/cmake/runTest.cmake index cc433b1e518..07b2110eba8 100644 --- a/HDF5Examples/config/cmake/runTest.cmake +++ b/HDF5Examples/config/cmake/runTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/HDF5Examples/configure.ac b/HDF5Examples/configure.ac index babfdecc624..30141afc402 100644 --- a/HDF5Examples/configure.ac +++ b/HDF5Examples/configure.ac @@ -7,7 +7,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/COPYING b/LICENSE similarity index 96% rename from COPYING rename to LICENSE index 9bd04025250..38061fb7854 100644 --- a/COPYING +++ b/LICENSE @@ -46,10 +46,9 @@ works thereof, in binary and source code form. ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -Limited portions of HDF5 were developed by Lawrence Berkeley National +Limited portions of HDF5 1.12.0 were developed by Lawrence Berkeley National Laboratory (LBNL). LBNL's Copyright Notice and Licensing Terms can be -found here: COPYING_LBNL_HDF5 file in this directory or at -https://raw.githubusercontent.com/hdfgroup/hdf5/develop/COPYING_LBNL_HDF5. +found in the LICENSE_LBNL_HDF5 file in this directory. ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- diff --git a/COPYING_LBNL_HDF5 b/LICENSE_LBNL_HDF5 similarity index 98% rename from COPYING_LBNL_HDF5 rename to LICENSE_LBNL_HDF5 index ebc00df1b0c..bac90424d0d 100644 --- a/COPYING_LBNL_HDF5 +++ b/LICENSE_LBNL_HDF5 @@ -1,3 +1,5 @@ +See the LICENSE file for an explanation of why this file exists. + **************************** *** Copyright Notice *** Hierarchical Data Format 5 (HDF5) v1.12.0 Copyright (c) 2020, HDF Group and The diff --git a/Makefile.am b/Makefile.am index 4805b91f7ab..7b02f879491 100644 --- a/Makefile.am +++ b/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/Makefile.dist b/Makefile.dist index 5ae99040d34..ccf25384f47 100644 --- a/Makefile.dist +++ b/Makefile.dist @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/README.md b/README.md index 37c45ad022d..1f3c6444a1c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -HDF5 version 1.17.0 currently under development +HDF5 version 2.0.0 currently under development ![HDF5 Logo](doxygen/img/HDF5.png) @@ -10,9 +10,8 @@ HDF5 version 1.17.0 currently under development [![CVE regression](https://img.shields.io/github/actions/workflow/status/HDFGroup/hdf5/cve.yml?branch=develop&label=CVE)](https://github.com/HDFGroup/hdf5/actions/workflows/cve.yml?query=branch%3Adevelop) [![HDF5 VOL connectors build status](https://img.shields.io/github/actions/workflow/status/HDFGroup/hdf5/vol.yml?branch=develop&label=HDF5-VOL)](https://github.com/HDFGroup/hdf5/actions/workflows/vol.yml?query=branch%3Adevelop) [![HDF5 VFD build status](https://img.shields.io/github/actions/workflow/status/HDFGroup/hdf5/vfd.yml?branch=develop&label=HDF5-VFD)](https://github.com/HDFGroup/hdf5/actions/workflows/vfd.yml?query=branch%3Adevelop) -[![1.14 cmake build status](https://img.shields.io/github/actions/workflow/status/HDFGroup/hdf5/cmake.yml?branch=hdf5_1_14&label=HDF5%201.14%20CMake%20CI)](https://github.com/HDFGroup/hdf5/actions/workflows/cmake.yml?query=branch%3Ahdf5_1_14) -[![1.14 autotools build status](https://img.shields.io/github/actions/workflow/status/HDFGroup/hdf5/autotools.yml?branch=hdf5_1_14&label=HDF5%201.14%20Autotools%20CI)](https://github.com/HDFGroup/hdf5/actions/workflows/autotools.yml?query=branch%3Ahdf5_1_14) -[![BSD](https://img.shields.io/badge/License-BSD-blue.svg)](https://github.com/HDFGroup/hdf5/blob/develop/COPYING) +[![BSD](https://img.shields.io/badge/License-BSD-blue.svg)](https://github.com/HDFGroup/hdf5/blob/develop/LICENSE) +[![OSS-Fuzz Status](https://oss-fuzz-build-logs.storage.googleapis.com/badges/hdf5.svg)](https://oss-fuzz-build-logs.storage.googleapis.com/index.html#hdf5) [HPC configure/build/test results](https://my.cdash.org/index.php?project=HDF5) @@ -90,12 +89,12 @@ are tentative. | Release | New Features | | ------- | ------------ | -| 1.14.5 | oss-fuzz fixes, ros3 VFD improvements | -| 1.14.6 | Last maintenance release of 1.14 | -| 1.16.0 | Complex number support, updated library defaults (cache sizes, etc.) | -| 2.0.0 | Multi-threaded HDF5, crashproofing / metadata journaling, Full (VFD) SWMR, encryption, digital signatures, sparse datasets, improved storage for variable-length datatypes, better Unicode support (especially on Windows), semantic versioning | +| 2.0.0 | Drop Autotools support, drop the C++ API, drop the HDF5 <--> GIF tools, add complex number support, update library defaults (cache sizes, etc.), use semantic versioning | +| FUTURE | Multi-threaded HDF5, crashproofing / metadata journaling, Full (VFD) SWMR, encryption, digital signatures, sparse datasets, improved storage for variable-length datatypes, better Unicode support (especially on Windows) | -Some HDF5 2.0.0 features listed here may be released in a 1.16.x release. +NOTE: In the March 2025 release we will begin using semantic versioning (https://semver.org/) and the previously announced 1.16.0 version will instead be numbered 2.0.0. + +[A list of planned HDF5 2.0 features and bugfixes can be found here.](https://github.com/HDFGroup/hdf5/wiki/HDF5-2.0-Planning) This list of feature release versions is also tentative, and the specific release in which a feature is introduced may change. diff --git a/UserMacros.cmake b/UserMacros.cmake index c9162236a8a..822d330f360 100644 --- a/UserMacros.cmake +++ b/UserMacros.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/acsite.m4 b/acsite.m4 index 1782033dc84..54ded2cce53 100644 --- a/acsite.m4 +++ b/acsite.m4 @@ -6,7 +6,7 @@ dnl All rights reserved. dnl dnl This file is part of HDF5. The full HDF5 copyright notice, including dnl terms governing use, modification, and redistribution, is contained in -dnl the COPYING file, which can be found at the root of the source code +dnl the LICENSE file, which can be found at the root of the source code dnl dnl distribution tree, or in https://www.hdfgroup.org/licenses. dnl dnl If you do not have access to either file, you may request a copy from dnl dnl help@hdfgroup.org. diff --git a/autogen.sh b/autogen.sh index 31d117cf8ed..1c7d6fb5a26 100755 --- a/autogen.sh +++ b/autogen.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/Makefile.am b/bin/Makefile.am index 96a4969ab01..3f10bef4fc4 100644 --- a/bin/Makefile.am +++ b/bin/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/README.md b/bin/README.md index 28559f0ba60..a7f786ba216 100644 --- a/bin/README.md +++ b/bin/README.md @@ -7,7 +7,6 @@ Programs run via `autogen.sh` (or the equivalent in CMake) are indicated. |`buildhdf5`|Convenience script to build HDF5 using the Autotools| |`checkapi`|Checks if public API calls are used in internal functions| |`chkcopyright`|Checks if files have appropriate copyright statements| -|`cmakehdf5`|Convenience script to build HDF5 using CMake| |`debug-ohdr`|Examines debug output from `H5O_open/close` to look for open objects| |`format_source`|Runs `clang-format` over the source files, applying our rules| |`genparser`|Creates the flex/bison-based parser files in the high-level library| diff --git a/bin/buildhdf5 b/bin/buildhdf5 index 8dfb82115e8..4b4dec0909b 100755 --- a/bin/buildhdf5 +++ b/bin/buildhdf5 @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/checkapi b/bin/checkapi index 619f93394e4..63a711ce9b2 100755 --- a/bin/checkapi +++ b/bin/checkapi @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/chkcopyright b/bin/chkcopyright index 34649277267..ac509b7fe0b 100755 --- a/bin/chkcopyright +++ b/bin/chkcopyright @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -109,7 +109,7 @@ BUILDCOPYRIGHT() * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -122,7 +122,7 @@ EOF ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -135,7 +135,7 @@ EOF * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -148,7 +148,7 @@ EOF # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -161,7 +161,7 @@ EOF ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. @@ -174,7 +174,7 @@ EOF @REM @REM This file is part of HDF5. The full HDF5 copyright notice, including @REM terms governing use, modification, and redistribution, is contained in -@REM the COPYING file, which can be found at the root of the source code +@REM the LICENSE file, which can be found at the root of the source code @REM distribution tree, or in https://www.hdfgroup.org/licenses. @REM If you do not have access to either file, you may request a copy from @REM help@hdfgroup.org. @@ -187,7 +187,7 @@ dnl All rights reserved. dnl dnl This file is part of HDF5. The full HDF5 copyright notice, including dnl terms governing use, modification, and redistribution, is contained in -dnl the COPYING file, which can be found at the root of the source code +dnl the LICENSE file, which can be found at the root of the source code dnl distribution tree, or in https://www.hdfgroup.org/licenses. dnl If you do not have access to either file, you may request a copy from dnl help@hdfgroup.org. diff --git a/bin/cmakehdf5 b/bin/cmakehdf5 deleted file mode 100755 index 2ce05d12b81..00000000000 --- a/bin/cmakehdf5 +++ /dev/null @@ -1,387 +0,0 @@ -#!/bin/sh -echo "Deprecated: This will be removed in a future release" -# Build and Test HDF5 using cmake. - -# Copyright: The HDF Group, 2012-14 - -# Debug Print: remove the comment hash if you want DPRINT to do echo -DPRINT=: -#DPRINT=echo - -# variable names -# The "extra" number is the step number and easier to see all logfiles in -# the sorted order of steps -progname=`basename $0` # program name -configlog="#${progname}_1config.log" -makelog="#${progname}_2build.log" -testlog="#${progname}_3test.log" -packlog="#${progname}_4pack.log" -installlog="#${progname}_5install.log" -vflag=1 # verbose flag default to on. -config_summary=libhdf5.settings -exit_code=0 - -# This command should be in the source directory's bin/ -# and should have invoked as "$srcdir/bin/$progname" or -# "bin/$progname". So, by striping bin/$program from $0, -# we can find $srcdir. -if [ "$0" = "bin/${progname}" ]; then - srcdir="." # current directory -else - # $0 is $srdir/bin/$progname - srcdir=`echo $0 | sed -e s%/bin/$progname\$%%` -fi -# Sanity check -if [ ! -r $srcdir/bin/$progname ]; then - echo "encountered error while trying to find srcdir($srdir)" - exit 1 -fi - -# Cmake build options -cacheinit=$srcdir/config/cmake/cacheinit.cmake -build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=OFF # C++ interface default off -build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=OFF # Fortran interface default off -build_java=-DHDF5_BUILD_JAVA:BOOL=OFF # Java interface default off -build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=ON # High Level interface default on -build_threadsafe=-DHDF5_ENABLE_THREADSAFE:BOOL=OFF # Threadsafe feature default off -build_testing=-DBUILD_TESTING:BOOL=ON # Build tests default on -build_test_shell=-DTEST_SHELL_SCRIPTS:BOOL=ON # Run shell script tests default on -build_tools=-DHDF5_BUILD_TOOLS:BOOL=ON # Build tools default on -with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT=ON # enable zlib filter default on -with_szlib=-DHDF5_ENABLE_SZIP_SUPPORT=OFF # enables szip filter default off -szlib_path="" # szip lib path default off -shared_lib=-DBUILD_SHARED_LIBS:BOOL=ON # enables shared lib; default on -njobs="" # number of jobs (commands) to - # run simultaneously; default is - # value from $MAKE if defined, - # otherwise none (1) - -#============= -# Function definitions -#============= - -# Show user brief help page -HELP_BRIEF() -{ -cat << EOF -Usage: $progname [options] - --help: shows details help page -EOF -} - -# Show user detail help page -HELP() -{ -cat << EOF -Usage: $progname [] - where options are: - --enable-fortran | --disable-fortran: - enable or disable fortran API. Default is off. - --enable-cxx | --disable-cxx: - enable or disable c++ API. Default is off. - --enable-java | --disable-java: - enable or disable Java API. Default is off. - --enable-hl | --disable-hl: - enable or disable high level API. Default is on. - --enable-threadsafe | --disable-threadsafe: - enable or disable threadsafe feature. Default is off - --enable-shared | --disable-shared: - enable or disable shared lib. Default is on. - --enable-tools | --disable-tools: - enable or disable building tools. Default is on. - --enable-testing | --disable-testing: - enable or disable building tests. Default is on. - --with-zlib | --with-zlib= | --without-zlib: - Use zlib library for external deflate I/O filter. Default is on. - --with-szlib | --with-szlib= | --without-szlib: - Use szlib library for external deflate I/O filter. Default is on. - --njobs=<-j N>: - number of jobs (commands) to run simultaneously; default is value from - $MAKE if defined, otherwise none - --enable-verbose | --disable-verbose: - enable or disable verbose output. Default is on. - --help: shows details help page - - : the file path to the library, expect /lib and /include. -EOF -} - -# Display a time stamp -TIMESTAMP() -{ - echo "=====" "`date`" "=====" -} - - -# Do one step bracketed with time stamps -# The '< /dev/null' is needed to prevent some applications like MPI -# jobs blocked for reading when they read stdin unnecessary. -# $1 is banner message to be displayed. -# $2 is command to run -# $3 is logfile name for saving output from the command -STEP() -{ - banner="$1" - command="$2" - logfile="$3" - - echo "$banner" with output saved in $logfile - (TIMESTAMP; nerror=0 ; - echo "eval $command" - eval $command || nerror=1 ; - TIMESTAMP; exit $nerror) < /dev/null > "$logfile" 2>&1 - if [ $? -ne 0 ]; then - echo "error in '$banner'. $progname aborted." - exit 1 - fi -} - - -# Install the generated installation image file. Different platform uses -# different image files. -# Linux: HDF5--Linux.sh file -# Mac OS X: Not implemented yet -# Others: Not implemented yet -INSTALL_HDF5() -{ - myos="`uname -s`" - case "$myos" in - Linux) - install_file=./HDF5-${version}-Linux.sh - $install_file --skip-license $* - ;; - Darwin) # MacOS DMG file - # These steps were a kludge. Need proper support from Cmake engineering. - echo Darwin install step needs proper implementation. Quit. - return 1 - # - install_file=HDF5-${version}-Darwin.dmg - test -d hdf5 || mkdir hdf5 - basename=`basename $install_file .dmg` - # mount the DMG file as /Volumes/$basename - # echo 'Y' as yes for license. - echo Y | hdiutil mount $install_file - # copy the contents to the install location - cp -R "/Volumes/$basename/HDF_Group" hdf5 - # unmount the DMG file - hdiutil unmount /Volumes/$basename - ;; - *) # unknown/unsupported OS. - echo "INSTALL_HDF5: Error--unknown/unsupported OS($myos)" - return 1 - ;; - esac -} - - -# Print logfiles. -# $*: logfiles -DUMP_LOGFILE() -{ - for x in $*; do - if [ -f $x ]; then - echo "==================================" - echo "Dumping $x" - echo "==================================" - cat $x - echo "==== END $x =====" - echo - fi - done -} - - -#========== -# main -#========== - -# Show a start time stamp -TIMESTAMP - -# Initialize njobs if $MAKE is defined -if [ -n "$MAKE" ]; then - # assume all arguments are for --jobs - njobs=`echo $MAKE | cut -s -d' ' -f2-` -fi - -# Parse Cmake configure options -# --enable-XXX or --disable-XXX will enable or disable feature XXX. -# XXX can be: -# fortran Fortran interface -# cxx C++ interface -# java Java interface -# hl Highlevel interface -# testing Build tests -# tools Build tools -while [ $# -gt 0 ]; do - case "$1" in - --enable-fortran) - build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=ON - ;; - --disable-fortran) - build_fortran=-DHDF5_BUILD_FORTRAN:BOOL=OFF - ;; - --enable-cxx) - build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=ON - ;; - --disable-cxx) - build_cpp_lib=-DHDF5_BUILD_CPP_LIB:BOOL=OFF - ;; - --enable-java) - build_java=-DHDF5_BUILD_JAVA:BOOL=ON - ;; - --disable-java) - build_java=-DHDF5_BUILD_JAVA:BOOL=OFF - ;; - --enable-hl) - build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=ON - ;; - --disable-hl) - build_hl_lib=-DHDF5_BUILD_HL_LIB:BOOL=OFF - ;; - --enable-threadsafe) - build_threadsafe=-DHDF5_ENABLE_THREADSAFE:BOOL=ON - ;; - --disable-threadsafe) - build_threadsafe=-DHDF5_ENABLE_THREADSAFE:BOOL=OFF - ;; - --enable-shared) - shared_lib=-DBUILD_SHARED_LIBS:BOOL=ON - ;; - --disable-shared) - shared_lib=-DBUILD_SHARED_LIBS:BOOL=OFF - ;; - --enable-tools) - build_tools=-DHDF5_BUILD_TOOLS:BOOL=ON - ;; - --disable-tools) - build_tools=-DHDF5_BUILD_TOOLS:BOOL=OFF - ;; - --enable-testing) - build_testing=-DBUILD_TESTING:BOOL=ON - ;; - --disable-testing) - build_testing=-DBUILD_TESTING:BOOL=OFF - ;; - --enable-shell-testing) - build_test_shell=-DTEST_SHELL_SCRIPTS:BOOL=ON - ;; - --disable-shell-testing) - build_test_shell=-DTEST_SHELL_SCRIPTS:BOOL=OFF - ;; - --with-zlib) - with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON - ;; - --with-zlib=*) - xarg=`echo $1 | cut -d= -f2-` - with_zlib="-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=ON -DZLIB_ROOT=$xarg" - ;; - --without-zlib) - with_zlib=-DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF - ;; - --with-szlib) - with_szlib=-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON - szlib_path="" # szlib is in default paths - ;; - --with-szlib=*) - xarg=`echo $1 | cut -d= -f2-` - with_szlib="-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=ON" - szlib_path="SZIP_INSTALL=$xarg" - ;; - --without-szlib) - with_szlib=-DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF - szlib_path="" # reset the path - ;; - --njobs=*) - njobs=`echo $1 | cut -d= -f2-` - ;; - --enable-verbose) - vflag=1 - ;; - --disable-verbose) - vflag=0 - ;; - --help) - # print the detail help page and exit - HELP - exit 0 - ;; - *) - echo "Unknown options: $1" - HELP - exit 1 - ;; - esac - shift -done -$DPRINT after option parsing vflag=$vflag - -# Always display the brief help page -HELP_BRIEF - -# Verify there is a valid hdf5 source directory present -if [ ! -d $srcdir ]; then - echo $srcdir not found. Aborted. - exit 1 -fi - -# figure out version information -vers=bin/h5vers -if [ ! -x $srcdir/$vers ]; then - echo $srcdir/$vers not found or not executable. Aborted. - exit 1 -fi -version=`cd $srcdir; $vers` -if [ $? != 0 ]; then - echo $vers failed. Aborted. - exit 1 -fi - -# setup output of all the log files if verbose is on upon exit -trap \ - "if [ $vflag -ne 0 ]; then DUMP_LOGFILE \$configlog \$makelog \$testlog \$packlog \$installlog; fi" \ - 0 - -echo Running Cmake for HDF5-${version} ... -# 4. Configure the C library, tools and tests with this command: -# If successful, append the configure summary to the configure logfile. -STEP "Configure..." \ - "env ${szlib_path} \ - cmake \ - -C $cacheinit \ - $build_cpp_lib \ - $build_fortran \ - $build_java \ - $build_hl_lib \ - $build_threadsafe \ - $shared_lib \ - $build_testing \ - $build_test_shell \ - $build_tools \ - $with_zlib \ - $with_szlib \ - $srcdir" $configlog &&\ - cat src/$config_summary >> $configlog - -# 5. Build the C library, tools and tests with this command: -STEP "Build the library, tools and tests, ..." "cmake --build . --config Release -- $njobs" $makelog - -# 6. Test the C library and tools with this command: -STEP "Test the library and tools..." "ctest . -C Release $njobs" $testlog - -# 7. Create an install image with this command: -STEP "Create an install image..." "cpack -C Release CPackConfig.cmake" $packlog - -# The implementation of installation is incomplete (only works for linux). -# Screen it out for now till it is completed. -if false; then -# 8. Install with this command: -STEP "Install..." "INSTALL_HDF5" $installlog -fi - -# save the last exit code -exit_code=$? - -# Show a closing time stamp -TIMESTAMP -exit $exit_code diff --git a/bin/debug-ohdr b/bin/debug-ohdr index 1106af3d6a2..5cf90fe63ba 100755 --- a/bin/debug-ohdr +++ b/bin/debug-ohdr @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/genparser b/bin/genparser index 3e113739447..be2b9e24bd4 100755 --- a/bin/genparser +++ b/bin/genparser @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -250,8 +250,6 @@ do echo '#if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 600 ' >> tmp.out echo '#pragma GCC diagnostic ignored "-Wnull-dereference" ' >> tmp.out echo '#endif ' >> tmp.out - echo '#elif defined __SUNPRO_CC ' >> tmp.out - echo '#pragma disable_warn ' >> tmp.out echo '#elif defined _MSC_VER ' >> tmp.out echo '#pragma warning(push, 1) ' >> tmp.out echo '#endif ' >> tmp.out diff --git a/bin/h5cc.in b/bin/h5cc.in index 9938c31f098..a9162889b3d 100644 --- a/bin/h5cc.in +++ b/bin/h5cc.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -178,7 +178,7 @@ case "$CC" in kind="gcc" ;; mpicc|mpcc|mpicc_r) - # Is this gcc masquarading as an MPI compiler? + # Is this gcc masquerading as an MPI compiler? if test "`${CC} -v 2>&1 | sed -n 2p | cut -c1-3`" = "gcc"; then kind="gcc" else @@ -191,7 +191,7 @@ case "$CC" in ;; esac -for arg in $@ ; do +for arg in "$@" ; do if test "x$get_output_file" = "xyes"; then link_args="$link_args $arg" output_file="$arg" @@ -263,6 +263,10 @@ for arg in $@ ; do qarg='"'"$arg"'"' qargs="$qargs $qarg" ;; + *\ *) + qarg=$arg + qargs="$qargs $qarg" + ;; *) if test -s "$arg"; then ext=`expr "$arg" : '.*\(\..*\)'` diff --git a/bin/h5redeploy.in b/bin/h5redeploy.in index d73cca71eb7..f4f518af6f1 100644 --- a/bin/h5redeploy.in +++ b/bin/h5redeploy.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/h5vers b/bin/h5vers index 129ad1bf526..8eaac1140ff 100755 --- a/bin/h5vers +++ b/bin/h5vers @@ -11,7 +11,7 @@ use strict; # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/iostats b/bin/iostats index d8a8933470a..93321082b45 100755 --- a/bin/iostats +++ b/bin/iostats @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/make_err b/bin/make_err index 58722a4fd82..51ab22df07b 100755 --- a/bin/make_err +++ b/bin/make_err @@ -9,7 +9,7 @@ use warnings; # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -33,7 +33,7 @@ sub print_copyright ($) { print $fh " * *\n"; print $fh " * This file is part of HDF5. The full HDF5 copyright notice, including *\n"; print $fh " * terms governing use, modification, and redistribution, is contained in *\n"; - print $fh " * the COPYING file, which can be found at the root of the source code *\n"; + print $fh " * the LICENSE file, which can be found at the root of the source code *\n"; print $fh " * distribution tree, or in https://www.hdfgroup.org/licenses. *\n"; print $fh " * If you do not have access to either file, you may request a copy from *\n"; print $fh " * help\@hdfgroup.org. *\n"; diff --git a/bin/make_overflow b/bin/make_overflow index 1cb5104901a..65b17687a61 100755 --- a/bin/make_overflow +++ b/bin/make_overflow @@ -14,7 +14,7 @@ my @ctypes = ( () ); # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -62,7 +62,7 @@ sub print_copyright ($) { print $fh " * *\n"; print $fh " * This file is part of HDF5. The full HDF5 copyright notice, including *\n"; print $fh " * terms governing use, modification, and redistribution, is contained in *\n"; - print $fh " * the COPYING file, which can be found at the root of the source code *\n"; + print $fh " * the LICENSE file, which can be found at the root of the source code *\n"; print $fh " * distribution tree, or in https://www.hdfgroup.org/licenses. *\n"; print $fh " * If you do not have access to either file, you may request a copy from *\n"; print $fh " * help\@hdfgroup.org. *\n"; diff --git a/bin/make_vers b/bin/make_vers index 0fc5fb91ab3..ba335cae27e 100755 --- a/bin/make_vers +++ b/bin/make_vers @@ -8,7 +8,7 @@ use warnings; # is added (like support for 1.4, etc), the min_sup_idx parameter will # need to be decremented.) -# Max. library "index" (0 = v1.0, 1 = 1.2, 2 = 1.4, 3 = 1.6, 4 = 1.8, 5 = 1.10, 6 = 1.12, 7 = 1.14, 8 = 1.16, etc) +# Max. library "index" (0 = v1.0, 1 = 1.2, 2 = 1.4, 3 = 1.6, 4 = 1.8, 5 = 1.10, 6 = 1.12, 7 = 1.14, 8 = 2.0, etc) $max_idx = 8; # Min. supported previous library version "index" (0 = v1.0, 1 = 1.2, etc) @@ -23,7 +23,7 @@ $indent = 2; # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -47,7 +47,7 @@ sub print_copyright ($) { print $fh " * *\n"; print $fh " * This file is part of HDF5. The full HDF5 copyright notice, including *\n"; print $fh " * terms governing use, modification, and redistribution, is contained in *\n"; - print $fh " * the COPYING file, which can be found at the root of the source code *\n"; + print $fh " * the LICENSE file, which can be found at the root of the source code *\n"; print $fh " * distribution tree, or in https://www.hdfgroup.org/licenses. *\n"; print $fh " * If you do not have access to either file, you may request a copy from *\n"; print $fh " * help\@hdfgroup.org. *\n"; diff --git a/bin/output_filter.sh b/bin/output_filter.sh index 1b7175c9185..a2ec6a1f2bb 100644 --- a/bin/output_filter.sh +++ b/bin/output_filter.sh @@ -3,7 +3,7 @@ ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. diff --git a/bin/pkgscrpts/h5rmflags b/bin/pkgscrpts/h5rmflags index 39c4281c2a4..75c49841a8e 100755 --- a/bin/pkgscrpts/h5rmflags +++ b/bin/pkgscrpts/h5rmflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/pkgscrpts/makeHDF5BinaryTarfiles.pl b/bin/pkgscrpts/makeHDF5BinaryTarfiles.pl index 820403f4d8d..2ba5345ddc0 100755 --- a/bin/pkgscrpts/makeHDF5BinaryTarfiles.pl +++ b/bin/pkgscrpts/makeHDF5BinaryTarfiles.pl @@ -6,7 +6,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/process_source.sh b/bin/process_source.sh new file mode 100755 index 00000000000..728857578af --- /dev/null +++ b/bin/process_source.sh @@ -0,0 +1,61 @@ +#!/bin/sh +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the LICENSE file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +# A convenience script to process HDF5 source. This recreates some header files +# from their input files and runs the trace script to update the H5ARG_TRACE +# macros. +# +# This does NOT regenerate the parser code in the high-level library, since +# that would probably generate a lot of churn due to different flex, etc. +# versions. If you want to regenerate that code, use the genparser script +# from the bin directory. + +echo +echo "******************************" +echo "* HDF5 process source script *" +echo "******************************" +echo +echo "*** NOTE: Must be run from the source root! ***" +echo + +# Run trace script +# The trace script updates H5ARG_TRACE macros in library source files. +echo "Running arg trace script:" +bin/trace src/H5*.c || exit 1 +echo + +# Run make_err +# make_err automatically generates the H5E headers that create error message +# types for HDF5. +echo "Running error generation script:" +bin/make_err src/H5err.txt || exit 1 +echo + +# Run make_vers +# make_vers automatically generates the public headers that define the API version +# macros for HDF5. +echo "Running API version generation script:" +bin/make_vers src/H5vers.txt || exit 1 +echo + +# Run make_overflow +# make_overflow automatically generates macros for detecting overflows for type +# conversion. +echo "Running overflow macro generation script:" +bin/make_overflow src/H5overflow.txt || exit 1 +echo + +echo "*** SUCCESS ***" + +echo +exit 0 diff --git a/bin/release b/bin/release index f72390cda08..6190631558e 100755 --- a/bin/release +++ b/bin/release @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/restore.sh b/bin/restore.sh index 85ebd1c77a7..3aab8e892d8 100755 --- a/bin/restore.sh +++ b/bin/restore.sh @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -51,18 +51,6 @@ rm -f bin/depcomp echo "Remove files generated by autoheader" rm -f src/H5config.h.in -echo "Remove files generated by bin/make_err" -rm -f src/H5Epubgen.h -rm -f src/H5Einit.h -rm -f src/H5Eterm.h -rm -f src/H5Edefin.h - -echo "Remove files generated by bin/make_vers" -rm -f src/H5version.h - -echo "Remove files generated by bin/make_overflow" -rm -f src/H5overflow.h - echo "Remove remaining generated files" rm -f aclocal.m4 diff --git a/bin/runbkgprog b/bin/runbkgprog index 945f5f3aa34..7bd605a8cb2 100755 --- a/bin/runbkgprog +++ b/bin/runbkgprog @@ -9,7 +9,7 @@ $indent=4; # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/switch_maint_mode b/bin/switch_maint_mode index 7f894ffff87..ece35acbf36 100755 --- a/bin/switch_maint_mode +++ b/bin/switch_maint_mode @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/trace b/bin/trace index 4585adcf70f..fd344a25a2b 100755 --- a/bin/trace +++ b/bin/trace @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/bin/warnhist b/bin/warnhist index b77202f9504..230a03ac09e 100755 --- a/bin/warnhist +++ b/bin/warnhist @@ -8,7 +8,7 @@ use warnings; # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/c++/Makefile.am b/c++/Makefile.am index ef7c285a5ee..8189b296e3f 100644 --- a/c++/Makefile.am +++ b/c++/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/c++/src/H5AbstractDs.cpp b/c++/src/H5AbstractDs.cpp index ab3fabaeb69..97b6194113c 100644 --- a/c++/src/H5AbstractDs.cpp +++ b/c++/src/H5AbstractDs.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5AbstractDs.h b/c++/src/H5AbstractDs.h index d831bd65791..d5b154d7078 100644 --- a/c++/src/H5AbstractDs.h +++ b/c++/src/H5AbstractDs.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Alltypes.h b/c++/src/H5Alltypes.h index b18add8d1fb..813824458a2 100644 --- a/c++/src/H5Alltypes.h +++ b/c++/src/H5Alltypes.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5ArrayType.cpp b/c++/src/H5ArrayType.cpp index 3a2da2bf39f..8e7adcbfbe3 100644 --- a/c++/src/H5ArrayType.cpp +++ b/c++/src/H5ArrayType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5ArrayType.h b/c++/src/H5ArrayType.h index e02a3a2a0e8..6fc865e659a 100644 --- a/c++/src/H5ArrayType.h +++ b/c++/src/H5ArrayType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5AtomType.cpp b/c++/src/H5AtomType.cpp index f2e037a98bc..b18cc22576f 100644 --- a/c++/src/H5AtomType.cpp +++ b/c++/src/H5AtomType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5AtomType.h b/c++/src/H5AtomType.h index 327604ddd56..4c942859093 100644 --- a/c++/src/H5AtomType.h +++ b/c++/src/H5AtomType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Attribute.cpp b/c++/src/H5Attribute.cpp index a79d7c3a024..5324e7da2a7 100644 --- a/c++/src/H5Attribute.cpp +++ b/c++/src/H5Attribute.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Attribute.h b/c++/src/H5Attribute.h index 970110274b4..b50195bc172 100644 --- a/c++/src/H5Attribute.h +++ b/c++/src/H5Attribute.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Classes.h b/c++/src/H5Classes.h index b4a0670d468..373e0106c8d 100644 --- a/c++/src/H5Classes.h +++ b/c++/src/H5Classes.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5CommonFG.cpp b/c++/src/H5CommonFG.cpp index d26c83fade0..7fe299f8f72 100644 --- a/c++/src/H5CommonFG.cpp +++ b/c++/src/H5CommonFG.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5CommonFG.h b/c++/src/H5CommonFG.h index 6eb01db3bd1..93468b8340a 100644 --- a/c++/src/H5CommonFG.h +++ b/c++/src/H5CommonFG.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5CompType.cpp b/c++/src/H5CompType.cpp index 70bbe66556e..b369d3ae8cf 100644 --- a/c++/src/H5CompType.cpp +++ b/c++/src/H5CompType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5CompType.h b/c++/src/H5CompType.h index a642b0d5143..11033bd21ec 100644 --- a/c++/src/H5CompType.h +++ b/c++/src/H5CompType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Cpp.h b/c++/src/H5Cpp.h index 34fdef2032d..8a23fb61108 100644 --- a/c++/src/H5Cpp.h +++ b/c++/src/H5Cpp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5CppDoc.h b/c++/src/H5CppDoc.h index 37bd8a5cd07..dc902962c06 100644 --- a/c++/src/H5CppDoc.h +++ b/c++/src/H5CppDoc.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DaccProp.cpp b/c++/src/H5DaccProp.cpp index ba4c8ef60b0..e91c3f8c1a6 100644 --- a/c++/src/H5DaccProp.cpp +++ b/c++/src/H5DaccProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DaccProp.h b/c++/src/H5DaccProp.h index 3f101f3aa70..69a55cfc4d8 100644 --- a/c++/src/H5DaccProp.h +++ b/c++/src/H5DaccProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DataSet.cpp b/c++/src/H5DataSet.cpp index 40b40f2f21e..d4839bb1e2d 100644 --- a/c++/src/H5DataSet.cpp +++ b/c++/src/H5DataSet.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DataSet.h b/c++/src/H5DataSet.h index 399235086f6..ea2a59ab0c3 100644 --- a/c++/src/H5DataSet.h +++ b/c++/src/H5DataSet.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DataSpace.cpp b/c++/src/H5DataSpace.cpp index 403f9ece67b..b59be4b3cd1 100644 --- a/c++/src/H5DataSpace.cpp +++ b/c++/src/H5DataSpace.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DataSpace.h b/c++/src/H5DataSpace.h index 136a8ea63b8..21510cf8b22 100644 --- a/c++/src/H5DataSpace.h +++ b/c++/src/H5DataSpace.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DataType.cpp b/c++/src/H5DataType.cpp index 98b7920b0a0..e864ed54bb9 100644 --- a/c++/src/H5DataType.cpp +++ b/c++/src/H5DataType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DataType.h b/c++/src/H5DataType.h index 7cc1d315793..240c018f855 100644 --- a/c++/src/H5DataType.h +++ b/c++/src/H5DataType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DcreatProp.cpp b/c++/src/H5DcreatProp.cpp index bbe00e744f8..250413c6d73 100644 --- a/c++/src/H5DcreatProp.cpp +++ b/c++/src/H5DcreatProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -649,7 +649,7 @@ DSetCreatPropList::setFletcher32() const /// which is a 32-bit signed long value on Windows, which limited /// the valid offset that can be set to 2 GiB. /// -///\version 1.16.0 \p offset parameter type changed to HDoff_t from off_t. +///\version 2.0.0 \p offset parameter type changed to HDoff_t from off_t. //-------------------------------------------------------------------------- void DSetCreatPropList::setExternal(const char *name, HDoff_t offset, hsize_t size) const @@ -702,7 +702,7 @@ DSetCreatPropList::getExternalCount() const /// which is a 32-bit signed long value on Windows, which limited /// the valid offset that can be returned to 2 GiB. /// -///\version 1.16.0 \p offset parameter type changed to HDoff_t from off_t. +///\version 2.0.0 \p offset parameter type changed to HDoff_t from off_t. //-------------------------------------------------------------------------- void DSetCreatPropList::getExternal(unsigned idx, size_t name_size, char *name, HDoff_t &offset, diff --git a/c++/src/H5DcreatProp.h b/c++/src/H5DcreatProp.h index 1621375eda3..9637ca6917b 100644 --- a/c++/src/H5DcreatProp.h +++ b/c++/src/H5DcreatProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DxferProp.cpp b/c++/src/H5DxferProp.cpp index 1b9d6510580..d3ba22c395e 100644 --- a/c++/src/H5DxferProp.cpp +++ b/c++/src/H5DxferProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5DxferProp.h b/c++/src/H5DxferProp.h index b86202da254..8f0f5a965a0 100644 --- a/c++/src/H5DxferProp.h +++ b/c++/src/H5DxferProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5EnumType.cpp b/c++/src/H5EnumType.cpp index 569e56abf47..978d22d7d86 100644 --- a/c++/src/H5EnumType.cpp +++ b/c++/src/H5EnumType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5EnumType.h b/c++/src/H5EnumType.h index a5096fcf905..5a3258dd9cc 100644 --- a/c++/src/H5EnumType.h +++ b/c++/src/H5EnumType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Exception.cpp b/c++/src/H5Exception.cpp index 906bd27e594..8dabaee41b7 100644 --- a/c++/src/H5Exception.cpp +++ b/c++/src/H5Exception.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Exception.h b/c++/src/H5Exception.h index 6bf51ef893b..12bfe319c63 100644 --- a/c++/src/H5Exception.h +++ b/c++/src/H5Exception.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5FaccProp.cpp b/c++/src/H5FaccProp.cpp index 12af96db666..6949309e6b7 100644 --- a/c++/src/H5FaccProp.cpp +++ b/c++/src/H5FaccProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -713,8 +713,7 @@ FileAccPropList::getFileLocking(hbool_t &use_file_locking, hbool_t &ignore_when_ /// \li \c H5F_LIBVER_110 /// \li \c H5F_LIBVER_112 /// \li \c H5F_LIBVER_114 -/// \li \c H5F_LIBVER_116 -/// \li \c H5F_LIBVER_118 +/// \li \c H5F_LIBVER_200 /// \li \c H5F_LIBVER_LATEST /// /// Valid values of \a libver_high are as follows: @@ -722,8 +721,7 @@ FileAccPropList::getFileLocking(hbool_t &use_file_locking, hbool_t &ignore_when_ /// \li \c H5F_LIBVER_110 /// \li \c H5F_LIBVER_112 /// \li \c H5F_LIBVER_114 -/// \li \c H5F_LIBVER_116 -/// \li \c H5F_LIBVER_118 +/// \li \c H5F_LIBVER_200 /// \li \c H5F_LIBVER_LATEST (Default) /// /// For more detail, please refer to the H5Pset_libver_bounds API in @@ -755,8 +753,7 @@ FileAccPropList::setLibverBounds(H5F_libver_t libver_low, H5F_libver_t libver_hi /// \li \c H5F_LIBVER_110 /// \li \c H5F_LIBVER_112 /// \li \c H5F_LIBVER_114 -/// \li \c H5F_LIBVER_116 -/// \li \c H5F_LIBVER_118 +/// \li \c H5F_LIBVER_200 /// \li \c H5F_LIBVER_LATEST /// /// and \a libver_high: @@ -764,8 +761,7 @@ FileAccPropList::setLibverBounds(H5F_libver_t libver_low, H5F_libver_t libver_hi /// \li \c H5F_LIBVER_110 /// \li \c H5F_LIBVER_112 /// \li \c H5F_LIBVER_114 -/// \li \c H5F_LIBVER_116 -/// \li \c H5F_LIBVER_118 +/// \li \c H5F_LIBVER_200 /// \li \c H5F_LIBVER_LATEST //-------------------------------------------------------------------------- void diff --git a/c++/src/H5FaccProp.h b/c++/src/H5FaccProp.h index 67394f1c3a5..1ebba76f330 100644 --- a/c++/src/H5FaccProp.h +++ b/c++/src/H5FaccProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5FcreatProp.cpp b/c++/src/H5FcreatProp.cpp index 66e4ceb886b..733bf4c3bc2 100644 --- a/c++/src/H5FcreatProp.cpp +++ b/c++/src/H5FcreatProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5FcreatProp.h b/c++/src/H5FcreatProp.h index 76c2ae5b952..0094c354464 100644 --- a/c++/src/H5FcreatProp.h +++ b/c++/src/H5FcreatProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5File.cpp b/c++/src/H5File.cpp index 9c390f9c73f..ab01e4d12c4 100644 --- a/c++/src/H5File.cpp +++ b/c++/src/H5File.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5File.h b/c++/src/H5File.h index 617adaadb4d..aebe0a6913d 100644 --- a/c++/src/H5File.h +++ b/c++/src/H5File.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5FloatType.cpp b/c++/src/H5FloatType.cpp index 41ee8a850bc..9e22dc351fd 100644 --- a/c++/src/H5FloatType.cpp +++ b/c++/src/H5FloatType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5FloatType.h b/c++/src/H5FloatType.h index b804892b0a8..e0b9ec570f8 100644 --- a/c++/src/H5FloatType.h +++ b/c++/src/H5FloatType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Group.cpp b/c++/src/H5Group.cpp index 48358b3a5cb..1dc6f9b6494 100644 --- a/c++/src/H5Group.cpp +++ b/c++/src/H5Group.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Group.h b/c++/src/H5Group.h index 9c89dd1599a..ea7719f8f82 100644 --- a/c++/src/H5Group.h +++ b/c++/src/H5Group.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5IdComponent.cpp b/c++/src/H5IdComponent.cpp index 0d15aac7fb9..c4ce6097e76 100644 --- a/c++/src/H5IdComponent.cpp +++ b/c++/src/H5IdComponent.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5IdComponent.h b/c++/src/H5IdComponent.h index 2fef96f4137..d54efdbdd83 100644 --- a/c++/src/H5IdComponent.h +++ b/c++/src/H5IdComponent.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Include.h b/c++/src/H5Include.h index a55cbe4f4ce..2cfa1a1ac7b 100644 --- a/c++/src/H5Include.h +++ b/c++/src/H5Include.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5IntType.cpp b/c++/src/H5IntType.cpp index 7c8b7d36ff9..6717aa29a8a 100644 --- a/c++/src/H5IntType.cpp +++ b/c++/src/H5IntType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5IntType.h b/c++/src/H5IntType.h index 1ca0ab147d2..99b728453d0 100644 --- a/c++/src/H5IntType.h +++ b/c++/src/H5IntType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5LaccProp.cpp b/c++/src/H5LaccProp.cpp index 7a66c13d323..4134ab84be3 100644 --- a/c++/src/H5LaccProp.cpp +++ b/c++/src/H5LaccProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5LaccProp.h b/c++/src/H5LaccProp.h index 6f4b9190f06..8ac3d968f8c 100644 --- a/c++/src/H5LaccProp.h +++ b/c++/src/H5LaccProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5LcreatProp.cpp b/c++/src/H5LcreatProp.cpp index 0dbb0b275c0..1002221a383 100644 --- a/c++/src/H5LcreatProp.cpp +++ b/c++/src/H5LcreatProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5LcreatProp.h b/c++/src/H5LcreatProp.h index 272f260b253..060a4a3ce92 100644 --- a/c++/src/H5LcreatProp.h +++ b/c++/src/H5LcreatProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Library.cpp b/c++/src/H5Library.cpp index c16bd819268..c336ba5ee0f 100644 --- a/c++/src/H5Library.cpp +++ b/c++/src/H5Library.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Library.h b/c++/src/H5Library.h index 10e5536bc14..408b525c74d 100644 --- a/c++/src/H5Library.h +++ b/c++/src/H5Library.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Location.cpp b/c++/src/H5Location.cpp index 87eac679238..069e96c4e12 100644 --- a/c++/src/H5Location.cpp +++ b/c++/src/H5Location.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Location.h b/c++/src/H5Location.h index f10a00531f0..02099a981ac 100644 --- a/c++/src/H5Location.h +++ b/c++/src/H5Location.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Object.cpp b/c++/src/H5Object.cpp index 54114378e85..901d750bf03 100644 --- a/c++/src/H5Object.cpp +++ b/c++/src/H5Object.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5Object.h b/c++/src/H5Object.h index b2905842ad7..f2e6f5bb375 100644 --- a/c++/src/H5Object.h +++ b/c++/src/H5Object.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5OcreatProp.cpp b/c++/src/H5OcreatProp.cpp index 0f1da1c5a8d..832e1db28ac 100644 --- a/c++/src/H5OcreatProp.cpp +++ b/c++/src/H5OcreatProp.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5OcreatProp.h b/c++/src/H5OcreatProp.h index fbe399197fe..d96f2896819 100644 --- a/c++/src/H5OcreatProp.h +++ b/c++/src/H5OcreatProp.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5PredType.cpp b/c++/src/H5PredType.cpp index 0338a01e016..8574f2ea6ea 100644 --- a/c++/src/H5PredType.cpp +++ b/c++/src/H5PredType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5PredType.h b/c++/src/H5PredType.h index 85b6e96fb0a..49d7cc8d946 100644 --- a/c++/src/H5PredType.h +++ b/c++/src/H5PredType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5PropList.cpp b/c++/src/H5PropList.cpp index a116494a401..2c13b25205c 100644 --- a/c++/src/H5PropList.cpp +++ b/c++/src/H5PropList.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5PropList.h b/c++/src/H5PropList.h index beef474f65e..d61fdf7cae8 100644 --- a/c++/src/H5PropList.h +++ b/c++/src/H5PropList.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5StrType.cpp b/c++/src/H5StrType.cpp index 1b45814f4e7..2692877529f 100644 --- a/c++/src/H5StrType.cpp +++ b/c++/src/H5StrType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5StrType.h b/c++/src/H5StrType.h index 0f51e759aaf..76cd72b3a14 100644 --- a/c++/src/H5StrType.h +++ b/c++/src/H5StrType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5VarLenType.cpp b/c++/src/H5VarLenType.cpp index 49f2cbdd22b..c6ce391de03 100644 --- a/c++/src/H5VarLenType.cpp +++ b/c++/src/H5VarLenType.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/H5VarLenType.h b/c++/src/H5VarLenType.h index d7f0ff1aefe..7a4cbd2ebdc 100644 --- a/c++/src/H5VarLenType.h +++ b/c++/src/H5VarLenType.h @@ -5,7 +5,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/src/Makefile.am b/c++/src/Makefile.am index 41815cd2b26..e94e46619c7 100644 --- a/c++/src/Makefile.am +++ b/c++/src/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/c++/src/h5c++.in b/c++/src/h5c++.in index 8830f3cd9a2..4f20d23fa7e 100644 --- a/c++/src/h5c++.in +++ b/c++/src/h5c++.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -174,7 +174,7 @@ case "$CXX" in kind="gcc" ;; mpicc|mpcc|mpicc_r) - # Is this gcc masquarading as an MPI compiler? + # Is this gcc masquerading as an MPI compiler? if test "`${CXX} -v 2>&1 | sed -n 2p | cut -c1-3`" = "gcc"; then kind="gcc" else @@ -187,7 +187,7 @@ case "$CXX" in ;; esac -for arg in $@ ; do +for arg in "$@" ; do if test "x$get_output_file" = "xyes"; then link_args="$link_args $arg" output_file="$arg" @@ -253,6 +253,10 @@ for arg in $@ ; do qarg='"'"$arg"'"' qargs="$qargs $qarg" ;; + *\ *) + qarg=$arg + qargs="$qargs $qarg" + ;; *) if [ -s "$arg" ] ; then ext=`expr "$arg" : '.*\(\..*\)'` diff --git a/c++/test/CMakeTests.cmake b/c++/test/CMakeTests.cmake index 224b09974d0..ce82c6cbd2a 100644 --- a/c++/test/CMakeTests.cmake +++ b/c++/test/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/c++/test/CMakeVFDTests.cmake b/c++/test/CMakeVFDTests.cmake index 52f8069f390..8fd75c693f4 100644 --- a/c++/test/CMakeVFDTests.cmake +++ b/c++/test/CMakeVFDTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/c++/test/H5srcdir_str.h.in b/c++/test/H5srcdir_str.h.in index 55280cd641c..3e161381abb 100644 --- a/c++/test/H5srcdir_str.h.in +++ b/c++/test/H5srcdir_str.h.in @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/Makefile.am b/c++/test/Makefile.am index d513d954748..59bf76fd74f 100644 --- a/c++/test/Makefile.am +++ b/c++/test/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/c++/test/dsets.cpp b/c++/test/dsets.cpp index 625e97f0d72..d61389b0842 100644 --- a/c++/test/dsets.cpp +++ b/c++/test/dsets.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/h5cpputil.cpp b/c++/test/h5cpputil.cpp index 933aa7da264..bb16e8cbeca 100644 --- a/c++/test/h5cpputil.cpp +++ b/c++/test/h5cpputil.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/h5cpputil.h b/c++/test/h5cpputil.h index 6c8560d5c8d..9288bd1e96a 100644 --- a/c++/test/h5cpputil.h +++ b/c++/test/h5cpputil.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/tarray.cpp b/c++/test/tarray.cpp index 3ee94d24f59..9be2e5c85c8 100644 --- a/c++/test/tarray.cpp +++ b/c++/test/tarray.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/tattr.cpp b/c++/test/tattr.cpp index 07ab0a6d777..dec33972599 100644 --- a/c++/test/tattr.cpp +++ b/c++/test/tattr.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -632,7 +632,7 @@ test_attr_compound_write(FileAccPropList &fapl) hsize_t dims2[] = {ATTR4_DIM1, ATTR4_DIM2}; DataSpace sid2(ATTR4_RANK, dims2); - // Create complex attribute for the dataset + // Create compound attribute for the dataset Attribute attr = dataset.createAttribute(ATTR4_NAME, comp_type, sid2); // Try to create the same attribute again (should fail) @@ -643,7 +643,7 @@ test_attr_compound_write(FileAccPropList &fapl) { } // do nothing, exception expected - // Write complex attribute data + // Write compound attribute data attr.write(comp_type, attr_data4); PASSED(); @@ -1983,7 +1983,7 @@ test_attr(const void *params) // Loop over using new group format unsigned new_format; - for (new_format = FALSE; new_format <= TRUE; new_format++) { + for (new_format = false; new_format <= true; new_format++) { FileAccPropList curr_fapl; // Set the file access proplist for the type of format @@ -2001,8 +2001,8 @@ test_attr(const void *params) test_attr_rename(curr_fapl); // Test renaming attribute test_attr_basic_read(curr_fapl); // Test basic H5A reading code - test_attr_compound_write(curr_fapl); // Test complex datatype H5A writing code - test_attr_compound_read(curr_fapl); // Test complex datatype H5A reading code + test_attr_compound_write(curr_fapl); // Test compound datatype H5A writing code + test_attr_compound_read(curr_fapl); // Test compound datatype H5A reading code test_attr_scalar_write(curr_fapl); // Test scalar dataspace H5A writing code test_attr_scalar_read(curr_fapl); // Test scalar dataspace H5A reading code diff --git a/c++/test/tcompound.cpp b/c++/test/tcompound.cpp index dada2c075a8..29d3120bc53 100644 --- a/c++/test/tcompound.cpp +++ b/c++/test/tcompound.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/tdspl.cpp b/c++/test/tdspl.cpp index 90b558fdbbf..fc261db1505 100644 --- a/c++/test/tdspl.cpp +++ b/c++/test/tdspl.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/testhdf5.cpp b/c++/test/testhdf5.cpp index 1df73baaf19..434183126ce 100644 --- a/c++/test/testhdf5.cpp +++ b/c++/test/testhdf5.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/tfile.cpp b/c++/test/tfile.cpp index bd7d96422e8..3f1f8115239 100644 --- a/c++/test/tfile.cpp +++ b/c++/test/tfile.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -759,7 +759,7 @@ test_libver_bounds() /* Run the tests */ test_libver_bounds_real(H5F_LIBVER_EARLIEST, H5O_VERSION_1, H5F_LIBVER_LATEST, H5O_VERSION_2); - test_libver_bounds_real(H5F_LIBVER_LATEST, H5O_VERSION_2, H5F_LIBVER_EARLIEST, H5O_VERSION_2); + test_libver_bounds_real(H5F_LIBVER_LATEST, H5O_VERSION_2, H5F_LIBVER_EARLIEST, H5O_VERSION_1); PASSED(); } /* end test_libver_bounds() */ @@ -842,7 +842,7 @@ test_file_info() SUBTEST("File general information"); hsize_t out_threshold = 0; // Free space section threshold to get - hbool_t out_persist = FALSE; // Persist free-space read + hbool_t out_persist = false; // Persist free-space read // File space handling strategy H5F_fspace_strategy_t out_strategy = H5F_FSPACE_STRATEGY_FSM_AGGR; @@ -869,7 +869,7 @@ test_file_info() // Verify file space information. verify_val(static_cast(out_strategy), static_cast(H5F_FSPACE_STRATEGY_FSM_AGGR), "H5File::getFileInfo", __LINE__, __FILE__); - verify_val(out_persist, FALSE, "H5File::getFileInfo", __LINE__, __FILE__); + verify_val(out_persist, false, "H5File::getFileInfo", __LINE__, __FILE__); verify_val(static_cast(out_threshold), 1, "H5File::getFileInfo", __LINE__, __FILE__); /* Retrieve file space page size */ @@ -884,7 +884,7 @@ test_file_info() fcpl.setIstorek(F2_ISTORE); hsize_t threshold = 5; // Free space section threshold to set - hbool_t persist = TRUE; // Persist free-space to set + hbool_t persist = true; // Persist free-space to set H5F_fspace_strategy_t strategy = H5F_FSPACE_STRATEGY_PAGE; fcpl.setFileSpaceStrategy(strategy, persist, threshold); diff --git a/c++/test/tfilter.cpp b/c++/test/tfilter.cpp index d66a7b5894c..9d426c1e2e0 100644 --- a/c++/test/tfilter.cpp +++ b/c++/test/tfilter.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/th5s.cpp b/c++/test/th5s.cpp index 34fb32d4cea..8b18ec011fe 100644 --- a/c++/test/th5s.cpp +++ b/c++/test/th5s.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/titerate.cpp b/c++/test/titerate.cpp index 2f989ae40f0..593ba507973 100644 --- a/c++/test/titerate.cpp +++ b/c++/test/titerate.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/tlinks.cpp b/c++/test/tlinks.cpp index a6d68631fc4..ec6f8eee210 100644 --- a/c++/test/tlinks.cpp +++ b/c++/test/tlinks.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -129,14 +129,14 @@ test_basic_links(hid_t fapl_id, hbool_t new_format) H5File file(filename, H5F_ACC_RDWR, FileCreatPropList::DEFAULT, fapl); // Verify link existence - if (file.nameExists("dset1", LinkAccPropList::DEFAULT) != TRUE) + if (file.nameExists("dset1", LinkAccPropList::DEFAULT) != true) throw InvalidActionException("H5File::nameExists", "dset1 doesn't exist"); - if (file.nameExists("grp1/soft", LinkAccPropList::DEFAULT) != TRUE) + if (file.nameExists("grp1/soft", LinkAccPropList::DEFAULT) != true) throw InvalidActionException("H5File::nameExists", "grp1/soft doesn't exist"); // Deprecated - if (file.exists("dset1", LinkAccPropList::DEFAULT) != TRUE) + if (file.exists("dset1", LinkAccPropList::DEFAULT) != true) throw InvalidActionException("H5File::exists", "dset1 doesn't exist"); - if (file.exists("grp1/soft", LinkAccPropList::DEFAULT) != TRUE) + if (file.exists("grp1/soft", LinkAccPropList::DEFAULT) != true) throw InvalidActionException("H5File::exists", "grp1/soft doesn't exist"); // Verify link values @@ -290,7 +290,7 @@ test_move(hid_t fapl_id, hbool_t new_format) // Move a soft link across files, should succeed grp_2.moveLink("soft", file_b, "soft_new_name"); - if (file_b.exists("soft_new_name") != TRUE) + if (file_b.exists("soft_new_name") != true) throw InvalidActionException("H5File::exists", "grp1/soft doesn't exist"); // Move a group across groups in the same file while renaming it @@ -429,7 +429,7 @@ test_copy(hid_t fapl_id, hbool_t new_format) // Copy a soft link across files, should succeed grp_2.copyLink("soft", file_b, "soft_new_name"); - if (file_b.exists("soft_new_name") != TRUE) + if (file_b.exists("soft_new_name") != true) throw InvalidActionException("H5File::exists", "soft_new_name doesn't exist"); // Move a group across groups in the same file while renaming it @@ -730,7 +730,7 @@ test_links(const void *params) throw Exception("test_links", "H5Pset_libver_bounds failed"); /* Loop over using new group format */ - for (new_format = FALSE; new_format <= TRUE; new_format++) { + for (new_format = false; new_format <= true; new_format++) { hid_t my_fapl_id; /* Check for FAPL to use */ diff --git a/c++/test/tobject.cpp b/c++/test/tobject.cpp index cec13323544..adf7c58abde 100644 --- a/c++/test/tobject.cpp +++ b/c++/test/tobject.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -169,54 +169,54 @@ test_existance() // Check if GROUP1 exists in the file bool exists = file.nameExists(GROUP1); - verify_val(exists, TRUE, "Group::nameExists GROUP1_1", __LINE__, __FILE__); + verify_val(exists, true, "Group::nameExists GROUP1_1", __LINE__, __FILE__); // Deprecated exists = file.exists(GROUP1); - verify_val(exists, TRUE, "Group::exists GROUP1_1", __LINE__, __FILE__); + verify_val(exists, true, "Group::exists GROUP1_1", __LINE__, __FILE__); // Open GROUP1 Group grp1 = file.openGroup(GROUP1); // Check if GROUP1_1 and GROUP1_2 exist in GROUP1 exists = grp1.nameExists(GROUP1_1); - verify_val(exists, TRUE, "Group::nameExists GROUP1_1", __LINE__, __FILE__); + verify_val(exists, true, "Group::nameExists GROUP1_1", __LINE__, __FILE__); exists = grp1.nameExists(GROUP1_2); - verify_val(exists, TRUE, "Group::nameExists GROUP1_2", __LINE__, __FILE__); + verify_val(exists, true, "Group::nameExists GROUP1_2", __LINE__, __FILE__); // Deprecated exists = grp1.exists(GROUP1_1); - verify_val(exists, TRUE, "Group::exists GROUP1_1", __LINE__, __FILE__); + verify_val(exists, true, "Group::exists GROUP1_1", __LINE__, __FILE__); exists = grp1.exists(GROUP1_2); - verify_val(exists, TRUE, "Group::exists GROUP1_2", __LINE__, __FILE__); + verify_val(exists, true, "Group::exists GROUP1_2", __LINE__, __FILE__); // Check if DSET_IN_GRP1 exists in GROUP1 exists = grp1.nameExists(DSET_IN_GRP1); - verify_val(exists, TRUE, "Group::nameExists DSET_IN_GRP1", __LINE__, __FILE__); + verify_val(exists, true, "Group::nameExists DSET_IN_GRP1", __LINE__, __FILE__); // Deprecated exists = grp1.exists(DSET_IN_GRP1); - verify_val(exists, TRUE, "Group::exists DSET_IN_GRP1", __LINE__, __FILE__); + verify_val(exists, true, "Group::exists DSET_IN_GRP1", __LINE__, __FILE__); // Open GROUP1_2 Group grp1_2 = grp1.openGroup(GROUP1_2); // Check if DSET_IN_GRP1_2 exists in GROUP1_2 exists = grp1_2.nameExists(DSET_IN_GRP1_2); - verify_val(exists, TRUE, "Group::nameExists DSET_IN_GRP1_2", __LINE__, __FILE__); + verify_val(exists, true, "Group::nameExists DSET_IN_GRP1_2", __LINE__, __FILE__); // Deprecated exists = grp1_2.exists(DSET_IN_GRP1_2); - verify_val(exists, TRUE, "Group::exists DSET_IN_GRP1_2", __LINE__, __FILE__); + verify_val(exists, true, "Group::exists DSET_IN_GRP1_2", __LINE__, __FILE__); // Check if a dataset exists given dataset as location with full path name DataSet dset1 = file.openDataSet(DSET_IN_FILE); exists = dset1.nameExists("/Top Group/Dataset_in_Group_1"); - verify_val(exists, TRUE, "Group::nameExists given dataset with full path name", __LINE__, __FILE__); + verify_val(exists, true, "Group::nameExists given dataset with full path name", __LINE__, __FILE__); exists = grp1_2.nameExists(DSET_IN_GRP1); - verify_val(exists, FALSE, "Group::nameExists DSET_IN_GRP1", __LINE__, __FILE__); + verify_val(exists, false, "Group::nameExists DSET_IN_GRP1", __LINE__, __FILE__); // Deprecated exists = dset1.exists("/Top Group/Dataset_in_Group_1"); - verify_val(exists, TRUE, "Group::exists given dataset with full path name", __LINE__, __FILE__); + verify_val(exists, true, "Group::exists given dataset with full path name", __LINE__, __FILE__); exists = grp1_2.exists(DSET_IN_GRP1); - verify_val(exists, FALSE, "Group::exists DSET_IN_GRP1", __LINE__, __FILE__); + verify_val(exists, false, "Group::exists DSET_IN_GRP1", __LINE__, __FILE__); // Everything will be closed as they go out of scope @@ -647,7 +647,7 @@ test_intermediate_groups() } // Failure is ignored // Create GROUP14NAME with the flag to create missing groups set - // to FALSE, should fail because group GROUP13NAME is missing + // to false, should fail because group GROUP13NAME is missing // Reset flag to not create missing groups lcpl.setCreateIntermediateGroup(false); @@ -662,7 +662,7 @@ test_intermediate_groups() catch (FileIException &expected2) { } // Failure is ignored - // Set the flag to create missing groups set to TRUE + // Set the flag to create missing groups set to true lcpl.setCreateIntermediateGroup(true); crt_int_grps = lcpl.getCreateIntermediateGroup(); verify_val(crt_int_grps, true, "LinkCreatPropList::getCreateIntermediateGroup", __LINE__, __FILE__); diff --git a/c++/test/trefer.cpp b/c++/test/trefer.cpp index 627330f4660..ecc6de6c972 100644 --- a/c++/test/trefer.cpp +++ b/c++/test/trefer.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/ttypes.cpp b/c++/test/ttypes.cpp index c504635b6ca..1959331c59e 100644 --- a/c++/test/ttypes.cpp +++ b/c++/test/ttypes.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/c++/test/tvlstr.cpp b/c++/test/tvlstr.cpp index ba39620334a..db616cd0571 100644 --- a/c++/test/tvlstr.cpp +++ b/c++/test/tvlstr.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/config/BlankForm b/config/BlankForm index e297cc385bc..d7669b7999a 100644 --- a/config/BlankForm +++ b/config/BlankForm @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/Makefile.am.blank b/config/Makefile.am.blank index 18afb605b1c..f94cacd9d35 100644 --- a/config/Makefile.am.blank +++ b/config/Makefile.am.blank @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/apple b/config/apple index 39ed454a11f..d3f69bccb55 100644 --- a/config/apple +++ b/config/apple @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cce-fflags b/config/cce-fflags index 813d4c75cea..b15f3e5dc79 100644 --- a/config/cce-fflags +++ b/config/cce-fflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cce-flags b/config/cce-flags index 0903dec920c..f07495008a6 100644 --- a/config/cce-flags +++ b/config/cce-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/clang-cxxflags b/config/clang-cxxflags index 2dcd0cbcf81..61a0c1f7e26 100644 --- a/config/clang-cxxflags +++ b/config/clang-cxxflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/clang-fflags b/config/clang-fflags index 786c729ca91..7820aa698c9 100644 --- a/config/clang-fflags +++ b/config/clang-fflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/clang-flags b/config/clang-flags index 844d6afa14e..1454629455f 100644 --- a/config/clang-flags +++ b/config/clang-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -116,14 +116,8 @@ if test "X-clang" = "X-$cc_vendor" -o "X-Apple LLVM" = "X-$cc_vendor"; then esac case "$host_os-$host_cpu" in - # cygwin needs the "-std=c99" flag removed, so make - # a specific case for Cygwin without the flag and a default - # case to add the flag everywhere else - cygwin-*) - ;; - *) - H5_CFLAGS="$H5_CFLAGS -std=c99" + H5_CFLAGS="$H5_CFLAGS -std=c11" ;; esac diff --git a/config/cmake-presets/hidden-presets.json b/config/cmake-presets/hidden-presets.json index 8051eb66be0..db2c56f9fbc 100644 --- a/config/cmake-presets/hidden-presets.json +++ b/config/cmake-presets/hidden-presets.json @@ -269,7 +269,7 @@ "hidden": true, "inherits": "ci-x64-Debug-MSVC", "cacheVariables": { - "USE_SANITIZER": "Address", + "HDF5_USE_SANITIZER": "Address", "HDF5_ENABLE_SANITIZERS": "ON" } }, @@ -278,7 +278,7 @@ "hidden": true, "inherits": "ci-x64-Debug-GNUC", "cacheVariables": { - "USE_SANITIZER": "Address", + "HDF5_USE_SANITIZER": "Address", "HDF5_ENABLE_SANITIZERS": "ON" } }, @@ -287,7 +287,7 @@ "hidden": true, "inherits": "ci-x64-Debug-GNUC", "cacheVariables": { - "USE_SANITIZER": "Thread", + "HDF5_USE_SANITIZER": "Thread", "HDF5_ENABLE_SANITIZERS": "ON" } }, @@ -296,7 +296,7 @@ "hidden": true, "inherits": "ci-x64-Debug-GNUC", "cacheVariables": { - "USE_SANITIZER": "Leak", + "HDF5_USE_SANITIZER": "Leak", "HDF5_ENABLE_SANITIZERS": "ON" } }, @@ -305,7 +305,7 @@ "hidden": true, "inherits": "ci-x64-Debug-GNUC", "cacheVariables": { - "USE_SANITIZER": "Undefined", + "HDF5_USE_SANITIZER": "Undefined", "HDF5_ENABLE_SANITIZERS": "ON" } } diff --git a/config/cmake/CTestCustom.cmake b/config/cmake/CTestCustom.cmake index b688421f328..f29416ac833 100644 --- a/config/cmake/CTestCustom.cmake +++ b/config/cmake/CTestCustom.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/ConfigureChecks.cmake b/config/cmake/ConfigureChecks.cmake index 6db82bb9229..63ef3bce811 100644 --- a/config/cmake/ConfigureChecks.cmake +++ b/config/cmake/ConfigureChecks.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -21,6 +21,7 @@ include (CheckTypeSize) include (CheckVariableExists) include (TestBigEndian) include (CheckStructHasMember) +include (CMakePushCheckState) set (HDF_PREFIX "H5") @@ -29,11 +30,6 @@ if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") set (${HDF_PREFIX}_HAVE_DARWIN 1) endif () -# Check for Solaris -if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - set (${HDF_PREFIX}_HAVE_SOLARIS 1) -endif () - #----------------------------------------------------------------------------- # This MACRO checks IF the symbol exists in the library and IF it # does, it appends library to the list. @@ -67,6 +63,8 @@ if (WIN32 AND NOT MINGW) set (${HDF_PREFIX}_HAVE_VISUAL_STUDIO 1) endif () endif () + message (TRACE "MSVC=${MSVC}") + message (TRACE "HAVE_VISUAL_STUDIO=${${HDF_PREFIX}_HAVE_VISUAL_STUDIO}") endif () if (WINDOWS) @@ -79,13 +77,12 @@ if (WINDOWS) endif () if (NOT UNIX AND NOT CYGWIN) set (${HDF_PREFIX}_HAVE_GETCONSOLESCREENBUFFERINFO 1) - if (MSVC_VERSION GREATER_EQUAL 1900) - set (${HDF_PREFIX}_HAVE_TIMEZONE 1) - endif () + set (${HDF_PREFIX}_HAVE_TIMEZONE 1) set (${HDF_PREFIX}_HAVE_GETTIMEOFDAY 1) set (${HDF_PREFIX}_HAVE_LIBWS2_32 1) set (${HDF_PREFIX}_HAVE_LIBWSOCK32 1) endif () + message (TRACE "HAVE_TIMEZONE=${${HDF_PREFIX}_HAVE_TIMEZONE}") endif () # ---------------------------------------------------------------------- @@ -144,13 +141,13 @@ else () set(C_INCLUDE_QUADMATH_H 0) endif () -if (CYGWIN) +if (MINGW OR CYGWIN) set (CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS} -D_GNU_SOURCE") add_definitions ("-D_GNU_SOURCE") endif () #----------------------------------------------------------------------------- -# Check for the math library "m" +# Library checks #----------------------------------------------------------------------------- if (MINGW OR NOT WINDOWS) CHECK_LIBRARY_EXISTS_CONCAT ("m" ceil ${HDF_PREFIX}_HAVE_LIBM) @@ -403,7 +400,12 @@ endif () #----------------------------------------------------------------------------- # Check for some functions that are used # -CHECK_FUNCTION_EXISTS (alarm ${HDF_PREFIX}_HAVE_ALARM) +if (NOT MINGW) + # alarm(2) support is spotty in MinGW, so assume it doesn't exist + # + # https://lists.gnu.org/archive/html/bug-gnulib/2013-03/msg00040.html + CHECK_FUNCTION_EXISTS (alarm ${HDF_PREFIX}_HAVE_ALARM) +endif () CHECK_FUNCTION_EXISTS (fcntl ${HDF_PREFIX}_HAVE_FCNTL) CHECK_FUNCTION_EXISTS (flock ${HDF_PREFIX}_HAVE_FLOCK) CHECK_FUNCTION_EXISTS (fork ${HDF_PREFIX}_HAVE_FORK) @@ -436,16 +438,14 @@ endif () #----------------------------------------------------------------------------- # Check a bunch of other functions #----------------------------------------------------------------------------- -if (MINGW OR NOT WINDOWS) - foreach (other_test - HAVE_ATTRIBUTE - HAVE_BUILTIN_EXPECT - PTHREAD_BARRIER - HAVE_SOCKLEN_T +foreach (other_test + HAVE_ATTRIBUTE + HAVE_BUILTIN_EXPECT + PTHREAD_BARRIER + HAVE_SOCKLEN_T ) - HDF_FUNCTION_TEST (${other_test}) - endforeach () -endif () + HDF_FUNCTION_TEST (${other_test}) +endforeach () # ---------------------------------------------------------------------- # Set the flag to indicate that the machine can handle converting @@ -829,6 +829,71 @@ macro (H5ConversionTests TEST def msg) endif () endmacro () +#----------------------------------------------------------------------------- +# Check for complex number support +#----------------------------------------------------------------------------- +message (STATUS "Checking if complex number support is available") +CHECK_INCLUDE_FILE (complex.h ${HDF_PREFIX}_HAVE_COMPLEX_H) +if (${HDF_PREFIX}_HAVE_COMPLEX_H) + set (H5_HAVE_C99_COMPLEX_NUMBERS 1) + + HDF_CHECK_TYPE_SIZE ("float _Complex" ${HDF_PREFIX}_SIZEOF_FLOAT_COMPLEX) + HDF_CHECK_TYPE_SIZE ("double _Complex" ${HDF_PREFIX}_SIZEOF_DOUBLE_COMPLEX) + HDF_CHECK_TYPE_SIZE ("long double _Complex" ${HDF_PREFIX}_SIZEOF_LONG_DOUBLE_COMPLEX) + + if (MSVC AND NOT ${HDF_PREFIX}_SIZEOF_FLOAT_COMPLEX AND NOT ${HDF_PREFIX}_SIZEOF_DOUBLE_COMPLEX + AND NOT ${HDF_PREFIX}_SIZEOF_LONG_DOUBLE_COMPLEX) + # If using MSVC, the _Complex types (if available) are _Fcomplex, _Dcomplex and _Lcomplex. + # The standard types are checked for first in case MSVC uses them in the future or in case + # the compiler used is simulating MSVC and uses the standard types. + cmake_push_check_state() + list (APPEND CMAKE_EXTRA_INCLUDE_FILES complex.h) + HDF_CHECK_TYPE_SIZE ("_Fcomplex" ${HDF_PREFIX}_SIZEOF__FCOMPLEX) + HDF_CHECK_TYPE_SIZE ("_Dcomplex" ${HDF_PREFIX}_SIZEOF__DCOMPLEX) + HDF_CHECK_TYPE_SIZE ("_Lcomplex" ${HDF_PREFIX}_SIZEOF__LCOMPLEX) + cmake_pop_check_state() + if (${HDF_PREFIX}_SIZEOF__FCOMPLEX AND ${HDF_PREFIX}_SIZEOF__DCOMPLEX AND + ${HDF_PREFIX}_SIZEOF__FCOMPLEX) + set (${HDF_PREFIX}_SIZEOF_FLOAT_COMPLEX ${${HDF_PREFIX}_SIZEOF__FCOMPLEX} + CACHE INTERNAL "SizeOf for float _Complex" FORCE) + set (${HDF_PREFIX}_SIZEOF_DOUBLE_COMPLEX ${${HDF_PREFIX}_SIZEOF__DCOMPLEX} + CACHE INTERNAL "SizeOf for double _Complex" FORCE) + set (${HDF_PREFIX}_SIZEOF_LONG_DOUBLE_COMPLEX ${${HDF_PREFIX}_SIZEOF__LCOMPLEX} + CACHE INTERNAL "SizeOf for long double _Complex" FORCE) + + unset (H5_HAVE_C99_COMPLEX_NUMBERS) + endif () + endif () + + if (${HDF_PREFIX}_SIZEOF_FLOAT_COMPLEX AND ${HDF_PREFIX}_SIZEOF_DOUBLE_COMPLEX AND + ${HDF_PREFIX}_SIZEOF_LONG_DOUBLE_COMPLEX) + # Check if __STDC_NO_COMPLEX__ macro is defined, in which case complex number + # support is not available + HDF_FUNCTION_TEST (HAVE_STDC_NO_COMPLEX) + + if (NOT H5_HAVE_STDC_NO_COMPLEX) + # Compile simple test program with complex numbers + HDF_FUNCTION_TEST (HAVE_COMPLEX_NUMBERS) + + if (H5_HAVE_COMPLEX_NUMBERS) + if (H5_HAVE_C99_COMPLEX_NUMBERS) + message (STATUS "Using C99 complex number types") + else () + message (STATUS "Using MSVC complex number types") + endif () + else () + message (STATUS "Complex number support has been disabled since a simple test program couldn't be compiled and linked") + endif () + else () + message (STATUS "Complex number support has been disabled since __STDC_NO_COMPLEX__ is defined") + endif () + else () + message (STATUS "Complex number support has been disabled since the C types were not found") + endif () +else () + message (STATUS "Complex number support has been disabled since the complex.h header was not found") +endif () + #----------------------------------------------------------------------------- # Check various conversion capabilities #----------------------------------------------------------------------------- diff --git a/config/cmake/ConversionTests.c b/config/cmake/ConversionTests.c index b5d2af2ff38..21cd645b997 100644 --- a/config/cmake/ConversionTests.c +++ b/config/cmake/ConversionTests.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/config/cmake/FindMFU.cmake b/config/cmake/FindMFU.cmake index 8bbc870f5f8..d1fd41ad2ed 100644 --- a/config/cmake/FindMFU.cmake +++ b/config/cmake/FindMFU.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/GetTimeOfDayTest.cpp b/config/cmake/GetTimeOfDayTest.cpp index b35efa5c39a..7a33d79ea1d 100644 --- a/config/cmake/GetTimeOfDayTest.cpp +++ b/config/cmake/GetTimeOfDayTest.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/config/cmake/H5pubconf.h.in b/config/cmake/H5pubconf.h.in index 9f0d0bc1505..9d495ceac1e 100644 --- a/config/cmake/H5pubconf.h.in +++ b/config/cmake/H5pubconf.h.in @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -104,9 +104,15 @@ /* Define if the __attribute__(()) extension is present */ #cmakedefine H5_HAVE_ATTRIBUTE @H5_HAVE_ATTRIBUTE@ +/* Define if C99 complex number types are present */ +#cmakedefine H5_HAVE_C99_COMPLEX_NUMBERS @H5_HAVE_C99_COMPLEX_NUMBERS@ + /* Define to 1 if you have the `clock_gettime' function. */ #cmakedefine H5_HAVE_CLOCK_GETTIME @H5_HAVE_CLOCK_GETTIME@ +/* Define if complex number support is available */ +#cmakedefine H5_HAVE_COMPLEX_NUMBERS @H5_HAVE_COMPLEX_NUMBERS@ + /* Define to 1 if you have the header file. */ #cmakedefine H5_HAVE_CURL_CURL_H @H5_HAVE_CURL_H@ @@ -366,6 +372,9 @@ /* Define to 1 if you have the header file. */ #cmakedefine H5_HAVE_ZLIB_H @H5_HAVE_ZLIB_H@ +/* Define to 1 if you have the header file. */ +#cmakedefine H5_HAVE_ZLIBNG_H @H5_HAVE_ZLIBNG_H@ + /* Define to 1 if you have the `_getvideoconfig' function. */ #cmakedefine H5_HAVE__GETVIDEOCONFIG @H5_HAVE__GETVIDEOCONFIG@ @@ -442,9 +451,15 @@ /* The size of `double', as computed by sizeof. */ #cmakedefine H5_SIZEOF_DOUBLE @H5_SIZEOF_DOUBLE@ +/* The size of `double _Complex', as computed by sizeof. */ +#cmakedefine H5_SIZEOF_DOUBLE_COMPLEX @H5_SIZEOF_DOUBLE_COMPLEX@ + /* The size of `float', as computed by sizeof. */ #cmakedefine H5_SIZEOF_FLOAT @H5_SIZEOF_FLOAT@ +/* The size of `float _Complex', as computed by sizeof. */ +#cmakedefine H5_SIZEOF_FLOAT_COMPLEX @H5_SIZEOF_FLOAT_COMPLEX@ + /* The size of `int', as computed by sizeof. */ #cmakedefine H5_SIZEOF_INT @H5_SIZEOF_INT@ @@ -498,6 +513,9 @@ /* The size of `long double', as computed by sizeof. */ #cmakedefine H5_SIZEOF_LONG_DOUBLE @H5_SIZEOF_LONG_DOUBLE@ +/* The size of `long double _Complex', as computed by sizeof. */ +#cmakedefine H5_SIZEOF_LONG_DOUBLE_COMPLEX @H5_SIZEOF_LONG_DOUBLE_COMPLEX@ + #else /* On Apple, to support Universal Binaries (where multiple CPU @@ -517,10 +535,13 @@ # if defined(__i386__) || defined(__x86_64__) #define H5_SIZEOF_LONG_DOUBLE 16 + #define H5_SIZEOF_LONG_DOUBLE_COMPLEX 32 # elif defined(__aarch64__) #define H5_SIZEOF_LONG_DOUBLE 8 + #define H5_SIZEOF_LONG_DOUBLE_COMPLEX 16 # else #cmakedefine H5_SIZEOF_LONG_DOUBLE @H5_SIZEOF_LONG_DOUBLE@ + #cmakedefine H5_SIZEOF_LONG_DOUBLE_COMPLEX @H5_SIZEOF_LONG_DOUBLE_COMPLEX@ # endif #endif @@ -604,11 +625,8 @@ /* Define using v1.14 public API symbols by default */ #cmakedefine H5_USE_114_API_DEFAULT @H5_USE_114_API_DEFAULT@ -/* Define using v1.16 public API symbols by default */ -#cmakedefine H5_USE_116_API_DEFAULT @H5_USE_116_API_DEFAULT@ - -/* Define using v1.18 public API symbols by default */ -#cmakedefine H5_USE_118_API_DEFAULT @H5_USE_118_API_DEFAULT@ +/* Define using v2.0 public API symbols by default */ +#cmakedefine H5_USE_200_API_DEFAULT @H5_USE_200_API_DEFAULT@ /* Define if the library will use file locking */ #cmakedefine H5_USE_FILE_LOCKING @H5_USE_FILE_LOCKING@ diff --git a/config/cmake/HDF5DeveloperBuild.cmake b/config/cmake/HDF5DeveloperBuild.cmake index 07c9acab301..0bd5b527eb0 100644 --- a/config/cmake/HDF5DeveloperBuild.cmake +++ b/config/cmake/HDF5DeveloperBuild.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/HDF5ExampleCache.cmake b/config/cmake/HDF5ExampleCache.cmake index 219d1c59902..1ec8d408546 100644 --- a/config/cmake/HDF5ExampleCache.cmake +++ b/config/cmake/HDF5ExampleCache.cmake @@ -10,8 +10,8 @@ set (H5EX_BUILD_EXAMPLES ${HDF5_BUILD_EXAMPLES} CACHE BOOL "Build Examples" FORC set (H5EX_BUILD_FORTRAN ${HDF5_BUILD_FORTRAN} CACHE BOOL "Build examples FORTRAN support" FORCE) set (H5EX_BUILD_JAVA ${HDF5_BUILD_JAVA} CACHE BOOL "Build examples JAVA support" FORCE) set (H5EX_BUILD_FILTERS ${HDF5_ENABLE_PLUGIN_SUPPORT} CACHE BOOL "Build examples PLUGIN filter support" FORCE) -set (H5EX_BUILD_CPP_LIB ${HDF5_BUILD_CPP_LIB} CACHE BOOL "Build HDF5 C++ Library" FORCE) -set (H5EX_BUILD_HL_LIB ${HDF5_BUILD_HL_LIB} CACHE BOOL "Build HIGH Level examples" FORCE) +set (H5EX_BUILD_CXX ${HDF5_BUILD_CPP_LIB} CACHE BOOL "Build HDF5 C++ Library" FORCE) +set (H5EX_BUILD_HL ${HDF5_BUILD_HL_LIB} CACHE BOOL "Build High Level examples" FORCE) set (H5EX_ENABLE_THREADSAFE ${HDF5_ENABLE_THREADSAFE} CACHE BOOL "Enable examples thread-safety" FORCE) set (H5EX_ENABLE_PARALLEL ${HDF5_ENABLE_PARALLEL} CACHE BOOL "Enable examples parallel build (requires MPI)" FORCE) set (H5EX_USE_GNU_DIRS ${HDF5_USE_GNU_DIRS} CACHE BOOL "ON to use GNU Coding Standard install directory variables, OFF to use historical settings" FORCE) @@ -26,42 +26,65 @@ set (EXAMPLES_EXTERNALLY_CONFIGURED ON CACHE BOOL "Examples build is used in ano set (EXAMPLE_VARNAME "H5") set (H5EX_RESOURCES_DIR ${HDF_RESOURCES_DIR}) message (STATUS "HDF5 Example H5EX_RESOURCES_DIR: ${H5EX_RESOURCES_DIR}") -if (DEFAULT_API_VERSION MATCHES "v16") +if (HDF5_DEFAULT_API_VERSION MATCHES "v16") set (H5_USE_16_API ON) -elseif (DEFAULT_API_VERSION MATCHES "v18") +elseif (HDF5_DEFAULT_API_VERSION MATCHES "v18") set (H5_USE_18_API ON) -elseif (DEFAULT_API_VERSION MATCHES "v110") +elseif (HDF5_DEFAULT_API_VERSION MATCHES "v110") set (H5_USE_110_API ON) -elseif (DEFAULT_API_VERSION MATCHES "v112") +elseif (HDF5_DEFAULT_API_VERSION MATCHES "v112") set (H5_USE_112_API ON) -elseif (DEFAULT_API_VERSION MATCHES "v114") +elseif (HDF5_DEFAULT_API_VERSION MATCHES "v114") set (H5_USE_114_API ON) -elseif (DEFAULT_API_VERSION MATCHES "v116") - set (H5_USE_116_API ON) -elseif (DEFAULT_API_VERSION MATCHES "v118") - set (H5_USE_118_API ON) +elseif (HDF5_DEFAULT_API_VERSION MATCHES "v200") + set (H5_USE_200_API ON) endif () -message (STATUS "HDF5 H5_LIBVER_DIR: ${H5_LIBVER_DIR} HDF5_API_VERSION: ${DEFAULT_API_VERSION}") +message (STATUS "HDF5 H5_LIBVER_DIR: ${H5_LIBVER_DIR} HDF5_API_VERSION: ${HDF5_DEFAULT_API_VERSION}") if (NOT BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) set (USE_SHARED_LIBS OFF CACHE BOOL "Use Shared Libraries for Examples" FORCE) set (H5EX_HDF5_LINK_LIBS ${HDF5_LIB_TARGET} CACHE STRING "HDF5 target" FORCE) + if (HDF5_BUILD_HL_LIB) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_LIB_TARGET}) + set (H5EX_HDF5_INCLUDE_DIRS "${H5EX_HDF5_INCLUDE_DIRS};${HDF5_HL_SRC_DIR};${HDF5_HL_SRC_BINARY_DIR}" CACHE PATH "HDF5 include dirs" FORCE) + endif () if (HDF5_BUILD_FORTRAN) set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_F90_LIB_TARGET}) set (H5EX_MOD_EXT "/static" CACHE STRING "Use Static Modules for Examples" FORCE) + if (HDF5_BUILD_HL_LIB) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_F90_LIB_TARGET}) + endif () endif () if (HDF5_BUILD_CPP_LIB) set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_CPP_LIB_TARGET}) + if (HDF5_BUILD_HL_LIB) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_CPP_LIB_TARGET}) + set (H5EX_HDF5_INCLUDE_DIRS "${H5EX_HDF5_INCLUDE_DIRS};${HDF5_HL_CPP_SRC_DIR};${HDF5_HL_CPP_SRC_BINARY_DIR}" CACHE PATH "HDF5 include dirs" FORCE) + endif () endif () else () set (USE_SHARED_LIBS ON CACHE BOOL "Use Shared Libraries for Examples" FORCE) set (H5EX_HDF5_LINK_LIBS ${HDF5_LIBSH_TARGET} CACHE STRING "HDF5 target" FORCE) + if (HDF5_BUILD_HL_LIB) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_LIBSH_TARGET}) + set (H5EX_HDF5_INCLUDE_DIRS "${H5EX_HDF5_INCLUDE_DIRS};${HDF5_HL_SRC_DIR};${HDF5_HL_SRC_BINARY_DIR}" CACHE PATH "HDF5 include dirs" FORCE) + endif () + if (HDF5_BUILD_CPP_LIB) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_CPP_LIBSH_TARGET}) + endif () if (HDF5_BUILD_FORTRAN) set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_F90_LIBSH_TARGET}) set (H5EX_MOD_EXT "/shared" CACHE STRING "Use Shared Modules for Examples" FORCE) + if (HDF5_BUILD_HL_LIB) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_F90_LIBSH_TARGET}) + endif () endif () if (HDF5_BUILD_CPP_LIB) set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_CPP_LIBSH_TARGET}) + if (HDF5_BUILD_HL_LIB) + set (H5EX_HDF5_LINK_LIBS ${H5EX_HDF5_LINK_LIBS} ${HDF5_HL_CPP_LIBSH_TARGET}) + set (H5EX_HDF5_INCLUDE_DIRS "${H5EX_HDF5_INCLUDE_DIRS};${HDF5_HL_CPP_SRC_DIR};${HDF5_HL_CPP_SRC_BINARY_DIR}" CACHE PATH "HDF5 include dirs" FORCE) + endif () endif () if (HDF5_BUILD_JAVA) set (HDF5_JAVA_INCLUDE_DIRS ${HDF5_JAVA_JARS} ${HDF5_JAVA_LOGGING_JAR}) diff --git a/config/cmake/HDF5Macros.cmake b/config/cmake/HDF5Macros.cmake index e17d6bc46b2..e1bb13315f5 100644 --- a/config/cmake/HDF5Macros.cmake +++ b/config/cmake/HDF5Macros.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/HDF5PluginMacros.cmake b/config/cmake/HDF5PluginMacros.cmake index b361917bcf2..3cb03ea2699 100644 --- a/config/cmake/HDF5PluginMacros.cmake +++ b/config/cmake/HDF5PluginMacros.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/HDF5UseFortran.cmake b/config/cmake/HDF5UseFortran.cmake index ce33c7036e3..9a5d8c76709 100644 --- a/config/cmake/HDF5UseFortran.cmake +++ b/config/cmake/HDF5UseFortran.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/HDFCXXCompilerFlags.cmake b/config/cmake/HDFCXXCompilerFlags.cmake deleted file mode 100644 index 5f977f534f6..00000000000 --- a/config/cmake/HDFCXXCompilerFlags.cmake +++ /dev/null @@ -1,362 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -# -ENABLE_LANGUAGE (CXX) - -set (CMAKE_CXX_STANDARD 11) -set (CMAKE_CXX_STANDARD_REQUIRED TRUE) - -set (CMAKE_CXX_EXTENSIONS OFF) - -set (CMAKE_CXX_FLAGS "${CMAKE_CXX_SANITIZER_FLAGS} ${CMAKE_CXX_FLAGS}") -message (VERBOSE "Warnings Configuration: CXX default: ${CMAKE_CXX_FLAGS}") -#----------------------------------------------------------------------------- -# Compiler specific flags : Shouldn't there be compiler tests for these -#----------------------------------------------------------------------------- -if (WIN32 AND (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" OR CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM")) - set (_INTEL_WINDOWS 1) -endif () - -if (WIN32 AND CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang" AND "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") - set (_CLANG_MSVC_WINDOWS 1) -endif() - -# MSVC 14.28 enables C5105, but the Windows SDK 10.0.18362.0 triggers it. -if ((_CLANG_MSVC_WINDOWS OR CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") AND CMAKE_CXX_COMPILER_LOADED) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") - if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.28) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd5105") - endif () -endif () - -if (CMAKE_CXX_COMPILER_ID STREQUAL SunPro AND CMAKE_CXX_COMPILER_LOADED) - if (NOT DEFINED CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION) - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13) - if (NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD EQUAL 98) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03") - endif () - else () - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=stlport4") - endif () - endif () -endif () - -if (CMAKE_CXX_COMPILER_ID STREQUAL "NVHPC" AND CMAKE_CXX_COMPILER_LOADED) - if (NOT DEFINED CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION) - if (NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD EQUAL 11) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C11_STANDARD_COMPILE_OPTION}") - endif () - endif () - if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Minform=warn") - if (NOT ${HDF_CFG_NAME} MATCHES "RelWithDebInfo") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s") - endif () - else () - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Mbounds -gopt -g") - endif () -endif () - -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_LOADED) - set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS}") - if (${HDF_CFG_NAME} MATCHES "Debug" OR ${HDF_CFG_NAME} MATCHES "Developer") - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og -ftrapv -fno-common") - endif () - else () - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstdarg-opt") - endif () - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) - if (HDF5_ENABLE_BUILD_DIAGS) - message (STATUS "... default color and URL extended diagnostic messages enabled") - else () - message (STATUS "... disable color and URL extended diagnostic messages") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-urls=never -fno-diagnostics-color") - endif () - endif () - endif () -endif () - -#----------------------------------------------------------------------------- -# Option to allow the user to disable compiler warnings -#----------------------------------------------------------------------------- -if (HDF5_DISABLE_COMPILER_WARNINGS) - message (STATUS "....Compiler warnings are suppressed") - # MSVC uses /w to suppress warnings. It also complains if another - # warning level is given, so remove it. - if (MSVC) - set (HDF5_WARNINGS_BLOCKED 1) - if (CMAKE_CXX_COMPILER_LOADED) - string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0") - endif () - endif () - if (WIN32) - add_definitions (-D_CRT_SECURE_NO_WARNINGS) - endif () - - # Most compilers use -w to suppress warnings. - if (NOT HDF5_WARNINGS_BLOCKED) - if (CMAKE_CXX_COMPILER_LOADED) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") - endif () - endif () -endif () - -#----------------------------------------------------------------------------- -# HDF5 library compile options - to be made available to all targets -#----------------------------------------------------------------------------- - -if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") - list (APPEND HDF5_CMAKE_CXX_FLAGS "-erroff=%none -DBSD_COMP") -else () - # General flags - # - # Note that some of the flags listed here really should be developer - # flags (listed in a separate variable, below) but we put them here - # because they are not raised by the current code and we'd like to - # know if they do start showing up. - # - # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) - # warnings that are emitted. If you need it, add it at configure time. - if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-general") - else () - ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/general") - endif() - if (NOT _INTEL_WINDOWS) - if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0) - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/15") - endif() - if(NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0) - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/18") - endif() - endif() - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_LOADED - AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) - # add the general CXX flags for g++ compiler versions 4.8 and above. - ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-general") - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-error-general") - endif () - elseif (CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-general") - else () - ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/general") - endif() - elseif (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") - ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/general") - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "PGI") - list (APPEND HDF5_CMAKE_CXX_FLAGS "-Minform=inform") - endif () - message (VERBOSE "CMAKE_CXX_FLAGS_GENERAL=${HDF5_CMAKE_CXX_FLAGS}") -endif () - -#----------------------------------------------------------------------------- -# Option to allow the user to enable developer warnings -# Developer warnings (suggestions from gcc, not code problems) -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_DEV_WARNINGS) - message (STATUS "....HDF5 developer group warnings are enabled") - if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-developer-general") - else () - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/developer-general") - endif() - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-general") - elseif (CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-developer-general") - else () - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/developer-general") - endif() - elseif (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/developer-general") - endif () -else () - if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-general") - elseif (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/no-developer-general") - endif () -endif () - -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - # Technically, variable-length arrays are part of the C99 standard, but - # we should approach them a bit cautiously... Only needed for gcc 4.X - if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0 AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.8-4.last") - endif () - - # Append more extra warning flags that only gcc 4.8+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-4.8") - if (HDF5_ENABLE_DEV_WARNINGS) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-developer-4.8") - else () - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-cxx-developer-4.8") - endif () - endif () - - # Append more extra warning flags that only gcc 4.9+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-4.9") - endif () - - # Append more extra warning flags that only gcc 5.1+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) - # autotools always add the C flags with the CXX flags - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-5") - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-error-5") - endif () - - # Append more extra warning flags that only gcc 6.x+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/6") - endif () - - # Append more extra warning flags that only gcc 7.x+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXxFLAGS2 "${HDF5_SOURCE_DIR}/config/gnu-warnings/7") - if (HDF5_ENABLE_DEV_WARNINGS) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-7") - #else () - # ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-7") - endif () - endif () - - # Append more extra warning flags that only gcc 8.x+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/8") - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-8") - if (HDF5_ENABLE_DEV_WARNINGS) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-8") - else () - # autotools always add the C flags with the CXX flags - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-8") - endif () - endif () - - # Append more extra warning flags that only gcc 9.x+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-9") - endif () - - # Append more extra warning flags that only gcc 9.3+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.3) - # do not use C warnings, gnu-warnings 9.3, no cxx warnings - # ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/9.3") - endif () - - # Append more extra warning flags that only gcc 10.x+ knows about - if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) - if (HDF5_ENABLE_DEV_WARNINGS) - # Use the C warnings as CXX warnings are the same - ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-10") - #else () - # ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-10") - endif () - endif () -endif () - -#----------------------------------------------------------------------------- -# Option to allow the user to enable all warnings -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_ALL_WARNINGS) - message (STATUS "....All Warnings are enabled") - if (MSVC) - if (HDF5_ENABLE_DEV_WARNINGS) - if (CMAKE_CXX_COMPILER_LOADED) - string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - list (APPEND HDF5_CMAKE_CXX_FLAGS "/Wall" "/wd4668") - endif () - else () - if (CMAKE_CXX_COMPILER_LOADED) - string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") - list (APPEND HDF5_CMAKE_CXX_FLAGS "/W3" "/wd4100" "/wd4706" "/wd4127") - endif () - endif () - else () - if (CMAKE_CXX_COMPILER_LOADED) - list (APPEND HDF5_CMAKE_CXX_FLAGS ${H5_CXXFLAGS}) - endif () - endif () -endif () - -#----------------------------------------------------------------------------- -# This is in here to help some of the GCC based IDES like Eclipse -# and code blocks parse the compiler errors and warnings better. -#----------------------------------------------------------------------------- -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU" AND CMAKE_CXX_COMPILER_LOADED) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0") -endif () - -#----------------------------------------------------------------------------- -# Option for --enable-symbols -# This option will force/override the default setting for all configurations -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_SYMBOLS MATCHES "YES") - if (CMAKE_CXX_COMPILER_LOADED) - if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT _INTEL_WINDOWS) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") - elseif (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" AND NOT _INTEL_WINDOWS) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") - endif () - endif () -elseif (HDF5_ENABLE_SYMBOLS MATCHES "NO") - if (CMAKE_CXX_COMPILER_LOADED) - if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel" AND NOT _INTEL_WINDOWS) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-s") - elseif (CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM" AND NOT _INTEL_WINDOWS) - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-s") - elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s") - endif () - endif () -endif () - -#----------------------------------------------------------------------------- -# Option for --enable-profiling -# This option will force/override the default setting for all configurations -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_PROFILING) - if (CMAKE_CXX_COMPILER_LOADED) - list (APPEND HDF5_CMAKE_CXX_FLAGS "${PROFILE_CXXFLAGS}") - endif () -endif () - -#----------------------------------------------------------------------------- -# Option for --enable-optimization -# This option will force/override the default setting for all configurations -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_OPTIMIZATION) - if (CMAKE_CXX_COMPILER_LOADED) - list (APPEND HDF5_CMAKE_CXX_FLAGS "${OPTIMIZE_CXXFLAGS}") - endif () -endif () diff --git a/config/cmake/HDFClangCXXFlags.cmake b/config/cmake/HDFClangCXXFlags.cmake new file mode 100644 index 00000000000..90b2f07a33f --- /dev/null +++ b/config/cmake/HDFClangCXXFlags.cmake @@ -0,0 +1,52 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +if (WIN32 AND "x${CMAKE_CXX_SIMULATE_ID}" STREQUAL "xMSVC") + set (_CLANG_MSVC_WINDOWS 1) +endif() + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- + +if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # General flags + # + # Note that some of the flags listed here really should be developer + # flags (listed in a separate variable, below) but we put them here + # because they are not raised by the current code and we'd like to + # know if they do start showing up. + # + # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) + # warnings that are emitted. If you need it, add it at configure time. + ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/general") + message (VERBOSE "CMAKE_CXX_FLAGS_GENERAL=${HDF5_CMAKE_CXX_FLAGS}") +endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to enable developer warnings +# Developer warnings (suggestions from gcc, not code problems) +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_DEV_WARNINGS) + message (STATUS "....HDF5 CXX developer group warnings are enabled") + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/developer-general") +else () + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/no-developer-general") +endif () diff --git a/config/cmake/HDFClangFlags.cmake b/config/cmake/HDFClangFlags.cmake new file mode 100644 index 00000000000..8b931d965fa --- /dev/null +++ b/config/cmake/HDFClangFlags.cmake @@ -0,0 +1,73 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +if (WIN32 AND "x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC") + set (_CLANG_MSVC_WINDOWS 1) + if("x${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker -stack:20000000") + endif() +endif () + +# Disable deprecation warnings for standard C functions. +# really only needed for newer versions of VS, but should +# not hurt other versions, and this will work into the +# future +if (MSVC OR _CLANG_MSVC_WINDOWS) + add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) +endif () + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- + +if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # General flags + # + # Note that some of the flags listed here really should be developer + # flags (listed in a separate variable, below) but we put them here + # because they are not raised by the current code and we'd like to + # know if they do start showing up. + # + # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) + # warnings that are emitted. If you need it, add it at configure time. + ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/general") + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/error-general") + message (VERBOSE "CMAKE_C_FLAGS_GENERAL=${HDF5_CMAKE_C_FLAGS}") +endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to enable developer warnings +# Developer warnings (suggestions from gcc, not code problems) +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_DEV_WARNINGS) + message (STATUS "....HDF5 developer group warnings are enabled") + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/developer-general") + + # Turn on -Winline warnings now only for non-Debug and + # non-Developer builds. For at least GNU compilers this + # flag appears to conflict specifically with the -Og + # optimization flag and will produce warnings about functions + # not being considered for inlining + if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") + list (APPEND H5_CFLAGS "-Winline") + endif () +else () + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/no-developer-general") +endif () diff --git a/config/cmake/HDFCompilerCXXFlags.cmake b/config/cmake/HDFCompilerCXXFlags.cmake new file mode 100644 index 00000000000..1a8ffed0ee7 --- /dev/null +++ b/config/cmake/HDFCompilerCXXFlags.cmake @@ -0,0 +1,162 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# +ENABLE_LANGUAGE (CXX) + +set (CMAKE_CXX_STANDARD 11) +set (CMAKE_CXX_STANDARD_REQUIRED TRUE) + +set (CMAKE_CXX_EXTENSIONS OFF) + +set (CMAKE_CXX_FLAGS "${CMAKE_CXX_SANITIZER_FLAGS} ${CMAKE_CXX_FLAGS}") +message (VERBOSE "Warnings Configuration: CXX default: ${CMAKE_CXX_FLAGS}") +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +# MSVC 14.28 enables C5105, but the Windows SDK 10.0.18362.0 triggers it. +if ((_CLANG_MSVC_WINDOWS OR CMAKE_CXX_COMPILER_ID STREQUAL "MSVC") AND CMAKE_CXX_COMPILER_LOADED) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") + if (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC" AND NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.28) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd5105") + endif () +endif () + +if (CMAKE_CXX_COMPILER_ID STREQUAL SunPro AND CMAKE_CXX_COMPILER_LOADED) + if (NOT DEFINED CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION) + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.13) + if (NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD EQUAL 98) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++03") + endif () + else () + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -library=stlport4") + endif () + endif () +endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to disable compiler warnings +#----------------------------------------------------------------------------- +if (CMAKE_CXX_COMPILER_LOADED) + if (HDF5_DISABLE_COMPILER_WARNINGS) + message (STATUS "....Compiler warnings are suppressed") + # MSVC uses /w to suppress warnings. It also complains if another + # warning level is given, so remove it. + if (MSVC) + set (HDF5_WARNINGS_BLOCKED 1) + string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W0") + endif () + if (WIN32) + add_definitions (-D_CRT_SECURE_NO_WARNINGS) + endif () + + # Most compilers use -w to suppress warnings. + if (NOT HDF5_WARNINGS_BLOCKED) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -w") + endif () + endif () + + if (CMAKE_CXX_COMPILER_ID MATCHES "NVHPC" ) + include (${HDF_RESOURCES_DIR}/HDFNvhpcCXXFlags.cmake) + endif () + + if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") + include (${HDF_RESOURCES_DIR}/HDFGnuCXXFlags.cmake) + endif () + + if (CMAKE_CXX_COMPILER_ID MATCHES "Intel") + include (${HDF_RESOURCES_DIR}/HDFIntelCXXFlags.cmake) + endif () + + if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") + include (${HDF_RESOURCES_DIR}/HDFMsvcCXXFlags.cmake) + endif () + + #because this will match other compilers with clang in the name this should be checked last + if (CMAKE_CXX_COMPILER_ID MATCHES "[Cc]lang") + include (${HDF_RESOURCES_DIR}/HDFClangCXXFlags.cmake) + endif () + + #----------------------------------------------------------------------------- + # HDF5 library compile options - to be made available to all targets + #----------------------------------------------------------------------------- + + if (${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + list (APPEND HDF5_CMAKE_CXX_FLAGS "-erroff=%none -DBSD_COMP") + else () + # General flags + # + # Note that some of the flags listed here really should be developer + # flags (listed in a separate variable, below) but we put them here + # because they are not raised by the current code and we'd like to + # know if they do start showing up. + # + # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) + # warnings that are emitted. If you need it, add it at configure time. + if (CMAKE_CXX_COMPILER_ID STREQUAL "PGI") + list (APPEND HDF5_CMAKE_CXX_FLAGS "-Minform=inform") + endif () + message (VERBOSE "CMAKE_CXX_FLAGS_GENERAL=${HDF5_CMAKE_CXX_FLAGS}") + endif () + + #----------------------------------------------------------------------------- + # Option to allow the user to enable all warnings + #----------------------------------------------------------------------------- + if (HDF5_ENABLE_ALL_WARNINGS) + message (STATUS "....All Warnings are enabled") + if (MSVC) + if (HDF5_ENABLE_DEV_WARNINGS) + string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + list (APPEND HDF5_CMAKE_CXX_FLAGS "/Wall" "/wd4668") + else () + string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + list (APPEND HDF5_CMAKE_CXX_FLAGS "/W3" "/wd4100" "/wd4706" "/wd4127") + endif () + else () + list (APPEND HDF5_CMAKE_CXX_FLAGS ${H5_CXXFLAGS}) + endif () + endif () + + #----------------------------------------------------------------------------- + # Option for --enable-profiling + # This option will force/override the default setting for all configurations + #----------------------------------------------------------------------------- + if (HDF5_ENABLE_PROFILING) + list (APPEND HDF5_CMAKE_CXX_FLAGS "${PROFILE_CXXFLAGS}") + endif () + + #----------------------------------------------------------------------------- + # Option for --enable-optimization + # This option will force/override the default setting for all configurations + #----------------------------------------------------------------------------- + if (HDF5_ENABLE_OPTIMIZATION) + list (APPEND HDF5_CMAKE_CXX_FLAGS "${OPTIMIZE_CXXFLAGS}") + endif () +endif () + +#----------------------------------------------------------------------------- +# The build mode flags are not added to CMAKE_CXX_FLAGS, so create a separate +# variable for them so they can be written out to libhdf5.settings and +# H5build_settings.c +#----------------------------------------------------------------------------- +if ("${HDF_CFG_NAME}" STREQUAL "Debug") + set (HDF5_BUILD_MODE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEBUG}") +elseif ("${HDF_CFG_NAME}" STREQUAL "Developer") + set (HDF5_BUILD_MODE_CXX_FLAGS "${CMAKE_CXX_FLAGS_DEVELOPER}") +elseif ("${HDF_CFG_NAME}" STREQUAL "Release") + set (HDF5_BUILD_MODE_CXX_FLAGS "${CMAKE_CXX_FLAGS_RELEASE}") +elseif ("${HDF_CFG_NAME}" STREQUAL "MinSizeRel") + set (HDF5_BUILD_MODE_CXX_FLAGS "${CMAKE_CXX_FLAGS_MINSIZEREL}") +elseif ("${HDF_CFG_NAME}" STREQUAL "RelWithDebInfo") + set (HDF5_BUILD_MODE_CXX_FLAGS "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") +else () + set (HDF5_BUILD_MODE_CXX_FLAGS "") +endif () diff --git a/config/cmake/HDFCompilerFlags.cmake b/config/cmake/HDFCompilerFlags.cmake index e3364826ba6..d00fd8209de 100644 --- a/config/cmake/HDFCompilerFlags.cmake +++ b/config/cmake/HDFCompilerFlags.cmake @@ -4,89 +4,29 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. # -set (CMAKE_C_STANDARD 99) +set (CMAKE_C_STANDARD 11) set (CMAKE_C_STANDARD_REQUIRED TRUE) -set (CMAKE_C_FLAGS "${CMAKE_C99_STANDARD_COMPILE_OPTION} ${CMAKE_C_FLAGS}") +set (CMAKE_C_FLAGS "${CMAKE_C11_STANDARD_COMPILE_OPTION} ${CMAKE_C_FLAGS}") set (CMAKE_C_FLAGS "${CMAKE_C_SANITIZER_FLAGS} ${CMAKE_C_FLAGS}") message (VERBOSE "Warnings Configuration: C default: ${CMAKE_C_FLAGS}") #----------------------------------------------------------------------------- -# Compiler specific flags : Shouldn't there be compiler tests for these +# Compiler specific flags #----------------------------------------------------------------------------- -if (WIN32 AND (CMAKE_C_COMPILER_ID STREQUAL "Intel" OR CMAKE_C_COMPILER_ID MATCHES "IntelLLVM")) - set (_INTEL_WINDOWS 1) -endif () - -if (WIN32 AND CMAKE_C_COMPILER_ID MATCHES "[Cc]lang" AND "x${CMAKE_C_SIMULATE_ID}" STREQUAL "xMSVC") - set (_CLANG_MSVC_WINDOWS 1) -endif () - # Disable deprecation warnings for standard C functions. # really only needed for newer versions of VS, but should # not hurt other versions, and this will work into the # future -if (MSVC OR _INTEL_WINDOWS OR _CLANG_MSVC_WINDOWS) - add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) -endif () - if (MSVC) + add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stack:10000000") endif () -# MSVC 14.28 enables C5105, but the Windows SDK 10.0.18362.0 triggers it. -if (CMAKE_C_COMPILER_ID STREQUAL "MSVC" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 19.28) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -wd5105") -endif () - -if(_CLANG_MSVC_WINDOWS AND "x${CMAKE_C_COMPILER_FRONTEND_VARIANT}" STREQUAL "xGNU") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Xlinker -stack:20000000") -endif() - -if (CMAKE_C_COMPILER_ID STREQUAL "NVHPC" ) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Minform=warn") - if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") - if (NOT ${HDF_CFG_NAME} MATCHES "RelWithDebInfo") - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s") - endif () - else () - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Mbounds -gopt") - endif () -endif () - -if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - set (CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}") - if (${HDF_CFG_NAME} MATCHES "Debug" OR ${HDF_CFG_NAME} MATCHES "Developer") - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Og -ftrapv -fno-common") - endif () - else () - if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0 AND - NOT CMAKE_C_CLANG_TIDY) - # `clang-tidy` does not understand -fstdarg-opt - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstdarg-opt") - endif () - if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 10.0) - #----------------------------------------------------------------------------- - # Option to allow the user to enable build extended diagnostics - # - # This should NOT be on by default as it can cause process issues. - #----------------------------------------------------------------------------- - option (HDF5_ENABLE_BUILD_DIAGS "Enable color and URL extended diagnostic messages" OFF) - mark_as_advanced (HDF5_ENABLE_BUILD_DIAGS) - if (HDF5_ENABLE_BUILD_DIAGS) - message (STATUS "... default color and URL extended diagnostic messages enabled") - else () - message (STATUS "... disable color and URL extended diagnostic messages") - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-urls=never -fno-diagnostics-color") - endif () - endif () - endif () -endif () #----------------------------------------------------------------------------- # Option to allow the user to disable compiler warnings @@ -116,6 +56,27 @@ if (HDF5_DISABLE_COMPILER_WARNINGS) endif () endif () +if (CMAKE_C_COMPILER_ID MATCHES "NVHPC" ) + include (${HDF_RESOURCES_DIR}/HDFNvhpcFlags.cmake) +endif () + +if (CMAKE_C_COMPILER_ID MATCHES "GNU") + include (${HDF_RESOURCES_DIR}/HDFGnuFlags.cmake) +endif () + +if (CMAKE_C_COMPILER_ID MATCHES "Intel") + include (${HDF_RESOURCES_DIR}/HDFIntelFlags.cmake) +endif () + +if (CMAKE_C_COMPILER_ID MATCHES "MSVC") + include (${HDF_RESOURCES_DIR}/HDFMsvcFlags.cmake) +endif () + +#because this will match other compilers with clang in the name this should be checked last +if (CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") + include (${HDF_RESOURCES_DIR}/HDFClangFlags.cmake) +endif () + #----------------------------------------------------------------------------- # HDF5 library compile options - to be made available to all targets #----------------------------------------------------------------------------- @@ -144,43 +105,7 @@ else () # # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) # warnings that are emitted. If you need it, add it at configure time. - if (CMAKE_C_COMPILER_ID STREQUAL "Intel") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-general") - else () - ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/general") - endif() - if (NOT _INTEL_WINDOWS) - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/15") - endif () - # this is just a failsafe - list (APPEND H5_CFLAGS "-finline-functions") - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 18.0) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/18") - endif () - endif () - elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU") - # Add general CFlags for GCC versions 4.8 and above - if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) - ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/general") - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-general") - endif () - # gcc automatically inlines based on the optimization level - # this is just a failsafe - list (APPEND H5_CFLAGS "-finline-functions") - elseif (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-general") - else () - # this is just a failsafe - list (APPEND H5_CFLAGS "-finline-functions") - ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/general") - endif () - elseif (CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") - ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/general") - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/error-general") - elseif (CMAKE_C_COMPILER_ID STREQUAL "PGI") + if (CMAKE_C_COMPILER_ID STREQUAL "PGI") list (APPEND HDF5_CMAKE_C_FLAGS "-Minform=inform") endif () message (VERBOSE "CMAKE_C_FLAGS_GENERAL=${HDF5_CMAKE_C_FLAGS}") @@ -195,134 +120,6 @@ if (${HDF_CFG_NAME} MATCHES "Developer") # Developer build modes should always have these types of warnings enabled set (HDF5_ENABLE_DEV_WARNINGS ON CACHE BOOL "Enable HDF5 developer group warnings" FORCE) endif () -if (HDF5_ENABLE_DEV_WARNINGS) - message (STATUS "....HDF5 developer group warnings are enabled") - if (CMAKE_C_COMPILER_ID STREQUAL "Intel") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-developer-general") - else () - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/developer-general") - endif () - elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-general") - elseif (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-developer-general") - else () - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/developer-general") - endif () - elseif (CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/developer-general") - endif () - - # Turn on -Winline warnings now only for non-Debug and - # non-Developer builds. For at least GNU compilers this - # flag appears to conflict specifically with the -Og - # optimization flag and will produce warnings about functions - # not being considered for inlining - if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") - if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - list (APPEND H5_CFLAGS "-Winline") - elseif (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND NOT _INTEL_WINDOWS) - list (APPEND H5_CFLAGS "-Winline") - elseif (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" AND NOT _INTEL_WINDOWS) - list (APPEND H5_CFLAGS "-Winline") - elseif (CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") - list (APPEND H5_CFLAGS "-Winline") - endif () - endif () -else () - if (CMAKE_C_COMPILER_ID STREQUAL "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-general") - elseif (CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/clang-warnings/no-developer-general") - endif () -endif () - -if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - # Technically, variable-length arrays are part of the C99 standard, but - # we should approach them a bit cautiously... Only needed for gcc 4.X - if (CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0 AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.8-4.last") - endif () - - # Append more extra warning flags that only gcc 4.8+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.8") - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-4.8") - else () - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-4.8") - endif () - endif () - - # Append more extra warning flags that only gcc 4.9+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.9") - endif () - - # Append more extra warning flags that only gcc 5.x+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/5") - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-5") - endif () - - # Append more extra warning flags that only gcc 6.x+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 6.0) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/6") - endif () - - # Append more extra warning flags that only gcc 7.x+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 7.0) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/7") - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-7") - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-7") - #else () - # ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-7") - endif () - endif () - - # Append more extra warning flags that only gcc 8.x+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 8.0) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/8") - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-8") - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-8") - else () - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-8") - endif () - endif () - - # Append more extra warning flags that only gcc 9.x+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.0) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/9") - endif () - - # Append more extra warning flags that only gcc 9.3+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.3) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/9.3") - endif () - - # Append more extra warning flags that only gcc 10.x+ knows about - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 10.0) - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-10") - #else () - # ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-10") - endif () - endif () - - # Append more extra warning flags that only gcc 12.x+ knows about - # or which should only be enabled for gcc 12.x+ - if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 12.0) - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-12") - #else () - # ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-12") - endif () - endif () -endif () #----------------------------------------------------------------------------- # Option to allow the user to enable debug output @@ -363,14 +160,6 @@ if (HDF5_ENABLE_ALL_WARNINGS) endif () endif () -#----------------------------------------------------------------------------- -# This is in here to help some of the GCC based IDES like Eclipse -# and code blocks parse the compiler errors and warnings better. -#----------------------------------------------------------------------------- -if (CMAKE_C_COMPILER_ID STREQUAL "GNU") - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0") -endif () - #----------------------------------------------------------------------------- # Option for --enable-asserts # By default, CMake adds NDEBUG to CMAKE_${lang}_FLAGS for Release build types @@ -393,19 +182,6 @@ MARK_AS_ADVANCED (HDF5_ENABLE_ASSERTS) #option (HDF5_ENABLE_SYMBOLS "Add debug symbols to the library independent of the build mode and optimization level." OFF) set (HDF5_ENABLE_SYMBOLS "OFF" CACHE STRING "Add debug symbols to the library independent of the build mode and optimization level (OFF NO YES)") set_property (CACHE HDF5_ENABLE_SYMBOLS PROPERTY STRINGS OFF NO YES) -if (HDF5_ENABLE_SYMBOLS MATCHES "YES") - if (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND NOT _INTEL_WINDOWS) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g") - elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU") - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fno-omit-frame-pointer") - endif () -elseif (HDF5_ENABLE_SYMBOLS MATCHES "NO") - if (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND NOT _INTEL_WINDOWS) - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wl,-s") - elseif (CMAKE_C_COMPILER_ID STREQUAL "GNU") - set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s") - endif () -endif () MARK_AS_ADVANCED (HDF5_ENABLE_SYMBOLS) #----------------------------------------------------------------------------- @@ -427,3 +203,23 @@ if (HDF5_ENABLE_OPTIMIZATION) list (APPEND HDF5_CMAKE_C_FLAGS "${OPTIMIZE_CFLAGS}") endif () MARK_AS_ADVANCED (HDF5_ENABLE_OPTIMIZATION) + +#----------------------------------------------------------------------------- +# The build mode flags are not added to CMAKE_C_FLAGS, so create a separate +# variable for them so they can be written out to libhdf5.settings and +# H5build_settings.c +#----------------------------------------------------------------------------- +if ("${HDF_CFG_NAME}" STREQUAL "Debug") + set (HDF5_BUILD_MODE_C_FLAGS "${CMAKE_C_FLAGS_DEBUG}") +elseif ("${HDF_CFG_NAME}" STREQUAL "Developer") + set (HDF5_BUILD_MODE_C_FLAGS "${CMAKE_C_FLAGS_DEVELOPER}") +elseif ("${HDF_CFG_NAME}" STREQUAL "Release") + set (HDF5_BUILD_MODE_C_FLAGS "${CMAKE_C_FLAGS_RELEASE}") +elseif ("${HDF_CFG_NAME}" STREQUAL "MinSizeRel") + set (HDF5_BUILD_MODE_C_FLAGS "${CMAKE_C_FLAGS_MINSIZEREL}") +elseif ("${HDF_CFG_NAME}" STREQUAL "RelWithDebInfo") + set (HDF5_BUILD_MODE_C_FLAGS "${CMAKE_C_FLAGS_RELWITHDEBINFO}") +else () + set (HDF5_BUILD_MODE_C_FLAGS "") +endif () + diff --git a/config/cmake/HDFCompilerFortranFlags.cmake b/config/cmake/HDFCompilerFortranFlags.cmake new file mode 100644 index 00000000000..17d7af3ede5 --- /dev/null +++ b/config/cmake/HDFCompilerFortranFlags.cmake @@ -0,0 +1,86 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +message (VERBOSE "Warnings Configuration: default Fortran: ${CMAKE_Fortran_FLAGS}") + +#----------------------------------------------------------------------------- +# Option to allow the user to disable compiler warnings +#----------------------------------------------------------------------------- +if (HDF5_DISABLE_COMPILER_WARNINGS) + message (STATUS "....Compiler warnings are suppressed") + # MSVC uses /w to suppress warnings. It also complains if another + # warning level is given, so remove it. + if (MSVC) + set (HDF5_WARNINGS_BLOCKED 1) + endif () + if (WIN32) + add_definitions (-D_CRT_SECURE_NO_WARNINGS) + endif () + # Borland uses -w- to suppress warnings. + if (BORLAND) + set (HDF5_WARNINGS_BLOCKED 1) + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -w-") + endif () + + # Most compilers use -w to suppress warnings. + if (NOT HDF5_WARNINGS_BLOCKED) + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -w") + endif () +endif () + +if (CMAKE_Fortran_COMPILER_ID MATCHES "NVHPC" ) + include (${HDF_RESOURCES_DIR}/HDFNvhpcFortranFlags.cmake) +endif () + +if (CMAKE_Fortran_COMPILER_ID MATCHES "GNU") + include (${HDF_RESOURCES_DIR}/HDFGnuFortranFlags.cmake) +endif () + +if (CMAKE_Fortran_COMPILER_ID MATCHES "Intel") + include (${HDF_RESOURCES_DIR}/HDFIntelFortranFlags.cmake) +endif () + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- +if (CMAKE_Fortran_COMPILER_ID STREQUAL "NAG") + message (STATUS "... Select IEEE floating-point mode full") + list (APPEND HDF5_CMAKE_Fortran_FLAGS "-ieee=full") +endif () + +if (NOT MSVC AND NOT MINGW) + # General flags + if (CMAKE_Fortran_COMPILER_ID STREQUAL "PGI") + list (APPEND HDF5_CMAKE_Fortran_FLAGS "-Mfreeform" "-Mdclchk" "-Mstandard" "-Mallocatable=03") + endif () + message (VERBOSE "HDF5_CMAKE_Fortran_FLAGS=${HDF5_CMAKE_Fortran_FLAGS}") +endif () + +#----------------------------------------------------------------------------- +# The build mode flags are not added to CMAKE_Fortran_FLAGS, so create a separate +# variable for them so they can be written out to libhdf5.settings and +# H5build_settings.c +#----------------------------------------------------------------------------- +if ("${HDF_CFG_NAME}" STREQUAL "Debug") + set (HDF5_BUILD_MODE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS_DEBUG}") +elseif ("${HDF_CFG_NAME}" STREQUAL "Developer") + set (HDF5_BUILD_MODE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS_DEVELOPER}") +elseif ("${HDF_CFG_NAME}" STREQUAL "Release") + set (HDF5_BUILD_MODE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS_RELEASE}") +elseif ("${HDF_CFG_NAME}" STREQUAL "MinSizeRel") + set (HDF5_BUILD_MODE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS_MINSIZEREL}") +elseif ("${HDF_CFG_NAME}" STREQUAL "RelWithDebInfo") + set (HDF5_BUILD_MODE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS_RELWITHDEBINFO}") +else () + set (HDF5_BUILD_MODE_Fortran_FLAGS "") +endif () + diff --git a/config/cmake/HDFFortranCompilerFlags.cmake b/config/cmake/HDFFortranCompilerFlags.cmake deleted file mode 100644 index 8ac3f490cc3..00000000000 --- a/config/cmake/HDFFortranCompilerFlags.cmake +++ /dev/null @@ -1,158 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -# - -message (VERBOSE "Warnings Configuration: default Fortran: ${CMAKE_Fortran_FLAGS}") - -#----------------------------------------------------------------------------- -# Option to allow the user to disable compiler warnings -#----------------------------------------------------------------------------- -if (HDF5_DISABLE_COMPILER_WARNINGS) - message (STATUS "....Compiler warnings are suppressed") - # MSVC uses /w to suppress warnings. It also complains if another - # warning level is given, so remove it. - if (MSVC) - set (HDF5_WARNINGS_BLOCKED 1) - if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} /warn:none") - elseif (CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} /warn:none") - endif () - endif () - if (WIN32) - add_definitions (-D_CRT_SECURE_NO_WARNINGS) - endif () - # Borland uses -w- to suppress warnings. - if (BORLAND) - set (HDF5_WARNINGS_BLOCKED 1) - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -w-") - endif () - - # Most compilers use -w to suppress warnings. - if (NOT HDF5_WARNINGS_BLOCKED) - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -w") - endif () -endif () - -#----------------------------------------------------------------------------- -# HDF5 library compile options - to be made available to all targets -#----------------------------------------------------------------------------- -if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU" AND NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0) - if (HDF5_ENABLE_BUILD_DIAGS) - message (STATUS "... default color and URL extended diagnostic messages enabled") - else () - message (STATUS "... disable color and URL extended diagnostic messages") - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fdiagnostics-urls=never -fno-diagnostics-color") - endif () -endif () - -if (CMAKE_Fortran_COMPILER_ID STREQUAL "NAG") - message (STATUS "... Select IEEE floating-point mode full") - list (APPEND HDF5_CMAKE_Fortran_FLAGS "-ieee=full") -endif () -if (CMAKE_Fortran_COMPILER_ID STREQUAL "NVHPC") - if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Mnoframe") - if (NOT ${HDF_CFG_NAME} MATCHES "RelWithDebInfo") - set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -s") - endif () - else () - set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Mbounds -Mchkptr -Mdclchk -g") - endif () -endif () - -if (NOT MSVC AND NOT MINGW) - # General flags - if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-ifort-general") - else () - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/ifort-general") - endif() - list (APPEND HDF5_CMAKE_Fortran_FLAGS "-free") - elseif (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-general") - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-developer-general") - else () - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-no-developer-general") - endif () - list (APPEND HDF5_CMAKE_Fortran_FLAGS "-ffree-form" "-fimplicit-none") - if (CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 8.0 AND NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.6) - list (APPEND HDF5_CMAKE_Fortran_FLAGS "-std=f2008ts") - else () - list (APPEND HDF5_CMAKE_Fortran_FLAGS "-std=f2008") - endif () - elseif (CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") - if (_INTEL_WINDOWS) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-ifort-general") - else () - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/ifort-general") - endif() - list (APPEND HDF5_CMAKE_Fortran_FLAGS "-free") - elseif (CMAKE_Fortran_COMPILER_ID STREQUAL "PGI") - list (APPEND HDF5_CMAKE_Fortran_FLAGS "-Mfreeform" "-Mdclchk" "-Mstandard" "-Mallocatable=03") - endif () - message (VERBOSE "HDF5_CMAKE_Fortran_FLAGS=${HDF5_CMAKE_Fortran_FLAGS}") - - if (CMAKE_Fortran_COMPILER_ID STREQUAL "GNU") - # Append more extra warning flags that only gcc 4.8+ knows about - if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.8) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-4.8") - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-developer-4.8") - else () - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-no-developer-4.8") - endif () - endif () - - # Append more extra warning flags that only gcc 4.9+ knows about - #if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.9) - # ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-4.9") - #endif () - - # Append more extra warning flags that only gcc 5.x+ knows about - if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 5.0) - if (HDF5_ENABLE_DEV_WARNINGS) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-developer-5") - endif () - endif () - - # Append more extra warning flags that only gcc 6.x+ knows about - if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 6.0) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-6") - endif () - - # Append more extra warning flags that only gcc 7.x+ knows about - #if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0) - # ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-7") - #endif () - - # Append more extra warning flags that only gcc 8.x+ knows about - if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 8.0) - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-8") - endif () - - # Append more extra warning flags that only gcc 9.x+ knows about - #if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 9.0) - # ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-9") - #endif () - endif () -else () - if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-ifort-general") - list (APPEND HDF5_CMAKE_Fortran_FLAGS "/stand:f03" "/free") - elseif (CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") - ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-ifort-general") - list (APPEND HDF5_CMAKE_Fortran_FLAGS "/stand:f03" "/free") - endif () -endif () - diff --git a/config/cmake/HDFGnuCXXFlags.cmake b/config/cmake/HDFGnuCXXFlags.cmake new file mode 100644 index 00000000000..99aec322229 --- /dev/null +++ b/config/cmake/HDFGnuCXXFlags.cmake @@ -0,0 +1,192 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") +############################################################################### +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- + + set (CMAKE_CXX_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_CXX_FLAGS}") + if (${HDF_CFG_NAME} MATCHES "Debug" OR ${HDF_CFG_NAME} MATCHES "Developer") + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Og -ftrapv -fno-common") + endif () + else () + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstdarg-opt") + endif () + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) + if (HDF5_ENABLE_BUILD_DIAGS) + message (STATUS "... default color and URL extended diagnostic messages enabled") + else () + message (STATUS "... disable color and URL extended diagnostic messages") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fdiagnostics-urls=never -fno-diagnostics-color") + endif () + endif () + endif () + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- + +if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # General flags + # + # Note that some of the flags listed here really should be developer + # flags (listed in a separate variable, below) but we put them here + # because they are not raised by the current code and we'd like to + # know if they do start showing up. + # + # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) + # warnings that are emitted. If you need it, add it at configure time. + if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) + # add the general CXX flags for g++ compiler versions 4.8 and above. + ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-general") + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-error-general") + endif () + message (VERBOSE "CMAKE_CXX_FLAGS_GENERAL=${HDF5_CMAKE_CXX_FLAGS}") +endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to enable developer warnings +# Developer warnings (suggestions from gcc, not code problems) +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_DEV_WARNINGS) + message (STATUS "....HDF5 CXX developer group warnings are enabled") + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-general") +else () + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-general") +endif () + + # Technically, variable-length arrays are part of the C99 standard, but + # we should approach them a bit cautiously... Only needed for gcc 4.X + if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0 AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.8-4.last") + endif () + + # Append more extra warning flags that only gcc 4.8+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.8) + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-4.8") + if (HDF5_ENABLE_DEV_WARNINGS) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-developer-4.8") + else () + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-cxx-developer-4.8") + endif () + endif () + + # Append more extra warning flags that only gcc 4.9+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-4.9") + endif () + + # Append more extra warning flags that only gcc 5.1+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0) + # autotools always add the C flags with the CXX flags + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-5") + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-error-5") + endif () + + # Append more extra warning flags that only gcc 6.x+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 6.0) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/6") + endif () + + # Append more extra warning flags that only gcc 7.x+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 7.0) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXxFLAGS2 "${HDF5_SOURCE_DIR}/config/gnu-warnings/7") + if (HDF5_ENABLE_DEV_WARNINGS) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-7") + #else () + # ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-7") + endif () + endif () + + # Append more extra warning flags that only gcc 8.x+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 8.0) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/8") + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-8") + if (HDF5_ENABLE_DEV_WARNINGS) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-8") + else () + # autotools always add the C flags with the CXX flags + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-8") + endif () + endif () + + # Append more extra warning flags that only gcc 9.x+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.0) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/cxx-9") + endif () + + # Append more extra warning flags that only gcc 9.3+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 9.3) + # do not use C warnings, gnu-warnings 9.3, no cxx warnings + # ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/9.3") + endif () + + # Append more extra warning flags that only gcc 10.x+ knows about + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 10.0) + if (HDF5_ENABLE_DEV_WARNINGS) + # Use the C warnings as CXX warnings are the same + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-10") + #else () + # ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-10") + endif () + endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to enable all warnings +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_ALL_WARNINGS) + message (STATUS "....All CXX Warnings are enabled") + if (MSVC) + if (HDF5_ENABLE_DEV_WARNINGS) + string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + list (APPEND HDF5_CMAKE_CXX_FLAGS "/Wall" "/wd4668") + else () + string (REGEX REPLACE "(^| )([/-])W[0-9]( |$)" " " CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + list (APPEND HDF5_CMAKE_CXX_FLAGS "/W3" "/wd4100" "/wd4706" "/wd4127") + endif () + else () + list (APPEND HDF5_CMAKE_CXX_FLAGS ${H5_CXXFLAGS}) + endif () +endif () + +#----------------------------------------------------------------------------- +# This is in here to help some of the GCC based IDES like Eclipse +# and code blocks parse the compiler errors and warnings better. +#----------------------------------------------------------------------------- + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fmessage-length=0") + +#----------------------------------------------------------------------------- +# Option for --enable-symbols +# This option will force/override the default setting for all configurations +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_SYMBOLS MATCHES "YES") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") +elseif (HDF5_ENABLE_SYMBOLS MATCHES "NO") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s") +endif () diff --git a/config/cmake/HDFGnuFlags.cmake b/config/cmake/HDFGnuFlags.cmake new file mode 100644 index 00000000000..5367c5237d8 --- /dev/null +++ b/config/cmake/HDFGnuFlags.cmake @@ -0,0 +1,195 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_C_COMPILER_ID STREQUAL "GNU") +############################################################################### +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- + + set (CMAKE_C_FLAGS "${CMAKE_ANSI_CFLAGS} ${CMAKE_C_FLAGS}") + if (${HDF_CFG_NAME} MATCHES "Debug" OR ${HDF_CFG_NAME} MATCHES "Developer") + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Og -ftrapv -fno-common") + endif () + else () + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0 AND + NOT CMAKE_C_CLANG_TIDY) + # `clang-tidy` does not understand -fstdarg-opt + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fstdarg-opt") + endif () + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 10.0) + #----------------------------------------------------------------------------- + # Option to allow the user to enable build extended diagnostics + # + # This should NOT be on by default as it can cause process issues. + #----------------------------------------------------------------------------- + option (HDF5_ENABLE_BUILD_DIAGS "Enable color and URL extended diagnostic messages" OFF) + mark_as_advanced (HDF5_ENABLE_BUILD_DIAGS) + if (HDF5_ENABLE_BUILD_DIAGS) + message (STATUS "... default color and URL extended diagnostic messages enabled") + else () + message (STATUS "... disable color and URL extended diagnostic messages") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fdiagnostics-urls=never -fno-diagnostics-color") + endif () + endif () + endif () + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- + +if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # General flags + # + # Note that some of the flags listed here really should be developer + # flags (listed in a separate variable, below) but we put them here + # because they are not raised by the current code and we'd like to + # know if they do start showing up. + # + # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) + # warnings that are emitted. If you need it, add it at configure time. + # Add general CFlags for GCC versions 4.8 and above + if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) + ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/general") + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-general") + endif () + # gcc automatically inlines based on the optimization level + # this is just a failsafe + list (APPEND H5_CFLAGS "-finline-functions") + message (VERBOSE "CMAKE_C_FLAGS_GENERAL=${HDF5_CMAKE_C_FLAGS}") +endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to enable developer warnings +# Developer warnings (suggestions from gcc, not code problems) +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_DEV_WARNINGS) + message (STATUS "....HDF5 developer group warnings are enabled") + if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-general") + endif () + + # Turn on -Winline warnings now only for non-Debug and + # non-Developer builds. For at least GNU compilers this + # flag appears to conflict specifically with the -Og + # optimization flag and will produce warnings about functions + # not being considered for inlining + if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") + list (APPEND H5_CFLAGS "-Winline") + endif () +else () + if (CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-general") + endif () +endif () + + # Technically, variable-length arrays are part of the C99 standard, but + # we should approach them a bit cautiously... Only needed for gcc 4.X + if (CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0 AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL 4.8) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.8-4.last") + endif () + + # Append more extra warning flags that only gcc 4.8+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.8) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.8") + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-4.8") + else () + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-4.8") + endif () + endif () + + # Append more extra warning flags that only gcc 4.9+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 4.9) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/4.9") + endif () + + # Append more extra warning flags that only gcc 5.x+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 5.0) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/5") + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-5") + endif () + + # Append more extra warning flags that only gcc 6.x+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 6.0) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/6") + endif () + + # Append more extra warning flags that only gcc 7.x+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 7.0) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/7") + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-7") + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-7") + #else () + # ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-7") + endif () + endif () + + # Append more extra warning flags that only gcc 8.x+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 8.0) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/8") + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/error-8") + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-8") + else () + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-8") + endif () + endif () + + # Append more extra warning flags that only gcc 9.x+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.0) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/9") + endif () + + # Append more extra warning flags that only gcc 9.3+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 9.3) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/9.3") + endif () + + # Append more extra warning flags that only gcc 10.x+ knows about + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 10.0) + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-10") + #else () + # ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-10") + endif () + endif () + + # Append more extra warning flags that only gcc 12.x+ knows about + # or which should only be enabled for gcc 12.x+ + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 12.0) + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/developer-12") + #else () + # ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/no-developer-12") + endif () + endif () + +#----------------------------------------------------------------------------- +# This is in here to help some of the GCC based IDES like Eclipse +# and code blocks parse the compiler errors and warnings better. +#----------------------------------------------------------------------------- + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fmessage-length=0") + +#----------------------------------------------------------------------------- +# Option for --enable-symbols +# This option will force/override the default setting for all configurations +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_SYMBOLS MATCHES "YES") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -fno-omit-frame-pointer") +elseif (HDF5_ENABLE_SYMBOLS MATCHES "NO") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s") +endif () diff --git a/config/cmake/HDFGnuFortranFlags.cmake b/config/cmake/HDFGnuFortranFlags.cmake new file mode 100644 index 00000000000..a114ceb0e08 --- /dev/null +++ b/config/cmake/HDFGnuFortranFlags.cmake @@ -0,0 +1,90 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFortranFlags.cmake with +# if (CMAKE_Fortran_COMPILER_ID MATCHES "GNU" ) +############################################################################### + +message (VERBOSE "Warnings Configuration: default Fortran: ${CMAKE_Fortran_FLAGS}") + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- +if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 10.0) + if (HDF5_ENABLE_BUILD_DIAGS) + message (STATUS "... default color and URL extended diagnostic messages enabled") + else () + message (STATUS "... disable color and URL extended diagnostic messages") + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -fdiagnostics-urls=never -fno-diagnostics-color") + endif () +endif () + +if (NOT MSVC AND NOT MINGW) + # General flags + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-general") + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-developer-general") + else () + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-no-developer-general") + endif () + list (APPEND HDF5_CMAKE_Fortran_FLAGS "-ffree-form" "-fimplicit-none") + if (CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 8.0 AND NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.6) + list (APPEND HDF5_CMAKE_Fortran_FLAGS "-std=f2008ts") + else () + list (APPEND HDF5_CMAKE_Fortran_FLAGS "-std=f2008") + endif () + message (VERBOSE "HDF5_CMAKE_Fortran_FLAGS=${HDF5_CMAKE_Fortran_FLAGS}") + + # Append more extra warning flags that only gcc 4.8+ knows about + if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.8) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-4.8") + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-developer-4.8") + else () + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-no-developer-4.8") + endif () + endif () + + # Append more extra warning flags that only gcc 4.9+ knows about + #if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 4.9) + # ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-4.9") + #endif () + + # Append more extra warning flags that only gcc 5.x+ knows about + if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 5.0) + if (HDF5_ENABLE_DEV_WARNINGS) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-developer-5") + endif () + endif () + + # Append more extra warning flags that only gcc 6.x+ knows about + if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 6.0) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-6") + endif () + + # Append more extra warning flags that only gcc 7.x+ knows about + #if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 7.0) + # ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-7") + #endif () + + # Append more extra warning flags that only gcc 8.x+ knows about + if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 8.0) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-8") + endif () + + # Append more extra warning flags that only gcc 9.x+ knows about + #if (NOT CMAKE_Fortran_COMPILER_VERSION VERSION_LESS 9.0) + # ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/gnu-warnings/gfort-9") + #endif () +endif () + diff --git a/config/cmake/HDFIntelCXXFlags.cmake b/config/cmake/HDFIntelCXXFlags.cmake new file mode 100644 index 00000000000..02220b51d46 --- /dev/null +++ b/config/cmake/HDFIntelCXXFlags.cmake @@ -0,0 +1,93 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_CXX_COMPILER_ID MATCHES "Intel") +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +if (WIN32) + set (_INTEL_WINDOWS 1) +endif () + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- +if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # General flags + # + # Note that some of the flags listed here really should be developer + # flags (listed in a separate variable, below) but we put them here + # because they are not raised by the current code and we'd like to + # know if they do start showing up. + # + # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) + # warnings that are emitted. If you need it, add it at configure time. + if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-general") + else () + ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/general") + endif() + if (NOT _INTEL_WINDOWS) + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 15.0) + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/15") + endif () + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 18.0) + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/18") + endif () + endif () + elseif (CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-general") + else () + ADD_H5_FLAGS (HDF5_CMAKE_CXX_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/general") + endif () + endif () + message (VERBOSE "CMAKE_CXX_FLAGS_GENERAL=${HDF5_CMAKE_CXX_FLAGS}") +endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to enable developer warnings +# Developer warnings (suggestions from gcc, not code problems) +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_DEV_WARNINGS) + message (STATUS "....HDF5 CXX developer group warnings are enabled") + if (CMAKE_CXX_COMPILER_ID STREQUAL "Intel") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-developer-general") + else () + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/developer-general") + endif () + elseif (CMAKE_CXX_COMPILER_ID MATCHES "IntelLLVM") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-developer-general") + else () + ADD_H5_FLAGS (H5_CXXFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/developer-general") + endif () + endif () +endif () + +#----------------------------------------------------------------------------- +# Option for --enable-symbols +# This option will force/override the default setting for all configurations +#----------------------------------------------------------------------------- +if (NOT _INTEL_WINDOWS) + if (HDF5_ENABLE_SYMBOLS MATCHES "YES") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g") + elseif (HDF5_ENABLE_SYMBOLS MATCHES "NO") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-s") + endif () +endif () diff --git a/config/cmake/HDFIntelFlags.cmake b/config/cmake/HDFIntelFlags.cmake new file mode 100644 index 00000000000..dbdbb616c15 --- /dev/null +++ b/config/cmake/HDFIntelFlags.cmake @@ -0,0 +1,106 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_C_COMPILER_ID MATCHES "Intel") +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +if (WIN32) + set (_INTEL_WINDOWS 1) +endif () + +# Disable deprecation warnings for standard C functions. +# really only needed for newer versions of VS, but should +# not hurt other versions, and this will work into the +# future +if (MSVC OR _INTEL_WINDOWS) + add_definitions (-D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE) +endif () + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- +if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "SunOS") + # General flags + # + # Note that some of the flags listed here really should be developer + # flags (listed in a separate variable, below) but we put them here + # because they are not raised by the current code and we'd like to + # know if they do start showing up. + # + # NOTE: Don't add -Wpadded here since we can't/won't fix the (many) + # warnings that are emitted. If you need it, add it at configure time. + if (CMAKE_C_COMPILER_ID STREQUAL "Intel") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-general") + else () + ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/general") + endif() + if (NOT _INTEL_WINDOWS) + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/15") + endif () + # this is just a failsafe + list (APPEND H5_CFLAGS "-finline-functions") + if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 18.0) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/18") + endif () + endif () + elseif (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-general") + else () + # this is just a failsafe + list (APPEND H5_CFLAGS "-finline-functions") + ADD_H5_FLAGS (HDF5_CMAKE_C_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/general") + endif () + endif () + message (VERBOSE "CMAKE_C_FLAGS_GENERAL=${HDF5_CMAKE_C_FLAGS}") +endif () + +#----------------------------------------------------------------------------- +# Option to allow the user to enable developer warnings +# Developer warnings (suggestions from gcc, not code problems) +#----------------------------------------------------------------------------- +if (HDF5_ENABLE_DEV_WARNINGS) + message (STATUS "....HDF5 developer group warnings are enabled") + if (CMAKE_C_COMPILER_ID STREQUAL "Intel") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-developer-general") + else () + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/developer-general") + endif () + elseif (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-developer-general") + else () + ADD_H5_FLAGS (H5_CFLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/developer-general") + endif () + endif () +endif () + +# Turn on -Winline warnings now only for non-Debug and +# non-Developer builds. For at least GNU compilers this +# flag appears to conflict specifically with the -Og +# optimization flag and will produce warnings about functions +# not being considered for inlining +if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") + if (CMAKE_C_COMPILER_ID STREQUAL "Intel" AND NOT _INTEL_WINDOWS) + list (APPEND H5_CFLAGS "-Winline") + elseif (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" AND NOT _INTEL_WINDOWS) + list (APPEND H5_CFLAGS "-Winline") + endif () +endif () diff --git a/config/cmake/HDFIntelFortranFlags.cmake b/config/cmake/HDFIntelFortranFlags.cmake new file mode 100644 index 00000000000..8f55badf699 --- /dev/null +++ b/config/cmake/HDFIntelFortranFlags.cmake @@ -0,0 +1,65 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFortranFlags.cmake with +# if (CMAKE_Fortran_COMPILER_ID MATCHES "Intel" ) +############################################################################### + +message (VERBOSE "Warnings Configuration: default Fortran: ${CMAKE_Fortran_FLAGS}") + +#----------------------------------------------------------------------------- +# Option to allow the user to disable compiler warnings +#----------------------------------------------------------------------------- +if (HDF5_DISABLE_COMPILER_WARNINGS) + # MSVC uses /w to suppress warnings. It also complains if another + # warning level is given, so remove it. + if (MSVC) + if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} /warn:none") + elseif (CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} /warn:none") + endif () + endif () +endif () + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- +if (NOT MSVC AND NOT MINGW) + # General flags + if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-ifort-general") + else () + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/ifort-general") + endif() + list (APPEND HDF5_CMAKE_Fortran_FLAGS "-free") + elseif (CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") + if (_INTEL_WINDOWS) + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-ifort-general") + else () + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/ifort-general") + endif() + list (APPEND HDF5_CMAKE_Fortran_FLAGS "-free") + endif () + message (VERBOSE "HDF5_CMAKE_Fortran_FLAGS=${HDF5_CMAKE_Fortran_FLAGS}") +else () + if (CMAKE_Fortran_COMPILER_ID STREQUAL "Intel") + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/classic/win-ifort-general") + list (APPEND HDF5_CMAKE_Fortran_FLAGS "/stand:f03" "/free") + elseif (CMAKE_Fortran_COMPILER_ID MATCHES "IntelLLVM") + ADD_H5_FLAGS (HDF5_CMAKE_Fortran_FLAGS "${HDF5_SOURCE_DIR}/config/intel-warnings/oneapi/win-ifort-general") + list (APPEND HDF5_CMAKE_Fortran_FLAGS "/stand:f03" "/free") + endif () +endif () + diff --git a/config/cmake/HDFLibMacros.cmake b/config/cmake/HDFLibMacros.cmake index 09f40680b72..f85fb42c51b 100644 --- a/config/cmake/HDFLibMacros.cmake +++ b/config/cmake/HDFLibMacros.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -40,6 +40,11 @@ macro (EXTERNAL_ZLIB_LIBRARY compress_type) add_library(${HDF_PACKAGE_NAMESPACE}zlib-static ALIAS zlib-static) set (H5_ZLIB_STATIC_LIBRARY "${HDF_PACKAGE_NAMESPACE}zlib-static") set (H5_ZLIB_LIBRARIES ${H5_ZLIB_STATIC_LIBRARY}) + if (HDF5_USE_ZLIB_NG) + set (H5_ZLIB_HEADER "zlib-ng.h") + else () + set (H5_ZLIB_HEADER "zlib.h") + endif () set (H5_ZLIB_INCLUDE_DIR_GEN "${hdf5_zlib_BINARY_DIR}") set (H5_ZLIB_INCLUDE_DIR "${hdf5_zlib_SOURCE_DIR}") diff --git a/config/cmake/HDFMacros.cmake b/config/cmake/HDFMacros.cmake index 3be3e6a6a60..018c7d8daa0 100644 --- a/config/cmake/HDFMacros.cmake +++ b/config/cmake/HDFMacros.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -122,9 +122,9 @@ endmacro () #------------------------------------------------------------------------------- macro (INSTALL_TARGET_PDB libtarget targetdestination targetcomponent) - option (DISABLE_PDB_FILES "Do not install PDB files" OFF) - mark_as_advanced (DISABLE_PDB_FILES) - if (WIN32 AND MSVC AND NOT DISABLE_PDB_FILES) + option (HDF5_DISABLE_PDB_FILES "Do not install PDB files" OFF) + mark_as_advanced (HDF5_DISABLE_PDB_FILES) + if (WIN32 AND MSVC AND NOT HDF5_DISABLE_PDB_FILES) get_target_property (target_type ${libtarget} TYPE) if (${target_type} MATCHES "SHARED") set (targetfilename $) @@ -354,7 +354,7 @@ macro (HDF_README_PROPERTIES target_fortran) set (BINARY_PLATFORM "${BINARY_PLATFORM} / ${CMAKE_Fortran_COMPILER_ID} Fortran") endif () - if (ONLY_SHARED_LIBS) + if (HDF5_ONLY_SHARED_LIBS) set (LIB_TYPE "Shared") elseif (BUILD_SHARED_LIBS) set (LIB_TYPE "Static and Shared") diff --git a/config/cmake/HDFMsvcCXXFlags.cmake b/config/cmake/HDFMsvcCXXFlags.cmake new file mode 100644 index 00000000000..4970622cc3d --- /dev/null +++ b/config/cmake/HDFMsvcCXXFlags.cmake @@ -0,0 +1,26 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_CXX_COMPILER_ID MATCHES "MSVC") +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- + +# MSVC 14.28 enables C5105, but the Windows SDK 10.0.18362.0 triggers it. + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") + if (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS 19.28) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -wd5105") + endif () diff --git a/config/cmake/HDFMsvcFlags.cmake b/config/cmake/HDFMsvcFlags.cmake new file mode 100644 index 00000000000..a0ca9290f93 --- /dev/null +++ b/config/cmake/HDFMsvcFlags.cmake @@ -0,0 +1,25 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_C_COMPILER_ID MATCHES "MSVC") +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- + +# MSVC 14.28 enables C5105, but the Windows SDK 10.0.18362.0 triggers it. +if (NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 19.28) + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -wd5105") +endif () diff --git a/config/cmake/HDFNvhpcCXXFlags.cmake b/config/cmake/HDFNvhpcCXXFlags.cmake new file mode 100644 index 00000000000..eab491bf01e --- /dev/null +++ b/config/cmake/HDFNvhpcCXXFlags.cmake @@ -0,0 +1,33 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_CXX_COMPILER_ID MATCHES "NVHPC" ) +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +if (NOT DEFINED CMAKE_CXX${CMAKE_CXX_STANDARD}_STANDARD_COMPILE_OPTION) + if (NOT CMAKE_CXX_STANDARD OR CMAKE_CXX_STANDARD EQUAL 11) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C11_STANDARD_COMPILE_OPTION}") + endif () +endif () +if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Minform=warn") + if (NOT ${HDF_CFG_NAME} MATCHES "RelWithDebInfo") + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -s") + endif () +else () + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Mbounds -gopt -g") +endif () diff --git a/config/cmake/HDFNvhpcFlags.cmake b/config/cmake/HDFNvhpcFlags.cmake new file mode 100644 index 00000000000..77443942064 --- /dev/null +++ b/config/cmake/HDFNvhpcFlags.cmake @@ -0,0 +1,28 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFlags.cmake with +# if (CMAKE_C_COMPILER_ID MATCHES "NVHPC" ) +############################################################################### + +#----------------------------------------------------------------------------- +# Compiler specific flags +#----------------------------------------------------------------------------- +set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Minform=warn") +if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") + if (NOT ${HDF_CFG_NAME} MATCHES "RelWithDebInfo") + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -s") + endif () +else () + set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Mbounds -gopt") +endif () diff --git a/config/cmake/HDFNvhpcFortranFlags.cmake b/config/cmake/HDFNvhpcFortranFlags.cmake new file mode 100644 index 00000000000..a6ae6930262 --- /dev/null +++ b/config/cmake/HDFNvhpcFortranFlags.cmake @@ -0,0 +1,38 @@ +# +# Copyright by The HDF Group. +# All rights reserved. +# +# This file is part of HDF5. The full HDF5 copyright notice, including +# terms governing use, modification, and redistribution, is contained in +# the COPYING file, which can be found at the root of the source code +# distribution tree, or in https://www.hdfgroup.org/licenses. +# If you do not have access to either file, you may request a copy from +# help@hdfgroup.org. +# + +############################################################################### +# This file included from HDFCompilerFortranFlags.cmake with +# if (CMAKE_Fortran_COMPILER_ID MATCHES "NVHPC" ) +############################################################################### + +message (VERBOSE "Warnings Configuration: default Fortran: ${CMAKE_Fortran_FLAGS}") + +#----------------------------------------------------------------------------- +# HDF5 library compile options - to be made available to all targets +#----------------------------------------------------------------------------- +if (CMAKE_Fortran_COMPILER_ID STREQUAL "NVHPC") + if (NOT ${HDF_CFG_NAME} MATCHES "Debug" AND NOT ${HDF_CFG_NAME} MATCHES "Developer") + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Mnoframe") + if (NOT ${HDF_CFG_NAME} MATCHES "RelWithDebInfo") + set(CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -s") + endif () + else () + set (CMAKE_Fortran_FLAGS "${CMAKE_Fortran_FLAGS} -Mbounds -Mchkptr -Mdclchk -g") + endif () +endif () + +if (NOT MSVC AND NOT MINGW) + # General flags + message (VERBOSE "HDF5_CMAKE_Fortran_FLAGS=${HDF5_CMAKE_Fortran_FLAGS}") +endif () + diff --git a/config/cmake/HDFTests.c b/config/cmake/HDFTests.c index ae646ee051b..4026a5ae006 100644 --- a/config/cmake/HDFTests.c +++ b/config/cmake/HDFTests.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -128,3 +128,65 @@ main(void) #endif } #endif + +#ifdef HAVE_STDC_NO_COMPLEX +#ifndef __STDC_NO_COMPLEX__ +#error "__STDC_NO_COMPLEX__ not defined" +#else +int +main(void) +{ + return 0; +} +#endif +#endif + +#ifdef HAVE_COMPLEX_NUMBERS +#include + +#if defined(_MSC_VER) && !defined(__llvm__) && !defined(__INTEL_LLVM_COMPILER) + +typedef _Fcomplex H5_float_complex; +typedef _Dcomplex H5_double_complex; +typedef _Lcomplex H5_ldouble_complex; +#define H5_make_fcomplex _FCbuild +#define H5_make_dcomplex _Cbuild +#define H5_make_lcomplex _LCbuild + +#else + +typedef float _Complex H5_float_complex; +typedef double _Complex H5_double_complex; +typedef long double _Complex H5_ldouble_complex; +static float _Complex +H5_make_fcomplex(float real, float imaginary) +{ + return real + imaginary * (float _Complex)_Complex_I; +} +static double _Complex +H5_make_dcomplex(double real, double imaginary) +{ + return real + imaginary * (double _Complex)_Complex_I; +} +static long double _Complex +H5_make_lcomplex(long double real, long double imaginary) +{ + return real + imaginary * (long double _Complex)_Complex_I; +} +#endif + +int +main(void) +{ + H5_float_complex z1 = H5_make_fcomplex(1.0f, 1.0f); + H5_double_complex z2 = H5_make_dcomplex(2.0, 4.0); + H5_ldouble_complex z3 = H5_make_lcomplex(3.0L, 5.0L); + float r1 = crealf(z1); + float i1 = cimagf(z1); + double r2 = creal(z2); + double i2 = cimag(z2); + long double r3 = creall(z3); + long double i3 = cimagl(z3); + return 0; +} +#endif diff --git a/config/cmake/HDFUseFortran.cmake b/config/cmake/HDFUseFortran.cmake index 44d3e7cfd2b..50b1dc48294 100644 --- a/config/cmake/HDFUseFortran.cmake +++ b/config/cmake/HDFUseFortran.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/LIBAEC/CMakeLists.txt b/config/cmake/LIBAEC/CMakeLists.txt index 2ac4f2c7ad3..931ef350aae 100644 --- a/config/cmake/LIBAEC/CMakeLists.txt +++ b/config/cmake/LIBAEC/CMakeLists.txt @@ -151,7 +151,7 @@ target_include_directories (${LIBAEC_LIB_TARGET} PUBLIC "$" "$" "$") -if (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" OR CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") +if (CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" OR (CMAKE_C_COMPILER_ID MATCHES "[Cc]lang" AND NOT CMAKE_C_COMPILER_VERSION VERSION_LESS 15.0)) target_compile_options(${LIBAEC_LIB_TARGET} PRIVATE -Wno-deprecated-non-prototype) endif () if (CMAKE_C_COMPILER_ID STREQUAL "GNU") diff --git a/config/cmake/README.md.cmake.in b/config/cmake/README.md.cmake.in index 40294c15255..82cb082c444 100644 --- a/config/cmake/README.md.cmake.in +++ b/config/cmake/README.md.cmake.in @@ -13,7 +13,7 @@ It was built with the following options: The contents of this directory are: - COPYING - Copyright notice + LICENSE - Copyright notice README.md - This file @HDF5_PACKAGE_NAME@-@HDF5_PACKAGE_VERSION@-@BINARY_SYSTEM_NAME@.@BINARY_INSTALL_ENDING@ - HDF5 Install Package OR diff --git a/config/cmake/UserMacros/Windows_MT.cmake b/config/cmake/UserMacros/Windows_MT.cmake index 351c99108e7..a6e451bef6c 100644 --- a/config/cmake/UserMacros/Windows_MT.cmake +++ b/config/cmake/UserMacros/Windows_MT.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/ZLIB/CMakeLists.txt b/config/cmake/ZLIB/CMakeLists.txt index 3dba6a89657..b3ef6cce1bb 100644 --- a/config/cmake/ZLIB/CMakeLists.txt +++ b/config/cmake/ZLIB/CMakeLists.txt @@ -2,7 +2,7 @@ cmake_minimum_required (VERSION 3.18) set (CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON) project (ZLIB C) -set (VERSION "1.3") +set(VERSION "1.3.1") #----------------------------------------------------------------------------- # Basic ZLIB stuff here @@ -131,6 +131,7 @@ set_directory_properties (PROPERTIES INCLUDE_DIRECTORIES if (MSVC) set(CMAKE_DEBUG_POSTFIX "d") add_definitions (-D_BIND_TO_CURRENT_VCLIBS_VERSION=1) + add_definitions (-D_CRT_SECURE_NO_DEPRECATE) add_definitions (-D_CRT_SECURE_NO_WARNINGS) add_definitions (-D_CONSOLE) add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) @@ -191,7 +192,10 @@ set(ZLIB_SRCS ) add_library(${ZLIB_LIB_TARGET} STATIC ${ZLIB_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS}) -target_include_directories(${ZLIB_LIB_TARGET} PRIVATE "${CMAKE_BINARY_DIR}") +target_include_directories(${ZLIB_LIB_TARGET} + PRIVATE "${CMAKE_BINARY_DIR}" + PUBLIC "${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}" +) if (MSVC AND CMAKE_CL_64) set_target_properties (${ZLIB_LIB_TARGET} PROPERTIES STATIC_LIBRARY_FLAGS "/machine:x64") endif () diff --git a/config/cmake/ZLIBNG/CMakeLists.txt b/config/cmake/ZLIBNG/CMakeLists.txt index 5bb5da961e1..22305f22091 100644 --- a/config/cmake/ZLIBNG/CMakeLists.txt +++ b/config/cmake/ZLIBNG/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.18) -project(ZLIB VERSION ${ZLIB_HEADER_VERSION} LANGUAGES C) +project(ZLIB LANGUAGES C) message(STATUS "Using CMake version ${CMAKE_VERSION}") @@ -71,6 +71,7 @@ include(CheckCSourceCompiles) include(CheckCSourceRuns) include(CheckCCompilerFlag) include(CMakeDependentOption) +include(CMakePackageConfigHelpers) include(FeatureSummary) include(cmake/detect-arch.cmake) @@ -80,6 +81,10 @@ include(cmake/detect-intrinsics.cmake) include(cmake/detect-sanitizer.cmake) include(cmake/fallback-macros.cmake) +if(CMAKE_TOOLCHAIN_FILE) + message(STATUS "Using CMake toolchain: ${CMAKE_TOOLCHAIN_FILE}") +endif() + # Make sure we use an appropriate BUILD_TYPE by default, "Release" to be exact # this should select the maximum generic optimisation on the current platform (i.e. -O3 for gcc/clang) get_property(GENERATOR_IS_MULTI_CONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG) @@ -98,7 +103,7 @@ endif() # Options parsing # option(WITH_GZFILEOP "Compile with support for gzFile related functions" ON) -option(ZLIB_COMPAT "Compile with zlib compatible API" ON) +option(ZLIB_COMPAT "Compile with zlib compatible API" OFF) option(ZLIB_ENABLE_TESTS "Build test binaries" OFF) option(ZLIBNG_ENABLE_TESTS "Test zlib-ng specific API" OFF) option(WITH_GTEST "Build gtest_zlib" OFF) @@ -110,6 +115,7 @@ option(WITH_REDUCED_MEM "Reduced memory usage for special cases (reduces perform option(WITH_NEW_STRATEGIES "Use new strategies" ON) option(WITH_NATIVE_INSTRUCTIONS "Instruct the compiler to use the full instruction set on this host (gcc/clang -march=native)" OFF) +option(WITH_RUNTIME_CPU_DETECTION "Build with runtime detection of CPU architecture" ON) option(WITH_MAINTAINER_WARNINGS "Build with project maintainer warnings" OFF) option(WITH_CODE_COVERAGE "Enable code coverage reporting" OFF) option(WITH_INFLATE_STRICT "Build with strict inflate distance checking" OFF) @@ -139,14 +145,14 @@ elseif(BASEARCH_S360_FOUND) option(WITH_DFLTCC_INFLATE "Build with DFLTCC intrinsics for decompression on IBM Z" OFF) option(WITH_CRC32_VX "Build with vectorized CRC32 on IBM Z" ON) elseif(BASEARCH_X86_FOUND) - option(WITH_AVX2 "Build with AVX2" ON) - option(WITH_AVX512 "Build with AVX512" ON) - option(WITH_AVX512VNNI "Build with AVX512 VNNI extensions" ON) option(WITH_SSE2 "Build with SSE2" ON) - option(WITH_SSSE3 "Build with SSSE3" ON) - option(WITH_SSE42 "Build with SSE42" ON) - option(WITH_PCLMULQDQ "Build with PCLMULQDQ" ON) - option(WITH_VPCLMULQDQ "Build with VPCLMULQDQ" ON) + cmake_dependent_option(WITH_SSSE3 "Build with SSSE3" ON "WITH_SSE2" OFF) + cmake_dependent_option(WITH_SSE42 "Build with SSE42" ON "WITH_SSSE3" OFF) + cmake_dependent_option(WITH_PCLMULQDQ "Build with PCLMULQDQ" ON "WITH_SSE42" OFF) + cmake_dependent_option(WITH_AVX2 "Build with AVX2" ON "WITH_SSE42" OFF) + cmake_dependent_option(WITH_AVX512 "Build with AVX512" ON "WITH_AVX2" OFF) + cmake_dependent_option(WITH_AVX512VNNI "Build with AVX512 VNNI extensions" ON "WITH_AVX512" OFF) + cmake_dependent_option(WITH_VPCLMULQDQ "Build with VPCLMULQDQ" ON "WITH_PCLMULQDQ;WITH_AVX512" OFF) endif() option(INSTALL_UTILS "Copy minigzip and minideflate during install" OFF) @@ -198,6 +204,12 @@ if(CMAKE_C_COMPILER_ID MATCHES "^Intel") set(WARNFLAGS_MAINTAINER /W5) set(WARNFLAGS_DISABLE) endif() + check_c_compiler_flag(-diag-disable=10441 HAVE_DIAG_10441) + if(HAVE_DIAG_10441) + list(APPEND WARNFLAGS_DISABLE "-diag-disable=10441") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -diag-disable=10441") + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -diag-disable=10441") + endif() elseif(MSVC) # Minimum supported MSVC version is 1800 = Visual Studio 12.0/2013 # See also https://cmake.org/cmake/help/latest/variable/MSVC_VERSION.html @@ -208,9 +220,9 @@ elseif(MSVC) # (who'd use cmake from an IDE...) but checking for ICC before checking for MSVC should # avoid mistakes. # /Oi ? - set(WARNFLAGS /W3) + set(WARNFLAGS /W3 /w34242 /WX) set(WARNFLAGS_MAINTAINER /W4) - set(WARNFLAGS_DISABLE) + set(WARNFLAGS_DISABLE /wd4206 /wd4054) if(BASEARCH_ARM_FOUND) add_definitions(-D_ARM_WINAPI_PARTITION_DESKTOP_SDK_AVAILABLE) if(NOT "${ARCH}" MATCHES "aarch64") @@ -280,27 +292,68 @@ endif() # Set native march/mcpu if(WITH_NATIVE_INSTRUCTIONS) - if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") - check_c_compiler_flag(-march=native HAVE_MARCH_NATIVE) - if(HAVE_MARCH_NATIVE) - set(NATIVEFLAG "-march=native") - else() - check_c_compiler_flag(-mcpu=native HAVE_MCPU_NATIVE) - if(HAVE_MCPU_NATIVE) - set(NATIVEFLAG "-mcpu=native") + if(NATIVE_ARCH_OVERRIDE) + message(STATUS "WARNING: WITH_NATIVE_INSTRUCTIONS enabled, but running with NATIVE_ARCH_OVERRIDE: ${NATIVE_ARCH_OVERRIDE}") + set(NATIVEFLAG "${NATIVE_ARCH_OVERRIDE}") + else() + if(CMAKE_C_COMPILER_ID MATCHES "GNU" OR CMAKE_C_COMPILER_ID MATCHES "Clang") + check_c_compiler_flag(-march=native HAVE_MARCH_NATIVE) + if(HAVE_MARCH_NATIVE) + set(NATIVEFLAG "-march=native") + else() + check_c_compiler_flag(-mcpu=native HAVE_MCPU_NATIVE) + if(HAVE_MCPU_NATIVE) + set(NATIVEFLAG "-mcpu=native") + endif() endif() + # Fall through endif() - # Fall through endif() if(NATIVEFLAG) - # Apply flag to all source files and compilation checks - add_compile_options(${NATIVEFLAG}) + # Apply flags to all source files and compilation checks + if(WIN32) + separate_arguments(NATIVEOPTIONS WINDOWS_COMMAND "${NATIVEFLAG}") + else() + separate_arguments(NATIVEOPTIONS UNIX_COMMAND "${NATIVEFLAG}") + endif() + add_compile_options(${NATIVEOPTIONS}) + set(WITH_RUNTIME_CPU_DETECTION OFF) else() message(STATUS "Ignoring WITH_NATIVE_INSTRUCTIONS; not implemented yet on this configuration") set(WITH_NATIVE_INSTRUCTIONS OFF) endif() endif() +# Compile without functable or CPU detection +if(NOT WITH_RUNTIME_CPU_DETECTION) + if(MSVC AND BASEARCH_X86_FOUND) + message(STATUS "WARNING: Microsoft Visual Studio does not support compile time detection of CPU features for \"/arch\" before \"AVX\"") + # Workaround for MSVC. By default MSVC does not define the __SSE*__ macros. + # Fix it if AVX is enabled. + set(CMAKE_REQUIRED_FLAGS "${NATIVEFLAG}") + check_c_source_compiles( + "#ifndef __AVX__ + # error \"AVX is not enabled.\" + #endif + int main(void) { return 0; }" + MSVC_IS_ENABLED_AVX + ) + set(CMAKE_REQUIRED_FLAGS) + if(MSVC_IS_ENABLED_AVX) + add_definitions( + -D__SSE__=1 + -D__SSE2__=1 + -D__SSE3__=1 + -D__SSSE3__=1 + -D__SSE4_1__=1 + -D__SSE4_2__=1 + -D__PCLMUL__=1 + ) + endif() + endif() + add_definitions(-DDISABLE_RUNTIME_CPU_DETECTION) +endif() + # Force disable LTO if WITH_NATIVE_INSTRUCTIONS is not active if(NOT WITH_NATIVE_INSTRUCTIONS) set(CMAKE_INTERPROCEDURAL_OPTIMIZATION OFF) @@ -351,6 +404,14 @@ if(HAVE_SYS_SDT_H) endif() check_include_file(unistd.h HAVE_UNISTD_H) +# +# Check for Linux includes +# +check_include_file(linux/auxvec.h HAVE_LINUX_AUXVEC_H) +if(HAVE_LINUX_AUXVEC_H) + add_definitions(-DHAVE_LINUX_AUXVEC_H) +endif() + # # Check to see if we have large file support # @@ -452,6 +513,22 @@ if(HAVE_ATTRIBUTE_ALIGNED) add_definitions(-DHAVE_ATTRIBUTE_ALIGNED) endif() +# +# Check for __builtin_assume_aligned(x,n) support in the compiler +# +check_c_source_compiles( + "char *test(char *buffer) { + char *abuffer = __builtin_assume_aligned(buffer,64); + return abuffer; + } + int main() { + return 0; + }" + HAVE_BUILTIN_ASSUME_ALIGNED) +if(HAVE_BUILTIN_ASSUME_ALIGNED) + add_definitions(-DHAVE_BUILTIN_ASSUME_ALIGNED) +endif() + # # check for __builtin_ctz() support in the compiler # @@ -515,12 +592,8 @@ add_compile_options($<$:-DZLIB_DEBUG>) if(MSVC) set(CMAKE_DEBUG_POSTFIX "d") - add_definitions (-D_BIND_TO_CURRENT_VCLIBS_VERSION=1) - add_definitions (-D_CRT_SECURE_NO_WARNINGS) - add_definitions (-D_CONSOLE) - add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) add_definitions(-D_CRT_SECURE_NO_DEPRECATE) - include_directories(${CMAKE_CURRENT_SOURCE_DIR}) + add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE) endif() if(BASEARCH_X86_FOUND) @@ -557,14 +630,15 @@ endif() # Enable reduced memory configuration # if(WITH_REDUCED_MEM) - add_definitions(-DHASH_SIZE=32768u -DGZBUFSIZE=8192) + add_definitions(-DHASH_SIZE=32768u -DGZBUFSIZE=8192 -DNO_LIT_MEM) message(STATUS "Configured for reduced memory environment") endif() +set(GENERIC_ARCHDIR "arch/generic") set(ZLIB_ARCH_SRCS) -set(ZLIB_ARCH_HDRS) -set(ARCHDIR "arch/generic") +set(ZLIB_ARCH_HDRS ${GENERIC_ARCHDIR}/generic_functions.h) + if(BASEARCH_ARM_FOUND) set(ARCHDIR "arch/arm") elseif(BASEARCH_PPC_FOUND) @@ -579,6 +653,7 @@ elseif(BASEARCH_X86_FOUND) add_feature_info(SSE2 1 "Support the SSE2 instruction set, using \"${SSE2FLAG}\"") endif() else() + set(ARCHDIR ${GENERIC_ARCHDIR}) message(STATUS "No optimized architecture: using ${ARCHDIR}") endif() @@ -649,13 +724,17 @@ if(WITH_OPTIM) endif() endif() endif() - list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_features.h) - list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/arm_features.c) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_functions.h) + if(WITH_RUNTIME_CPU_DETECTION) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/arm_features.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/arm_features.c) + endif() + if(WITH_ACLE) check_acle_compiler_flag() if(HAVE_ACLE_FLAG) add_definitions(-DARM_ACLE) - set(ACLE_SRCS ${ARCHDIR}/crc32_acle.c ${ARCHDIR}/insert_string_acle.c) + set(ACLE_SRCS ${ARCHDIR}/crc32_acle.c) set_property(SOURCE ${ACLE_SRCS} PROPERTY COMPILE_FLAGS "${ACLEFLAG} ${NOLTOFLAG}") list(APPEND ZLIB_ARCH_SRCS ${ACLE_SRCS}) add_feature_info(ACLE_CRC 1 "Support ACLE optimized CRC hash generation, using \"${ACLEFLAG}\"") @@ -714,10 +793,18 @@ if(WITH_OPTIM) if(WITH_POWER9) check_power9_intrinsics() endif() - if(HAVE_VMX OR HAVE_POWER8_INTRIN OR HAVE_POWER9_INTRIN) + if(POWER8_NEED_AUXVEC_H OR POWER9_NEED_AUXVEC_H) + add_definitions(-DPOWER_NEED_AUXVEC_H) + endif() + if(HAVE_POWER8_INTRIN OR HAVE_POWER9_INTRIN) add_definitions(-DPOWER_FEATURES) - list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/power_features.h) - list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/power_features.c) + endif() + if(HAVE_VMX OR HAVE_POWER8_INTRIN OR HAVE_POWER9_INTRIN) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/power_functions.h) + if(WITH_RUNTIME_CPU_DETECTION) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/power_features.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/power_features.c) + endif() endif() # VMX specific options and files if(WITH_ALTIVEC) @@ -766,11 +853,17 @@ if(WITH_OPTIM) if(HAVE_RVV_INTRIN) add_definitions(-DRISCV_FEATURES) add_definitions(-DRISCV_RVV) - list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/riscv_features.h) - list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/riscv_features.c) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/riscv_functions.h) + if(WITH_RUNTIME_CPU_DETECTION) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/riscv_features.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/riscv_features.c) + endif() # FIXME: we will not set compile flags for riscv_features.c when # the kernels update hwcap or hwprobe for riscv - set(RVV_SRCS ${ARCHDIR}/riscv_features.c ${ARCHDIR}/adler32_rvv.c ${ARCHDIR}/chunkset_rvv.c ${ARCHDIR}/compare256_rvv.c ${ARCHDIR}/slide_hash_rvv.c) + set(RVV_SRCS ${ARCHDIR}/adler32_rvv.c ${ARCHDIR}/chunkset_rvv.c ${ARCHDIR}/compare256_rvv.c ${ARCHDIR}/slide_hash_rvv.c) + if(WITH_RUNTIME_CPU_DETECTION) + list(APPEND RVV_SRCS ${ARCHDIR}/riscv_features.c) + endif() list(APPEND ZLIB_ARCH_SRCS ${RVV_SRCS}) set_property(SOURCE ${RVV_SRCS} PROPERTY COMPILE_FLAGS "${RISCVFLAG} ${NOLTOFLAG}") else() @@ -781,11 +874,11 @@ if(WITH_OPTIM) check_s390_intrinsics() if(HAVE_S390_INTRIN) add_definitions(-DS390_FEATURES) - list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/s390_features.h) - list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/s390_features.c) - endif() - if(WITH_DFLTCC_DEFLATE OR WITH_DFLTCC_INFLATE) - list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/dfltcc_common.c) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/s390_functions.h) + if(WITH_RUNTIME_CPU_DETECTION) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/s390_features.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/s390_features.c) + endif() endif() if(WITH_DFLTCC_DEFLATE) add_definitions(-DS390_DFLTCC_DEFLATE) @@ -808,14 +901,80 @@ if(WITH_OPTIM) endif() elseif(BASEARCH_X86_FOUND) add_definitions(-DX86_FEATURES) - list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_features.h) - list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/x86_features.c) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_functions.h) + if(WITH_RUNTIME_CPU_DETECTION) + list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/x86_features.h) + list(APPEND ZLIB_ARCH_SRCS ${ARCHDIR}/x86_features.c) + endif() if(MSVC) list(APPEND ZLIB_ARCH_HDRS fallback_builtins.h) endif() + check_xsave_intrinsics() + if(HAVE_XSAVE_INTRIN) + add_feature_info(XSAVE 1 "Support XSAVE intrinsics using \"${XSAVEFLAG}\"") + if(WITH_RUNTIME_CPU_DETECTION) + set_property(SOURCE ${ARCHDIR}/x86_features.c PROPERTY COMPILE_FLAGS "${XSAVEFLAG}") + endif() + if(NOT (CMAKE_C_COMPILER_ID MATCHES "GNU" AND CMAKE_C_COMPILER_VERSION VERSION_LESS 8.2)) + add_definitions(-DX86_HAVE_XSAVE_INTRIN) + endif() + endif() + if(WITH_SSE2) + check_sse2_intrinsics() + if(HAVE_SSE2_INTRIN) + add_definitions(-DX86_SSE2) + set(SSE2_SRCS ${ARCHDIR}/chunkset_sse2.c ${ARCHDIR}/compare256_sse2.c ${ARCHDIR}/slide_hash_sse2.c) + list(APPEND ZLIB_ARCH_SRCS ${SSE2_SRCS}) + if(NOT ${ARCH} MATCHES "x86_64") + set_property(SOURCE ${SSE2_SRCS} PROPERTY COMPILE_FLAGS "${SSE2FLAG} ${NOLTOFLAG}") + add_feature_info(FORCE_SSE2 FORCE_SSE2 "Assume CPU is SSE2 capable") + if(FORCE_SSE2) + add_definitions(-DX86_NOCHECK_SSE2) + endif() + endif() + else() + set(WITH_SSE2 OFF) + endif() + endif() + if(WITH_SSSE3) + check_ssse3_intrinsics() + if(HAVE_SSSE3_INTRIN AND WITH_SSE2) + add_definitions(-DX86_SSSE3) + set(SSSE3_SRCS ${ARCHDIR}/adler32_ssse3.c ${ARCHDIR}/chunkset_ssse3.c) + add_feature_info(SSSE3_ADLER32 1 "Support SSSE3-accelerated adler32, using \"${SSSE3FLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${SSSE3_SRCS}) + set_property(SOURCE ${SSSE3_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${NOLTOFLAG}") + else() + set(WITH_SSSE3 OFF) + endif() + endif() + if(WITH_SSE42) + check_sse42_intrinsics() + if(HAVE_SSE42_INTRIN AND WITH_SSSE3) + add_definitions(-DX86_SSE42) + set(SSE42_SRCS ${ARCHDIR}/adler32_sse42.c) + add_feature_info(SSE42_CRC 1 "Support SSE4.2 optimized adler32 hash generation, using \"${SSE42FLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${SSE42_SRCS}) + set_property(SOURCE ${SSE42_SRCS} PROPERTY COMPILE_FLAGS "${SSE42FLAG} ${NOLTOFLAG}") + else() + set(WITH_SSE42 OFF) + endif() + endif() + if(WITH_PCLMULQDQ) + check_pclmulqdq_intrinsics() + if(HAVE_PCLMULQDQ_INTRIN AND WITH_SSE42) + add_definitions(-DX86_PCLMULQDQ_CRC) + set(PCLMULQDQ_SRCS ${ARCHDIR}/crc32_pclmulqdq.c) + add_feature_info(PCLMUL_CRC 1 "Support CRC hash generation using PCLMULQDQ, using \"${SSE42FLAG} ${PCLMULFLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${PCLMULQDQ_SRCS}) + set_property(SOURCE ${PCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${SSE42FLAG} ${PCLMULFLAG} ${NOLTOFLAG}") + else() + set(WITH_PCLMULQDQ OFF) + endif() + endif() if(WITH_AVX2) check_avx2_intrinsics() - if(HAVE_AVX2_INTRIN) + if(HAVE_AVX2_INTRIN AND WITH_SSE42) add_definitions(-DX86_AVX2) set(AVX2_SRCS ${ARCHDIR}/slide_hash_avx2.c) add_feature_info(AVX2_SLIDEHASH 1 "Support AVX2 optimized slide_hash, using \"${AVX2FLAG}\"") @@ -833,15 +992,12 @@ if(WITH_OPTIM) endif() if(WITH_AVX512) check_avx512_intrinsics() - if(HAVE_AVX512_INTRIN) + if(HAVE_AVX512_INTRIN AND WITH_AVX2) add_definitions(-DX86_AVX512) list(APPEND AVX512_SRCS ${ARCHDIR}/adler32_avx512.c) add_feature_info(AVX512_ADLER32 1 "Support AVX512-accelerated adler32, using \"${AVX512FLAG}\"") list(APPEND ZLIB_ARCH_SRCS ${AVX512_SRCS}) list(APPEND ZLIB_ARCH_HDRS ${ARCHDIR}/adler32_avx512_p.h) - if(HAVE_MASK_INTRIN) - add_definitions(-DX86_MASK_INTRIN) - endif() set_property(SOURCE ${AVX512_SRCS} PROPERTY COMPILE_FLAGS "${AVX512FLAG} ${NOLTOFLAG}") else() set(WITH_AVX512 OFF) @@ -849,7 +1005,7 @@ if(WITH_OPTIM) endif() if(WITH_AVX512VNNI) check_avx512vnni_intrinsics() - if(HAVE_AVX512VNNI_INTRIN) + if(HAVE_AVX512VNNI_INTRIN AND WITH_AVX2) add_definitions(-DX86_AVX512VNNI) add_feature_info(AVX512VNNI_ADLER32 1 "Support AVX512VNNI adler32, using \"${AVX512VNNIFLAG}\"") list(APPEND AVX512VNNI_SRCS ${ARCHDIR}/adler32_avx512_vnni.c) @@ -859,82 +1015,17 @@ if(WITH_OPTIM) set(WITH_AVX512VNNI OFF) endif() endif() - if(WITH_SSE42) - check_sse42_intrinsics() - if(HAVE_SSE42_INTRIN) - add_definitions(-DX86_SSE42) - set(SSE42_SRCS ${ARCHDIR}/adler32_sse42.c ${ARCHDIR}/insert_string_sse42.c) - add_feature_info(SSE42_CRC 1 "Support SSE4.2 optimized CRC hash generation, using \"${SSE42FLAG}\"") - list(APPEND ZLIB_ARCH_SRCS ${SSE42_SRCS}) - set_property(SOURCE ${SSE42_SRCS} PROPERTY COMPILE_FLAGS "${SSE42FLAG} ${NOLTOFLAG}") - else() - set(WITH_SSE42 OFF) - endif() - endif() - if(WITH_SSE2) - check_sse2_intrinsics() - if(HAVE_SSE2_INTRIN) - add_definitions(-DX86_SSE2) - set(SSE2_SRCS ${ARCHDIR}/chunkset_sse2.c ${ARCHDIR}/compare256_sse2.c ${ARCHDIR}/slide_hash_sse2.c) - list(APPEND ZLIB_ARCH_SRCS ${SSE2_SRCS}) - if(NOT ${ARCH} MATCHES "x86_64") - set_property(SOURCE ${SSE2_SRCS} PROPERTY COMPILE_FLAGS "${SSE2FLAG} ${NOLTOFLAG}") - add_feature_info(FORCE_SSE2 FORCE_SSE2 "Assume CPU is SSE2 capable") - if(FORCE_SSE2) - add_definitions(-DX86_NOCHECK_SSE2) - endif() - endif() - else() - set(WITH_SSE2 OFF) - endif() - endif() - if(WITH_SSSE3) - check_ssse3_intrinsics() - if(HAVE_SSSE3_INTRIN) - add_definitions(-DX86_SSSE3) - set(SSSE3_SRCS ${ARCHDIR}/adler32_ssse3.c ${ARCHDIR}/chunkset_ssse3.c) - add_feature_info(SSSE3_ADLER32 1 "Support SSSE3-accelerated adler32, using \"${SSSE3FLAG}\"") - list(APPEND ZLIB_ARCH_SRCS ${SSSE3_SRCS}) - set_property(SOURCE ${SSSE3_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${NOLTOFLAG}") - else() - set(WITH_SSSE3 OFF) - endif() - endif() - if(WITH_PCLMULQDQ AND WITH_SSSE3 AND WITH_SSE42) - check_pclmulqdq_intrinsics() - if(HAVE_PCLMULQDQ_INTRIN AND HAVE_SSSE3_INTRIN) - add_definitions(-DX86_PCLMULQDQ_CRC) - set(PCLMULQDQ_SRCS ${ARCHDIR}/crc32_pclmulqdq.c) - add_feature_info(PCLMUL_CRC 1 "Support CRC hash generation using PCLMULQDQ, using \"${SSSE3FLAG} ${SSE42FLAG} ${PCLMULFLAG}\"") - list(APPEND ZLIB_ARCH_SRCS ${PCLMULQDQ_SRCS}) - set_property(SOURCE ${PCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${SSE42FLAG} ${PCLMULFLAG} ${NOLTOFLAG}") - - if(WITH_VPCLMULQDQ AND WITH_AVX512) - check_vpclmulqdq_intrinsics() - if(HAVE_VPCLMULQDQ_INTRIN AND HAVE_AVX512_INTRIN) - add_definitions(-DX86_VPCLMULQDQ_CRC) - set(VPCLMULQDQ_SRCS ${ARCHDIR}/crc32_vpclmulqdq.c) - add_feature_info(VPCLMUL_CRC 1 "Support CRC hash generation using VPCLMULQDQ, using \"${VPCLMULFLAG} ${AVX512FLAG}\"") - list(APPEND ZLIB_ARCH_SRCS ${VPCLMULQDQ_SRCS}) - set_property(SOURCE ${VPCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${SSSE3FLAG} ${SSE42FLAG} ${PCLMULFLAG} ${VPCLMULFLAG} ${AVX512FLAG} ${NOLTOFLAG}") - else() - set(WITH_VPCLMULQDQ OFF) - endif() - else() - set(WITH_VPCLMULQDQ OFF) - endif() + if(WITH_VPCLMULQDQ) + check_vpclmulqdq_intrinsics() + if(HAVE_VPCLMULQDQ_INTRIN AND WITH_PCLMULQDQ AND WITH_AVX512) + add_definitions(-DX86_VPCLMULQDQ_CRC) + set(VPCLMULQDQ_SRCS ${ARCHDIR}/crc32_vpclmulqdq.c) + add_feature_info(VPCLMUL_CRC 1 "Support CRC hash generation using VPCLMULQDQ, using \"${PCLMULFLAG} ${VPCLMULFLAG} ${AVX512FLAG}\"") + list(APPEND ZLIB_ARCH_SRCS ${VPCLMULQDQ_SRCS}) + set_property(SOURCE ${VPCLMULQDQ_SRCS} PROPERTY COMPILE_FLAGS "${PCLMULFLAG} ${VPCLMULFLAG} ${AVX512FLAG} ${NOLTOFLAG}") else() - set(WITH_PCLMULQDQ OFF) set(WITH_VPCLMULQDQ OFF) endif() - else() - set(WITH_PCLMULQDQ OFF) - set(WITH_VPCLMULQDQ OFF) - endif() - check_xsave_intrinsics() - if(HAVE_XSAVE_INTRIN) - add_feature_info(XSAVE 1 "Support XSAVE intrinsics using \"${XSAVEFLAG}\"") - set_property(SOURCE ${ARCHDIR}/x86_features.c PROPERTY COMPILE_FLAGS "${XSAVEFLAG}") endif() endif() endif() @@ -982,6 +1073,19 @@ if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR) endif() endif() +# The user is allowed (but discouraged) to set absolute CMAKE_INSTALL_*DIR paths. +# If they do, we copy these non-relocatable paths into the pkg-config file. +if(IS_ABSOLUTE "${CMAKE_INSTALL_INCLUDEDIR}") + set(PC_INC_INSTALL_DIR "${CMAKE_INSTALL_INCLUDEDIR}") +else() + set(PC_INC_INSTALL_DIR "\${prefix}/${CMAKE_INSTALL_INCLUDEDIR}") +endif() + +if(IS_ABSOLUTE "${CMAKE_INSTALL_LIBDIR}") + set(PC_LIB_INSTALL_DIR "${CMAKE_INSTALL_LIBDIR}") +else() + set(PC_LIB_INSTALL_DIR "\${exec_prefix}/${CMAKE_INSTALL_LIBDIR}") +endif() #----------------------------------------------------------------------------- # Define ZLIB Library @@ -996,11 +1100,10 @@ set(ZLIB_PRIVATE_HDRS adler32_p.h chunkset_tpl.h compare256_rle.h - cpu_features.h + arch_functions.h crc32_braid_p.h crc32_braid_comb_p.h crc32_braid_tbl.h - crc32_fold.h deflate.h deflate_p.h functable.h @@ -1019,15 +1122,17 @@ set(ZLIB_PRIVATE_HDRS zutil.h ) set(ZLIB_SRCS + arch/generic/adler32_c.c + arch/generic/adler32_fold_c.c + arch/generic/chunkset_c.c + arch/generic/compare256_c.c + arch/generic/crc32_braid_c.c + arch/generic/crc32_fold_c.c + arch/generic/slide_hash_c.c adler32.c - adler32_fold.c - chunkset.c - compare256.c compress.c - cpu_features.c - crc32_braid.c + crc32.c crc32_braid_comb.c - crc32_fold.c deflate.c deflate_fast.c deflate_huff.c @@ -1042,12 +1147,16 @@ set(ZLIB_SRCS inftrees.c insert_string.c insert_string_roll.c - slide_hash.c trees.c uncompr.c zutil.c ) +if(WITH_RUNTIME_CPU_DETECTION) + list(APPEND ZLIB_PRIVATE_HDRS cpu_features.h) + list(APPEND ZLIB_SRCS cpu_features.c) +endif() + set(ZLIB_GZFILE_PRIVATE_HDRS gzguts.h ) @@ -1074,6 +1183,10 @@ endif() set_global_variable (ZLIB_LIBRARIES_TO_EXPORT "zlib-static") set (install_targets zlib-static) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}) +include_directories(${ARCHDIR}) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/arch/generic) + #----------------------------------------------------------------------------- # Compiler specific flags #----------------------------------------------------------------------------- @@ -1106,9 +1219,12 @@ else() SET(ZCONF_PTRDIFF_LINE "#ifdef NEED_PTRDIFF_T /* may be set to #if 1 by configure/cmake/etc */") endif() +set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib${SUFFIX}.pc) if(WITH_GZFILEOP) set(PKG_CONFIG_CFLAGS "-DWITH_GZFILEOP") endif() +configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein + ${ZLIB_PC} @ONLY) configure_file(${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h.cmakein ${CMAKE_CURRENT_BINARY_DIR}/zconf${SUFFIX}.h @ONLY) configure_file(${CMAKE_CURRENT_SOURCE_DIR}/zlib${SUFFIX}.h.in @@ -1235,6 +1351,7 @@ add_feature_info(WITH_OPTIM WITH_OPTIM "Build with optimisation") add_feature_info(WITH_NEW_STRATEGIES WITH_NEW_STRATEGIES "Use new strategies") add_feature_info(WITH_NATIVE_INSTRUCTIONS WITH_NATIVE_INSTRUCTIONS "Instruct the compiler to use the full instruction set on this host (gcc/clang -march=native)") +add_feature_info(WITH_RUNTIME_CPU_DETECTION WITH_RUNTIME_CPU_DETECTION "Build with runtime CPU detection") add_feature_info(WITH_MAINTAINER_WARNINGS WITH_MAINTAINER_WARNINGS "Build with project maintainer warnings") add_feature_info(WITH_CODE_COVERAGE WITH_CODE_COVERAGE "Enable code coverage reporting") add_feature_info(WITH_INFLATE_STRICT WITH_INFLATE_STRICT "Build with strict inflate distance checking") diff --git a/config/cmake/cacheinit.cmake b/config/cmake/cacheinit.cmake index 75936d1d298..851e7c5987e 100644 --- a/config/cmake/cacheinit.cmake +++ b/config/cmake/cacheinit.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -47,15 +47,15 @@ set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT TGZ) # compression options ######################## set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE) -set (ZLIB_TGZ_NAME "zlib-1.3.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) -set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3" CACHE STRING "Use ZLIB from original location" FORCE) +set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3.1" CACHE STRING "Use ZLIB from original location" FORCE) set (ZLIB_USE_LOCALCONTENT ON CACHE BOOL "Use local file for ZLIB FetchContent" FORCE) set (ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) set (HDF5_USE_ZLIB_STATIC ON CACHE BOOL "Use static zlib library" FORCE) set (ZLIBNG_PACKAGE_NAME "zlib-ng" CACHE STRING "Name of ZLIBNG package" FORCE) -set (ZLIBNG_TGZ_NAME "2.1.6.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIBNG_TGZ_NAME "2.2.2.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) set (ZLIBNG_TGZ_ORIGPATH "https://github.com/zlib-ng/zlib-ng/archive/refs/tags" CACHE STRING "Use ZLIBNG from original location" FORCE) set (ZLIBNG_GIT_URL "https://github.com/zlib-ng/zlib-ng.git" CACHE STRING "Use ZLIBNG from GitHub repository" FORCE) set (ZLIBNG_GIT_BRANCH "develop" CACHE STRING "" FORCE) @@ -106,7 +106,7 @@ set (BLOSC_GIT_URL "https://github.com/Blosc/c-blosc.git" CACHE STRING "Use BLOS set (BLOSC_GIT_BRANCH "main" CACHE STRING "" FORCE) set (BLOSC_TGZ_ORIGPATH "https://github.com/Blosc/c-blosc/archive/refs/tags" CACHE STRING "Use PLUGINS from original location" FORCE) -set (BLOSC_TGZ_NAME "c-blosc-1.21.5.tar.gz" CACHE STRING "Use BLOSC from compressed file" FORCE) +set (BLOSC_TGZ_NAME "c-blosc-1.21.6.tar.gz" CACHE STRING "Use BLOSC from compressed file" FORCE) set (BLOSC_PACKAGE_NAME "blosc" CACHE STRING "Name of BLOSC package" FORCE) @@ -126,7 +126,7 @@ set (BLOSC2_GIT_URL "https://github.com/Blosc/c-blosc2.git" CACHE STRING "Use BL set (BLOSC2_GIT_BRANCH "main" CACHE STRING "" FORCE) set (BLOSC2_TGZ_ORIGPATH "https://github.com/Blosc/c-blosc2/archive/refs/tags" CACHE STRING "Use PLUGINS from original location" FORCE) -set (BLOSC2_TGZ_NAME "c-blosc2-2.14.4.tar.gz" CACHE STRING "Use BLOSC2 from compressed file" FORCE) +set (BLOSC2_TGZ_NAME "c-blosc2-2.15.1.tar.gz" CACHE STRING "Use BLOSC2 from compressed file" FORCE) set (BLOSC2_PACKAGE_NAME "blosc2" CACHE STRING "Name of BLOSC2 package" FORCE) @@ -183,8 +183,8 @@ set (BUILD_LZ4_LIBRARY_SOURCE ON CACHE BOOL "build the lz4 library within the pl set (LZ4_GIT_URL "https://github.com/lz4/lz4.git" CACHE STRING "Use LZ4 from GitHub repository" FORCE) set (LZ4_GIT_BRANCH "dev" CACHE STRING "" FORCE) -set (LZ4_TGZ_ORIGPATH "https://github.com/lz4/lz4/releases/download/v1.9.4" CACHE STRING "Use PLUGINS from original location" FORCE) -set (LZ4_TGZ_NAME "lz4-1.9.4.tar.gz" CACHE STRING "Use LZ4 from compressed file" FORCE) +set (LZ4_TGZ_ORIGPATH "https://github.com/lz4/lz4/releases/download/v1.10.0" CACHE STRING "Use PLUGINS from original location" FORCE) +set (LZ4_TGZ_NAME "lz4-1.10.0.tar.gz" CACHE STRING "Use LZ4 from compressed file" FORCE) set (LZ4_PACKAGE_NAME "lz4" CACHE STRING "Name of LZ4 package" FORCE) @@ -229,7 +229,7 @@ set (ZFP_GIT_URL "https://github.com/LLNL/zfp.git" CACHE STRING "Use ZFP from G set (ZFP_GIT_BRANCH "develop" CACHE STRING "" FORCE) set (ZFP_TGZ_ORIGPATH "https://github.com/LLNL/zfp/releases/download/1.0.0" CACHE STRING "Use PLUGINS from original location" FORCE) -set (ZFP_TGZ_NAME "zfp-1.0.0.tar.gz" CACHE STRING "Use ZFP from compressed file" FORCE) +set (ZFP_TGZ_NAME "zfp-1.0.1.tar.gz" CACHE STRING "Use ZFP from compressed file" FORCE) set (ZFP_PACKAGE_NAME "zfp" CACHE STRING "Name of ZFP package" FORCE) @@ -240,7 +240,7 @@ set (ZFP_PACKAGE_NAME "zfp" CACHE STRING "Name of ZFP package" FORCE) set (ZSTD_GIT_URL "https://github.com/facebook/zstd.git" CACHE STRING "Use ZSTD from GitHub repository" FORCE) set (ZSTD_GIT_BRANCH "dev" CACHE STRING "" FORCE) -set (ZSTD_TGZ_ORIGPATH "https://github.com/facebook/zstd/releases/download/v1.5.5" CACHE STRING "Use PLUGINS from original location" FORCE) -set (ZSTD_TGZ_NAME "zstd-1.5.5.tar.gz" CACHE STRING "Use ZSTD from compressed file" FORCE) +set (ZSTD_TGZ_ORIGPATH "https://github.com/facebook/zstd/releases/download/v1.5.6" CACHE STRING "Use PLUGINS from original location" FORCE) +set (ZSTD_TGZ_NAME "zstd-1.5.6.tar.gz" CACHE STRING "Use ZSTD from compressed file" FORCE) set (ZSTD_PACKAGE_NAME "zstd" CACHE STRING "Name of ZSTD package" FORCE) diff --git a/config/cmake/examples/CTestScript.cmake b/config/cmake/examples/CTestScript.cmake index 5e7259d7cf9..7f50564b454 100644 --- a/config/cmake/examples/CTestScript.cmake +++ b/config/cmake/examples/CTestScript.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/examples/HDF5_Examples.cmake.in b/config/cmake/examples/HDF5_Examples.cmake.in index c929df7b802..bef5aae8e89 100644 --- a/config/cmake/examples/HDF5_Examples.cmake.in +++ b/config/cmake/examples/HDF5_Examples.cmake.in @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/examples/HDF5_Examples_options.cmake b/config/cmake/examples/HDF5_Examples_options.cmake index 2fe145c4704..1f18ae489af 100644 --- a/config/cmake/examples/HDF5_Examples_options.cmake +++ b/config/cmake/examples/HDF5_Examples_options.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -14,13 +14,14 @@ #### format: set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DXXX:YY=ZZZZ") ### #### DEFAULT: ### #### BUILD_SHARED_LIBS:BOOL=OFF ### -#### H5EX_BUILD_C:BOOL=ON ### -#### H5EX_BUILD_CXX:BOOL=OFF ### -#### H5EX_BUILD_FORTRAN:BOOL=OFF ### -#### H5EX_BUILD_JAVA:BOOL=OFF ### -#### H5EX_BUILD_FILTERS:BOOL=OFF ### -#### H5EX_BUILD_TESTING:BOOL=OFF ### -#### H5EX_ENABLE_PARALLEL:BOOL=OFF ### +#### H5EX_BUILD_C:BOOL=ON ### +#### H5EX_BUILD_HL:BOOL=ON ### +#### H5EX_BUILD_CXX:BOOL=OFF ### +#### H5EX_BUILD_FORTRAN:BOOL=OFF ### +#### H5EX_BUILD_JAVA:BOOL=OFF ### +#### H5EX_BUILD_FILTERS:BOOL=OFF ### +#### H5EX_BUILD_TESTING:BOOL=OFF ### +#### H5EX_ENABLE_PARALLEL:BOOL=OFF ### ############################################################################################# ### uncomment/comment and change the following lines for other configuration options @@ -45,6 +46,9 @@ ### disable C builds #set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DH5EX_BUILD_C:BOOL=OFF") +### enable HL builds +#set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DH5EX_BUILD_HL:BOOL=ON") + ### enable C++ builds #set(ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DH5EX_BUILD_CXX:BOOL=ON") diff --git a/config/cmake/fileCompareTest.cmake b/config/cmake/fileCompareTest.cmake index 5cd56ee06e1..3483b15cefd 100644 --- a/config/cmake/fileCompareTest.cmake +++ b/config/cmake/fileCompareTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/grepTest.cmake b/config/cmake/grepTest.cmake index 44aa1975510..05014142ec3 100644 --- a/config/cmake/grepTest.cmake +++ b/config/cmake/grepTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/hdf5-config-version.cmake.in b/config/cmake/hdf5-config-version.cmake.in index 20ce630351a..b1b71cd64e9 100644 --- a/config/cmake/hdf5-config-version.cmake.in +++ b/config/cmake/hdf5-config-version.cmake.in @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/hdf5-config.cmake.in b/config/cmake/hdf5-config.cmake.in index 325492ca9ec..02286b701a6 100644 --- a/config/cmake/hdf5-config.cmake.in +++ b/config/cmake/hdf5-config.cmake.in @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -49,17 +49,16 @@ set (${HDF5_PACKAGE_NAME}_BUILD_STATIC_LIBS @H5_ENABLE_STATIC_LIB@) set (${HDF5_PACKAGE_NAME}_ENABLE_THREADS @HDF5_ENABLE_THREADS@) set (${HDF5_PACKAGE_NAME}_ENABLE_THREADSAFE @HDF5_ENABLE_THREADSAFE@) set (${HDF5_PACKAGE_NAME}_ENABLE_PARALLEL @HDF5_ENABLE_PARALLEL@) -set (${HDF5_PACKAGE_NAME}_DEFAULT_API_VERSION "@DEFAULT_API_VERSION@") +set (${HDF5_PACKAGE_NAME}_DEFAULT_API_VERSION "@HDF5_DEFAULT_API_VERSION@") set (${HDF5_PACKAGE_NAME}_ENABLE_DEPRECATED_SYMBOLS @HDF5_ENABLE_DEPRECATED_SYMBOLS@) set (${HDF5_PACKAGE_NAME}_BUILD_DIMENSION_SCALES_WITH_NEW_REF @DIMENSION_SCALES_WITH_NEW_REF@) #----------------------------------------------------------------------------- set (${HDF5_PACKAGE_NAME}_BUILD_TOOLS @HDF5_BUILD_TOOLS@) -set (${HDF5_PACKAGE_NAME}_BUILD_HL_GIF_TOOLS @HDF5_BUILD_HL_GIF_TOOLS@) set (${HDF5_PACKAGE_NAME}_BUILD_STATIC_TOOLS @HDF5_BUILD_STATIC_TOOLS@) #----------------------------------------------------------------------------- set (${HDF5_PACKAGE_NAME}_ENABLE_NONSTANDARD_FEATURE_FLOAT16 @HDF5_ENABLE_NONSTANDARD_FEATURE_FLOAT16@) #----------------------------------------------------------------------------- -set (${HDF5_PACKAGE_NAME}_ENABLE_Z_LIB_SUPPORT @HDF5_ENABLE_Z_LIB_SUPPORT@) +set (${HDF5_PACKAGE_NAME}_ENABLE_ZLIB_SUPPORT @HDF5_ENABLE_ZLIB_SUPPORT@) set (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_SUPPORT @HDF5_ENABLE_SZIP_SUPPORT@) set (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_ENCODING @HDF5_ENABLE_SZIP_ENCODING@) #----------------------------------------------------------------------------- @@ -142,7 +141,7 @@ set (${HDF5_PACKAGE_NAME}_VERSION_MINOR @HDF5_VERSION_MINOR@) # project which has already built hdf5 as a subproject #----------------------------------------------------------------------------- if (NOT TARGET "@HDF5_PACKAGE@") - if (${HDF5_PACKAGE_NAME}_ENABLE_Z_LIB_SUPPORT AND ${HDF5_PACKAGE_NAME}_PACKAGE_EXTLIBS) + if (${HDF5_PACKAGE_NAME}_ENABLE_ZLIB_SUPPORT AND ${HDF5_PACKAGE_NAME}_PACKAGE_EXTLIBS) include (@PACKAGE_SHARE_INSTALL_DIR@/@ZLIB_PACKAGE_NAME@@HDF_PACKAGE_EXT@-targets.cmake) endif () if (${HDF5_PACKAGE_NAME}_ENABLE_SZIP_SUPPORT AND ${HDF5_PACKAGE_NAME}_PACKAGE_EXTLIBS) diff --git a/config/cmake/jrunTest.cmake b/config/cmake/jrunTest.cmake index d7d83d4f709..95b2648dc48 100644 --- a/config/cmake/jrunTest.cmake +++ b/config/cmake/jrunTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/libh5cc.in b/config/cmake/libh5cc.in index 9bdce64f7df..2608f49423a 100644 --- a/config/cmake/libh5cc.in +++ b/config/cmake/libh5cc.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/mccacheinit.cmake b/config/cmake/mccacheinit.cmake index caa1fe034fe..e7150f0e834 100644 --- a/config/cmake/mccacheinit.cmake +++ b/config/cmake/mccacheinit.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -31,7 +31,7 @@ set (HDF5_BUILD_TOOLS ON CACHE BOOL "Build HDF5 Tools" FORCE) set (HDF5_BUILD_EXAMPLES ON CACHE BOOL "Build HDF5 Library Examples" FORCE) -set (HDF5_ENABLE_Z_LIB_SUPPORT ON CACHE BOOL "Enable Zlib Filters" FORCE) +set (HDF5_ENABLE_ZLIB_SUPPORT ON CACHE BOOL "Enable Zlib Filters" FORCE) set (HDF5_ENABLE_SZIP_SUPPORT OFF CACHE BOOL "Use SZip Filter" FORCE) @@ -54,14 +54,14 @@ set_property (CACHE HDF5_ALLOW_EXTERNAL_SUPPORT PROPERTY STRINGS NO GIT TGZ) # compression options ######################## set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE) -set (ZLIB_TGZ_NAME "zlib-1.3.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) -set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3" CACHE STRING "Use ZLIB from original location" FORCE) +set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3.1" CACHE STRING "Use ZLIB from original location" FORCE) set (ZLIB_USE_LOCALCONTENT ON CACHE BOOL "Use local file for ZLIB FetchContent" FORCE) set (ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) set (ZLIBNG_PACKAGE_NAME "zlib-ng" CACHE STRING "Name of ZLIBNG package" FORCE) -set (ZLIBNG_TGZ_NAME "2.1.6.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) +set (ZLIBNG_TGZ_NAME "2.2.2.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) set (ZLIBNG_TGZ_ORIGPATH "https://github.com/zlib-ng/zlib-ng/archive/refs/tags" CACHE STRING "Use ZLIBNG from original location" FORCE) set (ZLIBNG_GIT_URL "https://github.com/zlib-ng/zlib-ng.git" CACHE STRING "Use ZLIBNG from GitHub repository" FORCE) set (ZLIBNG_GIT_BRANCH "develop" CACHE STRING "" FORCE) diff --git a/config/cmake/runTest.cmake b/config/cmake/runTest.cmake index 8eed074ecb6..3ab9e940d28 100644 --- a/config/cmake/runTest.cmake +++ b/config/cmake/runTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/scripts/CTestScript.cmake b/config/cmake/scripts/CTestScript.cmake index 45ca77b73d9..7861c5d69f0 100644 --- a/config/cmake/scripts/CTestScript.cmake +++ b/config/cmake/scripts/CTestScript.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/scripts/HDF5config.cmake b/config/cmake/scripts/HDF5config.cmake index 485871c5816..3da5f0ecd5e 100644 --- a/config/cmake/scripts/HDF5config.cmake +++ b/config/cmake/scripts/HDF5config.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -38,15 +38,15 @@ cmake_minimum_required (VERSION 3.18) # CTEST_SOURCE_NAME - source folder ############################################################################## -set (CTEST_SOURCE_VERSION "1.17.0") +set (CTEST_SOURCE_VERSION "2.0.0") set (CTEST_SOURCE_VERSEXT "") ############################################################################## # handle input parameters to script. #BUILD_GENERATOR - which CMake generator to use, required -#INSTALLDIR - HDF5-1.17.x root folder +#INSTALLDIR - HDF5-2.0.x root folder #CTEST_CONFIGURATION_TYPE - Release, Debug, RelWithDebInfo -#CTEST_SOURCE_NAME - name of source folder; HDF5-1.17.x +#CTEST_SOURCE_NAME - name of source folder; HDF5-2.0.x #MODEL - CDash group name #HPC - run alternate configurations for HPC machines; sbatch, bsub, raybsub, qsub #MPI - enable MPI diff --git a/config/cmake/scripts/HDF5options.cmake b/config/cmake/scripts/HDF5options.cmake index 179c91f59e9..50bdd844e70 100644 --- a/config/cmake/scripts/HDF5options.cmake +++ b/config/cmake/scripts/HDF5options.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -32,7 +32,7 @@ #### Only build static libraries #### #set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DBUILD_SHARED_LIBS:BOOL=OFF") #### Only build shared libraries #### -#set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DONLY_SHARED_LIBS:BOOL=OFF") +#set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ONLY_SHARED_LIBS:BOOL=OFF") #### Add PIC option on linux/mac #### #set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DCMAKE_ANSI_CFLAGS:STRING=-fPIC") @@ -67,7 +67,7 @@ set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ALLOW_EXTERNAL_SUPPORT:STRIN #set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DH5_SZIP_LIBRARY:FILEPATH=some_location/lib/szlib.lib -DH5_SZIP_INCLUDE_DIR:PATH=some_location/include") ### disable using ext zlib -#set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF") +#set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF") ### disable using ext szip #set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF") #set (ADD_BUILD_OPTIONS "${ADD_BUILD_OPTIONS} -DHDF5_ENABLE_SZIP_ENCODING:BOOL=OFF") diff --git a/config/cmake/scripts/HPC/bsub-HDF5options.cmake b/config/cmake/scripts/HPC/bsub-HDF5options.cmake index 37fdb8b66d2..167915dcd66 100644 --- a/config/cmake/scripts/HPC/bsub-HDF5options.cmake +++ b/config/cmake/scripts/HPC/bsub-HDF5options.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/scripts/HPC/qsub-HDF5options.cmake b/config/cmake/scripts/HPC/qsub-HDF5options.cmake index fe335467c61..8c716be46a9 100644 --- a/config/cmake/scripts/HPC/qsub-HDF5options.cmake +++ b/config/cmake/scripts/HPC/qsub-HDF5options.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/scripts/HPC/raybsub-HDF5options.cmake b/config/cmake/scripts/HPC/raybsub-HDF5options.cmake index 89ce4f06b5d..60010584131 100644 --- a/config/cmake/scripts/HPC/raybsub-HDF5options.cmake +++ b/config/cmake/scripts/HPC/raybsub-HDF5options.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/scripts/HPC/sbatch-HDF5options.cmake b/config/cmake/scripts/HPC/sbatch-HDF5options.cmake index ddf4858170a..2c8f89f6c2f 100644 --- a/config/cmake/scripts/HPC/sbatch-HDF5options.cmake +++ b/config/cmake/scripts/HPC/sbatch-HDF5options.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/userblockTest.cmake b/config/cmake/userblockTest.cmake index dde66c9edb7..48a9ee2c55a 100644 --- a/config/cmake/userblockTest.cmake +++ b/config/cmake/userblockTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/vfdTest.cmake b/config/cmake/vfdTest.cmake index fadc67f94ca..7ab39d1b0d6 100644 --- a/config/cmake/vfdTest.cmake +++ b/config/cmake/vfdTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/cmake/volTest.cmake b/config/cmake/volTest.cmake index a47c3e94f34..9a29e1a6390 100644 --- a/config/cmake/volTest.cmake +++ b/config/cmake/volTest.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/commence.am b/config/commence.am index 11db41f133e..392356b59e0 100644 --- a/config/commence.am +++ b/config/commence.am @@ -6,7 +6,7 @@ ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. diff --git a/config/conclude.am b/config/conclude.am index 9b73ae77792..5ef0fc7e355 100644 --- a/config/conclude.am +++ b/config/conclude.am @@ -6,7 +6,7 @@ ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. diff --git a/config/conclude_fc.am b/config/conclude_fc.am index d26016a03c7..f87c1f07991 100644 --- a/config/conclude_fc.am +++ b/config/conclude_fc.am @@ -6,7 +6,7 @@ ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. diff --git a/config/cygwin b/config/cygwin index b028e702670..33a21f46d76 100644 --- a/config/cygwin +++ b/config/cygwin @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/examples.am b/config/examples.am index 09a9a244c9b..a51b472bf7d 100644 --- a/config/examples.am +++ b/config/examples.am @@ -6,7 +6,7 @@ ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. diff --git a/config/freebsd b/config/freebsd index 70cf44a07ac..70b66fbd4c9 100644 --- a/config/freebsd +++ b/config/freebsd @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/gnu-cxxflags b/config/gnu-cxxflags index f409ab416c5..7e80a49a03a 100644 --- a/config/gnu-cxxflags +++ b/config/gnu-cxxflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/gnu-fflags b/config/gnu-fflags index b3385ec8836..c1beb31cb4d 100644 --- a/config/gnu-fflags +++ b/config/gnu-fflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/gnu-flags b/config/gnu-flags index 546f601e3c0..658475c0aba 100644 --- a/config/gnu-flags +++ b/config/gnu-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -117,18 +117,15 @@ if test "X-gcc" = "X-$cc_vendor"; then esac case "$host_os-$host_cpu" in - # Cygwin needs the "-std=c99" flag removed. - cygwin-*) - ;; - # On Solaris, gcc needs the gnu99 standard to pick up certain POSIX + # On Solaris, gcc needs the gnu11 standard to pick up certain POSIX # things. Do NOT use this as the gcc norm as this encourages the use # of non-standard gcc extensions. *solaris*) - H5_CFLAGS="$H5_CFLAGS -std=gnu99" + H5_CFLAGS="$H5_CFLAGS -std=gnu11" ;; - # Everybody else gets c99 as the standard. + # Everybody else gets C11 as the standard. *) - H5_CFLAGS="$H5_CFLAGS -std=c99" + H5_CFLAGS="$H5_CFLAGS -std=c11" ;; esac diff --git a/config/ibm-aix b/config/ibm-aix index bd486af8e27..d0f34239a94 100644 --- a/config/ibm-aix +++ b/config/ibm-aix @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/ibm-flags b/config/ibm-flags index 37ecd20d1f5..fd25f2f017e 100644 --- a/config/ibm-flags +++ b/config/ibm-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/intel-cxxflags b/config/intel-cxxflags index 8db550dc4a6..ae3c9ff0feb 100644 --- a/config/intel-cxxflags +++ b/config/intel-cxxflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/intel-fflags b/config/intel-fflags index b6307c1bedb..c6d88843855 100644 --- a/config/intel-fflags +++ b/config/intel-fflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/intel-flags b/config/intel-flags index 725ba625128..3f069319331 100644 --- a/config/intel-flags +++ b/config/intel-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/linux-gnu b/config/linux-gnu index b4139ee1a58..bbbcf51ee1e 100644 --- a/config/linux-gnu +++ b/config/linux-gnu @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/lt_vers.am b/config/lt_vers.am index 7ef44760918..559d1ff1950 100644 --- a/config/lt_vers.am +++ b/config/lt_vers.am @@ -6,7 +6,7 @@ ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. diff --git a/config/netbsd b/config/netbsd index 0ed84f7b3d2..27020d46258 100644 --- a/config/netbsd +++ b/config/netbsd @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/nvidia-cxxflags b/config/nvidia-cxxflags index 6becd26887a..dfac0f74cf8 100644 --- a/config/nvidia-cxxflags +++ b/config/nvidia-cxxflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/nvidia-fflags b/config/nvidia-fflags index 77677e1036a..a6879468058 100644 --- a/config/nvidia-fflags +++ b/config/nvidia-fflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/nvidia-flags b/config/nvidia-flags index 39bca831314..cff61c6ecca 100644 --- a/config/nvidia-flags +++ b/config/nvidia-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -68,8 +68,8 @@ if test "X-nvc" = "X-$cc_vendor" -o "X-nvcc" = "X-$cc_vendor"; then # General # ########### - # Default to C99 standard. - H5_CFLAGS="$H5_CFLAGS $arch -c99 -Minform=warn" + # Default to C11 standard. + H5_CFLAGS="$H5_CFLAGS $arch -std=c11 -Minform=warn" ############## # Production # diff --git a/config/oneapi-cxxflags b/config/oneapi-cxxflags index d9819b94c44..f8d873509a1 100644 --- a/config/oneapi-cxxflags +++ b/config/oneapi-cxxflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/oneapi-fflags b/config/oneapi-fflags index a63108d0b99..1bd64bcb738 100644 --- a/config/oneapi-fflags +++ b/config/oneapi-fflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/oneapi-flags b/config/oneapi-flags index 629e93f02f1..49607a04e11 100644 --- a/config/oneapi-flags +++ b/config/oneapi-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -80,8 +80,8 @@ if test "X-icx" = "X-$cc_vendor"; then # General # ########### - # Default to C99 standard. - H5_CFLAGS="$H5_CFLAGS $arch -std=c99" + # Default to C11 standard. + H5_CFLAGS="$H5_CFLAGS $arch -std=c11" ############## # Production # diff --git a/config/pgi-cxxflags b/config/pgi-cxxflags index 7d8bdeb3077..d513f2dff1d 100644 --- a/config/pgi-cxxflags +++ b/config/pgi-cxxflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/pgi-fflags b/config/pgi-fflags index 5ec8368beea..55588fff846 100644 --- a/config/pgi-fflags +++ b/config/pgi-fflags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/pgi-flags b/config/pgi-flags index 19dd912f183..7c9f5ae726b 100644 --- a/config/pgi-flags +++ b/config/pgi-flags @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/sanitizer/README.md b/config/sanitizer/README.md index 62202ffa7ec..a5ce6494a61 100644 --- a/config/sanitizer/README.md +++ b/config/sanitizer/README.md @@ -54,7 +54,7 @@ A quick rundown of the tools available, and what they do: - [MemorySanitizer](https://clang.llvm.org/docs/MemorySanitizer.html) detects uninitialized reads. - [Control Flow Integrity](https://clang.llvm.org/docs/ControlFlowIntegrity.html) is designed to detect certain forms of undefined behaviour that can potentially allow attackers to subvert the program's control flow. -These are used by declaring the `USE_SANITIZER` CMake variable as string containing any of: +These are used by declaring the `HDF5_USE_SANITIZER` CMake variable as string containing any of: - Address - Memory - MemoryWithOrigins @@ -63,7 +63,7 @@ These are used by declaring the `USE_SANITIZER` CMake variable as string contain - Leak - CFI -Multiple values are allowed, e.g. `-DUSE_SANITIZER=Address,Leak` but some sanitizers cannot be combined together, e.g.`-DUSE_SANITIZER=Address,Memory` will result in configuration error. The delimiter character is not required and `-DUSE_SANITIZER=AddressLeak` would work as well. +Multiple values are allowed, e.g. `-DHDF5_USE_SANITIZER=Address,Leak` but some sanitizers cannot be combined together, e.g.`-DHDF5_USE_SANITIZER=Address,Memory` will result in configuration error. The delimiter character is not required and `-DHDF5_USE_SANITIZER=AddressLeak` would work as well. ## Code Coverage [`code-coverage.cmake`](code-coverage.cmake) diff --git a/config/sanitizer/code-coverage.cmake b/config/sanitizer/code-coverage.cmake index 54a33deda3f..5249ed05af1 100644 --- a/config/sanitizer/code-coverage.cmake +++ b/config/sanitizer/code-coverage.cmake @@ -81,9 +81,13 @@ option( # Programs find_program(LLVM_COV_PATH llvm-cov) +message(VERBOSE "program llvm-cov=${LLVM_COV_PATH}") find_program(LLVM_PROFDATA_PATH llvm-profdata) +message(VERBOSE "program llvm-profdata=${LLVM_PROFDATA_PATH}") find_program(LCOV_PATH lcov) +message(VERBOSE "program lcov=${LCOV_PATH}") find_program(GENHTML_PATH genhtml) +message(VERBOSE "program genhtml=${GENHTML_PATH}") # Hide behind the 'advanced' mode flag for GUI/ccmake mark_as_advanced(FORCE LLVM_COV_PATH LLVM_PROFDATA_PATH LCOV_PATH GENHTML_PATH) diff --git a/config/sanitizer/sanitizers.cmake b/config/sanitizer/sanitizers.cmake index dea9f099f06..fa5d1059aeb 100644 --- a/config/sanitizer/sanitizers.cmake +++ b/config/sanitizer/sanitizers.cmake @@ -13,7 +13,7 @@ # License for the specific language governing permissions and limitations under # the License. -set(USE_SANITIZER +set(HDF5_USE_SANITIZER "" CACHE STRING @@ -50,8 +50,8 @@ function(test_san_flags return_var flags) set(CMAKE_REQUIRED_QUIET "${QUIET_BACKUP}") endfunction() -message(STATUS "USE_SANITIZER=${USE_SANITIZER}, CMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}") -if(USE_SANITIZER) +message(STATUS "HDF5_USE_SANITIZER=${HDF5_USE_SANITIZER}, CMAKE_C_COMPILER_ID=${CMAKE_C_COMPILER_ID}") +if(HDF5_USE_SANITIZER) if(CMAKE_C_COMPILER_ID MATCHES "IntelLLVM" OR CMAKE_C_COMPILER_ID MATCHES "[Cc]lang") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) @@ -65,7 +65,7 @@ if(USE_SANITIZER) append("-O1" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) endif() - if(USE_SANITIZER MATCHES "([Aa]ddress)") + if(HDF5_USE_SANITIZER MATCHES "([Aa]ddress)") # Optional: -fno-optimize-sibling-calls -fsanitize-address-use-after-scope message(STATUS "Testing with Address sanitizer") set(SANITIZER_ADDR_FLAG "-fsanitize=address") @@ -85,9 +85,9 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Mm]emory([Ww]ith[Oo]rigins)?)") + if(HDF5_USE_SANITIZER MATCHES "([Mm]emory([Ww]ith[Oo]rigins)?)") set(SANITIZER_MEM_FLAG "-fsanitize=memory") - if(USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") + if(HDF5_USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") message(STATUS "Testing with MemoryWithOrigins sanitizer") append("-fno-optimize-sibling-calls -fsanitize-memory-track-origins=2" SANITIZER_MEM_FLAG) else() @@ -95,7 +95,7 @@ if(USE_SANITIZER) endif() test_san_flags(SANITIZER_MEM_AVAILABLE ${SANITIZER_MEM_FLAG}) if(SANITIZER_MEM_AVAILABLE) - if(USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") + if(HDF5_USE_SANITIZER MATCHES "([Mm]emory[Ww]ith[Oo]rigins)") message(STATUS " Building with MemoryWithOrigins sanitizer") else() message(STATUS " Building with Memory sanitizer") @@ -113,7 +113,7 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Uu]ndefined)") + if(HDF5_USE_SANITIZER MATCHES "([Uu]ndefined)") message(STATUS "Testing with Undefined Behaviour sanitizer") set(SANITIZER_UB_FLAG "-fsanitize=undefined") if(EXISTS "${BLACKLIST_FILE}") @@ -132,7 +132,7 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Tt]hread)") + if(HDF5_USE_SANITIZER MATCHES "([Tt]hread)") message(STATUS "Testing with Thread sanitizer") set(SANITIZER_THREAD_FLAG "-fsanitize=thread") test_san_flags(SANITIZER_THREAD_AVAILABLE ${SANITIZER_THREAD_FLAG}) @@ -148,7 +148,7 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Ll]eak)") + if(HDF5_USE_SANITIZER MATCHES "([Ll]eak)") message(STATUS "Testing with Leak sanitizer") set(SANITIZER_LEAK_FLAG "-fsanitize=leak") test_san_flags(SANITIZER_LEAK_AVAILABLE ${SANITIZER_LEAK_FLAG}) @@ -164,7 +164,7 @@ if(USE_SANITIZER) endif() endif() - if(USE_SANITIZER MATCHES "([Cc][Ff][Ii])") + if(HDF5_USE_SANITIZER MATCHES "([Cc][Ff][Ii])") message(STATUS "Testing with Control Flow Integrity(CFI) sanitizer") set(SANITIZER_CFI_FLAG "-fsanitize=cfi") test_san_flags(SANITIZER_CFI_AVAILABLE ${SANITIZER_CFI_FLAG}) @@ -186,10 +186,10 @@ if(USE_SANITIZER) message(STATUS " Building with ${SANITIZER_SELECTED_FLAGS}") append("${SANITIZER_SELECTED_FLAGS}" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) else() - message(FATAL_ERROR "Unsupported value of USE_SANITIZER: ${USE_SANITIZER}") + message(FATAL_ERROR "Unsupported value of HDF5_USE_SANITIZER: ${HDF5_USE_SANITIZER}") endif() elseif(MSVC) - if(USE_SANITIZER MATCHES "([Aa]ddress)") + if(HDF5_USE_SANITIZER MATCHES "([Aa]ddress)") message(STATUS "Building with Address sanitizer") append("-fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) @@ -197,19 +197,19 @@ if(USE_SANITIZER) append_quoteless(AFL_USE_ASAN=1 CMAKE_C_COMPILER_LAUNCHER CMAKE_CXX_COMPILER_LAUNCHER) endif() else() - message(FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${USE_SANITIZER}") + message(FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${HDF5_USE_SANITIZER}") endif() else() - message(FATAL_ERROR "USE_SANITIZER is not supported on this platform.") + message(FATAL_ERROR "HDF5_USE_SANITIZER is not supported on this platform.") endif() elseif(MSVC) - if(USE_SANITIZER MATCHES "([Aa]ddress)") + if(HDF5_USE_SANITIZER MATCHES "([Aa]ddress)") message(STATUS "Building with Address sanitizer") append("/fsanitize=address" CMAKE_C_FLAGS CMAKE_CXX_FLAGS) else() - message(FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${USE_SANITIZER}") + message(FATAL_ERROR "This sanitizer not yet supported in the MSVC environment: ${HDF5_USE_SANITIZER}") endif() else() - message(FATAL_ERROR "USE_SANITIZER is not supported on this platform.") + message(FATAL_ERROR "HDF5_USE_SANITIZER is not supported on this platform.") endif() endif() diff --git a/config/site-specific/BlankForm b/config/site-specific/BlankForm index a5e89215123..6898af7aadc 100644 --- a/config/site-specific/BlankForm +++ b/config/site-specific/BlankForm @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/solaris b/config/solaris index e99a2bc060b..172793e6753 100644 --- a/config/solaris +++ b/config/solaris @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/config/toolchain/intel.cmake b/config/toolchain/intel.cmake index f8f60b28b46..f5b227ba2a0 100644 --- a/config/toolchain/intel.cmake +++ b/config/toolchain/intel.cmake @@ -4,7 +4,11 @@ set(CMAKE_COMPILER_VENDOR "intel") set(CMAKE_C_COMPILER icx) -set(CMAKE_CXX_COMPILER icpx) +if(WIN32) + set(CMAKE_CXX_COMPILER icx) +else() + set(CMAKE_CXX_COMPILER icpx) +endif() set(CMAKE_Fortran_COMPILER ifx) # the following is used if cross-compiling diff --git a/configure.ac b/configure.ac index c5bfe4276af..5a8f31a4d33 100644 --- a/configure.ac +++ b/configure.ac @@ -5,7 +5,7 @@ ## ## This file is part of HDF5. The full HDF5 copyright notice, including ## terms governing use, modification, and redistribution, is contained in -## the COPYING file, which can be found at the root of the source code +## the LICENSE file, which can be found at the root of the source code ## distribution tree, or in https://www.hdfgroup.org/licenses. ## If you do not have access to either file, you may request a copy from ## help@hdfgroup.org. @@ -22,7 +22,7 @@ AC_PREREQ([2.71]) ## NOTE: Do not forget to change the version number here when we do a ## release!!! ## -AC_INIT([HDF5], [1.17.0], [help@hdfgroup.org]) +AC_INIT([HDF5], [2.0.0], [help@hdfgroup.org]) AC_CONFIG_SRCDIR([src/H5.c]) AC_CONFIG_HEADERS([src/H5config.h]) @@ -574,6 +574,58 @@ AC_CHECK_SIZEOF([float]) AC_CHECK_SIZEOF([double]) AC_CHECK_SIZEOF([long double]) +## ---------------------------------------------------------------------- +## Check if complex number support is available +## +HAVE_COMPLEX_NUMBERS="no" +AC_CHECK_SIZEOF([float complex], [], [#include ]) +AC_CHECK_SIZEOF([double complex], [], [#include ]) +AC_CHECK_SIZEOF([long double complex], [], [#include ]) + +if test "$ac_cv_sizeof_float_complex" != 0 && + test "$ac_cv_sizeof_double_complex" != 0 && + test "$ac_cv_sizeof_long_double_complex" != 0; then + # Check if __STDC_NO_COMPLEX__ macro is defined, in which case complex number + # support is not available + AC_MSG_CHECKING([if __STDC_NO_COMPLEX__ is defined]) + TEST_SRC="`(echo \"#define HAVE_STDC_NO_COMPLEX 1\"; cat $srcdir/config/cmake/HDFTests.c)`" + AC_CACHE_VAL([hdf5_cv_have_stdc_no_complex], + [AC_RUN_IFELSE( + [AC_LANG_SOURCE([$TEST_SRC])], + [hdf5_cv_have_stdc_no_complex=yes], + [hdf5_cv_have_stdc_no_complex=no], + [hdf5_cv_have_stdc_no_complex=maybe])]) + AC_MSG_RESULT(${hdf5_cv_have_stdc_no_complex}) + + if test "X$hdf5_cv_have_stdc_no_complex" == "Xno"; then + # Compile simple test program with complex numbers + AC_MSG_CHECKING([if complex number test program can be compiled and linked]) + TEST_SRC="`(echo \"#define HAVE_COMPLEX_NUMBERS 1\"; cat $srcdir/config/cmake/HDFTests.c)`" + AC_CACHE_VAL([hdf5_cv_have_complex_numbers], + [AC_RUN_IFELSE( + [AC_LANG_SOURCE([$TEST_SRC])], + [hdf5_cv_have_complex_numbers=yes], + [hdf5_cv_have_complex_numbers=no], + [hdf5_cv_have_complex_numbers=maybe])]) + AC_MSG_RESULT(${hdf5_cv_have_complex_numbers}) + + if test "X$hdf5_cv_have_complex_numbers" == "Xyes"; then + HAVE_COMPLEX_NUMBERS="yes" + + # Define HAVE_COMPLEX_NUMBERS macro for H5pubconf.h. + AC_DEFINE([HAVE_COMPLEX_NUMBERS], [1], [Determine if complex number support is available]) + AC_DEFINE([HAVE_C99_COMPLEX_NUMBERS], [1], [Determine if C99 complex number types are present]) + fi + fi +fi + +# Define HAVE_COMPLEX_NUMBERS value to substitute into other files for conditional testing +AC_SUBST([HAVE_COMPLEX_NUMBERS]) +AC_SUBST([HAVE_C99_COMPLEX_NUMBERS]) + +AC_MSG_CHECKING([if complex number support is available]) +AC_MSG_RESULT([$HAVE_COMPLEX_NUMBERS]) + #----------------------------------------------------------------------------- # Option for enabling/disabling support for non-standard features, datatypes, # etc. These features should still be checked for at configure time, but these @@ -1154,7 +1206,6 @@ AC_LANG_POP(C++) ## library is disabled. AC_SUBST([HDF5_HL]) AC_SUBST([HDF5_HL_TOOLS]) -AC_SUBST([HDF5_HL_GIF_TOOLS]) ## The high-level library and high-level tools are enabled unless the build mode ## is clean. @@ -1477,27 +1528,6 @@ AC_ARG_ENABLE([tools], AC_MSG_RESULT([$HDF5_TOOLS]) -## ---------------------------------------------------------------------- -## Check if they would like to disable building the high-level GIF -## tools (they have unfixed CVE issues) -## - -AC_MSG_CHECKING([if the high-level GIF tools are enabled]) -AC_ARG_ENABLE([hlgiftools], - [AS_HELP_STRING([--enable-hlgiftools], - [Enable the high-level GIF tools. NOTE: These have unfixed CVE issues! - [default=no] - ])], - [HDF5_HL_GIF_TOOLS=$enableval]) - -if test "X-$HDF5_TOOLS" = "X-yes" -a "X-$HDF5_HL" = "X-yes" -a "X-$HDF5_HL_GIF_TOOLS" = "X-yes"; then - AC_MSG_RESULT([yes]) -else - AC_MSG_RESULT([no]) - HDF5_HL_GIF_TOOLS="no" -fi - - ## ---------------------------------------------------------------------- ## Check if they would like to enable building doxygen files ## @@ -4046,8 +4076,9 @@ fi ## and installed with the libraries (used to generate libhdf5.settings). ## -## HDF5 version from the first line of the README.md file. -H5_VERSION="`cut -d' ' -f3 $srcdir/README.md | head -1`" +## HDF5 version from H5public.h (3rd field of #define H5_VERS_STR "1.17.0" +## w/ sed to remove quotes). +H5_VERSION=`grep 'H5_VERS_STR' $srcdir/src/H5public.h | sed s/\"//g | cut -d' ' -f3` AC_SUBST([H5_VERSION]) ## Configuration date @@ -4234,10 +4265,10 @@ esac AC_SUBST([DEFAULT_API_VERSION]) AC_MSG_CHECKING([which version of public symbols to use by default]) AC_ARG_WITH([default-api-version], - [AS_HELP_STRING([--with-default-api-version=(default|v16|v18|v110|v112|v114|v116|v118)], + [AS_HELP_STRING([--with-default-api-version=(default|v16|v18|v110|v112|v114|v200)], [Specify default release version of public symbols - [default=v118]])],, - [withval=v118]) + [default=v200]])],, + [withval=v200]) ## Allowing "default" allows the GitHub CI to check that we didn't forget ## to change the defaults when creating a new major version @@ -4266,16 +4297,11 @@ elif test "X$withval" = "Xv114"; then DEFAULT_API_VERSION=v114 AC_DEFINE([USE_114_API_DEFAULT], [1], [Define using v1.14 public API symbols by default]) -elif test "X$withval" = "Xv116"; then - AC_MSG_RESULT([v116]) - DEFAULT_API_VERSION=v116 - AC_DEFINE([USE_116_API_DEFAULT], [1], - [Define using v1.16 public API symbols by default]) -elif test "X$withval" = "Xv118" -o "X$withval" = "Xdefault"; then - AC_MSG_RESULT([v118]) - DEFAULT_API_VERSION=v118 - AC_DEFINE([USE_118_API_DEFAULT], [1], - [Define using v1.18 public API symbols by default]) +elif test "X$withval" = "Xv200" -o "X$withval" = "Xdefault"; then + AC_MSG_RESULT([v200]) + DEFAULT_API_VERSION=v200 + AC_DEFINE([USE_200_API_DEFAULT], [1], + [Define using v2.0 public API symbols by default]) else AC_MSG_ERROR([invalid version of public symbols given]) fi @@ -4285,7 +4311,7 @@ fi ## if the user insists on doing this via the --enable-unsupported configure ## flag, we'll let them. if test "X${ALLOW_UNSUPPORTED}" != "Xyes"; then - if test "X${DEFAULT_API_VERSION}" != "Xv118" -a "X${DEPRECATED_SYMBOLS}" = "Xno" ; then + if test "X${DEFAULT_API_VERSION}" != "Xv200" -a "X${DEPRECATED_SYMBOLS}" = "Xno" ; then AC_MSG_ERROR([Removing old public API symbols not allowed when using them as default public API symbols. Use --enable-unsupported to override this error.]) fi fi @@ -4411,7 +4437,6 @@ AM_CONDITIONAL([BUILD_HDF5_HL_CONDITIONAL], [test "X$HDF5_HL" = "Xyes"]) AM_CONDITIONAL([BUILD_TESTS_CONDITIONAL], [test "X$HDF5_TESTS" = "Xyes"]) AM_CONDITIONAL([BUILD_TESTS_PARALLEL_CONDITIONAL], [test -n "$TESTPARALLEL"]) AM_CONDITIONAL([BUILD_TOOLS_CONDITIONAL], [test "X$HDF5_TOOLS" = "Xyes"]) -AM_CONDITIONAL([BUILD_TOOLS_HL_GIF_CONDITIONAL], [test "X$HDF5_HL_GIF_TOOLS" = "Xyes"]) AM_CONDITIONAL([BUILD_DOXYGEN_CONDITIONAL], [test "X$HDF5_DOXYGEN" = "Xyes"]) ## ---------------------------------------------------------------------- @@ -4619,22 +4644,14 @@ AC_CONFIG_FILES([Makefile hl/test/Makefile hl/test/H5srcdir_str.h hl/tools/Makefile - hl/tools/gif2h5/Makefile - hl/tools/gif2h5/h52giftest.sh hl/tools/h5watch/Makefile hl/tools/h5watch/testh5watch.sh - hl/examples/Makefile - hl/examples/run-hlc-ex.sh hl/c++/Makefile hl/c++/src/Makefile hl/c++/test/Makefile - hl/c++/examples/Makefile - hl/c++/examples/run-hlc++-ex.sh hl/fortran/Makefile hl/fortran/src/Makefile - hl/fortran/test/Makefile - hl/fortran/examples/Makefile - hl/fortran/examples/run-hlfortran-ex.sh]) + hl/fortran/test/Makefile]) AC_CONFIG_FILES([utils/subfiling_vfd/h5fuse], [chmod +x utils/subfiling_vfd/h5fuse]) if test -n "$TESTPARALLEL"; then diff --git a/doc/cmake-vols-fetchcontent.md b/doc/cmake-vols-fetchcontent.md index ff0591311c4..f7b395dec7b 100644 --- a/doc/cmake-vols-fetchcontent.md +++ b/doc/cmake-vols-fetchcontent.md @@ -145,7 +145,7 @@ would typically be passed when building HDF5, such as `CMAKE_INSTALL_PREFIX`, cmake [hdf5 options] -DHDF5_ENABLE_THREADSAFE=ON -DHDF5_ENABLE_PARALLEL=ON - -DALLOW_UNSUPPORTED=ON + -DHDF5_ALLOW_UNSUPPORTED=ON -DHDF5_TEST_API=ON -DHDF5_VOL_ALLOW_EXTERNAL="GIT" -DHDF5_VOL_URL01=https://github.com/hpc-io/vol-async.git diff --git a/doc/img/release-schedule.plantuml b/doc/img/release-schedule.plantuml index d0fd79b1426..c7e45c18b4c 100644 --- a/doc/img/release-schedule.plantuml +++ b/doc/img/release-schedule.plantuml @@ -23,26 +23,24 @@ Project starts 2023-01-01 [1.12.3] happens 2023-11-30 [1.12] is colored in #88CCEE -[1.14] starts at 2023-01-01 and lasts 118 weeks +[1.14] starts at 2023-01-01 and lasts 92 weeks [1.14.1] happens at 2023-04-30 [1.14.2] happens at 2023-08-31 [1.14.3] happens at 2023-10-31 [1.14.4.2] happens at 2024-04-15 [1.14.4.3] happens at 2024-05-22 [1.14.5] happens at 2024-09-30 -[1.14.6] happens at 2025-03-31 [1.14.1] displays on same row as [1.14.1] [1.14.2] displays on same row as [1.14.1] [1.14.3] displays on same row as [1.14.1] [1.14.4.2] displays on same row as [1.14.1] [1.14.5] displays on same row as [1.14.1] -[1.14.6] displays on same row as [1.14.1] [1.14] is colored in #B187CF -[1.16] starts at 2025-03-31 and lasts 35 weeks -[1.16.0] happens at 2025-03-31 -[1.16.1] happens at 2025-09-30 -[1.16.1] displays on same row as [1.16.0] -[1.16] is colored in #02BFA0 +[2.0] starts at 2024-09-30 and lasts 53 weeks +[2.0.0] happens at 2025-03-31 +[2.1.0] happens at 2025-09-30 +[2.1.0] displays on same row as [2.0.0] +[2.0] is colored in #02BFA0 @endgantt diff --git a/doc/img/release-schedule.png b/doc/img/release-schedule.png index 20a0a55986d..ec65bfa595d 100644 Binary files a/doc/img/release-schedule.png and b/doc/img/release-schedule.png differ diff --git a/doxygen/aliases b/doxygen/aliases index 3c79b179df0..cbc6e81f6cf 100644 --- a/doxygen/aliases +++ b/doxygen/aliases @@ -7,10 +7,12 @@ ALIASES += THG="The HDF Group" ALIASES += HDFURL="support.hdfgroup.org" # URL for archived files ALIASES += ARCURL="\HDFURL/archive/support/HDF5/doc" +# URL for release files +ALIASES += RELURL="\HDFURL/releases/hdf5" # URL for documentation -ALIASES += DOCURL="\HDFURL/releases/hdf5/documentation" +ALIASES += DOCURL="\RELURL/documentation" # URL for downloads -ALIASES += DWNURL="\HDFURL/releases/hdf5/downloads" +ALIASES += DWNURL="\RELURL/downloads/latest" # URL for RFCs ALIASES += RFCURL="\DOCURL/rfc" ALIASES += AEXURL="\HDFURL/archive/support/ftp/HDF5/examples" @@ -69,6 +71,8 @@ ALIASES += op_data{1}="\param[in,out] \1 User-defined callback function context" ALIASES += op_data_in="\param[in] op_data User-defined callback function context" ALIASES += op_data_in{1}="\param[in] \1 User-defined callback function context" +ALIASES += vol_only_api="This routine is exclusively for authors of HDF5 VOL connectors. It is not part of the public HDF5 APIs for HDF5 application developers." + ################################################################################ # Asynchronous ################################################################################ @@ -248,7 +252,8 @@ ALIASES += es_id{1}="\param[in] \1 Event set identifier" # Others ################################################################################ -ALIASES += cpp_c_api_note="\attention \Bold{C++ Developers using HDF5 C-API functions beware:}\n Several functions in this C-API take function pointers or callbacks as arguments. Examples include H5Pset_elink_cb(), H5Pset_type_conv_cb(), H5Tconvert(), and H5Ewalk2(). Application code must ensure that those callback functions return normally such to allow the HDF5 to manage its resources and maintain a consistent state. For instance, those functions must not use the C \c setjmp / \c longjmp mechanism to leave those callback functions. Within the context of C++, any exceptions thrown within the callback function must be caught, such as with a \TText{catch(…)} statement. Any exception state can be placed within the provided user data function call arguments, and may be thrown again once the calling function has returned. Exceptions raised and not handled inside the callback are not supported as it might leave the HDF5 library in an inconsistent state. Similarly, using C++20 coroutines cannot be used as callbacks, since they do not support plain return statements. If a callback function yields execution to another C++20 coroutine calling HDF5 functions as well, this may lead to undefined behavior." +ALIASES += cpp_c_api_note="\anchor cpp_c_api_note \attention \Bold{C++ Developers using HDF5 C-API functions beware:}\n Several functions in this C-API take function pointers or callbacks as arguments. Examples include H5Pset_elink_cb(), H5Pset_type_conv_cb(), H5Tconvert(), and H5Ewalk2(). Application code must ensure that those callback functions return normally such to allow the HDF5 to manage its resources and maintain a consistent state. For instance, those functions must not use the C \c setjmp / \c longjmp mechanism to leave those callback functions. Within the context of C++, any exceptions thrown within the callback function must be caught, such as with a \TText{catch(…)} statement. Any exception state can be placed within the provided user data function call arguments, and may be thrown again once the calling function has returned. Exceptions raised and not handled inside the callback are not supported as it might leave the HDF5 library in an inconsistent state. Similarly, using C++20 coroutines cannot be used as callbacks, since they do not support plain return statements. If a callback function yields execution to another C++20 coroutine calling HDF5 functions as well, this may lead to undefined behavior." +ALIASES += callback_note="\attention \Bold{Leaving callback functions:}\n The callback function must return normally, even in the case of error. Returning with H5_ITER_ERROR, instead of leaving by means of exceptions, exit() function, etc... will allow the HDF5 library to manage its resources and maintain a consistent state. See \ref cpp_c_api_note \"C++ Developers using HDF5 C-API functions\" warning for detail." ALIASES += par_compr_note="\attention If you are planning to use compression with parallel HDF5, ensure that calls to H5Dwrite() occur in collective mode. In other words, all MPI ranks (in the relevant communicator) call H5Dwrite() and pass a dataset transfer property list with the MPI-IO collective option property set to #H5FD_MPIO_COLLECTIVE_IO.\n Note that data transformations are currently \Bold{not} supported when writing to datasets in parallel and with compression enabled." ALIASES += sa_metadata_ops="\sa \li H5Pget_all_coll_metadata_ops() \li H5Pget_coll_metadata_write() \li H5Pset_all_coll_metadata_ops() \li H5Pset_coll_metadata_write() \li \ref maybe_metadata_reads" @@ -257,7 +262,6 @@ ALIASES += sa_metadata_ops="\sa \li H5Pget_all_coll_metadata_ops() \li H5Pget_co ################################################################################ ALIASES += ref_cons_semantics="Enabling a Strict Consistency Semantics Model in Parallel HDF5" -ALIASES += ref_file_image_ops="HDF5 File Image Operations" ALIASES += ref_filter_pipe="Data Flow Pipeline for H5Dread()" ALIASES += ref_group_impls="Group implementations in HDF5" ALIASES += ref_h5lib_relver="HDF5 Library Release Version Numbers" @@ -324,7 +328,6 @@ ALIASES += ref_rfc20121114="HDF5 File Space Management" ALIASES += ref_rfc20120828="New HDF5 API Routines for HPC Applications - Read/Write Multiple Datasets in an HDF5 file" ALIASES += ref_rfc20120523="HDF5 File Space Management: Paged Aggregation" -ALIASES += ref_rfc20120501="HDF5 File Image Operations" ALIASES += ref_rfc20120305="Enabling a Strict Consistency Semantics Model in Parallel HDF5" ALIASES += ref_rfc20120220="h5repack: Improved Hyperslab selections for Large Chunked Datasets" ALIASES += ref_rfc20120120="A Maintainer's Guide for the Datatype Module in HDF5 Library" @@ -377,7 +380,7 @@ ALIASES += ref_rfc20040811="Conve ALIASES += click4more="(Click on a enumerator, field, or type for more information.)" ALIASES += csets="
#H5T_CSET_ASCIIUS ASCII
#H5T_CSET_UTF8UTF-8 Unicode encoding
" -ALIASES += datatype_class=" \li #H5T_INTEGER \li #H5T_FLOAT \li #H5T_STRING \li #H5T_BITFIELD \li #H5T_OPAQUE \li #H5T_COMPOUND \li #H5T_REFERENCE \li #H5T_ENUM \li #H5T_VLEN \li #H5T_ARRAY" +ALIASES += datatype_class=" \li #H5T_INTEGER \li #H5T_FLOAT \li #H5T_STRING \li #H5T_BITFIELD \li #H5T_OPAQUE \li #H5T_COMPOUND \li #H5T_REFERENCE \li #H5T_ENUM \li #H5T_VLEN \li #H5T_ARRAY \li #H5T_COMPLEX" ALIASES += file_access="
#H5F_ACC_RDWRFile was opened with read/write access.
#H5F_ACC_RDONLYFile was opened with read-only access.
#H5F_ACC_SWMR_WRITEFile was opened with read/write access for a single-writer/multiple-reader (SWMR) scenario. Note that the writer process must also open the file with the #H5F_ACC_RDWR flag.
#H5F_ACC_SWMR_READFile was opened with read-only access for a single-writer/multiple-reader (SWMR) scenario. Note that the reader process must also open the file with the #H5F_ACC_RDONLY flag.
" ALIASES += id_types="
#H5I_FILEFile
#H5I_GROUPGroup
#H5I_DATATYPEDatatype
#H5I_DATASPACEDataspace
#H5I_DATASETDataset
#H5I_ATTRAttribute
" ALIASES += indexes="
#H5_INDEX_NAMELexicographic order on name
#H5_INDEX_CRT_ORDERIndex on creation order
" diff --git a/doxygen/dox/DDLBNF200.dox b/doxygen/dox/DDLBNF200.dox new file mode 100644 index 00000000000..8ce4c89df9f --- /dev/null +++ b/doxygen/dox/DDLBNF200.dox @@ -0,0 +1,667 @@ +/** \page DDLBNF200 DDL in BNF for HDF5 2.0.0 and above + +\todo Revise this & break it up! + +\section intro200 Introduction + +This document contains the data description language (DDL) for an HDF5 file. The +description is in Backus-Naur Form (BNF). + +\section expo200 Explanation of Symbols + +This section contains a brief explanation of the symbols used in the DDL. + +\code{.unparsed} +::= defined as + a token with the name tname +
| one of or + opt zero or one occurrence of + * zero or more occurrence of + + one or more occurrence of + [0-9] an element in the range between 0 and 9 + '[' the token within the quotes (used for special characters) + TBD To Be Decided +\endcode + +\section ddl200 The DDL + +\code{.unparsed} + ::= HDF5 { opt } + + ::= + + ::= SUPER_BLOCK { + SUPERBLOCK_VERSION + FREELIST_VERSION + SYMBOLTABLE_VERSION + OBJECTHEADER_VERSION + OFFSET_SIZE + LENGTH_SIZE + BTREE_RANK + BTREE_LEAF + ISTORE_K + + USER_BLOCK { + USERBLOCK_SIZE + } + } + + ::= FILE_SPACE_STRATEGY + FREE_SPACE_PERSIST + FREE_SPACE_SECTION_THRESHOLD + FILE_SPACE_PAGE_SIZE + + ::= H5F_FSPACE_STRATEGY_FSM_AGGR | H5F_FSPACE_STRATEGY_PAGE | + H5F_FSPACE_STRATEGY_AGGR | H5F_FSPACE_STRATEGY_NONE | + Unknown strategy + + ::= GROUP "/" { + * + opt + opt + * + * + } + + ::= | | | | + + + ::= DATATYPE { + + } + + ::= the assigned name for anonymous named type is + in the form of #oid, where oid is the object id + of the type + + ::= | | JavaObj MATLAB PyHigh PyLow -h5ex_d_rdwrc.h5 -h5ex_d_rdwrc.tst +h5ex_d_rdwr.h5 +h5ex_d_rdwr.tst h5ex_d_rdwr.ddl @@ -483,7 +483,7 @@ FORTRAN h5ex_t_convert.h5 h5ex_t_convert.tst -h5ex_t_convert.ddl +h5ex_t_convert.ddl not applicable Read / Write Complex Compound (Attribute) @@ -800,16 +800,6 @@ FORTRAN h5ex_d_lzf.ddl -Read / Write Dataset using MAFISC Compression - -C - FORTRAN Java JavaObj MATLAB PyHigh PyLow - -h5ex_d_mafisc.h5 -h5ex_d_mafisc.tst -h5ex_d_mafisc.ddl - - Read / Write Dataset using ZFP Compression C diff --git a/doxygen/dox/FTS.dox b/doxygen/dox/FTS.dox index 9dae7c135aa..513786a19ac 100644 --- a/doxygen/dox/FTS.dox +++ b/doxygen/dox/FTS.dox @@ -1,8 +1,8 @@ /** \page FTS Full-Text Search \htmlonly - + \endhtmlonly -*/ \ No newline at end of file +*/ diff --git a/doxygen/dox/IntroHDF5.dox b/doxygen/dox/IntroHDF5.dox index acb497120da..e83f8b22280 100644 --- a/doxygen/dox/IntroHDF5.dox +++ b/doxygen/dox/IntroHDF5.dox @@ -204,7 +204,7 @@ Useful tools for working with HDF5 files include: \li HDFView: A java browser to view HDF (HDF4 and HDF5) files

h5dump

-The h5dump utility displays the contents of an HDF5 file in Data Description Language (\ref DDLBNF114). +The h5dump utility displays the contents of an HDF5 file in Data Description Language (\ref DDLBNF200). Below is an example of h5dump output for an HDF5 file that contains no objects: \code $ h5dump file.h5 @@ -625,7 +625,7 @@ For information on compiling in C, C++ and Fortran, see: \ref LBCompiling IDL, MATLAB, and NCL Examples for HDF-EOS Examples of how to access and visualize NASA HDF-EOS files using IDL, MATLAB, and NCL. -Miscellaneous Examples +Miscellaneous Examples These (very old) examples resulted from working with users, and are not fully tested. Most of them are in C, with a few in Fortran and Java. Using Special Values diff --git a/doxygen/dox/IntroParHDF5.dox b/doxygen/dox/IntroParHDF5.dox index 58a6e7958b0..a02cbbb5253 100644 --- a/doxygen/dox/IntroParHDF5.dox +++ b/doxygen/dox/IntroParHDF5.dox @@ -35,7 +35,7 @@ The following shows the Parallel HDF5 implementation layers: This tutorial assumes that you are somewhat familiar with parallel programming with MPI (Message Passing Interface). If you are not familiar with parallel programming, here is a tutorial that may be of interest: -Tutorial on HDF5 I/O tuning at NERSC. +Tutorial on HDF5 I/O tuning at NERSC (PDF). (NOTE: As of 2024, the specific systems described in this tutorial are outdated.) Some of the terms that you must understand in this tutorial are: diff --git a/doxygen/dox/LearnBasics.dox b/doxygen/dox/LearnBasics.dox index 4db515c1a57..33426cf1311 100644 --- a/doxygen/dox/LearnBasics.dox +++ b/doxygen/dox/LearnBasics.dox @@ -75,7 +75,7 @@ These examples (C, C++, Fortran, Java, Python) are provided in the HDF5 source c Read and write to a dataset -C Fortran C++ Java Python +C Fortran C++ Java Python @@ -83,7 +83,7 @@ These examples (C, C++, Fortran, Java, Python) are provided in the HDF5 source c Create an attribute -C Fortran C++ Java Python +C Fortran C++ Java Python @@ -99,7 +99,7 @@ These examples (C, C++, Fortran, Java, Python) are provided in the HDF5 source c Create groups in a file using absolute and relative paths -C Fortran C++ Java Python +C Fortran C++ Java Python diff --git a/doxygen/dox/LearnBasics1.dox b/doxygen/dox/LearnBasics1.dox index f4b44d1cf89..39dcca28cd4 100644 --- a/doxygen/dox/LearnBasics1.dox +++ b/doxygen/dox/LearnBasics1.dox @@ -366,7 +366,7 @@ inadvertently left open. A File Access property controls how the file is closed. The HDF Group has developed tools for examining the contents of HDF5 files. The tool used throughout the HDF5 tutorial is the HDF5 dumper, h5dump, which displays the file contents in human-readable form. The output of h5dump is an ASCII display formatted according to the HDF5 DDL grammar. This grammar is defined, using Backus-Naur Form, in the -\ref DDLBNF114. +\ref DDLBNF200. To view the HDF5 file contents, simply type: \code @@ -394,7 +394,7 @@ HDF5 "file.h5" { \subsection subsecLBFileExampleDDL File Definition in DDL The simplified DDL file definition for creating an HDF5 file. For simplicity, a simplified DDL is used in this tutorial. A -complete and more rigorous DDL can be found in the \ref DDLBNF114. +complete and more rigorous DDL can be found in the \ref DDLBNF200. The following symbol definitions are used in the DDL: \code diff --git a/doxygen/dox/LearnBasics3.dox b/doxygen/dox/LearnBasics3.dox index 13cb4f43abd..c93c23971c0 100644 --- a/doxygen/dox/LearnBasics3.dox +++ b/doxygen/dox/LearnBasics3.dox @@ -181,8 +181,7 @@ created the dataset layout cannot be changed. The h5repack utility can be used t to a new with a new layout. \section secLBDsetLayoutSource Sources of Information -Chunking in HDF5 -(See the documentation on Advanced Topics in HDF5) +\ref hdf5_chunking \see \ref sec_plist in the HDF5 \ref UG.
@@ -201,7 +200,7 @@ certain initial dimensions, then to later increase the size of any of the initia HDF5 requires you to use chunking to define extendible datasets. This makes it possible to extend datasets efficiently without having to excessively reorganize storage. (To use chunking efficiently, -be sure to see the advanced topic, Chunking in HDF5.) +be sure to see the advanced topic, \ref hdf5_chunking.) The following operations are required in order to extend a dataset: \li Declare the dataspace of the dataset to have unlimited dimensions for all dimensions that might eventually be extended. @@ -243,7 +242,7 @@ Navigate back: \ref index "Main" / \ref GettingStarted / \ref LearnBasics \section secLBComDsetCreate Creating a Compressed Dataset HDF5 requires you to use chunking to create a compressed dataset. (To use chunking efficiently, -be sure to see the advanced topic, Chunking in HDF5.) +be sure to see the advanced topic, \ref hdf5_chunking.) The following operations are required in order to create a compressed dataset: \li Create a dataset creation property list. @@ -251,7 +250,8 @@ The following operations are required in order to create a compressed dataset: \li Create the dataset. \li Close the dataset creation property list and dataset. -For more information on compression, see the FAQ question on Using Compression in HDF5. +For more information on troubleshooting compression issues, see the + HDF5 Compression Troubleshooting (PDF). \section secLBComDsetProg Programming Example @@ -968,7 +968,7 @@ or on WINDOWS you may need to add the path to the bin folder to PATH. \section secLBCompilingCMake Compiling an Application with CMake \subsection subsecLBCompilingCMakeScripts CMake Scripts for Building Applications -See Using CMake to Build Applications to build applications with different languages and options. +See Using CMake to Build Applications to build applications with different languages and options. For a more complete script (and to help resolve issues) see the script provided with the HDF5 Examples project. @@ -976,7 +976,7 @@ For a more complete script (and to help resolve issues) see the script provided The installed HDF5 can be verified by compiling the HDF5 Examples project, included with the CMake built HDF5 binaries in the share folder or you can go to the HDF5 Examples in the HDF5 github repository. -Go into the share directory and follow the instructions in Using CMake to Build Examples to build the examples. +Go into the share directory and follow the instructions in Using CMake to Build Examples to build the examples. In general, users must first set the HDF5_ROOT environment variable to the installed location of the CMake configuration files for HDF5. For example, on Windows the following path might be set: diff --git a/doxygen/dox/LearnHDFView.dox b/doxygen/dox/LearnHDFView.dox index 3b9afdb1ef1..298ae52ca4c 100644 --- a/doxygen/dox/LearnHDFView.dox +++ b/doxygen/dox/LearnHDFView.dox @@ -245,8 +245,7 @@ dataset must be stored with a chunked dataset layout (as multiple chunksChunking in HDF5 documentation. +information on chunking and specifying an appropriate chunk size, see the \ref hdf5_chunking documentation. Also see the HDF5 Tutorial topic on \ref secLBComDsetCreate.
    diff --git a/doxygen/dox/Overview.dox b/doxygen/dox/Overview.dox index b472d4d2a8d..6caffd147aa 100644 --- a/doxygen/dox/Overview.dox +++ b/doxygen/dox/Overview.dox @@ -21,7 +21,7 @@ documents cover a mix of tasks, concepts, and reference, to help a specific audience succeed. \par Offline reading - You can download it as an archive for offline reading. + You can download it as an archive for offline reading. \par ToDo List There is plenty of unfinished business. diff --git a/doxygen/dox/PredefinedDatatypeTables.dox b/doxygen/dox/PredefinedDatatypeTables.dox index 0b40516161e..7b3795016b3 100644 --- a/doxygen/dox/PredefinedDatatypeTables.dox +++ b/doxygen/dox/PredefinedDatatypeTables.dox @@ -6,6 +6,10 @@ *
    * \snippet{doc} tables/predefinedDatatypes.dox predefined_ieee_datatypes_table *
    + * + *
    + * \snippet{doc} tables/predefinedDatatypes.dox predefined_complex_datatypes_table + *
    * *
    * \snippet{doc} tables/predefinedDatatypes.dox predefined_std_datatypes_table diff --git a/doxygen/dox/RFC.dox b/doxygen/dox/RFC.dox index 1b1141b4fd5..0482aee0c98 100644 --- a/doxygen/dox/RFC.dox +++ b/doxygen/dox/RFC.dox @@ -53,7 +53,6 @@ 2012-10-24 \ref_rfc20121024 2012-08-28 \ref_rfc20120828 2012-05-23 \ref_rfc20120523 - 2012-05-01 \ref_rfc20120501 2012-03-05 \ref_rfc20120305 2012-02-20 \ref_rfc20120220 2012-01-20 \ref_rfc20120120 diff --git a/doxygen/dox/Specifications.dox b/doxygen/dox/Specifications.dox index f2ba467d7bb..de9c23d80aa 100644 --- a/doxygen/dox/Specifications.dox +++ b/doxygen/dox/Specifications.dox @@ -5,6 +5,7 @@ \li \ref DDLBNF110 \li \ref DDLBNF112 \li \ref DDLBNF114 +\li \ref DDLBNF200 \section File Format @@ -53,7 +54,101 @@ */ /** \page TBL HDF5 Table Specification Version 1.0 +The HDF5 specification defines the standard objects and storage for the standard HDF5 +objects. (For information about the HDF5 library, model and specification, see the HDF +documentation.) This document is an additional specification do define a standard profile +for how to store tables in HDF5. Table data in HDF5 is stored as HDF5 datasets with standard +attributes to define the properties of the tables. + +\section sec_tab_spec_intro Introduction +A generic table is a sequence of records, each record has a name and a type. Table data +is stored as an HDF5 one dimensional compound dataset. A table is defined as a collection +of records whose values are stored in fixed-length fields. All records have the same structure +and all values in each field have the same data type. + +The dataset for a table is distinguished from other datasets by giving it an attribute +"CLASS=TABLE". Optional attributes allow the storage of a title for the Table and for +each column, and a fill value for each column. + +\section sec_tab_spec_attr Table Attributes +The attributes for the Table are strings. They are written with the #H5LTset_attribute_string +Lite API function. "Required" attributes must always be used. "Optional" attributes must be +used when required. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Table 1. Attributes of an Image Dataset
    Attribute NameRequired
    Optional
    TypeString SizeValueDescription
    CLASSRequiredString5"TABLE"This attribute is type #H5T_C_S1, with size 5. For all Tables, the value of this attribute is +TABLE. This attribute identifies this data set as intended to be interpreted as Table that +conforms to the specifications on this page.
    VERSIONRequiredString3"0.2"This attribute is of type #H5T_C_S1, with size corresponding to the length of the version string. +This attribute identifies the version number of this specification to which it conforms. The current +version number is "0.2".
    TITLEOptionalString  The TITLE is an optional String that is to be used as the informative title of the whole table. +The TITLE is set with the parameter table_title of the function #H5TBmake_table.
    FIELD_(n)_NAMERequiredString  The FIELD_(n)_NAME is an optional String that is to be used as the informative title of column n +of the table. For each of the fields the word FIELD_ is concatenated with the zero based field (n) +index together with the name of the field.
    FIELD_(n)_FILLOptionalString  The FIELD_(n)_FILL is an optional String that is the fill value for column n of the table. +For each of the fields the word FIELD_ is concatenated with the zero based field (n) index +together with the fill value, if present. This value is written only when a fill value is defined +for the table.
    + +The following section of code shows the calls necessary to the creation of a table. +\code +// Create a new HDF5 file using default properties. +file_id = H5Fcreate("my_table.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + +// Call the make table function +H5TBmake_table("Table Title", file_id, "Table1", NFIELDS, NRECORDS, dst_size, field_names, dst_offset, field_type, chunk_size, fill_data, compress, p_data); + +// Close the file. +status = H5Fclose(file_id); +\endcode + +For more information see the @ref H5TB reference manual page and the @ref H5TB_UG, which includes examples. -\htmlinclude TableSpec.html */ diff --git a/doxygen/dox/TechnicalNotes.dox b/doxygen/dox/TechnicalNotes.dox index 3ea6af63a25..8bea54bfb25 100644 --- a/doxygen/dox/TechnicalNotes.dox +++ b/doxygen/dox/TechnicalNotes.dox @@ -3,7 +3,7 @@ \li \ref api-compat-macros \li \ref APPDBG \li \ref FMTDISC -\li \ref FILEIMGOPS +\li \ref sec_file_image \li \ref subsubsec_dataset_transfer_filter \li \ref IOFLOW \li \ref TNMDC @@ -11,6 +11,7 @@ \li \ref SWMR \li \ref VDS \li \ref RELVERSION +\li \ref UNICODE \li \ref VFL \li HDF5 Library Architecture Overview \li \ref VOL_Connector @@ -31,25 +32,1192 @@ /** \page VFL HDF5 Virtual File Layer -\htmlinclude VFL.html +\section sec_vfl_intro Introduction +The HDF5 file format describes how HDF5 data structures and dataset raw data are mapped +to a linear format address space and the HDF5 library implements that bidirectional mapping +in terms of an API. However, the HDF5 format specifications do not indicate how the format +address space is mapped onto storage and HDF (version 5 and earlier) simply mapped the format +address space directly onto a single file by convention. + +Since early versions of HDF5 it became apparent that users want the ability to map the +format address space onto different types of storage (a single file, multiple files, local +memory, global memory, network distributed global memory, a network protocol, etc.) with +various types of maps. For instance, some users want to be able to handle very large format +address spaces on operating systems that support only 2GB files by partitioning the format +address space into equal-sized parts each served by a separate file. Other users want the +same multi-file storage capability but want to partition the address space according to +purpose (raw data in one file, object headers in another, global heap in a third, etc.) +in order to improve I/O speeds. + +In fact, the number of storage variations is probably larger than the number of methods +that the HDF5 team is capable of implementing and supporting. Therefore, a Virtual File +Layer API is being implemented which will allow application teams or departments to design +and implement their own mapping between the HDF5 format address space and storage, with each +mapping being a separate file driver (possibly written in terms of other file drivers). The +HDF5 team will provide a small set of useful file drivers which will also serve as examples +for those who which to write their own: + + + + + + + + + + + + + + + + +
    #H5FD_SEC2This is the default driver which uses Posix file-system functions +like read and write to perform I/O to a single file. All I/O requests are unbuffered +although the driver does optimize file seeking operations to some extent. +
    #H5FD_STDIOThis driver uses functions from 'stdio.h' to perform buffered I/O to a single file. +
    #H5FD_COREThis driver performs I/O directly to memory and can be +used to create small temporary files that never exist on permanent storage. This +type of storage is generally very fast since the I/O consists only of memory-to-memory copy operations. +
    #H5FD_MPIOThis is the driver of choice for accessing files in parallel +using MPI and MPI-IO. It is only predefined if the library is compiled with parallel I/O support. +
    #H5FD_FAMILYLarge format address spaces are partitioned into more +manageable pieces and sent to separate storage locations using an underlying driver +of the user's choice. \ref H5TOOL_RT_UG can be used to change the sizes of the family +members when stored as files or to convert a family of files to a single file or vice versa. +
    + +\section sec_vfl_use Using a File Driver +Most application writers will use a driver defined by the HDF5 library or contributed by another +programming team. This chapter describes how existing drivers are used. + +\subsection subsec_vfl_use_hdr Driver Header Files +Each file driver is defined in its own public header file which should be included by any +application which plans to use that driver. The predefined drivers are in header files whose +names begin with 'H5FD' followed by the driver name and '.h'. The 'hdf5.h' header file includes +all the predefined driver header files. + +Once the appropriate header file is included a symbol of the form 'H5FD_' followed by the +upper-case driver name will be the driver identification number.(The driver name is by convention +and might not apply to drivers which are not distributed with HDF5.) However, the value may +change if the library is closed (e.g., by calling #H5close) and the symbol is referenced again. + +\subsection subsec_vfl_use_create Creating and Opening Files +In order to create or open a file one must define the method by which the storage is +accessed(The access method also indicates how to translate the storage name to a storage server +such as a file, network protocol, or memory.) and does so by creating a file access property +list(The term "file access property list" is a misnomer since storage isn't required to be a file.) +which is passed to the #H5Fcreate or #H5Fopen function. A default file access property list is created +by calling #H5Pcreate and then the file driver information is inserted by calling a driver initialization +function such as #H5Pset_fapl_family: +\code +hid_t fapl = H5Pcreate(H5P_FILE_ACCESS); +size_t member_size = 100*1024*1024; /*100MB*/ +H5Pset_fapl_family(fapl, member_size, H5P_DEFAULT); +hid_t file = H5Fcreate("foo%05d.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fapl); +H5Pclose(fapl); +\endcode -*/ +Each file driver will have its own initialization function whose name is H5Pset_fapl_ followed by +the driver name and which takes a file access property list as the first argument followed by additional +driver-dependent arguments. -/** \page FMTDISC HDF5 File Format Discussion +An alternative to using the driver initialization function is to set the driver directly using the +#H5Pset_driver function.(This function is overloaded to operate on data transfer property lists also, as described below.) +Its second argument is the file driver identifier, which may have a different numeric value from run to run +depending on the order in which the file drivers are registered with the library. The third argument encapsulates +the additional arguments of the driver initialization function. This method only works if the file driver +writer has made the driver-specific property list structure a public datatype, which is often not the case. +\code +hid_t fapl = H5Pcreate(H5P_FILE_ACCESS); +static H5FD_family_fapl_t fa = {100*1024*1024, H5P_DEFAULT}; +H5Pset_driver(fapl, H5FD_FAMILY, &fa); +hid_t file = H5Fcreate("foo.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fapl); +H5Pclose(fapl); +\endcode -\htmlinclude FileFormat.html +It is also possible to query the file driver information from a file access property list by +calling #H5Pget_driver to determine the driver and then calling a driver-defined query function +to obtain the driver information: +\code +hid_t driver = H5Pget_driver(fapl); +if (H5FD_SEC2==driver) { + /*nothing further to get*/ +} else if (H5FD_FAMILY==driver) { + hid_t member_fapl; + haddr_t member_size; + H5Pget_fapl_family(fapl, &member_size, &member_fapl); +} else if (....) { + .... +} +\endcode + +\subsection subsec_vfl_use_per Performing I/O +The #H5Dread and #H5Dwrite functions transfer data between application memory and the file. They both take +an optional data transfer property list which has some general driver-independent properties and optional +driver-defined properties. An application will typically perform I/O in one of three styles via the +#H5Dread or #H5Dwrite function: + +Like file access properties in the previous section, data transfer properties can be set using a driver +initialization function or a general purpose function. For example, to set the MPI-IO driver to use +independent access for I/O operations one would say: +\code +hid_t dxpl = H5Pcreate(H5P_DATA_XFER); +H5Pset_dxpl_mpio(dxpl, H5FD_MPIO_INDEPENDENT); +H5Dread(dataset, type, mspace, fspace, buffer, dxpl); +H5Pclose(dxpl); +\endcode + +The alternative is to initialize a driver defined C struct and pass it to the #H5Pset_driver function: +\code +hid_t dxpl = H5Pcreate(H5P_DATA_XFER); +static H5FD_mpio_dxpl_t dx = {H5FD_MPIO_INDEPENDENT}; +H5Pset_driver(dxpl, H5FD_MPIO, &dx); +H5Dread(dataset, type, mspace, fspace, buffer, dxpl); +\endcode + +The transfer property list can be queried in a manner similar to the file access property list: the driver +provides a function (or functions) to return various information about the transfer property list: +\code +hid_t driver = H5Pget_driver(dxpl); +if (H5FD_MPIO==driver) { + H5FD_mpio_xfer_t xfer_mode; + H5Pget_dxpl_mpio(dxpl, &xfer_mode); +} else { + .... +} +\endcode + +\subsection subsec_vfl_use_inter File Driver Interchangeability +The HDF5 specifications describe two things: the mapping of data onto a linear format address +space and the C API which performs the mapping. However, the mapping of the format address space +onto storage intentionally falls outside the scope of the HDF5 specs. This is a direct result of the +fact that it is not generally possible to store information about how to access storage inside the +storage itself. For instance, given only the file name '/arborea/1225/work/f%03d' the HDF5 library +is unable to tell whether the name refers to a file on the local file system, a family of files on +the local file system, a file on host 'arborea' port 1225, a family of files on a remote system, etc. + +Two ways which library could figure out where the storage is located are: storage access information +can be provided by the user, or the library can try all known file access methods. This implementation +uses the former method. + +In general, if a file was created with one driver then it isn't possible to open it with another driver. +There are of course exceptions: a file created with MPIO could probably be opened with the sec2 driver, +any file created by the sec2 driver could be opened as a family of files with one member, etc. In fact, +sometimes a file must not only be opened with the same driver but also with the same driver properties. +The predefined drivers are written in such a way that specifying the correct driver is sufficient for +opening a file. + +\section sec_vfl_imp Implementation of a Driver +A driver is simply a collection of functions and data structures which are registered with the HDF5 +library at runtime. The functions fall into these categories: +\li Functions which operate on modes +\li Functions which operate on files +\li Functions which operate on the address space +\li Functions which operate on data +\li Functions for driver initialization +\li Optimization functions + +\subsection subsec_vfl_imp_mode Mode Functions +Some drivers need information about file access and data transfers which are very specific to the driver. +The information is usually implemented as a pair of pointers to C structs which are allocated and +initialized as part of an HDF5 property list and passed down to various driver functions. There are two +classes of settings: file access modes that describe how to access the file through the driver, and +data transfer modes which are settings that control I/O operations. Each file opened by a particular +driver may have a different access mode; each dataset I/O request for a particular file may have a +different data transfer mode. + +Since each driver has its own particular requirements for various settings, each driver is responsible +for defining the mode structures that it needs. Higher layers of the library treat the structures as +opaque but must be able to copy and free them. Thus, the driver provides either the size of the +structure or a pair of function pointers for each of the mode types. + +Example: The family driver needs to know how the format address space is partitioned and the file +access property list to use for the family members. +\code +// Driver-specific file access properties +typedef struct H5FD_family_fapl_t { + hsize_t memb_size; // size of each family member + hid_t memb_fapl; // file access property list for each family member +} H5FD_family_fapl_t; + +// Driver specific data transfer properties +typedef struct H5FD_family_dxpl_t { + hid_t memb_dxpl_id; //data xfer property list of each member +} H5FD_family_dxpl_t; +\endcode +n order to copy or free one of these structures the member file access or data transfer properties must +also be copied or freed. This is done by providing a copy and close function for each structure: + +Example: The file access property list copy and close functions for the family driver: +\code +static void * +H5FD_family_fapl_copy(const void *_old_fa) +{ + const H5FD_family_fapl_t *old_fa = (const H5FD_family_fapl_t*)_old_fa; + H5FD_family_fapl_t *new_fa = malloc(sizeof(H5FD_family_fapl_t)); + assert(new_fa); + + memcpy(new_fa, old_fa, sizeof(H5FD_family_fapl_t)); + new_fa->memb_fapl_id = H5Pcopy(old_fa->memb_fapl_id); + return new_fa; +} + +static herr_t +H5FD_family_fapl_free(void *_fa) +{ + H5FD_family_fapl_t *fa = (H5FD_family_fapl_t*)_fa; + H5Pclose(fa->memb_fapl_id); + free(fa); + return 0; +} +\endcode + +Generally when a file is created or opened the file access properties for the driver are copied into the +file pointer which is returned and they may be modified from their original value (for instance, the file +family driver modifies the member size property when opening an existing family). In order to support the +#H5Fget_access_plist function the driver must provide a fapl_get callback which creates a copy of the +driver-specific properties based on a particular file. + +Example: The file family driver copies the member size file access property list into the return value: +\code +static void * +H5FD_family_fapl_get(H5FD_t *_file) +{ + H5FD_family_t *file = (H5FD_family_t*)_file; + H5FD_family_fapl_t *fa = calloc(1, sizeof(H5FD_family_fapl_t*)); + + fa->memb_size = file->memb_size; + fa->memb_fapl_id = H5Pcopy(file->memb_fapl_id); + return fa; +} +\endcode + +\subsection subsec_vfl_imp_file File Functions +The higher layers of the library expect files to have a name and allow the file to be accessed in various modes. +The driver must be able to create a new file, replace an existing file, or open an existing file. Opening or +creating a file should return a handle, a pointer to a specialization of the H5FD_t struct, which allows read-only +or read-write access and which will be passed to the other driver functions as they are called.(Read-only access is +only appropriate when opening an existing file.) +\code +typedef struct { + // Public fields + H5FD_class_t *cls; //class data defined below + + // Private fields -- driver-defined + +} H5FD_t; +\endcode + +Example: The family driver requires handles to the underlying storage, the size of the members for this +particular file (which might be different than the member size specified in the file access property list +if an existing file family is being opened), the name used to open the file in case additional members +must be created, and the flags to use for creating those additional members. The eoa member caches the +size of the format address space so the family members don't have to be queried in order to find it. +\code +// The description of a file belonging to this driver. +typedef struct H5FD_family_t { + H5FD_t pub; // public stuff, must be first + hid_t memb_fapl_id; // file access property list for members + hsize_t memb_size; // maximum size of each member file + int nmembs; // number of family members + int amembs; // number of member slots allocated + H5FD_t **memb; // dynamic array of member pointers + haddr_t eoa; // end of allocated addresses + char *name; // name generator printf format + unsigned flags; // flags for opening additional members +} H5FD_family_t; +\endcode + +Example: The sec2 driver needs to keep track of the underlying Unix file descriptor and also the +end of format address space and current Unix file size. It also keeps track of the current file +position and last operation (read, write, or unknown) in order to optimize calls to lseek. The +device and inode fields are defined on Unix in order to uniquely identify the file and will be +discussed below. +\code +typedef struct H5FD_sec2_t { + H5FD_t pub; // public stuff, must be first + int fd; // the unix file + haddr_t eoa; // end of allocated region + haddr_t eof; // end of file; current file size + haddr_t pos; // current file I/O position + int op; // last operation + dev_t device; // file device number + ino_t inode; // file i-node number +} H5FD_sec2_t; +\endcode + +\subsection subsec_vfl_imp_open Open Files +All drivers must define a function for opening/creating a file. This function should have a prototype which is: + + + + + +
    static H5FD_t * open (const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)The file name name and file access property list fapl are the same as were specified in the #H5Fcreate +or #H5Fopen call. The flags are the same as in those calls also except the flag #H5F_ACC_CREAT is also +present if the call was to H5Fcreate and they are documented in the 'H5Fpublic.h' file. The maxaddr +argument is the maximum format address that the driver should be prepared to handle (the minimum address is always zero).
    + +Example: The sec2 driver opens a Unix file with the requested name and saves information which +uniquely identifies the file (the Unix device number and inode). +\code +static H5FD_t * +H5FD_sec2_open(const char *name, unsigned flags, hid_t fapl_id/*unused*/, + haddr_t maxaddr) +{ + unsigned o_flags; + int fd; + struct stat sb; + H5FD_sec2_t *file=NULL; + + // Check arguments + if (!name || !*name) return NULL; + if (0==maxaddr || HADDR_UNDEF==maxaddr) return NULL; + if (ADDR_OVERFLOW(maxaddr)) return NULL; + + // Build the open flags + o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY; + if (H5F_ACC_TRUNC & flags) o_flags |= O_TRUNC; + if (H5F_ACC_CREAT & flags) o_flags |= O_CREAT; + if (H5F_ACC_EXCL & flags) o_flags |= O_EXCL; + + // Open the file + if ((fd=open(name, o_flags, 0666))<0) return NULL; + if (fstat(fd, &sb)<0) { + close(fd); + return NULL; + } + + // Create the new file struct + file = calloc(1, sizeof(H5FD_sec2_t)); + file->fd = fd; + file->eof = sb.st_size; + file->pos = HADDR_UNDEF; + file->op = OP_UNKNOWN; + file->device = sb.st_dev; + file->inode = sb.st_ino; + + return (H5FD_t*)file; +} +\endcode + +\subsection subsec_vfl_imp_close Closing Files +Closing a file simply means that all cached data should be flushed to the next lower layer, the +file should be closed at the next lower layer, and all file-related data structures should be +freed. All information needed by the close function is already present in the file handle. + + + + + +
    static herr_t close (H5FD_t *file)The file argument is the handle which was returned by the open function, and the close should +free only memory associated with the driver-specific part of the handle (the public parts will +have already been released by HDF5's virtual file layer).
    + +Example: The sec2 driver just closes the underlying Unix file, making sure that the actual +file size is the same as that known to the library by writing a zero to the last file position +it hasn't been written by some previous operation (which happens in the same code which flushes +the file contents and is shown below). +\code +static herr_t +H5FD_sec2_close(H5FD_t *_file) +{ + H5FD_sec2_t *file = (H5FD_sec2_t*)_file; + + if (H5FD_sec2_flush(_file)<0) return -1; + if (close(file->fd)<0) return -1; + free(file); + return 0; +} +\endcode + +\subsection subsec_vfl_imp_key File Keys +Occasionally an application will attempt to open a single file more than one time in order +to obtain multiple handles to the file. HDF5 allows the files to share information(For instance, +writing data to one handle will cause the data to be immediately visible on the other handle.) +but in order to accomplish this HDF5 must be able to tell when two names refer to the same file. +It does this by associating a driver-defined key with each file opened by a driver and comparing +the key for an open request with the keys for all other files currently open by the same driver. + + + + + +
    const int cmp (const H5FD_t *f1, const H5FD_t *f2)The driver may provide a function which compares two files f1 and f2 belonging to the same +driver and returns a negative, positive, or zero value a la the strcmp function.(The ordering +is arbitrary as long as it's consistent within a particular file driver.) If this function is +not provided then HDF5 assumes that all calls to the open callback return unique files regardless +of the arguments and it is up to the application to avoid doing this if that assumption is incorrect.
    + +Each time a file is opened the library calls the cmp function to compare that file with all other files +currently open by the same driver and if one of them matches (at most one can match) then the file +which was just opened is closed and the previously opened file is used instead. + +Opening a file twice with incompatible flags will result in failure. For instance, opening a file with +the truncate flag is a two step process which first opens the file without truncation so keys can be +compared, and if no matching file is found already open then the file is closed and immediately reopened +with the truncation flag set (if a matching file is already open then the truncating open will fail). + +Example: The sec2 driver uses the Unix device and i-node as the key. They were initialized when +the file was opened. +\code +static int +H5FD_sec2_cmp(const H5FD_t *_f1, const H5FD_t *_f2) +{ + const H5FD_sec2_t *f1 = (const H5FD_sec2_t*)_f1; + const H5FD_sec2_t *f2 = (const H5FD_sec2_t*)_f2; + + if (f1->device < f2->device) return -1; + if (f1->device > f2->device) return 1; + + if (f1->inode < f2->inode) return -1; + if (f1->inode > f2->inode) return 1; + + return 0; +} +\endcode + +\subsection subsec_vfl_imp_save Saving Modes Across Opens +Some drivers may also need to store certain information in the file superblock in order +to be able to reliably open the file at a later date. This is done by three functions: +one to determine how much space will be necessary to store the information in the superblock, +one to encode the information, +and one to decode the information. These functions are optional, but if any one is defined +then the other two must also be defined. + + + + + + + + + + + + + + + + + +
    FunctionDescription
    static hsize_t sb_size (H5FD_t *file)The sb_size function returns the number of bytes necessary to encode +information needed later if the file is reopened.
    static herr_t sb_encode (H5FD_t *file, char *name, unsigned char *buf)The sb_encode function encodes information from the file into buffer buf +allocated by the caller. It also writes an 8-character (plus null termination) into +the name argument, which should be a unique identification for the driver.
    static herr_t sb_decode (H5FD_t *file, const char *name, const unsigned char *buf)The sb_decode function looks at the name decodes data from the buffer buf and +updates the file argument with the new information, advancing *p in the process.
    +The part of this which is somewhat tricky is that the file must be readable before the +superblock information is decoded. File access modes fall outside the scope of the HDF5 +file format, but they are placed inside the boot block for convenience.(File access modes +do not describe data, but rather describe how the HDF5 format address space is mapped to +the underlying file(s). Thus, in general the mapping must be known before the file +superblock can be read. However, the user usually knows enough about the mapping for +the superblock to be readable and once the superblock is read the library can fill +in the missing parts of the mapping.) + +\section sec_vfl_address Address Space Functions +HDF5 does not assume that a file is a linear address space of bytes. Instead, the library +will call functions to allocate and free portions of the HDF5 format address space, which +in turn map onto functions in the file driver to allocate and free portions of file address +space. The library tells the file driver how much format address space it wants to allocate +and the driver decides what format address to use and how that format address is mapped +onto the file address space. Usually the format address is chosen so that the file address +can be calculated in constant time for data I/O operations (which are always specified by format addresses). + +\subsection subsec_vfl_address_blk Userblock and Superblock +The HDF5 format allows an optional userblock to appear before the actual HDF5 data in such +a way that if the userblock is sucked out of the file and everything remaining is +shifted downward in the file address space, then the file is still a valid HDF5 file. +The userblock size can be zero or any multiple of two greater than or equal to 512 and +the file superblock begins immediately after the userblock. + +HDF5 allocates space for the userblock and superblock by calling an allocation function +defined below, which must return a chunk of memory at format address zero on the first call. + +\subsection subsec_vfl_address_alloc Allocatiion of Format Regions +The library makes many types of allocation requests: + + + + + + + + + + + + + + + + + + + + +
    #H5FD_MEM_SUPERuserblock
    #H5FD_MEM_BTREEAn allocation request for a node of a B-tree. +
    #H5FD_MEM_DRAWAn allocation request for the raw data of a dataset. +
    #H5FD_MEM_GHEAPAn allocation request for a global heap collection. Global +heaps are used to store certain types of references such as dataset region references. +The set of all global heap collections can become quite large. +
    #H5FD_MEM_LHEAPAn allocation request for a local heap. Local heaps are used +to store the names which are members of a group. The combined size of all local heaps is +a function of the number of object names in the file. +
    #H5FD_MEM_OHDRAn allocation request for (part of) an object header. Object +headers are relatively small and include meta information about objects (like the data +space and type of a dataset) and attributes. +
    + +When a chunk of memory is freed the library adds it to a free list and allocation requests +are satisfied from the free list before requesting memory from the file driver. Each type of +allocation request enumerated above has its own free list, but the file driver can specify that +certain object types can share a free list. It does so by providing an array which maps a +request type to a free list. If any value of the map is H5MF_DEFAULT (zero) then the object's +own free list is used. The special value H5MF_NOLIST indicates that the library should not +attempt to maintain a free list for that particular object type, instead calling the file driver +each time an object of that type is freed. + +Mappings predefined in the 'H5FDpublic.h' file are: + + + + + + + + + + +
    #H5FD_FLMAP_SINGLEAll memory usage types are mapped to a single free list. +
    #H5FD_FLMAP_DICHOTOMYMemory usage is segregated into meta data and raw data +for the purposes of memory management. +
    #H5FD_FLMAP_DEFAULTEach memory usage type has its own free list. +
    + +Example: To make a map that manages object headers on one free list and everything else on +another free list one might initialize the map with the following code: (the use of #H5FD_MEM_SUPER is arbitrary) +\code +H5FD_mem_t mt, map[H5FD_MEM_NTYPES]; + +for (mt = 0; mt < H5FD_MEM_NTYPES; mt++) { + map[mt] = (H5FD_MEM_OHDR== mt) ? mt : H5FD_MEM_SUPER; +} +\endcode + +If an allocation request cannot be satisfied from the free list then one of two things happen. +If the driver defines an allocation callback then it is used to allocate space; otherwise new +memory is allocated from the end of the format address space by incrementing the end-of-address marker. + + + + + +
    static haddr_t alloc (H5FD_t *file, H5MF_type_t type, hsize_t size)The file argument is the file from which space is to be allocated, type is the type of +memory being requested (from the list above) without being mapped according to the freelist +map and size is the number of bytes being requested. The library is allowed to allocate large +chunks of storage and manage them in a layer above the file driver (although the current library +doesn't do that). The allocation function should return a format address for the first byte +allocated. The allocated region extends from that address for size bytes. If the request cannot +be honored then the undefined address value is returned (#HADDR_UNDEF). The first call to this +function for a file which has never had memory allocated must return a format address of zero +or #HADDR_UNDEF since this is how the library allocates space for the userblock and/or superblock.
    + +\subsection subsec_vfl_address_free Freeing Format Regions +When the library is finished using a certain region of the format address space it will return the +space to the free list according to the type of memory being freed and the free list map described above. +If the free list has been disabled for a particular memory usage type (according to the free list map) +and the driver defines a free callback then it will be invoked. The free callback is also invoked for +all entries on the free list when the file is closed. + + + + + + +
    static herr_t free (H5FD_t *file, H5MF_type_t type, haddr_t addr, hsize_t size)The file argument is the file for which space is being freed; type is the type of object being +freed (from the list above) without being mapped according to the freelist map; addr is the first +format address to free; and size is the size in bytes of the region being freed. The region being +freed may refer to just part of the region originally allocated and/or may cross allocation boundaries +provided all regions being freed have the same usage type. However, the library will never attempt +to free regions which have already been freed or which have never been allocated.
    +A driver may choose to not define the free function, in which case format addresses will be leaked. +This isn't normally a huge problem since the library contains a simple free list of its own and freeing +parts of the format address space is not a common occurrence. + +\subsection subsec_vfl_address_query Querying the Address Range +Each file driver must have some mechanism for setting and querying the end of address, or +EOA, marker. The EOA marker is the first format address after the last format address ever allocated. +If the last part of the allocated address range is freed then the driver may optionally decrease the eoa marker. + + + + + +
    static haddr_t get_eoa (H5FD_t *file)This function returns the current value of the EOA marker for the specified file.
    + +Example: The sec2 driver just returns the current eoa marker value which is cached in the file structure: +\code +static haddr_t +H5FD_sec2_get_eoa(H5FD_t *_file) +{ + H5FD_sec2_t *file = (H5FD_sec2_t*)_file; + return file->eoa; +} +\endcode + +The eoa marker is initially zero when a file is opened and the library may set it to some other value +shortly after the file is opened (after the superblock is read and the saved eoa marker is determined) +or when allocating additional memory in the absence of an alloc callback (described above). + +Example: The sec2 driver simply caches the eoa marker in the file structure and does not extend the +underlying Unix file. When the file is flushed or closed then the Unix file size is extended to match +the eoa marker. +\code +static herr_t +H5FD_sec2_set_eoa(H5FD_t *_file, haddr_t addr) +{ + H5FD_sec2_t *file = (H5FD_sec2_t*)_file; + file->eoa = addr; + return 0; +} +\endcode + +\section sec_vfl_data Data Functions +These functions operate on data, transferring a region of the format address space between memory and files. + +\subsection subsec_vfl_data_cont Contiguous I/O Functions +A driver must specify two functions to transfer data from the library to the file and vice versa. + + + + + + + + + +
    static herr_t read (H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, void *buf)The read function reads data from file file beginning at address addr and continuing +for size bytes into the buffer buf supplied by the caller.
    static herr_t write (H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, const void *buf)The write function transfers data +in the opposite direction.
    +\li Both functions take a data transfer property list dxpl which +indicates the fine points of how the data is to be transferred and which comes directly +from the #H5Dread or #H5Dwrite function. +\li Both functions receive type of data being written, +which may allow a driver to tune it's behavior for different kinds of data. +\li Both functions should return +a negative value if they fail to transfer the requested data, or non-negative if they +succeed. The library will never attempt to read from unallocated regions of the format address space. + +Example: The sec2 driver just makes system calls. It tries not to call lseek if the current operation +is the same as the previous operation and the file position is correct. It also fills the output buffer +with zeros when reading between the current EOF and EOA markers and restarts system calls which were interrupted. +\code +static herr_t +H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t type/*unused*/, hid_t dxpl_id/*unused*/, + haddr_t addr, hsize_t size, void *buf/*out*/) +{ + H5FD_sec2_t *file = (H5FD_sec2_t*)_file; + ssize_t nbytes; + + assert(file && file->pub.cls); + assert(buf); + + /* Check for overflow conditions */ + if (REGION_OVERFLOW(addr, size)) return -1; + if (addr+size>file->eoa) return -1; + + /* Seek to the correct location */ + if ((addr!=file->pos || OP_READ!=file->op) && + file_seek(file->fd, (file_offset_t)addr, SEEK_SET)<0) { + file->pos = HADDR_UNDEF; + file->op = OP_UNKNOWN; + return -1; + } + + /* + * Read data, being careful of interrupted system calls, partial results, + * and the end of the file. + */ + while (size>0) { + do nbytes = read(file->fd, buf, size); + while (-1==nbytes && EINTR==errno); + if (-1==nbytes) { + /* error */ + file->pos = HADDR_UNDEF; + file->op = OP_UNKNOWN; + return -1; + } + if (0==nbytes) { + /* end of file but not end of format address space */ + memset(buf, 0, size); + size = 0; + } + assert(nbytes>=0); + assert((hsize_t)nbytes<=size); + size -= (hsize_t)nbytes; + addr += (haddr_t)nbytes; + buf = (char*)buf + nbytes; + } + + /* Update current position */ + file->pos = addr; + file->op = OP_READ; + return 0; +} +\endcode +Example: The sec2 write callback is similar except it updates the file EOF marker when extending the file. + +\subsection subsec_vfl_data_flush Flushing Cached Data +Some drivers may desire to cache data in memory in order to make larger I/O requests to the +underlying file and thus improving bandwidth. Such drivers should register a cache flushing +function so that the library can insure that data has been flushed out of the drivers in +response to the application calling #H5Fflush. + + + + + +
    static herr_t flush (H5FD_t *file)Flush all data for file file to storage.
    + +Example: The sec2 driver doesn't cache any data but it also doesn't extend the Unix file as +aggressively as it should. Therefore, when finalizing a file it should write a zero to the last +byte of the allocated region so that when reopening the file later the EOF marker will be at +least as large as the EOA marker saved in the superblock (otherwise HDF5 will refuse to open +the file, claiming that the data appears to be truncated). +\code +static herr_t +H5FD_sec2_flush(H5FD_t *_file) +{ + H5FD_sec2_t *file = (H5FD_sec2_t*)_file; + + if (file->eoa>file->eof) { + if (-1==file_seek(file->fd, file->eoa-1, SEEK_SET)) return -1; + if (write(file->fd, "", 1)!=1) return -1; + file->eof = file->eoa; + file->pos = file->eoa; + file->op = OP_WRITE; + } + + return 0; +} +\endcode + +\section sec_vfl_opt Optimization Functions +The library is capable of performing several generic optimizations on I/O, but these types of +optimizations may not be appropriate for a given VFL driver. + +Each driver may provide a query function to allow the library to query whether to enable these +optimizations. If a driver lacks a query function, the library will disable all types of +optimizations which can be queried. + + + + + + +
    static herr_t query (const H5FD_t *file, unsigned long *flags)This function is called by the library to query which optimizations to enable for I/O to this driver.
    + +These are the flags which are currently defined: + + + + + + + + + + + + + +
    H5FD_FEAT_AGGREGATE_METADATA (0x00000001)Defining the H5FD_FEAT_AGGREGATE_METADATA for a VFL driver means that the library will attempt to allocate +a larger block for metadata and then sub-allocate each metadata request from that larger block.
    H5FD_FEAT_ACCUMULATE_METADATA (0x00000002)Defining the H5FD_FEAT_ACCUMULATE_METADATA for a VFL driver means that the library will attempt to cache +metadata as it is written to the file and build up a larger block of metadata to eventually pass to the +VFL 'write' routine.
    H5FD_FEAT_DATA_SIEVE (0x00000004)Defining the H5FD_FEAT_DATA_SIEVE for a VFL driver means that the library will attempt to cache raw data + as it is read from/written to a file in a "data sieve" buffer.
    + +See Rajeev Thakur's papers: +http://www.mcs.anl.gov/~thakur/papers/romio-coll.ps.gz +http://www.mcs.anl.gov/~thakur/papers/mpio-high-perf.ps.gz + +\section sec_vfl_reg Registration of a Driver +Before a driver can be used the HDF5 library needs to be told of its existence. This is done by +registering the driver, which results in a driver identification number. Instead of passing many +arguments to the registration function, the driver information is entered into a structure and the +address of the structure is passed to the registration function where it is copied. This allows +the HDF5 API to be extended while providing backward compatibility at the source level. + + + + + + +
    hid_t H5FDregister (H5FD_class_t *cls)The driver described by struct cls is registered with the library and an ID number for the driver is returned.
    + +The H5FD_class_t type is a struct with the following fields: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    const char *nameA pointer to a constant, null-terminated driver name to be used for debugging purposes.
    size_t fapl_sizeThe size in bytes of the file access mode structure or zero if the driver supplies a copy function +or doesn't define the structure.
    void *(*fapl_copy)(const void *fapl)An optional function which copies a driver-defined file access mode structure. This field takes +precedence over fm_size when both are defined.
    void (*fapl_free)(void *fapl)An optional function to free the driver-defined file access mode structure. If null, then the +library calls the C free function to free the structure.
    size_t dxpl_sizeThe size in bytes of the data transfer mode structure or zero if the driver supplies a copy +function or doesn't define the structure.
    void *(*dxpl_copy)(const void *dxpl)An optional function which copies a driver-defined data transfer mode structure. This field +takes precedence over xm_size when both are defined.
    void (*dxpl_free)(void *dxpl)An optional function to free the driver-defined data transfer mode structure. If null, then +the library calls the C free function to free the structure.
    H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr)The function which opens or creates a new file.
    herr_t (*close)(H5FD_t *file)The function which ends access to a file.
    int (*cmp)(const H5FD_t *f1, const H5FD_t *f2)An optional function to determine whether two open files have the same key. If this function +is not present then the library assumes that two files will never be the same.
    int (*query)(const H5FD_t *f, unsigned long *flags)An optional function to determine which library optimizations a driver can support.
    haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hsize_t size)An optional function to allocate space in the file.
    herr_t (*free)(H5FD_t *file, H5FD_mem_t type, haddr_t addr, hsize_t size)An optional function to free space in the file.
    haddr_t (*get_eoa)(H5FD_t *file)A function to query how much of the format address space has been allocated.
    herr_t (*set_eoa)(H5FD_t *file, haddr_t)A function to set the end of address space.
    haddr_t (*get_eof)(H5FD_t *file)A function to return the current end-of-file marker value.
    herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, void *buffer)A function to read data from a file.
    herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, const void *buffer)A function to write data to a file.
    herr_t (*flush)(H5FD_t *file)A function which flushes cached data to the file.
    H5FD_mem_t fl_map[H5FD_MEM_NTYPES]An array which maps a file allocation request type to a free list.
    + +Example: The sec2 driver would be registered as: +\code +static const H5FD_class_t H5FD_sec2_g = { + "sec2", /*name */ + MAXADDR, /*maxaddr */ + NULL, /*sb_size */ + NULL, /*sb_encode */ + NULL, /*sb_decode */ + 0, /*fapl_size */ + NULL, /*fapl_get */ + NULL, /*fapl_copy */ + NULL, /*fapl_free */ + 0, /*dxpl_size */ + NULL, /*dxpl_copy */ + NULL, /*dxpl_free */ + H5FD_sec2_open, /*open */ + H5FD_sec2_close, /*close */ + H5FD_sec2_cmp, /*cmp */ + H5FD_sec2_query, /*query */ + NULL, /*alloc */ + NULL, /*free */ + H5FD_sec2_get_eoa, /*get_eoa */ + H5FD_sec2_set_eoa, /*set_eoa */ + H5FD_sec2_get_eof, /*get_eof */ + H5FD_sec2_read, /*read */ + H5FD_sec2_write, /*write */ + H5FD_sec2_flush, /*flush */ + H5FD_FLMAP_SINGLE, /*fl_map */ +}; + +hid_t +H5FD_sec2_init(void) +{ + if (!H5FD_SEC2_g) { + H5FD_SEC2_g = H5FDregister(&H5FD_sec2_g); + } + return H5FD_SEC2_g; +} +\endcode + +A driver can be removed from the library by unregistering it + + + + + +
    herr_t H5Dunregister (hid_t driver)Where driver is the ID number returned when the driver was registered.
    +Unregistering a driver makes it unusable for creating new file access or data transfer property +lists but doesn't affect any property lists or files that already use that driver. + +\subsection subsec_vfl_reg_prog Programming Note for C++ Developers Using C Functions +If a C routine that takes a function pointer as an argument is called from within C++ code, +the C routine should be returned from normally. + +Examples of this kind of routine include callbacks such as #H5Pset_elink_cb +and #H5Pset_type_conv_cb and functions such as #H5Tconvert and #H5Ewalk2. + +Exiting the routine in its normal fashion allows the HDF5 C Library to clean up +its work properly. In other words, if the C++ application jumps out of the routine +back to the C++ “catch” statement, the library is not given the opportunity to close +any temporary data structures that were set up when the routine was called. The C++ +application should save some state as the routine is started so that any problem that +occurs might be diagnosed. + +\section sec_vfl_query Querying Driver Information + + + + + +
    void * H5Pget_driver_data (hid_t fapl)
    void * H5Pget_driver_data (hid_t fxpl)
    This function is intended to be used by driver functions, not applications. It returns a pointer +directly into the file access property list fapl which is a copy of the driver's file access mode +originally provided to the H5Pset_driver function. If its argument is a data transfer property list +fxpl then it returns a pointer to the driver-specific data transfer information instead. +
    + +\section sec_vfl_misc Miscellaneous +The various private H5F_low_* functions will be replaced by public H5FD* functions so they +can be called from drivers. + +All private functions H5F_addr_* which operate on addresses will be renamed as public functions +by removing the first underscore so they can be called by drivers. + +The haddr_t address data type will be passed by value throughout the library. The original +intent was that this type would eventually be a union of file address types for the various +drivers and may become quite large, but that was back when drivers were part of HDF5. It will +become an alias for an unsigned integer type (32 or 64 bits depending on how the library was configured). + +The various H5F*.c driver files will be renamed H5FD*.c and each will have a corresponding header +file. All driver functions except the initializer and API will be declared static. + +This documentation didn't cover optimization functions which would be useful to drivers like MPI-IO. +Some drivers may be able to perform data pipeline operations more efficiently than HDF5 and need to +be given a chance to override those parts of the pipeline. The pipeline would be designed to call +various H5FD optimization functions at various points which return one of three values: the operation +is not implemented by the driver, the operation is implemented but failed in a non-recoverable manner, +the operation is implemented and succeeded. + +Various parts of HDF5 check the only the top-level file driver and do something special if it is +the MPI-IO driver. However, we might want to be able to put the MPI-IO driver under other drivers +such as the raw part of a split driver or under a debug driver whose sole purpose is to accumulate +statistics as it passes all requests through to the MPI-IO driver. Therefore we will probably need +a function which takes a format address and or object type and returns the driver which would have +been used at the lowest level to process the request. */ -/** \page FILEIMGOPS HDF5 File Image Operations +/** \page FMTDISC HDF5 File Format Discussion -\htmlinclude FileImageOps.html +\htmlinclude FileFormat.html */ /** \page APPDBG Debugging HDF5 Applications -\htmlinclude DebuggingHDF5Applications.html +\section sec_adddbg_intro Introduction +The HDF5 library contains a number of debugging features to make programmers' lives +easier including the ability to print detailed error messages, check invariant +conditions, display timings and other statistics. + +\subsection subsec_adddbg_intro_err Error Messages +Error messages are normally displayed automatically on the standard error stream and +include a stack trace of the library including file names, line numbers, and function +names. The application has complete control over how error messages are displayed and +can disable the display on a permanent or temporary basis. Refer to the documentation + for the H5E error handling package. + +\subsection subsec_adddbg_intro_invar Invariant Conditions +Unless NDEBUG is defined during compiling, the library will include code to verify that +invariant conditions have the expected values. When a problem is detected the library will +display the file and line number within the library and the invariant condition that +failed. A core dump may be generated for post mortem debugging. The code to perform these +checks can be included on a per-package bases. + +\subsection subsec_adddbg_intro_stats Timings and Statistics +The library can be configured to accumulate certain statistics about things like cache +performance, datatype conversion, data space conversion, and data filters. The code is +included on a per-package basis and enabled at runtime by an environment variable. + +\subsection subsec_adddbg_intro_trace API Tracing +All API calls made by an application can be displayed and include formal argument names +and actual values and the function return value. This code is also conditionally included +at compile time and enabled at runtime. + +The statistics and tracing can be displayed on any output stream (including streams opened by +the shell) with output from different packages even going to different streams. + +\section sec_adddbg_msg Error Messages +By default any API function that fails will print an error stack to the standard error stream. +\code +HDF5-DIAG: Error detected in thread 0. Back trace follows. + #000: H5F.c line 1245 in H5Fopen(): unable to open file + major(04): File interface + minor(10): Unable to open file + #001: H5F.c line 846 in H5F_open(): file does not exist + major(04): File interface + minor(10): Unable to open file +\endcode +The error handling package (H5E) is described elsewhere. + +\section sec_adddbg_invars Invariant Conditions +To include checks for invariant conditions the library should be configured +with --disable-production, the default for versions before 1.2. The library +designers have made every attempt to handle error conditions gracefully but +an invariant condition assertion may fail in certain cases. The output from +a failure usually looks something like this: +\code +Assertion failed: H5.c:123: i + +Name + +Default + +Description + + + +aNoAttributes + + +acYesMeta data cache + + +bYesB-Trees + + +dYesDatasets + + +eYesError handling + + +fYesFiles + + +gYesGroups + + +hgYesGlobal heap + + +hlNoLocal heaps + + +iYesInterface abstraction + + +mfNoFile memory management + + +mmYesLibrary memory management + + +oNoObject headers and messages + + +pYesProperty lists + + +sYesData spaces + + +tYesDatatypes + + +vYesVectors + + +zYesRaw data filters + + + +In addition to including the code at compile time the application must enable each package at +runtime. This is done by listing the package names in the HDF5_DEBUG environment variable. That +variable may also contain file descriptor numbers (the default is '2') which control the output +for all following packages up to the next file number. The word 'all' refers to all packages. Any +word my be preceded by a minus sign to turn debugging off for the package. + +\subsection subsec_adddbg_stats_sample Sample debug specifications + + + + + + + + + + + + + +
    all +This causes debugging output from all packages to be sent to the standard error stream. +
    all -t -s +Debugging output for all packages except datatypes and data spaces will appear on the standard error stream. +
    -all ac 255 t,s +This disables all debugging even if the default was to debug something, then output +from the meta data cache is send to the standard error stream and output from data types +and spaces is sent to file descriptor 255 which should be redirected by the shell. +
    +The components of the HDF5_DEBUG value may be separated by any non-lowercase letter. */ @@ -80,7 +1248,7 @@ A beneficial side effect of using SWMR access is better fault tolerance. It is m \subsection subsec_swmr_doc Documentation \subsubsection subsubsec_swmr_doc_guide User Guide -SWMR User Guide +SWMR User Guide \subsubsection subsubsec_swmr_doc_apis HDF5 Library APIs
      @@ -89,7 +1257,7 @@ A beneficial side effect of using SWMR access is better fault tolerance. It is m
    • #H5Pset_object_flush_cb — Sets a callback function to invoke when an object flush occurs in the file
    • #H5Pget_object_flush_cb — Retrieves the object flush property values from the file access property list
    • #H5Odisable_mdc_flushes — Prevents metadata entries for an HDF5 object from being flushed from the metadata cache to storage
    • -
    • #H5Oenable_mdc_flushes — Enables flushing of dirty metadata entries from a file’s metadata cache
    • +
    • #H5Oenable_mdc_flushes — Enables flushing of dirty metadata entries from a file's metadata cache
    • #H5Oare_mdc_flushes_disabled — Determines if an HDF5 object has had flushes of metadata entries disabled
    @@ -199,6 +1367,150 @@ close properly. It will contain data up to the point that it was interrupted. */ +/** \page UNICODE Using UTF-8 Encoding in HDF5 Applications + +\section sec_unicode_intro Introduction +Text and character data are often discussed as though text means ASCII text. We even go so far as +to call a file containing only ASCII text a plain text file. This works reasonably well for English +(though better for American English than British English), but what if that plain text file is in +French, German, Chinese, or any of several hundred other languages? This document introduces the +use of UTF-8 encoding (see note 1), enabling the use of a much more extensive and flexible character +set that can faithfully represent any of those languages. + +This document assumes a working familiarity with UTF-8 and Unicode. Any reader who is unfamiliar +with UTF-8 encoding should read the [Wikipedia UTF-8 article](https://en.wikipedia.org/wiki/UTF-8) +before proceeding; it provides an excellent primer. + +For our context, the most important UTF-8 concepts are: +\li Multi-byte and variable-size character encodings +\li Limitations of the ASCII character set +\li Risks associated with the use of the term plain text +\li Representation of multiple language alphabets or characters in a single document + +More specific technical details will only become important if they affect the specifics of +your application design or implementation. + +\section sec_unicode_support How and Where Is UTF-8 Supported in HDF5? +HDF5 uses characters in object names (which are actually link names, but that's a story for a +different article), dataset raw data, attribute names, and attribute raw data. Though the +mechanisms differ, you can use either ASCII or UTF-8 character sets in all of these situations. + +\subsection subsec_unicode_support_names Object and Attribute Names +By default, HDF5 creates object and attribute names with ASCII character encoding. An object or +attribute creation property list setting is required to create object names with UTF-8 characters. +This uses the function #H5Pset_char_encoding, which sets the character encoding used for object and attribute names. + +For example, the following call sequence could be used to create a dataset with its name encoded with the UTF-8 character set: + +\code + lcpl_id = H5Pcreate(H5P_LINK_CREATE) ; + error = H5Pset_char_encoding(lcpl_id, H5T_CSET_UTF8) ; + dataset_id = H5Dcreate2(group_id, "datos_ñ", datatype_id, dataspace_id, + lcpl_id, H5P_DEFAULT, H5P_DEFAULT) ; +\endcode + +If the character encoding of an attribute name is unknown, the combination of an +#H5Aget_create_plist call and an #H5Pget_char_encoding call will reveal that information. +If the character encoding of an object name is unknown, the information can be accessed +through the object's H5L_info_t structure which can be obtained using #H5Lvisit or #H5Lget_info_by_idx calls. + +\subsection subsec_unicode_support_char Character Datatypes in Datasets and Attributes +Like object names, HDF5 character data in datasets and attributes is encoded as ASCII by +default. Setting up attribute or dataset character data to be UTF-8-encoded is accomplished +while defining the attribute or dataset datatype. This makes use of the function #H5Tset_cset, +which sets the character encoding to be used in building a character datatype. + +For example, the following commands could be used to create an 8-character, UTF-8 encoded, +string datatype for use in either an attribute or dataset: + +\code + datatype_id = H5Tcopy(H5T_C_S1); + error = H5Tset_cset(datatype_id, H5T_CSET_UTF8); + error = H5Tset_size(datatype_id, "8"); +\endcode + +If a character or string datatype's character encoding is unknown, the combination of an +#H5Aget_type or #H5Dget_type call and an #H5Tget_cset call can be used to determine that. + +\section sec_unicode_warn Caveats, Pitfalls, and Things to Watch For +Programmers who are accustomed to using ASCII text without accommodating other text +encodings will have to be aware of certain common issues as they begin using UTF-8 encodings. + +\subsection subsec_unicode_warn_port Cross-platform Portability +Since the HDF5 Library handles datatypes directly, UTF-8 encoded text in dataset and +attribute datatypes in a well-designed HDF5 application and file should work transparently +across platforms. The same should be true of handling names of groups, datasets, committed +datatypes, and attributes within a file. + +Be aware, however, of system or application limitations once data or other information +has been extracted from an HDF5 file. The application or system must be designed to +accommodate UTF-8 encodings if the information is then used elsewhere in the application or system environment. + +Data from a UTF-8 encoded HDF5 datatype, in either a dataset or an attribute, +that has been established within an HDF5 application should "just work" within the HDF5 portions of the application. + +\subsection subsec_unicode_warn_names Filenames +Since file access is a system issue, filenames do not fall within the scope +of HDF5's UTF-8 capabilities; filenames are encoded at the system level. + +Linux and Mac OS systems normally handle UTF-8 encoded filenames correctly +while Windows systems generally do not. + +\section sec_unicode_text The *Plain Text* Illusion +Beware the use of the term *plain text*. *Plain text* is at best ambiguous, but often +misleading. Many will assume that *plain text* means ASCII, but plain text German or +French, for example, cannot be represented in ASCII. Plain text is only unambiguous +in the context of English (and even then can be problematic!). + +\subsection subsec_unicode_warn_store Storage Size +Programmers and data users accustomed to working strictly with ASCII data generally make +the reasonable assumption that 1 character, be it in an object name or in data, requires +1 byte of storage. This equation does not work when using UTF-8 or any other Unicode encoding. +With Unicode encoding, number of characters is not synonymous with number of bytes. One must +get used to thinking in terms of number of characters when talking about content, reserving +number of bytes for discussions of storage size. + +When working with Unicode text, one can no longer assume a 1:1 correspondence between the +number of characters and the data storage requirement. + +\subsection subsec_unicode_warn_sys System Dependencies +Linux, Unix, and similar systems generally handle UTF-8 encodings in correct and +predictable ways. There is an apparent consensus in the Linux community that "UTF-8 is just the right way to go." + +Mac OS systems generally handle UTF-8 encodings correctly. + +Windows systems use a different Unicode encoding, UCS-2 (discussed in this UTF-16 article) at +the system level. Within an HDF5 file and application on a Windows system, UTF-8 encoding should +work correctly and as expected. Problems may arise, however, when that UTF-8 encoding is exposed +directly to the Windows system. For example: +\li File open and close calls on files with UTF-8 encoded names are likely to fail as the HDF5 +open and close operations interact directly with the Windows file system interface. +\li Anytime an HDF5 command-line utility (\ref H5TOOL_LS_UG or \ref H5TOOL_DP_UG, for example) emits text output, the +Windows system must interpret the character encodings. If that output is UTF-8 encoded, Windows +will correctly interpret only those characters in the ASCII subset of UTF-8. + +\section sec_unicode_common Common Characters in UTF-8 and ASCII +One interesting feature of UTF-8 and ASCII is that the ASCII character set is a discrete subset of +the UTF-8 character set. And where they overlap, the encodings are identical. This means that a +character string consisting entirely of members of the ASCII character set can be encoded in either +ASCII or UTF-8, the two encodings will be indistinguishable, and the encodings will require exactly the same storage space. + + +\section sec_unicode_also See Also + +- For object and attribute names: + * #H5Pset_char_encoding + * #H5Pget_char_encoding +- For dataset and attribute datatypes: + * #H5Tset_cset + * #H5Tget_cset +- [UTF-8 article on Wikipedia](https://en.wikipedia.org/wiki/UTF-8) + +

    NOTES

    +1. UTF-8 is the only Unicode standard encoding supported in HDF5. + +*/ + /** \page VDS Introduction to the Virtual Dataset - VDS \section sec_vds_intro Introduction to VDS diff --git a/doxygen/dox/UsersGuide.dox b/doxygen/dox/UsersGuide.dox index d036e751153..03151473d2a 100644 --- a/doxygen/dox/UsersGuide.dox +++ b/doxygen/dox/UsersGuide.dox @@ -304,12 +304,54 @@
  • \ref subsubsec_vol_compat_opt
+\ref sec_file_image +\li \ref subsec_file_image_intro +\li \ref subsec_file_image_api +
    +
  • \ref subsubsec_file_image_api_low +
  • \ref subsubsec_file_image_api_high +
+\li \ref subsec_file_image_semantics +
    +
  • \ref subsubsec_file_image_semantics_cbk +
  • \ref subsubsec_file_image_semantics_init +
+\li \ref subsec_file_image_example +
    +
  • \ref subsubsec_file_image_example_read +
  • \ref subsubsec_file_image_example_const +
  • \ref subsubsec_file_image_example_dp +
  • \ref subsubsec_file_image_example_template +
+\li \ref subsec_file_image_java +\li \ref subsec_file_image_fort +
    +
  • \ref subsubsec_file_image_fort_low +
  • \ref subsubsec_file_image_fort_high +
+ \ref sec_async \li \ref subsec_async_intro \ref sec_map \ref sec_cltools +\li \ref H5TOOL_CP_UG +\li \ref H5TOOL_DF_UG +\li \ref H5TOOL_DP_UG +\li \ref H5TOOL_FC_UG +\li \ref H5TOOL_IM_UG +\li \ref H5TOOL_JAM_UG +\li \ref H5TOOL_LS_UG +\li \ref H5TOOL_RP_UG +\li \ref H5TOOL_ST_UG +\li \ref H5TOOL_CR_UG +\li \ref H5TOOL_DG_UG +\li \ref H5TOOL_DT_UG +\li \ref H5TOOL_MG_UG +\li \ref H5TOOL_RT_UG +\li \ref H5TOOL_WH_UG + \ref sec_addition @@ -337,7 +379,7 @@ These documents provide additional information for the use and tuning of specifi -

Chunking in HDF5

+

@ref hdf5_chunking

Structuring the use of chunking and tuning it for performance.

@@ -345,7 +387,7 @@ These documents provide additional information for the use and tuning of specifi -

Using the Direct Chunk Write Function

+

@ref H5DO_UG

Describes another way that chunks can be written to datasets.

@@ -377,7 +419,7 @@ These documents provide additional information for the use and tuning of specifi -

HDF5 File Image Operations

+

\ref H5FIM_UG

Describes how to work with HDF5 files in memory. Disk I/O is not required when file images are opened, created, read from, or written to.

diff --git a/doxygen/dox/VOLConnGuide.dox b/doxygen/dox/VOLConnGuide.dox index 9781261e58c..547d6eb76cb 100644 --- a/doxygen/dox/VOLConnGuide.dox +++ b/doxygen/dox/VOLConnGuide.dox @@ -4205,7 +4205,7 @@ he type must be a VOL-managed object class: Retrieves a copy of the internal state of the HDF5 library, so that it can be restored later. Returns a positive value on success and a negative value on errors. -\subsubsection subsubsecVOLNewPassstar H5VLstart_lib_state +\subsubsection subsubsecVOLNewPassstar H5VLopen_lib_context @@ -4213,13 +4213,12 @@ value on success and a negative value on errors.
Signature:
\code - herr_t H5VLstart_lib_state(void); + herr_t H5VLopen_lib_context(void **context); \endcode
-Opens a new internal state for the HDF5 library. Returns a positive value on success and a negative value -on errors. +Opens a new internal context for the HDF5 library. Returns a non-negative value if \p *context is set; otherwise returns negative value if \p *context is unset. \subsubsection subsubsecVOLNewPassrestore H5VLrestore_lib_state @@ -4246,7 +4245,7 @@ on errors.
Restores the internal state of the HDF5 library. Returns a positive value on success and a negative value on errors. -\subsubsection subsubsecVOLNewPassfinish H5VLfinish_lib_state +\subsubsection subsubsecVOLNewPassfinish H5VLclose_lib_context @@ -4254,12 +4253,12 @@ Restores the internal state of the HDF5 library. Returns a positive value on suc
Signature:
\code - herr_t H5VLfinish_lib_state(void); + herr_t H5VLclose_lib_context(void *context); \endcode
-Closes the state of the library, undoing the effects of #H5VLstart_lib_state. Returns a positive value on +Closes the state of the library, undoing the effects of #H5VLopen_lib_context. Returns a positive value on success and a negative value on errors. \subsubsection subsubsecVOLNewPassfree H5VLfree_lib_state diff --git a/doxygen/dox/ViewTools.dox b/doxygen/dox/ViewTools.dox index 43686751bfb..6bb000eb71b 100644 --- a/doxygen/dox/ViewTools.dox +++ b/doxygen/dox/ViewTools.dox @@ -303,6 +303,8 @@ GROUP "/" { } \endcode +\see H5TOOL_DP_UG for more information. + \subsection subsecViewToolsViewContent_h5ls h5ls The h5ls tool by default just displays the objects in the root group. It will not display items in groups beneath the root group unless specified. Useful h5ls options for viewing @@ -355,6 +357,8 @@ The output is shown below: /HDFEOS\ INFORMATION/StructMetadata.0 Dataset {SCALAR} \endcode +\see H5TOOL_LS_UG for more information. + \section secViewToolsViewDset Datasets and Dataset Properties Both h5dump and h5ls can be used to view specific datasets.
    diff --git a/doxygen/dox/chunking_in_hdf5.dox b/doxygen/dox/chunking_in_hdf5.dox new file mode 100644 index 00000000000..b46662a3a5b --- /dev/null +++ b/doxygen/dox/chunking_in_hdf5.dox @@ -0,0 +1,398 @@ +/** \page hdf5_chunking Chunking in HDF5 + * + * \section sec_hdf5_chunking_intro Introduction + * Datasets in HDF5 not only provide a convenient, structured, and self-describing way to store data, + * but are also designed to do so with good performance. In order to maximize performance, the HDF5 + * library provides ways to specify how the data is stored on disk, how it is accessed, and how it should be held in memory. + * + * \section sec_hdf5_chunking_def What are Chunks? + * Datasets in HDF5 can represent arrays with any number of dimensions (up to 32). However, in the file this dataset + * must be stored as part of the 1-dimensional stream of data that is the low-level file. The way in which the multidimensional + * dataset is mapped to the serial file is called the layout. The most obvious way to accomplish this is to simply flatten the + * dataset in a way similar to how arrays are stored in memory, serializing the entire dataset into a monolithic block on disk, + * which maps directly to a memory buffer the size of the dataset. This is called a contiguous layout. + * + * An alternative to the contiguous layout is the chunked layout. Whereas contiguous datasets are stored in a single block in + * the file, chunked datasets are split into multiple chunks which are all stored separately in the file. The chunks can be + * stored in any order and any position within the HDF5 file. Chunks can then be read and written individually, improving + * performance when operating on a subset of the dataset. + * + * The API functions used to read and write chunked datasets are exactly the same functions used to read and write contiguous + * datasets. The only difference is a single call to set up the layout on a property list before the dataset is created. In this + * way, a program can switch between using chunked and contiguous datasets by simply altering that call. Example 1, below, creates + * a dataset with a size of 12x12 and a chunk size of 4x4. The example could be changed to create a contiguous dataset instead by + * simply commenting out the call to #H5Pset_chunk and changing dcpl_id in the #H5Dcreate call to #H5P_DEFAULT. + * + * Example 1: Creating a chunked dataset + * \code + * #include "hdf5.h" + * #define FILENAME "file.h5" + * #define DATASET "dataset" + * + * int main() { + * + * hid_t file_id, dset_id, space_id, dcpl_id; + * hsize_t chunk_dims[2] = {4, 4}; + * hsize_t dset_dims[2] = {12, 12}; + * herr_t status; + * int i, j; + * int buffer[12][12]; + * + * // Create the file + * file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + * + * // Create a dataset creation property list and set it to use chunking + * dcpl_id = H5Pcreate(H5P_DATASET_CREATE); + * status = H5Pset_chunk(dcpl_id, 2, chunk_dims); + * + * // Create the dataspace and the chunked dataset + * space_id = H5Screate_simple(2, dset_dims, NULL); + * dset_id = H5Dcreate(file_id, DATASET, H5T_STD_I32BE, space_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT); + * + * // Initialize dataset + * for (i = 0; i < 12; i++) + * for (j = 0; j < 12; j++) + * buffer[i][j] = i + j + 1; + * + * // Write to the dataset + * status = H5Dwrite(dset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buffer); + * + * // Close + * status = H5Dclose(dset_id); + * status = H5Sclose(space_id); + * status = H5Pclose(dcpl_id); + * status = H5Fclose(file_id); + * } + * \endcode + * + * The chunks of a chunked dataset are split along logical boundaries in the dataset's representation as an array, not + * along boundaries in the serialized form. Suppose a dataset has a chunk size of 2x2. In this case, the first chunk + * would go from (0,0) to (2,2), the second from (0,2) to (2,4), and so on. By selecting the chunk size carefully, it is + * possible to fine tune I/O to maximize performance for any access pattern. Chunking is also required to use advanced + * features such as compression and dataset resizing. + * + * + * + * + * + *
    + * \image html chunking1and2.png + *
    + * + * \section sec_hdf5_chunking_data Data Storage Order + * To understand the effects of chunking on I/O performance it is necessary to understand the order in which data is + * actually stored on disk. When using the C interface, data elements are stored in "row-major" order, meaning that, + * for a 2- dimensional dataset, rows of data are stored in-order on the disk. This is equivalent to the storage order + * of C arrays in memory. + * + * Suppose we have a 10x10 contiguous dataset B. The first element stored on disk is B[0][0], the second B[0][1], + * the eleventh B[1][0], and so on. If we want to read the elements from B[2][3] to B[2][7], we have to read the + * elements in the 24th, 25th, 26th, 27th, and 28th positions. Since all of these positions are contiguous, or next + * to each other, this can be done in a single read operation: read 5 elements starting at the 24th position. This + * operation is illustrated in figure 3: the pink cells represent elements to be read and the solid line represents + * a read operation. Now suppose we want to read the elements in the column from B[3][2] to B[7][2]. In this case we + * must read the elements in the 33rd, 43rd, 53rd, 63rd, and 73rd positions. Since these positions are not contiguous, + * this must be done in 5 separate read operations. This operation is illustrated in figure 4: the solid lines again + * represent read operations, and the dotted lines represent seek operations. An alternative would be to perform a single + * large read operation, in this case 41 elements starting at the 33rd position. This is called a sieve buffer and is + * supported by HDF5 for contiguous datasets, but not for chunked datasets. By setting the chunk sizes correctly, it + * is possible to greatly exceed the performance of the sieve buffer scheme. + * + * + * + * + * + *
    + * \image html chunking3and4.png + *
    + * + * Likewise, in higher dimensions, the last dimension specified is the fastest changing on disk. So if we have a four + * dimensional dataset A, then the first element on disk would be A[0][0][0][0], the second A[0][0][0][1], the third A[0][0][0][2], and so on. + * + * \section sec_hdf5_chunking_part Chunking and Partial I/O + * The issues outlined above regarding data storage order help to illustrate one of the major benefits of dataset chunking, + * its ability to improve the performance of partial I/O. Partial I/O is an I/O operation (read or write) which operates + * on only one part of the dataset. To maximize the performance of partial I/O, the data elements selected for I/O must be + * contiguous on disk. As we saw above, with a contiguous dataset, this means that the selection must always equal the extent + * in all but the slowest changing dimension, unless the selection in the slowest changing dimension is a single element. With + * a 2-d dataset in C, this means that the selection must be as wide as the entire dataset unless only a single row is selected. + * With a 3-d dataset, this means that the selection must be as wide and as deep as the entire dataset, unless only a single row + * is selected, in which case it must still be as deep as the entire dataset, unless only a single column is also selected. + * + * Chunking allows the user to modify the conditions for maximum performance by changing the regions in the dataset which are + * contiguous. For example, reading a 20x20 selection in a contiguous dataset with a width greater than 20 would require 20 + * separate and non-contiguous read operations. If the same operation were performed on a dataset that was created with a + * chunk size of 20x20, the operation would require only a single read operation. In general, if your selections are always + * the same size (or multiples of the same size), and start at multiples of that size, then the chunk size should be set to the + * selection size, or an integer divisor of it. This recommendation is subject to the guidelines in the pitfalls section; + * specifically, it should not be too small or too large. + * + * Using this strategy, we can greatly improve the performance of the operation shown in figure 4. If we create the + * dataset with a chunk size of 10x1, each column of the dataset will be stored separately and contiguously. The read + * of a partial column can then be done is a single operation. This is illustrated in figure 5, and the code to implement + * a similar operation is shown in example 2. For simplicity, example 2 implements writing to this dataset instead of reading from it. + * + * + * + * + * + *
    + * \image html chunking5.png + *
    + * + * + * Example 2: Writing part of a column to a chunked dataset + * \code + * #include "hdf5.h" + * #define FILENAME "file.h5" + * #define DATASET "dataset" + * + * int main() { + * + * hid_t file_id, dset_id, fspace_id, mspace_id, dcpl_id; + * hsize_t chunk_dims[2] = {10, 1}; + * hsize_t dset_dims[2] = {10, 10}; + * hsize_t mem_dims[1] = {5}; + * hsize_t start[2] = {3, 2}; + * hsize_t count[2] = {5, 1}; + * herr_t status; + * int buffer[5], i; + * + * // Create the file + * file_id = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + * + * // Create a dataset creation property list to use chunking with a chunk size of 10x1 + * dcpl_id = H5Pcreate(H5P_DATASET_CREATE); + * + * status = H5Pset_chunk(dcpl_id, 2, chunk_dims); + * + * // Create the dataspace and the chunked dataset + * fspace_id = H5Screate_simple(2, dset_dims, NULL); + * + * dset_id = H5Dcreate(file_id, DATASET, H5T_STD_I32BE, fspace_id, H5P_DEFAULT, dcpl_id, H5P_DEFAULT); + * + * // Select the elements from 3, 2 to 7, 2 + * status = H5Sselect_hyperslab(fspace_id, H5S_SELECT_SET, start, NULL, count, NULL); + * + * // Create the memory dataspace + * mspace_id = H5Screate_simple(1, mem_dims, NULL); + * + * // Initialize dataset + * for (i = 0; i < 5; i++) + * buffer[i] = i+1; + * + * // Write to the dataset + * status = H5Dwrite(dset_id, H5T_NATIVE_INT, mspace_id, fspace_id, H5P_DEFAULT, buffer); + * + * // Close + * status = H5Dclose(dset_id); + * status = H5Sclose(fspace_id); + * status = H5Sclose(mspace_id); + * status = H5Pclose(dcpl_id); + * status = H5Fclose(file_id); + * } + * \endcode + * + * \section sec_hdf5_chunking_cache Chunk Caching + * Another major feature of the dataset chunking scheme is the chunk cache. As it sounds, this is a cache of the chunks in + * the dataset. This cache can greatly improve performance whenever the same chunks are read from or written to multiple + * times, by preventing the library from having to read from and write to disk multiple times. However, the current + * implementation of the chunk cache does not adjust its parameters automatically, and therefore the parameters must be + * adjusted manually to achieve optimal performance. In some rare cases it may be best to completely disable the chunk + * caching scheme. Each open dataset has its own chunk cache, which is separate from the caches for all other open datasets. + * + * When a selection is read from a chunked dataset, the chunks containing the selection are first read into the cache, and then + * the selected parts of those chunks are copied into the user's buffer. The cached chunks stay in the cache until they are evicted, + * which typically occurs because more space is needed in the cache for new chunks, but they can also be evicted if hash values + * collide (more on this later). Once the chunk is evicted it is written to disk if necessary and freed from memory. + * + * This process is illustrated in figures 6 and 7. In figure 6, the application requests a row of values, and the library responds + * by bringing the chunks containing that row into cache, and retrieving the values from cache. In figure 7, the application requests + * a different row that is covered by the same chunks, and the library retrieves the values directly from cache without touching the disk. + * + * + * + * + * + *
    + * \image html chunking6.png + *
    + * + * + * + * + * + *
    + * \image html chunking7.png + *
    + * + * In order to allow the chunks to be looked up quickly in cache, each chunk is assigned a unique hash value that is + * used to look up the chunk. The cache contains a simple array of pointers to chunks, which is called a hash table. + * A chunk's hash value is simply the index into the hash table of the pointer to that chunk. While the pointer at this + * location might instead point to a different chunk or to nothing at all, no other locations in the hash table can contain + * a pointer to the chunk in question. Therefore, the library only has to check this one location in the hash table to tell + * if a chunk is in cache or not. This also means that if two or more chunks share the same hash value, then only one of + * those chunks can be in the cache at the same time. When a chunk is brought into cache and another chunk with the same hash + * value is already in cache, the second chunk must be evicted first. Therefore it is very important to make sure that the size + * of the hash table, also called the nslots parameter in #H5Pset_cache and #H5Pset_chunk_cache, is large enough to minimize + * the number of hash value collisions. + * + * Prior to 1.10, the library determines the hash value for a chunk by assigning a unique index that is a linear index + * into a hypothetical array of chunks. That is, the upper-left chunk has an index of 0, the one to the right of that + * has an index of 1, and so on. + * + * For example, the algorithm prior to 1.10 simply incremented the index by one along the fastest growing dimension. + * The diagram below illustrates the indices for a 5 x 3 chunk prior to HDF5 1.10: + * \code + * 0 1 2 + * 3 4 5 + * 6 7 8 + * 9 10 11 + * 12 13 14 + * \endcode + * + * As of HDF5 1.10, the library uses a more complicated way to determine the chunk index. Each dimension gets a fixed + * number of bits for the number of chunks in that dimension. When creating the dataset, the library first determines the + * number of bits needed to encode the number of chunks in each dimension individually by using the log2 function. It then + * partitions the chunk index into bitfields, one for each dimension, where the size of each bitfield is as computed above. + * The fastest changing dimension is the least significant bit. To compute the chunk index for an individual chunk, for each + * dimension, the coordinates of that chunk in an array of chunks is placed into the corresponding bitfield. The 5 x 3 chunk + * example above needs 5 bits for its indices (as shown below, the 3 bits in blue are for the row, and the 2 bits in green are for the column) + * + * + * + * + * + *
    + * \image html chunking8.png "5 bits" + *
    + * + * Therefore, the indices for the 5 x 3 chunks become like this: + * \code + * 0 1 2 + * 4 5 6 + * 8 9 10 + * 12 13 14 + * 16 17 18 + * \endcode + * + * This index is then divided by the size of the hash table, nslots, and the remainder, or modulus, is the hash value. + * Because this scheme can result in regularly spaced indices being used frequently, it is important that nslots be a + * prime number to minimize the chance of collisions. In general, nslots should probably be set to a number approximately + * 100 times the number of chunks that can fit in nbytes bytes, unless memory is extremely limited. There is of course no + * advantage in setting nslots to a number larger than the total number of chunks in the dataset. + * + * The w0 parameter affects how the library decides which chunk to evict when it needs room in the cache. If w0 is set to 0, + * then the library will always evict the least recently used chunk in cache. If w0 is set to 1, the library will always evict + * the least recently used chunk which has been fully read or written, and if none have been fully read or written, it will + * evict the least recently used chunk. If w0 is between 0 and 1, the behavior will be a blend of the two. Therefore, if the + * application will access the same data more than once, w0 should be set closer to 0, and if the application does not, w0 + * should be set closer to 1. + * + * It is important to remember that chunk caching will only give a benefit when reading or writing the same chunk more than + * once. If, for example, an application is reading an entire dataset, with only whole chunks selected for each operation, + * then chunk caching will not help performance, and it may be preferable to completely disable the chunk cache in order to + * save memory. It may also be advantageous to disable the chunk cache when writing small amounts to many different chunks, + * if memory is not large enough to hold all those chunks in cache at once. + * + * \section sec_hdf5_chunking_filt I/O Filters and Compression + * + * Dataset chunking also enables the use of I/O filters, including compression. The filters are applied to each chunk individually, + * and the entire chunk is processed at once. The filter must be applied every time the chunk is loaded into cache, and every time + * the chunk is flushed to disk. These facts all make choosing the proper settings for the chunk cache and chunk size even more + * critical for the performance of filtered datasets. + * + * Because the entire chunk must be filtered every time disk I/O occurs, it is no longer a viable option to disable the + * chunk cache when writing small amounts of data to many different chunks. To achieve acceptable performance, it is critical + * to minimize the chance that a chunk will be flushed from cache before it is completely read or written. This can be done by + * increasing the size of the chunk cache, adjusting the size of the chunks, or adjusting I/O patterns. + * + * \section sec_hdf5_chunking_limits Chunk Maximum Limits + * + * Chunks have some maximum limits. They are: + * \li The maximum number of elements in a chunk is 232-1 which is equal to 4,294,967,295. + * \li The maximum size for any chunk is 4GB. + * \li The size of a chunk cannot exceed the size of a fixed-size dataset. For example, a dataset consisting of a 5x4 + * fixed-size array cannot be defined with 10x10 chunks. + * + * For more information, see the entry for #H5Pset_chunk in the HDF5 Reference Manual. + * + * \section sec_hdf5_chunking_pit Pitfalls + * + * Inappropriate chunk size and cache settings can dramatically reduce performance. There are a number of ways this can happen. + * Some of the more common issues include: + * \li Chunks are too small
    There is a certain amount of overhead associated with finding chunks. When chunks are made + * smaller, there are more of them in the dataset. When performing I/O on a dataset, if there are many chunks in the selection, + * it will take extra time to look up each chunk. In addition, since the chunks are stored independently, more chunks results + * in more I/O operations, further compounding the issue. The extra metadata needed to locate the chunks also causes the file + * size to increase as chunks are made smaller. Making chunks larger results in fewer chunk lookups, smaller file size, and + * fewer I/O operations in most cases. + * + * \li Chunks are too large
    It may be tempting to simply set the chunk size to be the same as the dataset size in order + * to enable compression on a contiguous dataset. However, this can have unintended consequences. Because the entire chunk must + * be read from disk and decompressed before performing any operations, this will impose a great performance penalty when operating + * on a small subset of the dataset if the cache is not large enough to hold the one-chunk dataset. In addition, if the dataset is + * large enough, since the entire chunk must be held in memory while compressing and decompressing, the operation could cause the + * operating system to page memory to disk, slowing down the entire system. + * + * \li Cache is not big enough
    Similarly, if the chunk cache is not set to a large enough size for the chunk size and access pattern, + * poor performance will result. In general, the chunk cache should be large enough to fit all of the chunks that contain part of a + * hyperslab selection used to read or write. When the chunk cache is not large enough, all of the chunks in the selection will be + * read into cache, written to disk (if writing), and evicted. If the application then revisits the same chunks, they will have to be + * read and possibly written again, whereas if the cache were large enough they would only have to be read (and possibly written) once. + * However, if selections for I/O always coincide with chunk boundaries, this does not matter as much, as there is no wasted I/O and the + * application is unlikely to revisit the same chunks soon after. + *
    If the total size of the chunks involved in a selection is too big to practically fit into memory, and neither the chunk nor + * the selection can be resized or reshaped, it may be better to disable the chunk cache. Whether this is better depends on the + * storage order of the selected elements. It will also make little difference if the dataset is filtered, as entire chunks must + * be brought into memory anyways in that case. When the chunk cache is disabled and there are no filters, all I/O is done directly + * to and from the disk. If the selection is mostly along the fastest changing dimension (i.e. rows), then the data will be more + * contiguous on disk, and direct I/O will be more efficient than reading entire chunks, and hence the cache should be disabled. If + * however the selection is mostly along the slowest changing dimension (columns), then the data will not be contiguous on disk, + * and direct I/O will involve a large number of small operations, and it will probably be more efficient to just operate on the entire + * chunk, therefore the cache should be set large enough to hold at least 1 chunk. To disable the chunk cache, either nbytes or nslots + * should be set to 0. + * + * \li Improper hash table size
    Because only one chunk can be present in each slot of the hash table, it is possible for an + * improperly set hash table + * size (nslots) to severely impact performance. For example, if there are 100 columns of chunks in a dataset, and the + * hash table size is set to 100, then all the chunks in each row will have the same hash value. Attempting to access a row + * of elements will result in each chunk being brought into cache and then evicted to allow the next one to occupy its slot + * in the hash table, even if the chunk cache is large enough, in terms of nbytes, to hold all of them. Similar situations can + * arise when nslots is a factor or multiple of the number of rows of chunks, or equivalent situations in higher dimensions. + * + * Luckily, because each slot in the hash table only occupies the size of the pointer for the system, usually 4 or 8 bytes, + * there is little reason to keep nslots small. Again, a general rule is that nslots should be set to a prime number at least + * 100 times the number of chunks that can fit in nbytes, or simply set to the number of chunks in the dataset. + * + * \section sec_hdf5_chunking_ad_ref Additional Resources + * + * The slide set Chunking in HDF5 (PDF), + * a tutorial from HDF and HDF-EOS Workshop XIII (2009) provides additional HDF5 chunking use cases and examples. + * + * The page \ref sec_exapi_desc lists many code examples that are regularly tested with the HDF5 library. Several illustrate + * the use of chunking in HDF5, particularly \ref sec_exapi_dsets and \ref sec_exapi_filts. + * + * \ref hdf5_chunk_issues provides additional information regarding chunking that has not yet been incorporated into this document. + * + * \section sec_hdf5_chunking_direct Directions for Future Development + * As seen above, the HDF5 chunk cache currently requires careful control of the parameters in order to achieve optimal performance. + * In the future, we plan to improve the chunk cache to be more foolproof in many ways, and deliver acceptable performance in most + * cases even when no thought is given to the chunking parameters. + * + * One way to make the chunk cache more user-friendly is to automatically resize the chunk cache as needed for each operation. + * The cache should be able to detect when the cache should be skipped or when it needs to be enlarged based on the pattern of + * I/O operations. At a minimum, it should be able to detect when the cache would severely hurt performance for a single operation + * and disable the cache for that operation. This would of course be optional. + * + * Another way is to allow chaining of entries in the hash table. This would make the hash table size much less of an issue, + * as chunks could share the same hash value by making a linked list. + * + * Finally, it may even be desirable to set some reasonable default chunk size based on the dataset size and possibly some other + * information on the intended access pattern. This would probably be a high-level routine. + * + * Other features planned for chunking include new index methods (besides b-trees), disabling filters for chunks that are partially over + * the edge of a dataset, only storing the used portions of these edge chunks, and allowing multiple reader processes to read the same + * dataset as a single writer process writes to it. + * + */ diff --git a/doxygen/examples/DebuggingHDF5Applications.html b/doxygen/examples/DebuggingHDF5Applications.html deleted file mode 100644 index 495a87c6676..00000000000 --- a/doxygen/examples/DebuggingHDF5Applications.html +++ /dev/null @@ -1,394 +0,0 @@ - - - Debugging HDF5 Applications - - -
    -

    Introduction

    - -

    The HDF5 library contains a number of debugging features to - make programmers' lives easier including the ability to print - detailed error messages, check invariant conditions, display - timings and other statistics, and trace API function calls and - return values. - -

    -
    Error Messages -
    Error messages are normally displayed automatically on the - standard error stream and include a stack trace of the library - including file names, line numbers, and function names. The - application has complete control over how error messages are - displayed and can disable the display on a permanent or - temporary basis. Refer to the documentation for the H5E error - handling package. - -

    -
    Invariant Conditions -
    Unless NDEBUG is defined during compiling, the - library will include code to verify that invariant conditions - have the expected values. When a problem is detected the - library will display the file and line number within the - library and the invariant condition that failed. A core dump - may be generated for post mortem debugging. The code to - perform these checks can be included on a per-package bases. - -

    -
    Timings and Statistics -
    The library can be configured to accumulate certain - statistics about things like cache performance, datatype - conversion, data space conversion, and data filters. The code - is included on a per-package basis and enabled at runtime by - an environment variable. - -

    -
    API Tracing -
    All API calls made by an application can be displayed and - include formal argument names and actual values and the - function return value. This code is also conditionally - included at compile time and enabled at runtime. -
    - -

    The statistics and tracing can be displayed on any output - stream (including streams opened by the shell) with output from - different packages even going to different streams. - -

    Error Messages

    - -

    By default any API function that fails will print an error - stack to the standard error stream. - -

    -

    - - - - -
    -

    
    -HDF5-DIAG: Error detected in thread 0.  Back trace follows.
    -  #000: H5F.c line 1245 in H5Fopen(): unable to open file
    -    major(04): File interface
    -    minor(10): Unable to open file
    -  #001: H5F.c line 846 in H5F_open(): file does not exist
    -    major(04): File interface
    -    minor(10): Unable to open file
    -	      
    -
    -
    - -

    The error handling package (H5E) is described - elsewhere. - -

    Invariant Conditions

    - -

    To include checks for invariant conditions the library should - be configured with --disable-production, the - default for versions before 1.2. The library designers have made - every attempt to handle error conditions gracefully but an - invariant condition assertion may fail in certain cases. The - output from a failure usually looks something like this: - -

    -

    - - - - -
    -

    
    -Assertion failed: H5.c:123: i<NELMTS(H5_debug_g)
    -IOT Trap, core dumped.
    -	      
    -
    -
    - -

    Timings and Statistics

    - -

    Code to accumulate statistics is included at compile time by - using the --enable-debug configure switch. The - switch can be followed by an equal sign and a comma-separated - list of package names or else a default list is used. - -

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    NameDefaultDescription
    aNoAttributes
    acYesMeta data cache
    bYesB-Trees
    dYesDatasets
    eYesError handling
    fYesFiles
    gYesGroups
    hgYesGlobal heap
    hlNoLocal heaps
    iYesInterface abstraction
    mfNoFile memory management
    mmYesLibrary memory management
    oNoObject headers and messages
    pYesProperty lists
    sYesData spaces
    tYesDatatypes
    vYesVectors
    zYesRaw data filters
    -
    - -

    In addition to including the code at compile time the - application must enable each package at runtime. This is done - by listing the package names in the HDF5_DEBUG - environment variable. That variable may also contain file - descriptor numbers (the default is `2') which control the output - for all following packages up to the next file number. The - word all refers to all packages. Any word my be - preceded by a minus sign to turn debugging off for the package. - -

    -

    - - - - - - - - - - - - - - -
    Sample debug specifications
    allThis causes debugging output from all packages to be - sent to the standard error stream.
    all -t -sDebugging output for all packages except datatypes - and data spaces will appear on the standard error - stream.
    -all ac 255 t,sThis disables all debugging even if the default was to - debug something, then output from the meta data cache is - send to the standard error stream and output from data - types and spaces is sent to file descriptor 255 which - should be redirected by the shell.
    -
    - -

    The components of the HDF5_DEBUG value may be - separated by any non-lowercase letter. - -

    API Tracing

    - -

    The HDF5 library can trace API calls by printing the - function name, the argument names and their values, and the - return value. Some people like to see lots of output during - program execution instead of using a good symbolic debugger, and - this feature is intended for their consumption. For example, - the output from h5ls foo after turning on tracing, - includes: - -

    -

    - - - - -
    -
    -H5Tcopy(type=184549388) = 184549419 (type);
    -H5Tcopy(type=184549392) = 184549424 (type);
    -H5Tlock(type=184549424) = SUCCEED;
    -H5Tcopy(type=184549393) = 184549425 (type);
    -H5Tlock(type=184549425) = SUCCEED;
    -H5Fopen(filename="foo", flags=0, access=H5P_DEFAULT) = FAIL;
    -HDF5-DIAG: Error detected in thread 0.  Back trace follows.
    -  #000: H5F.c line 1245 in H5Fopen(): unable to open file
    -    major(04): File interface
    -    minor(10): Unable to open file
    -  #001: H5F.c line 846 in H5F_open(): file does not exist
    -    major(04): File interface
    -    minor(10): Unable to open file
    -	      
    -
    -
    - -

    The code that performs the tracing must be included in the - library by specifying the --enable-trace - configuration switch (the default for versions before 1.2). Then - the word trace must appear in the value of the - HDF5_DEBUG variable. The output will appear on the - last file descriptor before the word trace or two - (standard error) by default. - -

    -

    - - - - - - - -
    To display the trace on the standard error stream: -
    $ env HDF5_DEBUG=trace a.out
    -	      
    -
    To send the trace to a file: -
    $ env HDF5_DEBUG="55 trace" a.out 55>trace-output
    -	      
    -
    -
    - -

    Performance

    - -

    If the library was not configured for tracing then there is no - unnecessary overhead since all tracing code is excluded. - However, if tracing is enabled but not used there is a small - penalty. First, code size is larger because of extra - statically-declared character strings used to store argument - types and names and extra auto variable pointer in each - function. Also, execution is slower because each function sets - and tests a local variable and each API function calls the - H5_trace() function. - -

    If tracing is enabled and turned on then the penalties from the - previous paragraph apply plus the time required to format each - line of tracing information. There is also an extra call to - H5_trace() for each API function to print the return value. - -

    Safety

    - -

    The tracing mechanism is invoked for each API function before - arguments are checked for validity. If bad arguments are passed - to an API function it could result in a segmentation fault. - However, the tracing output is line-buffered so all previous - output will appear. - -

    Completeness

    - -

    There are two API functions that don't participate in - tracing. They are H5Eprint() and - H5Eprint_cb() because their participation would - mess up output during automatic error reporting. - -

    On the other hand, a number of API functions are called during - library initialization and they print tracing information. - -

    Implementation

    - -

    For those interested in the implementation here is a - description. Each API function should have a call to one of the - H5TRACE() macros immediately after the - FUNC_ENTER() macro. The first argument is the - return type encoded as a string. The second argument is the - types of all the function arguments encoded as a string. The - remaining arguments are the function arguments. This macro was - designed to be as terse and unobtrousive as possible. - -

    In order to keep the H5TRACE() calls synchronized - with the source code we've written a perl script which gets - called automatically just before Makefile dependencies are - calculated for the file. However, this only works when one is - using GNU make. To reinstrument the tracing explicitly, invoke - the trace program from the hdf5 bin directory with - the names of the source files that need to be updated. If any - file needs to be modified then a backup is created by appending - a tilde to the file name. - -

    -

    - - - - - -
    Explicit Instrumentation
    -
    -$ ../bin/trace *.c
    -H5E.c: in function `H5Ewalk_cb':
    -H5E.c:336: warning: trace info was not inserted
    -	      
    -
    -
    - -

    Note: The warning message is the result of a comment of the - form /*NO TRACE*/ somewhere in the function - body. Tracing information will not be updated or inserted if - such a comment exists. - -

    Error messages have the same format as a compiler so that they - can be parsed from program development environments like - Emacs. Any function which generates an error will not be - modified.

    -
    - diff --git a/doxygen/examples/FileImageOps.html b/doxygen/examples/FileImageOps.html deleted file mode 100644 index da7952ab8d9..00000000000 --- a/doxygen/examples/FileImageOps.html +++ /dev/null @@ -1,1611 +0,0 @@ - - - - HDF5 File Image Operations - - - - - -
    - - -

    1. Introduction to HDF5 File Image Operations

    - -

    File image operations allow users to work with HDF5 files in memory in the same ways that users currently work with HDF5 files on disk. Disk I/O is not required when file images are opened, created, read from, or written to.

    -

    An HDF5 file image is an HDF5 file that is held in a buffer in main memory. Setting up a file image in memory involves using either a buffer in the file access property list or a buffer in the Core (aka Memory) file driver.

    -

    The advantage of working with a file in memory is faster access to the data.

    -

    The challenge of working with files in memory buffers is maximizing performance and minimizing memory footprint while working within the constraints of the property list mechanism. This should be a non-issue for small file images, but may be a major issue for large images.

    -

    If invoked with the appropriate flags, the H5LTopen_file_image() high level library call should deal with these challenges in most cases. However, some applications may require the programmer to address these issues directly.

    - -

    1.1. File Image Operations Function Summary

    -

    Functions used in file image operations are listed below.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    C FunctionPurposeSection
    H5Pset_file_imageSpecifies an initial file image2.1.1
    H5Pget_file_imageRetrieves a copy of the file image designated for a VFD to use as the initial contents of a file2.1.2
    H5Pset_file_image_callbacksManages file image buffer allocation, copying, reallocation, and release2.1.3
    H5Pget_file_image_callbacksObtains the current file image callbacks from a file access property list2.1.4
    H5Fget_file_imageProvides a simple way to retrieve a copy of the image of an existing, open file2.1.5
    H5LTopen_file_imageProvides a convenient way to open an initial file image with the Core VFD2.1.6
    - -

    1.2. Abbreviations

    -

    The following abbreviations are used in this document:

    - - - - - - - - - - - - - - - - - -
    AbbreviationExplanation
    FAPL or faplFile Access Property List. In code samples, fapl is used.
    VFDVirtual File Driver
    VFLVirtual File Layer
    - -

    1.3. Developer Prerequisites

    -

    Developers who use the file image operations described in this document should be proficient and experienced users of the HDF5 C Library APIs. More specifically, developers should have a working knowledge of property lists, callbacks, and virtual file drivers.

    - -

    1.4. Resources

    -

    See the following for more information.

    -

    The “RFC: File Image Operations” is the primary source for the information in this document.

    -

    The “Alternate File Storage Layouts and Low-level File Drivers” section is in “The HDF5 File” chapter of the HDF5 User’s Guide .

    -

    The H5P_SET_FAPL_CORE function call can be used to modify the file access property list so that the Memory virtual file driver, H5FD_CORE, is used. The Memory file driver is also known as the Core file driver.

    -

    Refer to the Virtual File Layer for more detail. A list of VFL Functions is provided below.

    -

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    C FunctionPurpose
    H5Pset_driverSets a file driver
    H5Pget_driver_infoReturns a pointer to file driver information
    H5FDregisterRegisters a new file driver as a member of the virtual file driver class
    H5FDunregisterRemoves a driver ID from the library
    H5FDopenOpens a file
    H5FDcloseCloses the file using the driver 'close' callback
    H5FDcmpCompares the keys of two files using the file driver callback if the files belong to the same driver, otherwise sort the files by driver class pointer value
    H5FDqueryQueries a VFL driver for its feature flags
    H5FDallocAllocates memory from the file
    H5FDfreeFrees format addresses in the file
    H5FDset_eoaSet the end-of-address marker for the file
    H5FDget_eoaReturns the address of the first byte after the last allocated memory in the file
    H5FDget_eofReturns the end-of-file address, which is the greater of the end-of-format address and the actual EOF marker
    H5FDreadReads bytes from the file beginning at the specified address according to the provided data transfer property list
    H5FDwriteWrites bytes to the file beginning at the specified address according to the provided data transfer property list
    H5FDflushNotifies driver to flush all cached data
    - -

    2. C API Call Syntax

    - -

    The C API function calls described in this chapter fall into two categories: low-level routines that are part of the main HDF5 C Library and one high-level routine that is part of the “lite” API in the high-level wrapper library. The high-level routine uses the low-level routines and presents frequently requested functionality conveniently packaged for application developers’ use.

    - -

    2.1. Low-level C API Routines

    - -

    The purpose of this section is to describe the low-level C API routines that support file image operations. These routines allow an in-memory image of an HDF5 file to be opened without requiring file system I/O.

    -

    The basic approach to opening an in-memory image of an HDF5 file is to pass the image to the Core file driver, and then tell the Core file driver to open the file. We do this by using the H5Pget/set_file_image calls. These calls allow the user to specify an initial file image.

    -

    A potential problem with the H5Pget/set_file_image calls is the overhead of allocating and copying of large file image buffers. The callback routines enable application programs to avoid this problem. However, the use of these callbacks is complex and potentially hazardous: the particulars are discussed in the semantics and examples chapters below (see section 3.1 and section 4.1 respectively). Fortunately, use of the file image callbacks should seldom be necessary: the H5LTopen_file_image call should address most use cases.

    -

    The property list facility in HDF5 is employed in file image operations. This facility was designed for passing data, not consumable resources, into API calls. The peculiar ways in which the file image allocation callbacks may be used allows us to avoid extending the property list structure to handle consumable resources cleanly and to avoid constructing a new facility for the purpose.

    -

    The sub-sections below describe the low-level C APIs that are used with file image operations.

    - -

    2.1.1. H5Pset_file_image

    - -

    The H5Pset_file_image routine allows an application to provide an image for a file driver to use as the initial contents of the file. This call was designed initially for use with the Core VFD, but it can be used with any VFD that supports using an initial file image when opening a file. See the “Virtual File Driver Feature Flags” section for more information. Calling this routine makes a copy of the provided file image buffer. See the “H5Pset_file_image_callbacks” section for more information.

    -

    The signature of H5Pset_file_image is defined as follows:

    -

    herr_t H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len) - -

    The parameters of H5Pset_file_image are defined as follows:

    -

    fapl_id contains the ID of the target file access property list. -buf_ptr supplies a pointer to the initial file image, or NULL if no initial file image is desired. -buf_len contains the size of the supplied buffer, or 0 if no initial image is desired. -If either the buf_len parameter is zero, or the buf_ptr parameter is NULL, no file image will be set in the FAPL, and any existing file image buffer in the FAPL will be released. If a buffer is released, the FAPL’s file image buf_len will be set to 0 and buf_ptr will be set to NULL.

    -

    Given the tight interaction between the file image callbacks and the file image, the file image callbacks in a property list cannot be changed while a file image is defined.

    -

    With properly constructed file image callbacks, it is possible to avoid actually copying the file image. The particulars of this are discussed in greater detail in the “C API Call Semantics” chapter and in the “Examples” chapter.

    - -

    2.1.2. H5Pget_file_image

    - -

    The H5Pget_file_image routine allows an application to retrieve a copy of the file image designated for a VFD to use as the initial contents of a file. This routine uses the file image callbacks (if defined) when allocating and loading the buffer to return to the application, or it uses malloc and memcpy if the callbacks are undefined. When malloc and memcpy are used, it will be the caller’s responsibility to discard the returned buffer via a call to free.

    -

    The signature of H5Pget_file_image is defined as follows:

    -

    herr_t H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr) - -

    The parameters of H5Pget_file_image are defined as follows:

    -

    fapl_id contains the ID of the target file access property list. -

    buf_ptr_ptr contains a NULL or a pointer to a void*. If buf_ptr_ptr is not NULL, on successful return, *buf_ptr_ptr will contain a pointer to a copy of the initial image provided in the last call to H5Pset_file_image for the supplied fapl_id. If no initial image has been set, *buf_ptr_ptr will be NULL.

    -

    buf_len_ptr contains a NULL or a pointer to size_t. If buf_len_ptr is not NULL, on successful return, *buf_len_ptr will contain the value of the buf_len parameter for the initial image in the supplied fapl_id. If no initial image is set, the value of *buf_len_ptr will be 0.

    - -

    As with H5Pset_file_image, appropriately defined file image callbacks can allow this function to avoid buffer allocation and memory copy operations.

    - -

    2.1.3. H5Pset_file_image_callbacks

    - -

    The H5Pset_file_image_callbacks API call exists to allow an application to control the management of file image buffers through user defined callbacks. These callbacks will be used in the management of file image buffers in property lists and in select file drivers. These routines are invoked when a new file image buffer is allocated, when an existing file image buffer is copied or resized, or when a file image buffer is released from use. From the perspective of the HDF5 Library, the operations of the image_malloc, image_memcpy, image_realloc, and image_free callbacks must be identical to those of the corresponding C standard library calls (malloc, memcpy, realloc, and free). While the operations must be identical, the file image callbacks have more parameters. The callbacks and their parameters are described below. The return values of image_malloc and image_realloc are identical to the return values of malloc and realloc. However, the return values of image_memcpy and image_free are different than the return values of memcpy and free: the return values of image_memcpy and image_free can also indicate failure. See the “File Image Callback Semantics” section for more information.

    -

    The signature of H5Pset_file_image_callbacks is defined as follows:

    - -

    typedef enum
    -{
    -  H5_FILE_IMAGE_OP_PROPERTY_LIST_SET,
    -  H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY,
    -  H5_FILE_IMAGE_OP_PROPERTY_LIST_GET,
    -  H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE,
    -  H5_FILE_IMAGE_OP_FILE_OPEN,
    -  H5_FILE_IMAGE_OP_FILE_RESIZE,
    -  H5_FILE_IMAGE_OP_FILE_CLOSE
    -} H5_file_image_op_t;

    - -

    typedef struct
    -{
    -  void *(*image_malloc)(size_t size, H5_file_image_op_t file_image_op,
    -        void *udata);
    -  void *(*image_memcpy)(void *dest, const void *src, size_t size,
    -        H5_file_image_op_t file_image_op, void *udata);
    -  void *(*image_realloc)(void *ptr, size_t size,
    -        H5_file_image_op_t file_image_op, void *udata);
    -  herr_t (*image_free)(void *ptr, H5_file_image_op_t file_image_op,
    -        void *udata);
    -  void *(*udata_copy)(void *udata);
    -  herr_t (*udata_free)(void *udata);
    -  void *udata;
    -} H5_file_image_callbacks_t;

    - -

    herr_t H5Pset_file_image_callbacks(hid_t fapl_id, - H5_file_image_callbacks_t *callbacks_ptr)

    - -The parameters of H5Pset_file_image_callbacks are defined as follows:

    - -
      -
    • fapl_id contains the ID of the target file access property list.
    • -
    • callbacks_ptr contains a pointer to an instance of the H5_file_image_callbacks_t structure.
    • -
    - -

    The fields of the H5_file_image_callbacks_t structure are defined as follows: - -

      -
    • image_malloc contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library malloc() call. The parameters of the image_malloc callback are defined as follows:
    • -
        -
      • size contains the size in bytes of the image buffer to allocate.
      • -
      • file_image_op contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2.
      • -
      • udata holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.
      • -
      - - Setting image_malloc to NULL indicates that the HDF5 Library should invoke the standard C library malloc() routine when allocating file image buffers.

      - -

    • image_memcpy contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library memcpy() call except that it returns NULL on failure. Recall that the memcpy C Library routine is defined to return the dest parameter in all cases. The parameters of the image_memcpy callback are defined as follows:
    • -
        -
      • dest contains the address of the destination buffer.
      • -
      • src contains the address of the source buffer.
      • -
      • size contains the number of bytes to copy.
      • -
      • file_image_op contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2.
      • -
      • udata holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.
      • -
      - - Setting image_memcpy to NULL indicates that the HDF5 Library should invoke the standard C library memcpy() routine when copying buffers.

      - -

    • image_realloc contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library realloc() call. The parameters of the image_realloc callback are defined as follows:

    • -
        -
      • ptr contains the pointer to the buffer being reallocated.
      • -
      • size contains the desired size in bytes of the buffer after realloc.
      • -
      • file_image_op contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2.
      • -
      • udata holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.
      • -
      - -Setting image_realloc to NULL indicates that the HDF5 Library should invoke the standard C library realloc() routine when resizing file image buffers.

      - -

    • image_free contains a pointer to a function with (from the perspective of HDF5) functionality identical to the standard C library free() call except that it will return 0 (SUCCEED) on success and -1 (FAIL) on failure. The parameters of the image_free callback are defined as follows:
    • -
        -
      • ptr contains the pointer to the buffer being released.
      • -
      • file_image_op contains one of the values of H5_file_image_op_t. These values indicate the operation being performed on the file image when this callback is invoked. Possible values for file_image_op are discussed in Table 2 .
      • -
      • udata holds the value passed in for the udata parameter to H5Pset_file_image_callbacks.
      • -
      - - Setting image_free to NULL indicates that the HDF5 Library should invoke the standard C library free() routine when releasing file image buffers.

      - -

    • udata_copy contains a pointer to a function that (from the perspective of HDF5) allocates a buffer of suitable size, copies the contents of the supplied udata into the new buffer, and returns the address of the new buffer. The function returns NULL on failure. This function is necessary if a non-NULL udata parameter is supplied, so that property lists containing the image callbacks can be copied. If the udata parameter (below) is NULL, then this parameter should be NULL as well. The parameter of the udata_copy callback is defined as follows:
    • -
        -
      • udata contains the pointer to the user data block being copied.
      • -

      - -

    • udata_free contains a pointer to a function that (from the perspective of HDF5) frees a user data block. This function is necessary if a non-NULL udata parameter is supplied so that property lists containing image callbacks can be discarded without a memory leak. If the udata parameter (below) is NULL, this parameter should be NULL as well. The parameter of the udata_free callback is defined as follows:
    • -
        -
      • udata contains the pointer to the user data block to be freed.
      • -
      - - udata_free returns 0 (SUCCEED) on success and -1 (FAIL) on failure.

      - -
    • udata contains a pointer value, potentially to user-defined data, that will be passed to the image_malloc, image_memcpy, image_realloc, and image_free callbacks.
    • -
    - -The semantics of the values that can be set for the file_image_op parameter to the above callbacks are described in the table below:

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 2. Values for the file_image_op parameter
    ValueComments
    H5_FILE_IMAGE_OP_PROPERTY_LIST_SETThis value is passed to the image_malloc and image_memcpy callbacks when an image buffer is being copied while being set in a FAPL
    H5_FILE_IMAGE_OP_PROPERTY_LIST_COPYThis value is passed to the image_malloc and image_memcpy callbacks when an image buffer is being copied when a FAPL is copied
    H5_FILE_IMAGE_OP_PROPERTY_LIST_GETThis value is passed to the image_malloc and image_memcpy callbacks when an image buffer is being copied while being retrieved from a FAPL
    H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSEThis value is passed to the image_free callback when an image buffer is being released during a FAPL close operation.
    H5_FILE_IMAGE_OP_FILE_OPENThis value is passed to the image_malloc and image_memcpy callbacks when an image buffer is copied during a file open operation. While the image being opened will typically be copied from a FAPL, this need not always be the case. An example of an exception is when the Core file driver takes its initial image from a file.
    H5_FILE_IMAGE_OP_FILE_RESIZEThis value is passed to the image_realloc callback when a file driver needs to resize an image buffer.
    H5_FILE_IMAGE_OP_FILE_CLOSEThis value is passed to the image_free callback when an image buffer is being released during a file close operation.
    - -

    In closing our discussion of H5Pset_file_image_callbacks(), we note the interaction between this call and the H5Pget/set_file_image() calls above: since the malloc, memcpy, and free callbacks defined in the instance of H5_file_image_callbacks_t are used by H5Pget/set_file_image(), H5Pset_file_image_callbacks() will fail if a file image is already set in the target property list.

    -

    For more information on writing the file image to disk, set the backing_store parameter. See the H5Pset_fapl_core entry in the HDF5 Reference Manual.

    - -

    2.1.4. H5Pget_file_image_callbacks

    -

    The H5Pget_file_image_callbacks routine is designed to obtain the current file image callbacks from a file access property list.

    -

    The signature of H5Pget_file_image_callbacks() is defined as follows:

    - -

    herr_t H5Pget_file_image_callbacks(hid_t fapl_id, - H5_file_image_callbacks_t *callbacks_ptr)

    - -The parameters of H5Pget_file_image_callbacks are defined as follows:

    - -
      -
    • fapl_id contains the ID of the target file access property list.
    • -
    • callbacks_ptr contains a pointer to an instance of the H5_file_image_callbacks_t structure. All fields should be initialized to NULL. See the “H5Pset_file_image_callbacks” section for more information on the H5_file_image_callbacks_t structure.
    • -
    - -Upon successful return, the fields of *callbacks_ptr shall contain values as defined below:

    -
      -
    • Upon successful return, callbacks_ptr->image_malloc will contain the pointer passed as the image_malloc field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.
    • -
    • Upon successful return, callbacks_ptr->image_memcpy will contain the pointer passed as the image_memcpy field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.
    • -
    • Upon successful return, callbacks_ptr->image_realloc will contain the pointer passed as the image_realloc field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.
    • -
    • Upon successful return, callbacks_ptr->image_free_ptr will contain the pointer passed as the image_free field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.
    • -
    • Upon successful return, callbacks_ptr->udata_copy will contain the pointer passed as the udata_copy field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.
    • -
    • Upon successful return, callbacks_ptr-> udata_free will contain the pointer passed as the udata_free field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.
    • -
    • Upon successful return, callbacks_ptr->udata will contain the pointer passed as the udata field of the instance of H5_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call.
    • -
    - -

    2.1.5. Virtual File Driver Feature Flags

    - -Implementation of the H5Pget/set_file_image_callbacks() and H5Pget/set_file_image() function calls requires a pair of virtual file driver feature flags. The flags are H5FD_FEAT_ALLOW_FILE_IMAGE and H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS. Both of these are defined in H5FDpublic.h.

    - -

    The first flag, H5FD_FEAT_ALLOW_FILE_IMAGE, allows a file driver to indicate whether or not it supports file images. A VFD that sets this flag when its ‘query’ callback is invoked indicates that the file image set in the FAPL will be used as the initial contents of a file. Support for setting an initial file image is designed primarily for use with the Core VFD. However, any VFD can indicate support for this feature by setting the flag and copying the image in an appropriate way for the VFD (possibly by writing the image to a file and then opening the file). However, such a VFD need not employ the file image after file open time. In such cases, the VFD will not make an in-memory copy of the file image and will not employ the file image callbacks.

    - -

    File drivers that maintain a copy of the file in memory (only the Core file driver at present) can be constructed to use the initial image callbacks (if defined). Those that do must set the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag, the second flag, when their ‘query’ callbacks are invoked.

    - -

    Thus file drivers that set the H5FD_FEAT_ALLOW_FILE_IMAGE flag but not the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag may read the supplied image from the property list (if present) and use it to initialize the contents of the file. However, they will not discard the image when done, nor will they make any use of any file image callbacks (if defined).

    - -

    If an initial file image appears in a file allocation property list that is used in an H5Fopen() call, and if the underlying file driver does not set the H5FD_FEAT_ALLOW_FILE_IMAGE flag, then the open will fail.

    - -

    If a driver sets both the H5FD_FEAT_ALLOW_FILE_IMAGE flag and the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag, then that driver will allocate a buffer of the required size, copy the contents of the initial image buffer from the file access property list, and then open the copy as if it had just loaded it from file. If the file image allocation callbacks are defined, the driver shall use them for all memory management tasks. Otherwise it will use the standard malloc, memcpy, realloc, and free C library calls for this purpose.

    - -

    If the VFD sets the H5FD_FEAT_ALLOW_FILE_IMAGE flag, and an initial file image is defined by an application, the VFD should ensure that file creation operations (as opposed to file open operations) bypass use of the file image, and create a new, empty file.

    - -

    Finally, it is logically possible that a file driver would set the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag, but not the H5FD_FEAT_ALLOW_FILE_IMAGE flag. While it is hard to think of a situation in which this would be desirable, setting the flags this way will not cause any problems: the two capabilities are logically distinct.

    - -

    2.1.6. H5Fget_file_image

    - -

    The purpose of the H5Fget_file_image routine is to provide a simple way to retrieve a copy of the image of an existing, open file. This routine can be used with files opened using the SEC2 (aka POSIX), STDIO, and Core (aka Memory) VFDs.

    - -

    The signature of H5Fget_file_image is defined as follows:

    -

    ssize_t H5Fget_file_image(hid_t file_id, void *buf_ptr, size_t buf_len)

    - -The parameters of H5Fget_file_image are defined as follows: - -
      -
    • file_id contains the ID of the target file.
    • -
    • buf_ptr contains a pointer to the buffer into which the image of the HDF5 file is to be copied. If buf_ptr is NULL, no data will be copied, but the return value will still indicate the buffer size required (or a negative value on error).
    • -
    • buf_len contains the size of the supplied buffer.
    • -
    - -

    If the return value of H5Fget_file_image is a positive value, then the value will be the length of buffer required to store the file image (in other words, the length of the file). A negative value might be returned if the file is too large to store in the supplied buffer or on failure.

    - -

    The current file size can be obtained via a call to H5Fget_filesize(). Note that this function returns the value of the end of file (EOF) and not the end of address space (EOA). While these values are frequently the same, it is possible for the EOF to be larger than the EOA. Since H5Fget_file_image() will only obtain a copy of the file from the beginning of the superblock to the EOA, it will be best to use H5Fget_file_image() to determine the size of the buffer required to contain the image.

    - -Other Design Considerations - -

    Here are some other notes regarding the design and implementation of H5Fget_file_image.

    -

    The H5Fget_file_image call should be part of the high-level library. However, a file driver agnostic implementation of the routine requires access to data structures that are hidden within the HDF5 Library. We chose to implement the call in the library proper rather than expose those data structures.

    -

    There is no reason why the H5Fget_file_image() API call could not work on files opened with any file driver. However, the Family, Multi, and Split file drivers have issues that make the call problematic. At present, files opened with the Family file driver are marked as being created with that file driver in the superblock, and the HDF5 Library refuses to open files so marked with any other file driver. This negates the purpose of the H5Fget_file_image() call. While this mark can be removed from the image, the necessary code is not trivial.

    -

    Thus we will not support the Family file driver in H5Fget_file_image() unless there is demand for it. Files created with the Multi and Split file drivers are also marked in the superblock. In addition, they typically use a very sparse address space. A sparse address space would require the use of an impractically large buffer for an image, and most of the buffer would be empty. So, we see no point in supporting the Multi and Split file drivers in H5Fget_file_image() under any foreseeable circumstances.

    - -

    2.2. High-level C API Routine

    - -

    The H5LTopen_file_image high-level routine encapsulates the capabilities of routines in the main HDF5 Library with conveniently accessible abstractions.

    - -

    2.2.1. H5LTopen_file_image

    - -

    The H5LTopen_file_image routine is designed to provide an easier way to open an initial file image with the Core VFD. Flags to H5LTopen_file_image allow for various file image buffer ownership policies to be requested. See the HDF5 Reference Manual for more information on high-level APIs.

    -

    The signature of H5LTopen_file_image is defined as follows:

    - -

    hid_t H5LTopen_file_image(void *buf_ptr, size_t buf_len, unsigned flags) - -

    The parameters of H5LTopen_file_image are defined as follows:

    -
      -
    • buf_ptr contains a pointer to the supplied initial image. A NULL value is invalid and will cause H5LTopen_file_image to fail.
    • -
    • buf_len contains the size of the supplied buffer. A value of 0 is invalid and will cause H5LTopen_file_image to fail.
    • -
    • flags contains a set of flags indicating whether the image is to be opened read/write, whether HDF5 is to take control of the buffer, and how long the application promises to maintain the buffer. Possible flags are described in the table below:
    • -
    - - - - - - - - - - - - - - - - - - - -
    Table 3. Flags for H5LTopen_file_image
    ValueComments
    H5LT_FILE_IMAGE_OPEN_RWIndicates that the HDF5 Library should open the image read/write instead of the default read-only.
    H5LT_FILE_IMAGE_DONT_COPY -
      -
    • Indicates that the HDF5 Library should not copy the file image buffer provided, but should use it directly. The HDF5 Library will release the file image when finished. The supplied buffer must have been allocated via a call to the standard C library malloc() or calloc() routines. The HDF5 Library will call free() to release the buffer. In the absence of this flag, the HDF5 Library will copy the buffer provided. The H5LT_FILE_IMAGE_DONT_COPY flag provides an application with the ability to “give ownership” of a file image buffer to the HDF5 Library.
    • -
    • The HDF5 Library will modify the buffer on write if the image is opened read/write and the H5LT_FILE_IMAGE_DONT_COPY flag is set.
    • -
    • The H5LT_FILE_IMAGE_DONT_RELEASE flag, see below, is invalid unless the H5LT_FILE_IMAGE_DONT_COPY flag is set
    • -
    -
    H5LT_FILE_IMAGE_DONT_RELEASE -
      -
    • Indicates that the HDF5 Library should not attempt to release the buffer when the file is closed. This implies that the application will tend to this detail and that the application will not discard the buffer until after the file image is closed.
    • -
    • Since there is no way to return a changed buffer base address to the application, and since realloc can change this value, calls to realloc() must be barred when this flag is set. As a result, any write that requires an increased buffer size will fail.
    • -
    • This flag is invalid unless the H5LT_FILE_IMAGE_DONT_COPY flag, see above, is set.
    • -
    • If the H5LT_FILE_IMAGE_DONT_COPY flag is set and this flag is not set, the HDF5 Library will release the file image buffer after the file is closed using the standard C library free() routine.
    • -
    • Using this flag and the H5LT_FILE_IMAGE_DONT_COPY flag provides a way for the application to specify a buffer that the HDF5 Library can use for opening and accessing as a file image while letting the application retain ownership of the buffer.
    • -
    -
    - -

    The following table is intended to summarize the semantics of the H5LT_FILE_IMAGE_DONT_COPY and H5LT_FILE_IMAGE_DONT_RELEASE flags (shown as “Don’t Copy Flag” and “Don’t Release Flag” respectively in the table):

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 4. Summary of Don’t Copy and Don’t Release Flag Actions
    Don’t Copy FlagDon’t Release FlagMake Copy of User Supplied BufferPass User Supplied Buffer to File DriverRelease User Supplied Buffer When DonePermit realloc of Buffer Used by File Driver
    FalseDon’t careTrueFalseFalseTrue
    TrueFalseFalseTrueTrueTrue
    TrueTrueFalseTrueFalseFalse
    - -

    The return value of H5LTopen_file_image will be a file ID on success or a negative value on failure. The file ID returned should be closed with H5Fclose.

    -

    Note that there is no way currently to specify a “backing store” file name in this definition of H5LTopen_image.

    - -

    3. C API Call Semantics

    -

    The purpose of this chapter is to describe some issues that developers should consider when using file image buffers, property lists, and callback APIs.

    - -

    3.1. File Image Callback Semantics

    -

    The H5Fget/set_file_image_callbacks() API calls allow an application to hook the memory management operations used when allocating, duplicating, and discarding file images in the property list, in the Core file driver, and potentially in any in-memory file driver developed in the future.

    -

    From the perspective of the HDF5 Library, the supplied image_malloc(), image_memcpy(), image_realloc(), and image_free() callback routines must function identically to the C standard library malloc(), memcpy(), realloc(), and free() calls. What happens on the application side can be much more nuanced, particularly with the ability to pass user data to the callbacks. However, whatever the application does with these calls, it must maintain the illusion that the calls have had the expected effect. Maintaining this illusion requires some understanding of how the property list structure works, and what HDF5 will do with the initial images passed to it.

    -

    At the beginning of this document, we talked about the need to work within the constraints of the property list mechanism. When we said “from the perspective of the HDF5 Library…” in the paragraph above, we are making reference to this point.

    -

    The property list mechanism was developed as a way to add parameters to functions without changing the parameter list and breaking existing code. However, it was designed to use only “call by value” semantics, not “call by reference”. The decision to use “call by value” semantics requires that the values of supplied variables be copied into the property list. This has the advantage of simplifying the copying and deletion of property lists. However, if the value to be copied is large (say a 2 GB file image), the overhead can be unacceptable.

    -

    The usual solution to this problem is to use “call by reference” where only a pointer to an object is placed in a parameter list rather than a copy of the object itself. However, use of “call by reference” semantics would greatly complicate the property list mechanism: at a minimum, it would be necessary to maintain reference counts to dynamically allocated objects so that the owner of the object would know when it was safe to free the object.

    -

    After much discussion, we decided that the file image operations calls were sufficiently specialized that it made no sense to rework the property list mechanism to support “call by reference.” Instead we provided the file image callback mechanism to allow the user to implement some version of “call by reference” when needed. It should be noted that we expect this mechanism to be used rarely if at all. For small file images, the copying overhead should be negligible, and for large images, most use cases should be addressed by the H5LTopen_file_image call.

    -

    In the (hopefully) rare event that use of the file image callbacks is necessary, the fundamental point to remember is that the callbacks must be constructed and used in such a way as to maintain the library’s illusion that it is using “call by value” semantics.

    -

    Thus the property list mechanism must think that it is allocating a new buffer and copying the supplied buffer into it when the file image property is set. Similarly, it must think that it is allocating a new buffer and copying the contents of the existing buffer into it when it copies a property list that contains a file image. Likewise, it must think it is de-allocating a buffer when it discards a property list that contains a file image.

    -

    Similar illusions must be maintained when a file image buffer is copied into the Core file driver (or any future driver that uses the file image callbacks) when the file driver re-sizes the buffer containing the image and finally when the driver discards the buffer.

    - -

    3.1.1. Buffer Ownership

    -

    The owner of a file image in a buffer is the party that has the responsibility to discard the file image buffer when it is no longer needed. In this context, the owner is either the HDF5 Library or the application program.

    -

    We implemented the image_* callback facility to allow efficient management of large file images. These facilities can be used to allow sharing of file image buffers between the application and the HDF5 library, and also transfer of ownership in either direction. In such operations, care must be taken to ensure that ownership is clear and that file image buffers are not discarded before all references to them are discarded by the non-owning party.

    -

    Ownership of a file image buffer will only be passed to the application program if the file image callbacks are designed to do this. In such cases, the application program must refrain from freeing the buffer until the library has deleted all references to it. This in turn will happen after all property lists (if any) that refer to the buffer have been discarded, and the file driver (if any) that used the buffer has closed the file and thinks it has discarded the buffer.

    - -

    3.1.2. Sharing a File image Buffer with the HDF5 Library

    -

    As mentioned above, the HDF5 property lists are a mechanism for passing values into HDF5 Library calls. They were created to allow calls to be extended with new parameters without changing the actual API or breaking existing code. They were designed based on the assumption that all new parameters would be “call by value” and not “call by reference.” Having “call by value” parameters means property lists can be copied, reused, and discarded with ease.

    -

    Suppose an application wished to share a file image buffer with the HDF5 Library. This means the library would be allowed to read the file image, but not free it. The file image callbacks might be constructed as follows to share a buffer:

    - -
      -
    • Construct the image_malloc() call so that it returns the address of the buffer instead of allocating new space. This will keep the library thinking that the buffers are distinct even when they are not. Support this by including the address of the buffer in the user data. As a sanity check, include the buffer’s size in the user data as well, and require image_malloc() to fail if the requested buffer size is unexpected. Finally, include a reference counter in the user data, and increment the reference counter on each call to image_malloc().
    • -
    • Construct the image_memcpy() call so that it does nothing. As a sanity check, make it fail if the source and destination pointers do not match the buffer address in the user data or if the size is unexpected.
    • -
    • Construct the image_free() routine so that it does nothing. As a sanity check, make it compare the supplied pointer with the expected pointer in the user data. Also, make it decrement the reference counter and notify the application that the HDF5 Library is done with the buffer when the reference count drops to 0.
    • -
    - -As the property list code will never resize a buffer, we do not discuss the image_realloc() call here. The behavior of image_realloc() in this scenario depends on what the application wants to do with the file image after it has been opened. We discuss this issue in the next section. Note also that the operation passed into the file image callbacks allow the callbacks to behave differently depending on the context in which they are used.

    -

    For more information on user defined data, see the “H5Pset_file_image_callbacks” section.

    - -

    3.1.3. File Driver Considerations

    -

    When a file image is opened by a driver that sets both the H5FD_FEAT_ALLOW_FILE_IMAGE and the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flags, the driver will allocate a buffer large enough for the initial file image and then copy the image from the property list into this buffer. As processing progresses, the driver will reallocate the image as necessary to increase its size and will eventually discard the image at file close. If defined, the driver will use the file image callbacks for these operations; otherwise, the driver will use the standard C library calls. See the "H5Pset_file_image_callbacks” section for more information.

    -

    As described above, the file image callbacks can be constructed so as to avoid the overhead of buffer allocations and copies while allowing the HDF5 Library to maintain its illusions on the subject. There are two possible complications involving the file driver. The complications are the possibility of reallocation calls from the driver and the possibility of the continued existence of property lists containing references to the buffer.

    -

    Suppose an application wishes to share a file image buffer with the HDF5 Library. The application allows the library to read (and possibly write) the image, but not free it. We must first decide whether the image is to be opened read-only or read/write.

    -

    If the image will be opened read-only (or if we know that any writes will not change the size of the image), the image_realloc() call should never be invoked. Thus the image_realloc() routine can be constructed so as to always fail, and the image_malloc(), image_memcpy(), and image_free() routines can be constructed as described in the section above.

    -

    Suppose, however, that the file image will be opened read/write and may grow during the computation. We must now allow for the base address of the buffer to change due to reallocation calls, and we must employ the user data structure to communicate any change in the buffer base address and size to the application. We pass buffer changes to the application so that the application will be able to eventually free the buffer. To this end, we might define a user data structure as shown in the example below:

    -
     typedef struct udata {
    -      void *init_ptr;
    -      size_t init_size;
    -      int init_ref_count;
    -      void *mod_ptr;
    -      size_t mod_size;
    -      int mod_ref_count;
    - }
    -
    -

    Example 1. Using a user data structure to communicate with an application

    -

    We initialize an instance of the structure so that init_ptr points to the buffer to be shared, init_size contains the initial size of the buffer, and all other fields are initialized to either NULL or 0 as indicated by their type. We then pass a pointer to the instance of the user data structure to the HDF5 Library along with allocation callback functions constructed as follows:

    - -
      -
    • Construct the image_malloc() call so that it returns the value in the init_ptr field of the user data structure and increments the init_ref_count. As a sanity check, the function should fail if the requested size does not match the init_size field in the user data structure or if any of the modified fields have values other than their initial values.
    • -
    • Construct the image_memcpy() call so that it does nothing. As a sanity check, it should be made to fail if the source, destination, and size parameters do not match the init_ptr and init_size fields as appropriate.
    • -
    • Construct the image_realloc() call so that it performs a standard realloc. Sanity checking, assuming that the realloc is successful, should be as follows:
    • - -
        -
      • If the mod_ptr, mod_size, or mod_ref_count fields of the user data structure still have their initial values, verify that the supplied pointer matches the init_ptr field and that the supplied size does not match the init_size field. Decrement init_ref_count, set mod_ptr equal to the address returned by realloc, set mod_size equal to the supplied size, and set mod_ref_count to 1.
      • -
      • If the mod_ptr, mod_size, or mod_ref_count fields of the user data structure are defined, verify that the supplied pointer matches the value of mod_ptr and that the supplied size does not match mod_size. Set mod_ptr equal to the value returned by realloc, and set mod_size equal to the supplied size.
      • -
      - -In both cases, if all sanity checks pass, return the value returned by the realloc call. Otherwise, return NULL.

      -
    • Construct the image_free() routine so that it does nothing. Perform sanity checks as follows:
    • -
        -
      • If the H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE flag is set, decrement the init_ref_count field of the user data structure. Flag an error if init_ref_count drops below zero.
      • -
      • If the H5_FILE_IMAGE_OP_FILE_CLOSE flag is set, check to see if the mod_ptr, mod_size, or mod_ref_count fields of the user data structure have been modified from their initial values. If they have, verify that mod_ref_count contains 1 and then set that field to zero. If they have not been modified, proceed as per the H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE case.
      • -
      -
    - -In either case, if both the init_ref_count and mod_ref_count fields have dropped to zero, notify the application that the HDF5 Library is done with the buffer. If the mod_ptr or mod_size fields have been modified, pass these values on to the application as well.

    - -

    3.2. Initial File Image Semantics

    -

    One can argue whether creating a file with an initial file image is closer to creating a file or opening a file. The consensus seems to be that it is closer to a file open, and thus we shall require that the initial image only be used for calls to H5Fopen().

    -

    Whatever our convention, from an internal perspective, opening a file with an initial file image is a bit of both creating a file and opening a file. Conceptually, we will create a file on disk, write the supplied image to the file, close the file, open the file as an HDF5 file, and then proceed as usual (of course, the Core VFD will not write to the file system unless it is configured to do so). This process is similar to a file create: we are creating a file that did not exist on disk to begin with and writing data to it. Also, we must verify that no file of the supplied name is open. However, this process is also similar to a file open: we must read the superblock and handle the usual file open tasks.

    -

    Implementing the above sequence of actions has a number of implications on the behavior of the H5Fopen() call when an initial file image is supplied:

    -
      -
    • H5Fopen() must fail if the target file driver does not set the H5FD_FEAT_ALLOW_FILE_IMAGE flag and a file image is specified in the FAPL.
    • -
    • If the target file driver supports the H5FD_FEAT_ALLOW_FILE_IMAGE flag, then H5Fopen() must fail if the file is already open or if a file of the specified name exists.
    • -
    • Even if the above constraints are satisfied, H5Fopen() must still fail if the image does not contain a valid (or perhaps just plausibly valid) image of an HDF5 file. In particular, the superblock must be processed, and the file structure be set up accordingly.
    • -
    - -See the “Virtual File Driver Feature Flags” section for more information.

    -

    As we indicated earlier, if an initial file image appears in the property list of an H5Fcreate() call, it is ignored.

    -

    While the above section on the semantics of the file image callbacks may seem rather gloomy, we get the payback here. The above says everything that needs to be said about initial file image semantics in general. The sub-section below has a few more observations on the Core file driver.

    - -

    3.2.1. Applying Initial File Image Semantics to the Core File Driver

    -

    At present, the Core file driver uses the open() and read() system calls to load an HDF5 file image from the file system into RAM. Further, if the backing_store flag is set in the FAPL entry specifying the use of the Core file driver, the Core file driver’s internal image will be used to overwrite the source file on either flush or close. See the H5Pset_fapl_core entry in the HDF5 Reference Manual for more information.

    -

    This results in the following observations. In all cases assume that use of the Core file driver has been specified in the FAPL.

    -
      -
    • If the file specified in the H5Fopen() call does not exist, and no initial image is specified in the FAPL, the open must fail because there is no source for the initial image needed by the Core file driver.
    • -
    • If the file specified in the H5Fopen() call does exist, and an initial image is specified in the FAPL, the open must fail because the source of the needed initial image is ambiguous: the file image could be taken either from file or from the FAPL.
    • -
    • If the file specified in the H5Fopen() call does not exist, and an initial image is specified in the FAPL, the open will succeed. This assumes that the supplied image is valid. Further, if the backing store flag is set, the file specified in the H5Fopen() call will be created, and the contents of the Core file driver’s internal buffer will be written to the new file on flush or close.
    • -
    - -Thus a call to H5Fopen() can result in the creation of a new HDF5 file in the file system.

    - -

    4. Examples

    -

    The purpose of this chapter is to provide examples of how to read or build an in-memory HDF5 file image.

    - -

    4.1. Reading an In-memory HDF5 File Image

    - -

    The H5Pset_file_image() function call allows the Core file driver to be initialized from an application provided buffer. The following pseudo code illustrates its use:

    - -
    
    -<allocate and initialize buf_len and buf>
    -<allocate fapl_id>
    -<set fapl to use Core file driver>
    -H5Pset_file_image(fapl_id, buf, buf_len);
    -<discard buf any time after this point>
    -<open file>
    -<discard fapl any time after this point>
    -<read and/or write file as desired, close>
    -
    - -Example 2. Using H5Pset_file_image to initialize the Core file driver

    - -

    This solution is easy to code, but the supplied buffer is duplicated twice. The first time is in the call to H5Pset_file_image() when the image is duplicated and the duplicate inserted into the property list. The second time is when the file is opened: the image is copied from the property list into the initial buffer allocated by the Core file driver. This is a non-issue for small images, but this could become a significant performance hit for large images.

    -

    If we want to avoid the extra malloc and memcpycalls, we must decide whether the application should retain ownership of the buffer or pass ownership to the HDF5 Library.

    -

    The following pseudo code illustrates opening the image read -only using the H5LTopen_file_image() routine. In this example, the application retains ownership of the buffer and avoids extra buffer allocations and memcpy calls.

    - -
    
    -<allocate and initialize buf_len and buf>
    -hid_t file_id;
    -unsigned flags = H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE;
    -file_id = H5LTopen_file_image(buf, buf_len, flags);
    -<read file as desired, and then close>
    -<discard buf any time after this point>
    -
    - -Example 3. Using H5LTopen_file_image to open a read-only file image where the application retains ownership of the buffer - -

    If the application wants to transfer ownership of the buffer to the HDF5 Library, and the standard C library routine free is an acceptable way of discarding it, the above example can be modified as follows:

    - -
    
    -<allocate and initialize buf_len and buf>
    -hid_t file_id;
    -unsigned flags = H5LT_FILE_IMAGE_DONT_COPY;
    -file_id = H5LTopen_file_image(buf, buf_len, flags);
    -<read file as desired, and then close>
    -
    - -Example 4. Using H5LTopen_file_image to open a read-only file image where the application transfers ownership of the buffer - -

    Again, file access is read-only. Read/write access can be obtained via the H5LTopen_file_image() call, but we will explore that in the section below.

    - -

    4.2. In-memory HDF5 File Image Construction

    - -

    Before the implementation of file image operations, HDF5 supported construction of an image of an HDF5 file in memory with the Core file driver. The H5Fget_file_image() function call allows an application access to the file image without first writing it to disk. See the following code fragment:

    - -
    
    -<Open and construct the desired file with the Core file driver>
    -H5Fflush(fid);
    -size = H5Fget_file_image(fid, NULL, 0);
    -buffer_ptr = malloc(size);
    -H5Fget_file_image(fid, buffer_ptr, size);
    -
    - -Example 5. Accessing the image of a file in memory - -

    The use of H5Fget_file_image() may be acceptable for small images. For large images, the cost of the malloc() and memcpy() operations may be excessive. To address this issue, the H5Pset_file_image_callbacks() call allows an application to manage dynamic memory allocation for file images and memory-based file drivers (only the Core file driver at present). The following code fragment illustrates its use. Note that most error checking is omitted for simplicity and that H5Pset_file_image is not used to set the initial file image.

    - -
    
    -    struct udata_t {
    -    void * image_ptr;
    -    size_t image_size;
    -          } udata = {NULL, 0};
    -
    -void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    ((struct udata_t *)udata)->image_size = size;
    -    return(malloc(size));
    -}
    -
    -void *image_memcpy)(void *dest, const void *src, size_t size,
    - H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(FALSE); /* Should never be invoked in this scenario. */
    -    return(NULL); /* always fails */
    -}
    -
    -void image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    ((struct udata_t *)udata)->image_size = size;
    -    return(realloc(ptr, size));
    -}
    -
    -herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(file_image_op == H5_FILE_IMAGE_OP_FILE_CLOSE);
    -    ((struct udata_t *)udata)->image_ptr = ptr;
    -    return(0); /* if we get here, we must have been successful */
    -}
    -
    -void *udata_copy(void *udata)
    -{
    -    return(udata);
    -}
    -
    -herr_t udata_free(void *udata)
    -{
    -    return(0);
    -}
    -
    -H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
    -                                       image_realloc, image_free,
    -                                       udata_copy, udata_free,
    -                                       (void *)(&udata)};
    -
    -<allocate fapl_id>
    -H5Pset_file_image_callbacks(fapl_id, &callbacks);
    -<open core file using fapl_id, write file, close it>
    -assert(udata.image_ptr!= NULL);
    -/* udata now contains the base address and length of the final version of the core file */
    -<use image of file, and then discard it via free()>
    -
    - -Example 6. Using H5Pset_file_image_callbacks to improve memory allocation

    - -

    The above code fragment gives the application full ownership of the buffer used by the Core file driver after the file is closed, and it notifies the application that the HDF5 Library is done with the buffer by setting udata.image_ptr to something other than NULL. If read access to the buffer is sufficient, the H5Fget_vfd_handle() call can be used as an alternate solution to get access to the base address of the Core file driver’s buffer.

    -

    The above solution avoids some unnecessary mallocand memcpycalls and should be quite adequate if an image of an HDF5 file is constructed only occasionally. However, if an HDF5 file image must be constructed regularly, and if we can put a strong and tight upper bound on the size of the necessary buffer, then the following pseudo code demonstrates a method of avoiding memory allocation completely. The downside, however, is that buffer is allocated statically. Again, much error checking is omitted for clarity.

    - -
    
    -char buf[BIG_ENOUGH];
    -struct udata_t {
    -void * image_ptr;
    -size_t image_size;
    -size_t max_image_size;
    -int ref_count;
    -} udata = {(void *)(&(buf[0]), 0, BIG_ENOUGH, 0};
    -
    -void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(size <= ((struct udata_t *)udata)->max_image_size);
    -    assert(((struct udata_t *)udata)->ref_count == 0);
    -    ((struct udata_t *)udata)->image_size = size;
    -    (((struct udata_t *)udata)->ref_count)++;
    -    return((((struct udata_t *)udata)->image_ptr);
    -}
    -void *image_memcpy)(void *dest, const void *src, size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(FALSE); /* Should never be invoked in this scenario. */
    -    return(NULL); /* always fails */
    -}
    -void *image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(ptr == ((struct udata_t *)udata)->image_ptr);
    -    assert(size <= ((struct udata_t *)udata)->max_image_size);
    -    assert(((struct udata_t *)udata)->ref_count == 1);
    -    ((struct udata_t *)udata)->image_size = size;
    -    return((((struct udata_t *)udata)->image_ptr);
    -}
    -herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(file_image_op == H5_FILE_IMAGE_OP_FILE_CLOSE);
    -    assert(ptr == ((struct udata_t *)udata)->image_ptr);
    -    assert(((struct udata_t *)udata)->ref_count == 1);
    -    (((struct udata_t *)udata)->ref_count)--;
    -    return(0); /* if we get here, we must have been successful */
    -}
    -void *udata_copy(void *udata)
    -{
    -    return(udata);
    -}
    -herr_t udata_free(void *udata)
    -{
    -    return(0);
    -}
    -H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
    -                                       image_realloc, image_free,
    -                                       udata_copy, udata_free,
    -                                       (void *)(&udata)};
    -/* end of initialization */
    -<allocate fapl_id>
    -H5Pset_file_image_callbacks(fapl_id, &callbacks);
    -<open core file using fapl_id>
    -<discard fapl any time after the open>
    -<write the file, flush it, and then close it>
    -assert(udata.ref_count == 0);
    -/* udata now contains the base address and length of the final version of the core file */
    -<use the image of the file>
    -<reinitialize udata, and repeat the above from the end of initialization onwards to write a new file image>
    -
    - -Example 7. Using H5Pset_file_image_callbacks with a static buffer

    - -

    If we can further arrange matters so that only the contents of the datasets in the HDF5 file image change, but not the structure of the file itself, we can optimize still further by re-using the image and changing only the contents of the datasets after the initial write to the buffer. The following pseudo code shows how this might be done. Note that the code assumes that buf already contains the image of the HDF5 file whose dataset contents are to be overwritten. Again, much error checking is omitted for clarity. Also, observe that the file image callbacks do not support the H5Pget_file_image() call.

    - -
    
    -<buf already defined and loaded with file image>
    -<udata already defined and initialized>
    -void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(size <= ((struct udata_t *)udata)->max_image_size);
    -    assert(size == ((struct udata_t *)udata)->image_size);
    -    assert(((struct udata_t *)udata)->ref_count >= 0);
    -          ((struct udata_t *)udata)->image_size = size;
    -          (((struct udata_t *)udata)->ref_count)++;
    -    return((((struct udata_t *)udata)->image_ptr);
    -}
    -void *image_memcpy)(void *dest, const void *src, size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(dest == ((struct udata_t *)udata)->image_ptr);
    -    assert(src == ((struct udata_t *)udata)->image_ptr);
    -    assert(size <= ((struct udata_t *)udata)->max_image_size);
    -    assert(size == ((struct udata_t *)udata)->image_size);
    -    assert(((struct udata_t *)udata)->ref_count >= 1);
    -    return(dest); /* if we get here, we must have been successful */
    -}
    -void *image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    /* One would think that this function is not needed in this scenario, as
    -     *  only the contents of the HDF5 file is being changed, not its size or
    -     *  structure. However, the Core file driver calls realloc() just before
    -     *  close to clip the buffer to the size indicated by the end of the
    -     *  address space.
    -     *
    -     *  While this call must be supported in this case, the size of
    -     *  the image should never change. Hence the function can limit itself
    -     *  to performing sanity checks, and returning the base address of the
    -     *  statically allocated buffer.
    -     */
    -    assert(ptr == ((struct udata_t *)udata)->image_ptr);
    -    assert(size <= ((struct udata_t *)udata)->max_image_size);
    -    assert(((struct udata_t *)udata)->ref_count >= 1);
    -    assert(((struct udata_t *)udata)->image_size == size);
    -    return((((struct udata_t *)udata)->image_ptr);
    -}
    -herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert((file_image_op == H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE) ||
    -           (file_image_op == H5_FILE_IMAGE_OP_FILE_CLOSE));
    -    assert(((struct udata_t *)udata)->ref_count >= 1);
    -          (((struct udata_t *)udata)->ref_count)--;
    -    return(0); /* if we get here, we must have been successful */
    -}
    -void *udata_copy(void *udata)
    -{
    -    return(udata);
    -}
    -herr_t udata_free(void *udata)
    -{
    -    return(0);
    -}
    -H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
    -                                       image_realloc, image_free,
    -                                       udata_copy, udata_free,
    -                                       (void *)(&udata)};
    -/* end of initialization */
    -<allocate fapl_id>
    -H5Pset_file_image_callbacks(fapl_id, &callbacks);
    -H5Pset_file_image(fapl_id, udata.image_ptr, udata.image_len);
    -<open core file using fapl_id>
    -<discard fapl any time after the open>
    -<overwrite data in datasets in the file, and then close it>
    -assert(udata.ref_count == 0);
    -/* udata now contains the base address and length of the final version of the core file */
    -<use the image of the file>
    -<repeat the above from the end of initialization onwards to write new data to datasets in file image>
    -
    - -Example 8. Using H5Pset_file_image_callbacks where only the datasets change - -

    Before we go on, we should note that the above pseudo code can be written more compactly, albeit with fewer sanity checks, using the H5LTopen_file_image() call. See the example below:

    - -
    
    -<buf already defined and loaded with file image>
    -<udata already defined and initialized>
    -hid_t file_id;
    -unsigned flags = H5LT_FILE_IMAGE_OPEN_RW | H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE;
    -/* end initialization */
    -file_id = H5LTopen_file_image(udata.image_ptr, udata.image_len, flags);
    -<overwrite data in datasets in the file, and then close it>
    -/* udata now contains the base address and length of the final version of the core file */
    -<use the image of the file>
    -<repeat the above from the end of initialization onwards to write new data to datasets in file image>
    -
    - -

    Example 9. Using H5LTopen_file_image where only the datasets change -

    The above pseudo code allows updates of a file image about as cheaply as possible. We assume the application has enough RAM for the image and that the HDF5 file structure is constant after the first write.

    -

    While the scenario above is plausible, we will finish this section with a more general scenario. In the pseudo code below, we assume sufficient RAM to retain the HDF5 file image between uses, but we do not assume that the HDF5 file structure remains constant or that we can place a hard pper bound on the image size.

    -

    Since we must use malloc, realloc, and free in this example, and since realloc can change the base address of a buffer, we must maintain two of ptr, size, and ref_count triples in the udata structure. The first triple is for the property list (which will never change the buffer), and the second triple is for the file driver. As shall be seen, this complicates the file image callbacks considerably. Note also that while we do not use H5Pget_file_image() in this example, we do include support for it in the file image callbacks. As usual, much error checking is omitted in favor of clarity.

    - -
    
    -struct udata_t {
    -    void * fapl_image_ptr;
    -    size_t fapl_image_size;
    -    int fapl_ref_count;
    -    void * vfd_image_ptr;
    -    size_t vfd_image_size;
    -    nt vfd_ref_count;
    -    } udata = {NULL, 0, 0, NULL, 0, 0};
    -boolean initial_file_open = TRUE;
    -
    -void *image_malloc(size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    void * return_value = NULL;
    -    switch ( file_image_op ) {
    -        case H5_FILE_IMAGE_OP_PROPERTY_LIST_SET:
    -        case H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY:
    -            assert(((struct udata_t *)udata)->fapl_image_ptr != NULL);
    -            assert(((struct udata_t *)udata)->fapl_image_size == size);
    -            assert(((struct udata_t *)udata)->fapl_ref_count >= 0);
    -            return_value = ((struct udata_t *)udata)->fapl_image_ptr;
    -            (((struct udata_t *)udata)->fapl_ref_count)++;
    -            break;
    -        case H5_FILE_IMAGE_OP_PROPERTY_LIST_GET:
    -            assert(((struct udata_t *)udata)->fapl_image_ptr != NULL);
    -            assert(((struct udata_t *)udata)->vfd_image_size == size);
    -            assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
    -            return_value = ((struct udata_t *)udata)->fapl_image_ptr;
    -            /* don’t increment ref count */
    -            break;
    -        case H5_FILE_IMAGE_OP_FILE_OPEN:
    -            assert(((struct udata_t *)udata)->vfd_image_ptr == NULL);
    -            assert(((struct udata_t *)udata)->vfd_image_size == 0);
    -            assert(((struct udata_t *)udata)->vfd_ref_count == 0);
    -            if (((struct udata_t *)udata)->fapl_image_ptr == NULL ) {
    -                ((struct udata_t *)udata)->vfd_image_ptr = malloc(size);
    -                ((struct udata_t *)udata)->vfd_image_size = size;
    -            } else {
    -                assert(((struct udata_t *)udata)->fapl_image_size == size);
    -                assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
    -                ((struct udata_t *)udata)->vfd_image_ptr = ((struct udata_t *)udata)->fapl_image_ptr;
    -                ((struct udata_t *)udata)->vfd_image_size = size;
    -            }
    -            return_value = ((struct udata_t *)udata)->vfd_image_ptr;
    -            (((struct udata_t *)udata)->vfd_ref_count)++;
    -            break;
    -        default:
    -            assert(FALSE);
    -          }
    -    return(return_value);
    -}
    -
    -void *image_memcpy)(void *dest, const void *src, size_t size,
    - H5_file_image_op_t file_image_op, void *udata)
    -{
    -    switch(file_image_op) {
    -        case H5_FILE_IMAGE_OP_PROPERTY_LIST_SET:
    -        case H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY:
    -        case H5_FILE_IMAGE_OP_PROPERTY_LIST_GET:
    -            assert(dest == ((struct udata_t *)udata)->fapl_image_ptr);
    -            assert(src == ((struct udata_t *)udata)->fapl_image_ptr);
    -            assert(size == ((struct udata_t *)udata)->fapl_image_size);
    -            assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
    -            break;
    -        case H5_FILE_IMAGE_OP_FILE_OPEN:
    -            assert(dest == ((struct udata_t *)udata)->vfd_image_ptr);
    -            assert(src == ((struct udata_t *)udata)->fapl_image_ptr);
    -            assert(size == ((struct udata_t *)udata)->fapl_image_size);
    -            assert(size == ((struct udata_t *)udata)->vfd_image_size);
    -            assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
    -            assert(((struct udata_t *)udata)->vfd_ref_count == 1);
    -            break;
    -        default:
    -            assert(FALSE);
    -            break;
    -        }
    -    return(dest); /* if we get here, we must have been successful */
    -}
    -
    -void *image_realloc(void *ptr, size_t size, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    assert(ptr == ((struct udata_t *)udata)->vfd_image_ptr); |
    -    assert(((struct udata_t *)udata)->vfd_ref_count == 1);
    -    ((struct udata_t *)udata)->vfd_image_ptr = realloc(ptr, size);
    -    ((struct udata_t *)udata)->vfd_image_size = size;
    -    return((((struct udata_t *)udata)->vfd_image_ptr);
    -}
    -
    -herr_t image_free(void *ptr, H5_file_image_op_t file_image_op, void *udata)
    -{
    -    switch(file_image_op) {
    -        case H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE:
    -            assert(ptr == ((struct udata_t *)udata)->fapl_image_ptr);
    -            assert(((struct udata_t *)udata)->fapl_ref_count >= 1);
    -            (((struct udata_t *)udata)->fapl_ref_count)--;
    -            break;
    -        case H5_FILE_IMAGE_OP_FILE_CLOSE:
    -            assert(ptr == ((struct udata_t *)udata)->vfd_image_ptr);
    -            assert(((struct udata_t *)udata)->vfd_ref_count == 1);
    -            (((struct udata_t *)udata)->vfd_ref_count)--;
    -            break;
    -        default:
    -            assert(FALSE);
    -            break;
    -        }
    -    return(0); /* if we get here, we must have been successful */
    -}
    -
    -void *udata_copy(void *udata)
    -{
    -          return(udata);
    -}
    -
    -herr_t udata_free(void *udata)
    -{
    -          return(0);
    -}
    -H5_file_image_callbacks_t callbacks = {image_malloc, image_memcpy,
    -                                       image_realloc, image_free,
    -                                       udata_copy, udata_free,
    -                                       (void *)(&udata)};
    -/* end of initialization */
    -<allocate fapl_id>
    -H5Pset_file_image_callbacks(fapl_id, &callbacks);
    -if ( initial_file_open ) {
    -    initial_file_open = FALSE;
    -} else {
    -    assert(udata.vfd_image_ptr != NULL);
    -    assert(udata.vfd_image_size > 0);
    -    assert(udata.vfd_ref_count == 0);
    -    assert(udata.fapl_ref_count == 0);
    -    udata.fapl_image_ptr = udata.vfd_image_ptr;
    -    udata.fapl_image_size = udata.vfd_image_size;
    -    udata.vfd_image_ptr = NULL;
    -    udata.vfd_image_size = 0;
    -    H5Pset_file_image(fapl_id, udata.fapl_image_ptr, udata.fapl_image_size);
    -}
    -
    -<open core file using fapl_id>
    -<discard fapl any time after the open>
    -<write/update the file, and then close it>
    -assert(udata.fapl_ref_count == 0);
    -assert(udata.vfd_ref_count == 0);

    -

    /* udata.vfd_image_ptr and udata.vfd_image_size now contain the base address and length of the final version of the core file */ -<use the image of the file> -<repeat the above from the end of initialization to modify the file image as needed> -<free the image when done> -

    - -Example 10. Using H5LTopen_file_image where only the datasets change and where the file structure and image size might not be constant

    - -

    The above pseudo code shows how a buffer can be passed back and forth between the application and the HDF5 Library. The code also shows the application having control of the actual allocation, reallocation, and freeing of the buffer.

    - -

    4.3. Using HDF5 to Construct and Read a Data Packet

    -

    Using the file image operations described in this document, we can bundle up data in an image of an HDF5 file on one process, transmit the image to a second process, and then open and read the image on the second process without any mandatory file system I/O.

    -

    We have already demonstrated the construction and reading of such buffers above, but it may be useful to offer an example of the full operation. We do so in the example below using as simple a set of calls as possible. The set of calls in the example has extra buffer allocations. To reduce extra buffer allocations, see the sections above.

    -

    In the following example, we construct an HDF5 file image on process A and then transmit the image to process B where we then open the image and extract the desired data. Note that no file system I/O is performed: all the processing is done in memory with the Core file driver.

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    *** Process A ****** Process B ***
    <Open and construct the desired file with the Core file driver>hid_t file_id;

    H5Fflush(fid);
    size = H5Fget_file_image(fid, NULL, 0);
    buffer_ptr = malloc(size);
    H5Fget_file_image(fid, buffer_ptr, size);
    <transmit size>
    <receive size>
    <transmit *buffer_ptr>buffer_ptr = malloc(size)
    free(buffer_ptr);<receive image in *buffer_ptr>
    <close core file>file_id = H5LTopen_file_image(buf, - buf_len, - H5LT_FILE_IMAGE_DONT_COPY);
    <read data from file, then close. note that the Core file driver will discard the buffer on close>
    - -Example 11. Building and passing a file image from one process to another - - -

    4.4. Using a Template File

    - -

    After the above examples, an example of the use of a template file might seem anti-climactic. A template file might be used to enforce consistency on file structure between files or in parallel HDF5 to avoid long sequences of collective operations to create the desired groups, datatypes, and possibly datasets. The following pseudo code outlines a potential use:

    - -
    
    -<allocate and initialize buf and buflen, with buf containing the desired initial image (which in turn contains the desired group, datatype, and dataset definitions), and buf_len containing the size of buf>
    -<allocate fapl_id>
    -<set fapl to use desired file driver that supports initial images>
    -H5Pset_file_image(fapl_id, buf, buf_len);
    -<discard buf any time after this point>
    -<open file>
    -<discard fapl any time after this point>
    -<read and/or write file as desired, close>
    -
    - -Example 12. Using a template file

    - -

    Observe that the above pseudo code includes an unnecessary buffer allocation and copy in the call to H5Pset_file_image(). As we have already discussed ways of avoiding this, we will not address that issue here.

    -

    What is interesting in this case is to consider why the application would find this use case attractive.

    -

    In the serial case, at first glance there seems little reason to use the initial image facility at all. It is easy enough to use standard C calls to duplicate a template file, rename it as desired, and then open it as an HDF5 file.

    -

    However, this assumes that the template file will always be available and in the expected place. This is a questionable assumption for an application that will be widely distributed. Thus, we can at least make an argument for either keeping an image of the template file in the executable or for including code for writing the desired standard definitions to new HDF5 files.

    -

    Assuming the image is relatively small, we can further make an argument for the image in place of the code, as, quite simply, the image should be easier to maintain and modify with an HDF5 file editor.

    -

    However, there remains the question of why one should pass the image to the HDF5 Library instead of writing it directly with standard C calls and then using HDF5 to open it. Other than convenience and a slight reduction in code size, we are hard pressed to offer a reason.

    -

    In contrast, the argument is stronger in the parallel case since group, datatype, and dataset creations are all expensive collective operations. The argument is also weaker: simply copying an existing template file and opening it should lose many of its disadvantages in the HPC context although we would imagine that it is always useful to reduce the number of files in a deployment.

    -

    In closing, we would like to consider one last point. In the parallel case, we would expect template files to be quite large. Parallel HDF5 requires eager space allocation for chunked datasets. For similar reasons, we would expect template files in this context to contain long sequences of zeros with a scattering of metadata here and there. Such files would compress well, and the compressed images would be cheap to distribute across the available processes if necessary. Once distributed, each process could uncompress the image and write to file those sections containing actual data that lay within the section of the file assigned to the process. This approach might be significantly faster than a simple copy as it would allow sparse writes, and thus it might provide a compelling use case for template files. However, this approach would require extending our current API to allow compressed images. We would also have to add the H5Pget/set_image_decompression_callback() API calls. We see no problem in doing this. However, it is beyond the scope of the current effort, and thus we will not pursue the matter further unless there is interest in our doing so.

    - -

    5. Java Signatures for File Image Operations API Calls

    - -

    Potential Java function call signatures for the file image operation APIs are described in this section. These have not yet been implemented, and there are no immediate plans for implementation.

    -

    Note that the H5LTopen_file_image() call is omitted. We have not supported high-level library calls in Java.

    - -

    H5Pset_file_image

    -

    int H5Pset_file_image(int fapl_id, const byte[] buf_ptr);

    - -H5Pget_file_image

    -

    herr_t H5Pget_file_image(hid_t fapl_id, byte[] buf_ptr_ptr);

    - -H5_file_image_op_t

    -
    public static H5_file_image_op_t
    -{
    -     H5_FILE_IMAGE_OP_PROPERTY_LIST_SET,
    -     H5_FILE_IMAGE_OP_PROPERTY_LIST_COPY,
    -     H5_FILE_IMAGE_OP_PROPERTY_LIST_GET,
    -     H5_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE,
    -     H5_FILE_IMAGE_OP_FILE_OPEN,
    -     H5_FILE_IMAGE_OP_FILE_RESIZE,
    -     H5_FILE_IMAGE_OP_FILE_CLOSE
    -}
    - -H5_file_image_malloc_cb

    -
    public interface H5_file_image_malloc_cb extends Callbacks {
    -     buf[] callback(H5_file_image_op_t file_image_op, CBuserdata udata);
    -}
    - -H5_file_image_memcpy_cb

    -
    public interface H5_file_image_memcpy_cb extends Callbacks {
    -buf[] callback(buf[] dest, const buf[] src, H5_file_image_op_t file_image_op, CBuserdata
    -udata);
    -}
    - -H5_file_image_realloc_cb

    -
    public interface H5_file_image_realloc_cb extends Callbacks {
    -     buf[] callback(buf[] ptr, H5_file_image_op_t file_image_op, CBuserdata udata);
    -}
    - -H5_file_image_free_cb

    -
    public interface H5_file_image_free_cb extends Callbacks {
    -     void callback(buf[] ptr, H5_file_image_op_t file_image_op, CBuserdata udata);
    -}
    - -H5_file_udata_copy_cb

    -
    public interface H5_file_udata_copy_cb extends Callbacks {
    -     buf[] callback(CBuserdata udata);
    -}
    - -H5_file_udata_free_cb

    -
    public interface H5_file_udata_free_cb extends Callbacks {
    -     void callback(CBuserdata udata);
    -}
    - -H5_file_image_callbacks_t

    -
    public abstract class H5_file_image_callbacks_t
    -{
    -     H5_file_image_malloc_cb image_malloc;
    -     H5_file_image_memcpy_cb image_memcpy;
    -     H5_file_image_realloc_cb image_realloc;
    -     H5_file_image_free_cb image_free;
    -     H5_file_udata_copy_cb udata_copy;
    -     H5_file_udata_free_cb udata_free;
    -     CBuserdata udata;
    -     public H5_file_image_callbacks_t(
    -          H5_file_image_malloc_cb image_malloc,
    -          H5_file_image_memcpy_cb image_memcpy,
    -          H5_file_image_realloc_cb image_realloc,
    -          H5_file_image_free_cb image_free,
    -          H5_file_udata_copy_cb udata_copy,
    -          H5_file_udata_free_cb udata_free,
    -          CBuserdata udata) {
    -       this.image_malloc = image_malloc;
    -       this.image_memcpy = image_memcpy;
    -       this.image_realloc = image_realloc;
    -       this.image_free = image_free;
    -       this.udata_copy = udata_copy;
    -       this.udata_free = udata_free;
    -       this.udata = udata;
    -     }
    -}
    - -H5Pset_file_image_callbacks

    -
    int H5Pset_file_image_callbacks(int fapl_id, H5_file_image_callbacks_t callbacks_ptr);
    - -H5Pget_file_image_callbacks

    -
    int H5Pget_file_image_callbacks(int fapl_id, H5_file_image_callbacks_t[] callbacks_ptr);
    - -H5Fget_file_image

    -
    long H5Fget_file_image(int file_id, byte[] buf_ptr);
    - -

    6. Fortran Signatures for File Image Operations API Calls

    - -

    Potential Fortran function call signatures for the file image operation APIs are described in this section. These have not yet been implemented, and there are no immediate plans for implementation.

    - -

    6.1. Low-level Fortran API Routines

    - -

    The Fortran low-level APIs make use of Fortran 2003’s ISO_C_BINDING module in order to achieve portable and standard conforming interoperability with the C APIs. The C pointer (C_PTR) and function pointer (C_FUN_PTR) types are returned from the intrinsic procedures C_LOC(X) and C_FUNLOC(X), respectively, defined in the ISO_C_BINDING module. The argument X is the data or function to which the C pointers point to and must have the TARGET attribute in the calling program. Note that the variable name lengths of the Fortran equivalent of the predefined C constants were shortened to less than 31 characters in order to be Fortran standard compliant.

    - -

    6.1.1. H5Pset_file_image_f

    - -

    The signature of H5Pset_file_image_f is defined as follows:

    -

    SUBROUTINE H5Pset_file_image_f(fapl_id, buf_ptr, buf_len, hdferr) - -

    The parameters of H5Pset_file_image are defined as follows:

    - - - - - - - - - - - - - - - - - - -
    INTEGER(hid_t), INTENT(IN):: fapl_idWill contain the ID of the target file access property list.
    TYPE(C_PTR), INTENT(IN):: buf_ptrWill supply the C pointer to the initial file image or C_NULL_PTR if no initial file image is desired.
    INTEGER(size_t), INTENT(IN):: buf_lenWill contain the size of the supplied buffer or 0 if no initial image is desired.
    INTEGER, INTENT(OUT) :: hdferrWill return the error status: 0 for success and -1 for failure.
    - -

    6.1.2. H5Pget_file_image_f

    -

    The signature of H5Pget_file_image_f is defined as follows:

    -

    SUBROUTINE H5Pget_file_image_f(fapl_id, buf_ptr, buf_len, hdferr) - -

    The parameters of H5Pget_file_image_f are defined as follows:

    - - - - - - - - - - - - - - - - - -
    INTEGER(hid_t), INTENT(IN) :: fapl_idWill contain the ID of the target file access property list
    TYPE(C_PTR), INTENT(INOUT), VALUE :: buf_ptrWill hold either a C_NULL_PTR or a scalar of type c_ptr. If buf_ptr is not C_NULL_PTR, on successful return, buf_ptr shall contain a C pointer to a copy of the initial image provided in the last call to H5Pset_file_image_f for the supplied fapl_id, or buf_ptr shall contain a C_NULL_PTR if there is no initial image set. The Fortran pointer can be obtained using the intrinsic C_F_POINTER.
    INTEGER(size_t), INTENT(OUT) :: buf_lenWill contain the value of the buffer parameter for the initial image in the supplied fapl_id. The value will be 0 if no initial image is set.
    INTEGER, INTENT(OUT) :: hdferrWill return the error status: 0 for success and -1 for failure.
    - -

    6.1.3. H5Pset_file_image_callbacks_f

    -

    The signature of H5Pset_file_image_callbacks_f is defined as follows: - -

    
    -

    INTEGER :: H5_IMAGE_OP_PROPERTY_LIST_SET_F=0, - H5_IMAGE_OP_PROPERTY_LIST_COPY_F=1, - H5_IMAGE_OP_PROPERTY_LIST_GET_F=2, - H5_IMAGE_OP_PROPERTY_LIST_CLOSE_F=3, - H5_IMAGE_OP_FILE_OPEN_F=4, - H5_IMAGE_OP_FILE_RESIZE_F=5, - H5_IMAGE_OP_FILE_CLOSE_F=6 -TYPE, BIND(C) :: H5_file_image_callbacks_t - TYPE(C_FUN_PTR), VALUE :: image_malloc - TYPE(C_FUN_PTR), VALUE :: image_memcpy - TYPE(C_FUN_PTR), VALUE :: image_realloc - TYPE(C_FUN_PTR), VALUE :: image_free - TYPE(C_FUN_PTR), VALUE :: udata - TYPE(C_FUN_PTR), VALUE :: udata_copy - TYPE(C_FUN_PTR), VALUE :: udata_free - TYPE(C_PTR), VALUE :: udata -END TYPE H5_file_image_callbacks_t -

    - -The semantics of the above values will be the same as those defined in the C enum. See Section 2.1.3 for more information.

    -

    Fortran Callback APIs

    -

    The Fortran callback APIs are shown below.

    -

    FUNCTION op_func(size, file_image_op, udata,) RESULT(image_malloc) - - - - - - - - - - - - - - - - - - -
    INTEGER(size_t) :: sizeWill contain the size of the image buffer to allocate in bytes.
    INTEGER :: file_image_opWill be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.
    TYPE(C_PTR), VALUE :: udataWill be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.
    TYPE(C_FUN_PTR), VALUE :: image_mallocShall contain a pointer to a function with functionality identical to the standard C library memcpy() call.

    -

    FUNCTION op_func(dest, src, size, & file_image_op, udata) RESULT(image_memcpy) - - - - - - - - - - - - - - - - - - - - - - - - - - -
    TYPE(C_PTR), VALUE :: destWill contain the address of the buffer into which to copy.
    TYPE(C_PTR), VALUE :: srcWill contain the address of the buffer from which to copy
    INTEGER(size_t) :: sizeWill contain the number of bytes to copy.
    INTEGER :: file_image_opWill be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.
    TYPE(C_PTR), VALUE :: udataWill be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.
    TYPE(C_FUN_PTR), VALUE :: image_memcpyShall contain a pointer to a function with functionality identical to the standard C library memcpy() call.

    - -

    FUNCTION op_func(ptr, size, & file_image_op, udata) RESULT(image_realloc) - - - - - - - - - - - - - - - - - - - - - -
    TYPE(C_PTR), VALUE :: ptrWill contain the pointer to the buffer being reallocated
    INTEGER(size_t) :: sizeWill contain the desired size of the buffer after realloc in bytes.
    INTEGER :: file_image_opWill be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.
    TYPE(C_PTR), VALUE :: udataWill be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.
    TYPE(C_FUN_PTR), VALUE :: image_reallocShall contain a pointer to a unction functionality identical to the standard C library realloc() call.

    - -

    FUNCTION op_func(ptr, file_image_op, udata) RESULT(image_free) - - - - - - - - - - - - - - - - - -
    TYPE(C_PTR), VALUE :: ptrWill contain the pointer to the buffer being released.
    INTEGER :: file_image_opWill be set to one of the values of H5_IMAGE_OP_* indicating the operation being performed on the file image when this callback is invoked.
    TYPE(C_PTR), VALUE :: udataWill be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.
    TYPE(C_PTR), VALUE :: image_freeShall contain a pointer to a function with functionality identical to the standard C library free() call

    - -

    FUNCTION op_func(udata) RESULT(udata_copy) - - - - - - - - - -
    TYPE(C_PTR), VALUE :: udataWill be set to the value passed in for the udata parameter to H5Pset_file_image_callbacks_f.
    TYPE(C_FUN_PTR), VALUE :: udata_copyShall contain a pointer to a function that will allocate a buffer of suitable size, copy the contents of the supplied udata into the new buffer, and return the address of the new buffer. The function will return C_NULL_PTR on failure.

    - -

    FUNCTION op_func(udata) RESULT(udata_free) - - - - - -
    TYPE(C_PTR), VALUE :: udataShall contain a pointer value, potentially to user-defined data, that will be passed to the image_malloc, image_memcpy, image_realloc, and image_free callbacks.

    - -

    The signature of H5Pset_file_image_callbacks_f is defined as follows:

    -

    SUBROUTINE H5Pset_file_image_callbacks_f(fapl_id, &callbacks_ptr, hdferr) -The parameters are defined as follows:

    - - - - - - - - - - - - - -

    INTEGER(hid_t), INTENT(IN) :: fapl_id

    Will contain the ID of the target file access property list.

    TYPE(H5_file_image_callbacks_t), INTENT(IN) :: callbacks_ptr

    Will contain the callback derived type. callbacks_ptr shall contain a pointer to the Fortran function via the intrinsic functions C_LOC(X) and C_FUNLOC(X).

    INTEGER, INTENT(OUT) :: hdferr

    Will return the error status: 0 for success and -1 for failure.

    - -

    6.1.4. H5Pget_file_image_callbacks_f

    -

    The H5Pget_file_image_callbacks_f routine is designed to obtain the current file image callbacks from a file access property list.

    -

    The signature is defined as follows

    -

    SUBROUTINE H5Pget_file_image_callbacks_f(fapl_id, callbacks_ptr, hdferr) -The parameters are defined as follows:

    - - - - - - - - - - - - - -
    INTEGER(hid_t), INTENT(IN) :: fapl_idWill contain the ID of the target file access property list.

    TYPE(H5_file_image_callbacks_t), INTENT(OUT) :: callbacks_ptrWill contain the callback derived type. Each member of the derived type shall have the same meaning as its C counterpart. See section 2.1.4 for more information.

    INTEGER, INTENT(OUT) :: hdferrWill return the error status: 0 for success and -1 for failure.

    - -

    6.1.5. Fortran Virtual File Driver Feature Flags

    -

    Implementation of the H5Pget/set_file_image_callbacks_f() and H5Pget/set_file_image_f() APIs requires a pair of new virtual file driver feature flags:

    -

    H5FD_FEAT_LET_IMAGE_F -H5FD_FEAT_LET_IMAGE_CALLBACK_F -See the “Virtual File Driver Feature Flags” section for more information.

    - -

    6.1.6. H5Fget_file_image_f

    -

    The signature of H5Fget_file_image_f shall be defined as follows:

    -

    SUBROUTINE H5Fget_file_image_f(file_id, buf_ptr, buf_len, hdferr, buf_size) -The parameters of H5Fget_file_image_f are defined as follows:

    - - - - - - - - - - - - - - - - - - - - -

    See the “H5Fget_file_image” section for more information.

    - -
    INTEGER(hid_t), INTENT(IN) :: file_idWill contain the ID of the target file.

    TYPE(C_PTR), INTENT(IN) :: buf_ptrWill contain a C pointer to the buffer into which the image of the HDF5 file is to be copied. If buf_ptr is C_NULL_PTR, no data will be copied.

    INTEGER(size_t), INTENT(IN) :: buf_lenWill contain the size in bytes of the supplied buffer.

    INTEGER(ssizet_t), INTENT(OUT), OPTIONAL :: buf_sizeWill indicate the buffer size required to store the file image (in other words, the length of the file). If only the buf_size is needed, then buf_ptr should be also be set to C_NULL_PTR

    INTEGER, INTENT(OUT) :: hdferrReturns the error status: 0 for success and -1 for failure.

    - -

    6.2. High-level Fortran API Routine

    - -The new Fortran high-level routine H5LTopen_file_image_f will provide a wrapper for the high-level H5LTopen_file_image function. Consequently, the high-level Fortran API will not be implemented using low-level HDF5 Fortran APIs. - -

    6.2.1. H5LTopen_file_image_f

    -The signature of H5LTopen_file_image_f is defined as follows:

    -

    SUBROUTINE H5LTopen_file_image_f(buf_ptr, buf_len, flags, file_id, hdferr) -The parameters of H5LTopen_file_image_f are defined as follows:

    - - - - - - - - - - - - - - - - - - - - - -
    TYPE(C_PTR), INTENT(IN), VALUE :: buf_ptrWill contain a pointer to the supplied initial image. A C_NULL_PTR value is invalid and will cause H5LTopen_file_image_f to fail.
    INTEGER(size_t), INTENT(IN) :: buf_lenWill contain the size of the supplied buffer. A value of 0 is invalid and will cause H5LTopen_file_image_f to fail.
    INTEGER, INTENT(IN) :: flagsWill contain a set of flags indicating whether the image is to be opened read/write, whether HDF5 is to take control of the buffer, and how long the application promises to maintain the buffer. Possible flags are as follows: H5LT_IMAGE_OPEN_RW_F, H5LT_IMAGE_DONT_COPY_F, and H5LT_IMAGE_DONT_RELEASE_F. The C equivalent flags are defined in the “H5LTopen_file_image” section.
    INTEGER(hid_t), INTENT(IN) :: file_idWill be a file ID on success.
    INTEGER, INTENT(OUT) :: hdferrReturns the error status: 0 for success and -1 for failure.
    -
    - - diff --git a/doxygen/examples/H5.format.html b/doxygen/examples/H5.format.html index 1e7fe256f1a..2272a2b5eff 100644 --- a/doxygen/examples/H5.format.html +++ b/doxygen/examples/H5.format.html @@ -176,7 +176,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -476,6 +476,16 @@ and do not represent any values or padding in the file.

    + +

    I.B. Changes for HDF5 2.0

    +

    The following sections have been + changed or added for the 2.0 release:

    +
      +
    • Under “The Datatype Message”, + in the Description for “Fields:Datatype Message”, + version 5 was added, as well as the new Complex class (11).
    • +
    +

    I.B. Changes for HDF5 1.12

    The following sections have been @@ -9685,6 +9695,11 @@

    IV.A.2.d. The Datatype Message

    Used to encode the revised reference datatype. + + 5 + Used when a complex number datatype needs to be encoded. + +

    The class of the datatype determines the format for the class @@ -9752,6 +9767,11 @@

    IV.A.2.d. The Datatype Message

    10 Array + + + 11 + Complex +

    @@ -11525,6 +11545,119 @@

    IV.A.2.d. The Datatype Message

    +
    +
    + +

    Class specific information for the Complex class (Class 11):

    + +
    + + + + + + + + + + + + + + + + + + + + + + +
    + Bits: Complex Bit Field Description +
    BitsMeaning

    0

    Homogeneous. If zero, each part of the complex number + datatype is a different floating point datatype (heterogeneous). + Otherwise, each part of the complex number datatype is the same + floating point datatype (homogeneous). Currently, only homogeneous + complex number datatypes are supported.

    1,2

    Complex number form. This two-bit value contains the type of + complex number datatype described. The values defined are: + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ValueDescription
    0Rectangular +
    1Polar +
    2Exponential +
    3Reserved +

    + +

    Currently, only rectangular complex number datatypes are supported.

    +

    3-23

    Reserved (zero).

    +
    + +
    +
    + + + + + + + + + + + + + +
    + Layout: Complex Property Description +
    ByteByteByteByte

    Parent Type Message

    +
    + +
    +
    + + + + + + + + + + + +
    + Fields: Complex Property Description +
    Field NameDescription

    Parent Type Message

    +

    Each complex number type is based on a parent floating point type. + This field contains the datatype message describing that parent type. +

    +
    +

    IV.A.2.e. The Data Storage - diff --git a/doxygen/examples/TableSpec.html b/doxygen/examples/TableSpec.html deleted file mode 100644 index 474176e14d5..00000000000 --- a/doxygen/examples/TableSpec.html +++ /dev/null @@ -1,193 +0,0 @@ - - - HDF5 Table Specification - - -The HDF5 specification defines the standard objects and storage for the -standard HDF5 objects. (For information about the HDF5 library, model and -specification, see the HDF documentation.)  This document is an additional -specification do define a standard profile for how to store tables in HDF5. -Table data in HDF5 is stored as HDF5 datasets with standard attributes to define -the properties of the tables. - -

    -1. Overview

    -A generic table is a sequence of records, each record has a name and a type. -Table data is stored as an HDF5 one dimensional compound dataset.  A table -is defined as a collection of records whose values are stored in fixed-length -fields. All records have the same structure and all values in each field have -the same data type. -

    The dataset for a table is distinguished from other datasets by giving -it an attribute "CLASS=TABLE".   -Optional attributes allow the storage of a title for the Table and for -each column, and a fill value for each column. -

    -2.  Table Attributes

    -The attributes for the Table are strings. They are written with the
    H5LTset_attribute_string -Lite API function.  "Required" attributes must always be used. "Optional" attributes -must be used when required. -
      -

    -Attributes

    - -
    -
    -Attribute name="CLASS" (Required)
    - -
    -This attribute is type H5T_C_S1, with size 5.
    - -
    -For all Tables, the value of this attribute is "TABLE".
    - -
    -This attribute identifies this data set as intended to be interpreted as Table that conforms to the specifications on this page.
    -
    - -
    -Attribute name="VERSION" (Required) - -
    -This attribute is of type H5T_C_S1, with size corresponding to the length -of the version string.  This attribute identifies the version number -of this specification to which it conforms.  The current version number -is "0.2".
    - -
    - -
    -
    -Attribute name="TITLE" (Optional)
    - -
    -The TITLE is an optional String that is to be used as the -informative title of the whole table. -The TITLE is set with the parameter table_title of the function - H5TBmake_table
    -
    - -
    -
    -Attribute name="FIELD_(n)_NAME" (Required)
    - -
    -The FIELD_(n)_NAME is an optional String that is to be used as the -informative title of column n of the table. -For each of the fields the word FIELD_ is concatenated with - the zero based field (n) index together with the name of the field.
    - -
    -
    -
    -Attribute name="FIELD_(n)_FILL" (Optional)
    - -
    -The FIELD_(n)_FILL is an optional String that is the fill value for -column n of the table. -For each of the fields the word FIELD_ is concatenated with - the zero based field (n) index together with the fill value, if present. -This value is written only when a fill value is defined for the table.
    - -
    - -
    - -
      -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Table 1. Attributes of an Image Dataset
    Attribute Name(R = Required -
    O= Optional)
    TypeString SizeValue
    CLASSRString5"TABLE"
    VERSIONRString3"0.2"
    TITLEOString  - -
    FIELD_(n)_NAMERString  -  - -
    FIELD_(n)_FILLO*String  -  -
    -
    - -
    -

    -

    -  -
    -* The attribute FIELD_(n)_FILL is written to the table if a fill value is -specified on the creation of the Table. Otherwise, it is not.

    The following -section of code shows the calls necessary to the creation of a table. - -

    /* Create a new HDF5 file using default properties. */
    - file_id = H5Fcreate( "my_table.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT );

    - -

    /* Call the make table function */
    -
    H5TBmake_table( "Table Title", file_id, "Table1", NFIELDS, NRECORDS, dst_size, 
    - field_names, dst_offset, field_type, 
    - chunk_size, fill_data, compress, p_data ) 

    - -

    /* Close the file. */
    - status = H5Fclose( file_id );

    - - diff --git a/doxygen/examples/VFL.html b/doxygen/examples/VFL.html deleted file mode 100644 index 78d163208ad..00000000000 --- a/doxygen/examples/VFL.html +++ /dev/null @@ -1,1598 +0,0 @@ - - - - -HDF5 Virtual File Layer - - - - - - - - -Revision History -

    Initial document, 18 November 1999.

    - -

    Updated on 10/24/00, Quincey Koziol

    - -

    Added the section “Programming Note for C++ Developers Using C -Functions,” 08/23/2012, Mark Evans - - - -

    -


    -

    Table of Contents

    - -


    - - -

    Introduction

    - -

    -The HDF5 file format describes how HDF5 data structures and dataset raw -data are mapped to a linear format address space and the HDF5 -library implements that bidirectional mapping in terms of an -API. However, the HDF5 format specifications do not indicate how -the format address space is mapped onto storage and HDF (version 5 and -earlier) simply mapped the format address space directly onto a single -file by convention. - -

    -

    -Since early versions of HDF5 it became apparent that users want the ability to -map the format address space onto different types of storage (a single file, -multiple files, local memory, global memory, network distributed global -memory, a network protocol, etc.) with various types of maps. For -instance, some users want to be able to handle very large format address -spaces on operating systems that support only 2GB files by partitioning the -format address space into equal-sized parts each served by a separate -file. Other users want the same multi-file storage capability but want to -partition the address space according to purpose (raw data in one file, object -headers in another, global heap in a third, etc.) in order to improve I/O -speeds. - -

    -

    -In fact, the number of storage variations is probably larger than the -number of methods that the HDF5 team is capable of implementing and -supporting. Therefore, a Virtual File Layer API is being -implemented which will allow application teams or departments to design -and implement their own mapping between the HDF5 format address space -and storage, with each mapping being a separate file driver -(possibly written in terms of other file drivers). The HDF5 team will -provide a small set of useful file drivers which will also serve as -examples for those who which to write their own: - -

    -
    - -
    H5FD_SEC2 -
    -This is the default driver which uses Posix file-system functions like -read and write to perform I/O to a single file. All I/O -requests are unbuffered although the driver does optimize file seeking -operations to some extent. - -
    H5FD_STDIO -
    -This driver uses functions from `stdio.h' to perform buffered I/O -to a single file. - -
    H5FD_CORE -
    -This driver performs I/O directly to memory and can be used to create small -temporary files that never exist on permanent storage. This type of storage is -generally very fast since the I/O consists only of memory-to-memory copy -operations. - -
    H5FD_MPIIO -
    -This is the driver of choice for accessing files in parallel using MPI and -MPI-IO. It is only predefined if the library is compiled with parallel I/O -support. - -
    H5FD_FAMILY -
    -Large format address spaces are partitioned into more manageable pieces and -sent to separate storage locations using an underlying driver of the user's -choice. The h5repart tool can be used to change the sizes of the -family members when stored as files or to convert a family of files to a -single file or vice versa. - -
    H5FD_SPLIT -
    -The format address space is split into meta data and raw data and each is -mapped onto separate storage using underlying drivers of the user's -choice. The meta data storage can be read by itself (for limited -functionality) or both files can be accessed together. -
    - - - -

    Using a File Driver

    - -

    -Most application writers will use a driver defined by the HDF5 library or -contributed by another programming team. This chapter describes how existing -drivers are used. - -

    - - - -

    Driver Header Files

    - -

    -Each file driver is defined in its own public header file which should -be included by any application which plans to use that driver. The -predefined drivers are in header files whose names begin with -`H5FD' followed by the driver name and `.h'. The `hdf5.h' -header file includes all the predefined driver header files. - -

    -

    -Once the appropriate header file is included a symbol of the form -`H5FD_' followed by the upper-case driver name will be the driver -identification number.(1) However, the -value may change if the library is closed (e.g., by calling -H5close) and the symbol is referenced again. - -

    - - -

    Creating and Opening Files

    - -

    -In order to create or open a file one must define the method by which the -storage is accessed(2) and does so by creating a file access property list(3) which is passed to the H5Fcreate or -H5Fopen function. A default file access property list is created by -calling H5Pcreate and then the file driver information is inserted by -calling a driver initialization function such as H5Pset_fapl_family: - -

    - -
    -hid_t fapl = H5Pcreate(H5P_FILE_ACCESS);
    -size_t member_size = 100*1024*1024; /*100MB*/
    -H5Pset_fapl_family(fapl, member_size, H5P_DEFAULT);
    -hid_t file = H5Fcreate("foo%05d.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
    -H5Pclose(fapl);
    -
    - -

    -Each file driver will have its own initialization function -whose name is H5Pset_fapl_ followed by the driver name and which -takes a file access property list as the first argument followed by -additional driver-dependent arguments. - -

    -

    -An alternative to using the driver initialization function is to set the -driver directly using the H5Pset_driver function.(4) Its second argument is the file driver identifier, which may -have a different numeric value from run to run depending on the order in which -the file drivers are registered with the library. The third argument -encapsulates the additional arguments of the driver initialization -function. This method only works if the file driver writer has made the -driver-specific property list structure a public datatype, which is -often not the case. - -

    - -
    -hid_t fapl = H5Pcreate(H5P_FILE_ACCESS);
    -static H5FD_family_fapl_t fa = {100*1024*1024, H5P_DEFAULT};
    -H5Pset_driver(fapl, H5FD_FAMILY, &fa);
    -hid_t file = H5Fcreate("foo.h5", H5F_ACC_TRUNC, H5P_DEFAULT, fapl);
    -H5Pclose(fapl);
    -
    - -

    -It is also possible to query the file driver information from a file access -property list by calling H5Pget_driver to determine the driver and then -calling a driver-defined query function to obtain the driver information: - -

    - -
    -hid_t driver = H5Pget_driver(fapl);
    -if (H5FD_SEC2==driver) {
    -    /*nothing further to get*/
    -} else if (H5FD_FAMILY==driver) {
    -    hid_t member_fapl;
    -    haddr_t member_size;
    -    H5Pget_fapl_family(fapl, &member_size, &member_fapl);
    -} else if (....) {
    -    ....
    -}
    -
    - - - -

    Performing I/O

    - -

    -The H5Dread and H5Dwrite functions transfer data between -application memory and the file. They both take an optional data transfer -property list which has some general driver-independent properties and -optional driver-defined properties. An application will typically perform I/O -in one of three styles via the H5Dread or H5Dwrite function: - -

    -

    -Like file access properties in the previous section, data transfer properties -can be set using a driver initialization function or a general purpose -function. For example, to set the MPI-IO driver to use independent access for -I/O operations one would say: - -

    - -
    -hid_t dxpl = H5Pcreate(H5P_DATA_XFER);
    -H5Pset_dxpl_mpio(dxpl, H5FD_MPIO_INDEPENDENT);
    -H5Dread(dataset, type, mspace, fspace, buffer, dxpl);
    -H5Pclose(dxpl);
    -
    - -

    -The alternative is to initialize a driver defined C struct and pass it -to the H5Pset_driver function: - -

    - -
    -hid_t dxpl = H5Pcreate(H5P_DATA_XFER);
    -static H5FD_mpio_dxpl_t dx = {H5FD_MPIO_INDEPENDENT};
    -H5Pset_driver(dxpl, H5FD_MPIO, &dx);
    -H5Dread(dataset, type, mspace, fspace, buffer, dxpl);
    -
    - -

    -The transfer property list can be queried in a manner similar to the file -access property list: the driver provides a function (or functions) to return -various information about the transfer property list: - -

    - -
    -hid_t driver = H5Pget_driver(dxpl);
    -if (H5FD_MPIO==driver) {
    -    H5FD_mpio_xfer_t xfer_mode;
    -    H5Pget_dxpl_mpio(dxpl, &xfer_mode);
    -} else {
    -    ....
    -}
    -
    - - - -

    File Driver Interchangeability

    - -

    -The HDF5 specifications describe two things: the mapping of data onto a linear -format address space and the C API which performs the mapping. -However, the mapping of the format address space onto storage intentionally -falls outside the scope of the HDF5 specs. This is a direct result of the fact -that it is not generally possible to store information about how to access -storage inside the storage itself. For instance, given only the file name -`/arborea/1225/work/f%03d' the HDF5 library is unable to tell whether the -name refers to a file on the local file system, a family of files on the local -file system, a file on host `arborea' port 1225, a family of files on a -remote system, etc. - -

    -

    -Two ways which library could figure out where the storage is located are: -storage access information can be provided by the user, or the library can try -all known file access methods. This implementation uses the former method. - -

    -

    -In general, if a file was created with one driver then it isn't possible to -open it with another driver. There are of course exceptions: a file created -with MPIO could probably be opened with the sec2 driver, any file created -by the sec2 driver could be opened as a family of files with one member, -etc. In fact, sometimes a file must not only be opened with the same -driver but also with the same driver properties. The predefined drivers are -written in such a way that specifying the correct driver is sufficient for -opening a file. - -

    - - -

    Implementation of a Driver

    - -

    -A driver is simply a collection of functions and data structures which are -registered with the HDF5 library at runtime. The functions fall into these -categories: - -

    - -
      -
    • Functions which operate on modes - -
    • Functions which operate on files - -
    • Functions which operate on the address space - -
    • Functions which operate on data - -
    • Functions for driver initialization - -
    • Optimization functions - -
    - - - -

    Mode Functions

    - -

    -Some drivers need information about file access and data transfers which are -very specific to the driver. The information is usually implemented as a pair -of pointers to C structs which are allocated and initialized as part of an -HDF5 property list and passed down to various driver functions. There are two -classes of settings: file access modes that describe how to access the file -through the driver, and data transfer modes which are settings that control -I/O operations. Each file opened by a particular driver may have a different -access mode; each dataset I/O request for a particular file may have a -different data transfer mode. - -

    -

    -Since each driver has its own particular requirements for various settings, -each driver is responsible for defining the mode structures that it -needs. Higher layers of the library treat the structures as opaque but must be -able to copy and free them. Thus, the driver provides either the size of the -structure or a pair of function pointers for each of the mode types. - -

    -

    -Example: The family driver needs to know how the format address -space is partitioned and the file access property list to use for the -family members. - -

    - -
    -/* Driver-specific file access properties */
    -typedef struct H5FD_family_fapl_t {
    -    hsize_t     memb_size;      /*size of each member                   */
    -    hid_t       memb_fapl_id;   /*file access property list of each memb*/
    -} H5FD_family_fapl_t;
    -
    -/* Driver specific data transfer properties */
    -typedef struct H5FD_family_dxpl_t {
    -    hid_t       memb_dxpl_id;   /*data xfer property list of each memb  */
    -} H5FD_family_dxpl_t;
    -
    - -

    -In order to copy or free one of these structures the member file access -or data transfer properties must also be copied or freed. This is done -by providing a copy and close function for each structure: - -

    -

    -Example: The file access property list copy and close functions -for the family driver: - -

    - -
    -static void *
    -H5FD_family_fapl_copy(const void *_old_fa)
    -{
    -    const H5FD_family_fapl_t *old_fa = (const H5FD_family_fapl_t*)_old_fa;
    -    H5FD_family_fapl_t *new_fa = malloc(sizeof(H5FD_family_fapl_t));
    -    assert(new_fa);
    -
    -    memcpy(new_fa, old_fa, sizeof(H5FD_family_fapl_t));
    -    new_fa->memb_fapl_id = H5Pcopy(old_fa->memb_fapl_id);
    -    return new_fa;
    -}
    -
    -static herr_t
    -H5FD_family_fapl_free(void *_fa)
    -{
    -    H5FD_family_fapl_t  *fa = (H5FD_family_fapl_t*)_fa;
    -    H5Pclose(fa->memb_fapl_id);
    -    free(fa);
    -    return 0;
    -}
    -
    - -

    -Generally when a file is created or opened the file access properties -for the driver are copied into the file pointer which is returned and -they may be modified from their original value (for instance, the file -family driver modifies the member size property when opening an existing -family). In order to support the H5Fget_access_plist function the -driver must provide a fapl_get callback which creates a copy of -the driver-specific properties based on a particular file. - -

    -

    -Example: The file family driver copies the member size file -access property list into the return value: - -

    - -
    -static void *
    -H5FD_family_fapl_get(H5FD_t *_file)
    -{
    -    H5FD_family_t	*file = (H5FD_family_t*)_file;
    -    H5FD_family_fapl_t	*fa = calloc(1, sizeof(H5FD_family_fapl_t*));
    -
    -    fa->memb_size = file->memb_size;
    -    fa->memb_fapl_id = H5Pcopy(file->memb_fapl_id);
    -    return fa;
    -}
    -
    - - - -

    File Functions

    - -

    -The higher layers of the library expect files to have a name and allow the -file to be accessed in various modes. The driver must be able to create a new -file, replace an existing file, or open an existing file. Opening or creating -a file should return a handle, a pointer to a specialization of the -H5FD_t struct, which allows read-only or read-write access and which -will be passed to the other driver functions as they are -called.(5) - -

    - -
    -typedef struct {
    -    /* Public fields */
    -    H5FD_class_t *cls; /*class data defined below*/
    -
    -    /* Private fields -- driver-defined */
    -
    -} H5FD_t;
    -
    - -

    -Example: The family driver requires handles to the underlying -storage, the size of the members for this particular file (which might be -different than the member size specified in the file access property list if -an existing file family is being opened), the name used to open the file in -case additional members must be created, and the flags to use for creating -those additional members. The eoa member caches the size of the format -address space so the family members don't have to be queried in order to find -it. - -

    - -
    -/* The description of a file belonging to this driver. */
    -typedef struct H5FD_family_t {
    -    H5FD_t      pub;            /*public stuff, must be first           */
    -    hid_t       memb_fapl_id;   /*file access property list for members */
    -    hsize_t     memb_size;      /*maximum size of each member file      */
    -    int         nmembs;         /*number of family members              */
    -    int         amembs;         /*number of member slots allocated      */
    -    H5FD_t      **memb;         /*dynamic array of member pointers      */
    -    haddr_t     eoa;            /*end of allocated addresses            */
    -    char        *name;          /*name generator printf format          */
    -    unsigned    flags;          /*flags for opening additional members  */
    -} H5FD_family_t;
    -
    - -

    -Example: The sec2 driver needs to keep track of the underlying Unix -file descriptor and also the end of format address space and current Unix file -size. It also keeps track of the current file position and last operation -(read, write, or unknown) in order to optimize calls to lseek. The -device and inode fields are defined on Unix in order to uniquely -identify the file and will be discussed below. - -

    - -
    -typedef struct H5FD_sec2_t {
    -    H5FD_t      pub;                    /*public stuff, must be first   */
    -    int         fd;                     /*the unix file                 */
    -    haddr_t     eoa;                    /*end of allocated region       */
    -    haddr_t     eof;                    /*end of file; current file size*/
    -    haddr_t     pos;                    /*current file I/O position     */
    -    int         op;                     /*last operation                */
    -    dev_t       device;                 /*file device number            */
    -    ino_t       inode;                  /*file i-node number            */
    -} H5FD_sec2_t;
    -
    - - - -

    Opening Files

    - -

    -All drivers must define a function for opening/creating a file. This -function should have a prototype which is: - -

    -

    -

    -
    Function: static H5FD_t * open (const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) -
    - -

    -

    -The file name name and file access property list fapl are -the same as were specified in the H5Fcreate or H5Fopen -call. The flags are the same as in those calls also except the -flag H5F_ACC_CREATE is also present if the call was to -H5Fcreate and they are documented in the `H5Fpublic.h' -file. The maxaddr argument is the maximum format address that the -driver should be prepared to handle (the minimum address is always -zero). -

    - -

    -

    -Example: The sec2 driver opens a Unix file with the requested name -and saves information which uniquely identifies the file (the Unix device -number and inode). - -

    - -
    -static H5FD_t *
    -H5FD_sec2_open(const char *name, unsigned flags, hid_t fapl_id/*unused*/,
    -               haddr_t maxaddr)
    -{
    -    unsigned    o_flags;
    -    int         fd;
    -    struct stat sb;
    -    H5FD_sec2_t *file=NULL;
    -
    -    /* Check arguments */
    -    if (!name || !*name) return NULL;
    -    if (0==maxaddr || HADDR_UNDEF==maxaddr) return NULL;
    -    if (ADDR_OVERFLOW(maxaddr)) return NULL;
    -
    -    /* Build the open flags */
    -    o_flags = (H5F_ACC_RDWR & flags) ? O_RDWR : O_RDONLY;
    -    if (H5F_ACC_TRUNC & flags) o_flags |= O_TRUNC;
    -    if (H5F_ACC_CREAT & flags) o_flags |= O_CREAT;
    -    if (H5F_ACC_EXCL & flags) o_flags |= O_EXCL;
    -
    -    /* Open the file */
    -    if ((fd=open(name, o_flags, 0666))<0) return NULL;
    -    if (fstat(fd, &sb)<0) {
    -        close(fd);
    -        return NULL;
    -    }
    -
    -    /* Create the new file struct */
    -    file = calloc(1, sizeof(H5FD_sec2_t));
    -    file->fd = fd;
    -    file->eof = sb.st_size;
    -    file->pos = HADDR_UNDEF;
    -    file->op = OP_UNKNOWN;
    -    file->device = sb.st_dev;
    -    file->inode = sb.st_ino;
    -
    -    return (H5FD_t*)file;
    -}
    -
    - - - -

    Closing Files

    - -

    -Closing a file simply means that all cached data should be flushed to the next -lower layer, the file should be closed at the next lower layer, and all -file-related data structures should be freed. All information needed by the -close function is already present in the file handle. - -

    -

    -

    -
    Function: static herr_t close (H5FD_t *file) -
    - -

    -

    -The file argument is the handle which was returned by the open -function, and the close should free only memory associated with the -driver-specific part of the handle (the public parts will have already been released by HDF5's virtual file layer). -

    - -

    -

    -Example: The sec2 driver just closes the underlying Unix file, -making sure that the actual file size is the same as that known to the -library by writing a zero to the last file position it hasn't been -written by some previous operation (which happens in the same code which -flushes the file contents and is shown below). - -

    - -
    -static herr_t
    -H5FD_sec2_close(H5FD_t *_file)
    -{
    -    H5FD_sec2_t *file = (H5FD_sec2_t*)_file;
    -
    -    if (H5FD_sec2_flush(_file)<0) return -1;
    -    if (close(file->fd)<0) return -1;
    -    free(file);
    -    return 0;
    -}
    -
    - - - -

    File Keys

    - -

    -Occasionally an application will attempt to open a single file more than one -time in order to obtain multiple handles to the file. HDF5 allows the files to -share information(6) but in order to -accomplish this HDF5 must be able to tell when two names refer to the same -file. It does this by associating a driver-defined key with each file opened -by a driver and comparing the key for an open request with the keys for all -other files currently open by the same driver. - -

    -

    -

    -
    Function: const int cmp (const H5FD_t *f1, const H5FD_t *f2) -
    - -

    -

    -The driver may provide a function which compares two files f1 and -f2 belonging to the same driver and returns a negative, positive, or -zero value a la the strcmp function.(7) If this -function is not provided then HDF5 assumes that all calls to the open -callback return unique files regardless of the arguments and it is up to the -application to avoid doing this if that assumption is incorrect. -

    - -

    -

    -Each time a file is opened the library calls the cmp function to -compare that file with all other files currently open by the same driver and -if one of them matches (at most one can match) then the file which was just -opened is closed and the previously opened file is used instead. - -

    -

    -Opening a file twice with incompatible flags will result in failure. For -instance, opening a file with the truncate flag is a two step process which -first opens the file without truncation so keys can be compared, and if no -matching file is found already open then the file is closed and immediately -reopened with the truncation flag set (if a matching file is already open then -the truncating open will fail). - -

    -

    -Example: The sec2 driver uses the Unix device and i-node as the -key. They were initialized when the file was opened. - -

    - -
    -static int
    -H5FD_sec2_cmp(const H5FD_t *_f1, const H5FD_t *_f2)
    -{
    -    const H5FD_sec2_t   *f1 = (const H5FD_sec2_t*)_f1;
    -    const H5FD_sec2_t   *f2 = (const H5FD_sec2_t*)_f2;
    -
    -    if (f1->device < f2->device) return -1;
    -    if (f1->device > f2->device) return 1;
    -
    -    if (f1->inode < f2->inode) return -1;
    -    if (f1->inode > f2->inode) return 1;
    -
    -    return 0;
    -}
    -
    - - - -

    Saving Modes Across Opens

    - -

    -Some drivers may also need to store certain information in the file superblock -in order to be able to reliably open the file at a later date. This is done by -three functions: one to determine how much space will be necessary to store -the information in the superblock, one to encode the information, and one to -decode the information. These functions are optional, but if any one is -defined then the other two must also be defined. - -

    -

    -

    -
    Function: static hsize_t sb_size (H5FD_t *file) -
    -
    Function: static herr_t sb_encode (H5FD_t *file, char *name, unsigned char *buf) -
    -
    Function: static herr_t sb_decode (H5FD_t *file, const char *name, const unsigned char *buf) -
    - -

    -

    -The sb_size function returns the number of bytes necessary to encode -information needed later if the file is reopened. The sb_encode -function encodes information from the file into buffer buf -allocated by the caller. It also writes an 8-character (plus null -termination) into the name argument, which should be a unique -identification for the driver. The sb_decode function looks at -the name - -

    -

    - decodes -data from the buffer buf and updates the file argument with the new information, -advancing *p in the process. -

    - -

    -

    -The part of this which is somewhat tricky is that the file must be readable -before the superblock information is decoded. File access modes fall outside -the scope of the HDF5 file format, but they are placed inside the boot block -for convenience.(8) - -

    -

    -Example: To be written later. - -

    - - -

    Address Space Functions

    - -

    -HDF5 does not assume that a file is a linear address space of bytes. Instead, -the library will call functions to allocate and free portions of the HDF5 -format address space, which in turn map onto functions in the file driver to -allocate and free portions of file address space. The library tells the file -driver how much format address space it wants to allocate and the driver -decides what format address to use and how that format address is mapped onto -the file address space. Usually the format address is chosen so that the file -address can be calculated in constant time for data I/O operations (which are -always specified by format addresses). - -

    - - - -

    Userblock and Superblock

    - -

    -The HDF5 format allows an optional userblock to appear before the actual HDF5 -data in such a way that if the userblock is sucked out of the file and -everything remaining is shifted downward in the file address space, then the -file is still a valid HDF5 file. The userblock size can be zero or any -multiple of two greater than or equal to 512 and the file superblock begins -immediately after the userblock. - -

    -

    -HDF5 allocates space for the userblock and superblock by calling an -allocation function defined below, which must return a chunk of memory at -format address zero on the first call. - -

    - - -

    Allocation of Format Regions

    - -

    -The library makes many types of allocation requests: - -

    -
    - -
    H5FD_MEM_SUPER -
    -An allocation request for the userblock and/or superblock. -
    H5FD_MEM_BTREE -
    -An allocation request for a node of a B-tree. -
    H5FD_MEM_DRAW -
    -An allocation request for the raw data of a dataset. -
    H5FD_MEM_META -
    -An allocation request for the raw data of a dataset which -the user has indicated will be relatively small. -
    H5FD_MEM_GROUP -
    -An allocation request for a group leaf node (internal nodes of the group tree -are allocated as H5MF_BTREE). -
    H5FD_MEM_GHEAP -
    -An allocation request for a global heap collection. Global heaps are used to -store certain types of references such as dataset region references. The set -of all global heap collections can become quite large. -
    H5FD_MEM_LHEAP -
    -An allocation request for a local heap. Local heaps are used to store the -names which are members of a group. The combined size of all local heaps is a -function of the number of object names in the file. -
    H5FD_MEM_OHDR -
    -An allocation request for (part of) an object header. Object headers are -relatively small and include meta information about objects (like the data -space and type of a dataset) and attributes. -
    - -

    -When a chunk of memory is freed the library adds it to a free list and -allocation requests are satisfied from the free list before requesting memory -from the file driver. Each type of allocation request enumerated above has its -own free list, but the file driver can specify that certain object types can -share a free list. It does so by providing an array which maps a request type -to a free list. If any value of the map is H5MF_DEFAULT (zero) then the -object's own free list is used. The special value H5MF_NOLIST indicates -that the library should not attempt to maintain a free list for that -particular object type, instead calling the file driver each time an object of -that type is freed. - -

    -

    -Mappings predefined in the `H5FDpublic.h' file are: -

    - -
    H5FD_FLMAP_SINGLE -
    -All memory usage types are mapped to a single free list. -
    H5FD_FLMAP_DICHOTOMY -
    -Memory usage is segregated into meta data and raw data for the purposes of -memory management. -
    H5FD_FLMAP_DEFAULT -
    -Each memory usage type has its own free list. -
    - -

    -Example: To make a map that manages object headers on one free list -and everything else on another free list one might initialize the map with the -following code: (the use of H5FD_MEM_SUPER is arbitrary) - -

    - -
    -H5FD_mem_t mt, map[H5FD_MEM_NTYPES];
    -
    -for (mt=0; mt<H5FD_MEM_NTYPES; mt++) {
    -    map[mt] = (H5FD_MEM_OHDR==mt) ? mt : H5FD_MEM_SUPER;
    -}
    -
    - -

    -If an allocation request cannot be satisfied from the free list then one of -two things happen. If the driver defines an allocation callback then it is -used to allocate space; otherwise new memory is allocated from the end of the -format address space by incrementing the end-of-address marker. - -

    -

    -

    -
    Function: static haddr_t alloc (H5FD_t *file, H5MF_type_t type, hsize_t size) -
    - -

    -

    -The file argument is the file from which space is to be allocated, -type is the type of memory being requested (from the list above) without -being mapped according to the freelist map and size is the number of -bytes being requested. The library is allowed to allocate large chunks of -storage and manage them in a layer above the file driver (although the current -library doesn't do that). The allocation function should return a format -address for the first byte allocated. The allocated region extends from that -address for size bytes. If the request cannot be honored then the -undefined address value is returned (HADDR_UNDEF). The first call to -this function for a file which has never had memory allocated must -return a format address of zero or HADDR_UNDEF since this is how the -library allocates space for the userblock and/or superblock. -

    - -

    - -

    -Example: To be written later. - -

    - - -

    Freeing Format Regions

    - -

    -When the library is finished using a certain region of the format address -space it will return the space to the free list according to the type of -memory being freed and the free list map described above. If the free list has -been disabled for a particular memory usage type (according to the free list -map) and the driver defines a free callback then it will be -invoked. The free callback is also invoked for all entries on the free -list when the file is closed. - -

    -

    -

    -
    Function: static herr_t free (H5FD_t *file, H5MF_type_t type, haddr_t addr, hsize_t size) -
    - -

    -

    -The file argument is the file for which space is being freed; type -is the type of object being freed (from the list above) without being mapped -according to the freelist map; addr is the first format address to free; -and size is the size in bytes of the region being freed. The region -being freed may refer to just part of the region originally allocated and/or -may cross allocation boundaries provided all regions being freed have the same -usage type. However, the library will never attempt to free regions which have -already been freed or which have never been allocated. -

    - -

    -

    -A driver may choose to not define the free function, in which case -format addresses will be leaked. This isn't normally a huge problem since the -library contains a simple free list of its own and freeing parts of the format -address space is not a common occurrence. - -

    -

    -Example: To be written later. - -

    - - -

    Querying Address Range

    - -

    -Each file driver must have some mechanism for setting and querying the end of -address, or EOA, marker. The EOA marker is the first format address -after the last format address ever allocated. If the last part of the -allocated address range is freed then the driver may optionally decrease the -eoa marker. - -

    -

    -

    -
    Function: static haddr_t get_eoa (H5FD_t *file) -
    - -

    -

    -This function returns the current value of the EOA marker for the specified -file. -

    - -

    -

    -Example: The sec2 driver just returns the current eoa marker value -which is cached in the file structure: - -

    - -
    -static haddr_t
    -H5FD_sec2_get_eoa(H5FD_t *_file)
    -{
    -    H5FD_sec2_t *file = (H5FD_sec2_t*)_file;
    -    return file->eoa;
    -}
    -
    - -

    -The eoa marker is initially zero when a file is opened and the library may set -it to some other value shortly after the file is opened (after the superblock -is read and the saved eoa marker is determined) or when allocating additional -memory in the absence of an alloc callback (described above). - -

    -

    -Example: The sec2 driver simply caches the eoa marker in the file -structure and does not extend the underlying Unix file. When the file is -flushed or closed then the Unix file size is extended to match the eoa marker. - -

    - -
    -static herr_t
    -H5FD_sec2_set_eoa(H5FD_t *_file, haddr_t addr)
    -{
    -    H5FD_sec2_t *file = (H5FD_sec2_t*)_file;
    -    file->eoa = addr;
    -    return 0;
    -}
    -
    - - - -

    Data Functions

    - -

    -These functions operate on data, transferring a region of the format address -space between memory and files. - -

    - - - -

    Contiguous I/O Functions

    - -

    -A driver must specify two functions to transfer data from the library to the -file and vice versa. - -

    -

    -

    -
    Function: static herr_t read (H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, void *buf) -
    -
    Function: static herr_t write (H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, const void *buf) -
    - -

    -

    -The read function reads data from file file beginning at address -addr and continuing for size bytes into the buffer buf -supplied by the caller. The write function transfers data in the -opposite direction. Both functions take a data transfer property list -dxpl which indicates the fine points of how the data is to be -transferred and which comes directly from the H5Dread or -H5Dwrite function. Both functions receive type of -data being written, which may allow a driver to tune it's behavior for -different kinds of data. -

    - -

    -

    -Both functions should return a negative value if they fail to transfer the -requested data, or non-negative if they succeed. The library will never -attempt to read from unallocated regions of the format address space. - -

    -

    -Example: The sec2 driver just makes system calls. It tries not to -call lseek if the current operation is the same as the previous -operation and the file position is correct. It also fills the output buffer -with zeros when reading between the current EOF and EOA markers and restarts -system calls which were interrupted. - -

    - -
    -static herr_t
    -H5FD_sec2_read(H5FD_t *_file, H5FD_mem_t type/*unused*/, hid_t dxpl_id/*unused*/,
    -        haddr_t addr, hsize_t size, void *buf/*out*/)
    -{
    -    H5FD_sec2_t         *file = (H5FD_sec2_t*)_file;
    -    ssize_t             nbytes;
    -
    -    assert(file && file->pub.cls);
    -    assert(buf);
    -
    -    /* Check for overflow conditions */
    -    if (REGION_OVERFLOW(addr, size)) return -1;
    -    if (addr+size>file->eoa) return -1;
    -
    -    /* Seek to the correct location */
    -    if ((addr!=file->pos || OP_READ!=file->op) &&
    -        file_seek(file->fd, (file_offset_t)addr, SEEK_SET)<0) {
    -        file->pos = HADDR_UNDEF;
    -        file->op = OP_UNKNOWN;
    -        return -1;
    -    }
    -
    -    /*
    -     * Read data, being careful of interrupted system calls, partial results,
    -     * and the end of the file.
    -     */
    -    while (size>0) {
    -        do nbytes = read(file->fd, buf, size);
    -        while (-1==nbytes && EINTR==errno);
    -        if (-1==nbytes) {
    -            /* error */
    -            file->pos = HADDR_UNDEF;
    -            file->op = OP_UNKNOWN;
    -            return -1;
    -        }
    -        if (0==nbytes) {
    -            /* end of file but not end of format address space */
    -            memset(buf, 0, size);
    -            size = 0;
    -        }
    -        assert(nbytes>=0);
    -        assert((hsize_t)nbytes<=size);
    -        size -= (hsize_t)nbytes;
    -        addr += (haddr_t)nbytes;
    -        buf = (char*)buf + nbytes;
    -    }
    -
    -    /* Update current position */
    -    file->pos = addr;
    -    file->op = OP_READ;
    -    return 0;
    -}
    -
    - -

    -Example: The sec2 write callback is similar except it updates -the file EOF marker when extending the file. - -

    - - -

    Flushing Cached Data

    - -

    -Some drivers may desire to cache data in memory in order to make larger I/O -requests to the underlying file and thus improving bandwidth. Such drivers -should register a cache flushing function so that the library can insure that -data has been flushed out of the drivers in response to the application -calling H5Fflush. - -

    -

    -

    -
    Function: static herr_t flush (H5FD_t *file) -
    - -

    -

    -Flush all data for file file to storage. -

    - -

    -

    -Example: The sec2 driver doesn't cache any data but it also doesn't -extend the Unix file as aggressively as it should. Therefore, when finalizing a -file it should write a zero to the last byte of the allocated region so that -when reopening the file later the EOF marker will be at least as large as the -EOA marker saved in the superblock (otherwise HDF5 will refuse to open the -file, claiming that the data appears to be truncated). - -

    - -
    -static herr_t
    -H5FD_sec2_flush(H5FD_t *_file)
    -{
    -    H5FD_sec2_t *file = (H5FD_sec2_t*)_file;
    -
    -    if (file->eoa>file->eof) {
    -        if (-1==file_seek(file->fd, file->eoa-1, SEEK_SET)) return -1;
    -        if (write(file->fd, "", 1)!=1) return -1;
    -        file->eof = file->eoa;
    -        file->pos = file->eoa;
    -        file->op = OP_WRITE;
    -    }
    -
    -    return 0;
    -}
    -
    - - - -

    Optimization Functions

    - -

    -The library is capable of performing several generic optimizations on I/O, but -these types of optimizations may not be appropriate for a given VFL driver. -

    - -

    -Each driver may provide a query function to allow the library to query whether -to enable these optimizations. If a driver lacks a query function, the library -will disable all types of optimizations which can be queried. -

    - -

    -

    -
    Function: static herr_t query (const H5FD_t *file, unsigned long *flags) -
    -

    -

    -This function is called by the library to query which optimizations to enable -for I/O to this driver. These are the flags which are currently defined: - -

      -
      -
      H5FD_FEAT_AGGREGATE_METADATA (0x00000001) -
      Defining the H5FD_FEAT_AGGREGATE_METADATA for a VFL driver means that -the library will attempt to allocate a larger block for metadata and -then sub-allocate each metadata request from that larger block. -
      H5FD_FEAT_ACCUMULATE_METADATA (0x00000002) -
      Defining the H5FD_FEAT_ACCUMULATE_METADATA for a VFL driver means that -the library will attempt to cache metadata as it is written to the file -and build up a larger block of metadata to eventually pass to the VFL -'write' routine. -
      H5FD_FEAT_DATA_SIEVE (0x00000004) -
      Defining the H5FD_FEAT_DATA_SIEVE for a VFL driver means that -the library will attempt to cache raw data as it is read from/written to -a file in a "data sieve" buffer. See Rajeev Thakur's papers: -
        -
        -
        http://www.mcs.anl.gov/~thakur/papers/romio-coll.ps.gz -
        http://www.mcs.anl.gov/~thakur/papers/mpio-high-perf.ps.gz -
        -
      -
      -
    -

    - -
    -

    - -

    Registration of a Driver

    - -

    -Before a driver can be used the HDF5 library needs to be told of its -existence. This is done by registering the driver, which results in a driver -identification number. Instead of passing many arguments to the registration -function, the driver information is entered into a structure and the address -of the structure is passed to the registration function where it is -copied. This allows the HDF5 API to be extended while providing backward -compatibility at the source level. - -

    -

    -

    -
    Function: hid_t H5FDregister (H5FD_class_t *cls) -
    - -

    -

    -The driver described by struct cls is registered with the library and an -ID number for the driver is returned. -

    - -

    -

    -The H5FD_class_t type is a struct with the following fields: - -

    -
    - -
    const char *name -
    -A pointer to a constant, null-terminated driver name to be used for debugging -purposes. -
    size_t fapl_size -
    -The size in bytes of the file access mode structure or zero if the driver -supplies a copy function or doesn't define the structure. -
    void *(*fapl_copy)(const void *fapl) -
    -An optional function which copies a driver-defined file access mode structure. -This field takes precedence over fm_size when both are defined. -
    void (*fapl_free)(void *fapl) -
    -An optional function to free the driver-defined file access mode structure. If -null, then the library calls the C free function to free the -structure. -
    size_t dxpl_size -
    -The size in bytes of the data transfer mode structure or zero if the driver -supplies a copy function or doesn't define the structure. -
    void *(*dxpl_copy)(const void *dxpl) -
    -An optional function which copies a driver-defined data transfer mode -structure. This field takes precedence over xm_size when both are -defined. -
    void (*dxpl_free)(void *dxpl) -
    -An optional function to free the driver-defined data transfer mode -structure. If null, then the library calls the C free function to -free the structure. -
    H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, haddr_t maxaddr) -
    -The function which opens or creates a new file. -
    herr_t (*close)(H5FD_t *file) -
    -The function which ends access to a file. -
    int (*cmp)(const H5FD_t *f1, const H5FD_t *f2) -
    -An optional function to determine whether two open files have the same key. If -this function is not present then the library assumes that two files will -never be the same. -
    int (*query)(const H5FD_t *f, unsigned long *flags) -
    -An optional function to determine which library optimizations a driver can -support. -
    haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hsize_t size) -
    -An optional function to allocate space in the file. -
    herr_t (*free)(H5FD_t *file, H5FD_mem_t type, haddr_t addr, hsize_t size) -
    -An optional function to free space in the file. -
    haddr_t (*get_eoa)(H5FD_t *file) -
    -A function to query how much of the format address space has been allocated. -
    herr_t (*set_eoa)(H5FD_t *file, haddr_t) -
    -A function to set the end of address space. -
    haddr_t (*get_eof)(H5FD_t *file) -
    -A function to return the current end-of-file marker value. -
    herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, void *buffer) -
    -A function to read data from a file. -
    herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, haddr_t addr, hsize_t size, const void *buffer) -
    -A function to write data to a file. -
    herr_t (*flush)(H5FD_t *file) -
    -A function which flushes cached data to the file. -
    H5FD_mem_t fl_map[H5FD_MEM_NTYPES] -
    -An array which maps a file allocation request type to a free list. -
    - -

    -Example: The sec2 driver would be registered as: - -

    - -
    -static const H5FD_class_t H5FD_sec2_g = {
    -    "sec2",                                     /*name                  */
    -    MAXADDR,                                    /*maxaddr               */
    -    NULL,                                       /*sb_size               */
    -    NULL,                                       /*sb_encode             */
    -    NULL,                                       /*sb_decode             */
    -    0,                                          /*fapl_size             */
    -    NULL,                                       /*fapl_get              */
    -    NULL,                                       /*fapl_copy             */
    -    NULL,                                       /*fapl_free             */
    -    0,                                          /*dxpl_size             */
    -    NULL,                                       /*dxpl_copy             */
    -    NULL,                                       /*dxpl_free             */
    -    H5FD_sec2_open,                             /*open                  */
    -    H5FD_sec2_close,                            /*close                 */
    -    H5FD_sec2_cmp,                              /*cmp                   */
    -    H5FD_sec2_query,                            /*query                 */
    -    NULL,                                       /*alloc                 */
    -    NULL,                                       /*free                  */
    -    H5FD_sec2_get_eoa,                          /*get_eoa               */
    -    H5FD_sec2_set_eoa,                          /*set_eoa               */
    -    H5FD_sec2_get_eof,                          /*get_eof               */
    -    H5FD_sec2_read,                             /*read                  */
    -    H5FD_sec2_write,                            /*write                 */
    -    H5FD_sec2_flush,                            /*flush                 */
    -    H5FD_FLMAP_SINGLE,                          /*fl_map                */
    -};
    -
    -hid_t
    -H5FD_sec2_init(void)
    -{
    -    if (!H5FD_SEC2_g) {
    -        H5FD_SEC2_g = H5FDregister(&H5FD_sec2_g);
    -    }
    -    return H5FD_SEC2_g;
    -}
    -
    - -

    -A driver can be removed from the library by unregistering it - -

    -

    -

    -
    Function: herr_t H5Dunregister (hid_t driver) -
    -Where driver is the ID number returned when the driver was registered. -
    - -

    -

    -Unregistering a driver makes it unusable for creating new file access or data -transfer property lists but doesn't affect any property lists or files that -already use that driver. - -

    - - - - -

    Programming Note -for C++ Developers Using C Functions

    - -

    If a C routine that takes a function pointer as an argument is -called from within C++ code, the C routine should be returned from -normally.

    - -

    Examples of this kind of routine include callbacks such as -H5Pset_elink_cb and H5Pset_type_conv_cb -and functions such as H5Tconvert and -H5Ewalk2.

    - -

    Exiting the routine in its normal fashion allows the HDF5 C -Library to clean up its work properly. In other words, if the C++ -application jumps out of the routine back to the C++ -“catch” statement, the library is not given the -opportunity to close any temporary data structures that were set -up when the routine was called. The C++ application should save -some state as the routine is started so that any problem that -occurs might be diagnosed.

    - - - - - - - -

    Querying Driver Information

    - -

    -

    -
    Function: void * H5Pget_driver_data (hid_t fapl) -
    -
    Function: void * H5Pget_driver_data (hid_t fxpl) -
    - -

    -

    -This function is intended to be used by driver functions, not applications. -It returns a pointer directly into the file access property list -fapl which is a copy of the driver's file access mode originally -provided to the H5Pset_driver function. If its argument is a data -transfer property list fxpl then it returns a pointer to the -driver-specific data transfer information instead. -

    - -

    - - - -

    Miscellaneous

    - -

    -The various private H5F_low_* functions will be replaced by public -H5FD* functions so they can be called from drivers. - -

    -

    -All private functions H5F_addr_* which operate on addresses will be -renamed as public functions by removing the first underscore so they can be -called by drivers. - -

    -

    -The haddr_t address data type will be passed by value throughout the -library. The original intent was that this type would eventually be a union of -file address types for the various drivers and may become quite large, but -that was back when drivers were part of HDF5. It will become an alias for an -unsigned integer type (32 or 64 bits depending on how the library was -configured). - -

    -

    -The various H5F*.c driver files will be renamed H5FD*.c and each -will have a corresponding header file. All driver functions except the -initializer and API will be declared static. - -

    -

    -This documentation didn't cover optimization functions which would be useful -to drivers like MPI-IO. Some drivers may be able to perform data pipeline -operations more efficiently than HDF5 and need to be given a chance to -override those parts of the pipeline. The pipeline would be designed to call -various H5FD optimization functions at various points which return one of -three values: the operation is not implemented by the driver, the operation is -implemented but failed in a non-recoverable manner, the operation is -implemented and succeeded. - -

    -

    -Various parts of HDF5 check the only the top-level file driver and do -something special if it is the MPI-IO driver. However, we might want to be -able to put the MPI-IO driver under other drivers such as the raw part of a -split driver or under a debug driver whose sole purpose is to accumulate -statistics as it passes all requests through to the MPI-IO driver. Therefore -we will probably need a function which takes a format address and or object -type and returns the driver which would have been used at the lowest level to -process the request. - -

    - -


    -

    Footnotes

    -

    (1)

    -

    The driver name is by convention and might -not apply to drivers which are not distributed with HDF5. -

    (2)

    -

    The access method also indicates how to translate -the storage name to a storage server such as a file, network protocol, or -memory. -

    (3)

    -

    The term -"file access property list" is a misnomer since storage isn't -required to be a file. -

    (4)

    -

    This -function is overloaded to operate on data transfer property lists also, as -described below. -

    (5)

    -

    Read-only access is only appropriate when opening an existing -file. -

    (6)

    -

    For instance, writing data to one handle will cause -the data to be immediately visible on the other handle. -

    (7)

    -

    The ordering is -arbitrary as long as it's consistent within a particular file driver. -

    (8)

    -

    File access modes do not describe data, but rather -describe how the HDF5 format address space is mapped to the underlying -file(s). Thus, in general the mapping must be known before the file superblock -can be read. However, the user usually knows enough about the mapping for the -superblock to be readable and once the superblock is read the library can fill -in the missing parts of the mapping. -


    - - - - - diff --git a/doxygen/examples/h5_attribute.c b/doxygen/examples/h5_attribute.c index 6d3523d5b9e..c8144c63913 100644 --- a/doxygen/examples/h5_attribute.c +++ b/doxygen/examples/h5_attribute.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/doxygen/examples/h5_extlink.c b/doxygen/examples/h5_extlink.c index e1f02cf4cfd..a35172059f8 100644 --- a/doxygen/examples/h5_extlink.c +++ b/doxygen/examples/h5_extlink.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/doxygen/examples/tables/predefinedDatatypes.dox b/doxygen/examples/tables/predefinedDatatypes.dox index 6cf044af5d4..f73382ab865 100644 --- a/doxygen/examples/tables/predefinedDatatypes.dox +++ b/doxygen/examples/tables/predefinedDatatypes.dox @@ -35,6 +35,41 @@ //! [predefined_ieee_datatypes_table] * * +//! [predefined_complex_datatypes_table] + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    Predefined Complex Number Datatypes
    DatatypeDescription
    #H5T_COMPLEX_IEEE_F16BEComplex number of 2 16-bit big-endian IEEE floating point numbers
    #H5T_COMPLEX_IEEE_F16LEComplex number of 2 16-bit little-endian IEEE floating point numbers
    #H5T_COMPLEX_IEEE_F32BEComplex number of 2 32-bit big-endian IEEE floating point numbers
    #H5T_COMPLEX_IEEE_F32LEComplex number of 2 32-bit little-endian IEEE floating point numbers
    #H5T_COMPLEX_IEEE_F64BEComplex number of 2 64-bit big-endian IEEE floating point numbers
    #H5T_COMPLEX_IEEE_F64LEComplex number of 2 64-bit little-endian IEEE floating point numbers
    +//! [predefined_complex_datatypes_table] + * + * //! [predefined_std_datatypes_table] @@ -489,6 +524,18 @@ + + + + + + + + + + + + diff --git a/doxygen/hdf5_footer.html b/doxygen/hdf5_footer.html index 520f3f57291..6023e109739 100644 --- a/doxygen/hdf5_footer.html +++ b/doxygen/hdf5_footer.html @@ -3,18 +3,15 @@ + diff --git a/doxygen/hdf5_header.html b/doxygen/hdf5_header.html index 11f1f187765..7429b307321 100644 --- a/doxygen/hdf5_header.html +++ b/doxygen/hdf5_header.html @@ -8,7 +8,11 @@ $projectname: $title$title + + + + $treeview diff --git a/doxygen/hdf5doxy_layout.xml b/doxygen/hdf5doxy_layout.xml index 8bd7aaf4c08..0299094947e 100644 --- a/doxygen/hdf5doxy_layout.xml +++ b/doxygen/hdf5doxy_layout.xml @@ -14,6 +14,7 @@ + diff --git a/doxygen/img/Chunk_f1.gif b/doxygen/img/Chunk_f1.gif new file mode 100644 index 00000000000..d73201a1b2e Binary files /dev/null and b/doxygen/img/Chunk_f1.gif differ diff --git a/doxygen/img/Chunk_f2.gif b/doxygen/img/Chunk_f2.gif new file mode 100644 index 00000000000..68f94337d86 Binary files /dev/null and b/doxygen/img/Chunk_f2.gif differ diff --git a/doxygen/img/Chunk_f3.gif b/doxygen/img/Chunk_f3.gif new file mode 100644 index 00000000000..e6e8457869c Binary files /dev/null and b/doxygen/img/Chunk_f3.gif differ diff --git a/doxygen/img/Chunk_f4.gif b/doxygen/img/Chunk_f4.gif new file mode 100644 index 00000000000..76f099459fa Binary files /dev/null and b/doxygen/img/Chunk_f4.gif differ diff --git a/doxygen/img/Chunk_f5.gif b/doxygen/img/Chunk_f5.gif new file mode 100644 index 00000000000..3b12174a479 Binary files /dev/null and b/doxygen/img/Chunk_f5.gif differ diff --git a/doxygen/img/Chunk_f6.gif b/doxygen/img/Chunk_f6.gif new file mode 100644 index 00000000000..616946db192 Binary files /dev/null and b/doxygen/img/Chunk_f6.gif differ diff --git a/doxygen/img/DOChunks_fig1.png b/doxygen/img/DOChunks_fig1.png new file mode 100644 index 00000000000..8ef99f6888d Binary files /dev/null and b/doxygen/img/DOChunks_fig1.png differ diff --git a/doxygen/img/DOChunks_fig2.png b/doxygen/img/DOChunks_fig2.png new file mode 100644 index 00000000000..d2d4ee5e223 Binary files /dev/null and b/doxygen/img/DOChunks_fig2.png differ diff --git a/doxygen/img/chunking1and2.png b/doxygen/img/chunking1and2.png new file mode 100644 index 00000000000..d0828675a3b Binary files /dev/null and b/doxygen/img/chunking1and2.png differ diff --git a/doxygen/img/chunking3and4.png b/doxygen/img/chunking3and4.png new file mode 100644 index 00000000000..b17c7bacb64 Binary files /dev/null and b/doxygen/img/chunking3and4.png differ diff --git a/doxygen/img/chunking5.png b/doxygen/img/chunking5.png new file mode 100644 index 00000000000..130a85ecce1 Binary files /dev/null and b/doxygen/img/chunking5.png differ diff --git a/doxygen/img/chunking6.png b/doxygen/img/chunking6.png new file mode 100644 index 00000000000..495d55f4aed Binary files /dev/null and b/doxygen/img/chunking6.png differ diff --git a/doxygen/img/chunking7.png b/doxygen/img/chunking7.png new file mode 100644 index 00000000000..ce73cf82553 Binary files /dev/null and b/doxygen/img/chunking7.png differ diff --git a/doxygen/img/chunking8.png b/doxygen/img/chunking8.png new file mode 100644 index 00000000000..f21a46f4d9b Binary files /dev/null and b/doxygen/img/chunking8.png differ diff --git a/fortran/Makefile.am b/fortran/Makefile.am index 631d9edc888..9d2c8c7e395 100644 --- a/fortran/Makefile.am +++ b/fortran/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/fortran/src/CMakeLists.txt b/fortran/src/CMakeLists.txt index c94abaa6c53..dc8a4b6c773 100644 --- a/fortran/src/CMakeLists.txt +++ b/fortran/src/CMakeLists.txt @@ -133,7 +133,6 @@ add_custom_command (TARGET H5match_types POST_BUILD BYPRODUCTS ${HDF5_F90_BINARY_DIR}/H5f90i_gen.h ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR} - DEPENDS H5match_types ) if (BUILD_STATIC_LIBS) @@ -144,7 +143,6 @@ if (BUILD_STATIC_LIBS) COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90 ${HDF5_F90_BINARY_DIR}/static/H5fortran_types.F90 WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}/static - DEPENDS H5_buildiface H5match_types ${HDF5_F90_BINARY_DIR}/H5f90i_gen.h ) set_source_files_properties (${HDF5_F90_BINARY_DIR}/static/H5f90i_gen.h PROPERTIES GENERATED TRUE) set_source_files_properties (${HDF5_F90_BINARY_DIR}/static/H5fortran_types.F90 PROPERTIES GENERATED TRUE) @@ -157,7 +155,6 @@ if (BUILD_SHARED_LIBS) COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${HDF5_F90_BINARY_DIR}/H5fortran_types.F90 ${HDF5_F90_BINARY_DIR}/shared/H5fortran_types.F90 WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}/shared - DEPENDS H5_buildiface H5match_types ${HDF5_F90_BINARY_DIR}/H5f90i_gen.h ) set_source_files_properties (${HDF5_F90_BINARY_DIR}/shared/H5f90i_gen.h PROPERTIES GENERATED TRUE) set_source_files_properties (${HDF5_F90_BINARY_DIR}/shared/H5fortran_types.F90 PROPERTIES GENERATED TRUE) @@ -286,7 +283,6 @@ add_custom_command (TARGET H5_buildiface POST_BUILD BYPRODUCTS ${HDF5_F90_BINARY_DIR}/H5_gen.F90 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR} - DEPENDS H5_buildiface ${f90_F_GEN_SOURCES} COMMENT "Generating the H5_gen.F90 file" ) if (BUILD_STATIC_LIBS) @@ -295,7 +291,6 @@ if (BUILD_STATIC_LIBS) COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${HDF5_F90_BINARY_DIR}/H5_gen.F90 ${HDF5_F90_BINARY_DIR}/static/H5_gen.F90 WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}/static - DEPENDS H5_buildiface ${HDF5_F90_BINARY_DIR}/H5_gen.F90 COMMENT "Generating the H5_gen.F90 file" ) add_custom_target (H5gen ALL @@ -310,7 +305,6 @@ if (BUILD_SHARED_LIBS) COMMAND ${CMAKE_COMMAND} ARGS -E copy_if_different ${HDF5_F90_BINARY_DIR}/H5_gen.F90 ${HDF5_F90_BINARY_DIR}/shared/H5_gen.F90 WORKING_DIRECTORY ${HDF5_F90_BINARY_DIR}/shared - DEPENDS ${HDF5_F90_BINARY_DIR}/H5_gen.F90 COMMENT "Generating the H5_gen.F90 shared file" ) add_custom_target (H5genSH ALL diff --git a/fortran/src/H5Af.c b/fortran/src/H5Af.c index 364d2c56eda..7ad1ee33a49 100644 --- a/fortran/src/H5Af.c +++ b/fortran/src/H5Af.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Aff.F90 b/fortran/src/H5Aff.F90 index c2de9853f20..bb51c34d47e 100644 --- a/fortran/src/H5Aff.F90 +++ b/fortran/src/H5Aff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Df.c b/fortran/src/H5Df.c index fdaba9f73ca..9d978cde927 100644 --- a/fortran/src/H5Df.c +++ b/fortran/src/H5Df.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Dff.F90 b/fortran/src/H5Dff.F90 index 5d6ff524bb2..da7efd7a98e 100644 --- a/fortran/src/H5Dff.F90 +++ b/fortran/src/H5Dff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5ESff.F90 b/fortran/src/H5ESff.F90 index 76e84881e50..28676b52d45 100644 --- a/fortran/src/H5ESff.F90 +++ b/fortran/src/H5ESff.F90 @@ -12,7 +12,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Ef.c b/fortran/src/H5Ef.c index 316c9ad9a5d..f5faa56ddbf 100644 --- a/fortran/src/H5Ef.c +++ b/fortran/src/H5Ef.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Eff.F90 b/fortran/src/H5Eff.F90 index 20f45473a3b..50f23f175b7 100644 --- a/fortran/src/H5Eff.F90 +++ b/fortran/src/H5Eff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Ff.c b/fortran/src/H5Ff.c index 4b56ccaae9f..1e53b9b715e 100644 --- a/fortran/src/H5Ff.c +++ b/fortran/src/H5Ff.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Fff.F90 b/fortran/src/H5Fff.F90 index dbd1c809bd5..7051e95bec8 100644 --- a/fortran/src/H5Fff.F90 +++ b/fortran/src/H5Fff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Gf.c b/fortran/src/H5Gf.c index 8e4bae3d7be..b6615366fb3 100644 --- a/fortran/src/H5Gf.c +++ b/fortran/src/H5Gf.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Gff.F90 b/fortran/src/H5Gff.F90 index 8f805ab0f61..598ff2fff5e 100644 --- a/fortran/src/H5Gff.F90 +++ b/fortran/src/H5Gff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5If.c b/fortran/src/H5If.c index 7486ff5fcfd..1a6a599c65b 100644 --- a/fortran/src/H5If.c +++ b/fortran/src/H5If.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Iff.F90 b/fortran/src/H5Iff.F90 index 7c449eaa8be..7e9be6a04c6 100644 --- a/fortran/src/H5Iff.F90 +++ b/fortran/src/H5Iff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Lf.c b/fortran/src/H5Lf.c index 5fb5a3425fb..c2e0f17b7d2 100644 --- a/fortran/src/H5Lf.c +++ b/fortran/src/H5Lf.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Lff.F90 b/fortran/src/H5Lff.F90 index 50a605a67db..5945eb3985a 100644 --- a/fortran/src/H5Lff.F90 +++ b/fortran/src/H5Lff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Of.c b/fortran/src/H5Of.c index 393f505fdb1..2085e49a8ae 100644 --- a/fortran/src/H5Of.c +++ b/fortran/src/H5Of.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Off.F90 b/fortran/src/H5Off.F90 index 9c8b09141b8..a149806857a 100644 --- a/fortran/src/H5Off.F90 +++ b/fortran/src/H5Off.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Pf.c b/fortran/src/H5Pf.c index 40e9c0fb9e3..079d0277a43 100644 --- a/fortran/src/H5Pf.c +++ b/fortran/src/H5Pf.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Pff.F90 b/fortran/src/H5Pff.F90 index f5e50c90383..7e73ac2255a 100644 --- a/fortran/src/H5Pff.F90 +++ b/fortran/src/H5Pff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5Rf.c b/fortran/src/H5Rf.c index d9ef5d06f71..108591d23e4 100644 --- a/fortran/src/H5Rf.c +++ b/fortran/src/H5Rf.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Rff.F90 b/fortran/src/H5Rff.F90 index cad9d3c8a0e..7e5d8468f54 100644 --- a/fortran/src/H5Rff.F90 +++ b/fortran/src/H5Rff.F90 @@ -24,7 +24,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -856,13 +856,13 @@ INTEGER(C_INT) FUNCTION H5Requal(ref1_ptr, ref2_ptr) & END FUNCTION H5Requal END INTERFACE - c_equal = INT(H5Requal(ref1_ptr, ref2_ptr)) + c_equal = INT(H5Requal(ref1_ptr, ref2_ptr), C_INT) hdferr = 0 equal = .FALSE. - IF(c_equal .EQ. 1)THEN + IF(c_equal .EQ. 1_C_INT)THEN equal = .TRUE. - ELSE IF(c_equal .LT. 0)THEN + ELSE IF(c_equal .LT. 0_C_INT)THEN hdferr = -1 ENDIF diff --git a/fortran/src/H5Sf.c b/fortran/src/H5Sf.c index 22130fc9bd8..73cae480bfb 100644 --- a/fortran/src/H5Sf.c +++ b/fortran/src/H5Sf.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Sff.F90 b/fortran/src/H5Sff.F90 index 3c301c2f462..0c20fe1c1a9 100644 --- a/fortran/src/H5Sff.F90 +++ b/fortran/src/H5Sff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -893,6 +893,10 @@ END SUBROUTINE h5sset_extent_none_f !! \param operator Flag, valid values are: !! \li H5S_SELECT_SET_F !! \li H5S_SELECT_OR_F +!! \li H5S_SELECT_AND_F +!! \li H5S_SELECT_XOR_F +!! \li H5S_SELECT_NOTB_F +!! \li H5S_SELECT_NOTA_F !! \param start Array with hyperslab offsets, \Bold{0-based indices}. !! \param count Number of blocks included in the hyperslab. !! \param hdferr \fortran_error @@ -1000,8 +1004,6 @@ END SUBROUTINE h5sselect_hyperslab_f ! H5S_SELECT_XOR_F ! H5S_SELECT_NOTB_F ! H5S_SELECT_NOTA_F -! H5S_SELECT_APPEND_F -! H5S_SELECT_PREPEND_F ! start - array with hyperslab offsets ! count - number of blocks included in the ! hyperslab diff --git a/fortran/src/H5Tf.c b/fortran/src/H5Tf.c index 393873e110b..f6992f91712 100644 --- a/fortran/src/H5Tf.c +++ b/fortran/src/H5Tf.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -212,11 +212,12 @@ h5tequal_c(hid_t_f *type1_id, hid_t_f *type2_id, int_f *c_flag) * H5T_STRING_F (3) * H5T_BITFIELD_F (4) * H5T_OPAQUE_F (5) - * H5T_COMPOUNDF (6) + * H5T_COMPOUND_F (6) * H5T_REFERENCE_F (7) * H5T_ENUM_F (8) * H5T_VLEN_F (9) * H5T_ARRAY_F (10) + * H5T_COMPLEX_F (11) * RETURNS * 0 on success, -1 on failure * SOURCE @@ -239,17 +240,7 @@ h5tget_class_c(hid_t_f *type_id, int_f *classtype) return ret_value; } *classtype = c_classtype; - /* - if (c_classtype == H5T_INTEGER) *classtype = H5T_INTEGER_F; - if (c_classtype == H5T_FLOAT) *classtype = H5T_FLOAT_F; - if (c_classtype == H5T_TIME) *classtype = H5T_TIME_F; - if (c_classtype == H5T_STRING) *classtype = H5T_STRING_F; - if (c_classtype == H5T_BITFIELD) *classtype = H5T_BITFIELD_F; - if (c_classtype == H5T_OPAQUE) *classtype = H5T_OPAQUE_F; - if (c_classtype == H5T_COMPOUND) *classtype = H5T_COMPOUND_F; - if (c_classtype == H5T_REFERENCE) *classtype = H5T_REFERENCE_F; - if (c_classtype == H5T_ENUM) *classtype = H5T_ENUM_F; - */ + return ret_value; } diff --git a/fortran/src/H5Tff.F90 b/fortran/src/H5Tff.F90 index b93e3c3a03c..1416493e4d7 100644 --- a/fortran/src/H5Tff.F90 +++ b/fortran/src/H5Tff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -267,6 +267,7 @@ END SUBROUTINE h5tclose_f !! \li H5T_ENUM_F !! \li H5T_VLEN_F !! \li H5T_ARRAY_F +!! \li H5T_COMPLEX_F !! \param hdferr \fortran_error !! !! See C API: @ref H5Tget_class() @@ -1726,9 +1727,9 @@ END SUBROUTINE h5tis_variable_str_f !! !! \brief Returns datatype class of compound datatype member. !! -!! \param type_id Datartpe identifier. +!! \param type_id Datatype identifier. !! \param member_no Index of compound datatype member. -!! \param class Class type for compound dadtype member. Valid classes: +!! \param class Class type for compound datatype member. Valid classes: !! \li H5T_NO_CLASS_F (error) !! \li H5T_INTEGER_F !! \li H5T_FLOAT_F @@ -1741,6 +1742,7 @@ END SUBROUTINE h5tis_variable_str_f !! \li H5T_ENUM_F !! \li H5T_VLEN_F !! \li H5T_ARRAY_F +!! \li H5T_COMPLEX_F !! \param hdferr \fortran_error !! !! See C API: @ref H5Tget_member_class() diff --git a/fortran/src/H5VLff.F90 b/fortran/src/H5VLff.F90 index b07e1389f21..21fc6f6b05e 100644 --- a/fortran/src/H5VLff.F90 +++ b/fortran/src/H5VLff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -419,7 +419,8 @@ SUBROUTINE H5VLcmp_connector_cls_f(are_same, conn_id1, conn_id2, hdferr) INTEGER(HID_T), INTENT(IN) :: conn_id1 INTEGER(HID_T), INTENT(IN) :: conn_id2 INTEGER, INTENT(OUT) :: hdferr - INTEGER :: are_same_c + + INTEGER(C_INT) :: are_same_c INTERFACE INTEGER(C_INT) FUNCTION H5VLcmp_connector_cls(cmp_value, conn_id1, conn_id2) BIND(C, NAME='H5VLcmp_connector_cls') @@ -432,7 +433,7 @@ END FUNCTION H5VLcmp_connector_cls are_same = .FALSE. hdferr = INT(H5VLcmp_connector_cls(are_same_c, conn_id1, conn_id2)) - IF(are_same_c .EQ. 0) are_same = .TRUE. + IF(are_same_c .EQ. 0_C_INT) are_same = .TRUE. END SUBROUTINE H5VLcmp_connector_cls_f diff --git a/fortran/src/H5Zf.c b/fortran/src/H5Zf.c index 607992f2d37..541617a9810 100644 --- a/fortran/src/H5Zf.c +++ b/fortran/src/H5Zf.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5Zff.F90 b/fortran/src/H5Zff.F90 index eae94c5bb81..a92587a9e0b 100644 --- a/fortran/src/H5Zff.F90 +++ b/fortran/src/H5Zff.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5_buildiface.F90 b/fortran/src/H5_buildiface.F90 index 62ced23cf45..0c8db4c5dd2 100644 --- a/fortran/src/H5_buildiface.F90 +++ b/fortran/src/H5_buildiface.F90 @@ -32,7 +32,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -117,7 +117,7 @@ PROGRAM H5_buildiface '! *',& '! This file is part of HDF5. The full HDF5 copyright notice, including *',& '! terms governing use, modification, and redistribution, is contained in *',& -'! the COPYING file, which can be found at the root of the source code *',& +'! the LICENSE file, which can be found at the root of the source code *',& '! distribution tree, or in https://www.hdfgroup.org/licenses. *',& '! If you do not have access to either file, you may request a copy from *',& '! help@hdfgroup.org. *',& diff --git a/fortran/src/H5_f.c b/fortran/src/H5_f.c index ac3c7bfceed..53410f63e77 100644 --- a/fortran/src/H5_f.c +++ b/fortran/src/H5_f.c @@ -9,7 +9,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -539,8 +539,7 @@ h5init_flags_c(int_f *h5d_flags, size_t_f *h5d_size_flags, int_f *h5e_flags, hid h5f_flags[27] = (int_f)H5F_LIBVER_V110; h5f_flags[28] = (int_f)H5F_LIBVER_V112; h5f_flags[29] = (int_f)H5F_LIBVER_V114; - h5f_flags[30] = (int_f)H5F_LIBVER_V116; - h5f_flags[31] = (int_f)H5F_LIBVER_V118; + h5f_flags[30] = (int_f)H5F_LIBVER_V200; /* * H5FD flags @@ -849,6 +848,7 @@ h5init_flags_c(int_f *h5d_flags, size_t_f *h5d_size_flags, int_f *h5e_flags, hid h5t_flags[32] = (int_f)H5T_ARRAY; h5t_flags[33] = (int_f)H5T_DIR_ASCEND; h5t_flags[34] = (int_f)H5T_DIR_DESCEND; + h5t_flags[35] = (int_f)H5T_COMPLEX; /* * H5VL flags diff --git a/fortran/src/H5_ff.F90 b/fortran/src/H5_ff.F90 index d8c18374045..fd871829f4f 100644 --- a/fortran/src/H5_ff.F90 +++ b/fortran/src/H5_ff.F90 @@ -26,7 +26,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -56,7 +56,7 @@ MODULE H5LIB ! ! H5F flags declaration ! - INTEGER, PARAMETER :: H5F_FLAGS_LEN = 32 + INTEGER, PARAMETER :: H5F_FLAGS_LEN = 31 INTEGER, DIMENSION(1:H5F_FLAGS_LEN) :: H5F_flags ! ! H5generic flags declaration @@ -144,7 +144,7 @@ MODULE H5LIB ! ! H5T flags declaration ! - INTEGER, PARAMETER :: H5T_FLAGS_LEN = 35 + INTEGER, PARAMETER :: H5T_FLAGS_LEN = 36 INTEGER, DIMENSION(1:H5T_FLAGS_LEN) :: H5T_flags ! ! H5VL flags declaration @@ -379,8 +379,7 @@ END FUNCTION h5init1_flags_c H5F_LIBVER_V110_F = H5F_flags(28) H5F_LIBVER_V112_F = H5F_flags(29) H5F_LIBVER_V114_F = H5F_flags(30) - H5F_LIBVER_V116_F = H5F_flags(31) - H5F_LIBVER_V118_F = H5F_flags(32) + H5F_LIBVER_V200_F = H5F_flags(31) ! ! H5generic flags ! @@ -706,6 +705,7 @@ END FUNCTION h5init1_flags_c H5T_ARRAY_F = H5T_flags(33) H5T_DIR_ASCEND_F = H5T_flags(34) H5T_DIR_DESCEND_F = H5T_flags(35) + H5T_COMPLEX_F = H5T_flags(36) ! ! H5VL flags ! diff --git a/fortran/src/H5config_f.inc.cmake b/fortran/src/H5config_f.inc.cmake index bc9f036e020..88875cb0b9a 100644 --- a/fortran/src/H5config_f.inc.cmake +++ b/fortran/src/H5config_f.inc.cmake @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5config_f.inc.in b/fortran/src/H5config_f.inc.in index 7f2d3cad8a9..a37176ec619 100644 --- a/fortran/src/H5config_f.inc.in +++ b/fortran/src/H5config_f.inc.in @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5f90.h b/fortran/src/H5f90.h index 513b30940b7..4f8233dcb58 100644 --- a/fortran/src/H5f90.h +++ b/fortran/src/H5f90.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5f90global.F90 b/fortran/src/H5f90global.F90 index ee2c6ab3aec..7e486cffdfe 100644 --- a/fortran/src/H5f90global.F90 +++ b/fortran/src/H5f90global.F90 @@ -12,7 +12,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -236,8 +236,7 @@ MODULE H5GLOBAL !DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V110_F !DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V112_F !DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V114_F - !DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V116_F - !DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V118_F + !DEC$ATTRIBUTES DLLEXPORT :: H5F_LIBVER_V200_F !DEC$ATTRIBUTES DLLEXPORT :: H5F_FSPACE_STRATEGY_FSM_AGGR_F !DEC$ATTRIBUTES DLLEXPORT :: H5F_FSPACE_STRATEGY_PAGE_F !DEC$ATTRIBUTES DLLEXPORT :: H5F_FSPACE_STRATEGY_AGGR_F @@ -271,8 +270,7 @@ MODULE H5GLOBAL INTEGER :: H5F_LIBVER_V110_F !< H5F_LIBVER_V110 INTEGER :: H5F_LIBVER_V112_F !< H5F_LIBVER_V112 INTEGER :: H5F_LIBVER_V114_F !< H5F_LIBVER_V114 - INTEGER :: H5F_LIBVER_V116_F !< H5F_LIBVER_V116 - INTEGER :: H5F_LIBVER_V118_F !< H5F_LIBVER_V118 + INTEGER :: H5F_LIBVER_V200_F !< H5F_LIBVER_V200 INTEGER :: H5F_FSPACE_STRATEGY_FSM_AGGR_F !< H5F_FSPACE_STRATEGY_FSM_AGGR INTEGER :: H5F_FSPACE_STRATEGY_PAGE_F !< H5F_FSPACE_STRATEGY_PAGE INTEGER :: H5F_FSPACE_STRATEGY_AGGR_F !< H5F_FSPACE_STRATEGY_AGGR @@ -865,6 +863,7 @@ MODULE H5GLOBAL !DEC$ATTRIBUTES DLLEXPORT :: H5T_ENUM_F !DEC$ATTRIBUTES DLLEXPORT :: H5T_VLEN_F !DEC$ATTRIBUTES DLLEXPORT :: H5T_ARRAY_F + !DEC$ATTRIBUTES DLLEXPORT :: H5T_COMPLEX_F !DEC$ATTRIBUTES DLLEXPORT :: H5T_ORDER_LE_F !DEC$ATTRIBUTES DLLEXPORT :: H5T_ORDER_BE_F !DEC$ATTRIBUTES DLLEXPORT :: H5T_ORDER_VAX_F @@ -903,6 +902,7 @@ MODULE H5GLOBAL INTEGER :: H5T_ENUM_F !< H5T_ENUM INTEGER :: H5T_VLEN_F !< H5T_VLEN INTEGER :: H5T_ARRAY_F !< H5T_ARRAY + INTEGER :: H5T_COMPLEX_F !< H5T_COMPLEX INTEGER :: H5T_ORDER_LE_F !< H5T_ORDER_LE INTEGER :: H5T_ORDER_BE_F !< H5T_ORDER_BE INTEGER :: H5T_ORDER_VAX_F !< H5T_ORDER_VAX diff --git a/fortran/src/H5f90i.h b/fortran/src/H5f90i.h index 9f7433aec97..cd263feaba5 100644 --- a/fortran/src/H5f90i.h +++ b/fortran/src/H5f90i.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5f90kit.c b/fortran/src/H5f90kit.c index 5129bda9976..91836265bb3 100644 --- a/fortran/src/H5f90kit.c +++ b/fortran/src/H5f90kit.c @@ -12,7 +12,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5f90proto.h b/fortran/src/H5f90proto.h index 71d914c1d26..55d36da33b3 100644 --- a/fortran/src/H5f90proto.h +++ b/fortran/src/H5f90proto.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5fort_type_defines.h.cmake b/fortran/src/H5fort_type_defines.h.cmake index f2f6af6b6ae..02493d1f928 100644 --- a/fortran/src/H5fort_type_defines.h.cmake +++ b/fortran/src/H5fort_type_defines.h.cmake @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5fort_type_defines.h.in b/fortran/src/H5fort_type_defines.h.in index 989be54d1ff..a7c48ef2d59 100644 --- a/fortran/src/H5fort_type_defines.h.in +++ b/fortran/src/H5fort_type_defines.h.in @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/src/H5fortkit.F90 b/fortran/src/H5fortkit.F90 index 70d7087d65e..b77c7c166e6 100644 --- a/fortran/src/H5fortkit.F90 +++ b/fortran/src/H5fortkit.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/H5match_types.c b/fortran/src/H5match_types.c index 40d21e97cc0..310720ed9aa 100644 --- a/fortran/src/H5match_types.c +++ b/fortran/src/H5match_types.c @@ -18,7 +18,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -62,7 +62,7 @@ initCfile(void) * *\n\ * This file is part of HDF5. The full HDF5 copyright notice, including *\n\ * terms governing use, modification, and redistribution, is contained in *\n\ - * the COPYING file, which can be found at the root of the source code *\n\ + * the LICENSE file, which can be found at the root of the source code *\n\ * distribution tree, or in https://www.hdfgroup.org/licenses. *\n\ * If you do not have access to either file, you may request a copy from *\n\ * help@hdfgroup.org. *\n\ @@ -85,7 +85,7 @@ initFfile(void) ! *\n\ ! This file is part of HDF5. The full HDF5 copyright notice, including *\n\ ! terms governing use, modification, and redistribution, is contained in *\n\ -! the COPYING file, which can be found at the root of the source code *\n\ +! the LICENSE file, which can be found at the root of the source code *\n\ ! distribution tree, or in https://www.hdfgroup.org/licenses. *\n\ ! If you do not have access to either file, you may request a copy from *\n\ ! help@hdfgroup.org. *\n\ diff --git a/fortran/src/HDF5.F90 b/fortran/src/HDF5.F90 index faedc40a05b..fd3733cd2f3 100644 --- a/fortran/src/HDF5.F90 +++ b/fortran/src/HDF5.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/src/Makefile.am b/fortran/src/Makefile.am index 2fdf085f4b9..4b25e230317 100644 --- a/fortran/src/Makefile.am +++ b/fortran/src/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/fortran/src/h5fc.in b/fortran/src/h5fc.in index e0e35f5a1b8..7e2fa5fe1fb 100644 --- a/fortran/src/h5fc.in +++ b/fortran/src/h5fc.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -165,7 +165,7 @@ if test "$#" = "0"; then usage fi -for arg in $@ ; do +for arg in "$@" ; do if test "x$get_output_file" = "xyes"; then link_args="$link_args $arg" output_file="$arg" @@ -237,6 +237,10 @@ for arg in $@ ; do qarg='"'"$arg"'"' qargs="$qargs $qarg" ;; + *\ *) + qarg=$arg + qargs="$qargs $qarg" + ;; *) if [ -s "$arg" ] ; then ext=`expr "$arg" : '.*\(\..*\)'` diff --git a/fortran/test/CMakeLists.txt b/fortran/test/CMakeLists.txt index c9dc48f01d6..831438cc082 100644 --- a/fortran/test/CMakeLists.txt +++ b/fortran/test/CMakeLists.txt @@ -107,7 +107,6 @@ else () BYPRODUCTS ${HDF5_FORTRAN_TESTS_BINARY_DIR}/shared/tf_gen.F90 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ WORKING_DIRECTORY ${HDF5_FORTRAN_TESTS_BINARY_DIR}/shared - DEPENDS H5_test_buildiface COMMENT "Generating the tf_gen.F90 shared file" ) add_custom_target (H5testgenSH ALL diff --git a/fortran/test/CMakeTests.cmake b/fortran/test/CMakeTests.cmake index 46b89728bea..66a5f058634 100644 --- a/fortran/test/CMakeTests.cmake +++ b/fortran/test/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/fortran/test/H5_test_buildiface.F90 b/fortran/test/H5_test_buildiface.F90 index 0b5efebd235..efbabc74987 100644 --- a/fortran/test/H5_test_buildiface.F90 +++ b/fortran/test/H5_test_buildiface.F90 @@ -32,7 +32,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -76,7 +76,7 @@ PROGRAM H5_test_buildiface '! *',& '! This file is part of HDF5. The full HDF5 copyright notice, including *',& '! terms governing use, modification, and redistribution, is contained in *',& -'! the COPYING file, which can be found at the root of the source code *',& +'! the LICENSE file, which can be found at the root of the source code *',& '! distribution tree, or in https://www.hdfgroup.org/licenses. *',& '! If you do not have access to either file, you may request a copy from *',& '! help@hdfgroup.org. *',& diff --git a/fortran/test/Makefile.am b/fortran/test/Makefile.am index 6d11dcc07d1..29cb2c97bff 100644 --- a/fortran/test/Makefile.am +++ b/fortran/test/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/fortran/test/fflush1.F90 b/fortran/test/fflush1.F90 index 5e3234d0161..b016346bb49 100644 --- a/fortran/test/fflush1.F90 +++ b/fortran/test/fflush1.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/fflush2.F90 b/fortran/test/fflush2.F90 index e05908a9f1b..e2fbe438952 100644 --- a/fortran/test/fflush2.F90 +++ b/fortran/test/fflush2.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/fortranlib_test.F90 b/fortran/test/fortranlib_test.F90 index 534bde6c9a0..bace2bf86f9 100644 --- a/fortran/test/fortranlib_test.F90 +++ b/fortran/test/fortranlib_test.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/fortranlib_test_1_8.F90 b/fortran/test/fortranlib_test_1_8.F90 index 6b3e7fa5b8d..feb85a47cdc 100644 --- a/fortran/test/fortranlib_test_1_8.F90 +++ b/fortran/test/fortranlib_test_1_8.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/fortranlib_test_F03.F90 b/fortran/test/fortranlib_test_F03.F90 index 50240ce6ed1..51da6b5eeb5 100644 --- a/fortran/test/fortranlib_test_F03.F90 +++ b/fortran/test/fortranlib_test_F03.F90 @@ -14,7 +14,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/t.c b/fortran/test/t.c index 1336540ca61..048dae89120 100644 --- a/fortran/test/t.c +++ b/fortran/test/t.c @@ -13,7 +13,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/test/t.h b/fortran/test/t.h index af8940ff9a7..de909271df6 100644 --- a/fortran/test/t.h +++ b/fortran/test/t.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/fortran/test/tH5A.F90 b/fortran/test/tH5A.F90 index ff7ee60053e..ce69ba11bc0 100644 --- a/fortran/test/tH5A.F90 +++ b/fortran/test/tH5A.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5A_1_8.F90 b/fortran/test/tH5A_1_8.F90 index 2a479e476ca..0a90842075c 100644 --- a/fortran/test/tH5A_1_8.F90 +++ b/fortran/test/tH5A_1_8.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5D.F90 b/fortran/test/tH5D.F90 index fc774144f14..59b69db7e7f 100644 --- a/fortran/test/tH5D.F90 +++ b/fortran/test/tH5D.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5E.F90 b/fortran/test/tH5E.F90 index 5cf761477d6..c878b3c8efa 100644 --- a/fortran/test/tH5E.F90 +++ b/fortran/test/tH5E.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5E_F03.F90 b/fortran/test/tH5E_F03.F90 index 7060d2ee617..26268205b22 100644 --- a/fortran/test/tH5E_F03.F90 +++ b/fortran/test/tH5E_F03.F90 @@ -14,7 +14,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5F.F90 b/fortran/test/tH5F.F90 index 569d4598c92..ea042dd7ceb 100644 --- a/fortran/test/tH5F.F90 +++ b/fortran/test/tH5F.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5G.F90 b/fortran/test/tH5G.F90 index 36c51df54a1..30de65766c5 100644 --- a/fortran/test/tH5G.F90 +++ b/fortran/test/tH5G.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5G_1_8.F90 b/fortran/test/tH5G_1_8.F90 index cd354d81d2b..e364ab32ce1 100644 --- a/fortran/test/tH5G_1_8.F90 +++ b/fortran/test/tH5G_1_8.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5I.F90 b/fortran/test/tH5I.F90 index 7d97219b177..baba2df428a 100644 --- a/fortran/test/tH5I.F90 +++ b/fortran/test/tH5I.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5L_F03.F90 b/fortran/test/tH5L_F03.F90 index a4ece4d7fe4..d7760b693c9 100644 --- a/fortran/test/tH5L_F03.F90 +++ b/fortran/test/tH5L_F03.F90 @@ -14,7 +14,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5MISC_1_8.F90 b/fortran/test/tH5MISC_1_8.F90 index bd3ce3f9da9..67deb5a21e1 100644 --- a/fortran/test/tH5MISC_1_8.F90 +++ b/fortran/test/tH5MISC_1_8.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5O.F90 b/fortran/test/tH5O.F90 index 5fdb066fa32..acbe0817798 100644 --- a/fortran/test/tH5O.F90 +++ b/fortran/test/tH5O.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5O_F03.F90 b/fortran/test/tH5O_F03.F90 index f9cad325f3b..759f1123c75 100644 --- a/fortran/test/tH5O_F03.F90 +++ b/fortran/test/tH5O_F03.F90 @@ -14,7 +14,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5P.F90 b/fortran/test/tH5P.F90 index 78d665f0aa1..5a317d5593c 100644 --- a/fortran/test/tH5P.F90 +++ b/fortran/test/tH5P.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5P_F03.F90 b/fortran/test/tH5P_F03.F90 index f411338ccc8..8dd76eb2958 100644 --- a/fortran/test/tH5P_F03.F90 +++ b/fortran/test/tH5P_F03.F90 @@ -14,7 +14,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -228,19 +228,12 @@ SUBROUTINE test_create(total_error) CALL VERIFY("***ERROR: Returned wrong low libver_bounds", low, H5F_LIBVER_V114_F, total_error) CALL VERIFY("***ERROR: Returned wrong high libver_bounds", high, H5F_LIBVER_V114_F, total_error) - CALL h5pset_libver_bounds_f(fapl, H5F_LIBVER_V116_F, H5F_LIBVER_V116_F, error) + CALL h5pset_libver_bounds_f(fapl, H5F_LIBVER_V200_F, H5F_LIBVER_V200_F, error) CALL check("h5pset_libver_bounds_f",error, total_error) CALL h5pget_libver_bounds_f(fapl, low, high, error) CALL check("h5pget_libver_bounds_f",error, total_error) - CALL VERIFY("***ERROR: Returned wrong low libver_bounds", low, H5F_LIBVER_V116_F, total_error) - CALL VERIFY("***ERROR: Returned wrong high libver_bounds", high, H5F_LIBVER_V116_F, total_error) - - CALL h5pset_libver_bounds_f(fapl, H5F_LIBVER_V118_F, H5F_LIBVER_V118_F, error) - CALL check("h5pset_libver_bounds_f",error, total_error) - CALL h5pget_libver_bounds_f(fapl, low, high, error) - CALL check("h5pget_libver_bounds_f",error, total_error) - CALL VERIFY("***ERROR: Returned wrong low libver_bounds", low, H5F_LIBVER_V118_F, total_error) - CALL VERIFY("***ERROR: Returned wrong high libver_bounds", high, H5F_LIBVER_V118_F, total_error) + CALL VERIFY("***ERROR: Returned wrong low libver_bounds", low, H5F_LIBVER_V200_F, total_error) + CALL VERIFY("***ERROR: Returned wrong high libver_bounds", high, H5F_LIBVER_V200_F, total_error) CALL H5Pset_libver_bounds_f(fapl, H5F_LIBVER_LATEST_F, H5F_LIBVER_LATEST_F, error) CALL check("H5Pset_libver_bounds_f",error, total_error) diff --git a/fortran/test/tH5R.F90 b/fortran/test/tH5R.F90 index 8eb8d8d2f9a..ac0319779f7 100644 --- a/fortran/test/tH5R.F90 +++ b/fortran/test/tH5R.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -684,7 +684,7 @@ SUBROUTINE v3reftest(cleanup, total_error) CALL check("H5Rget_name_f", error, total_error) CALL verify("H5Rget_name_f", TRIM(buf_big), "/"//groupname1//"/"//groupname2, total_error) - ! CHECK COPYING REF + ! CHECK LICENSE REF f_ptr = C_LOC(ref_ptr_cp) CALL h5rcopy_f(C_LOC(ref_ptr(3)), f_ptr, error) diff --git a/fortran/test/tH5S.F90 b/fortran/test/tH5S.F90 index 4bb68108fa8..21809203e3f 100644 --- a/fortran/test/tH5S.F90 +++ b/fortran/test/tH5S.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5Sselect.F90 b/fortran/test/tH5Sselect.F90 index bcf254ae2a5..0509f33ba3c 100644 --- a/fortran/test/tH5Sselect.F90 +++ b/fortran/test/tH5Sselect.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5T.F90 b/fortran/test/tH5T.F90 index c4f6aa0ece7..2e006bc3a4f 100644 --- a/fortran/test/tH5T.F90 +++ b/fortran/test/tH5T.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5T_F03.F90 b/fortran/test/tH5T_F03.F90 index e7a3797e37e..4f0aeb1ef04 100644 --- a/fortran/test/tH5T_F03.F90 +++ b/fortran/test/tH5T_F03.F90 @@ -14,7 +14,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5VL.F90 b/fortran/test/tH5VL.F90 index e7a03636156..41acf9c81fb 100644 --- a/fortran/test/tH5VL.F90 +++ b/fortran/test/tH5VL.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tH5Z.F90 b/fortran/test/tH5Z.F90 index c6ab3832d18..488129118f2 100644 --- a/fortran/test/tH5Z.F90 +++ b/fortran/test/tH5Z.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tHDF5.F90 b/fortran/test/tHDF5.F90 index 34e1ea09a49..3669bf13408 100644 --- a/fortran/test/tHDF5.F90 +++ b/fortran/test/tHDF5.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tHDF5_1_8.F90 b/fortran/test/tHDF5_1_8.F90 index 2a41fb9a92b..be14eeb1144 100644 --- a/fortran/test/tHDF5_1_8.F90 +++ b/fortran/test/tHDF5_1_8.F90 @@ -17,7 +17,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tHDF5_F03.F90 b/fortran/test/tHDF5_F03.F90 index 1ef762609ec..75133876007 100644 --- a/fortran/test/tHDF5_F03.F90 +++ b/fortran/test/tHDF5_F03.F90 @@ -17,7 +17,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/tf.F90 b/fortran/test/tf.F90 index d08d1c7451c..62e31ac3aea 100644 --- a/fortran/test/tf.F90 +++ b/fortran/test/tf.F90 @@ -13,7 +13,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/test/vol_connector.F90 b/fortran/test/vol_connector.F90 index 44446ddf361..8cf9b930b28 100644 --- a/fortran/test/vol_connector.F90 +++ b/fortran/test/vol_connector.F90 @@ -16,7 +16,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/testpar/CMakeTests.cmake b/fortran/testpar/CMakeTests.cmake index f9ce2b829c7..6062c2533c2 100644 --- a/fortran/testpar/CMakeTests.cmake +++ b/fortran/testpar/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/fortran/testpar/Makefile.am b/fortran/testpar/Makefile.am index 3df1fee8f09..2b25ec0bc8f 100644 --- a/fortran/testpar/Makefile.am +++ b/fortran/testpar/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/fortran/testpar/async.F90 b/fortran/testpar/async.F90 index aa2416fd24d..96ca02790af 100644 --- a/fortran/testpar/async.F90 +++ b/fortran/testpar/async.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/testpar/hyper.F90 b/fortran/testpar/hyper.F90 index 61a3e260797..2a7f9dec703 100644 --- a/fortran/testpar/hyper.F90 +++ b/fortran/testpar/hyper.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/testpar/mdset.F90 b/fortran/testpar/mdset.F90 index 95e401137e6..9ee57501abc 100644 --- a/fortran/testpar/mdset.F90 +++ b/fortran/testpar/mdset.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/testpar/mpi_param.F90 b/fortran/testpar/mpi_param.F90 index 1d7f8ff70f8..a014d76ef51 100644 --- a/fortran/testpar/mpi_param.F90 +++ b/fortran/testpar/mpi_param.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/testpar/multidsetrw.F90 b/fortran/testpar/multidsetrw.F90 index 62eb5d1e8bb..3cfe03775cb 100644 --- a/fortran/testpar/multidsetrw.F90 +++ b/fortran/testpar/multidsetrw.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/testpar/ptest.F90 b/fortran/testpar/ptest.F90 index 6e34ffdaaac..4244cfb2941 100644 --- a/fortran/testpar/ptest.F90 +++ b/fortran/testpar/ptest.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/fortran/testpar/subfiling.F90 b/fortran/testpar/subfiling.F90 index 67f201e0ec7..a4f97c2c7a6 100644 --- a/fortran/testpar/subfiling.F90 +++ b/fortran/testpar/subfiling.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/CMakeLists.txt b/hl/CMakeLists.txt index ab4bc79cc3f..ec51d58c3ca 100644 --- a/hl/CMakeLists.txt +++ b/hl/CMakeLists.txt @@ -20,11 +20,6 @@ if (HDF5_BUILD_TOOLS) add_subdirectory (tools) endif () -#-- Add High Level Examples -if (HDF5_BUILD_EXAMPLES) - add_subdirectory (examples) -endif () - #-- Build the Unit testing if requested if (NOT HDF5_EXTERNALLY_CONFIGURED AND BUILD_TESTING AND HDF5_TEST_SERIAL) add_subdirectory (test) diff --git a/hl/Makefile.am b/hl/Makefile.am index 5660b9bc5fe..ed1e79a5907 100644 --- a/hl/Makefile.am +++ b/hl/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -46,25 +46,7 @@ endif if BUILD_HDF5_HL_CONDITIONAL SUBDIRS=src $(TEST_DIR) $(TOOLS_DIR) $(CXX_DIR) $(FORTRAN_DIR) endif -DIST_SUBDIRS=src test tools c++ fortran examples - -# Install examples -install-examples uninstall-examples: - for d in examples $(HDF5_INTERFACES); do \ - (cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ - done - -installcheck-local: - @(cd examples && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; - -# Clean examples when check-clean is invoked -check-clean :: - @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1; - @for d in X $(SUBDIRS) examples; do \ - if test $$d != X && test $$d != .; then \ - (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ - fi; \ - done +DIST_SUBDIRS=src test tools c++ fortran build-check-clean: diff --git a/hl/c++/CMakeLists.txt b/hl/c++/CMakeLists.txt index 07e7777b2c9..703b9d4ad7f 100644 --- a/hl/c++/CMakeLists.txt +++ b/hl/c++/CMakeLists.txt @@ -6,13 +6,6 @@ project (HDF5_HL_CPP CXX) #----------------------------------------------------------------------------- add_subdirectory (src) -# -------------------------------------------------------------------- -# Add in the examples for the Packet Table codes -# -------------------------------------------------------------------- -if (HDF5_BUILD_EXAMPLES) - add_subdirectory (examples) -endif () - # -------------------------------------------------------------------- # Add in the unit tests for the packet table c++ wrapper # -------------------------------------------------------------------- diff --git a/hl/c++/Makefile.am b/hl/c++/Makefile.am index 4bdab417fcc..228e57c32cc 100644 --- a/hl/c++/Makefile.am +++ b/hl/c++/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -24,22 +24,7 @@ else endif SUBDIRS=src $(TESTSERIAL_DIR) -DIST_SUBDIRS=src test examples +DIST_SUBDIRS=src test -# Install examples -install-examples uninstall-examples: - @(cd examples && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; - -installcheck-local: - @(cd examples && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; - -# Clean examples when check-clean is invoked -check-clean :: - @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1; - @for d in X $(SUBDIRS) examples; do \ - if test $$d != X && test $$d != .; then \ - (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ - fi; \ - done include $(top_srcdir)/config/conclude.am diff --git a/hl/c++/examples/CMakeLists.txt b/hl/c++/examples/CMakeLists.txt deleted file mode 100644 index dfc5818ed63..00000000000 --- a/hl/c++/examples/CMakeLists.txt +++ /dev/null @@ -1,35 +0,0 @@ -cmake_minimum_required (VERSION 3.18) -project (HDF5_HL_CPP_EXAMPLES CXX) - -# -------------------------------------------------------------------- -# Add in the examples for the Packet Table codes -# -------------------------------------------------------------------- -add_executable (ptExampleFL ${HDF5_HL_CPP_EXAMPLES_SOURCE_DIR}/ptExampleFL.cpp) -target_include_directories (ptExampleFL PRIVATE "${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") -if (NOT BUILD_SHARED_LIBS) - TARGET_C_PROPERTIES (ptExampleFL STATIC) - target_link_libraries (ptExampleFL PRIVATE - ${HDF5_HL_CPP_LIB_TARGET} - ${HDF5_HL_LIB_TARGET} - ${HDF5_LIB_TARGET} - ) -else () - TARGET_C_PROPERTIES (ptExampleFL SHARED) - target_link_libraries (ptExampleFL PRIVATE - ${HDF5_HL_CPP_LIBSH_TARGET} - ${HDF5_HL_LIBSH_TARGET} - ${HDF5_LIBSH_TARGET} - ) -endif () -set_target_properties (ptExampleFL PROPERTIES FOLDER examples/hl/cpp) - -#----------------------------------------------------------------------------- -# Add Target to clang-format -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_FORMATTERS) - clang_format (HDF5_HL_CPP_EXAMPLES_FORMAT ptExampleFL) -endif () - -if (BUILD_TESTING AND HDF5_TEST_CPP AND HDF5_TEST_EXAMPLES AND HDF5_TEST_SERIAL) - include (CMakeTests.cmake) -endif () diff --git a/hl/c++/examples/CMakeTests.cmake b/hl/c++/examples/CMakeTests.cmake deleted file mode 100644 index d0a647e1d1c..00000000000 --- a/hl/c++/examples/CMakeTests.cmake +++ /dev/null @@ -1,55 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -# - -############################################################################## -############################################################################## -### T E S T I N G ### -############################################################################## -############################################################################## -# Remove any output file left over from previous test run -set (HL_CPP_EX_PT_CLEANFILES - PTcppexampleFL.h5 -) -add_test ( - NAME HL_CPP_ex_ptExampleFL-clear-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_CPP_EX_PT_CLEANFILES} -) -set_tests_properties (HL_CPP_ex_ptExampleFL-clear-objects PROPERTIES - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} -) - -if (HDF5_USING_ANALYSIS_TOOL) - add_test (NAME HL_CPP_ex_ptExampleFL COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) -else () - add_test (NAME HL_CPP_ex_ptExampleFL COMMAND "${CMAKE_COMMAND}" - -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" - -D "TEST_PROGRAM=$" - -D "TEST_ARGS:STRING=" - -D "TEST_EXPECT=0" - -D "TEST_SKIP_COMPARE=TRUE" - -D "TEST_OUTPUT=ptExampleFL.txt" - #-D "TEST_REFERENCE=ptExampleFL.out" - -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" - -P "${HDF_RESOURCES_DIR}/runTest.cmake" - ) -endif () -set_tests_properties (HL_CPP_ex_ptExampleFL PROPERTIES DEPENDS HL_CPP_ex_ptExampleFL-clear-objects) -add_test ( - NAME HL_CPP_ex_ptExampleFL-clean-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_CPP_EX_PT_CLEANFILES} -) -set_tests_properties (HL_CPP_ex_ptExampleFL-clean-objects PROPERTIES - DEPENDS HL_CPP_ex_ptExampleFL - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} -) diff --git a/hl/c++/examples/run-hlc++-ex.sh.in b/hl/c++/examples/run-hlc++-ex.sh.in deleted file mode 100644 index 47f460bfd27..00000000000 --- a/hl/c++/examples/run-hlc++-ex.sh.in +++ /dev/null @@ -1,102 +0,0 @@ -#! /bin/sh -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. - -# -# This file: run-hlc++-ex.sh -# Written by: Larry Knox -# Date: May 11, 2010 -# -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # -# This script will compile and run the c++ examples from source files # -# installed in @examplesdir@/hl/c++ using h5c++. The # -# order for running programs with RunTest in the MAIN section below is taken # -# from the Makefile. The order is important since some of the test programs # -# use data files created by earlier test programs. Any future additions should # -# be placed accordingly. # -# # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - -# Initializations -EXIT_SUCCESS=0 -EXIT_FAILURE=1 - -# -# Try to derive the path to the installation $prefix established -# by ./configure relative to the examples directory established by -# ./configure. If successful, set `prefix_relto_examplesdir` to the -# relative path. Otherwise, set `prefix_relto_examplesdir` to the -# absolute installation $prefix. -# -# This script uses the value of `prefix` in the user's environment, if -# it is set, below. The content of $() is evaluated in a sub-shell, so -# if `prefix` is set in the user's environment, the shell statements in -# $() won't clobbered it. -# -prefix_relto_examplesdir=$( -prefix=@prefix@ -examplesdir=@examplesdir@ -if [ ${examplesdir##${prefix}/} != ${examplesdir} ]; then - echo $(echo ${examplesdir##${prefix}/} | \ - sed 's,[^/][^/]*,..,g') -else - echo $prefix -fi -) - -# Where the tool is installed. -# default is relative path to installed location of the tools -prefix="${prefix:-../../${prefix_relto_examplesdir}}" -AR="@AR@" -RANLIB="@RANLIB@" -H5TOOL="h5c++" # The tool name -H5TOOL_BIN="${prefix}/bin/${H5TOOL}" # The path of the tool binary - -#### Run test #### -RunTest() -{ - TEST_EXEC=$1 - Test=$1".cpp" - - echo - echo "################# $1 #################" - ${H5TOOL_BIN} -o $TEST_EXEC $Test - if [ $? -ne 0 ] - then - echo "messed up compiling $Test" - exit 1 - fi - ./$TEST_EXEC -} - - - -################## MAIN ################## - -# Run tests -if [ $? -eq 0 ] -then - if (RunTest ptExampleFL &&\ - rm ptExampleFL); then - EXIT_VALUE=${EXIT_SUCCESS} - else - EXIT_VALUE=${EXIT_FAILURE} - fi -fi - -# Cleanup -rm *.o -rm *.h5 -echo - -exit $EXIT_VALUE - diff --git a/hl/c++/src/H5PacketTable.cpp b/hl/c++/src/H5PacketTable.cpp index 4cd3c034a48..98fa48e66d7 100644 --- a/hl/c++/src/H5PacketTable.cpp +++ b/hl/c++/src/H5PacketTable.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/c++/src/H5PacketTable.h b/hl/c++/src/H5PacketTable.h index 8ef5ac31bce..fc6f93aeef0 100644 --- a/hl/c++/src/H5PacketTable.h +++ b/hl/c++/src/H5PacketTable.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/c++/src/Makefile.am b/hl/c++/src/Makefile.am index 54fd52e8ee8..a2f0708a8b9 100644 --- a/hl/c++/src/Makefile.am +++ b/hl/c++/src/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/c++/test/CMakeLists.txt b/hl/c++/test/CMakeLists.txt index 192fb1398ed..94cee4f2c43 100644 --- a/hl/c++/test/CMakeLists.txt +++ b/hl/c++/test/CMakeLists.txt @@ -3,7 +3,7 @@ project (HDF5_HL_CPP_TEST CXX) add_executable (hl_ptableTest ${HDF5_HL_CPP_TEST_SOURCE_DIR}/ptableTest.cpp) target_compile_options(hl_ptableTest PRIVATE "${HDF5_CMAKE_CXX_FLAGS}") -target_include_directories (hl_ptableTest PRIVATE "${HDF5_HL_SRC_DIR}/test;${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") +target_include_directories (hl_ptableTest PRIVATE "${HDF5_HL_TST_DIR};${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") if (NOT BUILD_SHARED_LIBS) TARGET_C_PROPERTIES (hl_ptableTest STATIC) target_link_libraries (hl_ptableTest PRIVATE diff --git a/hl/c++/test/CMakeTests.cmake b/hl/c++/test/CMakeTests.cmake index b07dd6d0a24..159597d5b99 100644 --- a/hl/c++/test/CMakeTests.cmake +++ b/hl/c++/test/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/c++/test/Makefile.am b/hl/c++/test/Makefile.am index 73f14632ba9..abca464c760 100644 --- a/hl/c++/test/Makefile.am +++ b/hl/c++/test/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/c++/test/ptableTest.cpp b/hl/c++/test/ptableTest.cpp index efb97a6546a..9953f17fa68 100644 --- a/hl/c++/test/ptableTest.cpp +++ b/hl/c++/test/ptableTest.cpp @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/c++/test/ptableTest.h b/hl/c++/test/ptableTest.h index 7c5ac3513f1..324c5f4907d 100644 --- a/hl/c++/test/ptableTest.h +++ b/hl/c++/test/ptableTest.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/examples/CMakeLists.txt b/hl/examples/CMakeLists.txt deleted file mode 100644 index c58d4ddff12..00000000000 --- a/hl/examples/CMakeLists.txt +++ /dev/null @@ -1,51 +0,0 @@ -cmake_minimum_required (VERSION 3.18) -project (HDF5_HL_EXAMPLES C) - -#----------------------------------------------------------------------------- -# Define Sources -#----------------------------------------------------------------------------- -set (examples - ex_lite1 - ex_lite2 #ex_lite2 PROPERTIES DEPENDS ex_lite1) - ex_lite3 - ptExampleFL - ex_image1 - ex_image2 - ex_table_01 - ex_table_02 - ex_table_03 - ex_table_04 - ex_table_05 - ex_table_06 - ex_table_07 - ex_table_08 - ex_table_09 - ex_table_10 - ex_table_11 - ex_table_12 - ex_ds1 -) - -foreach (example ${examples}) - add_executable (hl_ex_${example} ${HDF5_HL_EXAMPLES_SOURCE_DIR}/${example}.c) - target_include_directories (hl_ex_${example} PRIVATE "${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") - if (NOT BUILD_SHARED_LIBS) - TARGET_C_PROPERTIES (hl_ex_${example} STATIC) - target_link_libraries (hl_ex_${example} PRIVATE ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET}) - else () - TARGET_C_PROPERTIES (hl_ex_${example} SHARED) - target_link_libraries (hl_ex_${example} PRIVATE ${HDF5_HL_LIBSH_TARGET} ${HDF5_LIBSH_TARGET}) - endif () - set_target_properties (hl_ex_${example} PROPERTIES FOLDER examples/hl) - - #----------------------------------------------------------------------------- - # Add Target to clang-format - #----------------------------------------------------------------------------- - if (HDF5_ENABLE_FORMATTERS) - clang_format (HDF5_HL_EXAMPLES_${example}_FORMAT hl_ex_${example}) - endif () -endforeach () - -if (BUILD_TESTING AND HDF5_TEST_EXAMPLES AND HDF5_TEST_SERIAL) - include (CMakeTests.cmake) -endif () diff --git a/hl/examples/CMakeTests.cmake b/hl/examples/CMakeTests.cmake deleted file mode 100644 index ee376cade7b..00000000000 --- a/hl/examples/CMakeTests.cmake +++ /dev/null @@ -1,93 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -# - -############################################################################## -############################################################################## -### T E S T I N G ### -############################################################################## -############################################################################## - -set (HDF5_TEST_FILES - image24pixel.txt - image8.txt -) - -foreach (h5_file ${HDF5_TEST_FILES}) - HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/${h5_file}" "${PROJECT_BINARY_DIR}/${h5_file}" "hl_ex_ex_ds1_files") -endforeach () -add_custom_target(hl_ex_ex_ds1_files ALL COMMENT "Copying files needed by hl_ex_ex_ds1 tests" DEPENDS ${hl_ex_ex_ds1_files_list}) - -# Remove any output file left over from previous test run -set (HL_EX_CLEANFILES - ex_lite1.h5 - ex_lite2.h5 - ex_lite3.h5 - packet_table_FLexample.h5 - ex_image1.h5 - ex_image2.h5 - ex_table_01.h5 - ex_table_02.h5 - ex_table_03.h5 - ex_table_04.h5 - ex_table_05.h5 - ex_table_06.h5 - ex_table_07.h5 - ex_table_08.h5 - ex_table_09.h5 - ex_table_10.h5 - ex_table_11.h5 - ex_table_12.h5 - ex_ds1.h5 -) -add_test ( - NAME HL_ex-clear-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_EX_CLEANFILES} -) -set_tests_properties (HL_ex-clear-objects PROPERTIES - FIXTURES_SETUP clear_HL_ex - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} -) -add_test ( - NAME HL_ex-clean-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_EX_CLEANFILES} -) -set_tests_properties (HL_ex-clean-objects PROPERTIES - FIXTURES_CLEANUP clear_HL_ex - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} -) - -foreach (example ${examples}) - if (HDF5_USING_ANALYSIS_TOOL) - add_test (NAME HL_ex_${example} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - else () - add_test (NAME HL_ex_${example} COMMAND "${CMAKE_COMMAND}" - -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" - -D "TEST_PROGRAM=$" - -D "TEST_ARGS:STRING=" - -D "TEST_EXPECT=0" - -D "TEST_SKIP_COMPARE=TRUE" - -D "TEST_OUTPUT=hl_ex_${example}.txt" - #-D "TEST_REFERENCE=hl_ex_${example}.out" - -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" - -P "${HDF_RESOURCES_DIR}/runTest.cmake" - ) - endif () - if (last_test) - set_tests_properties (HL_ex_${example} PROPERTIES - DEPENDS ${last_test} - FIXTURES_REQUIRED clear_HL_ex - ) - endif () - set (last_test "HL_ex_${example}") -endforeach () diff --git a/hl/examples/Makefile.am b/hl/examples/Makefile.am deleted file mode 100644 index 95eb5eb34da..00000000000 --- a/hl/examples/Makefile.am +++ /dev/null @@ -1,96 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -## -## Makefile.am -## Run automake to generate a Makefile.in from this file. -## -# -# HDF5 Library Examples Makefile(.in) -# - -include $(top_srcdir)/config/commence.am - -if BUILD_PARALLEL_CONDITIONAL - EXAMPLE_PROG_PARA = -endif - -# Example directory -# Note: no '/' after DESTDIR. Explanation in commence.am -EXAMPLEDIR=${DESTDIR}$(examplesdir)/hl/c -EXAMPLETOPDIR=${DESTDIR}$(examplesdir)/hl -INSTALL_SCRIPT_FILES = run-hlc-ex.sh -INSTALL_TOP_SCRIPT_FILES = run-hl-ex.sh - -# Example programs. -# Don't tell automake about them, because if it knew they were programs, -# it would try to compile them instead of using the h5cc script. -# Use the boilerplate in config/examples.am instead. -EXAMPLE_PROG = ex_lite1 ex_lite2 ex_lite3 ptExampleFL \ - ex_image1 ex_image2 \ - ex_table_01 ex_table_02 ex_table_03 ex_table_04 \ - ex_table_05 ex_table_06 ex_table_07 ex_table_08 \ - ex_table_09 ex_table_10 ex_table_11 ex_table_12 \ - ex_ds1 -TEST_EXAMPLES_SCRIPT=$(INSTALL_SCRIPT_FILES) - -# Install files -# List all file that should be installed in examples directory -INSTALL_FILES = ex_lite1.c ex_lite2.c ex_lite3.c ptExampleFL.c \ - ex_image1.c ex_image2.c \ - ex_table_01.c ex_table_02.c ex_table_03.c ex_table_04.c \ - ex_table_05.c ex_table_06.c ex_table_07.c ex_table_08.c \ - ex_table_09.c ex_table_10.c ex_table_11.c ex_table_12.c \ - ex_ds1.c image24pixel.txt image8.txt pal_rgb.h - - -# Additional dependencies for each program are listed below. -if BUILD_PARALLEL_CONDITIONAL -$(EXTRA_PROG): $(H5CC_PP) - $(H5CC_PP) $(H5CCFLAGS) $(CFLAGS) -o $@ $(srcdir)/$@.c; -else -$(EXTRA_PROG): $(H5CC) - $(H5CC) $(H5CCFLAGS) $(CFLAGS) -o $@ $(srcdir)/$@.c; -endif - -# ex_lite2 uses a file created by ex_lite1 -ex_lite2.chkexe_: ex_lite1.chkexe_ - -# List dependencies for each program. Normally, automake would take -# care of this for us, but if we tell automake about the programs it -# will try to build them with the normal C compiler, not h5cc. This is -# an inelegant way of solving the problem. -# All programs share the same build rule and a dependency on the main hdf5 -# library above. -ex_lite1: $(srcdir)/ex_lite1.c -ex_lite2: $(srcdir)/ex_lite2.c -ex_lite3: $(srcdir)/ex_lite3.c -ptExampleFL: $(srcdir)/ptExampleFL.c -ex_image1: $(srcdir)/ex_image1.c -ex_image2: $(srcdir)/ex_image2.c -ex_table01: $(srcdir)/ex_table01.c -ex_table02: $(srcdir)/ex_table02.c -ex_table03: $(srcdir)/ex_table03.c -ex_table04: $(srcdir)/ex_table04.c -ex_table05: $(srcdir)/ex_table05.c -ex_table06: $(srcdir)/ex_table06.c -ex_table07: $(srcdir)/ex_table07.c -ex_table08: $(srcdir)/ex_table08.c -ex_table09: $(srcdir)/ex_table09.c -ex_table10: $(srcdir)/ex_table10.c -ex_table11: $(srcdir)/ex_table11.c -ex_table12: $(srcdir)/ex_table12.c - -if BUILD_SHARED_SZIP_CONDITIONAL -LD_LIBRARY_PATH=$(LL_PATH) -endif - -include $(top_srcdir)/config/examples.am -include $(top_srcdir)/config/conclude.am diff --git a/hl/examples/run-hl-ex.sh b/hl/examples/run-hl-ex.sh deleted file mode 100755 index c31e0d4234e..00000000000 --- a/hl/examples/run-hl-ex.sh +++ /dev/null @@ -1,38 +0,0 @@ -#! /bin/sh -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. - -# -# This file: run-hl-ex.sh -# Written by: Larry Knox -# Date: May 11, 2010 -# -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # -# This script will run the scripts to compile and run the hdf5 hl examples. # -# # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - -if (echo "Run hl c examples" && \ - (cd c; sh ./run-hlc-ex.sh) && \ - (if test -d fortran; then - echo "Run hl fortran examples" - cd fortran; sh ./run-hlfortran-ex.sh - fi) - (if test -d c++; then - echo "Run hl c++ examples" - cd c++; sh ./run-hlc++-ex.sh - fi)); then - echo "Finished running hl examples" - exit 0 -else - exit 1 -fi diff --git a/hl/examples/run-hlc-ex.sh.in b/hl/examples/run-hlc-ex.sh.in deleted file mode 100644 index 81d3c00c928..00000000000 --- a/hl/examples/run-hlc-ex.sh.in +++ /dev/null @@ -1,142 +0,0 @@ -#! /bin/sh -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. - -# -# This file: run-hlc-ex.sh -# Written by: Larry Knox -# Date: May 11, 2010 -# -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # -# This script will compile and run the c examples from source files installed # -# in @examplesdir@/hl/c using h5cc or h5pc. The order for running # -# programs with RunTest in the MAIN section below is taken from the Makefile. # -# The order is important since some of the test programs use data files created # -# by earlier test programs. Any future additions should be placed accordingly. # -# # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - -# Initializations -EXIT_SUCCESS=0 -EXIT_FAILURE=1 - -# -# Try to derive the path to the installation $prefix established -# by ./configure relative to the examples directory established by -# ./configure. If successful, set `prefix_relto_examplesdir` to the -# relative path. Otherwise, set `prefix_relto_examplesdir` to the -# absolute installation $prefix. -# -# This script uses the value of `prefix` in the user's environment, if -# it is set, below. The content of $() is evaluated in a sub-shell, so -# if `prefix` is set in the user's environment, the shell statements in -# $() won't clobbered it. -# -prefix_relto_examplesdir=$( -prefix=@prefix@ -examplesdir=@examplesdir@ -if [ ${examplesdir##${prefix}/} != ${examplesdir} ]; then - echo $(echo ${examplesdir##${prefix}/} | \ - sed 's,[^/][^/]*,..,g') -else - echo $prefix -fi -) - -# Where the tool is installed. -# default is relative path to installed location of the tools -prefix="${prefix:-../../${prefix_relto_examplesdir}}" -PARALLEL=@PARALLEL@ # Am I in parallel mode? -AR="@AR@" -RANLIB="@RANLIB@" -if [ "$PARALLEL" = no ]; then - H5TOOL="h5cc" # The tool name -else - H5TOOL="h5pcc" # The tool name -fi -H5TOOL_BIN="${prefix}/bin/${H5TOOL}" # The path of the tool binary - -#### Run test #### -RunTest() -{ - TEST_EXEC=$1 - Test=$1".c" - - echo - echo "################# $1 #################" - ${H5TOOL_BIN} -o $TEST_EXEC $Test - if [ $? -ne 0 ] - then - echo "messed up compiling $Test" - exit 1 - fi - ./$TEST_EXEC -} - - - -################## MAIN ################## - -# Run tests -if [ $? -eq 0 ] -then - if (RunTest ex_lite1 &&\ - rm ex_lite1 &&\ - RunTest ex_lite2 &&\ - rm ex_lite2 &&\ - RunTest ex_lite3 &&\ - rm ex_lite3 &&\ - RunTest ptExampleFL &&\ - rm ptExampleFL &&\ - RunTest ex_image1 &&\ - rm ex_image1 &&\ - RunTest ex_image2 &&\ - rm ex_image2 &&\ - RunTest ex_table_01 &&\ - rm ex_table_01 &&\ - RunTest ex_table_02 &&\ - rm ex_table_02 &&\ - RunTest ex_table_03 &&\ - rm ex_table_03 &&\ - RunTest ex_table_04 &&\ - rm ex_table_04 &&\ - RunTest ex_table_05 && - rm ex_table_05 && - RunTest ex_table_06 &&\ - rm ex_table_06 &&\ - RunTest ex_table_07 &&\ - rm ex_table_07 &&\ - RunTest ex_table_08 &&\ - rm ex_table_08 &&\ - RunTest ex_table_09 &&\ - rm ex_table_09 &&\ - RunTest ex_table_10 &&\ - rm ex_table_10 &&\ - RunTest ex_table_11 &&\ - rm ex_table_11 &&\ - RunTest ex_table_12 &&\ - rm ex_table_12 &&\ - RunTest ex_ds1 &&\ - rm ex_ds1); then - EXIT_VALUE=${EXIT_SUCCESS} - else - EXIT_VALUE=${EXIT_FAILURE} - fi -fi - -# Cleanup -rm *.o -rm *.h5 -echo - -exit $EXIT_VALUE - diff --git a/hl/fortran/CMakeLists.txt b/hl/fortran/CMakeLists.txt index ad6faa4f52b..50fdf2b54cc 100644 --- a/hl/fortran/CMakeLists.txt +++ b/hl/fortran/CMakeLists.txt @@ -6,13 +6,6 @@ project (HDF5_HL_F90 C Fortran) #----------------------------------------------------------------------------- add_subdirectory (src) -#----------------------------------------------------------------------------- -# Build the HL Fortran Examples -#----------------------------------------------------------------------------- -if (HDF5_BUILD_EXAMPLES) - add_subdirectory (examples) -endif () - #----------------------------------------------------------------------------- # Testing #----------------------------------------------------------------------------- diff --git a/hl/fortran/Makefile.am b/hl/fortran/Makefile.am index b8a3ac4b14a..5615d8755e2 100644 --- a/hl/fortran/Makefile.am +++ b/hl/fortran/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -29,22 +29,6 @@ else endif SUBDIRS=src $(TESTSERIAL_DIR) -DIST_SUBDIRS=src test examples - -# Install examples -install-examples uninstall-examples: - @(cd examples && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; - -installcheck-local: - @(cd examples && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; - -# Clean examples when check-clean is invoked -check-clean :: - @$(MAKE) $(AM_MAKEFLAGS) build-$@ || exit 1; - @for d in X $(SUBDIRS) examples; do \ - if test $$d != X && test $$d != .; then \ - (set -x; cd $$d && $(MAKE) $(AM_MAKEFLAGS) $@) || exit 1; \ - fi; \ - done +DIST_SUBDIRS=src test include $(top_srcdir)/config/conclude.am diff --git a/hl/fortran/examples/CMakeLists.txt b/hl/fortran/examples/CMakeLists.txt deleted file mode 100644 index 7afe5fc6d1c..00000000000 --- a/hl/fortran/examples/CMakeLists.txt +++ /dev/null @@ -1,42 +0,0 @@ -cmake_minimum_required (VERSION 3.18) -project (HDF5_HL_F90_EXAMPLES C Fortran) - -set (examples - exlite - ex_ds1 -) - -foreach (example ${examples}) - add_executable (hl_f90_ex_${example} ${HDF5_HL_F90_EXAMPLES_SOURCE_DIR}/${example}.f90) - target_compile_options(hl_f90_ex_${example} - PRIVATE - "${HDF5_CMAKE_Fortran_FLAGS}" - "$<$:${WIN_COMPILE_FLAGS}>" - ) -# set_property(TARGET hl_f90_ex_${example} APPEND PROPERTY LINK_FLAGS "$<$:-SUBSYSTEM:CONSOLE>") -# set_property(TARGET hl_f90_ex_${example} APPEND PROPERTY LINK_FLAGS "$<$:${WIN_LINK_FLAGS}>") - if(MSVC) - set_property(TARGET hl_f90_ex_${example} PROPERTY LINK_FLAGS "/SUBSYSTEM:CONSOLE ${WIN_LINK_FLAGS}") - endif() - if (NOT BUILD_SHARED_LIBS) - target_include_directories (hl_f90_ex_${example} PRIVATE "${CMAKE_Fortran_MODULE_DIRECTORY}/static;${HDF5_F90_BINARY_DIR};${HDF5_F90_SRC_DIR}/src") - target_link_libraries (hl_f90_ex_${example} PRIVATE ${HDF5_HL_F90_LIB_TARGET} ${HDF5_F90_LIB_TARGET} ${HDF5_LIB_TARGET}) - set_target_properties (hl_f90_ex_${example} PROPERTIES - LINKER_LANGUAGE Fortran - FOLDER examples/hl/fortran - Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/static - ) - else () - target_include_directories (hl_f90_ex_${example} PRIVATE "${CMAKE_Fortran_MODULE_DIRECTORY}/shared;${HDF5_F90_BINARY_DIR};${HDF5_F90_SRC_DIR}/src") - target_link_libraries (hl_f90_ex_${example} PRIVATE ${HDF5_HL_F90_LIBSH_TARGET} ${HDF5_F90_LIBSH_TARGET} ${HDF5_LIBSH_TARGET}) - set_target_properties (hl_f90_ex_${example} PROPERTIES - LINKER_LANGUAGE Fortran - FOLDER examples/hl/fortran - Fortran_MODULE_DIRECTORY ${CMAKE_Fortran_MODULE_DIRECTORY}/shared - ) - endif () -endforeach () - -if (BUILD_TESTING AND HDF5_TEST_FORTRAN AND HDF5_TEST_EXAMPLES AND HDF5_TEST_SERIAL) - include (CMakeTests.cmake) -endif () diff --git a/hl/fortran/examples/CMakeTests.cmake b/hl/fortran/examples/CMakeTests.cmake deleted file mode 100644 index c5273e541f3..00000000000 --- a/hl/fortran/examples/CMakeTests.cmake +++ /dev/null @@ -1,63 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -# - -############################################################################## -############################################################################## -### T E S T I N G ### -############################################################################## -############################################################################## - -# Remove any output file left over from previous test run -set (HL_FORTRAN_F90_EX_CLEANFILES - ex_ds1.h5 - exlite.h5 -) -add_test ( - NAME HL_FORTRAN_f90_ex-clear-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_FORTRAN_F90_EX_CLEANFILES} -) -set_tests_properties (HL_FORTRAN_f90_ex-clear-objects PROPERTIES - FIXTURES_SETUP clear_HL_FORTRAN_f90_ex - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} -) -add_test ( - NAME HL_FORTRAN_f90_ex-clean-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_FORTRAN_F90_EX_CLEANFILES} -) -set_tests_properties (HL_FORTRAN_f90_ex-clean-objects PROPERTIES - FIXTURES_CLEANUP clear_HL_FORTRAN_f90_ex - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} -) - -foreach (example ${examples}) - if (HDF5_USING_ANALYSIS_TOOL) - add_test (NAME HL_FORTRAN_f90_ex_${example} COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - else () - add_test (NAME HL_FORTRAN_f90_ex_${example} COMMAND "${CMAKE_COMMAND}" - -D "TEST_EMULATOR=${CMAKE_CROSSCOMPILING_EMULATOR}" - -D "TEST_PROGRAM=$" - -D "TEST_ARGS:STRING=" - -D "TEST_EXPECT=0" - -D "TEST_SKIP_COMPARE=TRUE" - -D "TEST_OUTPUT=hl_f90_ex_${example}.txt" - #-D "TEST_REFERENCE=hl_f90_ex_${example}.out" - -D "TEST_FOLDER=${PROJECT_BINARY_DIR}" - -P "${HDF_RESOURCES_DIR}/runTest.cmake" - ) - endif () - set_tests_properties (HL_FORTRAN_f90_ex_${example} PROPERTIES - FIXTURES_REQUIRED clear_HL_FORTRAN_f90_ex - WORKING_DIRECTORY ${PROJECT_BINARY_DIR} - ) -endforeach () diff --git a/hl/fortran/examples/Makefile.am b/hl/fortran/examples/Makefile.am deleted file mode 100644 index eda9e7da56e..00000000000 --- a/hl/fortran/examples/Makefile.am +++ /dev/null @@ -1,64 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -## -## Makefile.am -## Run automake to generate a Makefile.in from this file. -## -# -# HDF5-Fortran Examples Makefile(.in) -# - -include $(top_srcdir)/config/commence.am - -# Compile parallel fortran examples only if parallel is enabled -if BUILD_PARALLEL_CONDITIONAL - EXAMPLE_PROG_PARA= -endif - -# These are the programs that 'make all' or 'make tests' will build and -# that 'make check' will run. List them in the order in which they should -# be run. -# We don't tell automake about these programs so that it doesn't try to -# compile them with the regular fortran compiler. -EXAMPLE_PROG=exlite ex_ds1 -TEST_EXAMPLES_SCRIPT=$(INSTALL_SCRIPT_FILES) - -# List files to be installed here -INSTALL_FILES= exlite.f90 ex_ds1.f90 -INSTALL_SCRIPT_FILES = run-hlfortran-ex.sh - -# Mark this directory as part of the Fortran API (this affects output -# from tests in conclude.am) -FORTRAN_API=yes - -# Tell automake how to build examples using h5fc -if BUILD_PARALLEL_CONDITIONAL -$(EXTRA_PROG): $(H5FC_PP) - $(H5FC_PP) $(H5CCFLAGS) -o $@ $(srcdir)/$@.f90; -else -$(EXTRA_PROG): $(H5FC) - $(H5FC) $(H5CCFLAGS) -o $@ $(srcdir)/$@.f90; -endif - -# Tell automake how to install examples -# Note: no '/' after DESTDIR. Explanation in commence.am -EXAMPLEDIR=${DESTDIR}$(examplesdir)/hl/fortran -EXAMPLETOPDIR=${DESTDIR}$(examplesdir)/hl - -# List dependencies for each example. Normally, automake would take -# care of this for us, but if we tell automake about the programs it -# will try to build them with the normal C compiler, not h5cc. This is -# an inelegant way of solving the problem. -# All programs share the same build rule and a dependency on the main hdf5 -# and fortran libraries above. - -include $(top_srcdir)/config/examples.am -include $(top_srcdir)/config/conclude_fc.am diff --git a/hl/fortran/examples/run-hlfortran-ex.sh.in b/hl/fortran/examples/run-hlfortran-ex.sh.in deleted file mode 100644 index 83a61958271..00000000000 --- a/hl/fortran/examples/run-hlfortran-ex.sh.in +++ /dev/null @@ -1,84 +0,0 @@ -#! /bin/sh -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. - -# -# This file: run-hlfortran-ex.sh -# Written by: Larry Knox -# Date: May 11, 2010 -# -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # -# # -# This script will compile and run the fortran examples from source files # -# installed in @examplesdir@/hl/fortran using h5fc or h5pfc. The # -# order for running programs with RunTest in the MAIN section below is taken # -# from the Makefile. The order is important since some of the test programs # -# use data files created by earlier test programs. Any future additions should # -# be placed accordingly. # -# # -# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # - -# Initializations -EXIT_SUCCESS=0 -EXIT_FAILURE=1 - -# Where the tool is installed. -# default is relative path to installed location of the tools -prefix="${prefix:-@prefix@}" -PARALLEL=@PARALLEL@ # Am I in parallel mode? -AR="@AR@" -RANLIB="@RANLIB@" -if [ "$PARALLEL" = no ]; then - H5TOOL="h5fc" # The tool name -else - H5TOOL="h5pfc" # The tool name -fi -H5TOOL_BIN="${prefix}/bin/${H5TOOL}" # The path of the tool binary - -#### Run test #### -RunTest() -{ - TEST_EXEC=$1 - Test=$1".f90" - - echo - echo "################# $1 #################" - ${H5TOOL_BIN} -o $TEST_EXEC $Test - if [ $? -ne 0 ] - then - echo "messed up compiling $Test" - exit 1 - fi - ./$TEST_EXEC -} - - - -################## MAIN ################## - -# Run tests -if [ $? -eq 0 ] -then - if (RunTest exlite &&\ - rm exlite); then - EXIT_VALUE=${EXIT_SUCCESS} - else - EXIT_VALUE=${EXIT_FAILURE} - fi -fi - -# Cleanup -rm *.o -rm *.h5 -echo - -exit $EXIT_VALUE - diff --git a/hl/fortran/src/CMakeLists.txt b/hl/fortran/src/CMakeLists.txt index 60226c81ab1..649a9674d51 100644 --- a/hl/fortran/src/CMakeLists.txt +++ b/hl/fortran/src/CMakeLists.txt @@ -116,7 +116,6 @@ if (BUILD_STATIC_LIBS) BYPRODUCTS ${HDF5_HL_F90_BINARY_DIR}/static/H5LTff_gen.F90 ${HDF5_HL_F90_BINARY_DIR}/static/H5TBff_gen.F90 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ WORKING_DIRECTORY ${HDF5_HL_F90_BINARY_DIR}/static - DEPENDS ${HDF5_HL_F90_F_BASE_SOURCES} COMMENT "Generating the H5LTff_gen.F90, H5TBff_gen.F90 files" ) add_custom_target (H5HLgen ALL @@ -133,7 +132,6 @@ if (BUILD_SHARED_LIBS) BYPRODUCTS ${HDF5_HL_F90_BINARY_DIR}/shared/H5LTff_gen.F90 ${HDF5_HL_F90_BINARY_DIR}/shared/H5TBff_gen.F90 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ WORKING_DIRECTORY ${HDF5_HL_F90_BINARY_DIR}/shared - DEPENDS ${HDF5_HL_F90_F_BASE_SOURCES} COMMENT "Generating the H5LTff_gen.F90, H5TBff_gen.F90 shared files" ) add_custom_target (H5HLgenSH ALL diff --git a/hl/fortran/src/H5DOff.F90 b/hl/fortran/src/H5DOff.F90 index df4157cbaba..ce15aff7364 100644 --- a/hl/fortran/src/H5DOff.F90 +++ b/hl/fortran/src/H5DOff.F90 @@ -15,7 +15,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/src/H5DSfc.c b/hl/fortran/src/H5DSfc.c index 7b5dfe97cf9..0f5a0e6dd05 100644 --- a/hl/fortran/src/H5DSfc.c +++ b/hl/fortran/src/H5DSfc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/fortran/src/H5DSff.F90 b/hl/fortran/src/H5DSff.F90 index 8e238c595f4..673e64b1f58 100644 --- a/hl/fortran/src/H5DSff.F90 +++ b/hl/fortran/src/H5DSff.F90 @@ -15,7 +15,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/src/H5HL_buildiface.F90 b/hl/fortran/src/H5HL_buildiface.F90 index a556c9d4722..7ee123889a4 100644 --- a/hl/fortran/src/H5HL_buildiface.F90 +++ b/hl/fortran/src/H5HL_buildiface.F90 @@ -32,7 +32,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * @@ -108,7 +108,7 @@ PROGRAM H5HL_buildiface '! *',& '! This file is part of HDF5. The full HDF5 copyright notice, including *',& '! terms governing use, modification, and redistribution, is contained in *',& -'! the COPYING file, which can be found at the root of the source code *',& +'! the LICENSE file, which can be found at the root of the source code *',& '! distribution tree, or in https://www.hdfgroup.org/licenses. *',& '! If you do not have access to either file, you may request a copy from *',& '! help@hdfgroup.org. *',& @@ -576,7 +576,7 @@ PROGRAM H5HL_buildiface '! *',& '! This file is part of HDF5. The full HDF5 copyright notice, including *',& '! terms governing use, modification, and redistribution, is contained in *',& -'! the COPYING file, which can be found at the root of the source code *',& +'! the LICENSE file, which can be found at the root of the source code *',& '! distribution tree, or in https://www.hdfgroup.org/licenses. *',& '! If you do not have access to either file, you may request a copy from *',& '! help@hdfgroup.org. *',& diff --git a/hl/fortran/src/H5IMcc.c b/hl/fortran/src/H5IMcc.c index 055d52d6e80..8f323ee486a 100644 --- a/hl/fortran/src/H5IMcc.c +++ b/hl/fortran/src/H5IMcc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/fortran/src/H5IMcc.h b/hl/fortran/src/H5IMcc.h index 0b04e1f27b6..cf77d2b4c51 100644 --- a/hl/fortran/src/H5IMcc.h +++ b/hl/fortran/src/H5IMcc.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/fortran/src/H5IMfc.c b/hl/fortran/src/H5IMfc.c index 9d8baf2553a..4f013340932 100644 --- a/hl/fortran/src/H5IMfc.c +++ b/hl/fortran/src/H5IMfc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/fortran/src/H5IMff.F90 b/hl/fortran/src/H5IMff.F90 index 5354dd0ee9c..c93d5ea1823 100644 --- a/hl/fortran/src/H5IMff.F90 +++ b/hl/fortran/src/H5IMff.F90 @@ -15,7 +15,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/src/H5LTf90proto.h b/hl/fortran/src/H5LTf90proto.h index 997d3a0fd4e..9debdc96ae7 100644 --- a/hl/fortran/src/H5LTf90proto.h +++ b/hl/fortran/src/H5LTf90proto.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/fortran/src/H5LTfc.c b/hl/fortran/src/H5LTfc.c index b7f4540266f..916aa25da58 100644 --- a/hl/fortran/src/H5LTfc.c +++ b/hl/fortran/src/H5LTfc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/fortran/src/H5LTff.F90 b/hl/fortran/src/H5LTff.F90 index 80e9fe7e350..52b101514de 100644 --- a/hl/fortran/src/H5LTff.F90 +++ b/hl/fortran/src/H5LTff.F90 @@ -15,7 +15,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/src/H5TBfc.c b/hl/fortran/src/H5TBfc.c index d339def6f66..6b9ac578ee6 100644 --- a/hl/fortran/src/H5TBfc.c +++ b/hl/fortran/src/H5TBfc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/fortran/src/H5TBff.F90 b/hl/fortran/src/H5TBff.F90 index f4f8950850b..b2054f54baf 100644 --- a/hl/fortran/src/H5TBff.F90 +++ b/hl/fortran/src/H5TBff.F90 @@ -15,7 +15,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/src/Makefile.am b/hl/fortran/src/Makefile.am index eef7e8b4dc1..d48c4b04eb0 100644 --- a/hl/fortran/src/Makefile.am +++ b/hl/fortran/src/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/fortran/test/CMakeTests.cmake b/hl/fortran/test/CMakeTests.cmake index 84218728db6..3d325916bc1 100644 --- a/hl/fortran/test/CMakeTests.cmake +++ b/hl/fortran/test/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/fortran/test/Makefile.am b/hl/fortran/test/Makefile.am index adaa59db4cc..909055a8a83 100644 --- a/hl/fortran/test/Makefile.am +++ b/hl/fortran/test/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/fortran/test/tstds.F90 b/hl/fortran/test/tstds.F90 index 4027b1193d6..652fe52bad1 100644 --- a/hl/fortran/test/tstds.F90 +++ b/hl/fortran/test/tstds.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/test/tstimage.F90 b/hl/fortran/test/tstimage.F90 index fc3a43af41c..1991ed5f939 100644 --- a/hl/fortran/test/tstimage.F90 +++ b/hl/fortran/test/tstimage.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/test/tstlite.F90 b/hl/fortran/test/tstlite.F90 index b98bbe7a163..3b044732b90 100644 --- a/hl/fortran/test/tstlite.F90 +++ b/hl/fortran/test/tstlite.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/fortran/test/tsttable.F90 b/hl/fortran/test/tsttable.F90 index eb5f41c554a..6d566665dd1 100644 --- a/hl/fortran/test/tsttable.F90 +++ b/hl/fortran/test/tsttable.F90 @@ -4,7 +4,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/hl/src/H5DO.c b/hl/src/H5DO.c index 49786e2d8ac..5e72b2b2645 100644 --- a/hl/src/H5DO.c +++ b/hl/src/H5DO.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5DOpublic.h b/hl/src/H5DOpublic.h index b3ea31d67e1..ab6ad2ed96b 100644 --- a/hl/src/H5DOpublic.h +++ b/hl/src/H5DOpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -18,7 +18,216 @@ extern "C" { #endif /** \page H5DO_UG HDF5 High Level Optimizations - * @todo Under Construction + * Since version 1.10.3 these functions are deprecated in favor of #H5Dwrite_chunk and #H5Dread_chunk. + * + * \section sec_hldo_direct_chunk Direct Chunk Write Function + * When a user application has a chunked dataset and is trying to write a single chunk of data with + * #H5Dwrite, the data goes through several steps inside the HDF5 library. The library first examines the + * hyperslab selection. Then it converts the data from the datatype in memory to the datatype in the file if + * they are different. Finally, the library processes the data in the filter pipeline. Starting with + * the 1.8.11 release, a new high-level C function called #H5DOwrite_chunk becomes available. It writes a data + * chunk directly to the file bypassing the library’s hyperslab selection, data conversion, and filter + * pipeline processes. In other words, if an application can pre-process the data, then the application can + * use #H5DOwrite_chunk to write the data much faster. + * + * #H5DOwrite_chunk was developed in response to a client request. The client builds X-ray pixel + * detectors for use at synchrotron light sources. These detectors can produce data at the rate of tens of + * gigabytes per second. Before transferring the data over their network, the detectors compress the data + * by a factor of 10 or more. The modular architecture of the detectors can scale up its data stream in + * parallel and maps well to current parallel computing and storage systems. + * See the \ref_rfc20121114 for the original proposal. + * + * \subsection subsec_hldo_direct_chunk_using Using the Direct Chunk Write Function + * Basically, the #H5DOwrite_chunk function takes a pre-processed data chunk (buf) and its size + * (data_size) and writes to the chunk location (offset) in the dataset ( dset_id). + * + * The function prototype is shown below: + * \code + * herr_t H5DOwrite_chunk( + * hid_t dset_id, // the dataset + * hid_t dxpl_id, // data transfer property list + * uint32_t filter_mask, // indicates which filters are used + * hsize_t* offset, // position of the chunk + * size_t data_size, // size of the actual data + * const void* buf // buffer with data to be written + * ) + * \endcode + * + * Below is a simple example showing how to use the function: + * Example 1. Using H5DOwrite_chunk + * \code + * hsize_t offset[2] = {4, 4}; + * uint32_t filter_mask = 0; + * size_t nbytes = 40; + * if(H5DOwrite_chunk(dset_id, dxpl, filter_mask, offset, nbytes, data_buf) < 0) + * goto error; + * \endcode + * + * In the example above, the dataset is 8x8 elements of int. Each chunk is 4x4. The offset of the first + * element of the chunk to be written is 4 and 4. In the diagram below, the shaded chunk is the data to be + * written. The function is writing a pre-compressed data chunk of 40 bytes (assumed) to the dataset. The + * zero value of the filter mask means that all filters have been applied to the pre-processed data. + * + *
    Predefined Standard Datatypes
    C-style long double
    #H5T_NATIVE_FLOAT_COMPLEXC-style float _Complex (MSVC _Fcomplex) (May be H5I_INVALID_HID if platform doesn't support float _Complex / _Fcomplex type)
    #H5T_NATIVE_DOUBLE_COMPLEXC-style double _Complex (MSVC _Dcomplex) (May be H5I_INVALID_HID if platform doesn't support double _Complex / _Dcomplex type)
    #H5T_NATIVE_LDOUBLE_COMPLEXC-style long double _Complex (MSVC _Lcomplex) (May be H5I_INVALID_HID if platform doesn't support long double _Complex / _Lcomplex type)
    #H5T_NATIVE_B8 8-bit bitfield based on native types
    + * + * + * + *
    + * \image html DOChunks_fig1.png "Figure 1. Illustration of the chunk to be written" + *
    + * + * The complete code example at the end of this topic shows how to set the value of the filter mask to + * indicate a filter being skipped. The corresponding bit in the filter mask is turned on when a filter is + * skipped. For example, if the second filter is skipped, the second bit of the filter mask should be turned + * on. For more information, see the #H5DOwrite_chunk entry in the \ref RM. + * + * \subsection subsec_hldo_direct_chunk_design The Design + * The following diagram shows how the function #H5DOwrite_chunk bypasses hyperslab selection, data + * conversion, and filter pipeline inside the HDF5 library. + * + * + * + * + * + *
    + * \image html DOChunks_fig2.png "Figure 2. Diagram for H5DOwrite_chunk" + *
    + * + * \subsection subsec_hldo_direct_chunk_perf Performance + * The table below describes the results of performance benchmark tests run by HDF developers. It shows + * that using the new function #H5DOwrite_chunk to write pre-compressed data is much faster than using + * the #H5Dwrite function to compress and write the same data with the filter pipeline. Measurements + * involving #H5Dwrite include compression time in the filter pipeline. Since the data is already + * compressed before #H5DOwrite_chunk is called, use of #H5DOwrite_chunk to write compressed data + * avoids the performance bottleneck in the HDF5 filter pipeline. + * + * The test was run on a Linux 2.6.18 / 64-bit Intel x86_64 machine. The dataset contained 100 chunks. + * Only one chunk was written to the file per write call. The number of writes was 100. The time + * measurement was for the entire dataset with the Unix system function gettimeofday. Writing the + * entire dataset with one write call took almost the same amount of time as writing chunk by chunk. In + * order to force the system to flush the data to the file, the O_SYNC flag was used to open the file. + * + * Table 1. Performance result for H5DOwrite_chunk in the high-level library + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
    Dataset size (MB)95.37762.942288.82
    Size after compression (MB)64.14512.941538.81
    Dataset dimensionality100x1000x250100x2000x1000100x2000x3000
    Chunk dimensionality1000x2502000x10002000x3000
    Datatype4-byte integer4-byte integer4-byte + * integer
    IO speed is in MB/s and Time is in second + * (s).speed1time2speedtimespeedtime
    H5Dwrite writes without compression + * filter77.271.2397.027.8691.7724.94
    H5DOwrite_chunk writes uncompressed + * data791.2195.717.9789.1725.67
    H5Dwrite writes with compression + * filter2.6835.592.67285.752.67857.24
    H5DOwrite_chunk writes compressed + * data77.190.8378.566.5396.2815.98
    Unix writes compressed data to Unix + * file76.490.84955.498.5915.61
    + * + * \subsection subsec_hldo_direct_chunk_caution A Word of Caution + * Since #H5DOwrite_chunk writes data chunks directly in a file, developers must be careful when using it. + * The function bypasses hyperslab selection, the conversion of data from one datatype to another, and + * the filter pipeline to write the chunk. Developers should have experience with these processes before + * they use this function. + * + * \subsection subsec_hldo_direct_chunk_example A Complete Code Example + * The following is an example of using #H5DOwrite_chunk to write an entire dataset by chunk. + * \code + * #include + * #include + * #define DEFLATE_SIZE_ADJUST(s) (ceil(((double)(s))*1.001)+12) + * + * size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(int); + * const Bytef *z_src = (const Bytef*)(direct_buf); + * Bytef *z_dst; // destination buffer + * uLongf z_dst_nbytes = (uLongf)DEFLATE_SIZE_ADJUST(buf_size); + * uLong z_src_nbytes = (uLong)buf_size; + * int aggression = 9; // Compression aggression setting + * uint32_t filter_mask = 0; + * size_t buf_size = CHUNK_NX*CHUNK_NY*sizeof(int); + * + * // Create the data space + * if((dataspace = H5Screate_simple(RANK, dims, maxdims)) < 0) + * goto error; + * // Create a new file + * if((file = H5Fcreate(FILE_NAME5, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) + * goto error; + * // Modify dataset creation properties, i.e. enable chunking and compression + * if((cparms = H5Pcreate(H5P_DATASET_CREATE)) < 0) + * goto error; + * if((status = H5Pset_chunk( cparms, RANK, chunk_dims)) < 0) + * goto error; + * if((status = H5Pset_deflate( cparms, aggression)) < 0) + * goto error; + * // Create a new dataset within the file using cparms creation properties + * if((dset_id = H5Dcreate2(file, DATASETNAME, H5T_NATIVE_INT, dataspace, H5P_DEFAULT,cparms, + * H5P_DEFAULT)) < 0) goto error; + * // Initialize data for one chunk + * for(i = n = 0; i < CHUNK_NX; i++) + * for(j = 0; j < CHUNK_NY; j++) + * direct_buf[i][j] = n++; + * // Allocate output (compressed) buffer + * outbuf = malloc(z_dst_nbytes); + * z_dst = (Bytef *)outbuf; + * // Perform compression from the source to the destination buffer + * ret = compress2(z_dst, &z_dst_nbytes, z_src, z_src_nbytes, aggression); + * // Check for various zlib errors + * if(Z_BUF_ERROR == ret) { + * fprintf(stderr, "overflow"); + * goto error; + * } else if(Z_MEM_ERROR == ret) { + * fprintf(stderr, "deflate memory error"); + * goto error; + * } else if(Z_OK != ret) { + * fprintf(stderr, "other deflate error"); + * goto error; + * } + * // Write the compressed chunk data repeatedly to cover all the chunks in the dataset, using the direct + * write function. for(i=0; i - * Using the Direct Chunk Write Function + * using this function. Please see \ref H5DO_UG * for more information. * * \note H5DOread_chunk() and H5DOwrite_chunk() are not diff --git a/hl/src/H5DS.c b/hl/src/H5DS.c index 327c9c61e81..cb250f555df 100644 --- a/hl/src/H5DS.c +++ b/hl/src/H5DS.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5DSprivate.h b/hl/src/H5DSprivate.h index a172237be36..0aba9854be6 100644 --- a/hl/src/H5DSprivate.h +++ b/hl/src/H5DSprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5DSpublic.h b/hl/src/H5DSpublic.h index a7c9c9326a8..a926035a4c8 100644 --- a/hl/src/H5DSpublic.h +++ b/hl/src/H5DSpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5HLprivate2.h b/hl/src/H5HLprivate2.h index 2bd8d01917b..226c5a3eaa3 100644 --- a/hl/src/H5HLprivate2.h +++ b/hl/src/H5HLprivate2.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5IM.c b/hl/src/H5IM.c index b5476c6e93a..48433b43609 100644 --- a/hl/src/H5IM.c +++ b/hl/src/H5IM.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5IMprivate.h b/hl/src/H5IMprivate.h index 29d2669fbd8..4acc58e9f2d 100644 --- a/hl/src/H5IMprivate.h +++ b/hl/src/H5IMprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5IMpublic.h b/hl/src/H5IMpublic.h index bf219b73e46..4171ebcf18c 100644 --- a/hl/src/H5IMpublic.h +++ b/hl/src/H5IMpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5LD.c b/hl/src/H5LD.c index 6f140d01bc7..09a3d7815b2 100644 --- a/hl/src/H5LD.c +++ b/hl/src/H5LD.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5LDprivate.h b/hl/src/H5LDprivate.h index 639cdceb885..f6652a964f1 100644 --- a/hl/src/H5LDprivate.h +++ b/hl/src/H5LDprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5LDpublic.h b/hl/src/H5LDpublic.h index 1eee8b4f190..5c05c205466 100644 --- a/hl/src/H5LDpublic.h +++ b/hl/src/H5LDpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5LT.c b/hl/src/H5LT.c index 7b55cedeb3b..6457d8844d3 100644 --- a/hl/src/H5LT.c +++ b/hl/src/H5LT.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -2753,6 +2753,49 @@ H5LT_dtype_to_text(hid_t dtype, char *dt_str, H5LT_lang_t lang, size_t *slen, bo break; } + case H5T_COMPLEX: { + hid_t super; + size_t super_len; + char *stmp = NULL; + + /* Print lead-in */ + snprintf(dt_str, *slen, "H5T_COMPLEX {\n"); + indent += COL; + if (!(dt_str = indentation(indent + COL, dt_str, no_user_buf, slen))) + goto out; + + if ((super = H5Tget_super(dtype)) < 0) + goto out; + if (H5LTdtype_to_text(super, NULL, lang, &super_len) < 0) + goto out; + stmp = (char *)calloc(super_len, sizeof(char)); + if (H5LTdtype_to_text(super, stmp, lang, &super_len) < 0) { + free(stmp); + goto out; + } + if (!(dt_str = realloc_and_append(no_user_buf, slen, dt_str, stmp))) { + free(stmp); + goto out; + } + + if (stmp) + free(stmp); + stmp = NULL; + snprintf(tmp_str, TMP_LEN, "\n"); + if (!(dt_str = realloc_and_append(no_user_buf, slen, dt_str, tmp_str))) + goto out; + H5Tclose(super); + + /* Print closing */ + indent -= COL; + if (!(dt_str = indentation(indent + COL, dt_str, no_user_buf, slen))) + goto out; + snprintf(tmp_str, TMP_LEN, "}"); + if (!(dt_str = realloc_and_append(no_user_buf, slen, dt_str, tmp_str))) + goto out; + + break; + } case H5T_TIME: snprintf(dt_str, *slen, "H5T_TIME: not yet implemented"); break; diff --git a/hl/src/H5LTanalyze.c b/hl/src/H5LTanalyze.c index 3e6b20d322e..5ee4a2c3d47 100644 --- a/hl/src/H5LTanalyze.c +++ b/hl/src/H5LTanalyze.c @@ -24,8 +24,6 @@ #if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 600 #pragma GCC diagnostic ignored "-Wnull-dereference" #endif -#elif defined __SUNPRO_CC -#pragma disable_warn #elif defined _MSC_VER #pragma warning(push, 1) #endif @@ -647,8 +645,8 @@ static void yynoreturn yy_fatal_error ( const char* msg ); (yy_hold_char) = *yy_cp; \ *yy_cp = '\0'; \ (yy_c_buf_p) = yy_cp; -#define YY_NUM_RULES 67 -#define YY_END_OF_BUFFER 68 +#define YY_NUM_RULES 77 +#define YY_END_OF_BUFFER 78 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info @@ -656,39 +654,45 @@ struct yy_trans_info flex_int32_t yy_verify; flex_int32_t yy_nxt; }; -static const flex_int16_t yy_accept[283] = +static const flex_int16_t yy_accept[335] = { 0, - 66, 66, 68, 67, 66, 67, 58, 64, 65, 67, - 67, 67, 67, 62, 63, 60, 61, 66, 0, 58, - 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, - 0, 41, 0, 0, 0, 0, 0, 42, 0, 0, + 76, 76, 78, 77, 76, 77, 68, 74, 75, 77, + 77, 77, 77, 72, 73, 70, 71, 76, 0, 68, + 0, 0, 0, 0, 0, 69, 0, 0, 0, 0, + 0, 50, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 57, 39, 0, 0, 0, 48, 52, 0, 0, - 0, 0, 0, 0, 0, 0, 54, 56, 53, 0, + 0, 67, 48, 0, 0, 0, 57, 61, 0, 0, + 0, 0, 0, 0, 0, 0, 63, 66, 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, - 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 65, + 0, 0, 0, 0, 0, 0, 0, 0, 47, 0, + 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 51, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 0, 0, 0, + 0, 0, 0, 9, 10, 0, 0, 59, 0, 0, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 2, 0, 0, 0, 0, 0, 0, 9, - 10, 0, 0, 50, 0, 47, 0, 0, 0, 0, + 0, 3, 4, 5, 6, 7, 8, 11, 12, 13, + 14, 15, 16, 0, 0, 0, 0, 55, 58, 28, + 29, 30, 31, 32, 33, 0, 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 17, 0, 0, 0, 0, 24, 0, + 0, 0, 23, 0, 0, 0, 53, 0, 0, 0, + 0, 35, 0, 26, 18, 20, 19, 0, 25, 0, + 52, 54, 0, 36, 0, 0, 0, 27, 21, 0, + 0, 34, 0, 37, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 3, 4, 5, 6, - 7, 8, 11, 12, 13, 14, 15, 16, 0, 0, - 0, 46, 49, 28, 29, 30, 31, 32, 33, 0, - 0, 0, 22, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 17, 0, 0, 0, - 0, 24, 0, 0, 0, 23, 0, 0, 0, 44, - 0, 0, 0, 35, 0, 26, 18, 20, 19, 0, - 25, 0, 43, 45, 36, 0, 0, 27, 21, 34, - 37, 0 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 38, 39, 40, 41, 42, + 43, 0, 0, 0, 0, 0, 0, 0, 44, 0, + 45, 0, 46, 0 } ; static const YY_CHAR yy_ec[256] = @@ -701,12 +705,12 @@ static const YY_CHAR yy_ec[256] = 7, 8, 9, 10, 4, 11, 4, 12, 13, 1, 1, 1, 1, 1, 14, 15, 16, 17, 18, 19, 20, 21, 22, 1, 1, 23, 24, 25, 26, 27, - 28, 29, 30, 31, 32, 33, 1, 1, 34, 35, - 36, 1, 37, 1, 38, 1, 1, 1, 1, 1, + 28, 29, 30, 31, 32, 33, 1, 34, 35, 36, + 37, 1, 38, 1, 39, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 39, 1, 40, 1, 1, 1, 1, 1, + 1, 1, 40, 1, 41, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, @@ -723,166 +727,193 @@ static const YY_CHAR yy_ec[256] = 1, 1, 1, 1, 1 } ; -static const YY_CHAR yy_meta[41] = +static const YY_CHAR yy_meta[42] = { 0, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1 } ; -static const flex_int16_t yy_base[285] = +static const flex_int16_t yy_base[337] = { 0, - 0, 0, 307, 308, 304, 0, 0, 308, 308, 11, - 296, 277, 272, 308, 308, 308, 308, 300, 298, 0, - 282, 265, 267, 269, 267, 308, 264, 267, 255, 254, - 16, 308, 273, 33, 14, 276, 267, 308, 259, 24, - 262, 260, 267, 270, 256, 251, 34, 259, 266, 262, - 243, 248, 252, 257, 244, 241, 243, 253, 239, 255, - 36, 239, 249, 231, 245, 308, 246, 249, 235, 230, - 255, 235, 227, 239, 234, 227, 216, 34, 231, 227, - 233, 308, 308, 216, 223, 210, 308, 308, 218, 208, - 212, 212, 38, 218, 39, 228, 308, 308, 308, 209, - - 47, 226, 220, 220, 219, 66, 73, 216, 203, 207, - 218, 207, 201, 199, 204, 80, 190, 308, 217, 220, - 217, 52, 214, 217, 214, 59, 308, 198, 206, 196, - 201, 201, 197, 177, 204, 207, 204, 75, 66, 73, - 78, 193, 192, 80, 85, 87, 191, 190, 184, 190, - 187, 308, 182, 192, 172, 89, 91, 94, 180, 174, - 176, 173, 96, 95, 102, 179, 178, 177, 176, 175, - 174, 308, 308, 173, 172, 171, 170, 169, 168, 308, - 308, 96, 167, 308, 162, 308, 178, 164, 163, 162, - 161, 160, 159, 162, 143, 148, 142, 146, 145, 145, - - 148, 142, 146, 141, 103, 144, 308, 308, 308, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 150, 145, - 135, 308, 308, 308, 308, 308, 308, 308, 308, 132, - 145, 145, 308, 126, 132, 136, 141, 125, 139, 121, - 125, 125, 123, 131, 118, 132, 308, 122, 113, 128, - 122, 308, 112, 109, 110, 308, 113, 117, 107, 308, - 110, 114, 112, 123, 98, 308, 308, 308, 308, 100, - 308, 84, 308, 308, 308, 89, 68, 308, 308, 308, - 308, 308, 132, 65 + 0, 0, 360, 361, 357, 0, 0, 361, 361, 12, + 349, 330, 325, 361, 361, 361, 361, 353, 351, 0, + 335, 317, 320, 322, 320, 361, 317, 320, 307, 306, + 17, 361, 326, 34, 15, 329, 320, 361, 312, 31, + 315, 313, 320, 323, 309, 304, 35, 312, 319, 315, + 295, 301, 305, 310, 297, 294, 296, 306, 292, 308, + 34, 292, 302, 283, 298, 361, 299, 302, 288, 283, + 308, 288, 280, 292, 287, 280, 268, 32, 284, 280, + 286, 361, 361, 268, 39, 263, 361, 361, 272, 261, + 266, 266, 44, 272, 43, 282, 361, 361, 361, 277, + + 262, 55, 279, 273, 273, 272, 67, 74, 269, 256, + 260, 271, 251, 259, 253, 251, 256, 81, 241, 361, + 269, 272, 269, 60, 266, 269, 266, 67, 361, 250, + 258, 248, 231, 252, 252, 248, 227, 255, 258, 255, + 76, 74, 79, 81, 244, 243, 86, 88, 90, 242, + 241, 235, 241, 238, 233, 361, 232, 242, 222, 92, + 95, 97, 230, 224, 226, 223, 99, 98, 101, 229, + 228, 227, 226, 225, 224, 361, 361, 223, 222, 221, + 220, 219, 218, 361, 361, 99, 217, 361, 216, 211, + 361, 227, 213, 212, 211, 210, 209, 208, 211, 192, + + 197, 191, 195, 194, 194, 197, 191, 195, 190, 106, + 193, 361, 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 199, 194, 184, 192, 361, 361, 361, + 361, 361, 361, 361, 361, 180, 193, 193, 361, 174, + 180, 184, 189, 173, 187, 169, 173, 173, 171, 179, + 166, 180, 175, 361, 169, 160, 175, 169, 361, 159, + 156, 157, 361, 160, 164, 154, 361, 158, 164, 141, + 161, 95, 155, 361, 361, 361, 361, 157, 361, 145, + 361, 361, 156, 135, 163, 156, 153, 361, 361, 128, + 154, 361, 143, 129, 157, 160, 157, 138, 139, 146, + + 113, 122, 124, 137, 133, 133, 140, 139, 138, 137, + 136, 135, 125, 128, 125, 361, 361, 361, 361, 361, + 361, 123, 126, 116, 124, 107, 117, 93, 361, 103, + 361, 46, 361, 361, 147, 52 } ; -static const flex_int16_t yy_def[285] = +static const flex_int16_t yy_def[337] = { 0, - 282, 1, 282, 282, 282, 283, 284, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 283, 284, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 0, 282, 282 + 334, 1, 334, 334, 334, 335, 336, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 335, 336, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 0, 334, 334 } ; -static const flex_int16_t yy_nxt[349] = +static const flex_int16_t yy_nxt[403] = { 0, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 9, 4, 4, 10, 4, 4, 4, 4, 11, 4, 4, 4, 4, 12, 4, 4, 4, 13, - 4, 4, 4, 4, 4, 14, 15, 4, 16, 17, - 21, 22, 36, 48, 49, 37, 39, 62, 40, 53, - 41, 42, 77, 54, 43, 94, 63, 44, 45, 106, - 113, 55, 46, 109, 78, 47, 142, 20, 110, 107, - 119, 95, 120, 147, 143, 121, 122, 123, 114, 124, - 166, 148, 125, 126, 135, 281, 136, 168, 167, 137, - 159, 160, 170, 161, 174, 169, 162, 163, 280, 176, - - 171, 178, 175, 188, 164, 190, 165, 177, 192, 179, - 201, 189, 198, 191, 279, 202, 193, 203, 199, 278, - 277, 200, 219, 204, 205, 241, 220, 276, 242, 275, - 274, 206, 19, 273, 19, 272, 271, 270, 269, 268, - 267, 266, 265, 264, 263, 262, 261, 260, 259, 258, - 257, 256, 255, 254, 253, 252, 251, 250, 249, 248, - 247, 246, 245, 244, 243, 240, 239, 238, 237, 236, - 235, 234, 233, 232, 231, 230, 229, 228, 227, 226, - 225, 224, 223, 222, 221, 218, 217, 216, 215, 214, - 213, 212, 211, 210, 209, 208, 207, 197, 196, 195, - - 194, 187, 186, 185, 184, 183, 182, 181, 180, 173, - 172, 158, 157, 156, 155, 154, 153, 152, 151, 150, - 149, 146, 145, 144, 141, 140, 139, 138, 134, 133, - 132, 131, 130, 129, 128, 127, 118, 117, 116, 115, - 112, 111, 108, 105, 104, 103, 102, 101, 100, 99, - 98, 97, 96, 93, 92, 91, 90, 89, 88, 87, - 86, 85, 84, 83, 82, 81, 80, 79, 76, 75, - 74, 73, 72, 71, 70, 69, 68, 67, 66, 65, - 64, 61, 60, 59, 58, 57, 56, 52, 51, 50, - 38, 35, 34, 33, 32, 31, 30, 29, 28, 27, - - 26, 18, 25, 24, 23, 18, 282, 3, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282 + 4, 4, 4, 4, 4, 4, 14, 15, 4, 16, + 17, 21, 22, 36, 48, 49, 37, 39, 62, 40, + 77, 41, 42, 94, 20, 43, 53, 63, 44, 45, + 54, 100, 78, 46, 101, 107, 47, 110, 115, 55, + 95, 121, 111, 122, 145, 108, 123, 124, 125, 333, + 126, 150, 146, 127, 128, 138, 116, 139, 170, 151, + 140, 163, 164, 172, 165, 174, 171, 166, 167, 285, + + 178, 173, 180, 175, 182, 168, 193, 169, 179, 195, + 181, 197, 183, 206, 194, 203, 208, 196, 207, 198, + 332, 204, 209, 210, 205, 224, 331, 307, 247, 225, + 211, 248, 295, 286, 296, 308, 309, 297, 311, 330, + 329, 328, 327, 326, 310, 325, 312, 19, 324, 19, + 323, 322, 321, 320, 319, 318, 317, 316, 315, 314, + 313, 306, 305, 304, 303, 302, 301, 300, 299, 298, + 294, 293, 292, 291, 290, 289, 288, 287, 284, 283, + 282, 281, 280, 279, 278, 277, 276, 275, 274, 273, + 272, 271, 270, 269, 268, 267, 266, 265, 264, 263, + + 262, 261, 260, 259, 258, 257, 256, 255, 254, 253, + 252, 251, 250, 249, 246, 245, 244, 243, 242, 241, + 240, 239, 238, 237, 236, 235, 234, 233, 232, 231, + 230, 229, 228, 227, 226, 223, 222, 221, 220, 219, + 218, 217, 216, 215, 214, 213, 212, 202, 201, 200, + 199, 192, 191, 190, 189, 188, 187, 186, 185, 184, + 177, 176, 162, 161, 160, 159, 158, 157, 156, 155, + 154, 153, 152, 149, 148, 147, 144, 143, 142, 141, + 137, 136, 135, 134, 133, 132, 131, 130, 129, 120, + 119, 118, 117, 114, 113, 112, 109, 106, 105, 104, + + 103, 102, 99, 98, 97, 96, 93, 92, 91, 90, + 89, 88, 87, 86, 85, 84, 83, 82, 81, 80, + 79, 76, 75, 74, 73, 72, 71, 70, 69, 68, + 67, 66, 65, 64, 61, 60, 59, 58, 57, 56, + 52, 51, 50, 38, 35, 34, 33, 32, 31, 30, + 29, 28, 27, 26, 18, 25, 24, 23, 18, 334, + 3, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + + 334, 334 } ; -static const flex_int16_t yy_chk[349] = +static const flex_int16_t yy_chk[403] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 10, 10, 31, 35, 35, 31, 34, 47, 34, 40, - 34, 34, 61, 40, 34, 78, 47, 34, 34, 93, - 101, 40, 34, 95, 61, 34, 122, 284, 95, 93, - 106, 78, 106, 126, 122, 106, 106, 107, 101, 107, - 139, 126, 107, 107, 116, 277, 116, 140, 139, 116, - 138, 138, 141, 138, 144, 140, 138, 138, 276, 145, - - 141, 146, 144, 156, 138, 157, 138, 145, 158, 146, - 164, 156, 163, 157, 272, 164, 158, 165, 163, 270, - 265, 163, 182, 165, 165, 205, 182, 264, 205, 263, - 262, 165, 283, 261, 283, 259, 258, 257, 255, 254, - 253, 251, 250, 249, 248, 246, 245, 244, 243, 242, - 241, 240, 239, 238, 237, 236, 235, 234, 232, 231, - 230, 221, 220, 219, 206, 204, 203, 202, 201, 200, - 199, 198, 197, 196, 195, 194, 193, 192, 191, 190, - 189, 188, 187, 185, 183, 179, 178, 177, 176, 175, - 174, 171, 170, 169, 168, 167, 166, 162, 161, 160, - - 159, 155, 154, 153, 151, 150, 149, 148, 147, 143, - 142, 137, 136, 135, 134, 133, 132, 131, 130, 129, - 128, 125, 124, 123, 121, 120, 119, 117, 115, 114, - 113, 112, 111, 110, 109, 108, 105, 104, 103, 102, - 100, 96, 94, 92, 91, 90, 89, 86, 85, 84, - 81, 80, 79, 77, 76, 75, 74, 73, 72, 71, - 70, 69, 68, 67, 65, 64, 63, 62, 60, 59, - 58, 57, 56, 55, 54, 53, 52, 51, 50, 49, - 48, 46, 45, 44, 43, 42, 41, 39, 37, 36, - 33, 30, 29, 28, 27, 25, 24, 23, 22, 21, - - 19, 18, 13, 12, 11, 5, 3, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, - 282, 282, 282, 282, 282, 282, 282, 282 + 1, 10, 10, 31, 35, 35, 31, 34, 47, 34, + 61, 34, 34, 78, 336, 34, 40, 47, 34, 34, + 40, 85, 61, 34, 85, 93, 34, 95, 102, 40, + 78, 107, 95, 107, 124, 93, 107, 107, 108, 332, + 108, 128, 124, 108, 108, 118, 102, 118, 142, 128, + 118, 141, 141, 143, 141, 144, 142, 141, 141, 272, + + 147, 143, 148, 144, 149, 141, 160, 141, 147, 161, + 148, 162, 149, 168, 160, 167, 169, 161, 168, 162, + 330, 167, 169, 169, 167, 186, 328, 301, 210, 186, + 169, 210, 290, 272, 290, 301, 302, 290, 303, 327, + 326, 325, 324, 323, 302, 322, 303, 335, 315, 335, + 314, 313, 312, 311, 310, 309, 308, 307, 306, 305, + 304, 300, 299, 298, 297, 296, 295, 294, 293, 291, + 287, 286, 285, 284, 283, 280, 278, 273, 271, 270, + 269, 268, 266, 265, 264, 262, 261, 260, 258, 257, + 256, 255, 253, 252, 251, 250, 249, 248, 247, 246, + + 245, 244, 243, 242, 241, 240, 238, 237, 236, 227, + 226, 225, 224, 211, 209, 208, 207, 206, 205, 204, + 203, 202, 201, 200, 199, 198, 197, 196, 195, 194, + 193, 192, 190, 189, 187, 183, 182, 181, 180, 179, + 178, 175, 174, 173, 172, 171, 170, 166, 165, 164, + 163, 159, 158, 157, 155, 154, 153, 152, 151, 150, + 146, 145, 140, 139, 138, 137, 136, 135, 134, 133, + 132, 131, 130, 127, 126, 125, 123, 122, 121, 119, + 117, 116, 115, 114, 113, 112, 111, 110, 109, 106, + 105, 104, 103, 101, 100, 96, 94, 92, 91, 90, + + 89, 86, 84, 81, 80, 79, 77, 76, 75, 74, + 73, 72, 71, 70, 69, 68, 67, 65, 64, 63, + 62, 60, 59, 58, 57, 56, 55, 54, 53, 52, + 51, 50, 49, 48, 46, 45, 44, 43, 42, 41, + 39, 37, 36, 33, 30, 29, 28, 27, 25, 24, + 23, 22, 21, 19, 18, 13, 12, 11, 5, 3, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + 334, 334, 334, 334, 334, 334, 334, 334, 334, 334, + + 334, 334 } ; static yy_state_type yy_last_accepting_state; @@ -906,7 +937,7 @@ char *yytext; * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -941,8 +972,8 @@ static int my_yyinput(char *, int); extern char *myinput; extern size_t input_len; -#line 913 "hl/src//H5LTanalyze.c" -#line 914 "hl/src//H5LTanalyze.c" +#line 946 "hl/src//H5LTanalyze.c" +#line 947 "hl/src//H5LTanalyze.c" #define INITIAL 0 @@ -1154,7 +1185,7 @@ YY_DECL #line 53 "hl/src//H5LTanalyze.l" -#line 1126 "hl/src//H5LTanalyze.c" +#line 1159 "hl/src//H5LTanalyze.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -1181,13 +1212,13 @@ YY_DECL while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 283 ) + if ( yy_current_state >= 335 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } - while ( yy_base[yy_current_state] != 308 ); + while ( yy_base[yy_current_state] != 361 ); yy_find_action: yy_act = yy_accept[yy_current_state]; @@ -1399,162 +1430,212 @@ YY_RULE_SETUP case 38: YY_RULE_SETUP #line 96 "hl/src//H5LTanalyze.l" -{return token(H5T_STRING_TOKEN);} +{return hid(H5T_COMPLEX_IEEE_F16BE_TOKEN);} YY_BREAK case 39: YY_RULE_SETUP #line 97 "hl/src//H5LTanalyze.l" -{return token(STRSIZE_TOKEN);} +{return hid(H5T_COMPLEX_IEEE_F16LE_TOKEN);} YY_BREAK case 40: YY_RULE_SETUP #line 98 "hl/src//H5LTanalyze.l" -{return token(STRPAD_TOKEN);} +{return hid(H5T_COMPLEX_IEEE_F32BE_TOKEN);} YY_BREAK case 41: YY_RULE_SETUP #line 99 "hl/src//H5LTanalyze.l" -{return token(CSET_TOKEN);} +{return hid(H5T_COMPLEX_IEEE_F32LE_TOKEN);} YY_BREAK case 42: YY_RULE_SETUP #line 100 "hl/src//H5LTanalyze.l" -{return token(CTYPE_TOKEN);} +{return hid(H5T_COMPLEX_IEEE_F64BE_TOKEN);} YY_BREAK case 43: YY_RULE_SETUP #line 101 "hl/src//H5LTanalyze.l" -{return token(H5T_STR_NULLTERM_TOKEN);} +{return hid(H5T_COMPLEX_IEEE_F64LE_TOKEN);} YY_BREAK case 44: YY_RULE_SETUP #line 102 "hl/src//H5LTanalyze.l" -{return token(H5T_STR_NULLPAD_TOKEN);} +{return hid(H5T_NATIVE_FLOAT_COMPLEX_TOKEN);} YY_BREAK case 45: YY_RULE_SETUP #line 103 "hl/src//H5LTanalyze.l" -{return token(H5T_STR_SPACEPAD_TOKEN);} +{return hid(H5T_NATIVE_DOUBLE_COMPLEX_TOKEN);} YY_BREAK case 46: YY_RULE_SETUP #line 104 "hl/src//H5LTanalyze.l" -{return token(H5T_CSET_ASCII_TOKEN);} +{return hid(H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN);} YY_BREAK case 47: YY_RULE_SETUP -#line 105 "hl/src//H5LTanalyze.l" -{return token(H5T_CSET_UTF8_TOKEN);} +#line 106 "hl/src//H5LTanalyze.l" +{return token(H5T_STRING_TOKEN);} YY_BREAK case 48: YY_RULE_SETUP -#line 106 "hl/src//H5LTanalyze.l" -{return token(H5T_C_S1_TOKEN);} +#line 107 "hl/src//H5LTanalyze.l" +{return token(STRSIZE_TOKEN);} YY_BREAK case 49: YY_RULE_SETUP -#line 107 "hl/src//H5LTanalyze.l" -{return token(H5T_FORTRAN_S1_TOKEN);} +#line 108 "hl/src//H5LTanalyze.l" +{return token(STRPAD_TOKEN);} YY_BREAK case 50: YY_RULE_SETUP -#line 108 "hl/src//H5LTanalyze.l" -{return token(H5T_VARIABLE_TOKEN);} +#line 109 "hl/src//H5LTanalyze.l" +{return token(CSET_TOKEN);} YY_BREAK case 51: YY_RULE_SETUP #line 110 "hl/src//H5LTanalyze.l" -{return token(H5T_COMPOUND_TOKEN);} +{return token(CTYPE_TOKEN);} YY_BREAK case 52: YY_RULE_SETUP #line 111 "hl/src//H5LTanalyze.l" -{return token(H5T_ENUM_TOKEN);} +{return token(H5T_STR_NULLTERM_TOKEN);} YY_BREAK case 53: YY_RULE_SETUP #line 112 "hl/src//H5LTanalyze.l" -{return token(H5T_ARRAY_TOKEN);} +{return token(H5T_STR_NULLPAD_TOKEN);} YY_BREAK case 54: YY_RULE_SETUP #line 113 "hl/src//H5LTanalyze.l" -{return token(H5T_VLEN_TOKEN);} +{return token(H5T_STR_SPACEPAD_TOKEN);} YY_BREAK case 55: YY_RULE_SETUP -#line 115 "hl/src//H5LTanalyze.l" -{return token(H5T_OPAQUE_TOKEN);} +#line 114 "hl/src//H5LTanalyze.l" +{return token(H5T_CSET_ASCII_TOKEN);} YY_BREAK case 56: YY_RULE_SETUP -#line 116 "hl/src//H5LTanalyze.l" -{return token(OPQ_SIZE_TOKEN);} +#line 115 "hl/src//H5LTanalyze.l" +{return token(H5T_CSET_UTF8_TOKEN);} YY_BREAK case 57: YY_RULE_SETUP +#line 116 "hl/src//H5LTanalyze.l" +{return token(H5T_C_S1_TOKEN);} + YY_BREAK +case 58: +YY_RULE_SETUP #line 117 "hl/src//H5LTanalyze.l" +{return token(H5T_FORTRAN_S1_TOKEN);} + YY_BREAK +case 59: +YY_RULE_SETUP +#line 118 "hl/src//H5LTanalyze.l" +{return token(H5T_VARIABLE_TOKEN);} + YY_BREAK +case 60: +YY_RULE_SETUP +#line 120 "hl/src//H5LTanalyze.l" +{return token(H5T_COMPOUND_TOKEN);} + YY_BREAK +case 61: +YY_RULE_SETUP +#line 121 "hl/src//H5LTanalyze.l" +{return token(H5T_ENUM_TOKEN);} + YY_BREAK +case 62: +YY_RULE_SETUP +#line 122 "hl/src//H5LTanalyze.l" +{return token(H5T_ARRAY_TOKEN);} + YY_BREAK +case 63: +YY_RULE_SETUP +#line 123 "hl/src//H5LTanalyze.l" +{return token(H5T_VLEN_TOKEN);} + YY_BREAK +case 64: +YY_RULE_SETUP +#line 124 "hl/src//H5LTanalyze.l" +{return token(H5T_COMPLEX_TOKEN);} + YY_BREAK +case 65: +YY_RULE_SETUP +#line 126 "hl/src//H5LTanalyze.l" +{return token(H5T_OPAQUE_TOKEN);} + YY_BREAK +case 66: +YY_RULE_SETUP +#line 127 "hl/src//H5LTanalyze.l" +{return token(OPQ_SIZE_TOKEN);} + YY_BREAK +case 67: +YY_RULE_SETUP +#line 128 "hl/src//H5LTanalyze.l" {return token(OPQ_TAG_TOKEN);} YY_BREAK -case 58: +case 68: YY_RULE_SETUP -#line 119 "hl/src//H5LTanalyze.l" +#line 130 "hl/src//H5LTanalyze.l" { H5LTyylval.ival = atoi(yytext); return NUMBER; } YY_BREAK -case 59: -/* rule 59 can match eol */ +case 69: +/* rule 69 can match eol */ YY_RULE_SETUP -#line 124 "hl/src//H5LTanalyze.l" +#line 135 "hl/src//H5LTanalyze.l" { H5LTyylval.sval = trim_quotes(yytext); return STRING; } YY_BREAK -case 60: +case 70: YY_RULE_SETUP -#line 129 "hl/src//H5LTanalyze.l" +#line 140 "hl/src//H5LTanalyze.l" {return token('{');} YY_BREAK -case 61: +case 71: YY_RULE_SETUP -#line 130 "hl/src//H5LTanalyze.l" +#line 141 "hl/src//H5LTanalyze.l" {return token('}');} YY_BREAK -case 62: +case 72: YY_RULE_SETUP -#line 131 "hl/src//H5LTanalyze.l" +#line 142 "hl/src//H5LTanalyze.l" {return token('[');} YY_BREAK -case 63: +case 73: YY_RULE_SETUP -#line 132 "hl/src//H5LTanalyze.l" +#line 143 "hl/src//H5LTanalyze.l" {return token(']');} YY_BREAK -case 64: +case 74: YY_RULE_SETUP -#line 133 "hl/src//H5LTanalyze.l" +#line 144 "hl/src//H5LTanalyze.l" {return token(':');} YY_BREAK -case 65: +case 75: YY_RULE_SETUP -#line 134 "hl/src//H5LTanalyze.l" +#line 145 "hl/src//H5LTanalyze.l" {return token(';');} YY_BREAK -case 66: -/* rule 66 can match eol */ +case 76: +/* rule 76 can match eol */ YY_RULE_SETUP -#line 135 "hl/src//H5LTanalyze.l" +#line 146 "hl/src//H5LTanalyze.l" ; YY_BREAK -case 67: +case 77: YY_RULE_SETUP -#line 137 "hl/src//H5LTanalyze.l" +#line 148 "hl/src//H5LTanalyze.l" ECHO; YY_BREAK -#line 1526 "hl/src//H5LTanalyze.c" +#line 1609 "hl/src//H5LTanalyze.c" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -1851,7 +1932,7 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 283 ) + if ( yy_current_state >= 335 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; @@ -1879,11 +1960,11 @@ static int yy_get_next_buffer (void) while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; - if ( yy_current_state >= 283 ) + if ( yy_current_state >= 335 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; - yy_is_jam = (yy_current_state == 282); + yy_is_jam = (yy_current_state == 334); return yy_is_jam ? 0 : yy_current_state; } @@ -2559,7 +2640,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 137 "hl/src//H5LTanalyze.l" +#line 148 "hl/src//H5LTanalyze.l" /* Allocate a copy of `quoted` with the double quote character at diff --git a/hl/src/H5LTanalyze.l b/hl/src/H5LTanalyze.l index a573f8137f3..84b0a61f03a 100644 --- a/hl/src/H5LTanalyze.l +++ b/hl/src/H5LTanalyze.l @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -93,6 +93,16 @@ H5T_NATIVE_FLOAT {return hid(H5T_NATIVE_FLOAT_TOKEN);} H5T_NATIVE_DOUBLE {return hid(H5T_NATIVE_DOUBLE_TOKEN);} H5T_NATIVE_LDOUBLE {return hid(H5T_NATIVE_LDOUBLE_TOKEN);} +H5T_COMPLEX_IEEE_F16BE {return hid(H5T_COMPLEX_IEEE_F16BE_TOKEN);} +H5T_COMPLEX_IEEE_F16LE {return hid(H5T_COMPLEX_IEEE_F16LE_TOKEN);} +H5T_COMPLEX_IEEE_F32BE {return hid(H5T_COMPLEX_IEEE_F32BE_TOKEN);} +H5T_COMPLEX_IEEE_F32LE {return hid(H5T_COMPLEX_IEEE_F32LE_TOKEN);} +H5T_COMPLEX_IEEE_F64BE {return hid(H5T_COMPLEX_IEEE_F64BE_TOKEN);} +H5T_COMPLEX_IEEE_F64LE {return hid(H5T_COMPLEX_IEEE_F64LE_TOKEN);} +H5T_NATIVE_FLOAT_COMPLEX {return hid(H5T_NATIVE_FLOAT_COMPLEX_TOKEN);} +H5T_NATIVE_DOUBLE_COMPLEX {return hid(H5T_NATIVE_DOUBLE_COMPLEX_TOKEN);} +H5T_NATIVE_LDOUBLE_COMPLEX {return hid(H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN);} + H5T_STRING {return token(H5T_STRING_TOKEN);} STRSIZE {return token(STRSIZE_TOKEN);} STRPAD {return token(STRPAD_TOKEN);} @@ -111,6 +121,7 @@ H5T_COMPOUND {return token(H5T_COMPOUND_TOKEN);} H5T_ENUM {return token(H5T_ENUM_TOKEN);} H5T_ARRAY {return token(H5T_ARRAY_TOKEN);} H5T_VLEN {return token(H5T_VLEN_TOKEN);} +H5T_COMPLEX {return token(H5T_COMPLEX_TOKEN);} H5T_OPAQUE {return token(H5T_OPAQUE_TOKEN);} OPQ_SIZE {return token(OPQ_SIZE_TOKEN);} diff --git a/hl/src/H5LTparse.c b/hl/src/H5LTparse.c index bb7137630a5..df2b4d04d25 100644 --- a/hl/src/H5LTparse.c +++ b/hl/src/H5LTparse.c @@ -24,8 +24,6 @@ #if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 600 #pragma GCC diagnostic ignored "-Wnull-dereference" #endif -#elif defined __SUNPRO_CC -#pragma disable_warn #elif defined _MSC_VER #pragma warning(push, 1) #endif @@ -223,77 +221,88 @@ enum yysymbol_kind_t YYSYMBOL_H5T_NATIVE_FLOAT_TOKEN = 37, /* H5T_NATIVE_FLOAT_TOKEN */ YYSYMBOL_H5T_NATIVE_DOUBLE_TOKEN = 38, /* H5T_NATIVE_DOUBLE_TOKEN */ YYSYMBOL_H5T_NATIVE_LDOUBLE_TOKEN = 39, /* H5T_NATIVE_LDOUBLE_TOKEN */ - YYSYMBOL_H5T_STRING_TOKEN = 40, /* H5T_STRING_TOKEN */ - YYSYMBOL_STRSIZE_TOKEN = 41, /* STRSIZE_TOKEN */ - YYSYMBOL_STRPAD_TOKEN = 42, /* STRPAD_TOKEN */ - YYSYMBOL_CSET_TOKEN = 43, /* CSET_TOKEN */ - YYSYMBOL_CTYPE_TOKEN = 44, /* CTYPE_TOKEN */ - YYSYMBOL_H5T_VARIABLE_TOKEN = 45, /* H5T_VARIABLE_TOKEN */ - YYSYMBOL_H5T_STR_NULLTERM_TOKEN = 46, /* H5T_STR_NULLTERM_TOKEN */ - YYSYMBOL_H5T_STR_NULLPAD_TOKEN = 47, /* H5T_STR_NULLPAD_TOKEN */ - YYSYMBOL_H5T_STR_SPACEPAD_TOKEN = 48, /* H5T_STR_SPACEPAD_TOKEN */ - YYSYMBOL_H5T_CSET_ASCII_TOKEN = 49, /* H5T_CSET_ASCII_TOKEN */ - YYSYMBOL_H5T_CSET_UTF8_TOKEN = 50, /* H5T_CSET_UTF8_TOKEN */ - YYSYMBOL_H5T_C_S1_TOKEN = 51, /* H5T_C_S1_TOKEN */ - YYSYMBOL_H5T_FORTRAN_S1_TOKEN = 52, /* H5T_FORTRAN_S1_TOKEN */ - YYSYMBOL_H5T_OPAQUE_TOKEN = 53, /* H5T_OPAQUE_TOKEN */ - YYSYMBOL_OPQ_SIZE_TOKEN = 54, /* OPQ_SIZE_TOKEN */ - YYSYMBOL_OPQ_TAG_TOKEN = 55, /* OPQ_TAG_TOKEN */ - YYSYMBOL_H5T_COMPOUND_TOKEN = 56, /* H5T_COMPOUND_TOKEN */ - YYSYMBOL_H5T_ENUM_TOKEN = 57, /* H5T_ENUM_TOKEN */ - YYSYMBOL_H5T_ARRAY_TOKEN = 58, /* H5T_ARRAY_TOKEN */ - YYSYMBOL_H5T_VLEN_TOKEN = 59, /* H5T_VLEN_TOKEN */ - YYSYMBOL_STRING = 60, /* STRING */ - YYSYMBOL_NUMBER = 61, /* NUMBER */ - YYSYMBOL_62_ = 62, /* '{' */ - YYSYMBOL_63_ = 63, /* '}' */ - YYSYMBOL_64_ = 64, /* '[' */ - YYSYMBOL_65_ = 65, /* ']' */ - YYSYMBOL_66_ = 66, /* ':' */ - YYSYMBOL_67_ = 67, /* ';' */ - YYSYMBOL_YYACCEPT = 68, /* $accept */ - YYSYMBOL_start = 69, /* start */ - YYSYMBOL_ddl_type = 70, /* ddl_type */ - YYSYMBOL_atomic_type = 71, /* atomic_type */ - YYSYMBOL_integer_type = 72, /* integer_type */ - YYSYMBOL_fp_type = 73, /* fp_type */ - YYSYMBOL_compound_type = 74, /* compound_type */ - YYSYMBOL_75_1 = 75, /* $@1 */ - YYSYMBOL_memb_list = 76, /* memb_list */ - YYSYMBOL_memb_def = 77, /* memb_def */ - YYSYMBOL_78_2 = 78, /* $@2 */ - YYSYMBOL_field_name = 79, /* field_name */ - YYSYMBOL_field_offset = 80, /* field_offset */ - YYSYMBOL_offset = 81, /* offset */ - YYSYMBOL_array_type = 82, /* array_type */ - YYSYMBOL_83_3 = 83, /* $@3 */ - YYSYMBOL_dim_list = 84, /* dim_list */ - YYSYMBOL_dim = 85, /* dim */ - YYSYMBOL_86_4 = 86, /* $@4 */ - YYSYMBOL_87_5 = 87, /* $@5 */ - YYSYMBOL_dimsize = 88, /* dimsize */ - YYSYMBOL_vlen_type = 89, /* vlen_type */ - YYSYMBOL_opaque_type = 90, /* opaque_type */ - YYSYMBOL_91_6 = 91, /* @6 */ - YYSYMBOL_92_7 = 92, /* $@7 */ - YYSYMBOL_opaque_size = 93, /* opaque_size */ - YYSYMBOL_opaque_tag = 94, /* opaque_tag */ - YYSYMBOL_string_type = 95, /* string_type */ - YYSYMBOL_96_8 = 96, /* $@8 */ - YYSYMBOL_97_9 = 97, /* $@9 */ - YYSYMBOL_98_10 = 98, /* $@10 */ - YYSYMBOL_99_11 = 99, /* @11 */ - YYSYMBOL_strsize = 100, /* strsize */ - YYSYMBOL_strpad = 101, /* strpad */ - YYSYMBOL_cset = 102, /* cset */ - YYSYMBOL_ctype = 103, /* ctype */ - YYSYMBOL_enum_type = 104, /* enum_type */ - YYSYMBOL_105_12 = 105, /* $@12 */ - YYSYMBOL_enum_list = 106, /* enum_list */ - YYSYMBOL_enum_def = 107, /* enum_def */ - YYSYMBOL_108_13 = 108, /* $@13 */ - YYSYMBOL_enum_symbol = 109, /* enum_symbol */ - YYSYMBOL_enum_val = 110 /* enum_val */ + YYSYMBOL_H5T_COMPLEX_IEEE_F16BE_TOKEN = 40, /* H5T_COMPLEX_IEEE_F16BE_TOKEN */ + YYSYMBOL_H5T_COMPLEX_IEEE_F16LE_TOKEN = 41, /* H5T_COMPLEX_IEEE_F16LE_TOKEN */ + YYSYMBOL_H5T_COMPLEX_IEEE_F32BE_TOKEN = 42, /* H5T_COMPLEX_IEEE_F32BE_TOKEN */ + YYSYMBOL_H5T_COMPLEX_IEEE_F32LE_TOKEN = 43, /* H5T_COMPLEX_IEEE_F32LE_TOKEN */ + YYSYMBOL_H5T_COMPLEX_IEEE_F64BE_TOKEN = 44, /* H5T_COMPLEX_IEEE_F64BE_TOKEN */ + YYSYMBOL_H5T_COMPLEX_IEEE_F64LE_TOKEN = 45, /* H5T_COMPLEX_IEEE_F64LE_TOKEN */ + YYSYMBOL_H5T_NATIVE_FLOAT_COMPLEX_TOKEN = 46, /* H5T_NATIVE_FLOAT_COMPLEX_TOKEN */ + YYSYMBOL_H5T_NATIVE_DOUBLE_COMPLEX_TOKEN = 47, /* H5T_NATIVE_DOUBLE_COMPLEX_TOKEN */ + YYSYMBOL_H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN = 48, /* H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN */ + YYSYMBOL_H5T_STRING_TOKEN = 49, /* H5T_STRING_TOKEN */ + YYSYMBOL_STRSIZE_TOKEN = 50, /* STRSIZE_TOKEN */ + YYSYMBOL_STRPAD_TOKEN = 51, /* STRPAD_TOKEN */ + YYSYMBOL_CSET_TOKEN = 52, /* CSET_TOKEN */ + YYSYMBOL_CTYPE_TOKEN = 53, /* CTYPE_TOKEN */ + YYSYMBOL_H5T_VARIABLE_TOKEN = 54, /* H5T_VARIABLE_TOKEN */ + YYSYMBOL_H5T_STR_NULLTERM_TOKEN = 55, /* H5T_STR_NULLTERM_TOKEN */ + YYSYMBOL_H5T_STR_NULLPAD_TOKEN = 56, /* H5T_STR_NULLPAD_TOKEN */ + YYSYMBOL_H5T_STR_SPACEPAD_TOKEN = 57, /* H5T_STR_SPACEPAD_TOKEN */ + YYSYMBOL_H5T_CSET_ASCII_TOKEN = 58, /* H5T_CSET_ASCII_TOKEN */ + YYSYMBOL_H5T_CSET_UTF8_TOKEN = 59, /* H5T_CSET_UTF8_TOKEN */ + YYSYMBOL_H5T_C_S1_TOKEN = 60, /* H5T_C_S1_TOKEN */ + YYSYMBOL_H5T_FORTRAN_S1_TOKEN = 61, /* H5T_FORTRAN_S1_TOKEN */ + YYSYMBOL_H5T_OPAQUE_TOKEN = 62, /* H5T_OPAQUE_TOKEN */ + YYSYMBOL_OPQ_SIZE_TOKEN = 63, /* OPQ_SIZE_TOKEN */ + YYSYMBOL_OPQ_TAG_TOKEN = 64, /* OPQ_TAG_TOKEN */ + YYSYMBOL_H5T_COMPOUND_TOKEN = 65, /* H5T_COMPOUND_TOKEN */ + YYSYMBOL_H5T_ENUM_TOKEN = 66, /* H5T_ENUM_TOKEN */ + YYSYMBOL_H5T_ARRAY_TOKEN = 67, /* H5T_ARRAY_TOKEN */ + YYSYMBOL_H5T_VLEN_TOKEN = 68, /* H5T_VLEN_TOKEN */ + YYSYMBOL_H5T_COMPLEX_TOKEN = 69, /* H5T_COMPLEX_TOKEN */ + YYSYMBOL_STRING = 70, /* STRING */ + YYSYMBOL_NUMBER = 71, /* NUMBER */ + YYSYMBOL_72_ = 72, /* '{' */ + YYSYMBOL_73_ = 73, /* '}' */ + YYSYMBOL_74_ = 74, /* '[' */ + YYSYMBOL_75_ = 75, /* ']' */ + YYSYMBOL_76_ = 76, /* ':' */ + YYSYMBOL_77_ = 77, /* ';' */ + YYSYMBOL_YYACCEPT = 78, /* $accept */ + YYSYMBOL_start = 79, /* start */ + YYSYMBOL_ddl_type = 80, /* ddl_type */ + YYSYMBOL_atomic_type = 81, /* atomic_type */ + YYSYMBOL_integer_type = 82, /* integer_type */ + YYSYMBOL_fp_type = 83, /* fp_type */ + YYSYMBOL_compound_type = 84, /* compound_type */ + YYSYMBOL_85_1 = 85, /* $@1 */ + YYSYMBOL_memb_list = 86, /* memb_list */ + YYSYMBOL_memb_def = 87, /* memb_def */ + YYSYMBOL_88_2 = 88, /* $@2 */ + YYSYMBOL_field_name = 89, /* field_name */ + YYSYMBOL_field_offset = 90, /* field_offset */ + YYSYMBOL_offset = 91, /* offset */ + YYSYMBOL_array_type = 92, /* array_type */ + YYSYMBOL_93_3 = 93, /* $@3 */ + YYSYMBOL_dim_list = 94, /* dim_list */ + YYSYMBOL_dim = 95, /* dim */ + YYSYMBOL_96_4 = 96, /* $@4 */ + YYSYMBOL_97_5 = 97, /* $@5 */ + YYSYMBOL_dimsize = 98, /* dimsize */ + YYSYMBOL_vlen_type = 99, /* vlen_type */ + YYSYMBOL_complex_type = 100, /* complex_type */ + YYSYMBOL_opaque_type = 101, /* opaque_type */ + YYSYMBOL_102_6 = 102, /* @6 */ + YYSYMBOL_103_7 = 103, /* $@7 */ + YYSYMBOL_opaque_size = 104, /* opaque_size */ + YYSYMBOL_opaque_tag = 105, /* opaque_tag */ + YYSYMBOL_string_type = 106, /* string_type */ + YYSYMBOL_107_8 = 107, /* $@8 */ + YYSYMBOL_108_9 = 108, /* $@9 */ + YYSYMBOL_109_10 = 109, /* $@10 */ + YYSYMBOL_110_11 = 110, /* @11 */ + YYSYMBOL_strsize = 111, /* strsize */ + YYSYMBOL_strpad = 112, /* strpad */ + YYSYMBOL_cset = 113, /* cset */ + YYSYMBOL_ctype = 114, /* ctype */ + YYSYMBOL_enum_type = 115, /* enum_type */ + YYSYMBOL_116_12 = 116, /* $@12 */ + YYSYMBOL_enum_list = 117, /* enum_list */ + YYSYMBOL_enum_def = 118, /* enum_def */ + YYSYMBOL_119_13 = 119, /* $@13 */ + YYSYMBOL_enum_symbol = 120, /* enum_symbol */ + YYSYMBOL_enum_val = 121 /* enum_val */ }; typedef enum yysymbol_kind_t yysymbol_kind_t; @@ -619,21 +628,21 @@ union yyalloc #endif /* !YYCOPY_NEEDED */ /* YYFINAL -- State number of the termination state. */ -#define YYFINAL 61 +#define YYFINAL 73 /* YYLAST -- Last index in YYTABLE. */ -#define YYLAST 206 +#define YYLAST 239 /* YYNTOKENS -- Number of terminals. */ -#define YYNTOKENS 68 +#define YYNTOKENS 78 /* YYNNTS -- Number of nonterminals. */ -#define YYNNTS 43 +#define YYNNTS 44 /* YYNRULES -- Number of rules. */ -#define YYNRULES 95 +#define YYNRULES 106 /* YYNSTATES -- Number of states. */ -#define YYNSTATES 137 +#define YYNSTATES 151 /* YYMAXUTOK -- Last valid token kind. */ -#define YYMAXUTOK 316 +#define YYMAXUTOK 326 /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM @@ -652,14 +661,14 @@ static const yytype_int8 yytranslate[] = 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 66, 67, + 2, 2, 2, 2, 2, 2, 2, 2, 76, 77, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 64, 2, 65, 2, 2, 2, 2, 2, 2, + 2, 74, 2, 75, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 62, 2, 63, 2, 2, 2, 2, + 2, 2, 2, 72, 2, 73, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, @@ -678,23 +687,25 @@ static const yytype_int8 yytranslate[] = 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, - 55, 56, 57, 58, 59, 60, 61 + 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, + 65, 66, 67, 68, 69, 70, 71 }; #if YYDEBUG /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_int16 yyrline[] = { - 0, 102, 102, 103, 105, 106, 107, 108, 110, 111, - 112, 113, 114, 117, 118, 119, 120, 121, 122, 123, - 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, - 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, - 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, - 159, 158, 167, 168, 170, 170, 207, 215, 216, 219, - 221, 221, 230, 231, 233, 234, 233, 241, 244, 251, - 256, 248, 263, 265, 270, 277, 286, 293, 267, 317, - 318, 320, 321, 322, 324, 325, 327, 328, 332, 331, - 336, 337, 339, 339, 389, 391 + 0, 108, 108, 109, 111, 112, 113, 114, 115, 117, + 118, 119, 120, 121, 124, 125, 126, 127, 128, 129, + 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, + 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 153, 154, 155, 156, 157, 158, 159, 160, 161, + 162, 166, 165, 174, 175, 177, 177, 214, 222, 223, + 226, 228, 228, 237, 238, 240, 241, 240, 248, 251, + 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, + 271, 276, 268, 283, 285, 290, 297, 306, 313, 287, + 337, 338, 340, 341, 342, 344, 345, 347, 348, 352, + 351, 356, 357, 359, 359, 409, 411 }; #endif @@ -726,18 +737,23 @@ static const char *const yytname[] = "H5T_IEEE_F64BE_TOKEN", "H5T_IEEE_F64LE_TOKEN", "H5T_NATIVE_FLOAT16_TOKEN", "H5T_NATIVE_FLOAT_TOKEN", "H5T_NATIVE_DOUBLE_TOKEN", "H5T_NATIVE_LDOUBLE_TOKEN", - "H5T_STRING_TOKEN", "STRSIZE_TOKEN", "STRPAD_TOKEN", "CSET_TOKEN", - "CTYPE_TOKEN", "H5T_VARIABLE_TOKEN", "H5T_STR_NULLTERM_TOKEN", - "H5T_STR_NULLPAD_TOKEN", "H5T_STR_SPACEPAD_TOKEN", - "H5T_CSET_ASCII_TOKEN", "H5T_CSET_UTF8_TOKEN", "H5T_C_S1_TOKEN", - "H5T_FORTRAN_S1_TOKEN", "H5T_OPAQUE_TOKEN", "OPQ_SIZE_TOKEN", - "OPQ_TAG_TOKEN", "H5T_COMPOUND_TOKEN", "H5T_ENUM_TOKEN", - "H5T_ARRAY_TOKEN", "H5T_VLEN_TOKEN", "STRING", "NUMBER", "'{'", "'}'", - "'['", "']'", "':'", "';'", "$accept", "start", "ddl_type", - "atomic_type", "integer_type", "fp_type", "compound_type", "$@1", - "memb_list", "memb_def", "$@2", "field_name", "field_offset", "offset", - "array_type", "$@3", "dim_list", "dim", "$@4", "$@5", "dimsize", - "vlen_type", "opaque_type", "@6", "$@7", "opaque_size", "opaque_tag", + "H5T_COMPLEX_IEEE_F16BE_TOKEN", "H5T_COMPLEX_IEEE_F16LE_TOKEN", + "H5T_COMPLEX_IEEE_F32BE_TOKEN", "H5T_COMPLEX_IEEE_F32LE_TOKEN", + "H5T_COMPLEX_IEEE_F64BE_TOKEN", "H5T_COMPLEX_IEEE_F64LE_TOKEN", + "H5T_NATIVE_FLOAT_COMPLEX_TOKEN", "H5T_NATIVE_DOUBLE_COMPLEX_TOKEN", + "H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN", "H5T_STRING_TOKEN", "STRSIZE_TOKEN", + "STRPAD_TOKEN", "CSET_TOKEN", "CTYPE_TOKEN", "H5T_VARIABLE_TOKEN", + "H5T_STR_NULLTERM_TOKEN", "H5T_STR_NULLPAD_TOKEN", + "H5T_STR_SPACEPAD_TOKEN", "H5T_CSET_ASCII_TOKEN", "H5T_CSET_UTF8_TOKEN", + "H5T_C_S1_TOKEN", "H5T_FORTRAN_S1_TOKEN", "H5T_OPAQUE_TOKEN", + "OPQ_SIZE_TOKEN", "OPQ_TAG_TOKEN", "H5T_COMPOUND_TOKEN", + "H5T_ENUM_TOKEN", "H5T_ARRAY_TOKEN", "H5T_VLEN_TOKEN", + "H5T_COMPLEX_TOKEN", "STRING", "NUMBER", "'{'", "'}'", "'['", "']'", + "':'", "';'", "$accept", "start", "ddl_type", "atomic_type", + "integer_type", "fp_type", "compound_type", "$@1", "memb_list", + "memb_def", "$@2", "field_name", "field_offset", "offset", "array_type", + "$@3", "dim_list", "dim", "$@4", "$@5", "dimsize", "vlen_type", + "complex_type", "opaque_type", "@6", "$@7", "opaque_size", "opaque_tag", "string_type", "$@8", "$@9", "$@10", "@11", "strsize", "strpad", "cset", "ctype", "enum_type", "$@12", "enum_list", "enum_def", "$@13", "enum_symbol", "enum_val", YY_NULLPTR @@ -750,7 +766,7 @@ yysymbol_name (yysymbol_kind_t yysymbol) } #endif -#define YYPACT_NINF (-25) +#define YYPACT_NINF (-24) #define yypact_value_is_default(Yyn) \ ((Yyn) == YYPACT_NINF) @@ -764,20 +780,22 @@ yysymbol_name (yysymbol_kind_t yysymbol) STATE-NUM. */ static const yytype_int16 yypact[] = { - 120, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -24, -22, - -25, -13, -25, -11, 52, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, 18, 48, 41, 177, 42, - 120, -25, -4, 44, -25, 39, -25, 45, -25, -25, - 40, -25, 43, 59, -25, -3, -25, -25, -25, -25, - -25, -25, -25, -25, 46, -25, 69, 58, 54, -21, - 60, -25, 0, 101, -25, 53, -25, -25, -25, -25, - -25, -25, -25, -25, -25, 95, -25, 96, 103, 98, - 105, 55, -25, -25, -25, -25, -25, -25, 100, -25, - 125, 106, -25, -6, -25, -25, -25, 104, -25, 126, - 49, -25, -25, 107, -25, 109, -25 + 140, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -21, -15, -24, + -14, -24, -4, -2, 119, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, 70, 58, 51, 207, + 52, 140, 140, -24, 68, 54, -24, 49, -24, 55, + 56, -24, -24, 50, -24, 53, 69, -24, -3, -24, + -24, -24, -24, -24, -24, -24, -24, -24, 59, -24, + 82, 76, 71, -23, 120, -24, -1, 122, -24, 114, + -24, -24, -24, -24, -24, -24, -24, -24, -24, 116, + -24, 117, 124, 121, 125, 126, -24, -24, -24, -24, + -24, -24, 123, -24, 145, 130, -24, -10, -24, -24, + -24, 127, -24, 146, 0, -24, -24, 160, -24, 165, + -24 }; /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM. @@ -785,40 +803,42 @@ static const yytype_int16 yypact[] = means the default is an error. */ static const yytype_int8 yydefact[] = { - 2, 13, 14, 15, 16, 17, 18, 19, 20, 21, - 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, - 42, 43, 44, 45, 46, 47, 48, 49, 0, 0, - 50, 0, 60, 0, 0, 3, 4, 8, 9, 5, - 6, 7, 12, 10, 11, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 52, 0, 62, 0, 79, 80, - 0, 72, 0, 0, 88, 0, 68, 74, 69, 51, - 54, 53, 90, 64, 0, 63, 0, 0, 0, 0, - 0, 61, 0, 0, 56, 57, 94, 89, 91, 92, - 67, 65, 81, 82, 83, 0, 73, 0, 0, 0, - 0, 0, 75, 70, 59, 58, 55, 95, 0, 66, - 0, 0, 93, 0, 71, 84, 85, 0, 76, 0, - 0, 86, 87, 0, 77, 0, 78 + 2, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 74, 73, + 76, 75, 78, 77, 70, 71, 72, 0, 0, 51, + 0, 61, 0, 0, 0, 3, 4, 9, 10, 5, + 6, 7, 8, 13, 11, 12, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 53, 0, 63, 0, + 0, 90, 91, 0, 83, 0, 0, 99, 0, 69, + 79, 85, 80, 52, 55, 54, 101, 65, 0, 64, + 0, 0, 0, 0, 0, 62, 0, 0, 57, 58, + 105, 100, 102, 103, 68, 66, 92, 93, 94, 0, + 84, 0, 0, 0, 0, 0, 86, 81, 60, 59, + 56, 106, 0, 67, 0, 0, 104, 0, 82, 95, + 96, 0, 87, 0, 0, 97, 98, 0, 88, 0, + 89 }; /* YYPGOTO[NTERM-NUM]. */ -static const yytype_int8 yypgoto[] = +static const yytype_int16 yypgoto[] = { - -25, -25, -15, -25, 117, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, - -25, -25, -25 + -24, -24, -19, -24, 170, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, + -24, -24, -24, -24 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_uint8 yydefgoto[] = { - 0, 44, 45, 46, 47, 48, 49, 57, 73, 81, - 88, 95, 109, 115, 50, 59, 75, 85, 90, 111, - 101, 51, 52, 87, 121, 72, 107, 53, 86, 120, - 129, 135, 70, 105, 127, 133, 54, 82, 89, 98, - 110, 99, 118 + 0, 54, 55, 56, 57, 58, 59, 68, 86, 95, + 102, 109, 123, 129, 60, 70, 88, 99, 104, 125, + 115, 61, 62, 63, 101, 135, 85, 121, 64, 100, + 134, 143, 149, 83, 119, 141, 147, 65, 96, 103, + 112, 124, 113, 132 }; /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If @@ -829,24 +849,27 @@ static const yytype_uint8 yytable[] = 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, - 31, 32, 33, 34, 35, 36, 37, 38, 55, 96, - 56, 68, 97, 125, 126, 67, 102, 103, 104, 58, - 39, 60, 61, 40, 41, 42, 43, 69, 80, 62, - 84, 83, 1, 2, 3, 4, 5, 6, 7, 8, + 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, + 41, 42, 43, 44, 45, 46, 47, 110, 139, 140, + 111, 66, 79, 80, 116, 117, 118, 67, 69, 48, + 145, 146, 49, 50, 51, 52, 53, 94, 71, 98, + 72, 97, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, - 131, 132, 63, 64, 66, 71, 74, 77, 76, 91, - 78, 92, 39, 93, 94, 40, 41, 42, 43, 108, - 119, 100, 79, 1, 2, 3, 4, 5, 6, 7, + 39, 40, 41, 42, 43, 44, 45, 46, 47, 73, + 74, 75, 81, 76, 78, 84, 87, 91, 89, 90, + 92, 48, 105, 106, 49, 50, 51, 52, 53, 82, + 107, 108, 93, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, - 38, 106, 112, 113, 114, 116, 117, 122, 123, 124, - 130, 128, 136, 39, 134, 65, 40, 41, 42, 43, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, + 122, 114, 120, 126, 127, 128, 131, 137, 130, 144, + 136, 133, 48, 138, 142, 49, 50, 51, 52, 53, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, - 21, 22, 23, 24, 25, 26, 27 + 21, 22, 23, 24, 25, 26, 27, 148, 150, 77 }; static const yytype_int8 yycheck[] = @@ -854,24 +877,27 @@ static const yytype_int8 yycheck[] = 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, - 33, 34, 35, 36, 37, 38, 39, 40, 62, 60, - 62, 45, 63, 49, 50, 60, 46, 47, 48, 62, - 53, 62, 0, 56, 57, 58, 59, 61, 73, 41, - 75, 64, 3, 4, 5, 6, 7, 8, 9, 10, + 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 70, 58, 59, + 73, 72, 71, 72, 55, 56, 57, 72, 72, 62, + 60, 61, 65, 66, 67, 68, 69, 86, 72, 88, + 72, 74, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 51, 52, 54, 62, 62, 61, 67, 67, 63, 63, - 67, 42, 53, 55, 60, 56, 57, 58, 59, 66, - 65, 61, 63, 3, 4, 5, 6, 7, 8, 9, + 41, 42, 43, 44, 45, 46, 47, 48, 49, 0, + 50, 63, 54, 72, 72, 71, 77, 77, 73, 73, + 77, 62, 73, 51, 65, 66, 67, 68, 69, 71, + 64, 70, 73, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, - 40, 60, 67, 67, 61, 67, 61, 67, 43, 63, - 44, 67, 63, 53, 67, 58, 56, 57, 58, 59, + 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 76, 71, 70, 77, 77, 71, 71, 52, 77, 53, + 77, 75, 62, 73, 77, 65, 66, 67, 68, 69, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 23, 24, 25, 26, 27, 28, 29 + 23, 24, 25, 26, 27, 28, 29, 77, 73, 69 }; /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of @@ -881,32 +907,35 @@ static const yytype_int8 yystos[] = 0, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 33, 34, 35, 36, 37, 38, 39, 40, 53, - 56, 57, 58, 59, 69, 70, 71, 72, 73, 74, - 82, 89, 90, 95, 104, 62, 62, 75, 62, 83, - 62, 0, 41, 54, 62, 72, 62, 70, 45, 61, - 100, 61, 93, 76, 67, 84, 63, 67, 67, 63, - 70, 77, 105, 64, 70, 85, 96, 91, 78, 106, - 86, 63, 42, 55, 60, 79, 60, 63, 107, 109, - 61, 88, 46, 47, 48, 101, 60, 94, 66, 80, - 108, 87, 67, 67, 61, 81, 67, 61, 110, 65, - 97, 92, 67, 43, 63, 49, 50, 102, 67, 98, - 44, 51, 52, 103, 67, 99, 63 + 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, + 42, 43, 44, 45, 46, 47, 48, 49, 62, 65, + 66, 67, 68, 69, 79, 80, 81, 82, 83, 84, + 92, 99, 100, 101, 106, 115, 72, 72, 85, 72, + 93, 72, 72, 0, 50, 63, 72, 82, 72, 80, + 80, 54, 71, 111, 71, 104, 86, 77, 94, 73, + 73, 77, 77, 73, 80, 87, 116, 74, 80, 95, + 107, 102, 88, 117, 96, 73, 51, 64, 70, 89, + 70, 73, 118, 120, 71, 98, 55, 56, 57, 112, + 70, 105, 76, 90, 119, 97, 77, 77, 71, 91, + 77, 71, 121, 75, 108, 103, 77, 52, 73, 58, + 59, 113, 77, 109, 53, 60, 61, 114, 77, 110, + 73 }; /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM. */ static const yytype_int8 yyr1[] = { - 0, 68, 69, 69, 70, 70, 70, 70, 71, 71, - 71, 71, 71, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 73, 73, 73, 73, 73, 73, 73, 73, 73, 73, - 75, 74, 76, 76, 78, 77, 79, 80, 80, 81, - 83, 82, 84, 84, 86, 87, 85, 88, 89, 91, - 92, 90, 93, 94, 96, 97, 98, 99, 95, 100, - 100, 101, 101, 101, 102, 102, 103, 103, 105, 104, - 106, 106, 108, 107, 109, 110 + 0, 78, 79, 79, 80, 80, 80, 80, 80, 81, + 81, 81, 81, 81, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 85, 84, 86, 86, 88, 87, 89, 90, 90, + 91, 93, 92, 94, 94, 96, 97, 95, 98, 99, + 100, 100, 100, 100, 100, 100, 100, 100, 100, 100, + 102, 103, 101, 104, 105, 107, 108, 109, 110, 106, + 111, 111, 112, 112, 112, 113, 113, 114, 114, 116, + 115, 117, 117, 119, 118, 120, 121 }; /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM. */ @@ -917,11 +946,12 @@ static const yytype_int8 yyr2[] = 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 0, 5, 0, 2, 0, 5, 1, 0, 2, 1, - 0, 6, 0, 2, 0, 0, 5, 1, 4, 0, - 0, 11, 1, 1, 0, 0, 0, 0, 19, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 7, - 0, 2, 0, 4, 1, 1 + 1, 0, 5, 0, 2, 0, 5, 1, 0, 2, + 1, 0, 6, 0, 2, 0, 0, 5, 1, 4, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, + 0, 0, 11, 1, 1, 0, 0, 0, 0, 19, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 7, 0, 2, 0, 4, 1, 1 }; @@ -1385,263 +1415,263 @@ yyparse (void) switch (yyn) { case 2: /* start: %empty */ -#line 102 "hl/src//H5LTparse.y" +#line 108 "hl/src//H5LTparse.y" { memset(arr_stack, 0, STACK_SIZE*sizeof(struct arr_info)); /*initialize here?*/ } -#line 1360 "hl/src//H5LTparse.c" +#line 1392 "hl/src//H5LTparse.c" break; case 3: /* start: ddl_type */ -#line 103 "hl/src//H5LTparse.y" +#line 109 "hl/src//H5LTparse.y" { return (yyval.hid);} -#line 1366 "hl/src//H5LTparse.c" +#line 1398 "hl/src//H5LTparse.c" break; - case 13: /* integer_type: H5T_STD_I8BE_TOKEN */ -#line 117 "hl/src//H5LTparse.y" + case 14: /* integer_type: H5T_STD_I8BE_TOKEN */ +#line 124 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I8BE); } -#line 1372 "hl/src//H5LTparse.c" +#line 1404 "hl/src//H5LTparse.c" break; - case 14: /* integer_type: H5T_STD_I8LE_TOKEN */ -#line 118 "hl/src//H5LTparse.y" + case 15: /* integer_type: H5T_STD_I8LE_TOKEN */ +#line 125 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I8LE); } -#line 1378 "hl/src//H5LTparse.c" +#line 1410 "hl/src//H5LTparse.c" break; - case 15: /* integer_type: H5T_STD_I16BE_TOKEN */ -#line 119 "hl/src//H5LTparse.y" + case 16: /* integer_type: H5T_STD_I16BE_TOKEN */ +#line 126 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I16BE); } -#line 1384 "hl/src//H5LTparse.c" +#line 1416 "hl/src//H5LTparse.c" break; - case 16: /* integer_type: H5T_STD_I16LE_TOKEN */ -#line 120 "hl/src//H5LTparse.y" + case 17: /* integer_type: H5T_STD_I16LE_TOKEN */ +#line 127 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I16LE); } -#line 1390 "hl/src//H5LTparse.c" +#line 1422 "hl/src//H5LTparse.c" break; - case 17: /* integer_type: H5T_STD_I32BE_TOKEN */ -#line 121 "hl/src//H5LTparse.y" + case 18: /* integer_type: H5T_STD_I32BE_TOKEN */ +#line 128 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I32BE); } -#line 1396 "hl/src//H5LTparse.c" +#line 1428 "hl/src//H5LTparse.c" break; - case 18: /* integer_type: H5T_STD_I32LE_TOKEN */ -#line 122 "hl/src//H5LTparse.y" + case 19: /* integer_type: H5T_STD_I32LE_TOKEN */ +#line 129 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I32LE); } -#line 1402 "hl/src//H5LTparse.c" +#line 1434 "hl/src//H5LTparse.c" break; - case 19: /* integer_type: H5T_STD_I64BE_TOKEN */ -#line 123 "hl/src//H5LTparse.y" + case 20: /* integer_type: H5T_STD_I64BE_TOKEN */ +#line 130 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I64BE); } -#line 1408 "hl/src//H5LTparse.c" +#line 1440 "hl/src//H5LTparse.c" break; - case 20: /* integer_type: H5T_STD_I64LE_TOKEN */ -#line 124 "hl/src//H5LTparse.y" + case 21: /* integer_type: H5T_STD_I64LE_TOKEN */ +#line 131 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_I64LE); } -#line 1414 "hl/src//H5LTparse.c" +#line 1446 "hl/src//H5LTparse.c" break; - case 21: /* integer_type: H5T_STD_U8BE_TOKEN */ -#line 125 "hl/src//H5LTparse.y" + case 22: /* integer_type: H5T_STD_U8BE_TOKEN */ +#line 132 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U8BE); } -#line 1420 "hl/src//H5LTparse.c" +#line 1452 "hl/src//H5LTparse.c" break; - case 22: /* integer_type: H5T_STD_U8LE_TOKEN */ -#line 126 "hl/src//H5LTparse.y" + case 23: /* integer_type: H5T_STD_U8LE_TOKEN */ +#line 133 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U8LE); } -#line 1426 "hl/src//H5LTparse.c" +#line 1458 "hl/src//H5LTparse.c" break; - case 23: /* integer_type: H5T_STD_U16BE_TOKEN */ -#line 127 "hl/src//H5LTparse.y" + case 24: /* integer_type: H5T_STD_U16BE_TOKEN */ +#line 134 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U16BE); } -#line 1432 "hl/src//H5LTparse.c" +#line 1464 "hl/src//H5LTparse.c" break; - case 24: /* integer_type: H5T_STD_U16LE_TOKEN */ -#line 128 "hl/src//H5LTparse.y" + case 25: /* integer_type: H5T_STD_U16LE_TOKEN */ +#line 135 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U16LE); } -#line 1438 "hl/src//H5LTparse.c" +#line 1470 "hl/src//H5LTparse.c" break; - case 25: /* integer_type: H5T_STD_U32BE_TOKEN */ -#line 129 "hl/src//H5LTparse.y" + case 26: /* integer_type: H5T_STD_U32BE_TOKEN */ +#line 136 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U32BE); } -#line 1444 "hl/src//H5LTparse.c" +#line 1476 "hl/src//H5LTparse.c" break; - case 26: /* integer_type: H5T_STD_U32LE_TOKEN */ -#line 130 "hl/src//H5LTparse.y" + case 27: /* integer_type: H5T_STD_U32LE_TOKEN */ +#line 137 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U32LE); } -#line 1450 "hl/src//H5LTparse.c" +#line 1482 "hl/src//H5LTparse.c" break; - case 27: /* integer_type: H5T_STD_U64BE_TOKEN */ -#line 131 "hl/src//H5LTparse.y" + case 28: /* integer_type: H5T_STD_U64BE_TOKEN */ +#line 138 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U64BE); } -#line 1456 "hl/src//H5LTparse.c" +#line 1488 "hl/src//H5LTparse.c" break; - case 28: /* integer_type: H5T_STD_U64LE_TOKEN */ -#line 132 "hl/src//H5LTparse.y" + case 29: /* integer_type: H5T_STD_U64LE_TOKEN */ +#line 139 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_STD_U64LE); } -#line 1462 "hl/src//H5LTparse.c" +#line 1494 "hl/src//H5LTparse.c" break; - case 29: /* integer_type: H5T_NATIVE_CHAR_TOKEN */ -#line 133 "hl/src//H5LTparse.y" + case 30: /* integer_type: H5T_NATIVE_CHAR_TOKEN */ +#line 140 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_CHAR); } -#line 1468 "hl/src//H5LTparse.c" +#line 1500 "hl/src//H5LTparse.c" break; - case 30: /* integer_type: H5T_NATIVE_SCHAR_TOKEN */ -#line 134 "hl/src//H5LTparse.y" + case 31: /* integer_type: H5T_NATIVE_SCHAR_TOKEN */ +#line 141 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_SCHAR); } -#line 1474 "hl/src//H5LTparse.c" +#line 1506 "hl/src//H5LTparse.c" break; - case 31: /* integer_type: H5T_NATIVE_UCHAR_TOKEN */ -#line 135 "hl/src//H5LTparse.y" + case 32: /* integer_type: H5T_NATIVE_UCHAR_TOKEN */ +#line 142 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_UCHAR); } -#line 1480 "hl/src//H5LTparse.c" +#line 1512 "hl/src//H5LTparse.c" break; - case 32: /* integer_type: H5T_NATIVE_SHORT_TOKEN */ -#line 136 "hl/src//H5LTparse.y" + case 33: /* integer_type: H5T_NATIVE_SHORT_TOKEN */ +#line 143 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_SHORT); } -#line 1486 "hl/src//H5LTparse.c" +#line 1518 "hl/src//H5LTparse.c" break; - case 33: /* integer_type: H5T_NATIVE_USHORT_TOKEN */ -#line 137 "hl/src//H5LTparse.y" + case 34: /* integer_type: H5T_NATIVE_USHORT_TOKEN */ +#line 144 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_USHORT); } -#line 1492 "hl/src//H5LTparse.c" +#line 1524 "hl/src//H5LTparse.c" break; - case 34: /* integer_type: H5T_NATIVE_INT_TOKEN */ -#line 138 "hl/src//H5LTparse.y" + case 35: /* integer_type: H5T_NATIVE_INT_TOKEN */ +#line 145 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_INT); } -#line 1498 "hl/src//H5LTparse.c" +#line 1530 "hl/src//H5LTparse.c" break; - case 35: /* integer_type: H5T_NATIVE_UINT_TOKEN */ -#line 139 "hl/src//H5LTparse.y" + case 36: /* integer_type: H5T_NATIVE_UINT_TOKEN */ +#line 146 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_UINT); } -#line 1504 "hl/src//H5LTparse.c" +#line 1536 "hl/src//H5LTparse.c" break; - case 36: /* integer_type: H5T_NATIVE_LONG_TOKEN */ -#line 140 "hl/src//H5LTparse.y" + case 37: /* integer_type: H5T_NATIVE_LONG_TOKEN */ +#line 147 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_LONG); } -#line 1510 "hl/src//H5LTparse.c" +#line 1542 "hl/src//H5LTparse.c" break; - case 37: /* integer_type: H5T_NATIVE_ULONG_TOKEN */ -#line 141 "hl/src//H5LTparse.y" + case 38: /* integer_type: H5T_NATIVE_ULONG_TOKEN */ +#line 148 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_ULONG); } -#line 1516 "hl/src//H5LTparse.c" +#line 1548 "hl/src//H5LTparse.c" break; - case 38: /* integer_type: H5T_NATIVE_LLONG_TOKEN */ -#line 142 "hl/src//H5LTparse.y" + case 39: /* integer_type: H5T_NATIVE_LLONG_TOKEN */ +#line 149 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_LLONG); } -#line 1522 "hl/src//H5LTparse.c" +#line 1554 "hl/src//H5LTparse.c" break; - case 39: /* integer_type: H5T_NATIVE_ULLONG_TOKEN */ -#line 143 "hl/src//H5LTparse.y" + case 40: /* integer_type: H5T_NATIVE_ULLONG_TOKEN */ +#line 150 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_ULLONG); } -#line 1528 "hl/src//H5LTparse.c" +#line 1560 "hl/src//H5LTparse.c" break; - case 40: /* fp_type: H5T_IEEE_F16BE_TOKEN */ -#line 146 "hl/src//H5LTparse.y" + case 41: /* fp_type: H5T_IEEE_F16BE_TOKEN */ +#line 153 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_IEEE_F16BE); } -#line 1534 "hl/src//H5LTparse.c" +#line 1566 "hl/src//H5LTparse.c" break; - case 41: /* fp_type: H5T_IEEE_F16LE_TOKEN */ -#line 147 "hl/src//H5LTparse.y" + case 42: /* fp_type: H5T_IEEE_F16LE_TOKEN */ +#line 154 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_IEEE_F16LE); } -#line 1540 "hl/src//H5LTparse.c" +#line 1572 "hl/src//H5LTparse.c" break; - case 42: /* fp_type: H5T_IEEE_F32BE_TOKEN */ -#line 148 "hl/src//H5LTparse.y" + case 43: /* fp_type: H5T_IEEE_F32BE_TOKEN */ +#line 155 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_IEEE_F32BE); } -#line 1546 "hl/src//H5LTparse.c" +#line 1578 "hl/src//H5LTparse.c" break; - case 43: /* fp_type: H5T_IEEE_F32LE_TOKEN */ -#line 149 "hl/src//H5LTparse.y" + case 44: /* fp_type: H5T_IEEE_F32LE_TOKEN */ +#line 156 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_IEEE_F32LE); } -#line 1552 "hl/src//H5LTparse.c" +#line 1584 "hl/src//H5LTparse.c" break; - case 44: /* fp_type: H5T_IEEE_F64BE_TOKEN */ -#line 150 "hl/src//H5LTparse.y" + case 45: /* fp_type: H5T_IEEE_F64BE_TOKEN */ +#line 157 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_IEEE_F64BE); } -#line 1558 "hl/src//H5LTparse.c" +#line 1590 "hl/src//H5LTparse.c" break; - case 45: /* fp_type: H5T_IEEE_F64LE_TOKEN */ -#line 151 "hl/src//H5LTparse.y" + case 46: /* fp_type: H5T_IEEE_F64LE_TOKEN */ +#line 158 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_IEEE_F64LE); } -#line 1564 "hl/src//H5LTparse.c" +#line 1596 "hl/src//H5LTparse.c" break; - case 46: /* fp_type: H5T_NATIVE_FLOAT16_TOKEN */ -#line 152 "hl/src//H5LTparse.y" + case 47: /* fp_type: H5T_NATIVE_FLOAT16_TOKEN */ +#line 159 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_FLOAT16); } -#line 1570 "hl/src//H5LTparse.c" +#line 1602 "hl/src//H5LTparse.c" break; - case 47: /* fp_type: H5T_NATIVE_FLOAT_TOKEN */ -#line 153 "hl/src//H5LTparse.y" + case 48: /* fp_type: H5T_NATIVE_FLOAT_TOKEN */ +#line 160 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_FLOAT); } -#line 1576 "hl/src//H5LTparse.c" +#line 1608 "hl/src//H5LTparse.c" break; - case 48: /* fp_type: H5T_NATIVE_DOUBLE_TOKEN */ -#line 154 "hl/src//H5LTparse.y" + case 49: /* fp_type: H5T_NATIVE_DOUBLE_TOKEN */ +#line 161 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_DOUBLE); } -#line 1582 "hl/src//H5LTparse.c" +#line 1614 "hl/src//H5LTparse.c" break; - case 49: /* fp_type: H5T_NATIVE_LDOUBLE_TOKEN */ -#line 155 "hl/src//H5LTparse.y" + case 50: /* fp_type: H5T_NATIVE_LDOUBLE_TOKEN */ +#line 162 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tcopy(H5T_NATIVE_LDOUBLE); } -#line 1588 "hl/src//H5LTparse.c" +#line 1620 "hl/src//H5LTparse.c" break; - case 50: /* $@1: %empty */ -#line 159 "hl/src//H5LTparse.y" + case 51: /* $@1: %empty */ +#line 166 "hl/src//H5LTparse.y" { csindex++; cmpd_stack[csindex].id = H5Tcreate(H5T_COMPOUND, 1); /*temporarily set size to 1*/ } -#line 1594 "hl/src//H5LTparse.c" +#line 1626 "hl/src//H5LTparse.c" break; - case 51: /* compound_type: H5T_COMPOUND_TOKEN $@1 '{' memb_list '}' */ -#line 161 "hl/src//H5LTparse.y" + case 52: /* compound_type: H5T_COMPOUND_TOKEN $@1 '{' memb_list '}' */ +#line 168 "hl/src//H5LTparse.y" { (yyval.hid) = cmpd_stack[csindex].id; cmpd_stack[csindex].id = 0; cmpd_stack[csindex].first_memb = 1; csindex--; } -#line 1604 "hl/src//H5LTparse.c" +#line 1636 "hl/src//H5LTparse.c" break; - case 54: /* $@2: %empty */ -#line 170 "hl/src//H5LTparse.y" + case 55: /* $@2: %empty */ +#line 177 "hl/src//H5LTparse.y" { cmpd_stack[csindex].is_field = 1; /*notify lexer a compound member is parsed*/ } -#line 1610 "hl/src//H5LTparse.c" +#line 1642 "hl/src//H5LTparse.c" break; - case 55: /* memb_def: ddl_type $@2 field_name field_offset ';' */ -#line 172 "hl/src//H5LTparse.y" + case 56: /* memb_def: ddl_type $@2 field_name field_offset ';' */ +#line 179 "hl/src//H5LTparse.y" { size_t origin_size, new_size; hid_t dtype_id = cmpd_stack[csindex].id; @@ -1676,108 +1706,168 @@ yyparse (void) new_size = H5Tget_size(dtype_id); } -#line 1649 "hl/src//H5LTparse.c" +#line 1681 "hl/src//H5LTparse.c" break; - case 56: /* field_name: STRING */ -#line 208 "hl/src//H5LTparse.y" + case 57: /* field_name: STRING */ +#line 215 "hl/src//H5LTparse.y" { (yyval.sval) = strdup(yylval.sval); free(yylval.sval); yylval.sval = NULL; } -#line 1659 "hl/src//H5LTparse.c" +#line 1691 "hl/src//H5LTparse.c" break; - case 57: /* field_offset: %empty */ -#line 215 "hl/src//H5LTparse.y" + case 58: /* field_offset: %empty */ +#line 222 "hl/src//H5LTparse.y" { (yyval.ival) = 0; } -#line 1665 "hl/src//H5LTparse.c" +#line 1697 "hl/src//H5LTparse.c" break; - case 58: /* field_offset: ':' offset */ -#line 217 "hl/src//H5LTparse.y" + case 59: /* field_offset: ':' offset */ +#line 224 "hl/src//H5LTparse.y" { (yyval.ival) = yylval.ival; } -#line 1671 "hl/src//H5LTparse.c" +#line 1703 "hl/src//H5LTparse.c" break; - case 60: /* $@3: %empty */ -#line 221 "hl/src//H5LTparse.y" + case 61: /* $@3: %empty */ +#line 228 "hl/src//H5LTparse.y" { asindex++; /*pushd onto the stack*/ } -#line 1677 "hl/src//H5LTparse.c" +#line 1709 "hl/src//H5LTparse.c" break; - case 61: /* array_type: H5T_ARRAY_TOKEN $@3 '{' dim_list ddl_type '}' */ -#line 223 "hl/src//H5LTparse.y" + case 62: /* array_type: H5T_ARRAY_TOKEN $@3 '{' dim_list ddl_type '}' */ +#line 230 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tarray_create2((yyvsp[-1].hid), arr_stack[asindex].ndims, arr_stack[asindex].dims); arr_stack[asindex].ndims = 0; asindex--; H5Tclose((yyvsp[-1].hid)); } -#line 1688 "hl/src//H5LTparse.c" +#line 1720 "hl/src//H5LTparse.c" break; - case 64: /* $@4: %empty */ -#line 233 "hl/src//H5LTparse.y" + case 65: /* $@4: %empty */ +#line 240 "hl/src//H5LTparse.y" { arr_stack[asindex].is_dim = 1; /*notice lexer of dimension size*/ } -#line 1694 "hl/src//H5LTparse.c" +#line 1726 "hl/src//H5LTparse.c" break; - case 65: /* $@5: %empty */ -#line 234 "hl/src//H5LTparse.y" + case 66: /* $@5: %empty */ +#line 241 "hl/src//H5LTparse.y" { unsigned ndims = arr_stack[asindex].ndims; arr_stack[asindex].dims[ndims] = (hsize_t)yylval.ival; arr_stack[asindex].ndims++; arr_stack[asindex].is_dim = 0; } -#line 1704 "hl/src//H5LTparse.c" +#line 1736 "hl/src//H5LTparse.c" break; - case 68: /* vlen_type: H5T_VLEN_TOKEN '{' ddl_type '}' */ -#line 245 "hl/src//H5LTparse.y" + case 69: /* vlen_type: H5T_VLEN_TOKEN '{' ddl_type '}' */ +#line 252 "hl/src//H5LTparse.y" { (yyval.hid) = H5Tvlen_create((yyvsp[-1].hid)); H5Tclose((yyvsp[-1].hid)); } -#line 1710 "hl/src//H5LTparse.c" +#line 1742 "hl/src//H5LTparse.c" + break; + + case 70: /* complex_type: H5T_NATIVE_FLOAT_COMPLEX_TOKEN */ +#line 255 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_NATIVE_FLOAT_COMPLEX); } +#line 1748 "hl/src//H5LTparse.c" + break; + + case 71: /* complex_type: H5T_NATIVE_DOUBLE_COMPLEX_TOKEN */ +#line 256 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_NATIVE_DOUBLE_COMPLEX); } +#line 1754 "hl/src//H5LTparse.c" + break; + + case 72: /* complex_type: H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN */ +#line 257 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_NATIVE_LDOUBLE_COMPLEX); } +#line 1760 "hl/src//H5LTparse.c" + break; + + case 73: /* complex_type: H5T_COMPLEX_IEEE_F16LE_TOKEN */ +#line 258 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_COMPLEX_IEEE_F16LE); } +#line 1766 "hl/src//H5LTparse.c" + break; + + case 74: /* complex_type: H5T_COMPLEX_IEEE_F16BE_TOKEN */ +#line 259 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_COMPLEX_IEEE_F16BE); } +#line 1772 "hl/src//H5LTparse.c" break; - case 69: /* @6: %empty */ -#line 251 "hl/src//H5LTparse.y" + case 75: /* complex_type: H5T_COMPLEX_IEEE_F32LE_TOKEN */ +#line 260 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_COMPLEX_IEEE_F32LE); } +#line 1778 "hl/src//H5LTparse.c" + break; + + case 76: /* complex_type: H5T_COMPLEX_IEEE_F32BE_TOKEN */ +#line 261 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_COMPLEX_IEEE_F32BE); } +#line 1784 "hl/src//H5LTparse.c" + break; + + case 77: /* complex_type: H5T_COMPLEX_IEEE_F64LE_TOKEN */ +#line 262 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_COMPLEX_IEEE_F64LE); } +#line 1790 "hl/src//H5LTparse.c" + break; + + case 78: /* complex_type: H5T_COMPLEX_IEEE_F64BE_TOKEN */ +#line 263 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcopy(H5T_COMPLEX_IEEE_F64BE); } +#line 1796 "hl/src//H5LTparse.c" + break; + + case 79: /* complex_type: H5T_COMPLEX_TOKEN '{' ddl_type '}' */ +#line 265 "hl/src//H5LTparse.y" + { (yyval.hid) = H5Tcomplex_create((yyvsp[-1].hid)); H5Tclose((yyvsp[-1].hid)); } +#line 1802 "hl/src//H5LTparse.c" + break; + + case 80: /* @6: %empty */ +#line 271 "hl/src//H5LTparse.y" { size_t size = (size_t)yylval.ival; (yyval.hid) = H5Tcreate(H5T_OPAQUE, size); } -#line 1719 "hl/src//H5LTparse.c" +#line 1811 "hl/src//H5LTparse.c" break; - case 70: /* $@7: %empty */ -#line 256 "hl/src//H5LTparse.y" + case 81: /* $@7: %empty */ +#line 276 "hl/src//H5LTparse.y" { H5Tset_tag((yyvsp[-3].hid), yylval.sval); free(yylval.sval); yylval.sval = NULL; } -#line 1729 "hl/src//H5LTparse.c" +#line 1821 "hl/src//H5LTparse.c" break; - case 71: /* opaque_type: H5T_OPAQUE_TOKEN '{' OPQ_SIZE_TOKEN opaque_size ';' @6 OPQ_TAG_TOKEN opaque_tag ';' $@7 '}' */ -#line 261 "hl/src//H5LTparse.y" + case 82: /* opaque_type: H5T_OPAQUE_TOKEN '{' OPQ_SIZE_TOKEN opaque_size ';' @6 OPQ_TAG_TOKEN opaque_tag ';' $@7 '}' */ +#line 281 "hl/src//H5LTparse.y" { (yyval.hid) = (yyvsp[-5].hid); } -#line 1735 "hl/src//H5LTparse.c" +#line 1827 "hl/src//H5LTparse.c" break; - case 74: /* $@8: %empty */ -#line 270 "hl/src//H5LTparse.y" + case 85: /* $@8: %empty */ +#line 290 "hl/src//H5LTparse.y" { if((yyvsp[-1].ival) == H5T_VARIABLE_TOKEN) is_variable = 1; else str_size = yylval.ival; } -#line 1746 "hl/src//H5LTparse.c" +#line 1838 "hl/src//H5LTparse.c" break; - case 75: /* $@9: %empty */ -#line 277 "hl/src//H5LTparse.y" + case 86: /* $@9: %empty */ +#line 297 "hl/src//H5LTparse.y" { if((yyvsp[-1].ival) == H5T_STR_NULLTERM_TOKEN) str_pad = H5T_STR_NULLTERM; @@ -1786,33 +1876,33 @@ yyparse (void) else if((yyvsp[-1].ival) == H5T_STR_SPACEPAD_TOKEN) str_pad = H5T_STR_SPACEPAD; } -#line 1759 "hl/src//H5LTparse.c" +#line 1851 "hl/src//H5LTparse.c" break; - case 76: /* $@10: %empty */ -#line 286 "hl/src//H5LTparse.y" + case 87: /* $@10: %empty */ +#line 306 "hl/src//H5LTparse.y" { if((yyvsp[-1].ival) == H5T_CSET_ASCII_TOKEN) str_cset = H5T_CSET_ASCII; else if((yyvsp[-1].ival) == H5T_CSET_UTF8_TOKEN) str_cset = H5T_CSET_UTF8; } -#line 1770 "hl/src//H5LTparse.c" +#line 1862 "hl/src//H5LTparse.c" break; - case 77: /* @11: %empty */ -#line 293 "hl/src//H5LTparse.y" + case 88: /* @11: %empty */ +#line 313 "hl/src//H5LTparse.y" { if((yyvsp[-1].hid) == H5T_C_S1_TOKEN) (yyval.hid) = H5Tcopy(H5T_C_S1); else if((yyvsp[-1].hid) == H5T_FORTRAN_S1_TOKEN) (yyval.hid) = H5Tcopy(H5T_FORTRAN_S1); } -#line 1781 "hl/src//H5LTparse.c" +#line 1873 "hl/src//H5LTparse.c" break; - case 78: /* string_type: H5T_STRING_TOKEN '{' STRSIZE_TOKEN strsize ';' $@8 STRPAD_TOKEN strpad ';' $@9 CSET_TOKEN cset ';' $@10 CTYPE_TOKEN ctype ';' @11 '}' */ -#line 300 "hl/src//H5LTparse.y" + case 89: /* string_type: H5T_STRING_TOKEN '{' STRSIZE_TOKEN strsize ';' $@8 STRPAD_TOKEN strpad ';' $@9 CSET_TOKEN cset ';' $@10 CTYPE_TOKEN ctype ';' @11 '}' */ +#line 320 "hl/src//H5LTparse.y" { hid_t str_id = (yyvsp[-1].hid); @@ -1829,82 +1919,82 @@ yyparse (void) (yyval.hid) = str_id; } -#line 1802 "hl/src//H5LTparse.c" +#line 1894 "hl/src//H5LTparse.c" break; - case 79: /* strsize: H5T_VARIABLE_TOKEN */ -#line 317 "hl/src//H5LTparse.y" + case 90: /* strsize: H5T_VARIABLE_TOKEN */ +#line 337 "hl/src//H5LTparse.y" {(yyval.ival) = H5T_VARIABLE_TOKEN;} -#line 1808 "hl/src//H5LTparse.c" +#line 1900 "hl/src//H5LTparse.c" break; - case 81: /* strpad: H5T_STR_NULLTERM_TOKEN */ -#line 320 "hl/src//H5LTparse.y" + case 92: /* strpad: H5T_STR_NULLTERM_TOKEN */ +#line 340 "hl/src//H5LTparse.y" {(yyval.ival) = H5T_STR_NULLTERM_TOKEN;} -#line 1814 "hl/src//H5LTparse.c" +#line 1906 "hl/src//H5LTparse.c" break; - case 82: /* strpad: H5T_STR_NULLPAD_TOKEN */ -#line 321 "hl/src//H5LTparse.y" + case 93: /* strpad: H5T_STR_NULLPAD_TOKEN */ +#line 341 "hl/src//H5LTparse.y" {(yyval.ival) = H5T_STR_NULLPAD_TOKEN;} -#line 1820 "hl/src//H5LTparse.c" +#line 1912 "hl/src//H5LTparse.c" break; - case 83: /* strpad: H5T_STR_SPACEPAD_TOKEN */ -#line 322 "hl/src//H5LTparse.y" + case 94: /* strpad: H5T_STR_SPACEPAD_TOKEN */ +#line 342 "hl/src//H5LTparse.y" {(yyval.ival) = H5T_STR_SPACEPAD_TOKEN;} -#line 1826 "hl/src//H5LTparse.c" +#line 1918 "hl/src//H5LTparse.c" break; - case 84: /* cset: H5T_CSET_ASCII_TOKEN */ -#line 324 "hl/src//H5LTparse.y" + case 95: /* cset: H5T_CSET_ASCII_TOKEN */ +#line 344 "hl/src//H5LTparse.y" {(yyval.ival) = H5T_CSET_ASCII_TOKEN;} -#line 1832 "hl/src//H5LTparse.c" +#line 1924 "hl/src//H5LTparse.c" break; - case 85: /* cset: H5T_CSET_UTF8_TOKEN */ -#line 325 "hl/src//H5LTparse.y" + case 96: /* cset: H5T_CSET_UTF8_TOKEN */ +#line 345 "hl/src//H5LTparse.y" {(yyval.ival) = H5T_CSET_UTF8_TOKEN;} -#line 1838 "hl/src//H5LTparse.c" +#line 1930 "hl/src//H5LTparse.c" break; - case 86: /* ctype: H5T_C_S1_TOKEN */ -#line 327 "hl/src//H5LTparse.y" + case 97: /* ctype: H5T_C_S1_TOKEN */ +#line 347 "hl/src//H5LTparse.y" {(yyval.hid) = H5T_C_S1_TOKEN;} -#line 1844 "hl/src//H5LTparse.c" +#line 1936 "hl/src//H5LTparse.c" break; - case 87: /* ctype: H5T_FORTRAN_S1_TOKEN */ -#line 328 "hl/src//H5LTparse.y" + case 98: /* ctype: H5T_FORTRAN_S1_TOKEN */ +#line 348 "hl/src//H5LTparse.y" {(yyval.hid) = H5T_FORTRAN_S1_TOKEN;} -#line 1850 "hl/src//H5LTparse.c" +#line 1942 "hl/src//H5LTparse.c" break; - case 88: /* $@12: %empty */ -#line 332 "hl/src//H5LTparse.y" + case 99: /* $@12: %empty */ +#line 352 "hl/src//H5LTparse.y" { is_enum = 1; enum_id = H5Tenum_create((yyvsp[-1].hid)); H5Tclose((yyvsp[-1].hid)); } -#line 1856 "hl/src//H5LTparse.c" +#line 1948 "hl/src//H5LTparse.c" break; - case 89: /* enum_type: H5T_ENUM_TOKEN '{' integer_type ';' $@12 enum_list '}' */ -#line 334 "hl/src//H5LTparse.y" + case 100: /* enum_type: H5T_ENUM_TOKEN '{' integer_type ';' $@12 enum_list '}' */ +#line 354 "hl/src//H5LTparse.y" { is_enum = 0; /*reset*/ (yyval.hid) = enum_id; } -#line 1862 "hl/src//H5LTparse.c" +#line 1954 "hl/src//H5LTparse.c" break; - case 92: /* $@13: %empty */ -#line 339 "hl/src//H5LTparse.y" + case 103: /* $@13: %empty */ +#line 359 "hl/src//H5LTparse.y" { is_enum_memb = 1; /*indicate member of enum*/ enum_memb_symbol = strdup(yylval.sval); free(yylval.sval); yylval.sval = NULL; } -#line 1873 "hl/src//H5LTparse.c" +#line 1965 "hl/src//H5LTparse.c" break; - case 93: /* enum_def: enum_symbol $@13 enum_val ';' */ -#line 346 "hl/src//H5LTparse.y" + case 104: /* enum_def: enum_symbol $@13 enum_val ';' */ +#line 366 "hl/src//H5LTparse.y" { char char_val=(char)yylval.ival; short short_val=(short)yylval.ival; @@ -1947,11 +2037,11 @@ yyparse (void) H5Tclose(super); H5Tclose(native); } -#line 1920 "hl/src//H5LTparse.c" +#line 2012 "hl/src//H5LTparse.c" break; -#line 1924 "hl/src//H5LTparse.c" +#line 2016 "hl/src//H5LTparse.c" default: break; } diff --git a/hl/src/H5LTparse.h b/hl/src/H5LTparse.h index be3c91f7fdb..0ac873895c3 100644 --- a/hl/src/H5LTparse.h +++ b/hl/src/H5LTparse.h @@ -91,28 +91,38 @@ extern int H5LTyydebug; H5T_NATIVE_FLOAT_TOKEN = 292, /* H5T_NATIVE_FLOAT_TOKEN */ H5T_NATIVE_DOUBLE_TOKEN = 293, /* H5T_NATIVE_DOUBLE_TOKEN */ H5T_NATIVE_LDOUBLE_TOKEN = 294, /* H5T_NATIVE_LDOUBLE_TOKEN */ - H5T_STRING_TOKEN = 295, /* H5T_STRING_TOKEN */ - STRSIZE_TOKEN = 296, /* STRSIZE_TOKEN */ - STRPAD_TOKEN = 297, /* STRPAD_TOKEN */ - CSET_TOKEN = 298, /* CSET_TOKEN */ - CTYPE_TOKEN = 299, /* CTYPE_TOKEN */ - H5T_VARIABLE_TOKEN = 300, /* H5T_VARIABLE_TOKEN */ - H5T_STR_NULLTERM_TOKEN = 301, /* H5T_STR_NULLTERM_TOKEN */ - H5T_STR_NULLPAD_TOKEN = 302, /* H5T_STR_NULLPAD_TOKEN */ - H5T_STR_SPACEPAD_TOKEN = 303, /* H5T_STR_SPACEPAD_TOKEN */ - H5T_CSET_ASCII_TOKEN = 304, /* H5T_CSET_ASCII_TOKEN */ - H5T_CSET_UTF8_TOKEN = 305, /* H5T_CSET_UTF8_TOKEN */ - H5T_C_S1_TOKEN = 306, /* H5T_C_S1_TOKEN */ - H5T_FORTRAN_S1_TOKEN = 307, /* H5T_FORTRAN_S1_TOKEN */ - H5T_OPAQUE_TOKEN = 308, /* H5T_OPAQUE_TOKEN */ - OPQ_SIZE_TOKEN = 309, /* OPQ_SIZE_TOKEN */ - OPQ_TAG_TOKEN = 310, /* OPQ_TAG_TOKEN */ - H5T_COMPOUND_TOKEN = 311, /* H5T_COMPOUND_TOKEN */ - H5T_ENUM_TOKEN = 312, /* H5T_ENUM_TOKEN */ - H5T_ARRAY_TOKEN = 313, /* H5T_ARRAY_TOKEN */ - H5T_VLEN_TOKEN = 314, /* H5T_VLEN_TOKEN */ - STRING = 315, /* STRING */ - NUMBER = 316 /* NUMBER */ + H5T_COMPLEX_IEEE_F16BE_TOKEN = 295, /* H5T_COMPLEX_IEEE_F16BE_TOKEN */ + H5T_COMPLEX_IEEE_F16LE_TOKEN = 296, /* H5T_COMPLEX_IEEE_F16LE_TOKEN */ + H5T_COMPLEX_IEEE_F32BE_TOKEN = 297, /* H5T_COMPLEX_IEEE_F32BE_TOKEN */ + H5T_COMPLEX_IEEE_F32LE_TOKEN = 298, /* H5T_COMPLEX_IEEE_F32LE_TOKEN */ + H5T_COMPLEX_IEEE_F64BE_TOKEN = 299, /* H5T_COMPLEX_IEEE_F64BE_TOKEN */ + H5T_COMPLEX_IEEE_F64LE_TOKEN = 300, /* H5T_COMPLEX_IEEE_F64LE_TOKEN */ + H5T_NATIVE_FLOAT_COMPLEX_TOKEN = 301, /* H5T_NATIVE_FLOAT_COMPLEX_TOKEN */ + H5T_NATIVE_DOUBLE_COMPLEX_TOKEN = 302, /* H5T_NATIVE_DOUBLE_COMPLEX_TOKEN */ + H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN = 303, /* H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN */ + H5T_STRING_TOKEN = 304, /* H5T_STRING_TOKEN */ + STRSIZE_TOKEN = 305, /* STRSIZE_TOKEN */ + STRPAD_TOKEN = 306, /* STRPAD_TOKEN */ + CSET_TOKEN = 307, /* CSET_TOKEN */ + CTYPE_TOKEN = 308, /* CTYPE_TOKEN */ + H5T_VARIABLE_TOKEN = 309, /* H5T_VARIABLE_TOKEN */ + H5T_STR_NULLTERM_TOKEN = 310, /* H5T_STR_NULLTERM_TOKEN */ + H5T_STR_NULLPAD_TOKEN = 311, /* H5T_STR_NULLPAD_TOKEN */ + H5T_STR_SPACEPAD_TOKEN = 312, /* H5T_STR_SPACEPAD_TOKEN */ + H5T_CSET_ASCII_TOKEN = 313, /* H5T_CSET_ASCII_TOKEN */ + H5T_CSET_UTF8_TOKEN = 314, /* H5T_CSET_UTF8_TOKEN */ + H5T_C_S1_TOKEN = 315, /* H5T_C_S1_TOKEN */ + H5T_FORTRAN_S1_TOKEN = 316, /* H5T_FORTRAN_S1_TOKEN */ + H5T_OPAQUE_TOKEN = 317, /* H5T_OPAQUE_TOKEN */ + OPQ_SIZE_TOKEN = 318, /* OPQ_SIZE_TOKEN */ + OPQ_TAG_TOKEN = 319, /* OPQ_TAG_TOKEN */ + H5T_COMPOUND_TOKEN = 320, /* H5T_COMPOUND_TOKEN */ + H5T_ENUM_TOKEN = 321, /* H5T_ENUM_TOKEN */ + H5T_ARRAY_TOKEN = 322, /* H5T_ARRAY_TOKEN */ + H5T_VLEN_TOKEN = 323, /* H5T_VLEN_TOKEN */ + H5T_COMPLEX_TOKEN = 324, /* H5T_COMPLEX_TOKEN */ + STRING = 325, /* STRING */ + NUMBER = 326 /* NUMBER */ }; typedef enum yytokentype yytoken_kind_t; #endif @@ -127,7 +137,7 @@ union YYSTYPE char *sval; /*for name string*/ hid_t hid; /*for hid_t token*/ -#line 131 "hl/src//H5LTparse.h" +#line 141 "hl/src//H5LTparse.h" }; typedef union YYSTYPE YYSTYPE; diff --git a/hl/src/H5LTparse.y b/hl/src/H5LTparse.y index 3a14e769419..2d36af73b0c 100644 --- a/hl/src/H5LTparse.y +++ b/hl/src/H5LTparse.y @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -83,6 +83,11 @@ static char* enum_memb_symbol; /*enum member symbol string*/ %token H5T_IEEE_F32BE_TOKEN H5T_IEEE_F32LE_TOKEN H5T_IEEE_F64BE_TOKEN H5T_IEEE_F64LE_TOKEN %token H5T_NATIVE_FLOAT16_TOKEN H5T_NATIVE_FLOAT_TOKEN H5T_NATIVE_DOUBLE_TOKEN H5T_NATIVE_LDOUBLE_TOKEN +%token H5T_COMPLEX_IEEE_F16BE_TOKEN H5T_COMPLEX_IEEE_F16LE_TOKEN +%token H5T_COMPLEX_IEEE_F32BE_TOKEN H5T_COMPLEX_IEEE_F32LE_TOKEN +%token H5T_COMPLEX_IEEE_F64BE_TOKEN H5T_COMPLEX_IEEE_F64LE_TOKEN +%token H5T_NATIVE_FLOAT_COMPLEX_TOKEN H5T_NATIVE_DOUBLE_COMPLEX_TOKEN H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN + %token H5T_STRING_TOKEN STRSIZE_TOKEN STRPAD_TOKEN CSET_TOKEN CTYPE_TOKEN H5T_VARIABLE_TOKEN %token H5T_STR_NULLTERM_TOKEN H5T_STR_NULLPAD_TOKEN H5T_STR_SPACEPAD_TOKEN %token H5T_CSET_ASCII_TOKEN H5T_CSET_UTF8_TOKEN H5T_C_S1_TOKEN H5T_FORTRAN_S1_TOKEN @@ -93,6 +98,7 @@ static char* enum_memb_symbol; /*enum member symbol string*/ %token H5T_ENUM_TOKEN %token H5T_ARRAY_TOKEN %token H5T_VLEN_TOKEN +%token H5T_COMPLEX_TOKEN %token STRING %token NUMBER @@ -106,6 +112,7 @@ ddl_type : atomic_type | compound_type | array_type | vlen_type + | complex_type ; atomic_type : integer_type | fp_type @@ -245,6 +252,19 @@ vlen_type : H5T_VLEN_TOKEN '{' ddl_type '}' { $$ = H5Tvlen_create($3); H5Tclose($3); } ; +complex_type : H5T_NATIVE_FLOAT_COMPLEX_TOKEN { $$ = H5Tcopy(H5T_NATIVE_FLOAT_COMPLEX); } + | H5T_NATIVE_DOUBLE_COMPLEX_TOKEN { $$ = H5Tcopy(H5T_NATIVE_DOUBLE_COMPLEX); } + | H5T_NATIVE_LDOUBLE_COMPLEX_TOKEN { $$ = H5Tcopy(H5T_NATIVE_LDOUBLE_COMPLEX); } + | H5T_COMPLEX_IEEE_F16LE_TOKEN { $$ = H5Tcopy(H5T_COMPLEX_IEEE_F16LE); } + | H5T_COMPLEX_IEEE_F16BE_TOKEN { $$ = H5Tcopy(H5T_COMPLEX_IEEE_F16BE); } + | H5T_COMPLEX_IEEE_F32LE_TOKEN { $$ = H5Tcopy(H5T_COMPLEX_IEEE_F32LE); } + | H5T_COMPLEX_IEEE_F32BE_TOKEN { $$ = H5Tcopy(H5T_COMPLEX_IEEE_F32BE); } + | H5T_COMPLEX_IEEE_F64LE_TOKEN { $$ = H5Tcopy(H5T_COMPLEX_IEEE_F64LE); } + | H5T_COMPLEX_IEEE_F64BE_TOKEN { $$ = H5Tcopy(H5T_COMPLEX_IEEE_F64BE); } + | H5T_COMPLEX_TOKEN '{' ddl_type '}' + { $$ = H5Tcomplex_create($3); H5Tclose($3); } + ; + opaque_type : H5T_OPAQUE_TOKEN '{' OPQ_SIZE_TOKEN opaque_size ';' diff --git a/hl/src/H5LTprivate.h b/hl/src/H5LTprivate.h index bea2e63c8eb..bf7c277a3fb 100644 --- a/hl/src/H5LTprivate.h +++ b/hl/src/H5LTprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5LTpublic.h b/hl/src/H5LTpublic.h index f5eea20eb60..11ace0be32a 100644 --- a/hl/src/H5LTpublic.h +++ b/hl/src/H5LTpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1625,8 +1625,7 @@ H5_HLDLL htri_t H5LTpath_valid(hid_t loc_id, const char *path, hbool_t check_obj * \note **Recommended Reading:** * \note This function is part of the file image operations feature set. * It is highly recommended to study the guide - * - * HDF5 File Image Operations before using this feature set.\n + * \ref H5FIM_UG before using this feature set.\n * See the “See Also” section below for links to other elements of * HDF5 file image operations. * diff --git a/hl/src/H5PT.c b/hl/src/H5PT.c index 183cae83bea..c8cefd3a324 100644 --- a/hl/src/H5PT.c +++ b/hl/src/H5PT.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5PTprivate.h b/hl/src/H5PTprivate.h index 1e88cec182a..f25f4f9063b 100644 --- a/hl/src/H5PTprivate.h +++ b/hl/src/H5PTprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5PTpublic.h b/hl/src/H5PTpublic.h index 607e385c5c7..babf3152b84 100644 --- a/hl/src/H5PTpublic.h +++ b/hl/src/H5PTpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5TB.c b/hl/src/H5TB.c index e1c2382887e..f94dc26cc5c 100644 --- a/hl/src/H5TB.c +++ b/hl/src/H5TB.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -3185,7 +3185,7 @@ H5TB_create_type(hid_t loc_id, const char *dset_name, size_t type_size, const si if (H5TBget_table_info(loc_id, dset_name, &nfields, NULL) < 0) goto out; - if (NULL == (fnames = (char **)calloc(sizeof(char *), (size_t)nfields))) + if (NULL == (fnames = (char **)calloc((size_t)nfields, sizeof(char *)))) goto out; for (i = 0; i < nfields; i++) diff --git a/hl/src/H5TBprivate.h b/hl/src/H5TBprivate.h index ce591689aea..11346f6d862 100644 --- a/hl/src/H5TBprivate.h +++ b/hl/src/H5TBprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/H5TBpublic.h b/hl/src/H5TBpublic.h index dbeb330a1db..1dfee515b34 100644 --- a/hl/src/H5TBpublic.h +++ b/hl/src/H5TBpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/src/Makefile.am b/hl/src/Makefile.am index 650a89f5c62..d3fd894904a 100644 --- a/hl/src/Makefile.am +++ b/hl/src/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/src/hdf5_hl.h b/hl/src/hdf5_hl.h index 7757b392e19..ffbeedfc647 100644 --- a/hl/src/hdf5_hl.h +++ b/hl/src/hdf5_hl.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/CMakeTests.cmake b/hl/test/CMakeTests.cmake index 6ec5f29a534..038ec332373 100644 --- a/hl/test/CMakeTests.cmake +++ b/hl/test/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/test/H5srcdir_str.h.in b/hl/test/H5srcdir_str.h.in index 55280cd641c..3e161381abb 100644 --- a/hl/test/H5srcdir_str.h.in +++ b/hl/test/H5srcdir_str.h.in @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/Makefile.am b/hl/test/Makefile.am index 6f66291b25d..4650ed2fa04 100644 --- a/hl/test/Makefile.am +++ b/hl/test/Makefile.am @@ -3,7 +3,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/test/gen_test_ds.c b/hl/test/gen_test_ds.c index 525f44a046b..edcdd1b42bb 100644 --- a/hl/test/gen_test_ds.c +++ b/hl/test/gen_test_ds.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/gen_test_ld.c b/hl/test/gen_test_ld.c index 7eefd5ca6c6..51e4bb023fe 100644 --- a/hl/test/gen_test_ld.c +++ b/hl/test/gen_test_ld.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/h5hltest.h b/hl/test/h5hltest.h index 3d58ed60917..fdf09c30977 100644 --- a/hl/test/h5hltest.h +++ b/hl/test/h5hltest.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/pal_rgb.h b/hl/test/pal_rgb.h index 8409f7ed696..af2e2320569 100644 --- a/hl/test/pal_rgb.h +++ b/hl/test/pal_rgb.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_ds.c b/hl/test/test_ds.c index 0172cb45a22..117f9589347 100644 --- a/hl/test/test_ds.c +++ b/hl/test/test_ds.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_dset_append.c b/hl/test/test_dset_append.c index d3e385532b7..e00bcc1477d 100644 --- a/hl/test/test_dset_append.c +++ b/hl/test/test_dset_append.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_file_image.c b/hl/test/test_file_image.c index 9cb7f453e44..8072b95ee7d 100644 --- a/hl/test/test_file_image.c +++ b/hl/test/test_file_image.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_h5do_compat.c b/hl/test/test_h5do_compat.c index 3d26f7eb25b..6c75918c9ba 100644 --- a/hl/test/test_h5do_compat.c +++ b/hl/test/test_h5do_compat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_image.c b/hl/test/test_image.c index b9f290e9d45..3e5945d958c 100644 --- a/hl/test/test_image.c +++ b/hl/test/test_image.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_ld.c b/hl/test/test_ld.c index b0579d5d420..c65992506d2 100644 --- a/hl/test/test_ld.c +++ b/hl/test/test_ld.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_lite.c b/hl/test/test_lite.c index 23508b79990..d17ca14870f 100644 --- a/hl/test/test_lite.c +++ b/hl/test/test_lite.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1893,6 +1893,226 @@ test_complicated_compound(void) return -1; } +/*------------------------------------------------------------------------- + * subroutine for test_text_dtype(): test complex number datatypes + *------------------------------------------------------------------------- + */ +static int +test_complex(void) +{ + hid_t dtype; + H5T_class_t type_class; + + HL_TESTING3(" text for complex number types"); + +#ifdef H5_HAVE_COMPLEX_NUMBERS + if ((dtype = H5LTtext_to_dtype("H5T_NATIVE_FLOAT_COMPLEX\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_NATIVE_FLOAT_COMPLEX)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_NATIVE_DOUBLE_COMPLEX\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_NATIVE_DOUBLE_COMPLEX)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_NATIVE_LDOUBLE_COMPLEX\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_NATIVE_LDOUBLE_COMPLEX)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_NATIVE_FLOAT }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_NATIVE_FLOAT_COMPLEX)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_NATIVE_DOUBLE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_NATIVE_DOUBLE_COMPLEX)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_NATIVE_LDOUBLE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_NATIVE_LDOUBLE_COMPLEX)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; +#endif + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX_IEEE_F16LE\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F16LE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX_IEEE_F16BE\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F16BE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX_IEEE_F32LE\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F32LE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX_IEEE_F32BE\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F32BE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX_IEEE_F64LE\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F64LE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX_IEEE_F64BE\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F64BE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_IEEE_F16LE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F16LE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_IEEE_F16BE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F16BE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_IEEE_F32LE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F32LE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_IEEE_F32BE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F32BE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_IEEE_F64LE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F64LE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + if ((dtype = H5LTtext_to_dtype("H5T_COMPLEX { H5T_IEEE_F64BE }\n", H5LT_DDL)) < 0) + goto out; + if ((type_class = H5Tget_class(dtype)) < 0) + goto out; + if (type_class != H5T_COMPLEX) + goto out; + if (!H5Tequal(dtype, H5T_COMPLEX_IEEE_F64BE)) + goto out; + if (H5Tclose(dtype) < 0) + goto out; + + PASSED(); + return 0; + +out: + H5_FAILED(); + return -1; +} + /*------------------------------------------------------------------------- * test H5LTtext_to_dtype function *------------------------------------------------------------------------- @@ -1933,6 +2153,9 @@ test_text_dtype(void) if (test_complicated_compound() < 0) goto out; + if (test_complex() < 0) + goto out; + return 0; out: @@ -2134,54 +2357,54 @@ test_valid_path(void) * CHECK ABSOLUTE PATHS **************************************/ - if ((path_valid = H5LTpath_valid(file_id, "/", TRUE)) != TRUE) { + if ((path_valid = H5LTpath_valid(file_id, "/", true)) != true) { goto out; } - if ((path_valid = H5LTpath_valid(file_id, "/", FALSE)) != TRUE) { + if ((path_valid = H5LTpath_valid(file_id, "/", false)) != true) { goto out; } - if ((path_valid = H5LTpath_valid(file_id, "/G1", TRUE)) != TRUE) { + if ((path_valid = H5LTpath_valid(file_id, "/G1", true)) != true) { goto out; } - if ((path_valid = H5LTpath_valid(file_id, "/G1/DS1", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/DS1", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/DS3", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/DS3", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G5", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G5", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/DS1", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/DS1", false)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/DS1", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/DS1", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G2", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G2", true)) != true) goto out; /* check soft link points to a valid object*/ - if ((path_valid = H5LTpath_valid(file_id, "/G2/DS4", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G2/DS4", true)) != true) goto out; /* check if path exist, but not the object */ - if ((path_valid = H5LTpath_valid(file_id, "/G2/G7", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G2/G7", false)) != true) goto out; /* check if path exist and if the object exists. It should fail * since it is a dangling soft link */ - if ((path_valid = H5LTpath_valid(file_id, "/G2/G7", TRUE)) == TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G2/G7", true)) == true) goto out; /* check soft links */ - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G5/DS4", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G5/DS4", true)) != true) goto out; /************************************** @@ -2191,11 +2414,11 @@ test_valid_path(void) if ((group = H5Gopen2(file_id, "/", H5P_DEFAULT)) < 0) goto out; - if ((path_valid = H5LTpath_valid(group, "/", TRUE)) != TRUE) { + if ((path_valid = H5LTpath_valid(group, "/", true)) != true) { goto out; } - if ((path_valid = H5LTpath_valid(group, "/", FALSE)) != TRUE) { + if ((path_valid = H5LTpath_valid(group, "/", false)) != true) { goto out; } @@ -2207,39 +2430,39 @@ test_valid_path(void) /* The identifier (file id) is the object itself, i.e. "." */ - if ((path_valid = H5LTpath_valid(file_id, ".", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, ".", false)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, ".", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, ".", true)) != true) goto out; /* The identifier (group id) is the object itself, i.e. "." */ - if ((path_valid = H5LTpath_valid(group, ".", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(group, ".", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(group, "DS3", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(group, "DS3", false)) != true) goto out; - if ((path_valid = H5LTpath_valid(group, "DS3", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(group, "DS3", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(group, "G2/G5", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(group, "G2/G5", true)) != true) goto out; /* Check the "./" case */ - if ((path_valid = H5LTpath_valid(group, "./DS3", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(group, "./DS3", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(group, "./G2/G5", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(group, "./G2/G5", true)) != true) goto out; /* Should fail, does not exist */ - if ((path_valid = H5LTpath_valid(group, "./G2/G20", FALSE)) == TRUE) + if ((path_valid = H5LTpath_valid(group, "./G2/G20", false)) == true) goto out; /* Should fail, does not exist */ - if ((path_valid = H5LTpath_valid(group, "./G2/G20", TRUE)) == TRUE) + if ((path_valid = H5LTpath_valid(group, "./G2/G20", true)) == true) goto out; if (H5Gclose(group) < 0) @@ -2250,36 +2473,36 @@ test_valid_path(void) *****************************/ /* The dangled external link path is valid */ - if ((path_valid = H5LTpath_valid(file_id, "/DangledExternalLink", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/DangledExternalLink", false)) != true) goto out; /* The file however does not exists, so the link dangles -> should return false */ - if ((path_valid = H5LTpath_valid(file_id, "/DangledExternalLink", TRUE)) == TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/DangledExternalLink", true)) == true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink", false)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/G2/G6/ExternalLink/DS1", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/G2/G6/ExternalLink/DS1", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/G2/G6/ExternalLink/G20", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/G2/G6/ExternalLink/G20", false)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink/DS1", TRUE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink/DS1", true)) != true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink/G20", FALSE)) != TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink/G20", false)) != true) goto out; /* Should fail, does not exist */ - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink/G20", TRUE)) == TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/G6/ExternalLink/G20", true)) == true) goto out; - if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/G2/G6/ExternalLink/G20", TRUE)) == TRUE) + if ((path_valid = H5LTpath_valid(file_id, "/G1/G2/Gcyc/G2/G6/ExternalLink/G20", true)) == true) goto out; if (H5Fclose(file_id) < 0) diff --git a/hl/test/test_packet.c b/hl/test/test_packet.c index 8baa38cce13..7bda487faab 100644 --- a/hl/test/test_packet.c +++ b/hl/test/test_packet.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_packet_vlen.c b/hl/test/test_packet_vlen.c index d17fcf1412f..a23a2f71565 100644 --- a/hl/test/test_packet_vlen.c +++ b/hl/test/test_packet_vlen.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/test/test_table.c b/hl/test/test_table.c index 4aa359fedcd..8545aac708a 100644 --- a/hl/test/test_table.c +++ b/hl/test/test_table.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/tools/CMakeLists.txt b/hl/tools/CMakeLists.txt index a369d9efa18..cbff5a92157 100644 --- a/hl/tools/CMakeLists.txt +++ b/hl/tools/CMakeLists.txt @@ -1,12 +1,4 @@ cmake_minimum_required (VERSION 3.18) project (HDF5_HL_TOOLS C) -#----------------------------------------------------------------------------- -#-- Option to build the High level GIF Tools -#----------------------------------------------------------------------------- -option (HDF5_BUILD_HL_GIF_TOOLS "Build HDF5 HL GIF Tools" OFF) -if (HDF5_BUILD_HL_GIF_TOOLS) - add_subdirectory (gif2h5) -endif () - add_subdirectory (h5watch) diff --git a/hl/tools/Makefile.am b/hl/tools/Makefile.am index 9f93f676dce..d30551ca85b 100644 --- a/hl/tools/Makefile.am +++ b/hl/tools/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. @@ -18,13 +18,7 @@ include $(top_srcdir)/config/commence.am -if BUILD_TOOLS_HL_GIF_CONDITIONAL - TOOLS_GIF_DIR = gif2h5 -else - TOOLS_GIF_DIR = -endif - # All subdirectories -SUBDIRS=h5watch $(TOOLS_GIF_DIR) +SUBDIRS=h5watch include $(top_srcdir)/config/conclude.am diff --git a/hl/tools/gif2h5/CMakeLists.txt b/hl/tools/gif2h5/CMakeLists.txt deleted file mode 100644 index abef080910c..00000000000 --- a/hl/tools/gif2h5/CMakeLists.txt +++ /dev/null @@ -1,107 +0,0 @@ -cmake_minimum_required (VERSION 3.18) -project (HDF5_HL_TOOLS_GIF2H5 C) - -#----------------------------------------------------------------------------- -# Define Sources -#----------------------------------------------------------------------------- -set (GIF2H5_SOURCES - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/gif.h - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/decompress.c - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/gif2hdf.c - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/gif2mem.c - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/gifread.c - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/writehdf.c -) - -#-- Add gif2hdf5 program -add_executable (gif2h5 ${GIF2H5_SOURCES}) -target_compile_options(gif2h5 PRIVATE "${HDF5_CMAKE_C_FLAGS}") -target_include_directories (gif2h5 PRIVATE "${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") -if (HDF5_BUILD_STATIC_TOOLS) - TARGET_C_PROPERTIES (gif2h5 STATIC) - target_link_libraries (gif2h5 PRIVATE ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET}) -else () - TARGET_C_PROPERTIES (gif2h5 SHARED) - target_link_libraries (gif2h5 PRIVATE ${HDF5_HL_LIBSH_TARGET} ${HDF5_LIBSH_TARGET} ${HDF5_TOOLS_LIBSH_TARGET}) -endif () -set_target_properties (gif2h5 PROPERTIES FOLDER tools/hl) -set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};gif2h5") -set (H5_DEP_EXECUTABLES - gif2h5 -) - -#----------------------------------------------------------------------------- -# Add Target to clang-format -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_FORMATTERS) - clang_format (HDF5_HL_TOOLS_GIF2H5_FORMAT gif2h5) -endif () - -#-- Add h52gif program -set (hdf2gif_SOURCES - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/hdf2gif.c - ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/hdfgifwr.c -) -add_executable (h52gif ${hdf2gif_SOURCES}) -target_compile_options(h52gif PRIVATE "${HDF5_CMAKE_C_FLAGS}") -target_include_directories (h52gif PRIVATE "${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") -if (HDF5_BUILD_STATIC_TOOLS) - TARGET_C_PROPERTIES (h52gif STATIC) - target_link_libraries (h52gif PRIVATE ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET}) -else () - TARGET_C_PROPERTIES (h52gif SHARED) - target_link_libraries (h52gif PRIVATE ${HDF5_HL_LIBSH_TARGET} PRIVATE ${HDF5_LIBSH_TARGET} ${HDF5_TOOLS_LIBSH_TARGET}) -endif () -set_target_properties (h52gif PROPERTIES FOLDER tools/hl) -set_global_variable (HDF5_UTILS_TO_EXPORT "${HDF5_UTILS_TO_EXPORT};h52gif") -set (H5_DEP_EXECUTABLES ${H5_DEP_EXECUTABLES} - h52gif -) - -#----------------------------------------------------------------------------- -# Add Target to clang-format -#----------------------------------------------------------------------------- -if (HDF5_ENABLE_FORMATTERS) - clang_format (HDF5_HL_TOOLS_H52GIF_FORMAT h52gif) -endif () - -if (BUILD_TESTING AND HDF5_TEST_SERIAL) - # -------------------------------------------------------------------- - # This executable can generate the actual test files - Currently not - # used in the CMake Build system as we rely on the test files that are - # shipped with HDF5 source archives - # -------------------------------------------------------------------- - if (HDF5_BUILD_GENERATORS AND BUILD_STATIC_LIBS) - add_executable (hl_h52gifgentest ${HDF5_HL_TOOLS_GIF2H5_SOURCE_DIR}/h52gifgentst.c) - target_include_directories (hl_h52gifgentest PRIVATE "${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") - TARGET_C_PROPERTIES (hl_h52gifgentest STATIC) - target_link_libraries (hl_h52gifgentest PRIVATE ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET}) - set_target_properties (hl_h52gifgentest PROPERTIES FOLDER generator/tools/hl) - - #----------------------------------------------------------------------------- - # Add Target to clang-format - #----------------------------------------------------------------------------- - if (HDF5_ENABLE_FORMATTERS) - clang_format (HDF5_HL_TOOLS_hl_h52gifgentest_FORMAT hl_h52gifgentest) - endif () - -# add_test (NAME hl_h52gifgentest COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $) - endif () - - if (HDF5_TEST_TOOLS) - include (CMakeTests.cmake) - endif () -endif () - -#----------------------------------------------------------------------------- -# Add file(s) to CMake Install -#----------------------------------------------------------------------------- -if (HDF5_EXPORTED_TARGETS) - install ( - TARGETS - ${H5_DEP_EXECUTABLES} - EXPORT - ${HDF5_EXPORTED_TARGETS} - RUNTIME DESTINATION ${HDF5_INSTALL_BIN_DIR} COMPONENT hltoolsapplications - ) -endif () diff --git a/hl/tools/gif2h5/CMakeTests.cmake b/hl/tools/gif2h5/CMakeTests.cmake deleted file mode 100644 index be431c1507b..00000000000 --- a/hl/tools/gif2h5/CMakeTests.cmake +++ /dev/null @@ -1,76 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -# - -############################################################################## -############################################################################## -### T E S T I N G ### -############################################################################## -############################################################################## - -# Make testfiles dir under build dir -file (MAKE_DIRECTORY "${PROJECT_BINARY_DIR}/testfiles") - -# -# copy test files from source to build dir -# -HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/testfiles/image1.gif" "${PROJECT_BINARY_DIR}/testfiles/image1.gif" "gif2h5_files") -HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/testfiles/h52giftst.h5" "${PROJECT_BINARY_DIR}/testfiles/h52giftst.h5" "gif2h5_files") -HDFTEST_COPY_FILE("${PROJECT_SOURCE_DIR}/testfiles/ex_image2.h5" "${PROJECT_BINARY_DIR}/testfiles/ex_image2.h5" "gif2h5_files") -add_custom_target(gif2h5_files ALL COMMENT "Copying files needed by gif2h5 tests" DEPENDS ${gif2h5_files_list}) - -# Remove any output file left over from previous test run -set (HL_TOOLS_CLEANFILES - image1.gif - image1.h5 - image.gif - image24.gif -) -add_test ( - NAME HL_TOOLS-clear-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_TOOLS_CLEANFILES} -) -set_tests_properties (HL_TOOLS-clear-objects PROPERTIES FIXTURES_SETUP clear_tools_hl) -add_test ( - NAME HL_TOOLS-clean-objects - COMMAND ${CMAKE_COMMAND} - -E remove ${HL_TOOLS_CLEANFILES} -) -set_tests_properties (HL_TOOLS-clean-objects PROPERTIES FIXTURES_CLEANUP clear_tools_hl) - -add_test (NAME HL_TOOLS_gif2h5 COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ testfiles/image1.gif image1.h5) -set_tests_properties (HL_TOOLS_gif2h5 PROPERTIES - FIXTURES_REQUIRED clear_tools_hl -) - -add_test (NAME HL_TOOLS_h52gif COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ testfiles/h52giftst.h5 image1.gif -i image) -set_tests_properties (HL_TOOLS_h52gif PROPERTIES - FIXTURES_REQUIRED clear_tools_hl -) - -add_test (NAME HL_TOOLS_h52gif_none COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ testfiles/h52giftst.h5 image.gif -i nosuch_image) -set_tests_properties (HL_TOOLS_h52gif_none PROPERTIES - WILL_FAIL "true" - FIXTURES_REQUIRED clear_tools_hl -) - -#add_test (NAME HL_TOOLS_h52gifpal COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ testfiles/h52giftst.h5 image.gif -i palette) -#set_tests_properties (HL_TOOLS_h52gifpal PROPERTIES -# WILL_FAIL "true" -# FIXTURES_REQUIRED clear_tools_hl -#) - -add_test (NAME HL_TOOLS_h52gif24bits COMMAND ${CMAKE_CROSSCOMPILING_EMULATOR} $ testfiles/ex_image2.h5 image24.gif -i image24bitpixel) -set_tests_properties (HL_TOOLS_h52gif24bits PROPERTIES - WILL_FAIL "true" - FIXTURES_REQUIRED clear_tools_hl -) diff --git a/hl/tools/gif2h5/Makefile.am b/hl/tools/gif2h5/Makefile.am deleted file mode 100644 index d8786f70060..00000000000 --- a/hl/tools/gif2h5/Makefile.am +++ /dev/null @@ -1,50 +0,0 @@ -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -## -## Makefile.am -## Run automake to generate a Makefile.in from this file. -# -# HDF5 Library Makefile(.in) -# - -include $(top_srcdir)/config/commence.am - -# Include src and tools/lib directories -AM_CPPFLAGS+=-I$(top_srcdir)/src -I$(top_srcdir)/tools/lib -I$(top_srcdir)/hl/src - -# These are our main targets, the tools - -bin_PROGRAMS=gif2h5 h52gif - -# Add h52gif and gif2h5 specific linker flags here -h52gif_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS) -gif2h5_LDFLAGS = $(LT_STATIC_EXEC) $(AM_LDFLAGS) - -gif2h5_SOURCES=gif2hdf.c gif2mem.c decompress.c gifread.c writehdf.c - -h52gif_SOURCES=hdf2gif.c hdfgifwr.c - - -# Programs all depend on the hdf5 library, the tools library, and the HL -# library. -LDADD=$(LIBH5_HL) $(LIBH5TOOLS) $(LIBHDF5) - -if BUILD_TESTS_CONDITIONAL - TEST_SCRIPT=h52giftest.sh - check_SCRIPTS=$(TEST_SCRIPT) - noinst_PROGRAMS=h52gifgentst - h52gifgentst_SOURCES=h52gifgentst.c -endif - -CHECK_CLEANFILES+=*.h5 -CHECK_CLEANFILES+=*.gif - -include $(top_srcdir)/config/conclude.am diff --git a/hl/tools/gif2h5/decompress.c b/hl/tools/gif2h5/decompress.c deleted file mode 100644 index 62a22922ff4..00000000000 --- a/hl/tools/gif2h5/decompress.c +++ /dev/null @@ -1,331 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include -#include - -#include "gif.h" - -GIFWORD iWIDE, iHIGH, eWIDE, eHIGH, expand, numcols, strip, nostrip; -unsigned long cols[256]; -char *cmd; - -FILE *fp; - -static GIFWORD XC = 0, YC = 0, /* Output X and Y coords of current pixel */ - InitCodeSize, /* Starting code size, used during Clear */ - CodeSize, /* Code size, read from GIF header */ - BytesPerScanline, /* Bytes per scanline in output raster */ - IWidth, IHeight; /* image dimensions */ -static int BitOffset = 0, /* Bit Offset of next code */ - Pass = 0, /* Used by output routine if GIFWORDerlaced pic */ - OutCount = 0, /* Decompressor output 'stack count' */ - Code, /* Value returned by ReadCode */ - MaxCode, /* limiting value for current code size */ - ClearCode, /* GIF clear code */ - EOFCode, /* GIF end-of-information code */ - CurCode, OldCode, InCode, /* Decompressor variables */ - FirstFree, /* First free code, generated per GIF spec */ - FreeCode, /* Decompressor, next free slot in hash table */ - FinChar, /* Decompressor variable */ - DataMask, /* AND mask for data size */ - ReadMask; /* Code AND mask for current code size */ - -/*MODIFICATIONS*/ -GIFBYTE tempbyte[10]; -GIFBYTE *tempGIFBYTEptr[10]; -GIFWORD tempint[10]; -GIFWORD ImageCount = 0; -/*END MODIFICATION*/ - -boolean Interlace, HasColormap; - -GIFBYTE *Image; /* The result array */ -GIFBYTE *RawGIF; /* The heap array to hold it, raw */ -GIFBYTE *Raster; /* The raster data stream, unblocked */ - -/* The hash table used by the decompressor */ - -static int *Prefix; -static int *Suffix; - -/* An output array used by the decompressor */ - -int *OutCode; - -/* The color map, read from the GIF header */ - -int numused; - -/* - * Fetch the next code from the raster data stream. The codes can be any - * length from 3 to 12 bits, packed into 8-bit GIFBYTEs, so we have to maintain - * our location in the Raster array as a BIT Offset. We compute the GIFBYTE - * Offset into the raster array by dividing this by 8, pick up three GIFBYTEs, - * compute the bit Offset into our 24-bit chunk, shift to bring the desired - * code to the bottom, then mask it off and return it. - */ -static int -ReadCode(void) -{ - int RawCode, ByteOffset; - - ByteOffset = BitOffset / 8; - RawCode = Raster[ByteOffset] + (0x100 * Raster[ByteOffset + 1]); - - if (CodeSize >= 8) - RawCode += (0x10000 * Raster[ByteOffset + 2]); - - RawCode >>= (BitOffset % 8); - BitOffset += (int)CodeSize; - return (RawCode & ReadMask); -} - -static void -AddToPixel(GIFBYTE Index) -{ - if (YC < IHeight) - *(Image + YC * BytesPerScanline + XC) = Index; - - /* Update the X-coordinate, and if it overflows, update the - * Y-coordinate */ - if (++XC == IWidth) { - /* - * If a non-interlaced picture, just increment YC to the next scan - * line. If it's interlaced, deal with the interlace as described - * in the GIF spec. Put the decoded scan line out to the screen if we - * haven't gone past the bottom of it. - */ - XC = 0; - - if (!Interlace) { - YC++; - } - else { - switch (Pass) { - case 0: - YC += 8; - - if (YC >= IHeight) { - Pass++; - YC = 4; - } - - break; - case 1: - YC += 8; - - if (YC >= IHeight) { - Pass++; - YC = 2; - } - - break; - case 2: - YC += 4; - - if (YC >= IHeight) { - Pass++; - YC = 1; - } - - break; - case 3: - YC += 2; - break; - default: - break; - } - } - } -} - -/* Main routine. Convert a GIF image to an HDF image */ - -GIFBYTE * -Decompress(GIFIMAGEDESC *GifImageDesc, GIFHEAD *GifHead) -{ - int i; - - if (!(Prefix = calloc(4096, sizeof(int)))) { - printf("Out of memory"); - exit(EXIT_FAILURE); - } - if (!(Suffix = calloc(4096, sizeof(int)))) { - printf("Out of memory"); - exit(EXIT_FAILURE); - } - if (!(OutCode = calloc(1024, sizeof(int)))) { - printf("Out of memory"); - exit(EXIT_FAILURE); - } - - XC = 0; - YC = 0; - Pass = 0; - OutCount = 0; - BitOffset = 0; - - DataMask = (1 << ((GifHead->PackedField & 0x07) + 1)) - 1; - Raster = GifImageDesc->GIFImage; - - /* Check for image separator */ - - /* Now read in values from the image descriptor */ - IWidth = GifImageDesc->ImageWidth; - IHeight = GifImageDesc->ImageHeight; - Interlace = (uint8_t)(GifImageDesc->PackedField & 0x40); - - /* - * Note that I ignore the possible existence of a local color map. I'm - * told there aren't many files around that use them, and the spec says - * it's defined for future use. This could lead to an error reading some - * files. - */ - - /* - * Start reading the raster data. First we get the initial code size and - * compute decompressor constant values, based on this code size. - */ - - CodeSize = GifImageDesc->CodeSize; - ClearCode = (1 << CodeSize); - EOFCode = ClearCode + 1; - FreeCode = FirstFree = ClearCode + 2; - - /* - * The GIF spec has it that the code size is the code size used to compute - * the above values is the code size given in the file, but the code size - * used in compression/decompression is the code size given in the file - * plus one. (thus the ++). - */ - - CodeSize++; - InitCodeSize = CodeSize; - MaxCode = (1 << CodeSize); - ReadMask = MaxCode - 1; - - /* - * Read the raster data. Here we just transpose it from the GIF array to - * the Raster array, turning it from a series of blocks into one long - * data stream, which makes life much easier for ReadCode(). - */ - - /* Allocate the Image */ - - if (!(Image = (GIFBYTE *)malloc((size_t)IWidth * (size_t)IHeight))) { - printf("Out of memory"); - exit(EXIT_FAILURE); - } - - BytesPerScanline = IWidth; - - /* - * Decompress the file, continuing until you see the GIF EOF code. One - * obvious enhancement is to add checking for corrupt files here. - */ - - Code = ReadCode(); - - while (Code != EOFCode) { - /* - * Clear code sets everything back to its initial value, then reads - * the immediately subsequent code as uncompressed data. - */ - if (Code == ClearCode) { - CodeSize = InitCodeSize; - MaxCode = (1 << CodeSize); - ReadMask = MaxCode - 1; - FreeCode = FirstFree; - CurCode = OldCode = Code = ReadCode(); - FinChar = CurCode & DataMask; - AddToPixel((GIFBYTE)FinChar); - } - else { - /* - * If not a clear code, then must be data: save same as CurCode - * and InCode - */ - CurCode = InCode = Code; - - /* - * If greater or equal to FreeCode, not in the hash table yet; - * repeat the last character decoded - */ - if (CurCode >= FreeCode) { - CurCode = OldCode; - OutCode[OutCount++] = FinChar; - } - - /* - * Unless this code is raw data, pursue the chain pointed to by - * CurCode through the hash table to its end; each code in the - * chain puts its associated output code on the output queue. - */ - while (CurCode > DataMask) { - if (OutCount >= 1024) { - /*return error message*/ - } - - OutCode[OutCount++] = Suffix[CurCode]; - CurCode = Prefix[CurCode]; - } - - /* The last code in the chain is treated as raw data. */ - FinChar = CurCode & DataMask; - OutCode[OutCount++] = FinChar; - - /* - * Now we put the data out to the Output routine. It's been - * stacked LIFO, so deal with it that way... - */ - for (i = OutCount - 1; i >= 0; i--) - AddToPixel((GIFBYTE)OutCode[i]); - - OutCount = 0; - - /* - * Build the hash table on-the-fly. No table is stored in the - * file. - */ - if (FreeCode >= 4096) { - printf("Error: FreeCode out of bounds\n"); - exit(EXIT_FAILURE); - } - Prefix[FreeCode] = OldCode; - Suffix[FreeCode] = FinChar; - OldCode = InCode; - - /* - * Point to the next slot in the table. If we exceed the current - * MaxCode value, increment the code size unless it's already 12. - * If it is, do nothing: the next code decompressed better be - * CLEAR - */ - FreeCode++; - - if (FreeCode >= MaxCode) - if (CodeSize < 12) { - CodeSize++; - MaxCode *= 2; - ReadMask = (1 << CodeSize) - 1; - } - } - - Code = ReadCode(); - } - - free(Prefix); - free(Suffix); - free(OutCode); - - return Image; -} diff --git a/hl/tools/gif2h5/gif.h b/hl/tools/gif2h5/gif.h deleted file mode 100644 index 62f09a5b2ee..00000000000 --- a/hl/tools/gif2h5/gif.h +++ /dev/null @@ -1,183 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * Title: GIF.H - * Purpose: GIF Header file - */ -#ifndef GIF_H_ -#define GIF_H_ 1 - -#include -#include -#include - -#include "hdf5.h" - -#define MAX_PAL 768 - -/* typedef H5T_NATIVE_UINT8 GIFBYTE; */ -typedef unsigned char GIFBYTE; - -/* typedef H5T_NATIVE_UINT16 GIFWORD; */ -typedef unsigned long GIFWORD; - -typedef char GIFCHAR; - -#ifndef boolean -typedef unsigned char boolean; -#endif - -#ifndef false -#define false 0 -#endif -#ifndef true -#define true 1 -#endif - -/* Set the EndianOrder. -** The GIF Reader file should do this. -** Set EndianOrder = 0 if machine is little endian -** EndianOrder = 1 if machine is big endian. -*/ -extern int EndianOrder; - -/* -** The GIF header format. -** -** This structure actually contains the header, logical screen -** descriptor, and the global color table for the GIF image. -*/ -typedef struct _GifHeader { /* Offset Description */ - GIFBYTE PackedField; /* 0Ah Color Information */ - GIFWORD TableSize; - GIFBYTE ImageCount; /* Keep a count of the number of images */ - GIFBYTE CommentCount; - GIFBYTE ApplicationCount; - GIFBYTE PlainTextCount; - GIFBYTE HDFPalette[256][3]; - GIFBYTE HeaderDump[6]; /* GIFBYTE array to dump header contents */ - GIFBYTE LSDDump[7]; /* Logical Screen Descriptor dump */ -} GIFHEAD; - -/* -** The GIF Image Descriptor. -*/ -typedef struct _GifImageDescriptor { - GIFWORD ImageWidth; /* Width of the image in pixels */ - GIFWORD ImageHeight; /* Height of the image in pixels */ - GIFBYTE PackedField; /* Image and Color Table Data Information */ - GIFWORD TableSize; - GIFWORD CodeSize; /* Minimum LZW CodeSize for image data */ - GIFBYTE HDFPalette[256][3]; - GIFBYTE GIDDump[9]; /* GifImageDescriptor dump */ - - GIFBYTE *Image; /* Decompressed Raster Image */ - GIFBYTE *GIFImage; -} GIFIMAGEDESC; - -/* -** GIF 89a Graphic Control Extension Block -*/ -typedef struct _GifGraphicControlExtension { - GIFBYTE GCEDump[5]; /* Graphic Control Extension Dump */ -} GIFGRAPHICCONTROL; - -/* -** GIF 89a Plain Text Extension Block -*/ -typedef struct _GifPlainTextExtension { - GIFBYTE PTEDump[15]; /* Plain Text Extension Dump */ - GIFBYTE *PlainTextData; /* Plain Text data sub-blocks */ - GIFWORD DataSize; -} GIFPLAINTEXT; - -/* -** GIF 89a Application Extension Block -*/ -typedef struct _GifApplicationExtension { - GIFBYTE AEDump[14]; /* Application Extension Dump */ - GIFBYTE *ApplicationData; /* Application data sub-blocks */ - GIFWORD DataSize; -} GIFAPPLICATION; - -/* -** GIF 89a Comment Extension Block -*/ -typedef struct _GifCommentExtension { - GIFBYTE CEDump[2]; /* Comment Extension Dump */ - GIFBYTE *CommentData; /* Comment data sub-blocks */ - GIFWORD DataSize; - GIFBYTE Terminator; /* Block Terminator (always 0) */ -} GIFCOMMENT; - -/* -** GIF to HDF Memory Struct -** Purpose : The gif to hdf structure is used to pass all the -** gif data to the memory, which gets caught by the hdf driver -** Its the drivers job to put the data in the appropriate places -** in the HDF file. -** I have assumed that the ImageDescriptors and GraphicControls follow -** one another, ie. I have not associated them with each other. The driver -** must assume a 1-1 correspondence. The same discussion with plain text -** extension. -*/ -typedef struct _GifToMem { - GIFHEAD *GifHeader; - GIFIMAGEDESC **GifImageDesc; - GIFGRAPHICCONTROL **GifGraphicControlExtension; - GIFPLAINTEXT **GifPlainTextExtension; - GIFAPPLICATION **GifApplicationExtension; - GIFCOMMENT **GifCommentExtension; -} GIFTOMEM; - -/* -** Function Prototypes -*/ - -/* GIF2MEM.C */ -int Gif2Mem(GIFBYTE *, GIFTOMEM *); - -/* GIFREAD.C */ -int ReadGifHeader(GIFHEAD *, GIFBYTE **); -int ReadGifImageDesc(GIFIMAGEDESC *, GIFBYTE **); -int ReadGifGraphicControl(GIFGRAPHICCONTROL *, GIFBYTE **); -int ReadGifPlainText(GIFPLAINTEXT *, GIFBYTE **); -int ReadGifApplication(GIFAPPLICATION *, GIFBYTE **); -int ReadGifComment(GIFCOMMENT *, GIFBYTE **); - -/* HDFGIFWR.C */ -int hdfWriteGIF(FILE *fp, GIFBYTE *pic, int ptype, int w, int h, const GIFBYTE *rmap, const GIFBYTE *gmap, - const GIFBYTE *bmap, const GIFBYTE *pc2ncmap, int numcols, int colorstyle, int BitsPerPixel); - -/* WRITEHDF.C */ -int WriteHDF(GIFTOMEM, GIFCHAR *); - -/* Function: ReadHDF -** Return: 0 on completion without error, -1 on error -** Input: GIFCHAR *h5_file - HDF file name -** GIFCHAR *dset_name - Name of the HDF Image dataset -** GIFCHAR *pal_name - Name of the HDF palette -** Output: GIFBYTE* data - the HDF Image to be converted -** GIFBYTE palette[256][3] - the corresponding palette -** hsize_t* image_size - the size of each dimension of the image -*/ -int ReadHDF(GIFBYTE **data, GIFBYTE palette[256][3], hsize_t *image_size, GIFCHAR *h5_file, - GIFCHAR *dset_name, GIFCHAR *pal_name); - -GIFBYTE *Decompress(GIFIMAGEDESC *, GIFHEAD *); -GIFBYTE GetByte(const GIFBYTE *); -GIFWORD GetWord(GIFBYTE *); - -void cleanup(GIFBYTE *); - -#endif /* GIF_H_ */ diff --git a/hl/tools/gif2h5/gif2hdf.c b/hl/tools/gif2h5/gif2hdf.c deleted file mode 100644 index 161761c7ee4..00000000000 --- a/hl/tools/gif2h5/gif2hdf.c +++ /dev/null @@ -1,152 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include -#include -#include - -#include "gif.h" -#include "h5tools.h" -#include "h5tools_utils.h" - -int -main(int argv, char *argc[]) -{ - GIFTOMEM GifMemoryStruct; - GIFIMAGEDESC gifImageDesc; - - FILE *fpGif; - - /* replacing int32 with long */ - long i, ImageCount; - HDoff_t filesize; - - GIFBYTE *MemGif; - GIFBYTE *StartPos; - - char *GIFFileName; - char *HDFFileName; - - /* - * Initialize all GifMemoryStruct pointers to null to prevent hassles - * later on - */ - GifMemoryStruct.GifHeader = NULL; - GifMemoryStruct.GifImageDesc = NULL; - GifMemoryStruct.GifGraphicControlExtension = NULL; - GifMemoryStruct.GifPlainTextExtension = NULL; - GifMemoryStruct.GifApplicationExtension = NULL; - GifMemoryStruct.GifCommentExtension = NULL; - - /* Initialize h5tools lib */ - h5tools_init(); - - if (argc[1] && (strcmp("-V", argc[1]) == 0)) { - print_version("gif2h5"); - exit(EXIT_SUCCESS); - } - - if (argv < 3) { - printf("Usage: gif2h5 \n"); - fprintf(stdout, " gif2h5 -V \n"); - fprintf(stdout, " Print HDF5 library version and exit\n"); - exit(EXIT_FAILURE); - } - - GIFFileName = argc[1]; - HDFFileName = argc[2]; - - if (!(fpGif = fopen(GIFFileName, "rb"))) { - printf("Unable to open GIF file for reading.\n"); - exit(EXIT_FAILURE); - } - - /* Get the whole file into memory. Mem's much faster than I/O */ - fseek(fpGif, 0L, 2); - filesize = HDftell(fpGif); - fseek(fpGif, 0L, 0); - - if (filesize == 0) - printf("File Size Zero"); - - if (!(MemGif = StartPos = (GIFBYTE *)malloc((size_t)filesize))) { - printf("Out of memory"); - exit(EXIT_FAILURE); - } - - if (fread(MemGif, (size_t)filesize, 1, fpGif) != 1) { - printf("Corrupted Input File"); - exit(EXIT_FAILURE); - } - - fseek(fpGif, 0L, 0); - - /* - * Call Gif2Mem and break the whole file into parts. Gif2Mem also calls - * decompresses the images so we don't have to worry about that - */ - Gif2Mem(MemGif, &GifMemoryStruct); - - if (ferror(fpGif)) { - printf("File Stream Error\n\n"); - exit(EXIT_FAILURE); - } - - fclose(fpGif); - - /* - * Call WriteHDF from here. Go ahead and change WriteHDF to write whatever - * format you want - */ - if (WriteHDF(GifMemoryStruct, HDFFileName)) - printf("HDF Write Error\n\n"); - - /* Free all buffers */ - /* replacing int32 with long */ - ImageCount = (long)((GifMemoryStruct.GifHeader)->ImageCount); - - for (i = 0; i < ImageCount; i++) { - gifImageDesc = *(GifMemoryStruct.GifImageDesc[i]); - - if (gifImageDesc.Image != NULL) - free(gifImageDesc.Image); - - if (GifMemoryStruct.GifImageDesc[i] != NULL) { - free(GifMemoryStruct.GifImageDesc[i]); - GifMemoryStruct.GifImageDesc[i] = NULL; - } - - if (GifMemoryStruct.GifGraphicControlExtension[i] != NULL) { - free(GifMemoryStruct.GifGraphicControlExtension[i]); - GifMemoryStruct.GifGraphicControlExtension[i] = NULL; - } - } - - free(StartPos); - if (GifMemoryStruct.GifHeader != NULL) { - free(GifMemoryStruct.GifHeader); - GifMemoryStruct.GifHeader = NULL; - } - if (GifMemoryStruct.GifApplicationExtension != NULL) { - free(GifMemoryStruct.GifApplicationExtension); - GifMemoryStruct.GifApplicationExtension = NULL; - } - if (GifMemoryStruct.GifImageDesc != NULL) { - free(GifMemoryStruct.GifImageDesc); - GifMemoryStruct.GifImageDesc = NULL; - } - if (GifMemoryStruct.GifGraphicControlExtension != NULL) { - free(GifMemoryStruct.GifGraphicControlExtension); - GifMemoryStruct.GifGraphicControlExtension = NULL; - } - - return EXIT_SUCCESS; -} diff --git a/hl/tools/gif2h5/gif2mem.c b/hl/tools/gif2h5/gif2mem.c deleted file mode 100644 index 1471bb7993a..00000000000 --- a/hl/tools/gif2h5/gif2mem.c +++ /dev/null @@ -1,330 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * This file contains snippets of code from James Murray's original file to - * display the GIF header information, but most of it has been modified to - * suit gif2hdf - */ - -/****************************************************************************\ -** Title: GIFHEAD.C ** -** Purpose: Display the data in a GIF image file. ** -** Version: 1.0 ** -** C Compilers: Borland C++ v2.0, Microsoft C v6.00a ** -** ** -** GIFHEAD displays all real information contained within a GIF image ** -** file, including all color tables and extension block information. ** -** GIFHEAD reads both GIF 87a abd 89a-format files. ** -** ** -** Copyright (C) 1991-92 by Graphics Software Labs. All rights reserved. ** -\****************************************************************************/ -#include - -#include "gif.h" - -int -Gif2Mem(GIFBYTE *MemGif, GIFTOMEM *GifMemoryStruct) -{ - /* - * The gif structure outline for passing data to memory is given in gif.h. - * These pointers are redundant, should take them out in ver. 2 - */ - GIFHEAD *gifHead; /* GIF Header structure */ - GIFIMAGEDESC **gifImageDesc; /* Logical Image Descriptor struct */ - GIFPLAINTEXT **gifPlainText; /* Plain Text Extension structure */ - GIFAPPLICATION **gifApplication; /* Application Extension structure */ - GIFCOMMENT **gifComment; /* Comment Extension structure */ - GIFGRAPHICCONTROL **gifGraphicControl; /* Graphic Control Extension strct */ - - GIFWORD i; /* Loop counter */ - GIFBYTE Identifier; /* Extension block identifier holder */ - GIFBYTE Label; /* Extension block label holder */ - GIFBYTE ImageCount; /* Count of the number of images in the file */ - GIFBYTE ImageArray; /* Keep the size of the array to store Images */ - GIFBYTE CommentCount; - GIFBYTE CommentArray; - GIFBYTE ApplicationCount; - GIFBYTE ApplicationArray; - GIFBYTE PlainTextCount; - GIFBYTE PlainTextArray; - GIFBYTE GCEflag; - GIFBYTE aTemp; - GIFBYTE j; - GIFBYTE w; /* Two more variables needed only while testing */ - GIFBYTE *b; /* Endian Ordering */ - - /* Allocate memory for the GIF structures */ - /* Plug the structs into GifMemoryStruct at the end */ - /****************************************************/ - if (!(gifHead = (GIFHEAD *)malloc(sizeof(GIFHEAD)))) { - printf("Could not allocate memory for gifHead\n"); - exit(EXIT_FAILURE); - } - - /* - * The next three have to grow dynamically so we leave them for now and - * let realloc handle it later on. - */ - gifImageDesc = NULL; - gifPlainText = NULL; - gifGraphicControl = NULL; - gifComment = NULL; - gifApplication = NULL; - - /******************************/ - /* Memory allocation complete */ - /******************************/ - - /* Carry out Endian Testing and set Endian Order */ - w = 0x0001; - b = (GIFBYTE *)&w; - EndianOrder = (b[0] ? 1 : 0); - - /* Read the GIF image file header information */ - ReadGifHeader(gifHead, &MemGif); - - /* Check for FILE stream error */ -#if 0 - if (ferror(fpGif)) - { - fputs("GIFHEAD: Error reading header information!\n", stderr); - exit(EXIT_FAILURE); - } -#endif /* 0 */ - - /* - * Identify, read, and display block information. - */ - ImageCount = ImageArray = 0; - CommentCount = CommentArray = 0; - ApplicationCount = ApplicationArray = 0; - PlainTextCount = PlainTextArray = 0; - GCEflag = 0; - - for (;;) { - Identifier = *MemGif++; - - switch (Identifier) { - case 0x3B: /* Trailer */ - /* - * The counts are stored to make it easier while putting stuff - * into the HDF file and then deallocating space. - */ - gifHead->ImageCount = ImageCount; - gifHead->CommentCount = CommentCount; - gifHead->ApplicationCount = ApplicationCount; - gifHead->PlainTextCount = PlainTextCount; - - /* putting stuff into the gif2mem structure */ - GifMemoryStruct->GifHeader = gifHead; - GifMemoryStruct->GifImageDesc = gifImageDesc; - GifMemoryStruct->GifPlainTextExtension = gifPlainText; - GifMemoryStruct->GifApplicationExtension = gifApplication; - GifMemoryStruct->GifCommentExtension = gifComment; - GifMemoryStruct->GifGraphicControlExtension = gifGraphicControl; - - /* return the struct */ - return 0; - - case 0x2C: /* Image Descriptor */ - /* - * If there was no image descriptor before this increase image - * count. If an imagedescriptor was present, reset GCEflag - */ - if (GCEflag == 0) - ImageCount++; - else - GCEflag = 0; - - if (ImageCount > ImageArray) { - aTemp = ImageArray; - ImageArray = (GIFBYTE)((ImageArray << 1) + 1); - if (!(gifImageDesc = - (GIFIMAGEDESC **)realloc(gifImageDesc, sizeof(GIFIMAGEDESC *) * ImageArray))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (!(gifGraphicControl = (GIFGRAPHICCONTROL **)realloc( - gifGraphicControl, sizeof(GIFGRAPHICCONTROL *) * ImageArray))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - for (j = aTemp; j < ImageArray; j++) { - gifGraphicControl[j] = NULL; - gifImageDesc[j] = NULL; - } - } - - if (!(gifImageDesc[ImageCount - 1] = (GIFIMAGEDESC *)malloc(sizeof(GIFIMAGEDESC)))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (ReadGifImageDesc(gifImageDesc[ImageCount - 1], &MemGif) == -1) - fputs("Error reading Image Descriptor information\n", stderr); - - /* Decompress the Image */ - gifImageDesc[ImageCount - 1]->Image = Decompress(gifImageDesc[ImageCount - 1], gifHead); - free(gifImageDesc[ImageCount - 1]->GIFImage); - - /* - * Convert the local palette into an HDF compatible palette In - * case the local color table is present, it is written out as - * the HDFPalette If it is absent the global table is written - * as the HDFPalette. - */ - if (!((gifImageDesc[ImageCount - 1]->PackedField) & 0x80)) { - /* Check to see if the global color table exists.... */ - if (gifHead->PackedField & 0x80) { - for (i = 0; i < gifHead->TableSize; i++) { - gifImageDesc[ImageCount - 1]->HDFPalette[i][0] = gifHead->HDFPalette[i][0]; - gifImageDesc[ImageCount - 1]->HDFPalette[i][1] = gifHead->HDFPalette[i][1]; - gifImageDesc[ImageCount - 1]->HDFPalette[i][2] = gifHead->HDFPalette[i][2]; - } - } - - gifImageDesc[ImageCount - 1]->TableSize = gifHead->TableSize; - } - - break; - - case 0x21: /* Extension Block */ - Label = *MemGif++; - - switch (Label) { - case 0x01: /* Plain Text Extension */ - puts("Plain Text Extension\n"); - PlainTextCount++; - - if (PlainTextCount > PlainTextArray) - PlainTextArray = (GIFBYTE)((PlainTextArray << 1) + 1); - - if (!(gifPlainText = (GIFPLAINTEXT **)realloc(gifPlainText, sizeof(GIFPLAINTEXT *) * - PlainTextArray))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (!(gifPlainText[PlainTextCount - 1] = - (GIFPLAINTEXT *)malloc(sizeof(GIFPLAINTEXT)))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (ReadGifPlainText(gifPlainText[PlainTextCount - 1], &MemGif)) - fprintf(stderr, "Error reading Plain Text Extension information.\n"); - - break; - - case 0xFE: /* Comment Extension */ - CommentCount++; - - if (CommentCount > CommentArray) - CommentArray = (GIFBYTE)((CommentArray << 1) + 1); - - if (!(gifComment = - (GIFCOMMENT **)realloc(gifComment, sizeof(GIFCOMMENT *) * CommentArray))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (!(gifComment[CommentCount - 1] = (GIFCOMMENT *)malloc(sizeof(GIFCOMMENT)))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (ReadGifComment(gifComment[CommentCount - 1], &MemGif)) - fprintf(stderr, "Error reading Comment Extension information\n"); - - break; - - case 0xF9: /* Graphic Control Extension */ - if (GCEflag == 0) - ImageCount++; - - GCEflag = 1; - - if (ImageCount > ImageArray) { - aTemp = ImageArray; - ImageArray = (GIFBYTE)((ImageArray << 1) + 1); - - if (!(gifGraphicControl = (GIFGRAPHICCONTROL **)realloc( - gifGraphicControl, sizeof(GIFGRAPHICCONTROL *) * ImageArray))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (!(gifImageDesc = (GIFIMAGEDESC **)realloc( - gifImageDesc, sizeof(GIFIMAGEDESC *) * ImageArray))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - for (j = aTemp; j < ImageArray; j++) { - gifGraphicControl[j] = NULL; - gifImageDesc[j] = NULL; - } - } - - if (!(gifGraphicControl[ImageCount - 1] = - (GIFGRAPHICCONTROL *)malloc(sizeof(GIFGRAPHICCONTROL)))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (ReadGifGraphicControl(gifGraphicControl[ImageCount - 1], &MemGif)) - fprintf(stderr, "Error reading Graphic Control Extension information\n"); - - (*MemGif)++; - if ((!*MemGif) == 0) - fprintf(stderr, "Error reading Graphic Control Extension\n"); - - break; - - case 0xFF: /* Application Extension */ - ApplicationCount++; - - if (ApplicationCount > ApplicationArray) - ApplicationArray = (GIFBYTE)((ApplicationArray << 1) + 1); - - if (!(gifApplication = (GIFAPPLICATION **)realloc( - gifApplication, sizeof(GIFAPPLICATION *) * ApplicationArray))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (!(gifApplication[ApplicationCount - 1] = - (GIFAPPLICATION *)malloc(sizeof(GIFAPPLICATION)))) { - printf("Out of memory!"); - exit(EXIT_FAILURE); - } - - if (ReadGifApplication(gifApplication[ApplicationCount - 1], &MemGif)) - fprintf(stderr, "Error reading Application Extension information\n"); - - break; - - default: - printf("Unknown Extension Label: %#02x\n", Label); - break; - } - - break; - - default: - fprintf(stderr, "Unknown Block Separator Character: %#02x\n", Identifier); - } - } -} diff --git a/hl/tools/gif2h5/gifread.c b/hl/tools/gif2h5/gifread.c deleted file mode 100644 index 5fb1fd5428a..00000000000 --- a/hl/tools/gif2h5/gifread.c +++ /dev/null @@ -1,376 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include -#include - -#include "gif.h" - -int EndianOrder; - -static GIFBYTE *ReadDataSubBlocks(GIFBYTE **MemGif2, GIFWORD *DSize); - -GIFWORD -GetWord(GIFBYTE *MemGif) -{ - GIFWORD w; - - if (EndianOrder == 1) { - /* LittleEndian */ - w = (GIFWORD)(*MemGif++ & 0xFF); - w |= (GIFWORD)((*MemGif++ & 0xFF) << 0x08); - } - else { - w = (GIFWORD)(*MemGif++ & 0xFF); - w = ((GIFWORD)(*MemGif++ & 0xFF)) | (w << 0x08); - } - - return w; -} - -GIFBYTE -GetByte(const GIFBYTE *MemGif) -{ - return *MemGif; -} - -/* - * Read a GIF image GIFBYTE Header. - * - * This function reads the Header, Logical Screen Descriptor, and - * Global Color Table (if any) from a GIF image file. The information - * is stored in a GIFHEAD structure. - * - * Returns: -1 if a FILE stream error occurred during the read, - * otherwise 0 if no error occurred. - */ -int -ReadGifHeader(GIFHEAD *GifHead, /* Pointer to GIF header structure */ - GIFBYTE **MemGif2) /* GIF image file input FILE stream */ -{ - GIFWORD i; /* Loop counter */ - GIFWORD tableSize; /* Number of entries in the Global Color Table */ - - GifHead->TableSize = 0; - for (i = 0; i < 6; i++) { - GifHead->HeaderDump[i] = *(*MemGif2)++; - } - - if (strncmp((const char *)GifHead->HeaderDump, "GIF", (size_t)3) != 0) { - printf("The file does not appear to be a valid GIF file.\n"); - exit(EXIT_FAILURE); - } - - for (i = 0; i < 7; i++) { - GifHead->LSDDump[i] = *(*MemGif2)++; - } - - GifHead->PackedField = GifHead->LSDDump[4]; - - /* Check if a Global Color Table is present */ - if (GifHead->PackedField & 0x80) { - /* Read number of color table entries */ - tableSize = (GIFWORD)(1L << ((GifHead->PackedField & 0x07) + 1)); - GifHead->TableSize = tableSize; - - /* Read the Global Color Table */ - - /* - * There are some changes made here apart from just reading in the - * global color table as would seem intuitively obvious. The colors - * are stored in the bottom part of the palette as opposed to the top - */ - - for (i = 0; i < tableSize; i++) { - GifHead->HDFPalette[i][0] = *(*MemGif2)++; - GifHead->HDFPalette[i][1] = *(*MemGif2)++; - GifHead->HDFPalette[i][2] = *(*MemGif2)++; - } - } - - /* Check for a FILE stream error */ -#if 0 - if (ferror(FpGif)) - return -1; -#endif /* 0 */ - - return 0; /* No FILE stream error occurred */ -} - -/* -** Read a GIF Local Image Descriptor. -** -** This function reads the Local Image Descriptor, and Local Color -** Table (if any) from a GIF image file. The information is stored -** in a GIFIMAGEDESC structure. -** -** Note that the ImageSeparator field value in the GIFIMAGEDESC -** structure is assigned by the function calling ReadGifImageDesc(). -** -** Returns: -1 if a FILE stream error occurred during the read, -** otherwise 0 if no error occurred. -*/ -int -ReadGifImageDesc(GIFIMAGEDESC *GifImageDesc, /* Pointer to GIF image descriptor structure */ - GIFBYTE **MemGif2 /* GIF image file input FILE stream */ -) -{ - GIFWORD i; /* Loop counter */ - GIFWORD tableSize; /* Number of entries in the Local Color Table */ - /* GIFBYTE Interlace; */ /* PackedField & 0x20 gives information on interlacing */ - GIFBYTE *TempPtr; - int ch, ch1; - - GifImageDesc->TableSize = 0; - for (i = 0; i < 9; i++) { - GifImageDesc->GIDDump[i] = *(*MemGif2)++; - } - - /* - ** Get the relevant fields. I need ImageWidth and Height actively hence I have - ** taken information from those fields. I intend to keep the GifImageDesc data - ** structure as it is so that anyone needing the rest of the fields can do so - ** quickly. - */ - - if (EndianOrder == 1) /* LittleEndian */ - { - GifImageDesc->ImageWidth = (GIFWORD)(GifImageDesc->GIDDump[4] & 0xFF); - GifImageDesc->ImageWidth |= (GIFWORD)((GifImageDesc->GIDDump[5] & 0xFF) << 0x08); - - GifImageDesc->ImageHeight = (GIFWORD)(GifImageDesc->GIDDump[6] & 0xFF); - GifImageDesc->ImageHeight |= (GIFWORD)((GifImageDesc->GIDDump[7] & 0xFF) << 0x08); - } - else { - GifImageDesc->ImageWidth = (GIFWORD)(GifImageDesc->GIDDump[4] & 0xFF); - GifImageDesc->ImageWidth = - ((GIFWORD)(GifImageDesc->GIDDump[5] & 0xFF)) | (GifImageDesc->ImageWidth << 0x08); - - GifImageDesc->ImageHeight = (GIFWORD)(GifImageDesc->GIDDump[6] & 0xFF); - GifImageDesc->ImageHeight = - ((GIFWORD)(GifImageDesc->GIDDump[7] & 0xFF)) | (GifImageDesc->ImageWidth << 0x08); - } - - GifImageDesc->PackedField = GifImageDesc->GIDDump[8]; - - /* Interlace = GifImageDesc->PackedField & 0x20; */ - - /* Check if a Local Color Table is present */ - if (GifImageDesc->PackedField & 0x80) { - /* Read number of color table entries */ - tableSize = (GIFWORD)(1L << ((GifImageDesc->PackedField & 0x07) + 1)); - GifImageDesc->TableSize = tableSize; - /* Read the Local Color Table */ - for (i = 0; i < tableSize; i++) { - GifImageDesc->HDFPalette[i][0] = *(*MemGif2)++; - GifImageDesc->HDFPalette[i][1] = *(*MemGif2)++; - GifImageDesc->HDFPalette[i][2] = *(*MemGif2)++; - } - } - - /* - ** Get LZW minimum Code Size - */ - GifImageDesc->CodeSize = (GIFWORD) * (*MemGif2)++; - - /*GifImageDesc->GIFImage = ReadDataSubBlocks(FpGif);*/ - if (!(GifImageDesc->GIFImage = - (GIFBYTE *)malloc((GifImageDesc->ImageWidth) * (GifImageDesc->ImageHeight)))) { - printf("Out of memory"); - exit(EXIT_FAILURE); - } - - TempPtr = GifImageDesc->GIFImage; - do { - ch = ch1 = (int)*(*MemGif2)++; - while (ch--) - *TempPtr++ = *(*MemGif2)++; - } while (ch1); - - return (0); /* No FILE stream error occurred */ -} - -/* -** Read a GIF Graphic Control Extension block. -** -** Note that the Introducer and Label field values in the GIFGRAPHICCONTROL -** structure are assigned by the function calling ReadGifGraphicControl(). -** -** Returns: -1 if a FILE stream error occurred during the read, -** otherwise 0 if no error occurred. -*/ -int -ReadGifGraphicControl(GIFGRAPHICCONTROL *GifGraphicControl, /* Pointer to GC Extension structure */ - GIFBYTE **MemGif2 /* GIF image file input FILE stream */ -) -{ - int i; - - for (i = 0; i < 5; i++) { - GifGraphicControl->GCEDump[i] = *(*MemGif2)++; - } - - return (0); /* No FILE stream error occurred */ -} - -/* -** Read a GIF Plain Text Extension block. -** -** Note that the Introducer and Label field values in the GIFLPLAINTEXT -** structure are assigned by the function calling ReadGifPlainText(). -** -** Returns: -1 if a FILE stream error occurred during the read, -** otherwise 0 if no error occurred. -*/ -int -ReadGifPlainText(GIFPLAINTEXT *GifPlainText, /* Pointer to Plain Text Extension structure */ - GIFBYTE **MemGif2 /* GIF image file input FILE stream */ -) -{ - int i; - - for (i = 0; i < 13; i++) { - GifPlainText->PTEDump[i] = *(*MemGif2)++; - } - - /* Read in the Plain Text data sub-blocks */ - if (!(GifPlainText->PlainTextData = ReadDataSubBlocks(MemGif2, &(GifPlainText->DataSize)))) - return (1); - - /* - GifPlainText->Terminator = 0; - */ - - /* Check for a FILE stream error */ - /* - if (ferror(FpGif)) - return(-1); - */ - - return (0); /* No FILE stream error occurred */ -} - -/* -** Read a GIF Application Extension block. -** -** Note that the Introducer and Label field values in the GIFAPPLICATION -** structure are assigned by the function calling ReadGifApplication(). -** -** Returns: -1 if a FILE stream error occurred during the read, -** otherwise 0 if no error occurred. -*/ -int -ReadGifApplication(GIFAPPLICATION *GifApplication, /* Pointer to Application Extension structure */ - GIFBYTE **MemGif2 /* GIF image file input FILE stream */ -) -{ - int i; - - for (i = 0; i < 12; i++) { - GifApplication->AEDump[i] = *(*MemGif2)++; - } - - /* Read in the Plain Text data sub-blocks */ - if (!(GifApplication->ApplicationData = ReadDataSubBlocks(MemGif2, &(GifApplication->DataSize)))) - return (1); - /* - GifApplication->Terminator = 0; - */ - - /* Check for a FILE stream error */ - /* - if (ferror(FpGif)) - return(-1); - */ - - return (0); /* No FILE stream error occurred */ -} - -/* -** Read a GIF Comment Extension block. -** -** Note that the Introducer and Label field values in the GIFCOMMENT -** structure are assigned by the function calling ReadGifComment(). -** -** Returns: -1 if a FILE stream error occurred during the read, -** otherwise 0 if no error occurred. -*/ -int -ReadGifComment(GIFCOMMENT *GifComment, /* Pointer to GIF Comment Extension structure */ - GIFBYTE **MemGif2 /* GIF image file input FILE stream */ -) -{ - - /* Read in the Plain Text data sub-blocks */ - if (!(GifComment->CommentData = ReadDataSubBlocks(MemGif2, &(GifComment->DataSize)))) - return (1); - - GifComment->Terminator = 0; - - return (0); /* No FILE stream error occurred */ -} - -/* -** Read one or more GIF data sub-blocks and write the information -** to a buffer. -** -** A GIF "sub-block" is a single count byte followed by 1 to 255 -** additional data bytes. -** -** Returns: A NULL pointer if a memory allocation error occurred, -** otherwise a valid pointer if no error occurred. -*/ -static GIFBYTE * -ReadDataSubBlocks(GIFBYTE **MemGif2, /* GIF image file input FILE stream */ - GIFWORD *DSize) -{ - GIFBYTE *ptr1; /* Pointer used to "walk the heap" */ - GIFBYTE *ptr2; /* Pointer used to mark the top of the heap */ - GIFBYTE dataSize; /* Size of the current data sub-block being read */ - GIFWORD bufSize; /* Total size of the Plain Text data buffer */ - int tempcount = 0; - - bufSize = 0; /* The output buffer is empty */ - - dataSize = *(*MemGif2)++; /* Get the size of the first sub-block */ - - /* Allocate initial data buffer */ - if (!(ptr1 = ptr2 = (GIFBYTE *)malloc((size_t)dataSize + 1))) { - printf("Out of memory. Allocation of memory for data sub-blocks for\neither Comment, Plain Text or " - "Application Extensions failed"); - return ((GIFBYTE *)NULL); - } - for (;;) { - tempcount++; - bufSize += (dataSize); /* Running total of the buffer size */ - *DSize = bufSize; - -#ifdef COMMENTED_OUT - *ptr1++ = dataSize; /* Write the data count */ -#endif /* COMMENTED_OUT */ - while (dataSize--) /* Read/write the Plain Text data */ - *ptr1++ = *(*MemGif2)++; - - /* Check if there is another data sub-block */ - if ((dataSize = *(*MemGif2)++) == 0) - break; /* Block Terminator encountered */ - - /* Increase the buffer size to accommodate the next sub-block */ - if (!(ptr1 = ptr2 = (GIFBYTE *)realloc(ptr2, bufSize + dataSize + 1))) - return ((GIFBYTE *)NULL); - - ptr1 += bufSize; /* Move pointer to the end of the data */ - } - - *ptr1++ = '\0'; - - return (ptr2); /* Return a pointer to the sub-block data */ -} diff --git a/hl/tools/gif2h5/h52gifgentst.c b/hl/tools/gif2h5/h52gifgentst.c deleted file mode 100644 index 4851145ec45..00000000000 --- a/hl/tools/gif2h5/h52gifgentst.c +++ /dev/null @@ -1,99 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include -#include -#include "hdf5.h" -#include "H5IMpublic.h" - -/*------------------------------------------------------------------------- - * Program: h52gifgentst - * - * Purpose: generate files for h52gif testing - * - *------------------------------------------------------------------------- - */ - -#define FILENAME "h52giftst.h5" -#define WIDTH 400 -#define HEIGHT 200 -#define PAL_ENTRIES 256 -#define IMAGE1_NAME "image" -#define PAL_NAME "palette" - -/*------------------------------------------------------------------------- - * Function: main - * - * Purpose: main program - * - *------------------------------------------------------------------------- - */ - -int -main(void) -{ - hid_t fid; - int i, j, n, space; - unsigned char *buf; - unsigned char pal[PAL_ENTRIES * 3]; /* palette array */ - hsize_t pal_dims[2] = {PAL_ENTRIES, 3}; /* palette dimensions */ - hsize_t width = WIDTH; - hsize_t height = HEIGHT; - - /* Allocate buffer */ - if (NULL == (buf = (unsigned char *)malloc(WIDTH * HEIGHT))) - return EXIT_FAILURE; - - /* create a file */ - if ((fid = H5Fcreate(FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) - return EXIT_FAILURE; - - /* create an image */ - space = WIDTH * HEIGHT / PAL_ENTRIES; - for (i = 0, j = 0, n = 0; i < WIDTH * HEIGHT; i++, j++) { - buf[i] = (unsigned char)n; - if (j > space) { - n++; - j = 0; - } - } - - /* make the image */ - if (H5IMmake_image_8bit(fid, IMAGE1_NAME, width, height, buf) < 0) - return EXIT_FAILURE; - - /*------------------------------------------------------------------------- - * define a palette, blue to red tones - *------------------------------------------------------------------------- - */ - for (i = 0, n = 0; i < PAL_ENTRIES * 3; i += 3, n++) { - pal[i] = (unsigned char)n; /* red */ - pal[i + 1] = (unsigned char)0; /* green */ - pal[i + 2] = (unsigned char)(255 - n); /* blue */ - } - - /* make a palette */ - if (H5IMmake_palette(fid, PAL_NAME, pal_dims, pal) < 0) - return EXIT_FAILURE; - - /* attach the palette to the image */ - if (H5IMlink_palette(fid, IMAGE1_NAME, PAL_NAME) < 0) - return EXIT_FAILURE; - - if (H5Fclose(fid) < 0) - return EXIT_FAILURE; - - free(buf); - - return EXIT_SUCCESS; -} diff --git a/hl/tools/gif2h5/h52giftest.sh.in b/hl/tools/gif2h5/h52giftest.sh.in deleted file mode 100644 index bdc85c3f540..00000000000 --- a/hl/tools/gif2h5/h52giftest.sh.in +++ /dev/null @@ -1,95 +0,0 @@ -#!/bin/sh -# -# Copyright by The HDF Group. -# All rights reserved. -# -# This file is part of HDF5. The full HDF5 copyright notice, including -# terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code -# distribution tree, or in https://www.hdfgroup.org/licenses. -# If you do not have access to either file, you may request a copy from -# help@hdfgroup.org. -# -# HDF Utilities Test script - - -TESTFILE1="$srcdir/testfiles/h52giftst.h5" -TESTFILE2="$srcdir/testfiles/image1.gif" -TESTFILE3="$srcdir/testfiles/ex_image2.h5" - -# initialize errors variable -errors=0 - -TESTING() { - SPACES=" " - echo "Testing $* $SPACES" | cut -c1-70 | tr -d '\012' -} - - - -# Verify the test runs with success (return code is 0) -TOOLTEST() -{ - # for now, discard any error messages generated. - $RUNSERIAL $* > /dev/null 2>&1 - - RET=$? - if [ $RET = 0 ] ; then - echo " PASSED" - else - echo "*FAILED*" - errors="` expr $errors + 1 `"; - fi - -} - -# Verify the test runs with failure (return code is not 0) -# Use for testing if tool can handle error conditions like -# illegal input, bad arguments, exceeding limits, ... -TOOLTESTFAIL() -{ - # for now, discard any error messages generated. - $RUNSERIAL $* > /dev/null 2>&1 - - RET=$? - if [ $RET != 0 ] ; then - echo " PASSED" - else - echo "*FAILED*" - errors="` expr $errors + 1 `"; - fi -} - - -# Positive tests for gif2h5 -echo "**validate the gif2h5 tool processes input correctly..." -TESTING "./gif2h5 image1.gif image1.h5" -TOOLTEST ./gif2h5 $TESTFILE2 image1.h5 -echo "" - -# Positive tests for h52gif -echo "**validate the h52gif tool processes input correctly..." -TESTING "./h52gif h52giftst.h5 image1.gif -i image" -TOOLTEST ./h52gif $TESTFILE1 image1.gif -i image -echo "" - -# Negative tests. -echo "**verify that the h52gif tool handles error conditions correctly..." -# nonexisting dataset name -TESTING "./h52gif h52giftst.h5 image.gif -i nosuch_image" -TOOLTESTFAIL "./h52gif $TESTFILE1 image.gif -i nosuch_image" -# this test should have failed but it did not. Comment it out for now. -#TESTING "./h52gif h52giftst.h5 image.gif -i palette" -#TOOLTESTFAIL "./h52gif $TESTFILE1 image.gif -i palette" -TESTING "./h52gif h52giftst.h5 image24.gif -i image24bitpixel" -TOOLTESTFAIL "./h52gif $TESTFILE3 image24.gif -i image24bitpixel" -echo "" - -# all done. summarize results. -if test $errors -eq 0 ; then - echo "All gif2h5 and h52gif tests passed." - exit 0 -else - echo "Some gif2h5 or h52gif tests failed with $errors errors." - exit 1 -fi diff --git a/hl/tools/gif2h5/hdf2gif.c b/hl/tools/gif2h5/hdf2gif.c deleted file mode 100644 index 120e42e294c..00000000000 --- a/hl/tools/gif2h5/hdf2gif.c +++ /dev/null @@ -1,334 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -#include -#include -#include "gif.h" -#include "H5IMpublic.h" -#include "h5tools.h" -#include "h5tools_utils.h" - -/* Name of tool */ -#define PROGRAMNAME "hdf2gif" - -#define IMAGE_WIDTH_MAX 65535 /* unsigned 16bits integer */ -#define IMAGE_HEIGHT_MAX 65535 /* unsigned 16bits integer */ - -int EndianOrder; - -static void -putword(int w, FILE *fp) -{ - /* writes a 16-bit integer in GIF order (LSB first) */ - fputc(w & 0xff, fp); - fputc((w >> 8) & 0xff, fp); -} - -static void -usage(void) -{ - printf("Usage: h52gif -i \n"); - fprintf(stdout, " h52gif -V \n"); - fprintf(stdout, " Print HDF5 library version and exit\n"); - printf("h52gif expects *at least* one h5_image.\n"); -} - -static void -leave(int ret) -{ - h5tools_close(); - exit(ret); -} - -static FILE *fpGif = NULL; -int -main(int argc, char **argv) -{ - GIFBYTE *Image; - - /* compression structs */ - GIFCHAR *HDFName = NULL; - GIFCHAR *GIFName = NULL; - - GIFBYTE *b; - - GIFBYTE GlobalPalette[256][3]; - GIFBYTE Red[256]; - GIFBYTE Green[256]; - GIFBYTE Blue[256]; - - int RWidth, RHeight; - int ColorMapSize, InitCodeSize, Background, BitsPerPixel; - int j, nc; - int i; - int numcols = 0; - - GIFBYTE pc2nc[256], r1[256], g1[256], b1[256]; - - int arg_index = 2; - int bool_is_image = 0; /* 0 = false , 1 = true */ - char *image_name = NULL; - int idx; - - h5tools_setprogname(PROGRAMNAME); - h5tools_setstatus(EXIT_SUCCESS); - - /* Initialize h5tools lib */ - h5tools_init(); - - if (argv[1] && (strcmp("-V", argv[1]) == 0)) { - print_version("gif2h5"); - h5tools_setstatus(EXIT_SUCCESS); - } - - if (argc < 4) { - /* they didn't supply at least one image -- bail */ - usage(); - h5tools_setstatus(EXIT_FAILURE); - } - - HDFName = argv[1]; - GIFName = argv[2]; - - /* get the options */ - while (arg_index++ < argc - 1) { - if (!strcmp(argv[arg_index], "-i")) { - bool_is_image = 1; - continue; - } - - if (bool_is_image) { - /* allocate space to store the image name */ - size_t len = strlen(argv[arg_index]); - image_name = (GIFCHAR *)malloc(len + 1); - strcpy(image_name, argv[arg_index]); - - bool_is_image = 0; - continue; - } - - /* oops. This was not meant to happen */ - usage(); - - goto out; - } - - /* Do Endian Order testing and set Endian Order */ - idx = 0x0001; - b = (GIFBYTE *)&idx; - EndianOrder = (b[0] ? 1 : 0); - - if (!(fpGif = fopen(GIFName, "wb"))) { - printf("Error opening gif file for output. Aborting.\n"); - goto out; - } - - Background = 0; - { - hsize_t width, height, planes; - hid_t fid; - char interlace[20]; - hssize_t npals; - hsize_t pal_dims[2]; - unsigned char *pal; - - if ((fid = H5Fopen(HDFName, H5F_ACC_RDONLY, H5P_DEFAULT)) < 0) { - fprintf(stderr, "Unable to open HDF file for input. Aborting.\n"); - goto out; - } - - /* get image's information */ - if (H5IMget_image_info(fid, image_name, &width, &height, &planes, interlace, &npals) < 0) { - fprintf(stderr, "Unable to get information of the image. Aborting.\n"); - goto out; - } - - if (width > IMAGE_WIDTH_MAX || height > IMAGE_HEIGHT_MAX) { - fprintf(stderr, "HDF5 image is too large. Limit is %d by %d.\n", IMAGE_WIDTH_MAX, - IMAGE_HEIGHT_MAX); - goto out; - } - - /* tool can handle single plane images only. */ - if (planes > 1) { - fprintf(stderr, "Cannot handle multiple planes image\n"); - goto out; - } - - Image = (GIFBYTE *)malloc((size_t)width * (size_t)height); - - if (H5IMread_image(fid, image_name, Image) < 0) { - fprintf(stderr, "Unable to read the image. Aborting.\n"); - goto out; - } - - if (npals) { - if (H5IMget_palette_info(fid, image_name, 0, pal_dims) < 0) { - fprintf(stderr, "Unable to get information of the palette. Aborting.\n"); - goto out; - } - - pal = (GIFBYTE *)malloc((size_t)pal_dims[0] * (size_t)pal_dims[1]); - - if (H5IMget_palette(fid, image_name, 0, pal) < 0) - goto out; - - numcols = (int)pal_dims[0]; - - for (i = 0, j = 0; i < numcols; j += 3, i++) { - GlobalPalette[i][0] = pal[j]; - GlobalPalette[i][1] = pal[j + 1]; - GlobalPalette[i][2] = pal[j + 2]; - } - - free(pal); - } - - H5Fclose(fid); - - RWidth = (int)width; - RHeight = (int)height; - - /* - * If the first image does not have a palette, I make my own global - * color table Obviously this is not the best thing to do, better - * steps would be: - * - * 1. Check for either a global palette or a global attribute called - * palette - * 2. Check for palettes in any of the other images. - */ - if (!npals) { - numcols = 256; - for (i = 0; i < numcols; i++) { - Red[i] = (GIFBYTE)(255 - i); - Green[i] = (GIFBYTE)(255 - i); - Blue[i] = (GIFBYTE)(255 - i); - } - } - else { - for (i = 0; i < numcols; i++) { - Red[i] = GlobalPalette[i][0]; - Green[i] = GlobalPalette[i][1]; - Blue[i] = GlobalPalette[i][2]; - } - } - - for (i = 0; i < numcols; i++) { - pc2nc[i] = r1[i] = g1[i] = b1[i] = 0; - } - - /* compute number of unique colors */ - nc = 0; - - for (i = 0; i < numcols; i++) { - /* see if color #i is already used */ - for (j = 0; j < i; j++) { - if (Red[i] == Red[j] && Green[i] == Green[j] && Blue[i] == Blue[j]) - break; - } - - if (j == i) { - /* wasn't found */ - pc2nc[i] = (GIFBYTE)nc; - r1[nc] = Red[i]; - g1[nc] = Green[i]; - b1[nc] = Blue[i]; - nc++; - } - else { - pc2nc[i] = pc2nc[j]; - } - } - - /* figure out 'BitsPerPixel' */ - for (i = 1; i < 8; i++) { - if ((1 << i) >= nc) - break; - } - - BitsPerPixel = i; - ColorMapSize = 1 << BitsPerPixel; - - if (BitsPerPixel <= 1) - InitCodeSize = 2; - else - InitCodeSize = BitsPerPixel; - - if (!fpGif) { - fprintf(stderr, "WriteGIF: file not open for writing\n"); - goto out; - } - - fwrite("GIF87a", sizeof(char), 6, fpGif); /* the GIF magic number */ - - putword(RWidth, fpGif); /* screen descriptor */ - putword(RHeight, fpGif); - - i = 0x00; /* No, there is no color map */ - i |= (8 - 1) << 4; /* OR in the color resolution (hardwired 8) */ - i |= (BitsPerPixel - 1); /* OR in the # of bits per pixel */ - fputc(i, fpGif); - - fputc(Background, fpGif); /* background color */ - fputc(0, fpGif); /* future expansion byte */ - - /* - * Put Image Descriptor - * Hardwiring Left Offset and Top Offset to 0x00 - */ - fputc(0x2c, fpGif); - putword(0x00, fpGif); - putword(0x00, fpGif); - putword(RWidth, fpGif); - putword(RHeight, fpGif); - - /* since we always have a local color palette ... */ - fputc((0x80 | (BitsPerPixel - 1)), fpGif); - - for (i = 0; i < ColorMapSize; i++) { - /* write out Global colormap */ - fputc(r1[i], fpGif); - fputc(g1[i], fpGif); - fputc(b1[i], fpGif); - } - - fputc(InitCodeSize, fpGif); - - i = hdfWriteGIF(fpGif, Image, 0, RHeight, RWidth, r1, g1, b1, pc2nc, 256, 8, BitsPerPixel); - fputc(0x00, fpGif); - free(Image); - } - - if (fputc(';', fpGif) == EOF) { - /* Write GIF file terminator */ - fprintf(stderr, "Error!"); - goto out; - } - - if (fpGif != NULL) - fclose(fpGif); - if (image_name != NULL) - free(image_name); - - leave(h5tools_getstatus()); - -out: - - if (fpGif != NULL) - fclose(fpGif); - if (image_name != NULL) - free(image_name); - - h5tools_setstatus(EXIT_FAILURE); - leave(h5tools_getstatus()); -} diff --git a/hl/tools/gif2h5/hdfgifwr.c b/hl/tools/gif2h5/hdfgifwr.c deleted file mode 100644 index 95f75d5d85e..00000000000 --- a/hl/tools/gif2h5/hdfgifwr.c +++ /dev/null @@ -1,463 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/* - * hdfgifwr.c - handles writing of GIF files. - * - * Contains: - * hdfWriteGIF(fp, pic, ptype, w, h, rmap, gmap, bmap, numcols, colorstyle, - * comment) - * - * Note: slightly brain-damaged, in that it'll only write non-interlaced - * GIF files (in the interests of speed, or something) - */ - -/***************************************************************** - * Portions of this code Copyright (C) 1989 by Michael Mauldin. - * Permission is granted to use this file in whole or in - * part for any purpose, educational, recreational or commercial, - * provided that this copyright notice is retained unchanged. - * This software is available to all free of charge by anonymous - * FTP and in the UUNET archives. - * - * - * Authors: Michael Mauldin (mlm@cs.cmu.edu) - * David Rowley (mgardi@watdcsu.waterloo.edu) - * - * Based on: compress.c - File compression ala IEEE Computer, June 1984. - * - * Spencer W. Thomas (decvax!harpo!utah-cs!utah-gr!thomas) - * Jim McKie (decvax!mcvax!jim) - * Steve Davies (decvax!vax135!petsd!peora!srd) - * Ken Turkowski (decvax!decwrl!turtlevax!ken) - * James A. Woods (decvax!ihnp4!ames!jaw) - * Joe Orost (decvax!vax135!petsd!joe) - *****************************************************************/ - -#include -#include -#include - -#include "gif.h" - -typedef GIFBYTE byte; -typedef long int count_int; - -#ifdef __STDC__ -static void compress(int, FILE *, byte *, int); -static void output(int); -static void cl_block(void); -static void cl_hash(count_int); -static void char_init(void); -static void char_out(int); -static void flush_char(void); -#else -static void compress(), output(), cl_block(), cl_hash(); -static void char_init(), char_out(), flush_char(); -#endif /* __STDC__ */ - -static byte pc2nc[256]; - -/***********************************************************************/ -static unsigned long cur_accum = 0; -static int cur_bits = 0; - -#define MAXCODE(n_bits) ((1 << (n_bits)) - 1) -#define XV_BITS 12 /* BITS was already defined on some systems */ -#define HSIZE 5003 /* 80% occupancy */ - -typedef unsigned char char_type; - -static int n_bits; /* number of bits/code */ -static int maxbits = XV_BITS; /* user settable max # bits/code */ -static int maxcode; /* maximum code, given n_bits */ -static int maxmaxcode = 1 << XV_BITS; /* NEVER generate this */ - -static count_int *htab; -static unsigned short *codetab; - -#define HashTabOf(i) htab[i] -#define CodeTabOf(i) codetab[i] - -static int hsize = HSIZE; /* for dynamic table sizing */ - -/* - * To save much memory, we overlay the table used by compress() with those - * used by decompress(). The tab_prefix table is the same size and type as - * the codetab. The tab_suffix table needs 2**BITS characters. We get this - * from the beginning of htab. The output stack uses the rest of htab, and - * contains characters. There is plenty of room for any possible stack (stack - * used to be 8000 characters). - */ - -static int free_ent = 0; /* first unused entry */ - -/* - * block compression parameters -- after all codes are used up, - * and compression rate changes, start over. - */ -static int clear_flg = 0; - -static long int in_count = 1; /* length of input */ -static long int out_count = 0; /* # of codes output (for debugging) */ - -/* - * compress stdin to stdout - * - * Algorithm: use open addressing double hashing (no chaining) on the prefix - * code / next character combination. We do a variant of Knuth's algorithm D - * (vol. 3, sec. 6.4) along with G. Knott's relatively-prime secondary probe. - * Here, the modular division first probe is gives way to a faster - * exclusive-or manipulation. Also do block compression with an adaptive - * reset, whereby the code table is cleared when the compression ratio - * decreases, but after the table fills. The variable-length output codes are - * re-sized at this point, and a special CLEAR code is generated for the - * decompressor. Late addition: construct the table according to file size - * for noticeable speed improvement on small files. Please direct questions - * about this implementation to ames!jaw. - */ - -static int g_init_bits; -static FILE *g_outfile; - -static int ClearCode; -static int EOFCode; - -/*************************************************************/ -int -hdfWriteGIF(FILE *fp, byte *pic, int ptype, int w, int h, const byte *rmap, const byte *gmap, - const byte *bmap, const byte *pc2ncmap, int numcols, int colorstyle, int BitsPerPixel) -{ - int InitCodeSize; - int i; - byte *pic8 = pic; - - if (!(htab = calloc(HSIZE, sizeof(count_int)))) { - fprintf(stderr, "Out of memory"); - return 1; - } - if (!(codetab = calloc(HSIZE, sizeof(unsigned short)))) { - fprintf(stderr, "Out of memory"); - return 1; - } - - /* Shut compiler up... */ - (void)ptype; - (void)rmap; - (void)gmap; - (void)bmap; - (void)numcols; - (void)colorstyle; - - for (i = 0; i < 256; i++) { - pc2nc[i] = pc2ncmap[i]; - } - - if (BitsPerPixel <= 1) - InitCodeSize = 2; - else - InitCodeSize = BitsPerPixel; - - if (!fp) { - fprintf(stderr, "WriteGIF: file not open for writing\n"); - return 1; - } - - compress(InitCodeSize + 1, fp, pic8, w * h); - - free(htab); - free(codetab); - - if (ferror(fp)) - return -1; - - return 0; -} - -/********************************************************/ -static void -compress(int init_bits, FILE *outfile, byte *data, int len) -{ - long fcode; - int i = 0; - int c; - int ent; - int disp; - int hsize_reg; - int hshift; - - /* - * Set up the globals: g_init_bits - initial number of bits g_outfile - - * pointer to output file - */ - g_init_bits = init_bits; - g_outfile = outfile; - - /* initialize 'compress' globals */ - maxbits = XV_BITS; - maxmaxcode = 1 << XV_BITS; - hsize = HSIZE; - free_ent = 0; - clear_flg = 0; - in_count = 1; - out_count = 0; - cur_accum = 0; - cur_bits = 0; - - /* Set up the necessary values */ - out_count = 0; - clear_flg = 0; - in_count = 1; - maxcode = MAXCODE(n_bits = g_init_bits); - - ClearCode = (1 << (init_bits - 1)); - EOFCode = ClearCode + 1; - free_ent = ClearCode + 2; - - char_init(); - ent = pc2nc[*data++]; - len--; - - hshift = 0; - for (fcode = (long)hsize; fcode < 65536L; fcode *= 2L) - hshift++; - - hshift = 8 - hshift; /* set hash code range bound */ - - hsize_reg = hsize; - cl_hash((count_int)hsize_reg); /* clear hash table */ - - output(ClearCode); - - while (len) { - c = pc2nc[*data++]; - len--; - in_count++; - - fcode = (long)(((long)c << maxbits) + ent); - i = (((int)c << hshift) ^ ent); /* xor hashing */ - - if (HashTabOf(i) == fcode) { - ent = CodeTabOf(i); - continue; - } - else if ((long)HashTabOf(i) < 0) { - /* empty slot */ - goto nomatch; - } - - disp = hsize_reg - i; /* secondary hash (after G. Knott) */ - - if (i == 0) - disp = 1; - -probe: - if ((i -= disp) < 0) - i += hsize_reg; - - if (HashTabOf(i) == fcode) { - ent = CodeTabOf(i); - continue; - } - - if ((long)HashTabOf(i) >= 0) - goto probe; - -nomatch: - output(ent); - out_count++; - ent = c; - - if (free_ent < maxmaxcode) { - CodeTabOf(i) = (unsigned short)free_ent++; /* code -> hashtable */ - HashTabOf(i) = fcode; - } - else { - cl_block(); - } - } - - /* Put out the final code */ - output(ent); - out_count++; - output(EOFCode); -} - -/***************************************************************** - * TAG( output ) - * - * Output the given code. - * Inputs: - * code: A n_bits-bit integer. If == -1, then EOF. This assumes - * that n_bits =< (long)wordsize - 1. - * Outputs: - * Outputs code to the file. - * Assumptions: - * Chars are 8 bits long. - * Algorithm: - * Maintain a BITS character long buffer (so that 8 codes will - * fit in it exactly). Use the VAX insv instruction to insert each - * code in turn. When the buffer fills up empty it and start over. - */ - -static unsigned long masks[] = {0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F, 0x003F, 0x007F, 0x00FF, - 0x01FF, 0x03FF, 0x07FF, 0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF}; - -static void -output(int code) -{ - cur_accum &= masks[cur_bits]; - - if (cur_bits > 0) - cur_accum |= (unsigned long)((long)code << cur_bits); - else - cur_accum = (unsigned long)code; - - cur_bits += n_bits; - - while (cur_bits >= 8) { - char_out((int)((unsigned int)cur_accum & 0xff)); - cur_accum >>= 8; - cur_bits -= 8; - } - - /* - * If the next entry is going to be too big for the code size, then - * increase it, if possible. - */ - if (free_ent > maxcode || clear_flg) { - if (clear_flg) { - maxcode = MAXCODE(n_bits = g_init_bits); - clear_flg = 0; - } - else { - n_bits++; - - if (n_bits == maxbits) - maxcode = maxmaxcode; - else - maxcode = MAXCODE(n_bits); - } - } - - if (code == EOFCode) { - /* At EOF, write the rest of the buffer */ - while (cur_bits > 0) { - char_out((int)((unsigned int)cur_accum & 0xff)); - cur_accum >>= 8; - cur_bits -= 8; - } - - flush_char(); - fflush(g_outfile); - -#ifdef FOO - if (ferror(g_outfile)) - FatalError("unable to write GIF file"); -#endif - } -} - -/********************************/ -static void -cl_block(void) /* table clear for block compress */ -{ - /* Clear out the hash table */ - cl_hash((count_int)hsize); - free_ent = ClearCode + 2; - clear_flg = 1; - output(ClearCode); -} - -/********************************/ -static void -cl_hash(count_int hashsize) /* reset code table */ -{ - count_int *htab_p = htab + hashsize; - long i, m1 = -1; - - i = hashsize - 16; - - do { /* might use Sys V memset(3) here */ - *(htab_p - 16) = m1; - *(htab_p - 15) = m1; - *(htab_p - 14) = m1; - *(htab_p - 13) = m1; - *(htab_p - 12) = m1; - *(htab_p - 11) = m1; - *(htab_p - 10) = m1; - *(htab_p - 9) = m1; - *(htab_p - 8) = m1; - *(htab_p - 7) = m1; - *(htab_p - 6) = m1; - *(htab_p - 5) = m1; - *(htab_p - 4) = m1; - *(htab_p - 3) = m1; - *(htab_p - 2) = m1; - *(htab_p - 1) = m1; - htab_p -= 16; - } while ((i -= 16) >= 0); - - for (i += 16; i > 0; i--) - *--htab_p = m1; -} - -/****************************************************************************** - * - * GIF Specific routines - * - ******************************************************************************/ - -/* - * Number of characters so far in this 'packet' - */ -static int a_count; - -/* - * Set up the 'byte output' routine - */ -static void -char_init(void) -{ - a_count = 0; -} - -/* - * Define the storage for the packet accumulator - */ -static char accum[256]; - -/* - * Add a character to the end of the current packet, and if it is 254 - * characters, flush the packet to disk. - */ -static void -char_out(int c) -{ - accum[a_count++] = (char)c; - - if (a_count >= 254) - flush_char(); -} - -/* - * Flush the packet to disk, and reset the accumulator - */ -static void -flush_char(void) -{ - if (a_count > 0) { - fputc(a_count, g_outfile); - fwrite(accum, (size_t)1, (size_t)a_count, g_outfile); - a_count = 0; - } -} diff --git a/hl/tools/gif2h5/testfiles/README b/hl/tools/gif2h5/testfiles/README deleted file mode 100644 index a428d479e66..00000000000 --- a/hl/tools/gif2h5/testfiles/README +++ /dev/null @@ -1,6 +0,0 @@ -ex_image2.h5 - Generated by hl/examples/ex_image2.c -5giftst.h5: - Generated by ../h52gifgentst.c -image1.gif: - To be determined. diff --git a/hl/tools/gif2h5/testfiles/ex_image2.h5 b/hl/tools/gif2h5/testfiles/ex_image2.h5 deleted file mode 100644 index a36df1b480f..00000000000 Binary files a/hl/tools/gif2h5/testfiles/ex_image2.h5 and /dev/null differ diff --git a/hl/tools/gif2h5/testfiles/h52giftst.h5 b/hl/tools/gif2h5/testfiles/h52giftst.h5 deleted file mode 100644 index a827b3b5057..00000000000 Binary files a/hl/tools/gif2h5/testfiles/h52giftst.h5 and /dev/null differ diff --git a/hl/tools/gif2h5/testfiles/image1.gif b/hl/tools/gif2h5/testfiles/image1.gif deleted file mode 100644 index b90b23aa4c4..00000000000 Binary files a/hl/tools/gif2h5/testfiles/image1.gif and /dev/null differ diff --git a/hl/tools/gif2h5/writehdf.c b/hl/tools/gif2h5/writehdf.c deleted file mode 100644 index 8f0cc0d6182..00000000000 --- a/hl/tools/gif2h5/writehdf.c +++ /dev/null @@ -1,115 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include -#include -#include - -#include "gif.h" -#include "H5IMpublic.h" - -#define PAL_NAME "global" - -/*------------------------------------------------------------------------- - * Function: WriteHDF - * - * Purpose: Write the GIF image with the HDF5 Image API - * - *------------------------------------------------------------------------- - */ - -int -WriteHDF(GIFTOMEM GifMemoryStruct, char *HDFName) -{ - GIFHEAD gifHead; /* GIF Header structure */ - GIFIMAGEDESC *gifImageDesc; /* Logical Image Descriptor struct */ - int has_pal = 0; - - long ImageCount; /* number of images */ -#ifdef UNUSED - long CommentCount, /* number of comments */ - ApplicationCount, /* number of application extensions */ - PlainTextCount; /* number of plain text extensions */ -#endif /* UNUSED */ - - char ImageName[256]; /* Image name for the Image */ - - /* H5 variables */ - hid_t file_id; /* H5 file id */ - - /* temp counter */ - int i; - - /* get the GIFMem stuff */ - gifHead = *(GifMemoryStruct.GifHeader); - - /* get some data from gifHead */ - ImageCount = gifHead.ImageCount; -#ifdef UNUSED - CommentCount = (GIFWORD)gifHead.CommentCount; - ApplicationCount = (GIFWORD)gifHead.ApplicationCount; - PlainTextCount = (GIFWORD)gifHead.PlainTextCount; -#endif /* UNUSED */ - - if ((file_id = H5Fcreate(HDFName, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT)) < 0) { - /* error occurred opening the HDF File for write */ - fprintf(stderr, "HDF file could not be opened for writing\n"); - fprintf(stderr, - "NOTE: GIF file must be present in the same directory as the binary on UNIX systems.\n"); - exit(1); - } - - /* first create the global palette if there is one */ - if (gifHead.PackedField & 0x80) { /* global palette exists */ - hsize_t dims[2]; /* specify the dimensions of the palette */ - - /* size of the palette is tablesize (rows) X 3 (columns) */ - dims[0] = gifHead.TableSize; - dims[1] = 3; - - /* make a palette */ - if (H5IMmake_palette(file_id, PAL_NAME, dims, (unsigned char *)gifHead.HDFPalette) < 0) - return -1; - - has_pal = 1; - } - - for (i = 0; i < ImageCount; i++) { - hsize_t dims[2]; /* dimensions for the dataset */ - /* get the gifImageDesc */ - gifImageDesc = GifMemoryStruct.GifImageDesc[i]; - - /* set the dimensions */ - dims[0] = gifImageDesc->ImageHeight; - dims[1] = gifImageDesc->ImageWidth; - - /* create the image name */ - snprintf(ImageName, sizeof(ImageName), "Image%d", i); - - /* write image */ - if (H5IMmake_image_8bit(file_id, ImageName, dims[1], dims[0], (gifImageDesc->Image)) < 0) - return -1; - - /* attach the palette to the image dataset */ - if (has_pal) { - if (H5IMlink_palette(file_id, ImageName, PAL_NAME) < 0) - return -1; - } - } - - /* close the H5 file */ - if (H5Fclose(file_id) < 0) { - fprintf(stderr, "Could not close HDF5 file. Aborting...\n"); - return -1; - } - - return 0; -} diff --git a/hl/tools/h5watch/CMakeLists.txt b/hl/tools/h5watch/CMakeLists.txt index 7b00431cae1..e802075d2c8 100644 --- a/hl/tools/h5watch/CMakeLists.txt +++ b/hl/tools/h5watch/CMakeLists.txt @@ -36,7 +36,7 @@ if (BUILD_TESTING AND HDF5_TEST_SWMR AND HDF5_TEST_SERIAL) ) add_executable (extend_dset ${extend_dset_SOURCES}) target_compile_options(extend_dset PRIVATE "${HDF5_CMAKE_C_FLAGS}") - target_include_directories (extend_dset PRIVATE "${HDF5_HL_SRC_DIR}/test;${HDF5_HL_SRC_DIR}/src;${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") + target_include_directories (extend_dset PRIVATE "${HDF5_HL_TST_DIR};${HDF5_HL_SRC_DIR};${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") if (HDF5_BUILD_STATIC_TOOLS) TARGET_C_PROPERTIES (extend_dset STATIC) target_link_libraries (extend_dset PRIVATE ${HDF5_HL_LIB_TARGET} ${HDF5_TEST_LIB_TARGET} ${HDF5_LIB_TARGET} ${HDF5_TOOLS_LIB_TARGET}) @@ -55,7 +55,7 @@ if (BUILD_TESTING AND HDF5_TEST_SWMR AND HDF5_TEST_SERIAL) add_executable (h5watchgentest ${HDF5_HL_TOOLS_H5WATCH_SOURCE_DIR}/h5watchgentest.c) target_compile_options(h5watchgentest PRIVATE "${HDF5_CMAKE_C_FLAGS}") - target_include_directories (h5watchgentest PRIVATE "${HDF5_HL_SRC_DIR}/src;${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") + target_include_directories (h5watchgentest PRIVATE "${HDF5_HL_SRC_DIR};${HDF5_SRC_INCLUDE_DIRS};${HDF5_SRC_BINARY_DIR};$<$:${MPI_C_INCLUDE_DIRS}>") if (HDF5_BUILD_STATIC_TOOLS) TARGET_C_PROPERTIES (h5watchgentest STATIC) target_link_libraries (h5watchgentest PRIVATE ${HDF5_HL_LIB_TARGET} ${HDF5_LIB_TARGET}) diff --git a/hl/tools/h5watch/CMakeTests.cmake b/hl/tools/h5watch/CMakeTests.cmake index b807fad6264..19790da4e9d 100644 --- a/hl/tools/h5watch/CMakeTests.cmake +++ b/hl/tools/h5watch/CMakeTests.cmake @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/tools/h5watch/Makefile.am b/hl/tools/h5watch/Makefile.am index 8f577754561..e4ae1a2a3d6 100644 --- a/hl/tools/h5watch/Makefile.am +++ b/hl/tools/h5watch/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/hl/tools/h5watch/extend_dset.c b/hl/tools/h5watch/extend_dset.c index abba782399a..1b68d8a323f 100644 --- a/hl/tools/h5watch/extend_dset.c +++ b/hl/tools/h5watch/extend_dset.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/tools/h5watch/h5watch.c b/hl/tools/h5watch/h5watch.c index b4dd62fd70c..594e8cbbcf7 100644 --- a/hl/tools/h5watch/h5watch.c +++ b/hl/tools/h5watch/h5watch.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -94,16 +94,21 @@ static struct h5_long_options l_opts[] = {{"help", no_arg, 'h'}, {"hel", static herr_t doprint(hid_t did, const hsize_t *start, const hsize_t *block, int rank) { - h5tools_context_t ctx; /* print context */ - h5tool_format_t info; /* Format info for the tools library */ - static char fmt_double[16], fmt_float[16]; /* Format info */ - struct subset_t subset; /* Subsetting info */ - hsize_t ss_start[H5S_MAX_RANK]; /* Info for hyperslab */ - hsize_t ss_stride[H5S_MAX_RANK]; /* Info for hyperslab */ - hsize_t ss_block[H5S_MAX_RANK]; /* Info for hyperslab */ - hsize_t ss_count[H5S_MAX_RANK]; /* Info for hyperslab */ - int i; /* Local index variable */ - herr_t ret_value = SUCCEED; /* Return value */ + h5tools_context_t ctx; /* print context */ + h5tool_format_t info; /* Format info for the tools library */ + static char fmt_ldouble[16]; /* Format info */ + static char fmt_double[16]; /* Format info */ + static char fmt_float[16]; /* Format info */ + static char fmt_ldouble_complex[32]; /* Format info */ + static char fmt_double_complex[32]; /* Format info */ + static char fmt_float_complex[16]; /* Format info */ + struct subset_t subset; /* Subsetting info */ + hsize_t ss_start[H5S_MAX_RANK]; /* Info for hyperslab */ + hsize_t ss_stride[H5S_MAX_RANK]; /* Info for hyperslab */ + hsize_t ss_block[H5S_MAX_RANK]; /* Info for hyperslab */ + hsize_t ss_count[H5S_MAX_RANK]; /* Info for hyperslab */ + int i; /* Local index variable */ + herr_t ret_value = SUCCEED; /* Return value */ /* Subsetting information for the tools library printing routines */ subset.start.data = ss_start; @@ -175,6 +180,14 @@ doprint(hid_t did, const hsize_t *start, const hsize_t *block, int rank) info.fmt_float = fmt_float; snprintf(fmt_double, sizeof(fmt_double), "%%1.%dg", DBL_DIG); info.fmt_double = fmt_double; + snprintf(fmt_ldouble, sizeof(fmt_ldouble), "%%1.%dLg", LDBL_DIG); + info.fmt_ldouble = fmt_ldouble; + snprintf(fmt_float_complex, sizeof(fmt_float_complex), "%%1.%dg%%+1.%dgi", FLT_DIG, FLT_DIG); + info.fmt_float_complex = fmt_float_complex; + snprintf(fmt_double_complex, sizeof(fmt_double_complex), "%%1.%dg%%+1.%dgi", DBL_DIG, DBL_DIG); + info.fmt_double_complex = fmt_double_complex; + snprintf(fmt_ldouble_complex, sizeof(fmt_ldouble_complex), "%%1.%dLg%%+1.%dLgi", LDBL_DIG, LDBL_DIG); + info.fmt_ldouble_complex = fmt_ldouble_complex; info.dset_format = "DSET-%s "; info.dset_hidefileno = 0; diff --git a/hl/tools/h5watch/h5watch.h b/hl/tools/h5watch/h5watch.h index 188707bba2b..a7c625af65e 100644 --- a/hl/tools/h5watch/h5watch.h +++ b/hl/tools/h5watch/h5watch.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/tools/h5watch/h5watchgentest.c b/hl/tools/h5watch/h5watchgentest.c index ef47926a972..f3e30757777 100644 --- a/hl/tools/h5watch/h5watchgentest.c +++ b/hl/tools/h5watch/h5watchgentest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/hl/tools/h5watch/testh5watch.sh.in b/hl/tools/h5watch/testh5watch.sh.in index a1daeec9bf1..05ecfab8bf0 100644 --- a/hl/tools/h5watch/testh5watch.sh.in +++ b/hl/tools/h5watch/testh5watch.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/java/Makefile.am b/java/Makefile.am index b21f17835be..ab534890f5d 100644 --- a/java/Makefile.am +++ b/java/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/java/src/Makefile.am b/java/src/Makefile.am index d73cdf2370c..e194a0fce5d 100644 --- a/java/src/Makefile.am +++ b/java/src/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/java/src/hdf/hdf5lib/H5.java b/java/src/hdf/hdf5lib/H5.java index 54c51798cf7..fe475611bc8 100644 --- a/java/src/hdf/hdf5lib/H5.java +++ b/java/src/hdf/hdf5lib/H5.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -231,7 +231,7 @@ * which prints out the HDF5 error stack, as described in the HDF5 C API @ref H5Eprint(). This * may be used by Java exception handlers to print out the HDF5 error stack.


    * - * @version HDF5 1.17.0
    + * @version HDF5 2.0.0
    * See also: * @ref HDFARRAY hdf.hdf5lib.HDFArray
    * @ref HDF5CONST hdf.hdf5lib.HDF5Constants
    @@ -273,7 +273,7 @@ public class H5 implements java.io.Serializable { *
* Make sure to update the versions number when a different library is used. */ - public final static int LIB_VERSION[] = {1, 17, 0}; + public final static int LIB_VERSION[] = {2, 0, 0}; /** * @ingroup JH5 @@ -13747,6 +13747,33 @@ public synchronized static native void H5Tcommit_anon(long loc_id, long type_id, public synchronized static native void H5Tcompiler_conv(long src_id, long dst_id) throws HDF5LibraryException; + /** + * @ingroup JH5T + * + * H5Tcomplex_create creates a new complex number datatype object. + * + * @param base_id + * IN: Datatype identifier for the complex number base datatype. + * Must be a floating-point datatype. + * + * @return a valid datatype identifier + * + * @exception HDF5LibraryException + * Error from the HDF5 Library. + **/ + public static long H5Tcomplex_create(long base_id) throws HDF5LibraryException + { + long id = _H5Tcomplex_create(base_id); + if (id > 0) { + log.trace("OPEN_IDS: H5Tcomplex_create add {}", id); + OPEN_IDS.add(id); + log.trace("OPEN_IDS: {}", OPEN_IDS.size()); + } + return id; + } + + private synchronized static native long _H5Tcomplex_create(long base_id) throws HDF5LibraryException; + /** * @ingroup JH5T * @@ -14250,6 +14277,8 @@ else if (HDF5Constants.H5T_VLEN == class_id) /* Variable-Length types */ retValue = "H5T_VLEN"; else if (HDF5Constants.H5T_ARRAY == class_id) /* Array types */ retValue = "H5T_ARRAY"; + else if (HDF5Constants.H5T_COMPLEX == class_id) /* Complex number types */ + retValue = "H5T_COMPLEX"; else retValue = "H5T_NO_CLASS"; diff --git a/java/src/hdf/hdf5lib/HDF5Constants.java b/java/src/hdf/hdf5lib/HDF5Constants.java index 0260ce879e9..57f653865da 100644 --- a/java/src/hdf/hdf5lib/HDF5Constants.java +++ b/java/src/hdf/hdf5lib/HDF5Constants.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -573,14 +573,12 @@ public class HDF5Constants { /** */ public static final int H5F_LIBVER_V114 = H5F_LIBVER_V114(); /** */ - public static final int H5F_LIBVER_V116 = H5F_LIBVER_V116(); + public static final int H5F_LIBVER_V200 = H5F_LIBVER_V200(); /** */ - public static final int H5F_LIBVER_V118 = H5F_LIBVER_V118(); + public static final int H5F_LIBVER_LATEST = H5F_LIBVER_LATEST(); /** */ public static final int H5F_LIBVER_NBOUNDS = H5F_LIBVER_NBOUNDS(); /** */ - public static final int H5F_LIBVER_LATEST = H5F_LIBVER_LATEST(); - /** */ public static final int H5F_OBJ_ALL = H5F_OBJ_ALL(); /** */ public static final int H5F_OBJ_ATTR = H5F_OBJ_ATTR(); @@ -1043,6 +1041,8 @@ public class HDF5Constants { /** */ public static final long H5T_C_S1 = H5T_C_S1(); /** */ + public static final int H5T_COMPLEX = H5T_COMPLEX(); + /** */ public static final int H5T_COMPOUND = H5T_COMPOUND(); /** */ public static final int H5T_CONV_CONV = H5T_CONV_CONV(); @@ -1051,6 +1051,18 @@ public class HDF5Constants { /** */ public static final int H5T_CONV_INIT = H5T_CONV_INIT(); /** */ + public static final long H5T_COMPLEX_IEEE_F16BE = H5T_COMPLEX_IEEE_F16BE(); + /** */ + public static final long H5T_COMPLEX_IEEE_F16LE = H5T_COMPLEX_IEEE_F16LE(); + /** */ + public static final long H5T_COMPLEX_IEEE_F32BE = H5T_COMPLEX_IEEE_F32BE(); + /** */ + public static final long H5T_COMPLEX_IEEE_F32LE = H5T_COMPLEX_IEEE_F32LE(); + /** */ + public static final long H5T_COMPLEX_IEEE_F64BE = H5T_COMPLEX_IEEE_F64BE(); + /** */ + public static final long H5T_COMPLEX_IEEE_F64LE = H5T_COMPLEX_IEEE_F64LE(); + /** */ public static final int H5T_CSET_ERROR = H5T_CSET_ERROR(); /** */ public static final int H5T_CSET_ASCII = H5T_CSET_ASCII(); @@ -1179,10 +1191,14 @@ public class HDF5Constants { /** */ public static final long H5T_NATIVE_DOUBLE = H5T_NATIVE_DOUBLE(); /** */ + public static final long H5T_NATIVE_DOUBLE_COMPLEX = H5T_NATIVE_DOUBLE_COMPLEX(); + /** */ public static final long H5T_NATIVE_FLOAT = H5T_NATIVE_FLOAT(); /** */ public static final long H5T_NATIVE_FLOAT16 = H5T_NATIVE_FLOAT16(); /** */ + public static final long H5T_NATIVE_FLOAT_COMPLEX = H5T_NATIVE_FLOAT_COMPLEX(); + /** */ public static final long H5T_NATIVE_HADDR = H5T_NATIVE_HADDR(); /** */ public static final long H5T_NATIVE_HBOOL = H5T_NATIVE_HBOOL(); @@ -1225,6 +1241,8 @@ public class HDF5Constants { /** */ public static final long H5T_NATIVE_LONG = H5T_NATIVE_LONG(); /** */ + public static final long H5T_NATIVE_LDOUBLE_COMPLEX = H5T_NATIVE_LDOUBLE_COMPLEX(); + /** */ public static final long H5T_NATIVE_OPAQUE = H5T_NATIVE_OPAQUE(); /** */ public static final long H5T_NATIVE_SCHAR = H5T_NATIVE_SCHAR(); @@ -2060,14 +2078,12 @@ public class HDF5Constants { private static native final int H5F_LIBVER_V114(); - private static native final int H5F_LIBVER_V116(); + private static native final int H5F_LIBVER_V200(); - private static native final int H5F_LIBVER_V118(); + private static native final int H5F_LIBVER_LATEST(); private static native final int H5F_LIBVER_NBOUNDS(); - private static native final int H5F_LIBVER_LATEST(); - private static native final int H5F_OBJ_ALL(); private static native final int H5F_OBJ_ATTR(); @@ -2536,6 +2552,8 @@ public class HDF5Constants { private static native final long H5T_C_S1(); + private static native final int H5T_COMPLEX(); + private static native final int H5T_COMPOUND(); private static native final int H5T_CONV_CONV(); @@ -2544,6 +2562,18 @@ public class HDF5Constants { private static native final int H5T_CONV_INIT(); + private static native final long H5T_COMPLEX_IEEE_F16BE(); + + private static native final long H5T_COMPLEX_IEEE_F16LE(); + + private static native final long H5T_COMPLEX_IEEE_F32BE(); + + private static native final long H5T_COMPLEX_IEEE_F32LE(); + + private static native final long H5T_COMPLEX_IEEE_F64BE(); + + private static native final long H5T_COMPLEX_IEEE_F64LE(); + private static native final int H5T_CSET_ERROR(); private static native final int H5T_CSET_ASCII(); @@ -2672,10 +2702,14 @@ public class HDF5Constants { private static native final long H5T_NATIVE_DOUBLE(); + private static native final long H5T_NATIVE_DOUBLE_COMPLEX(); + private static native final long H5T_NATIVE_FLOAT(); private static native final long H5T_NATIVE_FLOAT16(); + private static native final long H5T_NATIVE_FLOAT_COMPLEX(); + private static native final long H5T_NATIVE_HADDR(); private static native final long H5T_NATIVE_HBOOL(); @@ -2718,6 +2752,8 @@ public class HDF5Constants { private static native final long H5T_NATIVE_LONG(); + private static native final long H5T_NATIVE_LDOUBLE_COMPLEX(); + private static native final long H5T_NATIVE_OPAQUE(); private static native final long H5T_NATIVE_SCHAR(); diff --git a/java/src/hdf/hdf5lib/HDFArray.java b/java/src/hdf/hdf5lib/HDFArray.java index 637a8966e6c..15072cabdda 100644 --- a/java/src/hdf/hdf5lib/HDFArray.java +++ b/java/src/hdf/hdf5lib/HDFArray.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/HDFNativeData.java b/java/src/hdf/hdf5lib/HDFNativeData.java index adfa4c5ee34..a6155ca2a65 100644 --- a/java/src/hdf/hdf5lib/HDFNativeData.java +++ b/java/src/hdf/hdf5lib/HDFNativeData.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/Callbacks.java b/java/src/hdf/hdf5lib/callbacks/Callbacks.java index 013e0ec0ae7..a106ab67625 100644 --- a/java/src/hdf/hdf5lib/callbacks/Callbacks.java +++ b/java/src/hdf/hdf5lib/callbacks/Callbacks.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java index 2d37044b1e1..b7471805d68 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java index 45bde9a51bf..c25f08d169a 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5A_iterate_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java b/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java index 92024f8f16a..d29a4199fa0 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5D_append_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java b/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java index cb178963875..676b0c72c2d 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5D_append_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java index f9ea6a96b3a..02f3069572d 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java index fb48c73954d..43bf570d496 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5D_iterate_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java b/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java index a9690a55fe1..b4e9eb61592 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5E_walk_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java b/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java index 131b33fd0ea..d7c2e017815 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5E_walk_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_opdata_t.java b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_opdata_t.java index c657dbc49cb..bc7a173cae5 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_opdata_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_opdata_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java index cf0ac0e5b78..1aaaabea5d6 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5L_iterate_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_opdata_t.java b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_opdata_t.java index f4a4412afdd..9e53c729736 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_opdata_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_opdata_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java index f0dd587d88c..74836a2eb5c 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5O_iterate_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java index e4f10ccfa33..4eccb24a003 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java index 059addfa9fb..45b0a98abd6 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_close_func_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java index bdaad5f9324..332181079d8 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java index 4b7cf116d1e..82483070bc3 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_copy_func_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java index 0b9ced20059..43f915a4943 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java index 917264d9a9c..67eca814afe 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_cls_create_func_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java index 941fd150a3e..6586a6aca8f 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java index 9c0d0eb6851..b2c6fe494e2 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_iterate_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java index 33bde76df4b..4eb3b33ba19 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_close_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java index 3149d171fe1..91c2863c95a 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_compare_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java index d3d6b37365a..49827d1666b 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_copy_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java index 2fe33388f91..0391596994f 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_create_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java index 30192842d99..477612ff23b 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_delete_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java index cfc8e314ab6..2bf08ce4322 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_get_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java b/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java index 22728699782..11f00d65fad 100644 --- a/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java +++ b/java/src/hdf/hdf5lib/callbacks/H5P_prp_set_func_cb.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/callbacks/package-info.java b/java/src/hdf/hdf5lib/callbacks/package-info.java index bf7bf3c79c1..323442c79b1 100644 --- a/java/src/hdf/hdf5lib/callbacks/package-info.java +++ b/java/src/hdf/hdf5lib/callbacks/package-info.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java b/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java index aff9f99c0d1..94999d2b470 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5AttributeException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java b/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java index ba70615ebea..64ed54d64fa 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5BtreeException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java index 77b25ecdef9..255f1fea68d 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataFiltersException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java index 6097f604abe..7a033232521 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataStorageException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java index e8747bc37f5..3d4f50d28d6 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5DatasetInterfaceException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java index 4ab514f126f..7bd4ad57ee1 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5DataspaceInterfaceException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java index ec45ea61926..18c07cef2c0 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5DatatypeInterfaceException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java b/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java index de5ee3aee48..403c7684ac6 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5Exception.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java index 55baaa9ff80..05a78b8d5ac 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5ExternalFileListException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java index 07110de22b1..56961a5af73 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5FileInterfaceException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java index 38e919ec3ff..a212989b23a 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionArgumentException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java index 302107d4a3d..278589605b0 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5FunctionEntryExitException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java b/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java index 72272a08910..6718806c61a 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5HeapException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java b/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java index f28ce37114b..deb85a1050c 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5IdException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java b/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java index 0f1d4207ebb..3923a6a3183 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5InternalErrorException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java b/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java index 90a4fa6eee2..65f4667249e 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5JavaException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java b/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java index 70e157b817e..31d29b2ca2b 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5LibraryException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java b/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java index a8b197655e0..fba46c3abce 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5LowLevelIOException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java b/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java index da96218b01f..0394fb6763c 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5MetaDataCacheException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java index 151381673d9..4708707bdce 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5ObjectHeaderException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java index 99dc369ab5f..86b5b26b9e4 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5PropertyListInterfaceException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java index 4c0f9ba5592..8f470b14ec3 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5ReferenceException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java b/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java index dde27f7991e..d3e46d4aff6 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5ResourceUnavailableException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java b/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java index 62657ea3c7f..df3d43d6f4d 100644 --- a/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java +++ b/java/src/hdf/hdf5lib/exceptions/HDF5SymbolTableException.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/exceptions/package-info.java b/java/src/hdf/hdf5lib/exceptions/package-info.java index 784e57d6dda..f7e229444e5 100644 --- a/java/src/hdf/hdf5lib/exceptions/package-info.java +++ b/java/src/hdf/hdf5lib/exceptions/package-info.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/package-info.java b/java/src/hdf/hdf5lib/package-info.java index e7421975917..77ef151621f 100644 --- a/java/src/hdf/hdf5lib/package-info.java +++ b/java/src/hdf/hdf5lib/package-info.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java b/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java index a224124f3f5..b8cf7e97f04 100644 --- a/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java +++ b/java/src/hdf/hdf5lib/structs/H5AC_cache_config_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5A_info_t.java b/java/src/hdf/hdf5lib/structs/H5A_info_t.java index 364e48079db..0ba6f4b638e 100644 --- a/java/src/hdf/hdf5lib/structs/H5A_info_t.java +++ b/java/src/hdf/hdf5lib/structs/H5A_info_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5E_error2_t.java b/java/src/hdf/hdf5lib/structs/H5E_error2_t.java index 1be836f3a75..b7dbb57bf76 100644 --- a/java/src/hdf/hdf5lib/structs/H5E_error2_t.java +++ b/java/src/hdf/hdf5lib/structs/H5E_error2_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5FD_hdfs_fapl_t.java b/java/src/hdf/hdf5lib/structs/H5FD_hdfs_fapl_t.java index 986133448f0..20d63648ccb 100644 --- a/java/src/hdf/hdf5lib/structs/H5FD_hdfs_fapl_t.java +++ b/java/src/hdf/hdf5lib/structs/H5FD_hdfs_fapl_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5FD_ros3_fapl_t.java b/java/src/hdf/hdf5lib/structs/H5FD_ros3_fapl_t.java index 62b29218e39..f820f9ed584 100644 --- a/java/src/hdf/hdf5lib/structs/H5FD_ros3_fapl_t.java +++ b/java/src/hdf/hdf5lib/structs/H5FD_ros3_fapl_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5F_info2_t.java b/java/src/hdf/hdf5lib/structs/H5F_info2_t.java index 1961b16f75b..0cdecab5c07 100644 --- a/java/src/hdf/hdf5lib/structs/H5F_info2_t.java +++ b/java/src/hdf/hdf5lib/structs/H5F_info2_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5G_info_t.java b/java/src/hdf/hdf5lib/structs/H5G_info_t.java index 10ae76a72a6..0bcf6256f80 100644 --- a/java/src/hdf/hdf5lib/structs/H5G_info_t.java +++ b/java/src/hdf/hdf5lib/structs/H5G_info_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5L_info_t.java b/java/src/hdf/hdf5lib/structs/H5L_info_t.java index 38b64d64115..aa04c97d2d4 100644 --- a/java/src/hdf/hdf5lib/structs/H5L_info_t.java +++ b/java/src/hdf/hdf5lib/structs/H5L_info_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java b/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java index 16a0eaec92c..3c8a2938337 100644 --- a/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java +++ b/java/src/hdf/hdf5lib/structs/H5O_hdr_info_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5O_info_t.java b/java/src/hdf/hdf5lib/structs/H5O_info_t.java index 011a88e3585..dad690fa62d 100644 --- a/java/src/hdf/hdf5lib/structs/H5O_info_t.java +++ b/java/src/hdf/hdf5lib/structs/H5O_info_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5O_native_info_t.java b/java/src/hdf/hdf5lib/structs/H5O_native_info_t.java index ec01b402922..33a0f730fb4 100644 --- a/java/src/hdf/hdf5lib/structs/H5O_native_info_t.java +++ b/java/src/hdf/hdf5lib/structs/H5O_native_info_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5O_token_t.java b/java/src/hdf/hdf5lib/structs/H5O_token_t.java index 8f2b7e27ac8..3e59276b23c 100644 --- a/java/src/hdf/hdf5lib/structs/H5O_token_t.java +++ b/java/src/hdf/hdf5lib/structs/H5O_token_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java b/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java index 3213695d823..a258c2af19c 100644 --- a/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java +++ b/java/src/hdf/hdf5lib/structs/H5_ih_info_t.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/hdf/hdf5lib/structs/package-info.java b/java/src/hdf/hdf5lib/structs/package-info.java index 7bd3dee9bba..9e127233009 100644 --- a/java/src/hdf/hdf5lib/structs/package-info.java +++ b/java/src/hdf/hdf5lib/structs/package-info.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/Makefile.am b/java/src/jni/Makefile.am index bf086d23aa2..a52d1cbd27e 100644 --- a/java/src/jni/Makefile.am +++ b/java/src/jni/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/java/src/jni/exceptionImp.c b/java/src/jni/exceptionImp.c index 6b2004ddeb4..83d1afaf1ee 100644 --- a/java/src/jni/exceptionImp.c +++ b/java/src/jni/exceptionImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/exceptionImp.h b/java/src/jni/exceptionImp.h index c7375e73cd6..3a267e6ae24 100644 --- a/java/src/jni/exceptionImp.h +++ b/java/src/jni/exceptionImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5Constants.c b/java/src/jni/h5Constants.c index 41cd6344033..4d3339c494a 100644 --- a/java/src/jni/h5Constants.c +++ b/java/src/jni/h5Constants.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1304,14 +1304,14 @@ Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1V114(JNIEnv *env, jclass cls) return H5F_LIBVER_V114; } JNIEXPORT jint JNICALL -Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1V116(JNIEnv *env, jclass cls) +Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1V200(JNIEnv *env, jclass cls) { - return H5F_LIBVER_V116; + return H5F_LIBVER_V200; } JNIEXPORT jint JNICALL -Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1V118(JNIEnv *env, jclass cls) +Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1LATEST(JNIEnv *env, jclass cls) { - return H5F_LIBVER_V118; + return H5F_LIBVER_LATEST; } JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1NBOUNDS(JNIEnv *env, jclass cls) @@ -1319,11 +1319,6 @@ Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1NBOUNDS(JNIEnv *env, jclass cls) return H5F_LIBVER_NBOUNDS; } JNIEXPORT jint JNICALL -Java_hdf_hdf5lib_HDF5Constants_H5F_1LIBVER_1LATEST(JNIEnv *env, jclass cls) -{ - return H5F_LIBVER_LATEST; -} -JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5F_1OBJ_1ALL(JNIEnv *env, jclass cls) { return H5F_OBJ_ALL; @@ -2542,6 +2537,11 @@ Java_hdf_hdf5lib_HDF5Constants_H5T_1C_1S1(JNIEnv *env, jclass cls) return H5T_C_S1; } JNIEXPORT jint JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPLEX(JNIEnv *env, jclass cls) +{ + return H5T_COMPLEX; +} +JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPOUND(JNIEnv *env, jclass cls) { return H5T_COMPOUND; @@ -2561,6 +2561,36 @@ Java_hdf_hdf5lib_HDF5Constants_H5T_1CONV_1INIT(JNIEnv *env, jclass cls) { return H5T_CONV_INIT; } +JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPLEX_1IEEE_1F16BE(JNIEnv *env, jclass cls) +{ + return H5T_COMPLEX_IEEE_F16BE; +} +JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPLEX_1IEEE_1F16LE(JNIEnv *env, jclass cls) +{ + return H5T_COMPLEX_IEEE_F16LE; +} +JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPLEX_1IEEE_1F32BE(JNIEnv *env, jclass cls) +{ + return H5T_COMPLEX_IEEE_F32BE; +} +JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPLEX_1IEEE_1F32LE(JNIEnv *env, jclass cls) +{ + return H5T_COMPLEX_IEEE_F32LE; +} +JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPLEX_1IEEE_1F64BE(JNIEnv *env, jclass cls) +{ + return H5T_COMPLEX_IEEE_F64BE; +} +JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1COMPLEX_1IEEE_1F64LE(JNIEnv *env, jclass cls) +{ + return H5T_COMPLEX_IEEE_F64LE; +} JNIEXPORT jint JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1CSET_1ERROR(JNIEnv *env, jclass cls) { @@ -2882,6 +2912,11 @@ Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1DOUBLE(JNIEnv *env, jclass cls) return H5T_NATIVE_DOUBLE; } JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1DOUBLE_1COMPLEX(JNIEnv *env, jclass cls) +{ + return H5T_NATIVE_DOUBLE_COMPLEX; +} +JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1FLOAT(JNIEnv *env, jclass cls) { return H5T_NATIVE_FLOAT; @@ -2892,6 +2927,11 @@ Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1FLOAT16(JNIEnv *env, jclass cls) return H5T_NATIVE_FLOAT16; } JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1FLOAT_1COMPLEX(JNIEnv *env, jclass cls) +{ + return H5T_NATIVE_FLOAT_COMPLEX; +} +JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1HADDR(JNIEnv *env, jclass cls) { return H5T_NATIVE_HADDR; @@ -2997,6 +3037,11 @@ Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LONG(JNIEnv *env, jclass cls) return H5T_NATIVE_LONG; } JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1LDOUBLE_1COMPLEX(JNIEnv *env, jclass cls) +{ + return H5T_NATIVE_LDOUBLE_COMPLEX; +} +JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_HDF5Constants_H5T_1NATIVE_1OPAQUE(JNIEnv *env, jclass cls) { return H5T_NATIVE_OPAQUE; diff --git a/java/src/jni/h5Imp.c b/java/src/jni/h5Imp.c index 6092419c256..77ad4a9dbb2 100644 --- a/java/src/jni/h5Imp.c +++ b/java/src/jni/h5Imp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5Imp.h b/java/src/jni/h5Imp.h index 8ab766215a4..e4ad2e46f98 100644 --- a/java/src/jni/h5Imp.h +++ b/java/src/jni/h5Imp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5aImp.c b/java/src/jni/h5aImp.c index b6ed1c4c3e1..b6447e51eea 100644 --- a/java/src/jni/h5aImp.c +++ b/java/src/jni/h5aImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1237,12 +1237,13 @@ Java_hdf_hdf5lib_H5_H5Aread_1VLStrings(JNIEnv *env, jclass clss, jlong attr_id, jobjectArray buf) { H5T_class_t type_class; - htri_t isStr = 0; - htri_t isVlenStr = 0; - htri_t isComplex = 0; - htri_t isComplex2 = 0; - hid_t nested_tid = H5I_INVALID_HID; - herr_t status = FAIL; + htri_t isStr = 0; + htri_t isVlenStr = 0; + htri_t isCompound = 0; + htri_t isVlen = 0; + hid_t nested_tid = H5I_INVALID_HID; + bool isComposite = false; + herr_t status = FAIL; UNUSED(clss); @@ -1266,13 +1267,13 @@ Java_hdf_hdf5lib_H5_H5Aread_1VLStrings(JNIEnv *env, jclass clss, jlong attr_id, if ((nested_tid = H5Tget_member_type((hid_t)mem_type_id, i)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) + if ((isCompound = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex2 = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) + if ((isVlen = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) H5_LIBRARY_ERROR(ENVONLY); - isComplex = isComplex || isComplex2; + isComposite = isCompound || isVlen; if (H5Tclose(nested_tid) < 0) H5_LIBRARY_ERROR(ENVONLY); @@ -1283,7 +1284,7 @@ Java_hdf_hdf5lib_H5_H5Aread_1VLStrings(JNIEnv *env, jclass clss, jlong attr_id, isVlenStr = 1; /* Strings created by H5Tvlen_create(H5T_C_S1) */ } - if (!isStr || isComplex || isVlenStr) { + if (!isStr || isComposite || isVlenStr) { if ((status = H5AreadVL_asstr(env, (hid_t)attr_id, (hid_t)mem_type_id, buf)) < 0) CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); } @@ -1441,12 +1442,13 @@ Java_hdf_hdf5lib_H5_H5Awrite_1VLStrings(JNIEnv *env, jclass clss, jlong attr_id, jobjectArray buf) { H5T_class_t type_class; - htri_t isStr = 0; - htri_t isVlenStr = 0; - htri_t isComplex = 0; - htri_t isComplex2 = 0; - hid_t nested_tid = H5I_INVALID_HID; - herr_t status = FAIL; + htri_t isStr = 0; + htri_t isVlenStr = 0; + htri_t isCompound = 0; + htri_t isVlen = 0; + hid_t nested_tid = H5I_INVALID_HID; + bool isComposite = false; + herr_t status = FAIL; UNUSED(clss); @@ -1470,13 +1472,13 @@ Java_hdf_hdf5lib_H5_H5Awrite_1VLStrings(JNIEnv *env, jclass clss, jlong attr_id, if ((nested_tid = H5Tget_member_type((hid_t)mem_type_id, i)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) + if ((isCompound = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex2 = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) + if ((isVlen = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) H5_LIBRARY_ERROR(ENVONLY); - isComplex = isComplex || isComplex2; + isComposite = isCompound || isVlen; if (H5Tclose(nested_tid) < 0) H5_LIBRARY_ERROR(ENVONLY); @@ -1487,7 +1489,7 @@ Java_hdf_hdf5lib_H5_H5Awrite_1VLStrings(JNIEnv *env, jclass clss, jlong attr_id, isVlenStr = 1; /* Strings created by H5Tvlen_create(H5T_C_S1) */ } - if (!isStr || isComplex || isVlenStr) { + if (!isStr || isComposite || isVlenStr) { if ((status = H5AwriteVL_asstr(env, (hid_t)attr_id, (hid_t)mem_type_id, buf)) < 0) CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); } diff --git a/java/src/jni/h5aImp.h b/java/src/jni/h5aImp.h index 094f9904d4a..a5d6141c21f 100644 --- a/java/src/jni/h5aImp.h +++ b/java/src/jni/h5aImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5dImp.c b/java/src/jni/h5dImp.c index 363936b76e9..5dba7a85d93 100644 --- a/java/src/jni/h5dImp.c +++ b/java/src/jni/h5dImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1253,12 +1253,13 @@ Java_hdf_hdf5lib_H5_H5Dread_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_i jobjectArray buf) { H5T_class_t type_class; - htri_t isStr = 0; - htri_t isVlenStr = 0; - htri_t isComplex = 0; - htri_t isComplex2 = 0; - hid_t nested_tid = H5I_INVALID_HID; - herr_t status = FAIL; + htri_t isStr = 0; + htri_t isVlenStr = 0; + htri_t isCompound = 0; + htri_t isVlen = 0; + hid_t nested_tid = H5I_INVALID_HID; + bool isComposite = false; + herr_t status = FAIL; UNUSED(clss); @@ -1282,13 +1283,13 @@ Java_hdf_hdf5lib_H5_H5Dread_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_i if ((nested_tid = H5Tget_member_type((hid_t)mem_type_id, i)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) + if ((isCompound = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex2 = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) + if ((isVlen = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) H5_LIBRARY_ERROR(ENVONLY); - isComplex = isComplex || isComplex2; + isComposite = isCompound || isVlen; if (H5Tclose(nested_tid) < 0) H5_LIBRARY_ERROR(ENVONLY); @@ -1299,7 +1300,7 @@ Java_hdf_hdf5lib_H5_H5Dread_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_i isVlenStr = 1; /* Strings created by H5Tvlen_create(H5T_C_S1) */ } - if (!isStr || isComplex || isVlenStr) { + if (!isStr || isComposite || isVlenStr) { if ((status = H5DreadVL_asstr(env, (hid_t)dataset_id, (hid_t)mem_type_id, (hid_t)mem_space_id, (hid_t)file_space_id, (hid_t)xfer_plist_id, buf)) < 0) CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); @@ -1478,12 +1479,13 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_ jobjectArray buf) { H5T_class_t type_class; - htri_t isStr = 0; - htri_t isVlenStr = 0; - htri_t isComplex = 0; - htri_t isComplex2 = 0; - hid_t nested_tid = H5I_INVALID_HID; - herr_t status = FAIL; + htri_t isStr = 0; + htri_t isVlenStr = 0; + htri_t isCompound = 0; + htri_t isVlen = 0; + hid_t nested_tid = H5I_INVALID_HID; + bool isComposite = false; + herr_t status = FAIL; UNUSED(clss); @@ -1507,13 +1509,13 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_ if ((nested_tid = H5Tget_member_type((hid_t)mem_type_id, i)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) + if ((isCompound = H5Tdetect_class((hid_t)nested_tid, H5T_COMPOUND)) < 0) H5_LIBRARY_ERROR(ENVONLY); - if ((isComplex2 = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) + if ((isVlen = H5Tdetect_class((hid_t)nested_tid, H5T_VLEN)) < 0) H5_LIBRARY_ERROR(ENVONLY); - isComplex = isComplex || isComplex2; + isComposite = isCompound || isVlen; if (H5Tclose(nested_tid) < 0) H5_LIBRARY_ERROR(ENVONLY); @@ -1524,7 +1526,7 @@ Java_hdf_hdf5lib_H5_H5Dwrite_1VLStrings(JNIEnv *env, jclass clss, jlong dataset_ isVlenStr = 1; /* Strings created by H5Tvlen_create(H5T_C_S1) */ } - if (!isStr || isComplex || isVlenStr) { + if (!isStr || isComposite || isVlenStr) { if ((status = H5DwriteVL_asstr(env, (hid_t)dataset_id, (hid_t)mem_type_id, (hid_t)mem_space_id, (hid_t)file_space_id, (hid_t)xfer_plist_id, buf)) < 0) CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); diff --git a/java/src/jni/h5dImp.h b/java/src/jni/h5dImp.h index f79cc2cfb55..7b1916c48c1 100644 --- a/java/src/jni/h5dImp.h +++ b/java/src/jni/h5dImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5eImp.c b/java/src/jni/h5eImp.c index 89c9362626f..0534025e0f4 100644 --- a/java/src/jni/h5eImp.c +++ b/java/src/jni/h5eImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5eImp.h b/java/src/jni/h5eImp.h index 95e43fa6d20..13716f22caf 100644 --- a/java/src/jni/h5eImp.h +++ b/java/src/jni/h5eImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5fImp.c b/java/src/jni/h5fImp.c index 6bd17a786cb..9245d7b2118 100644 --- a/java/src/jni/h5fImp.c +++ b/java/src/jni/h5fImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5fImp.h b/java/src/jni/h5fImp.h index bf2f1991c5e..4a4ca8047a2 100644 --- a/java/src/jni/h5fImp.h +++ b/java/src/jni/h5fImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5gImp.c b/java/src/jni/h5gImp.c index 54b72b6c09a..80acfd74918 100644 --- a/java/src/jni/h5gImp.c +++ b/java/src/jni/h5gImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5gImp.h b/java/src/jni/h5gImp.h index b7130ed13a5..0c4c814850e 100644 --- a/java/src/jni/h5gImp.h +++ b/java/src/jni/h5gImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5iImp.c b/java/src/jni/h5iImp.c index 728c3b14ed5..507299bda6f 100644 --- a/java/src/jni/h5iImp.c +++ b/java/src/jni/h5iImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5iImp.h b/java/src/jni/h5iImp.h index 08d5fa1c9ff..1ad8a393dad 100644 --- a/java/src/jni/h5iImp.h +++ b/java/src/jni/h5iImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5jni.h b/java/src/jni/h5jni.h index b1bd968ba7c..6ffebde12e2 100644 --- a/java/src/jni/h5jni.h +++ b/java/src/jni/h5jni.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5lImp.c b/java/src/jni/h5lImp.c index 7d487999f96..5fc3a8007cb 100644 --- a/java/src/jni/h5lImp.c +++ b/java/src/jni/h5lImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5lImp.h b/java/src/jni/h5lImp.h index 85aff038f24..131c59173cb 100644 --- a/java/src/jni/h5lImp.h +++ b/java/src/jni/h5lImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5oImp.c b/java/src/jni/h5oImp.c index 60a6e4fbf90..81c6ebc592c 100644 --- a/java/src/jni/h5oImp.c +++ b/java/src/jni/h5oImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5oImp.h b/java/src/jni/h5oImp.h index a7d7f3171a6..42245e6c6a5 100644 --- a/java/src/jni/h5oImp.h +++ b/java/src/jni/h5oImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pACPLImp.c b/java/src/jni/h5pACPLImp.c index 7c9895a6de1..69af3a336bb 100644 --- a/java/src/jni/h5pACPLImp.c +++ b/java/src/jni/h5pACPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pACPLImp.h b/java/src/jni/h5pACPLImp.h index 15fcf33b949..ff5c30cb305 100644 --- a/java/src/jni/h5pACPLImp.h +++ b/java/src/jni/h5pACPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pDAPLImp.c b/java/src/jni/h5pDAPLImp.c index 44378a1dc5e..b6ae1836bb9 100644 --- a/java/src/jni/h5pDAPLImp.c +++ b/java/src/jni/h5pDAPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pDAPLImp.h b/java/src/jni/h5pDAPLImp.h index bf11fef9bcf..ac4828b8403 100644 --- a/java/src/jni/h5pDAPLImp.h +++ b/java/src/jni/h5pDAPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pDCPLImp.c b/java/src/jni/h5pDCPLImp.c index ebe12cb5455..4903f61e8a1 100644 --- a/java/src/jni/h5pDCPLImp.c +++ b/java/src/jni/h5pDCPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pDCPLImp.h b/java/src/jni/h5pDCPLImp.h index 46d1cc3d763..eb01518d881 100644 --- a/java/src/jni/h5pDCPLImp.h +++ b/java/src/jni/h5pDCPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pDXPLImp.c b/java/src/jni/h5pDXPLImp.c index 3b519ef2709..cbefa18a8e6 100644 --- a/java/src/jni/h5pDXPLImp.c +++ b/java/src/jni/h5pDXPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pDXPLImp.h b/java/src/jni/h5pDXPLImp.h index 21c40c4ea74..f3f90e54341 100644 --- a/java/src/jni/h5pDXPLImp.h +++ b/java/src/jni/h5pDXPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pFAPLImp.c b/java/src/jni/h5pFAPLImp.c index 24b7f357e50..a78365b5d4b 100644 --- a/java/src/jni/h5pFAPLImp.c +++ b/java/src/jni/h5pFAPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pFAPLImp.h b/java/src/jni/h5pFAPLImp.h index 3c5988f56a9..089edf6fafd 100644 --- a/java/src/jni/h5pFAPLImp.h +++ b/java/src/jni/h5pFAPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pFCPLImp.c b/java/src/jni/h5pFCPLImp.c index 56b4e921aae..ce9b7f7525d 100644 --- a/java/src/jni/h5pFCPLImp.c +++ b/java/src/jni/h5pFCPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pFCPLImp.h b/java/src/jni/h5pFCPLImp.h index 94411d6216c..b740cf245d8 100644 --- a/java/src/jni/h5pFCPLImp.h +++ b/java/src/jni/h5pFCPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pGAPLImp.c b/java/src/jni/h5pGAPLImp.c index b38bd4b3b23..3a5db4edf34 100644 --- a/java/src/jni/h5pGAPLImp.c +++ b/java/src/jni/h5pGAPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pGAPLImp.h b/java/src/jni/h5pGAPLImp.h index 9091ff8ab63..b3148a9da70 100644 --- a/java/src/jni/h5pGAPLImp.h +++ b/java/src/jni/h5pGAPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pGCPLImp.c b/java/src/jni/h5pGCPLImp.c index b71558012ce..d341fea8c12 100644 --- a/java/src/jni/h5pGCPLImp.c +++ b/java/src/jni/h5pGCPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pGCPLImp.h b/java/src/jni/h5pGCPLImp.h index 5090c3a2088..6269449030a 100644 --- a/java/src/jni/h5pGCPLImp.h +++ b/java/src/jni/h5pGCPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pImp.c b/java/src/jni/h5pImp.c index 6c17984ae24..fa6b97982d6 100644 --- a/java/src/jni/h5pImp.c +++ b/java/src/jni/h5pImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pImp.h b/java/src/jni/h5pImp.h index 189e9d7b892..8872ebff670 100644 --- a/java/src/jni/h5pImp.h +++ b/java/src/jni/h5pImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pLAPLImp.c b/java/src/jni/h5pLAPLImp.c index 36813e33fc9..6db4ef5b59f 100644 --- a/java/src/jni/h5pLAPLImp.c +++ b/java/src/jni/h5pLAPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pLAPLImp.h b/java/src/jni/h5pLAPLImp.h index 8ddc8d26449..7337a72c1f2 100644 --- a/java/src/jni/h5pLAPLImp.h +++ b/java/src/jni/h5pLAPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pLCPLImp.c b/java/src/jni/h5pLCPLImp.c index e27a9eb1570..e14a846b806 100644 --- a/java/src/jni/h5pLCPLImp.c +++ b/java/src/jni/h5pLCPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pLCPLImp.h b/java/src/jni/h5pLCPLImp.h index 4cdf6cd6c6f..5bcabd1eba6 100644 --- a/java/src/jni/h5pLCPLImp.h +++ b/java/src/jni/h5pLCPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pOCPLImp.c b/java/src/jni/h5pOCPLImp.c index a743cbaa7f4..551856b2bc5 100644 --- a/java/src/jni/h5pOCPLImp.c +++ b/java/src/jni/h5pOCPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pOCPLImp.h b/java/src/jni/h5pOCPLImp.h index 94d397bab5b..66744910850 100644 --- a/java/src/jni/h5pOCPLImp.h +++ b/java/src/jni/h5pOCPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pOCpyPLImp.c b/java/src/jni/h5pOCpyPLImp.c index a78aaa259f0..439a214f248 100644 --- a/java/src/jni/h5pOCpyPLImp.c +++ b/java/src/jni/h5pOCpyPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pOCpyPLImp.h b/java/src/jni/h5pOCpyPLImp.h index 50ee972990c..c94afde832c 100644 --- a/java/src/jni/h5pOCpyPLImp.h +++ b/java/src/jni/h5pOCpyPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pStrCPLImp.c b/java/src/jni/h5pStrCPLImp.c index 3382f0aea30..430ec40e21c 100644 --- a/java/src/jni/h5pStrCPLImp.c +++ b/java/src/jni/h5pStrCPLImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5pStrCPLImp.h b/java/src/jni/h5pStrCPLImp.h index c0a7ec25351..ef967b0273b 100644 --- a/java/src/jni/h5pStrCPLImp.h +++ b/java/src/jni/h5pStrCPLImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5plImp.c b/java/src/jni/h5plImp.c index 9632e9e2609..7e739f872f2 100644 --- a/java/src/jni/h5plImp.c +++ b/java/src/jni/h5plImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5plImp.h b/java/src/jni/h5plImp.h index 410a34fca15..61c4d4e7607 100644 --- a/java/src/jni/h5plImp.h +++ b/java/src/jni/h5plImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5rImp.c b/java/src/jni/h5rImp.c index 4ccad5457a2..becae03cec4 100644 --- a/java/src/jni/h5rImp.c +++ b/java/src/jni/h5rImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5rImp.h b/java/src/jni/h5rImp.h index 5865495b87e..ec54f7077b0 100644 --- a/java/src/jni/h5rImp.h +++ b/java/src/jni/h5rImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5sImp.c b/java/src/jni/h5sImp.c index 738db67ffee..d1954b4f063 100644 --- a/java/src/jni/h5sImp.c +++ b/java/src/jni/h5sImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5sImp.h b/java/src/jni/h5sImp.h index a758d5af434..7ce5a285cf1 100644 --- a/java/src/jni/h5sImp.h +++ b/java/src/jni/h5sImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5tImp.c b/java/src/jni/h5tImp.c index 316455715ac..039db7b9053 100644 --- a/java/src/jni/h5tImp.c +++ b/java/src/jni/h5tImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1641,6 +1641,25 @@ Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2(JNIEnv *env, jclass clss, jlong type_id return (jint)ndims; } /* end Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2 */ +/* + * Class: hdf_hdf5lib_H5 + * Method: _H5Tcomplex_create + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL +Java_hdf_hdf5lib_H5__1H5Tcomplex_1create(JNIEnv *env, jclass clss, jlong base_id) +{ + hid_t retVal = H5I_INVALID_HID; + + UNUSED(clss); + + if ((retVal = H5Tcomplex_create((hid_t)base_id)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + +done: + return (jlong)retVal; +} /* end Java_hdf_hdf5lib_H5__1H5Tcomplex_1create */ + /* * Class: hdf_hdf5lib_H5 * Method: H5Tconvert diff --git a/java/src/jni/h5tImp.h b/java/src/jni/h5tImp.h index e671456a9a6..dc3f6f939f5 100644 --- a/java/src/jni/h5tImp.h +++ b/java/src/jni/h5tImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -479,6 +479,13 @@ JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tarray_1create2(JNIEnv *, jclass */ JNIEXPORT jint JNICALL Java_hdf_hdf5lib_H5_H5Tget_1array_1dims2(JNIEnv *, jclass, jlong, jlongArray); +/* + * Class: hdf_hdf5lib_H5 + * Method: _H5Tcomplex_create + * Signature: (J)J + */ +JNIEXPORT jlong JNICALL Java_hdf_hdf5lib_H5__1H5Tcomplex_1create(JNIEnv *, jclass, jlong); + /* * Class: hdf_hdf5lib_H5 * Method: H5Tconvert diff --git a/java/src/jni/h5util.c b/java/src/jni/h5util.c index fb619aa619d..cc08e33ab70 100644 --- a/java/src/jni/h5util.c +++ b/java/src/jni/h5util.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -614,6 +614,43 @@ h5str_convert(JNIEnv *env, char **in_str, hid_t container, hid_t tid, void *out_ break; } + case H5T_COMPLEX: { + size_t baseTypeSize; + + if ((mtid = H5Tget_super(tid)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + + if (!(baseTypeSize = H5Tget_size(mtid))) + H5_LIBRARY_ERROR(ENVONLY); + + if (NULL == (cptr = calloc(1, typeSize))) + H5_OUT_OF_MEMORY_ERROR(ENVONLY, "h5str_convert: failed to allocate array buffer"); + + /* Convert real part */ + if (!(h5str_convert(ENVONLY, &this_str, container, mtid, out_buf, 0))) { + CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); + goto done; + } + + /* Skip any whitespace */ + while (*this_str == ' ') + this_str++; + + /* Convert imaginary part */ + if (!(h5str_convert(ENVONLY, &this_str, container, mtid, out_buf, baseTypeSize))) { + CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); + goto done; + } + + if (H5Tclose(mtid) < 0) + H5_LIBRARY_ERROR(ENVONLY); + mtid = H5I_INVALID_HID; + + retVal = typeSize; + + break; + } + case H5T_NCLASSES: case H5T_NO_CLASS: { H5_BAD_ARGUMENT_ERROR(ENVONLY, "h5str_convert: invalid datatype class"); @@ -1476,6 +1513,48 @@ h5str_sprintf(JNIEnv *env, h5str_t *out_str, hid_t container, hid_t tid, void *i break; } + case H5T_COMPLEX: { + h5str_t real_part, imag_part; + size_t baseSize; + + h5str_new(&real_part, 128); + h5str_new(&imag_part, 128); + + /* Get the base datatype for the complex number type */ + if ((mtid = H5Tget_super(tid)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + + if (!(baseSize = H5Tget_size(mtid))) + H5_LIBRARY_ERROR(ENVONLY); + + if (!h5str_sprintf(ENVONLY, &real_part, container, mtid, cptr, expand_data)) + CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); + if (!h5str_sprintf(ENVONLY, &imag_part, container, mtid, cptr + baseSize, expand_data)) + CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); + + if (!h5str_append(out_str, real_part.s)) + H5_ASSERTION_ERROR(ENVONLY, "Unable to append string."); + + if (NULL == strstr(imag_part.s, "-")) + if (!h5str_append(out_str, "+")) + H5_ASSERTION_ERROR(ENVONLY, "Unable to append string."); + + if (!h5str_append(out_str, imag_part.s)) + H5_ASSERTION_ERROR(ENVONLY, "Unable to append string."); + + if (!h5str_append(out_str, "i")) + H5_ASSERTION_ERROR(ENVONLY, "Unable to append string."); + + if (H5Tclose(mtid) < 0) + H5_LIBRARY_ERROR(ENVONLY); + mtid = H5I_INVALID_HID; + + h5str_free(&real_part); + h5str_free(&imag_part); + + break; + } + case H5T_NO_CLASS: case H5T_NCLASSES: { H5_BAD_ARGUMENT_ERROR(ENVONLY, "h5str_sprintf: invalid datatype class"); @@ -2110,6 +2189,17 @@ h5str_get_little_endian_type(hid_t tid) break; } + case H5T_COMPLEX: { + if (size == 4) + p_type = H5Tcopy(H5T_COMPLEX_IEEE_F16LE); + else if (size == 8) + p_type = H5Tcopy(H5T_COMPLEX_IEEE_F32LE); + else if (size == 16) + p_type = H5Tcopy(H5T_COMPLEX_IEEE_F64LE); + + break; + } + case H5T_NO_CLASS: case H5T_NCLASSES: { goto done; @@ -2206,6 +2296,17 @@ h5str_get_big_endian_type(hid_t tid) break; } + case H5T_COMPLEX: { + if (size == 4) + p_type = H5Tcopy(H5T_COMPLEX_IEEE_F16BE); + else if (size == 8) + p_type = H5Tcopy(H5T_COMPLEX_IEEE_F32BE); + else if (size == 16) + p_type = H5Tcopy(H5T_COMPLEX_IEEE_F64BE); + + break; + } + case H5T_NO_CLASS: case H5T_NCLASSES: { goto done; @@ -2462,6 +2563,32 @@ h5str_render_bin_output(FILE *stream, hid_t container, hid_t tid, void *_mem, hs break; } + case H5T_COMPLEX: { + hid_t memb = H5I_INVALID_HID; + + if ((memb = H5Tget_super(tid)) < 0) { + ret_value = FAIL; + goto done; + } + + for (block_index = 0; block_index < block_nelmts; block_index++) { + mem = ((unsigned char *)_mem) + block_index * size; + + /* dump the complex number element */ + if (h5str_render_bin_output(stream, container, memb, mem, 2) < 0) { + ret_value = FAIL; + break; + } + } + + if (H5Tclose(memb) < 0) { + ret_value = FAIL; + goto done; + } + + break; + } + case H5T_NO_CLASS: case H5T_NCLASSES: { ret_value = FAIL; @@ -4306,6 +4433,39 @@ translate_atomic_rbuf(JNIEnv *env, jlong mem_type_id, H5T_class_t type_class, vo break; } /* H5T_STRING */ + case H5T_COMPLEX: { + H5T_class_t base_class; + size_t base_size, typeCount; + void *objBuf = NULL; + + if (!(typeSize = H5Tget_size(mem_type_id))) + H5_LIBRARY_ERROR(ENVONLY); + if ((memb = H5Tget_super(mem_type_id)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + if (!(base_size = H5Tget_size(memb))) + H5_LIBRARY_ERROR(ENVONLY); + if ((base_class = H5Tget_class(memb)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + + typeCount = typeSize / base_size; + + if (NULL == (objBuf = malloc(typeSize))) + H5_OUT_OF_MEMORY_ERROR(ENVONLY, "translate_atomic_rbuf: failed to allocate buffer"); + + memcpy((char *)objBuf, char_buf, typeSize); + + /* The list we're going to return */ + if (NULL == (jList = (jobjectArray)ENVPTR->NewObject(ENVONLY, arrCList, arrListMethod, 0))) + H5_OUT_OF_MEMORY_ERROR(ENVONLY, "translate_atomic_rbuf: failed to allocate list read buffer"); + + translate_rbuf(ENVONLY, jList, memb, base_class, (jsize)typeCount, objBuf); + jobj = jList; + + if (objBuf) + free(objBuf); + + break; + } case H5T_TIME: case H5T_NO_CLASS: case H5T_NCLASSES: @@ -4530,6 +4690,41 @@ translate_atomic_wbuf(JNIEnv *env, jobject in_obj, jlong mem_type_id, H5T_class_ } break; } /* H5T_STRING */ + case H5T_COMPLEX: { + H5T_class_t base_class; + size_t base_size; + void *objBuf = NULL; + + if (!(typeSize = H5Tget_size(mem_type_id))) + H5_LIBRARY_ERROR(ENVONLY); + if ((memb = H5Tget_super(mem_type_id)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + if (!(base_size = H5Tget_size(memb))) + H5_LIBRARY_ERROR(ENVONLY); + if ((base_class = H5Tget_class(memb)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + + /* Convert each array element - invoke the toArray method */ + if (mToArray == NULL) + CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); + jobjectArray array = (jobjectArray)ENVPTR->CallObjectMethod(ENVONLY, in_obj, mToArray); + jsize jnelmts = ENVPTR->GetArrayLength(ENVONLY, array); + + if (jnelmts < 0) + H5_BAD_ARGUMENT_ERROR(ENVONLY, "translate_atomic_wbuf: number of array elements < 0"); + + if (NULL == (objBuf = malloc((size_t)jnelmts * base_size))) + H5_OUT_OF_MEMORY_ERROR(ENVONLY, "translate_atomic_wbuf: failed to allocate buffer"); + + translate_wbuf(ENVONLY, array, memb, base_class, (jsize)jnelmts, objBuf); + + memcpy(char_buf, (char *)objBuf, base_size * (size_t)jnelmts); + + if (objBuf) + free(objBuf); + + break; + } case H5T_TIME: case H5T_NO_CLASS: case H5T_NCLASSES: @@ -4752,6 +4947,60 @@ translate_rbuf(JNIEnv *env, jobjectArray ret_buf, jlong mem_type_id, H5T_class_t } break; } + case H5T_COMPLEX: { + H5T_class_t base_class; + size_t base_size, typeCount; + void *objBuf = NULL; + + if (!(typeSize = H5Tget_size(mem_type_id))) + H5_LIBRARY_ERROR(ENVONLY); + if ((memb = H5Tget_super(mem_type_id)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + if (!(base_size = H5Tget_size(memb))) + H5_LIBRARY_ERROR(ENVONLY); + if ((base_class = H5Tget_class(memb)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + + typeCount = typeSize / base_size; + + if (NULL == (objBuf = malloc(typeSize))) + H5_OUT_OF_MEMORY_ERROR(ENVONLY, "translate_atomic_rbuf: failed to allocate buffer"); + + /* Convert each element to a list of 2 floating-point elements */ + for (i = 0; i < (size_t)count; i++) { + found_jList = JNI_TRUE; + jList = NULL; + + /* Get the object element */ + memcpy((char *)objBuf, char_buf + i * typeSize, typeSize); + + /* The list we're going to return: */ + if (i < (size_t)ret_buflen) { + if (NULL == + (jList = ENVPTR->GetObjectArrayElement(ENVONLY, (jobjectArray)ret_buf, (jsize)i))) + found_jList = JNI_FALSE; + } + if (NULL == jList) { + if (NULL == + (jList = (jobjectArray)ENVPTR->NewObject(ENVONLY, arrCList, arrListMethod, 0))) + H5_OUT_OF_MEMORY_ERROR(ENVONLY, + "translate_rbuf: failed to allocate list read buffer"); + } + + translate_rbuf(ENVONLY, jList, memb, base_class, (jsize)typeCount, objBuf); + if (found_jList == JNI_FALSE) + ENVPTR->CallBooleanMethod(ENVONLY, ret_buf, arrAddMethod, jList); + else + ENVPTR->SetObjectArrayElement(ENVONLY, ret_buf, (jsize)i, jList); + CHECK_JNI_EXCEPTION(ENVONLY, JNI_TRUE); + ENVPTR->DeleteLocalRef(ENVONLY, jList); + } + + if (objBuf) + free(objBuf); + + break; + } case H5T_TIME: case H5T_NO_CLASS: case H5T_NCLASSES: @@ -4914,6 +5163,39 @@ translate_wbuf(JNIEnv *env, jobjectArray in_buf, jlong mem_type_id, H5T_class_t } break; } + case H5T_COMPLEX: { + H5T_class_t base_class; + size_t base_size; + + if ((memb = H5Tget_super(mem_type_id)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + if (!(base_size = H5Tget_size(memb))) + H5_LIBRARY_ERROR(ENVONLY); + if ((base_class = H5Tget_class(memb)) < 0) + H5_LIBRARY_ERROR(ENVONLY); + + /* Convert each list to an array element */ + for (i = 0; i < (size_t)count; i++) { + if (NULL == (jList = ENVPTR->GetObjectArrayElement(ENVONLY, (jobjectArray)in_buf, (jsize)i))) + CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); + + /* invoke the toArray method */ + if (mToArray == NULL) + CHECK_JNI_EXCEPTION(ENVONLY, JNI_FALSE); + jobjectArray array = (jobjectArray)ENVPTR->CallObjectMethod(ENVONLY, jList, mToArray); + jsize jnelmts = ENVPTR->GetArrayLength(ENVONLY, array); + + if (jnelmts < 0) + H5_BAD_ARGUMENT_ERROR(ENVONLY, "translate_wbuf: number of array elements < 0"); + + translate_wbuf(ENVONLY, array, memb, base_class, jnelmts, + char_buf + i * base_size * (size_t)jnelmts); + + ENVPTR->DeleteLocalRef(ENVONLY, jList); + } /* end for (i = 0; i < count; i++) */ + + break; + } case H5T_TIME: case H5T_NO_CLASS: case H5T_NCLASSES: diff --git a/java/src/jni/h5util.h b/java/src/jni/h5util.h index 011aaec428f..9a1359540e3 100644 --- a/java/src/jni/h5util.h +++ b/java/src/jni/h5util.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5vlImp.c b/java/src/jni/h5vlImp.c index b2fc6a1aebf..f395ddcbfc8 100644 --- a/java/src/jni/h5vlImp.c +++ b/java/src/jni/h5vlImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5vlImp.h b/java/src/jni/h5vlImp.h index d3248f53d13..fbb1d21adce 100644 --- a/java/src/jni/h5vlImp.h +++ b/java/src/jni/h5vlImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5zImp.c b/java/src/jni/h5zImp.c index 9c387fa33ee..bb39ec34403 100644 --- a/java/src/jni/h5zImp.c +++ b/java/src/jni/h5zImp.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/h5zImp.h b/java/src/jni/h5zImp.h index 3092ae678ad..014c4e71b26 100644 --- a/java/src/jni/h5zImp.h +++ b/java/src/jni/h5zImp.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/nativeData.c b/java/src/jni/nativeData.c index d014b64579d..d7ae6e77c60 100644 --- a/java/src/jni/nativeData.c +++ b/java/src/jni/nativeData.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/src/jni/nativeData.h b/java/src/jni/nativeData.h index 9bf313fc300..e345e6ab29f 100644 --- a/java/src/jni/nativeData.h +++ b/java/src/jni/nativeData.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/Makefile.am b/java/test/Makefile.am index 7f6ab0169a8..91934285586 100644 --- a/java/test/Makefile.am +++ b/java/test/Makefile.am @@ -4,7 +4,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/java/test/TestAll.java b/java/test/TestAll.java index 5f3b14c3e01..b74e286a386 100644 --- a/java/test/TestAll.java +++ b/java/test/TestAll.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5.java b/java/test/TestH5.java index bfe2cc59540..eed2f0efe5d 100644 --- a/java/test/TestH5.java +++ b/java/test/TestH5.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -313,7 +313,7 @@ public void testH5set_free_list_limits() @Test public void testH5get_libversion() { - int libversion[] = {1, 17, 0}; + int libversion[] = {2, 0, 0}; try { H5.H5get_libversion(libversion); @@ -322,11 +322,8 @@ public void testH5get_libversion() fail("H5.H5get_libversion: " + err); } - for (int i = 0; i < 2; i++) + for (int i = 0; i < 3; i++) assertEquals(H5.LIB_VERSION[i], libversion[i]); - - for (int i = 0; i < 2; i++) - assertFalse(libversion[i] == 0); } /** @@ -354,7 +351,7 @@ public void testH5get_libversion_null_param() @Test public void testH5check_version() { - int majnum = 1, minnum = 17, relnum = 0; + int majnum = 2, minnum = 0, relnum = 0; try { H5.H5check_version(majnum, minnum, relnum); diff --git a/java/test/TestH5A.java b/java/test/TestH5A.java index 90fe24cda71..75ed41f43b9 100644 --- a/java/test/TestH5A.java +++ b/java/test/TestH5A.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Arw.java b/java/test/TestH5Arw.java index 205f3b0e3a4..4e1cdd67e59 100644 --- a/java/test/TestH5Arw.java +++ b/java/test/TestH5Arw.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5D.java b/java/test/TestH5D.java index db2a0428db7..794c7c39f72 100644 --- a/java/test/TestH5D.java +++ b/java/test/TestH5D.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Dparams.java b/java/test/TestH5Dparams.java index e42e10b74c1..1b5277d5135 100644 --- a/java/test/TestH5Dparams.java +++ b/java/test/TestH5Dparams.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Dplist.java b/java/test/TestH5Dplist.java index c3e4d69427e..5c9e0a57a72 100644 --- a/java/test/TestH5Dplist.java +++ b/java/test/TestH5Dplist.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Drw.java b/java/test/TestH5Drw.java index a5caabd72be..13514433234 100644 --- a/java/test/TestH5Drw.java +++ b/java/test/TestH5Drw.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5E.java b/java/test/TestH5E.java index bdd68028880..e919c5e6168 100644 --- a/java/test/TestH5E.java +++ b/java/test/TestH5E.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Edefault.java b/java/test/TestH5Edefault.java index c412cf2bfd2..2340186f35f 100644 --- a/java/test/TestH5Edefault.java +++ b/java/test/TestH5Edefault.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Eparams.java b/java/test/TestH5Eparams.java index 4300ae6041b..9551bd8c8ab 100644 --- a/java/test/TestH5Eparams.java +++ b/java/test/TestH5Eparams.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Eregister.java b/java/test/TestH5Eregister.java index b4c63e08627..225060f95b1 100644 --- a/java/test/TestH5Eregister.java +++ b/java/test/TestH5Eregister.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5F.java b/java/test/TestH5F.java index 5ae8f7e0c0e..8e21cbc8400 100644 --- a/java/test/TestH5F.java +++ b/java/test/TestH5F.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Fbasic.java b/java/test/TestH5Fbasic.java index 37be9431704..7c70f5eaf58 100644 --- a/java/test/TestH5Fbasic.java +++ b/java/test/TestH5Fbasic.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Fparams.java b/java/test/TestH5Fparams.java index 3fcfe3bf57c..3929505f9fe 100644 --- a/java/test/TestH5Fparams.java +++ b/java/test/TestH5Fparams.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Fswmr.java b/java/test/TestH5Fswmr.java index 823640d6eda..9953d589d79 100644 --- a/java/test/TestH5Fswmr.java +++ b/java/test/TestH5Fswmr.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5G.java b/java/test/TestH5G.java index 65fadde95c3..b37b222f662 100644 --- a/java/test/TestH5G.java +++ b/java/test/TestH5G.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Gbasic.java b/java/test/TestH5Gbasic.java index 8ec04dd7044..95e2f770258 100644 --- a/java/test/TestH5Gbasic.java +++ b/java/test/TestH5Gbasic.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Giterate.java b/java/test/TestH5Giterate.java index eb4b5bf4edd..172d76c0ade 100644 --- a/java/test/TestH5Giterate.java +++ b/java/test/TestH5Giterate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Lbasic.java b/java/test/TestH5Lbasic.java index c81545bade7..1c66c794c58 100644 --- a/java/test/TestH5Lbasic.java +++ b/java/test/TestH5Lbasic.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Lcreate.java b/java/test/TestH5Lcreate.java index 822323e0f8e..7f390865622 100644 --- a/java/test/TestH5Lcreate.java +++ b/java/test/TestH5Lcreate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Lparams.java b/java/test/TestH5Lparams.java index 78de663d73f..6c30b963724 100644 --- a/java/test/TestH5Lparams.java +++ b/java/test/TestH5Lparams.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Obasic.java b/java/test/TestH5Obasic.java index cac2e6aa0fc..ec6be419a95 100644 --- a/java/test/TestH5Obasic.java +++ b/java/test/TestH5Obasic.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Ocopy.java b/java/test/TestH5Ocopy.java index 18cb71aeb44..5ffb2284358 100644 --- a/java/test/TestH5Ocopy.java +++ b/java/test/TestH5Ocopy.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5OcopyOld.java b/java/test/TestH5OcopyOld.java index 0fa57e650f2..3f6ef7e9071 100644 --- a/java/test/TestH5OcopyOld.java +++ b/java/test/TestH5OcopyOld.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Ocreate.java b/java/test/TestH5Ocreate.java index eb57938d299..1363f07011c 100644 --- a/java/test/TestH5Ocreate.java +++ b/java/test/TestH5Ocreate.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Oparams.java b/java/test/TestH5Oparams.java index 296babceb68..3de1656b64e 100644 --- a/java/test/TestH5Oparams.java +++ b/java/test/TestH5Oparams.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5P.java b/java/test/TestH5P.java index 0571e3fe93d..7dc4cb70595 100644 --- a/java/test/TestH5P.java +++ b/java/test/TestH5P.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5PData.java b/java/test/TestH5PData.java index da45715fc3d..4edf29194bc 100644 --- a/java/test/TestH5PData.java +++ b/java/test/TestH5PData.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5PL.java b/java/test/TestH5PL.java index f6440cdb308..4b0adb0fe4e 100644 --- a/java/test/TestH5PL.java +++ b/java/test/TestH5PL.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Pfapl.java b/java/test/TestH5Pfapl.java index e5c04ee1b20..132318581e4 100644 --- a/java/test/TestH5Pfapl.java +++ b/java/test/TestH5Pfapl.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Pfaplhdfs.java b/java/test/TestH5Pfaplhdfs.java index e99967b4569..cbd5700efc2 100644 --- a/java/test/TestH5Pfaplhdfs.java +++ b/java/test/TestH5Pfaplhdfs.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Pfapls3.java b/java/test/TestH5Pfapls3.java index 06baef2ba1c..5ac4bc38cad 100644 --- a/java/test/TestH5Pfapls3.java +++ b/java/test/TestH5Pfapls3.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Plist.java b/java/test/TestH5Plist.java index c2a9862eb8e..1de4506fb5d 100644 --- a/java/test/TestH5Plist.java +++ b/java/test/TestH5Plist.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Pvirtual.java b/java/test/TestH5Pvirtual.java index b743f09fc15..852a51c0f5c 100644 --- a/java/test/TestH5Pvirtual.java +++ b/java/test/TestH5Pvirtual.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5R.java b/java/test/TestH5R.java index 1dcf992ce11..87ec715dd8a 100644 --- a/java/test/TestH5R.java +++ b/java/test/TestH5R.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Rref.java b/java/test/TestH5Rref.java index 520de74a010..b13e46ab9b7 100644 --- a/java/test/TestH5Rref.java +++ b/java/test/TestH5Rref.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5S.java b/java/test/TestH5S.java index 6e081a6c9a1..c5d065998ea 100644 --- a/java/test/TestH5S.java +++ b/java/test/TestH5S.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Sbasic.java b/java/test/TestH5Sbasic.java index 3b92c9249b0..7224f032cab 100644 --- a/java/test/TestH5Sbasic.java +++ b/java/test/TestH5Sbasic.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5T.java b/java/test/TestH5T.java index 0121cc24297..d57ff354119 100644 --- a/java/test/TestH5T.java +++ b/java/test/TestH5T.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -240,6 +240,60 @@ public void testH5Tget_array_dims() } } + @Test + public void testH5Tcomplex_create() + { + String class_name; + long[] fields1 = {0, 0, 0, 0, 0}; + long[] fields2 = {0, 0, 0, 0, 0}; + long filetype_id = HDF5Constants.H5I_INVALID_HID; + long dt_size = -1; + int typeclass = -1; + int typeorder = HDF5Constants.H5T_ORDER_ERROR; + int prec1 = 0; + int prec2 = 0; + + try { + filetype_id = H5.H5Tcomplex_create(HDF5Constants.H5T_IEEE_F32LE); + assertTrue("testH5Tcomplex_create:H5Tcomplex_create", filetype_id >= 0); + + typeclass = H5.H5Tget_class(filetype_id); + assertTrue("H5.H5Tget_class", typeclass > 0); + class_name = H5.H5Tget_class_name(typeclass); + assertTrue("H5.H5Tget_class_name", class_name.compareTo("H5T_COMPLEX") == 0); + + dt_size = H5.H5Tget_size(filetype_id); + assertTrue("H5.H5Tget_size", dt_size == 8); + + typeorder = H5.H5Tget_order(filetype_id); + assertTrue("H5.H5Tget_order", typeorder == HDF5Constants.H5T_ORDER_LE); + + prec1 = H5.H5Tget_precision(HDF5Constants.H5T_IEEE_F32LE); + prec2 = H5.H5Tget_precision(filetype_id); + assertTrue("H5.H5Tget_precision", prec1 == prec2); + + H5.H5Tget_fields(HDF5Constants.H5T_IEEE_F32LE, fields1); + H5.H5Tget_fields(filetype_id, fields2); + assertTrue("H5.H5Tget_fields[spos]", fields1[0] == fields2[0]); + assertTrue("H5.H5Tget_fields[epos]", fields1[1] == fields2[1]); + assertTrue("H5.H5Tget_fields[esize]", fields1[2] == fields2[2]); + assertTrue("H5.H5Tget_fields[mpos]", fields1[3] == fields2[3]); + assertTrue("H5.H5Tget_fields[msize]", fields1[4] == fields2[4]); + } + catch (Throwable err) { + err.printStackTrace(); + fail("testH5Tcomplex_create " + err); + } + finally { + if (filetype_id >= 0) + try { + H5.H5Tclose(filetype_id); + } + catch (Exception ex) { + } + } + } + @Test public void testH5Tenum_functions() { diff --git a/java/test/TestH5Tbasic.java b/java/test/TestH5Tbasic.java index 8fb1e583616..8b583c2fa03 100644 --- a/java/test/TestH5Tbasic.java +++ b/java/test/TestH5Tbasic.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Tparams.java b/java/test/TestH5Tparams.java index a1710af1c95..38bd1f68038 100644 --- a/java/test/TestH5Tparams.java +++ b/java/test/TestH5Tparams.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5VL.java b/java/test/TestH5VL.java index 666219114fe..30cb96beabc 100644 --- a/java/test/TestH5VL.java +++ b/java/test/TestH5VL.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/TestH5Z.java b/java/test/TestH5Z.java index bc6bfc0bc31..1ef7cfc1870 100644 --- a/java/test/TestH5Z.java +++ b/java/test/TestH5Z.java @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/java/test/junit.sh.in b/java/test/junit.sh.in index edae8d0848c..3f642bbc9ab 100644 --- a/java/test/junit.sh.in +++ b/java/test/junit.sh.in @@ -5,7 +5,7 @@ # # This file is part of HDF5. The full HDF5 copyright notice, including # terms governing use, modification, and redistribution, is contained in -# the COPYING file, which can be found at the root of the source code +# the LICENSE file, which can be found at the root of the source code # distribution tree, or in https://www.hdfgroup.org/licenses. # If you do not have access to either file, you may request a copy from # help@hdfgroup.org. diff --git a/java/test/testfiles/JUnit-TestH5T.txt b/java/test/testfiles/JUnit-TestH5T.txt index 06e7a9cbb5b..039e8286f31 100644 --- a/java/test/testfiles/JUnit-TestH5T.txt +++ b/java/test/testfiles/JUnit-TestH5T.txt @@ -11,9 +11,10 @@ JUnit version 4.13.2 .testH5Tcompound_functions .testH5Tget_size .testH5Tarray_create +.testH5Tcomplex_create .testH5Topaque_functions Time: XXXX -OK (13 tests) +OK (14 tests) diff --git a/m4/aclocal_fc.f90 b/m4/aclocal_fc.f90 index 918fc6769dd..10949d2ea37 100644 --- a/m4/aclocal_fc.f90 +++ b/m4/aclocal_fc.f90 @@ -5,7 +5,7 @@ ! * ! This file is part of HDF5. The full HDF5 copyright notice, including * ! terms governing use, modification, and redistribution, is contained in * -! the COPYING file, which can be found at the root of the source code * +! the LICENSE file, which can be found at the root of the source code * ! distribution tree, or in https://www.hdfgroup.org/licenses. * ! If you do not have access to either file, you may request a copy from * ! help@hdfgroup.org. * diff --git a/m4/aclocal_fc.m4 b/m4/aclocal_fc.m4 index 610ee300611..344788e5c6b 100644 --- a/m4/aclocal_fc.m4 +++ b/m4/aclocal_fc.m4 @@ -6,7 +6,7 @@ dnl All rights reserved. dnl dnl This file is part of HDF5. The full HDF5 copyright notice, including dnl terms governing use, modification, and redistribution, is contained in -dnl the COPYING file, which can be found at the root of the source code +dnl the LICENSE file, which can be found at the root of the source code dnl distribution tree, or in https://www.hdfgroup.org/licenses. dnl If you do not have access to either file, you may request a copy from dnl help@hdfgroup.org diff --git a/release_docs/HISTORY-1_14_0-1_16_0.txt b/release_docs/HISTORY-1_14_0-2_0_0.txt similarity index 99% rename from release_docs/HISTORY-1_14_0-1_16_0.txt rename to release_docs/HISTORY-1_14_0-2_0_0.txt index 815dbfa8fe3..058788a4ea4 100644 --- a/release_docs/HISTORY-1_14_0-1_16_0.txt +++ b/release_docs/HISTORY-1_14_0-2_0_0.txt @@ -2529,7 +2529,7 @@ Bug Fixes since HDF5-1.14.2 release - Changed the default settings used by CMake for the GZIP filter - The default for the option HDF5_ENABLE_Z_LIB_SUPPORT was OFF. Now the default is ON. + The default for the option HDF5_ENABLE_ZLIB_SUPPORT was OFF. Now the default is ON. This was done to match the defaults used by the autotools configure.ac. In addition, the CMake message level for not finding a suitable filter library was changed from FATAL_ERROR (which would halt the build process) to WARNING (which diff --git a/release_docs/INSTALL_Autotools.txt b/release_docs/INSTALL_Autotools.txt index 325090aadd4..07c3b7f0182 100644 --- a/release_docs/INSTALL_Autotools.txt +++ b/release_docs/INSTALL_Autotools.txt @@ -27,10 +27,10 @@ Obtaining HDF5 source code 2. Obtain HDF5 source from Github development branch: https://github.com/HDFGroup/hdf5 last release: https://github.com/HDFGroup/hdf5/releases/latest - hdf5-1_17_"X".tar.gz or hdf5-1_17_"X".zip + hdf5-2_"X"_"Y".tar.gz or hdf5-2_"X"_"Y".zip and put it in "myhdfstuff". - Uncompress the file. There should be a hdf5-1.17."X" folder. + Uncompress the file. There should be a hdf5-2."X"."Y" folder. ======================================================================== @@ -47,16 +47,16 @@ Before You Start: 2. Optional: Install the Szip version 2.1 library (you may use Szip 2.0 binaries). - 3. Extract the source from the hdf5-X.Y.Z.tar file and change - directory to hdf5-X.Y.Z. + 3. Extract the source from the hdf5-2.X.Y.tar file and change + directory to hdf5-2.X.Y. 4. Quick installation For those who don't like to read ;-) the following steps can be used to configure, build, test, and install the HDF5 library, header files, - and support programs. For example, to install HDF5 version X.Y.Z at + and support programs. For example, to install HDF5 version 2.X.Y at location /usr/local/hdf5, use the following steps. - $ cd hdf5-X.Y.Z + $ cd hdf5-2.X.Y $ ./configure --prefix=/usr/local/hdf5 $ make $ make check # run test suite. @@ -81,23 +81,23 @@ III. Full installation instructions for source distributions 1. Unpacking the distribution The HDF5 source code is distributed in a variety of formats which can be unpacked with the following commands, each of which creates an - 'hdf5-X.Y.Z' directory, where X.Y.Z is the HDF5 version numbers. + 'hdf5-2.X.Y' directory, where 2.X.Y is the HDF5 version numbers. 1.1. Non-compressed tar archive (*.tar) - $ tar xf hdf5-X.Y.Z.tar + $ tar xf hdf5-2.X.Y.tar 1.2. Gzip'd tar archive (*.tar.gz) - $ gunzip < hdf5-X.Y.Z.tar.gz | tar xf - + $ gunzip < hdf5-2.X.Y.tar.gz | tar xf - Or - $ tar zxf hdf5-X.Y.Z.tar.gz + $ tar zxf hdf5-2.X.Y.tar.gz 1.3. Bzip'd tar archive (*.tar.bz2) - $ bunzip2 < hdf5-X.Y.Z.tar.bz2 | tar xf - + $ bunzip2 < hdf5-2.X.Y.tar.bz2 | tar xf - Or - $ tar jxf hdf5-X.Y.Z.tar.bz2 + $ tar jxf hdf5-2.X.Y.tar.bz2 2. Source versus build directories On most systems the build can occur in a directory other than the @@ -108,7 +108,7 @@ III. Full installation instructions for source distributions details are below). For example, $ mkdir built-fortran $ cd build-fortran - $ ../hdf5-X.Y.Z/configure --enable-fortran ... + $ ../hdf5-2.X.Y/configure --enable-fortran ... 3. Configuring @@ -345,10 +345,8 @@ III. Full installation instructions for source distributions 3.11. Backward compatibility - The 1.17 version of the HDF5 library can be configured to operate - identically to the v1.16 library with the - --with-default-api-version=v116 - configure flag, or identically to the v1.14 library with the + The 2.0.0 version of the HDF5 library can be configured to operate + identically to the v1.14 library with the --with-default-api-version=v114 configure flag, or identically to the v1.12 library with the --with-default-api-version=v112 @@ -359,7 +357,7 @@ III. Full installation instructions for source distributions configure flag, or identically to the v1.6 library with the --with-default-api-version=v16 configure flag. This allows existing code to be compiled with the - v1.17 library without requiring immediate changes to the application + v2.0 library without requiring immediate changes to the application source code. For additional configuration options and other details, see "API Compatibility Macros": @@ -484,8 +482,6 @@ III. Full installation instructions for source distributions ./tools/misc/h5debug (low-level file debugging) ./tools/h5import/h5import (imports data to HDF5 file) ./tools/h5diff/h5diff (compares two HDF5 files) - ./tools/gifconv/h52gif (HDF5 to GIF converter) - ./tools/gifconv/gif2h5 (GIF to HDF5 converter) ======================================================================== diff --git a/release_docs/INSTALL_CMake.txt b/release_docs/INSTALL_CMake.txt index 6db1b29cc6f..28b7195695b 100644 --- a/release_docs/INSTALL_CMake.txt +++ b/release_docs/INSTALL_CMake.txt @@ -29,15 +29,15 @@ Obtaining HDF5 source code 2. Obtain HDF5 source from Github development branch: https://github.com/HDFGroup/hdf5 last release: https://github.com/HDFGroup/hdf5/releases/latest - hdf5-1_15_"X".tar.gz or hdf5-1_15_"X".zip + hdf5-2_"X"_"Y".tar.gz or hdf5-2_"X"_"Y".zip and put it in "myhdfstuff". - Uncompress the file. There should be a hdf5-1.17."X" folder. + Uncompress the file. There should be a hdf5-2."X"."Y" folder. CMake version 1. We suggest you obtain the latest CMake from the Kitware web site. - The HDF5 1.17."X" product requires a minimum CMake version 3.18, - where "X" is the current HDF5 release version. If you are using + The HDF5 2."X"."Y" product requires a minimum CMake version 3.18, + where "X"."Y" is the current HDF5 release version. If you are using VS2022, the minimum version is 3.21. Note: @@ -69,8 +69,8 @@ External compression plugin libraries from https://github.com/HDFGroup/hdf5_plug hdf5_plugins.tar.gz External compression szip and zlib libraries: - ZLIB "https://github.com/madler/zlib/releases/download/v1.3/zlib-1.3.tar.gz" - ZLIBNG "https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.1.6.tar.gz" + ZLIB "https://github.com/madler/zlib/releases/download/v1.3.1/zlib-1.3.1.tar.gz" + ZLIBNG "https://github.com/zlib-ng/zlib-ng/archive/refs/tags/2.2.2.tar.gz" LIBAEC "https://github.com/MathisRosenhauer/libaec/releases/download/v1.1.3/libaec-1.1.3.tar.gz" ------------------------------------------------------------------------- ------------------------------------------------------------------------- @@ -85,7 +85,7 @@ To build HDF5 with the SZIP and ZLIB external libraries you will need to: 2. Download/copy the individual files mentioned above to "myhdfstuff". Do not uncompress the tar.gz files. - 3. Change to the source directory "hdf5-1.17.x". + 3. Change to the source directory "hdf5-2.x.y". CTestScript.cmake file should not be modified. 4. Edit the platform configuration file, HDF5options.cmake, if you want to change @@ -113,7 +113,7 @@ To build HDF5 with the SZIP and ZLIB external libraries you will need to: The command above will configure, build, test, and create an install package in the myhdfstuff folder. It will have the format: - HDF5-1.17.NN-. + HDF5-2.X.Y-. On Unix, will be "Linux". A similar .sh file will also be created. On Windows, will be "win64" or "win32". If you have an @@ -134,57 +134,57 @@ To build HDF5 with the SZIP and ZLIB external libraries you will need to: 6. To install, "X" is the current release version On Windows (with WiX installed), execute: - HDF5-1.17."X"-win32.msi or HDF5-1.17."X"-win64.msi + HDF5-2."X"."Y"-win32.msi or HDF5-2."X"."Y"-win64.msi By default this program will install the hdf5 library into the "C:\Program Files" directory and will create the following directory structure: HDF_Group --HDF5 - ----1.17."X" + ----2."X"."Y" ------bin ------include ------lib - --------plugins + --------plugin ------cmake On Linux, change to the install destination directory (create it if doesn't exist) and execute: - /myhdfstuff/HDF5-1.17."X"-Linux.sh + /myhdfstuff/HDF5-2."X"."Y"-Linux.sh After accepting the license, the script will prompt: By default the HDF5 will be installed in: - "/HDF5-1.17."X"-Linux" - Do you want to include the subdirectory HDF5-1.17."X"-Linux? + "/HDF5-2."X"."Y"-Linux" + Do you want to include the subdirectory HDF5-2."X"."Y"-Linux? Saying no will install in: "" [Yn]: Note that the script will create the following directory structure relative to the install point: HDF_Group --HDF5 - ----1.17."X" + ----2."X"."Y" ------bin ------include ------lib - --------plugins + --------plugin ------share - On Mac you will find HDF5-1.17."X"-Darwin.dmg in the myhdfstuff folder. Click + On Mac you will find HDF5-2."X"."Y"-Darwin.dmg in the myhdfstuff folder. Click on the dmg file to proceed with installation. After accepting the license, there will be a folder with the following structure: HDF_Group --HDF5 - ----1.17."X" + ----2."X"."Y" ------bin ------include ------lib - --------plugins + --------plugin ------share By default the installation will create the bin, include, lib and cmake - folders in the /HDF_Group/HDF5/1.17."X" + folders in the /HDF_Group/HDF5/2."X"."Y" The depends on the build platform; Windows will set the default to: - C:/Program Files/HDF_Group/HDF5/1.17."X" + C:/Program Files/HDF_Group/HDF5/2."X"."Y" Linux will set the default to: - "myhdfstuff/HDF_Group/HDF5/1.17."X" + "myhdfstuff/HDF_Group/HDF5/2."X"."Y" The default can be changed by adding ",INSTALLDIR=" to the "ctest -S HDF5config.cmake..." command. For example on linux: ctest -S HDF5config.cmake,INSTALLDIR=/usr/local/myhdf5,BUILD_GENERATOR=Unix -C Release -VV -O hdf5.log @@ -211,13 +211,13 @@ Notes: This short set of instructions is written for users who want to 5. Configure the C library, tools and tests with one of the following commands: On Windows 32 bit - cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ..\hdf5-1.17."X" + cmake -G "Visual Studio 16 2019" -A Win32 -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ..\hdf5-2."X"."Y" On Windows 64 bit - cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ..\hdf5-1.17."X" + cmake -G "Visual Studio 16 2019" -A x64 -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ..\hdf5-2."X"."Y" On Linux and Mac - cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ../hdf5-1.17."X" + cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE:STRING=Release -DBUILD_SHARED_LIBS:BOOL=OFF -DBUILD_TESTING:BOOL=ON -DHDF5_BUILD_TOOLS:BOOL=ON ../hdf5-2."X"."Y" where "X" is the current release version. @@ -232,48 +232,48 @@ Notes: This short set of instructions is written for users who want to 9. To install On Windows (with WiX installed), execute: - HDF5-1.17."X"-win32.msi or HDF5-1.17."X"-win64.msi + HDF5-2."X"."Y"-win32.msi or HDF5-2."X"."Y"-win64.msi By default this program will install the hdf5 library into the "C:\Program Files" directory and will create the following directory structure: HDF_Group --HDF5 - ----1.17."X" + ----2."X"."Y" ------bin ------include ------lib - --------plugins + --------plugin ------cmake On Linux, change to the install destination directory (create if doesn't exist) and execute: - /myhdfstuff/build/HDF5-1.17."X"-Linux.sh + /myhdfstuff/build/HDF5-2."X"."Y"-Linux.sh After accepting the license, the script will prompt: By default the HDF5 will be installed in: - "/HDF5-1.17."X"-Linux" - Do you want to include the subdirectory HDF5-1.17."X"-Linux? + "/HDF5-2."X"."Y"-Linux" + Do you want to include the subdirectory HDF5-2."X"."Y"-Linux? Saying no will install in: "" [Yn]: Note that the script will create the following directory structure relative to the install point: HDF_Group --HDF5 - ----1.17."X" + ----2."X"."Y" ------bin ------include ------lib - --------plugins + --------plugin ------share - On Mac you will find HDF5-1.17."X"-Darwin.dmg in the build folder. Click + On Mac you will find HDF5-2."X"."Y"-Darwin.dmg in the build folder. Click on the dmg file to proceed with installation. After accepting the license, there will be a folder with the following structure: HDF_Group --HDF5 - ----1.17."X" + ----2."X"."Y" ------bin ------include ------lib - --------plugins + --------plugin ------share @@ -282,7 +282,7 @@ IV. Further considerations ======================================================================== 1. We suggest you obtain the latest CMake for windows from the Kitware - web site. The HDF5 1.17."X" product requires a minimum CMake version 3.18. + web site. The HDF5 2."X"."Y" product requires a minimum CMake version 3.18. If you are using VS2022, the CMake minimum version is 3.21. 2. If you plan to use Zlib or Szip: @@ -383,7 +383,7 @@ IV. Further considerations on the command line are those options that are different. Example using HDF default cache file: cmake -C ../config/cmake/cacheinit.cmake -G "Visual Studio 16 2019" \ - -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF \ + -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF \ -DCMAKE_BUILD_TYPE:STRING=Release .. 7. CMake uses a toolchain of utilities to compile, link libraries and @@ -530,14 +530,14 @@ These five steps are described in detail below. # compression options ######################## set (ZLIB_PACKAGE_NAME "zlib" CACHE STRING "Name of ZLIB package" FORCE) - set (ZLIB_TGZ_NAME "zlib-1.3.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) - set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3" CACHE STRING "Use ZLIB from original location" FORCE) + set (ZLIB_TGZ_NAME "zlib-1.3.1.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) + set (ZLIB_TGZ_ORIGPATH "https://github.com/madler/zlib/releases/download/v1.3.1" CACHE STRING "Use ZLIB from original location" FORCE) set (ZLIB_USE_LOCALCONTENT ON CACHE BOOL "Use local file for ZLIB FetchContent" FORCE) set (ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) set (HDF5_USE_ZLIB_NG OFF CACHE BOOL "Use zlib-ng library as zlib library" FORCE) set (ZLIBNG_PACKAGE_NAME "zlib-ng" CACHE STRING "Name of ZLIBNG package" FORCE) - set (ZLIBNG_TGZ_NAME "2.1.6.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) + set (ZLIBNG_TGZ_NAME "2.2.2.tar.gz" CACHE STRING "Use HDF5_ZLib from compressed file" FORCE) set (ZLIBNG_TGZ_ORIGPATH "https://github.com/zlib-ng/zlib-ng/archive/refs/tags" CACHE STRING "Use ZLIBNG from original location" FORCE) set (ZLIBNG_GIT_URL "https://github.com/zlib-ng/zlib-ng.git" CACHE STRING "Use ZLIBNG from GitHub repository" FORCE) set (ZLIBNG_GIT_BRANCH "develop" CACHE STRING "" FORCE) @@ -576,7 +576,7 @@ These five steps are described in detail below. set (BLOSC_GIT_URL "https://github.com/Blosc/c-blosc.git" CACHE STRING "Use BLOSC from Github repository" FORCE) set (BLOSC_GIT_BRANCH "main" CACHE STRING "" FORCE) set (BLOSC_TGZ_ORIGPATH "https://github.com/Blosc/c-blosc/archive/refs/tags" CACHE STRING "Use PLUGINS from original location" FORCE) - set (BLOSC_TGZ_NAME "c-blosc-1.21.5.tar.gz" CACHE STRING "Use BLOSC from compressed file" FORCE) + set (BLOSC_TGZ_NAME "c-blosc-1.21.6.tar.gz" CACHE STRING "Use BLOSC from compressed file" FORCE) set (BLOSC_PACKAGE_NAME "blosc" CACHE STRING "Name of BLOSC package" FORCE) set (BLOSC_ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (BLOSC_ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) @@ -589,7 +589,7 @@ These five steps are described in detail below. set (BLOSC2_GIT_URL "https://github.com/Blosc/c-blosc2.git" CACHE STRING "Use BLOSC2 from Github repository" FORCE) set (BLOSC2_GIT_BRANCH "main" CACHE STRING "" FORCE) set (BLOSC2_TGZ_ORIGPATH "https://github.com/Blosc/c-blosc2/archive/refs/tags" CACHE STRING "Use PLUGINS from original location" FORCE) - set (BLOSC2_TGZ_NAME "c-blosc2-2.14.4.tar.gz" CACHE STRING "Use BLOSC2 from compressed file" FORCE) + set (BLOSC2_TGZ_NAME "c-blosc2-2.15.1.tar.gz" CACHE STRING "Use BLOSC2 from compressed file" FORCE) set (BLOSC2_PACKAGE_NAME "blosc2" CACHE STRING "Name of BLOSC2 package" FORCE) set (BLOSC2_ZLIB_GIT_URL "https://github.com/madler/zlib.git" CACHE STRING "Use ZLIB from GitHub repository" FORCE) set (BLOSC2_ZLIB_GIT_BRANCH "develop" CACHE STRING "" FORCE) @@ -626,8 +626,8 @@ These five steps are described in detail below. set (BUILD_LZ4_LIBRARY_SOURCE ON CACHE BOOL "build the lz4 library within the plugin" FORCE) set (LZ4_GIT_URL "https://github.com/lz4/lz4.git" CACHE STRING "Use LZ4 from GitHub repository" FORCE) set (LZ4_GIT_BRANCH "dev" CACHE STRING "" FORCE) - set (LZ4_TGZ_ORIGPATH "https://github.com/lz4/lz4/releases/download/v1.9.4" CACHE STRING "Use PLUGINS from original location" FORCE) - set (LZ4_TGZ_NAME "lz4-1.9.4.tar.gz" CACHE STRING "Use LZ4 from compressed file" FORCE) + set (LZ4_TGZ_ORIGPATH "https://github.com/lz4/lz4/releases/download/v1.10.0" CACHE STRING "Use PLUGINS from original location" FORCE) + set (LZ4_TGZ_NAME "lz4-1.10.0.tar.gz" CACHE STRING "Use LZ4 from compressed file" FORCE) set (LZ4_PACKAGE_NAME "lz4" CACHE STRING "Name of LZ4 package" FORCE) ###### # lzf @@ -657,15 +657,15 @@ These five steps are described in detail below. set (ZFP_GIT_URL "https://github.com/LLNL/zfp.git" CACHE STRING "Use ZFP from GitHub repository" FORCE) set (ZFP_GIT_BRANCH "develop" CACHE STRING "" FORCE) set (ZFP_TGZ_ORIGPATH "https://github.com/LLNL/zfp/releases/download/1.0.0" CACHE STRING "Use PLUGINS from original location" FORCE) - set (ZFP_TGZ_NAME "zfp-1.0.0.tar.gz" CACHE STRING "Use ZFP from compressed file" FORCE) + set (ZFP_TGZ_NAME "zfp-1.0.1.tar.gz" CACHE STRING "Use ZFP from compressed file" FORCE) set (ZFP_PACKAGE_NAME "zfp" CACHE STRING "Name of ZFP package" FORCE) ###### # zstd ###### set (ZSTD_GIT_URL "https://github.com/facebook/zstd.git" CACHE STRING "Use ZSTD from GitHub repository" FORCE) set (ZSTD_GIT_BRANCH "dev" CACHE STRING "" FORCE) - set (ZSTD_TGZ_ORIGPATH "https://github.com/facebook/zstd/releases/download/v1.5.5" CACHE STRING "Use PLUGINS from original location" FORCE) - set (ZSTD_TGZ_NAME "zstd-1.5.5.tar.gz" CACHE STRING "Use ZSTD from compressed file" FORCE) + set (ZSTD_TGZ_ORIGPATH "https://github.com/facebook/zstd/releases/download/v1.5.6" CACHE STRING "Use PLUGINS from original location" FORCE) + set (ZSTD_TGZ_NAME "zstd-1.5.6.tar.gz" CACHE STRING "Use ZSTD from compressed file" FORCE) set (ZSTD_PACKAGE_NAME "zstd" CACHE STRING "Name of ZSTD package" FORCE) 2. Configure the cache settings @@ -691,7 +691,7 @@ These five steps are described in detail below. 2.2 Preferred command line example on Windows in c:\MyHDFstuff\hdf5\build directory: cmake -C ../config/cmake/cacheinit.cmake -G "Visual Studio 16 2019" "-Ax64" \ - -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF -DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF \ + -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF -DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF \ -DCMAKE_BUILD_TYPE:STRING=Release .. 2.3 On Windows, if you are using a Visual Studio Express version you must @@ -817,7 +817,7 @@ BUILD_STATIC_LIBS "Build Static Libraries" ON BUILD_STATIC_EXECS "Build Static Executables" OFF BUILD_TESTING "Build HDF5 Unit Testing" ON if (WINDOWS) - DISABLE_PDB_FILES "Do not install PDB files" OFF + HDF5_DISABLE_PDB_FILES "Do not install PDB files" OFF ---------------- HDF5 Build Options ---------------------------------------- HDF5_BUILD_CPP_LIB "Build HDF5 C++ Library" OFF @@ -826,7 +826,6 @@ HDF5_BUILD_FORTRAN "Build FORTRAN support" OFF HDF5_BUILD_JAVA "Build JAVA support" OFF HDF5_BUILD_HL_LIB "Build HIGH Level HDF5 Library" ON HDF5_BUILD_TOOLS "Build HDF5 Tools" ON -HDF5_BUILD_HL_GIF_TOOLS "Build HIGH Level HDF5 GIF Tools" OFF HDF5_BUILD_PARALLEL_TOOLS "Build Parallel HDF5 Tools" OFF HDF5_BUILD_STATIC_TOOLS "Build Static Tools Not Shared Tools" OFF @@ -855,8 +854,8 @@ HDF5_INSTALL_DATA_DIR "share" HDF5_INSTALL_DOC_DIR "HDF5_INSTALL_DATA_DIR/doc/hdf5" ---------------- HDF5 Advanced Options --------------------- -ONLY_SHARED_LIBS "Only Build Shared Libraries" OFF -ALLOW_UNSUPPORTED "Allow unsupported combinations of configure options" OFF +HDF5_ONLY_SHARED_LIBS "Only Build Shared Libraries" OFF +HDF5_ALLOW_UNSUPPORTED "Allow unsupported combinations of configure options" OFF HDF5_ENABLE_PARALLEL "Enable parallel build (requires MPI)" OFF HDF5_ENABLE_THREADSAFE "Enable Threadsafety" OFF HDF5_DIMENSION_SCALES_NEW_REF "Use new-style references with dimension scale APIs" OFF @@ -874,7 +873,7 @@ HDF5_ENABLE_PREADWRITE "Use pread/pwrite in sec2/log/core VFDs in place HDF5_ENABLE_TRACE "Enable API tracing capability" OFF HDF5_ENABLE_USING_MEMCHECKER "Indicate that a memory checker is used" OFF HDF5_ENABLE_MAP_API "Build the map API" OFF -HDF5_GENERATE_HEADERS "Rebuild Generated Files" ON +HDF5_GENERATE_HEADERS "Rebuild Generated Files" OFF HDF5_BUILD_GENERATORS "Build Test Generators" OFF HDF5_JAVA_PACK_JRE "Package a JRE installer directory" OFF @@ -888,7 +887,7 @@ HDF5_STRICT_FORMAT_CHECKS "Whether to perform strict file format checks" HDF5_WANT_DATA_ACCURACY "IF data accuracy is guaranteed during data conversions" ON HDF5_WANT_DCONV_EXCEPTION "exception handling functions is checked during data conversions" ON -DEFAULT_API_VERSION "Enable default API (v16, v18, v110, v112, v114, v116, v118)" "v118" +HDF5_DEFAULT_API_VERSION "Enable default API (v16, v18, v110, v112, v114, v200)" "v200" HDF5_USE_FOLDERS "Enable folder grouping of projects in IDEs." ON HDF5_MSVC_NAMING_CONVENTION "Use MSVC Naming conventions for Shared Libraries" OFF HDF5_MINGW_STATIC_GCC_LIBS "Statically link libgcc/libstdc++" OFF @@ -898,10 +897,10 @@ if (CMAKE_BUILD_TYPE MATCHES Debug) HDF5_ENABLE_INSTRUMENT "Instrument The library" OFF if (HDF5_BUILD_FORTRAN) HDF5_INSTALL_MOD_FORTRAN "Copy FORTRAN mod files to include directory (NO SHARED STATIC)" SHARED - if (BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED - if (BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED - if (NOT BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is STATIC - if (NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED + if (BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED + if (BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED + if (NOT BUILD_SHARED_LIBS AND BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is STATIC + if (NOT BUILD_SHARED_LIBS AND NOT BUILD_STATIC_LIBS) default HDF5_INSTALL_MOD_FORTRAN is SHARED HDF5_ENABLE_ANALYZER_TOOLS "enable the use of Clang tools" OFF HDF5_ENABLE_SANITIZERS "execute the Clang sanitizer" OFF @@ -933,23 +932,23 @@ if (BUILD_TESTING) HDF5_TEST_VFD "Execute tests with different VFDs" OFF if (HDF5_TEST_VFD) HDF5_TEST_FHEAP_VFD "Execute fheap test with different VFDs" ON - TEST_SHELL_SCRIPTS "Enable shell script tests" ON + HDF5_TEST_SHELL_SCRIPTS "Enable shell script tests" ON HDF5_DISABLE_TESTS_REGEX "Regex pattern to set execution of specific tests to DISABLED" "" HDF5_USING_ANALYSIS_TOOL "Indicate that an analysis checker is used" ON ---------------- External Library Options --------------------- HDF5_ALLOW_EXTERNAL_SUPPORT "Allow External Library Building (NO GIT TGZ)" "NO" HDF5_ENABLE_PLUGIN_SUPPORT "Enable PLUGIN Filters" OFF HDF5_ENABLE_SZIP_SUPPORT "Use SZip Filter" OFF -HDF5_ENABLE_Z_LIB_SUPPORT "Enable Zlib Filters" ON +HDF5_ENABLE_ZLIB_SUPPORT "Enable Zlib Filters" ON if (HDF5_USE_ZLIB_NG) ZLIBNG_USE_EXTERNAL "Use External Library Building for ZLIBNG" OFF - ZLIBNG_TGZ_ORIGPATH "Use ZLIBNG from original location" "https://github.com/zlib-ng/zlib-ng/releases/tag/2.1.6" - ZLIBNG_TGZ_NAME "Use ZLIBNG from original compressed file" "2.1.6.tar.gz" + ZLIBNG_TGZ_ORIGPATH "Use ZLIBNG from original location" "https://github.com/zlib-ng/zlib-ng/releases/tag/2.2.2" + ZLIBNG_TGZ_NAME "Use ZLIBNG from original compressed file" "2.2.2.tar.gz" else ZLIB_USE_EXTERNAL "Use External Library Building for ZLIB" OFF - ZLIB_TGZ_ORIGPATH "Use ZLIB from original location" "https://github.com/madler/zlib/releases/download/v1.2.13" - ZLIB_TGZ_NAME "Use ZLIB from original compressed file" "zlib-1.2.13.tar.gz" + ZLIB_TGZ_ORIGPATH "Use ZLIB from original location" "https://github.com/madler/zlib/releases/download/v1.3.1" + ZLIB_TGZ_NAME "Use ZLIB from original compressed file" "zlib-1.3.1.tar.gz" ZLIB_USE_LOCALCONTENT "Use local file for ZLIB FetchContent" ON HDF5_USE_ZLIB_STATIC "Find static zlib library" OFF @@ -981,14 +980,14 @@ NOTE: ---------------- Unsupported Library Options --------------------- The threadsafe, C++ and Java interfaces are not compatible with the HDF5_ENABLE_PARALLEL option. - Unless ALLOW_UNSUPPORTED has been specified, + Unless HDF5_ALLOW_UNSUPPORTED has been specified, the following options must be disabled: HDF5_ENABLE_THREADSAFE, HDF5_BUILD_CPP_LIB, HDF5_BUILD_JAVA The high-level, C++, Fortran and Java interfaces are not compatible with the HDF5_ENABLE_THREADSAFE option because the lock is not hoisted into the higher-level API calls. - Unless ALLOW_UNSUPPORTED has been specified, + Unless HDF5_ALLOW_UNSUPPORTED has been specified, the following options must be disabled: HDF5_BUILD_HL_LIB, HDF5_BUILD_CPP_LIB, HDF5_BUILD_FORTRAN, HDF5_BUILD_JAVA diff --git a/release_docs/INSTALL_Cygwin.txt b/release_docs/INSTALL_Cygwin.txt index 0c61f95ce48..208a2d836eb 100644 --- a/release_docs/INSTALL_Cygwin.txt +++ b/release_docs/INSTALL_Cygwin.txt @@ -94,19 +94,19 @@ Build, Test and Install HDF5 on Cygwin The HDF5 source code is distributed in a variety of formats which can be unpacked with the following commands, each of which creates - an `hdf5-1.17.x' directory. + an `hdf5-2.0.x' directory. 2.1 Non-compressed tar archive (*.tar) - $ tar xf hdf5-1.17.x.tar + $ tar xf hdf5-2.0.x.tar 2.2 Gzip'd tar archive (*.tar.gz) - $ gunzip < hdf5-1.17.x.tar.gz | tar xf - + $ gunzip < hdf5-2.0.x.tar.gz | tar xf - 2.3 Bzip'd tar archive (*.tar.bz2) - $ bunzip2 < hdf5-1.17.x.tar.bz2 | tar xf - + $ bunzip2 < hdf5-2.0.x.tar.bz2 | tar xf - 2. Setup Environment diff --git a/release_docs/NEWSLETTER.txt b/release_docs/NEWSLETTER.txt index 9e06758f16d..ede8f8c5428 100644 --- a/release_docs/NEWSLETTER.txt +++ b/release_docs/NEWSLETTER.txt @@ -1,4 +1,4 @@ -HDF5 version 1.17.0 currently under development +HDF5 version 2.0.0 currently under development Features included for the next major release: ---------------------------------------------------------------------------- diff --git a/release_docs/README_HPC b/release_docs/README_HPC index 576e019becf..f8746bcd18f 100644 --- a/release_docs/README_HPC +++ b/release_docs/README_HPC @@ -155,7 +155,7 @@ configure command, for example -DCMAKE_BUILD_TYPE:STRING=Release -DHDF5_BUILD_FORTRAN:BOOL=ON -DHDF5_BUILD_JAVA:BOOL=OFF -DCMAKE_INSTALL_PREFIX:PATH=/HDF_Group/HDF5/ --DHDF5_ENABLE_Z_LIB_SUPPORT:BOOL=OFF -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF +-DHDF5_ENABLE_ZLIB_SUPPORT:BOOL=OFF -DHDF5_ENABLE_SZIP_SUPPORT:BOOL=OFF -DHDF5_ENABLE_PARALLEL:BOOL=ON -DHDF5_BUILD_CPP_LIB:BOOL=OFF -DHDF5_BUILD_JAVA:BOOL=OFF -DHDF5_ENABLE_THREADSAFE:BOOL=OFF -DHDF5_PACKAGE_EXTLIBS:BOOL=ON -DLOCAL_BATCH_TEST:BOOL=ON diff --git a/release_docs/RELEASE.txt b/release_docs/RELEASE.txt index f700c8a266a..a0b2c2d6210 100644 --- a/release_docs/RELEASE.txt +++ b/release_docs/RELEASE.txt @@ -1,4 +1,4 @@ -HDF5 version 1.17.0 currently under development +HDF5 version 2.0.0 currently under development ================================================================================ @@ -21,7 +21,7 @@ The official HDF5 releases can be obtained from: https://support.hdfgroup.org/downloads/index.html -Changes from Release to Release and New Features in the HDF5-1.16.x release series +Changes from Release to Release and New Features in the HDF5-2.x.y release series can be found at: https://support.hdfgroup.org/releases/hdf5/documentation/release_specific_info.md @@ -36,7 +36,7 @@ CONTENTS - New Features - Support for new platforms and languages -- Bug Fixes since HDF5-1.16.0 +- Bug Fixes since HDF5-2.0.0 - Platforms Tested - Known Problems - CMake vs. Autotools installations @@ -47,7 +47,42 @@ New Features Configuration: ------------- - - Added configuration option for internal threading/concurrency support: + - Renamed the option: HDF5_ENABLE_Z_LIB_SUPPORT + + The option has been renamed to HDF5_ENABLE_ZLIB_SUPPORT to be consistent + with the naming of other options. + + - Added support for MinGW + MSYS2 when building with CMake + + We previously added support for this to the Autotools and the appropriate + configure-time checks have been added to CMake. + + CMake + MinGW + MSYS2 is now tested with the following environments: + + * mingw32 + * mingw64 + * ucrt64 + * clang64 + + - Added CMake build mode flags to the libhdf5.settings file + + Flags from the CMake build mode (e.g., optimization) are not a part of + CMAKE__FLAGS and were not exported to the libhdf5.settings file. This + has been fixed and the C, Fortran, and C++ build mode flags are now exported to + the file. + + This also affects the text output of H5check_version() and the libhdf5.settings + string stored in the library (for those who use strings(1), etc. to get + build info from the binary). + + - CMake: Split compiler specific flags into separate files + + The compiler specific flags have been split into separate files to make + it easier to maintain and add new compiler flags. The flags for NVHPC, + Intel, GNU and Clang compilers are now in separate files included from + the current compiler flags files; HDFCompilerFlags.cmake. + + - Added a configuration option for internal threading/concurrency support: CMake: HDF5_ENABLE_THREADS (ON/OFF) (Default: ON) Autotools: --enable-threads (yes/no) (Default: yes) @@ -59,9 +94,283 @@ New Features disable the 'threadsafe' option, but not vice versa. The 'threads' option must be on to enable the subfiling VFD. + - Added support for native zlib-ng compression. + + Changed the zlib-ng CMake logic to prefer the native zlib-ng library. Added + #ifdef around the compression function calls. Added including the correct + header file with the same #ifdef. + + - Renamed remaining HDF5 library CMake options except for CMake BUILD* variables + + DEFAULT_API_VERSION to HDF5_DEFAULT_API_VERSION + DISABLE_PDB_FILES to HDF5_DISABLE_PDB_FILES + ONLY_SHARED_LIBS to HDF5_ONLY_SHARED_LIBS + ALLOW_UNSUPPORTED to HDF5_ALLOW_UNSUPPORTED + TEST_SHELL_SCRIPTS to HDF5_TEST_SHELL_SCRIPTS + + All other HDF5 library CMake options are prefixed with HDF5_ + + - bin/cmakehdf5 has been removed + + This was an unsupported build script that made building HDF5 via CMake + work like building HDF5 via the Autotools. It has been unmaintained + for a long time, has been marked deprecated, and is being removed. + + - Generated files in src are now checked into version control + + These files are infrequently updated and generating them adds a + dependency on Perl. The listed files are now checked in and do + not need to be recreated when checking out development branches. + + * H5Edefin.h + * H5Einit.h + * H5Emajdef.h + * H5Emindef.h + * H5Epubgen.h + * H5Eterm.h + * H5overflow.h + * H5version.h + + - Dropped some old Solaris Studio work-arounds + + Solaris Studio no longer seems to be maintained and the last version + (12.4, circa 2015) doesn't seem to fully support C11. We've removed + some hacks that work around things like __attribute__() support. + + - Dropped support for the traditional MSVC preprocessor + + Visual Studio has recently started using a standards-compliant + preprocessor (In VS2019+) and this is the default in C11. + + https://learn.microsoft.com/en-us/cpp/preprocessor/preprocessor-experimental-overview?view=msvc-170 + + Because of this, we've dropped support for the traditional + MSVC preprocessor. + + - The standard for building the library is now C11 + + We have updated the build files to set the C standard to C11, though + some platforms use gnu11 to get some GNU things to work. + + Library: -------- + - H5F_LIBVER_LATEST is now an enum value + + This was previously #defined to the latest H5F_libver_t API version, but + is now an enum value with an integer value equal to the latest H5F_libver_t + API version's value. e.g.: + + + H5F_LIBVER_V200 = 5, + H5F_LIBVER_LATEST = 5, + + + - Added support for complex number datatypes + + Support for the C99 "float _Complex", "double _Complex" and "long double _Complex" + (with MSVC, "_Fcomplex", "_Dcomplex" and "_Lcomplex") types has been added for + platforms/compilers that support them. These types have been implemented with a + new datatype class, H5T_COMPLEX. Note that any datatypes of class H5T_COMPLEX + will not be readable with previous versions of HDF5. If a file is accessed with + a library version bounds "high" setting less than H5F_LIBVER_V200, an error will + occur if the application tries to create an object with a complex number datatype. + If compatibility with previous versions of HDF5 is desired, applications should + instead consider adopting one of the existing conventions at + https://nc-complex.readthedocs.io/en/latest/#conventions-used-in-applications. + + The following new macros have been added: + + - H5_HAVE_COMPLEX_NUMBERS + + This macro is defined in H5pubconf.h and will have the value 1 if native + support for complex numbers is available. It will not be defined otherwise. + + - H5_HAVE_C99_COMPLEX_NUMBERS + + This macro is defined in H5pubconf.h and will have the value 1 if native + support for C99 complex numbers is available. It will not be defined otherwise. + If this macro is not defined but H5_HAVE_COMPLEX_NUMBERS is defined, the + complex number types supported are the MSVC types. + + - H5_SIZEOF_FLOAT_COMPLEX + + This macro is defined in H5pubconf.h and will have a value corresponding + to the size of the native float complex datatype, as computed by sizeof(). + If C99 complex number support is available, this will be the size of the + "float _Complex" type. Otherwise, it will be the size of the "_Fcomplex" + type. It will have the value 0 if support for a native float complex datatype + is not available. + + - H5_SIZEOF_DOUBLE_COMPLEX + + This macro is defined in H5pubconf.h and will have a value corresponding + to the size of the native double complex datatype, as computed by sizeof(). + If C99 complex number support is available, this will be the size of the + "double _Complex" type. Otherwise, it will be the size of the "_Dcomplex" + type. It will have the value 0 if support for a native double complex datatype + is not available. + + - H5_SIZEOF_LONG_DOUBLE_COMPLEX + + This macro is defined in H5pubconf.h and will have a value corresponding + to the size of the native long double complex datatype, as computed by sizeof(). + If C99 complex number support is available, this will be the size of the + "long double _Complex" type. Otherwise, it will be the size of the "_Lcomplex" + type. It will have the value 0 if support for a native long double complex + datatype is not available. + + - H5T_NATIVE_FLOAT_COMPLEX + + This macro maps to the ID of an HDF5 datatype representing the native C + float complex datatype (either "float _Complex" or "_Fcomplex") for the + platform. If support for a native float complex datatype is not available + (H5_HAVE_COMPLEX_NUMBERS is not defined), the macro will map to + H5I_INVALID_HID and should not be used. + + - H5T_NATIVE_DOUBLE_COMPLEX + + This macro maps to the ID of an HDF5 datatype representing the native C + double complex datatype (either "double _Complex" or "_Dcomplex") for the + platform. If support for a native double complex datatype is not available + (H5_HAVE_COMPLEX_NUMBERS is not defined), the macro will map to + H5I_INVALID_HID and should not be used. + + - H5T_NATIVE_LDOUBLE_COMPLEX + + This macro maps to the ID of an HDF5 datatype representing the native C + long double complex datatype (either "long double _Complex" or "_Lcomplex") + for the platform. If support for a native long double complex datatype is + not available (H5_HAVE_COMPLEX_NUMBERS is not defined), the macro will map + to H5I_INVALID_HID and should not be used. + + - H5T_COMPLEX_IEEE_F16LE / H5T_COMPLEX_IEEE_F16BE + + These macros map to IDs of HDF5 datatypes representing a complex number of + two parts, each of which is an IEEE 754 16-bit floating-point datatype in + little- or big-endian order. These datatypes are available regardless of + whether complex number support is available or not. + + - H5T_COMPLEX_IEEE_F32LE / H5T_COMPLEX_IEEE_F32BE + + These macros map to IDs of HDF5 datatypes representing a complex number of + two parts, each of which is an IEEE 754 32-bit floating-point datatype in + little- or big-endian order. These datatypes are available regardless of + whether complex number support is available or not. + + - H5T_COMPLEX_IEEE_F64LE / H5T_COMPLEX_IEEE_F64BE + + These macros map to IDs of HDF5 datatypes representing a complex number of + two parts, each of which is an IEEE 754 64-bit floating-point datatype in + little- or big-endian order. These datatypes are available regardless of + whether complex number support is available or not. + + The following new API function has been added: + + hid_t H5Tcomplex_create(hid_t base_type_id); + + Creates a new complex number datatype from the base datatype specified + by the given HDF5 ID `base_type_id`. The base datatype must be a + floating-point datatype. + + The following new hard datatype conversion paths have been added, but + will only be used when complex number support is available: + + H5T_NATIVE_SCHAR <-> H5T_NATIVE_FLOAT_COMPLEX | H5T_NATIVE_UCHAR <-> H5T_NATIVE_FLOAT_COMPLEX + H5T_NATIVE_SHORT <-> H5T_NATIVE_FLOAT_COMPLEX | H5T_NATIVE_USHORT <-> H5T_NATIVE_FLOAT_COMPLEX + H5T_NATIVE_INT <-> H5T_NATIVE_FLOAT_COMPLEX | H5T_NATIVE_UINT <-> H5T_NATIVE_FLOAT_COMPLEX + H5T_NATIVE_LONG <-> H5T_NATIVE_FLOAT_COMPLEX | H5T_NATIVE_ULONG <-> H5T_NATIVE_FLOAT_COMPLEX + H5T_NATIVE_LLONG <-> H5T_NATIVE_FLOAT_COMPLEX | H5T_NATIVE_ULLONG <-> H5T_NATIVE_FLOAT_COMPLEX + H5T_NATIVE_FLOAT16 <-> H5T_NATIVE_FLOAT_COMPLEX | H5T_NATIVE_FLOAT <-> H5T_NATIVE_FLOAT_COMPLEX + H5T_NATIVE_DOUBLE <-> H5T_NATIVE_FLOAT_COMPLEX | H5T_NATIVE_LDOUBLE <-> H5T_NATIVE_FLOAT_COMPLEX + + H5T_NATIVE_SCHAR <-> H5T_NATIVE_DOUBLE_COMPLEX | H5T_NATIVE_UCHAR <-> H5T_NATIVE_DOUBLE_COMPLEX + H5T_NATIVE_SHORT <-> H5T_NATIVE_DOUBLE_COMPLEX | H5T_NATIVE_USHORT <-> H5T_NATIVE_DOUBLE_COMPLEX + H5T_NATIVE_INT <-> H5T_NATIVE_DOUBLE_COMPLEX | H5T_NATIVE_UINT <-> H5T_NATIVE_DOUBLE_COMPLEX + H5T_NATIVE_LONG <-> H5T_NATIVE_DOUBLE_COMPLEX | H5T_NATIVE_ULONG <-> H5T_NATIVE_DOUBLE_COMPLEX + H5T_NATIVE_LLONG <-> H5T_NATIVE_DOUBLE_COMPLEX | H5T_NATIVE_ULLONG <-> H5T_NATIVE_DOUBLE_COMPLEX + H5T_NATIVE_FLOAT16 <-> H5T_NATIVE_DOUBLE_COMPLEX | H5T_NATIVE_FLOAT <-> H5T_NATIVE_DOUBLE_COMPLEX + H5T_NATIVE_DOUBLE <-> H5T_NATIVE_DOUBLE_COMPLEX | H5T_NATIVE_LDOUBLE <-> H5T_NATIVE_DOUBLE_COMPLEX + + H5T_NATIVE_SCHAR <-> H5T_NATIVE_LDOUBLE_COMPLEX | H5T_NATIVE_UCHAR <-> H5T_NATIVE_LDOUBLE_COMPLEX + H5T_NATIVE_SHORT <-> H5T_NATIVE_LDOUBLE_COMPLEX | H5T_NATIVE_USHORT <-> H5T_NATIVE_LDOUBLE_COMPLEX + H5T_NATIVE_INT <-> H5T_NATIVE_LDOUBLE_COMPLEX | H5T_NATIVE_UINT <-> H5T_NATIVE_LDOUBLE_COMPLEX + H5T_NATIVE_LONG <-> H5T_NATIVE_LDOUBLE_COMPLEX | H5T_NATIVE_ULONG <-> H5T_NATIVE_LDOUBLE_COMPLEX + H5T_NATIVE_LLONG <-> H5T_NATIVE_LDOUBLE_COMPLEX | H5T_NATIVE_ULLONG <-> H5T_NATIVE_LDOUBLE_COMPLEX + H5T_NATIVE_FLOAT16 <-> H5T_NATIVE_LDOUBLE_COMPLEX | H5T_NATIVE_FLOAT <-> H5T_NATIVE_LDOUBLE_COMPLEX + H5T_NATIVE_DOUBLE <-> H5T_NATIVE_LDOUBLE_COMPLEX | H5T_NATIVE_LDOUBLE <-> H5T_NATIVE_LDOUBLE_COMPLEX + + H5T_NATIVE_FLOAT_COMPLEX <-> H5T_NATIVE_DOUBLE_COMPLEX + H5T_NATIVE_FLOAT_COMPLEX <-> H5T_NATIVE_LDOUBLE_COMPLEX + H5T_NATIVE_DOUBLE_COMPLEX <-> H5T_NATIVE_LDOUBLE_COMPLEX + + Alternative software implementation conversion paths have been added for all of + the above for use when native complex number support is not available. All of these + conversion paths follow the behavior outlined in the C standard for conversions of + complex number values. + + Additionally, a special datatype conversion path has been added between complex number + datatypes and array or compound datatypes where the in-memory layout of data is the + same between the datatypes and data can be directly converted. This conversion path + is subject to the following rules: + + - An array datatype must consist of exactly two elements where each element is of + the same floating-point datatype as the complex number datatype's base floating-point + datatype. + + - A compound datatype must consist of exactly two fields where each field is of the + same floating-point datatype as the complex number datatype's base floating-point + datatype. The compound datatype must not have any leading or trailing structure + padding or any padding between its two fields. The fields must also have compatible + names, must have compatible offsets within the datatype and must be in the order + of "real" part -> "imaginary" part, such that the compound datatype matches the + following representation: + + H5T_COMPOUND { + "r(e)(a)(l)"; OFFSET 0 + "i(m)(a)(g)(i)(n)(a)(r)(y)"; OFFSET SIZEOF("r(e)(a)(l)") + } + + where "r(e)(a)(l)" means the field may be named any substring of "real", such as + "r", or "re" and "i(m)(a)(g)(i)(n)(a)(r)(y)" means the field may be named any + substring of "imaginary", such as "im" or "imag". + + Support for complex numbers has been added to the h5dump, h5ls and h5diff/ph5diff + tools. The h5dump command-line option '-m' can be used to change the floating-point + printing format for the float complex and double complex datatypes, as well as + the long double complex datatype if it has the same size as a double complex + datatype. + + Support for the predefined complex number datatypes and the H5Tcomplex_create + function has been added to the Java wrappers. However, Java does not have + official types for complex numbers, so an application must be sure that + data is in an appropriate format in-memory when using these datatypes. + + Support for the Fortran wrappers has not yet been added. + + Support for the predefined complex number datatypes and the H5Tcomplex_create + function has been added to the high level library, allowing them to work + with the H5LTtext_to_dtype and H5LTdtype_to_text functions. + + Simple example programs showing how to use complex number datatypes have + been added in the following files: + + - HDF5Examples/C/H5T/200/h5ex_t_complex.c (Uses C99 complex number types) + - HDF5Examples/C/H5T/200/h5ex_t_complex_msvc.c (Uses MSVC complex number types) + - HDF5Examples/C/H5T/200/h5ex_t_complex_custom.c (Uses H5Tcomplex_create to create + a custom complex number type) + + - FOR VOL DEVELOPERS: Renamed H5VLstart_lib_state and H5VLfinish_lib_state + + The APIs H5VLstart_lib_state and H5VLfinish_lib_state have been renamed to + H5VLopen_lib_context and H5VLclose_lib_context, respectively, with the addition + of a "context" argument. + + - Removed H5FDperform_init API routine. Virtual File Driver (VFD) + developers who wish to provide an ID for their driver should create + a routine specific to their individual implementation. + - H5Pset_external() now uses HDoff_t, which is always a 64-bit type The H5Pset_external() call took an off_t parameter in HDF5 1.14.x and @@ -69,7 +378,7 @@ New Features POSIX large-file support (LFS). On Windows, however, off_t is defined as a 32-bit type, even on 64-bit Windows. - HDoff_t has been added to H5public.h and is defined to be __int64 on + HDoff_t has been added to H5public.h and is defined to be int64_t on Windows and the library has been updated to use HDoff_t in place of off_t throughout. The H5Pset_external() offset parameter has also been updated to be HDoff_t. @@ -101,8 +410,26 @@ New Features Tools: ------ - - + - Added h5dump command option to set the floating point format for long double + + The new option is --lformat, which allows the user to set the + floating point format for long double. The default format is %Lg. + There is already an option --format to set the floating point format + for double and float. The default format is %g. + + - Remove the high-level GIF tools + + The high-level GIF tools, h52gif and gif2h5, have unfixed CVE issues + (with no proof-of-concept files). They are not critical tools, are not + well maintained, and are an odd fit for building with the library. + Because of this, they have been removed. We may move them to a separate + repository in the future. + + This also removes the following configure options: + Autotools: --(dis|en)able-hlgiftools + + CMake: HDF5_BUILD_HL_GIF_TOOLS High-Level APIs: ---------------- @@ -121,18 +448,59 @@ New Features Documentation: -------------- - - + - The COPYING file has been renamed to LICENSE + + This is where most people will expect to find license information. The + COPYING_LBNL_HDF5 file has also been renamed to LICENSE_LBNL_HDF5. + The licenses are unchanged. Support for new platforms, languages and compilers ================================================== - -Bug Fixes since HDF5-1.16.0 release +Bug Fixes since HDF5-2.0.0 release =================================== Library ------- - - + - Fixed a bug in the H5Oexists and H5Oexists_by_name API routines that + would cause those routines to return FAIL instead of FALSE when checking + the existence of a non-existent object with a file ID instead of a + group ID. + + - Fixed a segfault in h5dump when a B-tree node level is corrupted + + h5dump produced a segfault on a mal-formed file because a B-tree node + level was corrupted. + + An internal function was modified to help detecting when a decoded B-tree + node level has an unexpected value and an error will be produced. + + Fixes GitHub issue #4432 + + - Fixed H5Ovisit2 to recursively visit all objects + + H5Ovisit2 visited only the root group and not all the nested groups. + + This behavior occurred when the fields are not H5O_INFO_BASIC or + H5O_INFO_ALL because an internal function did not obtain the basic + information needed by its caller. This problem is now fixed. + + Fixes GitHub issue #4941 + + - Only clear FE_INVALID when that symbol is present on the system + + When we initialize the floating-point types at library startup, it's + possible to raise floating-point exceptions when we check which things + are supported. Normally, we clear these floating-point exceptions via + feclearexcept(FE_INVALID), but FE_INVALID may not be present on all + systems. Specifically, this was reported as being a problem when using + Emscripten 3.1.68 to compile HDF5 1.14.5 to WebAssembly. + + We've added an #ifdef FE_INVALID block around the exception clearing + code to correct this. + + Fixes GitHub issue #4952 Java Library @@ -191,14 +559,12 @@ Bug Fixes since HDF5-1.16.0 release Testing ------- - - Disabled running of MPI Atomicity tests for OpenMPI major versions < 5 + - Added skipping of a few parallel tests for OpenMPI 5.0.5 - Support for MPI atomicity operations is not implemented for major - versions of OpenMPI less than version 5. This would cause the MPI - atomicity tests for parallel HDF5 to sporadically fail when run - with OpenMPI. Testphdf5 now checks if OpenMPI is being used and will - skip running the atomicity tests if the major version of OpenMPI is - < 5. + An issue in OpenMPI 5.0.5 causes a few parallel HDF5 tests + (mpiodup, props, fapl_preserve) to fail. These tests are + now skipped for that release of OpenMPI. The issue has + been fixed in the 5.0.6 release of OpenMPI. Platforms Tested @@ -405,7 +771,7 @@ CMake vs. Autotools installations While both build systems produce similar results, there are differences. Each system produces the same set of folders on Linux (only CMake works on standard Windows); bin, include, lib and share. Autotools places the -COPYING and RELEASE.txt file in the root folder, CMake places them in +LICENSE and RELEASE.txt file in the root folder, CMake places them in the share folder. The bin folder contains the tools and the build scripts. Additionally, CMake diff --git a/release_docs/RELEASE_PROCESS.md b/release_docs/RELEASE_PROCESS.md index fd21bfb4d4b..a57a1dbe904 100644 --- a/release_docs/RELEASE_PROCESS.md +++ b/release_docs/RELEASE_PROCESS.md @@ -45,7 +45,7 @@ For more information on the HDF5 versioning and backward and forward compatibili - **See: Testing/Testing Systems(this is a page in confluence)** 4. Update current compiler information for each platform in the PLATFORMS TESTED section of [RELEASE.txt][u1]. 5. Review the [RELEASE.txt][u1] for formatting and language to verify that it corresponds to guidelines found in **[Writing Notes in a RELEASE.txt(this is missing)]()** File. -6. Review and update, if needed, the [README][u2] and [COPYING][u3] files. +6. Review and update, if needed, the [README][u2] and [LICENSE][u3] files. 7. Review and update all INSTALL_* files in [release_docs][u4], if needed. - [INSTALL][u5] should be general info and not require extensive changes - [INSTALL_Autotools.txt][u6] are the instructions for building under autotools. @@ -94,7 +94,9 @@ For more information on the HDF5 versioning and backward and forward compatibili - `$ bin/h5vers -s X.Y.Z-{SR+1};` - `$ git commit -m "Updated release preparation branch version number to X.Y.Z-{SR+1}"` - `$ git push` -7. Update default configuration mode +7. ** OBSOLETE CURRENTLY ** + Most will disappear when autotools support is removed, and none of these are currently necessary + Update default configuration mode - `$ git checkout hdf5_X_Y_Z;` and `$ bin/switch_maint_mode -disable ./configure.ac` to disable `AM_MAINTAINER_MODE`. - Need to set option `HDF5_GENERATE_HEADERS` to `OFF`, currently in line 996 of [src/CMakeLists.txt][u11]. - Change the **release preparation branch**'s (i.e. hdf5_X_Y_Z) default configuration mode from development to production in [configure.ac][u12]. @@ -103,6 +105,7 @@ For more information on the HDF5 versioning and backward and forward compatibili - Under `if test "X-$BUILD_MODE" = X- ; then` change `BUILD_MODE=debug` to `BUILD_MODE=production`. - Run `sh ./autogen.sh` to regenerate the UNIX build system files and commit the changes. (use `git status --ignored` to see the changes and `git add -f` to add all files. First delete any new files not to be committed, notably `src/H5public.h~` and `autom4te.cache/`.) - `$ git push with commit message listing change steps for creating release branch` + ** END OBSOLETE CURRENTLY ** 8. E-mail hdf5lib@hdfgroup.org to indicate that the code freeze on the release support branch (i.e. hdf5_X_Y) has been lifted and development on the next maintenance release can resume. The code freeze will remain in place on the release preparation branch (i.e. hdf5_X_Y_Z) indefinitely. ### 7. Perform Release Testing (Test Automation Team | Release Manager | Project Leads) @@ -202,7 +205,7 @@ For more information on the HDF5 versioning and backward and forward compatibili [u1]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/RELEASE.txt [u2]: https://github.com/HDFGroup/hdf5/blob/develop/README.md -[u3]: https://github.com/HDFGroup/hdf5/blob/develop/COPYING +[u3]: https://github.com/HDFGroup/hdf5/blob/develop/LICENSE [u4]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs [u5]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL [u6]: https://github.com/HDFGroup/hdf5/blob/develop/release_docs/INSTALL_Autotools.txt @@ -213,5 +216,5 @@ For more information on the HDF5 versioning and backward and forward compatibili [u11]: https://github.com/HDFGroup/hdf5/blob/develop/src/CMakeLists.txt [u12]: https://github.com/HDFGroup/hdf5/blob/develop/configure.ac [u13]: https://hdfgroup.github.io/hdf5/develop/api-compat-macros.html -[u14]: https://github.com/HDFGroup/hdf5/releases/tag/snapshot-1.16 +[u14]: https://github.com/HDFGroup/hdf5/releases/tag/snapshot-2.0.0 [u15]: https://github.com/HDFGroup/hdf5/releases/tag/snapshot diff --git a/release_docs/USING_CMake_Examples.txt b/release_docs/USING_CMake_Examples.txt index 956f9ec16d7..514e300b393 100644 --- a/release_docs/USING_CMake_Examples.txt +++ b/release_docs/USING_CMake_Examples.txt @@ -21,7 +21,7 @@ I. Preconditions ======================================================================== 1. We suggest you obtain the latest CMake for your platform from the Kitware - web site. The HDF5 1.17.x product requires a minimum CMake version + web site. The HDF5 2.0.x product requires a minimum CMake version of 3.18. If you are using VS2022, the minimum CMake version is 3.21. 2. You have installed the HDF5 library built with CMake, by executing @@ -84,6 +84,7 @@ III. Defaults in the HDF5_Examples_options.cmake file #### DEFAULT: ### #### BUILD_SHARED_LIBS:BOOL=OFF ### #### H5EX_BUILD_C:BOOL=ON ### +#### H5EX_BUILD_HL:BOOL=OFF ### #### H5EX_BUILD_CXX:BOOL=OFF ### #### H5EX_BUILD_FORTRAN:BOOL=OFF ### #### H5EX_BUILD_JAVA:BOOL=OFF ### diff --git a/release_docs/USING_HDF5_CMake.txt b/release_docs/USING_HDF5_CMake.txt index 8ff240ded25..12fdabdd5f0 100644 --- a/release_docs/USING_HDF5_CMake.txt +++ b/release_docs/USING_HDF5_CMake.txt @@ -38,7 +38,7 @@ I. Preconditions ======================================================================== 1. We suggest you obtain the latest CMake for your platform from the Kitware - web site. The HDF5 1.17.x product requires a minimum CMake version + web site. The HDF5 2.0.x product requires a minimum CMake version of 3.18. If you are using VS2022, the minimum CMake version is 3.21. 2. You have installed the HDF5 library built with CMake, by executing @@ -50,24 +50,24 @@ I. Preconditions or environment variable, set(ENV{HDF5_ROOT} "") to the installed location of HDF5. On Windows: - HDF5_ROOT=C:/Program Files/HDF_Group/HDF5/1.17.x/ + HDF5_ROOT=C:/Program Files/HDF_Group/HDF5/2.0.x/ On unix: - HDF5_ROOT=/HDF_Group/HDF5/1.17.x/ + HDF5_ROOT=/HDF_Group/HDF5/2.0.x/ If you are using shared libraries, you may need to add to the path environment variable. Set the path environment variable to the installed location of the library files for HDF5. On Windows (*.dll): - PATH=%PATH%;C:/Program Files/HDF_Group/HDF5/1.17.x/bin + PATH=%PATH%;C:/Program Files/HDF_Group/HDF5/2.0.x/bin On unix (*.so): - LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/HDF_Group/HDF5/1.17.x/lib + LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/HDF_Group/HDF5/2.0.x/lib If you are using filter plugin libraries, you will need to set the HDF5_PLUGIN_PATH environment variable. On Windows: - HDF5_PLUGIN_PATH=C:/Program Files/HDF_Group/HDF5/1.17.x/lib/plugin + HDF5_PLUGIN_PATH=C:/Program Files/HDF_Group/HDF5/2.0.x/lib/plugin On unix: - HDF5_PLUGIN_PATH=/HDF_Group/HDF5/1.17.x/lib/plugin + HDF5_PLUGIN_PATH=/HDF_Group/HDF5/2.0.x/lib/plugin (Note there are no quote characters used on Windows and all platforms use forward slashes) diff --git a/release_docs/USING_HDF5_VS.txt b/release_docs/USING_HDF5_VS.txt index f13cdfadc2a..dc19272406b 100644 --- a/release_docs/USING_HDF5_VS.txt +++ b/release_docs/USING_HDF5_VS.txt @@ -62,11 +62,11 @@ Using Visual Studio 2008 with HDF5 Libraries built with Visual Studio 2008 and select "x64". 2.2 Find the box "Show directories for", choose "Include files", add the - header path (i.e. c:\Program Files\HDF_Group\HDF5\1.17.x\include) + header path (i.e. c:\Program Files\HDF_Group\HDF5\2.0.x\include) to the included directories. 2.3 Find the box "Show directories for", choose "Library files", add the - library path (i.e. c:\Program Files\HDF_Group\HDF5\1.17.x\lib) + library path (i.e. c:\Program Files\HDF_Group\HDF5\2.0.x\lib) to the library directories. 2.4 If using Fortran libraries, you will also need to setup the path diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 438d60fffc7..2cdaa575c43 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -236,17 +236,18 @@ set (H5FD_SOURCES ${HDF5_SRC_DIR}/H5FDmpi.c ${HDF5_SRC_DIR}/H5FDmpio.c ${HDF5_SRC_DIR}/H5FDmulti.c + ${HDF5_SRC_DIR}/H5FDmulti_int.c ${HDF5_SRC_DIR}/H5FDonion.c ${HDF5_SRC_DIR}/H5FDonion_header.c ${HDF5_SRC_DIR}/H5FDonion_history.c ${HDF5_SRC_DIR}/H5FDonion_index.c - ${HDF5_SRC_DIR}/H5FDperform.c ${HDF5_SRC_DIR}/H5FDros3.c ${HDF5_SRC_DIR}/H5FDs3comms.c ${HDF5_SRC_DIR}/H5FDsec2.c ${HDF5_SRC_DIR}/H5FDspace.c ${HDF5_SRC_DIR}/H5FDsplitter.c ${HDF5_SRC_DIR}/H5FDstdio.c + ${HDF5_SRC_DIR}/H5FDstdio_int.c ${HDF5_SRC_DIR}/H5FDtest.c ${HDF5_SRC_DIR}/H5FDwindows.c ) @@ -599,17 +600,19 @@ set (H5T_SOURCES ${HDF5_SRC_DIR}/H5Tarray.c ${HDF5_SRC_DIR}/H5Tbit.c ${HDF5_SRC_DIR}/H5Tcommit.c + ${HDF5_SRC_DIR}/H5Tcomplex.c ${HDF5_SRC_DIR}/H5Tcompound.c ${HDF5_SRC_DIR}/H5Tconv.c - ${HDF5_SRC_DIR}/H5Tconv_integer.c - ${HDF5_SRC_DIR}/H5Tconv_float.c - ${HDF5_SRC_DIR}/H5Tconv_string.c + ${HDF5_SRC_DIR}/H5Tconv_array.c ${HDF5_SRC_DIR}/H5Tconv_bitfield.c + ${HDF5_SRC_DIR}/H5Tconv_complex.c ${HDF5_SRC_DIR}/H5Tconv_compound.c - ${HDF5_SRC_DIR}/H5Tconv_reference.c ${HDF5_SRC_DIR}/H5Tconv_enum.c + ${HDF5_SRC_DIR}/H5Tconv_float.c + ${HDF5_SRC_DIR}/H5Tconv_integer.c + ${HDF5_SRC_DIR}/H5Tconv_reference.c + ${HDF5_SRC_DIR}/H5Tconv_string.c ${HDF5_SRC_DIR}/H5Tconv_vlen.c - ${HDF5_SRC_DIR}/H5Tconv_array.c ${HDF5_SRC_DIR}/H5Tcset.c ${HDF5_SRC_DIR}/H5Tdbg.c ${HDF5_SRC_DIR}/H5Tdeprec.c @@ -727,8 +730,10 @@ set (H5Z_SOURCES ${HDF5_SRC_DIR}/H5Ztrans.c ) if (H5_ZLIB_HEADER) - SET_PROPERTY(SOURCE ${HDF5_SRC_DIR}/H5Zdeflate.c PROPERTY - COMPILE_DEFINITIONS H5_ZLIB_HEADER="${H5_ZLIB_HEADER}") + message(STATUS "H5_ZLIB_HEADER=${H5_ZLIB_HEADER}") + set_source_files_properties(${HDF5_SRC_DIR}/H5Zdeflate.c + PROPERTIES COMPILE_DEFINITIONS H5_ZLIB_HEADER="${H5_ZLIB_HEADER}" + ) endif () @@ -752,7 +757,6 @@ set (H5_MODULE_HEADERS ${HDF5_SRC_DIR}/H5ESmodule.h ${HDF5_SRC_DIR}/H5Fmodule.h ${HDF5_SRC_DIR}/H5FAmodule.h - ${HDF5_SRC_DIR}/H5FDdrvr_module.h ${HDF5_SRC_DIR}/H5FDmodule.h ${HDF5_SRC_DIR}/H5FLmodule.h ${HDF5_SRC_DIR}/H5FSmodule.h @@ -863,6 +867,8 @@ set (H5_PUBLIC_HEADERS set (H5_PRIVATE_HEADERS ${HDF5_SRC_DIR}/H5private.h + ${HDF5_SRC_DIR}/H5timer.h + ${HDF5_SRC_DIR}/H5warnings.h ${HDF5_SRC_DIR}/H5Apkg.h ${HDF5_SRC_DIR}/H5Aprivate.h @@ -975,6 +981,7 @@ set (H5_PRIVATE_HEADERS ${HDF5_SRC_DIR}/H5Tconv.h ${HDF5_SRC_DIR}/H5Tconv_array.h ${HDF5_SRC_DIR}/H5Tconv_bitfield.h + ${HDF5_SRC_DIR}/H5Tconv_complex.h ${HDF5_SRC_DIR}/H5Tconv_compound.h ${HDF5_SRC_DIR}/H5Tconv_enum.h ${HDF5_SRC_DIR}/H5Tconv_float.h @@ -1022,7 +1029,7 @@ set (H5_PUBLIC_GENERATED_HEADERS ${HDF5_SRC_DIR}/H5overflow.h ) -option (HDF5_GENERATE_HEADERS "Rebuild Generated Files" ON) +option (HDF5_GENERATE_HEADERS "Rebuild Generated Files" OFF) if (HDF5_GENERATE_HEADERS) set_source_files_properties(${H5_GENERATED_HEADERS} PROPERTIES GENERATED TRUE) if (H5_PERL_FOUND) diff --git a/src/H5.c b/src/H5.c index 9dc9fca1022..b246763b490 100644 --- a/src/H5.c +++ b/src/H5.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -32,8 +32,6 @@ #include "H5SLprivate.h" /* Skip lists */ #include "H5Tprivate.h" /* Datatypes */ -#include "H5FDsec2.h" /* for H5FD_sec2_init() */ - /****************/ /* Local Macros */ /****************/ @@ -60,11 +58,15 @@ static void H5__debug_mask(const char *); #ifdef H5_HAVE_PARALLEL static int H5__mpi_delete_cb(MPI_Comm comm, int keyval, void *attr_val, int *flag); #endif /*H5_HAVE_PARALLEL*/ +static herr_t H5_check_version(unsigned majnum, unsigned minnum, unsigned relnum); /*********************/ /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -91,30 +93,31 @@ static H5_atclose_node_t *H5_atclose_head = NULL; /* Declare a free list to manage the H5_atclose_node_t struct */ H5FL_DEFINE_STATIC(H5_atclose_node_t); -/*------------------------------------------------------------------------- - * Function: H5_default_vfd_init - * - * Purpose: Initialize the default VFD. - * - * Return: Success: non-negative - * Failure: negative - *------------------------------------------------------------------------- - */ -static herr_t -H5_default_vfd_init(void) +/*-------------------------------------------------------------------------- +NAME + H5__init_package -- Initialize interface-specific information +USAGE + herr_t H5__init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------*/ +herr_t +H5__init_package(void) { - herr_t ret_value = SUCCEED; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + + /* Run the library initialization routine, if it hasn't already ran */ + if (!H5_INIT_GLOBAL && !H5_TERM_GLOBAL) + if (H5_init_library() < 0) + HGOTO_ERROR(H5E_LIB, H5E_CANTINIT, FAIL, "unable to initialize library"); - FUNC_ENTER_NOAPI(FAIL) - /* Load the hid_t for the default VFD for the side effect - * it has of initializing the default VFD. - */ - if (H5FD_sec2_init() == H5I_INVALID_HID) { - HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to load default VFD ID"); - } done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5__init_package() */ /*-------------------------------------------------------------------------- * NAME @@ -133,7 +136,6 @@ H5_default_vfd_init(void) herr_t H5_init_library(void) { - size_t i; herr_t ret_value = SUCCEED; FUNC_ENTER_NOAPI(FAIL) @@ -142,6 +144,10 @@ H5_init_library(void) if (H5_INIT_GLOBAL || H5_TERM_GLOBAL) HGOTO_DONE(SUCCEED); + /* Check library version */ + /* (Will abort() on failure) */ + H5_check_version(H5_VERS_MAJOR, H5_VERS_MINOR, H5_VERS_RELEASE); + /* Set the 'library initialized' flag as early as possible, to avoid * possible re-entrancy. */ @@ -224,50 +230,53 @@ H5_init_library(void) } /* end if */ /* - * Initialize interfaces that might not be able to initialize themselves - * soon enough. The file & dataset interfaces must be initialized because - * calling H5P_create() might require the file/dataset property classes to be - * initialized. The property interface must be initialized before the file - * & dataset interfaces though, in order to provide them with the proper - * property classes. - * The link interface needs to be initialized so that link property lists - * have their properties registered. + * Initialize interfaces that use macros of the form "(H5OPEN )", so + * that the variable returned through the macros has been initialized. + * Also initialize some interfaces that might not be able to initialize + * themselves soon enough. + * + * Interfaces returning variables through a macro: H5E, H5FD, H5O, H5P, H5T + * + * The link interface needs to be initialized so that the external link + * class is registered. + * * The FS module needs to be initialized as a result of the fix for HDFFV-10160: * It might not be initialized during normal file open. * When the application does not close the file, routines in the module might * be called via H5_term_library() when shutting down the file. + * * The dataspace interface needs to be initialized so that future IDs for * dataspaces work. + * + * The VFD & VOL interfaces need to be initialized before the H5P interface + * so that the default VFD and default VOL connector are ready for the + * default FAPL. + * */ - { - /* clang-format off */ - struct { - herr_t (*func)(void); - const char *descr; - } initializer[] = { - {H5E_init, "error"} - , {H5VL_init_phase1, "VOL"} - , {H5SL_init, "skip lists"} - , {H5FD_init, "VFD"} - , {H5_default_vfd_init, "default VFD"} - , {H5P_init_phase1, "property list"} - , {H5AC_init, "metadata caching"} - , {H5L_init, "link"} - , {H5S_init, "dataspace"} - , {H5PL_init, "plugins"} - /* Finish initializing interfaces that depend on the interfaces above */ - , {H5P_init_phase2, "property list"} - , {H5VL_init_phase2, "VOL"} - }; - - for (i = 0; i < NELMTS(initializer); i++) { - if (initializer[i].func() < 0) { - HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, - "unable to initialize %s interface", initializer[i].descr); - } - } - /* clang-format on */ - } + if (H5E_init() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize error interface"); + if (H5FD_init() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize VFL interface"); + if (H5VL_init_phase1() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize vol interface"); + if (H5P_init_phase1() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize property list interface"); + if (H5L_init() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize link interface"); + if (H5O_init() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize object interface"); + if (H5FS_init() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize FS interface"); + if (H5S_init() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize dataspace interface"); + if (H5T_init() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize datatype interface"); + + /* Finish initializing interfaces that depend on the interfaces above */ + if (H5P_init_phase2() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize property list interface"); + if (H5VL_init_phase2() < 0) + HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, FAIL, "unable to initialize vol interface"); /* Debugging? */ H5__debug_mask("-all"); @@ -291,15 +300,14 @@ H5_init_library(void) void H5_term_library(void) { - int pending, ntries = 0; - char loop[1024], *next = loop; - size_t i; - size_t nleft = sizeof(loop); - int nprinted; + int pending, ntries = 0, n; + size_t at = 0; + char loop[1024]; H5E_auto2_t func; + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ /* Acquire the API lock */ - H5CANCEL_DECL + H5_API_SETUP_PUBLIC_API_VARS H5_API_LOCK /* Don't do anything if the library is already closed */ @@ -310,7 +318,7 @@ H5_term_library(void) H5_TERM_GLOBAL = true; /* Push the API context without checking for errors */ - H5CX_push_special(); + H5CX_push(&api_ctx); /* Check if we should display error output */ (void)H5Eget_auto2(H5E_DEFAULT, &func, NULL); @@ -337,147 +345,114 @@ H5_term_library(void) H5_atclose_head = NULL; } /* end if */ - /* clang-format off */ - /* * Terminate each interface. The termination functions return a positive * value if they do something that might affect some other interface in a * way that would necessitate some cleanup work in the other interface. */ +#define DOWN(F) \ + (((n = H5##F##_term_package()) && (at + 8) < sizeof loop) \ + ? (sprintf(loop + at, "%s%s", (at ? "," : ""), #F), at += strlen(loop + at), n) \ + : ((n > 0 && (at + 5) < sizeof loop) ? (sprintf(loop + at, "..."), at += strlen(loop + at), n) \ + : n)) - { -#define TERMINATOR(module, wait) { \ - .func = H5##module##_term_package \ - , .name = #module \ - , .completed = false \ - , .await_prior = wait \ - } + do { + pending = 0; - /* - * Termination is ordered by the `terminator` table so the "higher" level - * packages are shut down before "lower" level packages that they - * rely on: + /* Try to organize these so the "higher" level components get shut + * down before "lower" level components that they might rely on. -QAK */ - struct { - int (*func)(void); /* function to terminate the module; returns 0 - * on success, >0 if termination was not - * completed and we should try to terminate - * some dependent modules, first. - */ - const char *name; /* name of the module */ - bool completed; /* true iff this terminator was already - * completed - */ - const bool await_prior; /* true iff all prior terminators in the - * list must complete before this - * terminator is attempted - */ - } terminator[] = { - /* Close the event sets first, so that all asynchronous operations - * complete before anything else attempts to shut down. - */ - TERMINATOR(ES, false) - /* Do not attempt to close down package L until after event sets - * have finished closing down. - */ - , TERMINATOR(L, true) + + /* Close the event sets first, so that all asynchronous operations + * complete before anything else attempts to shut down. + */ + pending += DOWN(ES); + + /* Close down the user-facing interfaces, after the event sets */ + if (pending == 0) { + /* Close the interfaces dependent on others */ + pending += DOWN(L); + /* Close the "top" of various interfaces (IDs, etc) but don't shut * down the whole interface yet, so that the object header messages * get serialized correctly for entries in the metadata cache and the * symbol table entry in the superblock gets serialized correctly, etc. * all of which is performed in the 'F' shutdown. - * - * The tops of packages A, D, G, M, S, T do not need to wait for L - * or previous packages to finish closing down. */ - , TERMINATOR(A_top, false) - , TERMINATOR(D_top, false) - , TERMINATOR(G_top, false) - , TERMINATOR(M_top, false) - , TERMINATOR(S_top, false) - , TERMINATOR(T_top, false) - /* Don't shut down the file code until objects in files are shut down */ - , TERMINATOR(F, true) - /* Don't shut down the property list code until all objects that might - * use property lists are shut down - */ - , TERMINATOR(P, true) - /* Wait to shut down the "bottom" of various interfaces until the - * files are closed, so pieces of the file can be serialized - * correctly. - * - * Shut down the "bottom" of the attribute, dataset, group, - * reference, dataspace, and datatype interfaces, fully closing + pending += DOWN(A_top); + pending += DOWN(D_top); + pending += DOWN(G_top); + pending += DOWN(M_top); + pending += DOWN(S_top); + pending += DOWN(T_top); + } /* end if */ + + /* Don't shut down the file code until objects in files are shut down */ + if (pending == 0) + pending += DOWN(F); + + /* Don't shut down the property list code until all objects that might + * use property lists are shut down */ + if (pending == 0) + pending += DOWN(P); + + /* Wait to shut down the "bottom" of various interfaces until the + * files are closed, so pieces of the file can be serialized + * correctly. + */ + if (pending == 0) { + /* Shut down the "bottom" of the attribute, dataset, group, + * dataspace, and datatype interfaces, fully closing * out the interfaces now. */ - , TERMINATOR(A, true) - , TERMINATOR(D, false) - , TERMINATOR(G, false) - , TERMINATOR(M, false) - , TERMINATOR(S, false) - , TERMINATOR(T, false) - /* Wait to shut down low-level packages like AC until after - * the preceding high-level packages have shut down. This prevents - * low-level objects from closing "out from underneath" their - * reliant high-level objects. - */ - , TERMINATOR(AC, true) - /* Shut down the "pluggable" interfaces, before the plugin framework */ - , TERMINATOR(Z, false) - , TERMINATOR(FD, false) - , TERMINATOR(VL, false) - /* Don't shut down the plugin code until all "pluggable" interfaces - * (Z, FD, PL) are shut down - */ - , TERMINATOR(PL, true) - /* Shut down the following packages in strictly the order given - * by the table. - */ - , TERMINATOR(E, true) - , TERMINATOR(I, true) - , TERMINATOR(SL, true) - , TERMINATOR(FL, true) - , TERMINATOR(CX, true) - }; - - do { - pending = 0; - for (i = 0; i < NELMTS(terminator); i++) { - if (terminator[i].completed) - continue; - if (pending != 0 && terminator[i].await_prior) - break; - if (terminator[i].func() == 0) { - terminator[i].completed = true; - continue; - } - - /* log a package when its terminator needs to be retried */ - pending++; - nprinted = snprintf(next, nleft, "%s%s", - (next != loop) ? "," : "", terminator[i].name); - if (nprinted < 0) - continue; - if ((size_t)nprinted >= nleft) - nprinted = snprintf(next, nleft, "..."); - if (nprinted < 0 || (size_t)nprinted >= nleft) - continue; - nleft -= (size_t)nprinted; - next += nprinted; - } - } while (pending && ntries++ < 100); + pending += DOWN(A); + pending += DOWN(D); + pending += DOWN(G); + pending += DOWN(M); + pending += DOWN(S); + pending += DOWN(T); + } /* end if */ - /* clang-format on */ + /* Don't shut down "low-level" components until "high-level" components + * have successfully shut down. This prevents property lists and IDs + * from being closed "out from underneath" of the high-level objects + * that depend on them. -QAK + */ + if (pending == 0) { + pending += DOWN(AC); + /* Shut down the "pluggable" interfaces, before the plugin framework */ + pending += DOWN(Z); + pending += DOWN(FD); + pending += DOWN(VL); + /* Don't shut down the plugin code until all "pluggable" interfaces (Z, FD, PL) are shut down */ + if (pending == 0) + pending += DOWN(PL); + /* Don't shut down the error code until other APIs which use it are shut down */ + if (pending == 0) + pending += DOWN(E); + /* Don't shut down the ID code until other APIs which use them are shut down */ + if (pending == 0) + pending += DOWN(I); + /* Don't shut down the skip list code until everything that uses it is down */ + if (pending == 0) + pending += DOWN(SL); + /* Don't shut down the free list code until everything that uses it is down */ + if (pending == 0) + pending += DOWN(FL); + /* Don't shut down the API context code until _everything_ else is down */ + if (pending == 0) + pending += DOWN(CX); + } /* end if */ + } while (pending && ntries++ < 100); - if (pending) { - /* Only display the error message if the user is interested in them. */ - if (func) { - fprintf(stderr, "HDF5: infinite loop closing library\n"); - fprintf(stderr, " %s\n", loop); + if (pending) { + /* Only display the error message if the user is interested in them. */ + if (func) { + fprintf(stderr, "HDF5: infinite loop closing library\n"); + fprintf(stderr, " %s\n", loop); #ifndef NDEBUG - abort(); + abort(); #endif - } } } @@ -531,14 +506,14 @@ H5dont_atexit(void) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_NOINIT_NOERR_NOFS + FUNC_ENTER_API_NOINIT_NOERR if (H5_dont_atexit_g) ret_value = FAIL; else H5_dont_atexit_g = true; - FUNC_LEAVE_API_NOFS(ret_value) + FUNC_LEAVE_API_NOERR(ret_value) } /* end H5dont_atexit() */ /*------------------------------------------------------------------------- @@ -816,13 +791,10 @@ H5get_libversion(unsigned *majnum /*out*/, unsigned *minnum /*out*/, unsigned *r } /* end H5get_libversion() */ /*------------------------------------------------------------------------- - * Function: H5check_version + * Function: H5__check_version * - * Purpose: Verifies that the arguments match the version numbers - * compiled into the library. This function is intended to be - * called from user to verify that the versions of header files - * compiled into the application match the version of the hdf5 - * library. + * Purpose: Internal routine which Verifies that the arguments match the + * version numbers compiled into the library. * * Within major.minor.release version, the expectation * is that all release versions are compatible, exceptions to @@ -852,18 +824,18 @@ H5get_libversion(unsigned *majnum /*out*/, unsigned *minnum /*out*/, unsigned *r "You should recompile the application or check your shared library related\n" \ "settings such as 'LD_LIBRARY_PATH'.\n" -herr_t -H5check_version(unsigned majnum, unsigned minnum, unsigned relnum) +static herr_t +H5_check_version(unsigned majnum, unsigned minnum, unsigned relnum) { char lib_str[256]; char substr[] = H5_VERS_SUBRELEASE; - static int checked = 0; /* If we've already checked the version info */ - static unsigned int disable_version_check = 0; /* Set if the version check should be disabled */ + static bool checked = false; /* If we've already checked the version info */ + static unsigned int disable_version_check = 0; /* Set if the version check should be disabled */ static const char *version_mismatch_warning = VERSION_MISMATCH_WARNING; static const char *release_mismatch_warning = RELEASE_MISMATCH_WARNING; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_API_NOINIT_NOERR_NOFS + FUNC_ENTER_NOAPI_NOINIT_NOERR /* Don't check again, if we already have */ if (checked) @@ -960,7 +932,7 @@ H5check_version(unsigned majnum, unsigned minnum, unsigned relnum) } /* end if (H5_VERS_RELEASE != relnum) */ /* Indicate that the version check has been performed */ - checked = 1; + checked = true; if (!disable_version_check) { /* @@ -988,7 +960,21 @@ H5check_version(unsigned majnum, unsigned minnum, unsigned relnum) } done: - FUNC_LEAVE_API_NOFS(ret_value) + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5__check_version() */ + +herr_t +H5check_version(unsigned majnum, unsigned minnum, unsigned relnum) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_API_NOINIT_NOERR + + /* Call internal routine */ + /* (Will abort() on failure) */ + H5_check_version(majnum, minnum, relnum); + + FUNC_LEAVE_API_NOERR(ret_value) } /* end H5check_version() */ /*------------------------------------------------------------------------- @@ -1071,11 +1057,11 @@ H5close(void) * whole library just to release it all right away. It is safe to call * this function for an uninitialized library. */ - FUNC_ENTER_API_NOINIT_NOERR_NOFS + FUNC_ENTER_API_NOINIT_NOERR H5_term_library(); - FUNC_LEAVE_API_NOFS(SUCCEED) + FUNC_LEAVE_API_NOERR(SUCCEED) } /* end H5close() */ /*------------------------------------------------------------------------- diff --git a/src/H5A.c b/src/H5A.c index 6c9cfd9f50d..83bc68fe514 100644 --- a/src/H5A.c +++ b/src/H5A.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5AC.c b/src/H5AC.c index 5f9df26aba1..9aef2957663 100644 --- a/src/H5AC.c +++ b/src/H5AC.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -67,6 +67,9 @@ static herr_t H5AC__verify_tag(const H5AC_class_t *type); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -134,7 +137,26 @@ H5AC_init(void) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5AC_init() */ + +/*------------------------------------------------------------------------- + * Function: H5AC__init_package + * + * Purpose: Initialize interface-specific information + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5AC__init_package(void) +{ + FUNC_ENTER_PACKAGE_NOERR #ifdef H5_HAVE_PARALLEL /* check whether to enable strict collective function calling @@ -151,8 +173,8 @@ H5AC_init(void) } #endif /* H5_HAVE_PARALLEL */ - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5AC_init() */ + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5AC__init_package() */ /*------------------------------------------------------------------------- * Function: H5AC_term_package @@ -170,6 +192,10 @@ H5AC_term_package(void) { FUNC_ENTER_NOAPI_NOINIT_NOERR + if (H5_PKG_INIT_VAR) + /* Reset interface initialization flag */ + H5_PKG_INIT_VAR = false; + FUNC_LEAVE_NOAPI(0) } /* end H5AC_term_package() */ diff --git a/src/H5ACdbg.c b/src/H5ACdbg.c index 37d9ca8dcdc..4fa827bf6d4 100644 --- a/src/H5ACdbg.c +++ b/src/H5ACdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ACmodule.h b/src/H5ACmodule.h index 1ce26f6b15f..1b9b88e0d24 100644 --- a/src/H5ACmodule.h +++ b/src/H5ACmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5AC_MODULE -#define H5_MY_PKG H5AC -#define H5_MY_PKG_ERR H5E_CACHE +#define H5_MY_PKG H5AC +#define H5_MY_PKG_ERR H5E_CACHE +#define H5_MY_PKG_INIT YES #endif /* H5ACmodule_H */ diff --git a/src/H5ACmpio.c b/src/H5ACmpio.c index c80c134c098..f657ec3b10d 100644 --- a/src/H5ACmpio.c +++ b/src/H5ACmpio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ACpkg.h b/src/H5ACpkg.h index e0867f4ebe6..7b6e5302efc 100644 --- a/src/H5ACpkg.h +++ b/src/H5ACpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ACprivate.h b/src/H5ACprivate.h index 51f1b358a60..3cf6980fa4a 100644 --- a/src/H5ACprivate.h +++ b/src/H5ACprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ACproxy_entry.c b/src/H5ACproxy_entry.c index 5ad1673dd5c..109c1b42cb4 100644 --- a/src/H5ACproxy_entry.c +++ b/src/H5ACproxy_entry.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -399,7 +399,7 @@ H5AC_proxy_entry_dest(H5AC_proxy_entry_t *pentry) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity checks */ assert(pentry); @@ -411,6 +411,7 @@ H5AC_proxy_entry_dest(H5AC_proxy_entry_t *pentry) /* Free the proxy entry object */ pentry = H5FL_FREE(H5AC_proxy_entry_t, pentry); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5AC_proxy_entry_dest() */ diff --git a/src/H5ACpublic.h b/src/H5ACpublic.h index 71292b679ae..3e989394788 100644 --- a/src/H5ACpublic.h +++ b/src/H5ACpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Abtree2.c b/src/H5Abtree2.c index 9ea4b75a29a..2386294d6f9 100644 --- a/src/H5Abtree2.c +++ b/src/H5Abtree2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Adense.c b/src/H5Adense.c index 143fa9b3646..11bb5479e93 100644 --- a/src/H5Adense.c +++ b/src/H5Adense.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Adeprec.c b/src/H5Adeprec.c index 0d878d34e48..b5f9fb21647 100644 --- a/src/H5Adeprec.c +++ b/src/H5Adeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Aint.c b/src/H5Aint.c index 1f1f12437b7..f06c5ea0ede 100644 --- a/src/H5Aint.c +++ b/src/H5Aint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -88,6 +88,9 @@ static herr_t H5A__iterate_common(hid_t loc_id, H5_index_t idx_type, H5_iter_ord /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Format version bounds for attribute */ const unsigned H5O_attr_ver_bounds[] = { H5O_ATTR_VERSION_1, /* H5F_LIBVER_EARLIEST */ @@ -95,8 +98,7 @@ const unsigned H5O_attr_ver_bounds[] = { H5O_ATTR_VERSION_3, /* H5F_LIBVER_V110 */ H5O_ATTR_VERSION_3, /* H5F_LIBVER_V112 */ H5O_ATTR_VERSION_3, /* H5F_LIBVER_V114 */ - H5O_ATTR_VERSION_3, /* H5F_LIBVER_V116 */ - H5O_ATTR_VERSION_3, /* H5F_LIBVER_V118 */ + H5O_ATTR_VERSION_3, /* H5F_LIBVER_V200 */ H5O_ATTR_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; @@ -128,6 +130,9 @@ static const H5I_class_t H5I_ATTR_CLS[1] = {{ (H5I_free_t)H5A__close_cb /* Callback routine for closing objects of this class */ }}; +/* Flag indicating "top" of interface has been initialized */ +static hbool_t H5A_top_package_initialize_s = false; + /*------------------------------------------------------------------------- * Function: H5A_init * @@ -144,6 +149,30 @@ H5A_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5A_init() */ + +/*-------------------------------------------------------------------------- +NAME + H5A__init_package -- Initialize interface-specific information +USAGE + herr_t H5A__init_package() + +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. + +--------------------------------------------------------------------------*/ +herr_t +H5A__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE /* * Create attribute ID type. @@ -151,9 +180,12 @@ H5A_init(void) if (H5I_register_type(H5I_ATTR_CLS) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTINIT, FAIL, "unable to initialize interface"); + /* Mark "top" of interface as initialized, too */ + H5A_top_package_initialize_s = true; + done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5A_init() */ +} /* end H5A__init_package() */ /*-------------------------------------------------------------------------- NAME @@ -179,10 +211,16 @@ H5A_top_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - if (H5I_nmembers(H5I_ATTR) > 0) { - (void)H5I_clear_type(H5I_ATTR, false, false); - n++; /*H5I*/ - } /* end if */ + if (H5A_top_package_initialize_s) { + if (H5I_nmembers(H5I_ATTR) > 0) { + (void)H5I_clear_type(H5I_ATTR, false, false); + n++; /*H5I*/ + } /* end if */ + + /* Mark closed */ + if (0 == n) + H5A_top_package_initialize_s = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* H5A_top_term_package() */ @@ -213,11 +251,18 @@ H5A_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Sanity checks */ - assert(0 == H5I_nmembers(H5I_ATTR)); + if (H5_PKG_INIT_VAR) { + /* Sanity checks */ + assert(0 == H5I_nmembers(H5I_ATTR)); + assert(false == H5A_top_package_initialize_s); + + /* Destroy the attribute object id group */ + n += (H5I_dec_type_ref(H5I_ATTR) > 0); - /* Destroy the attribute object id group */ - n += (H5I_dec_type_ref(H5I_ATTR) > 0); + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* H5A_term_package() */ @@ -1095,9 +1140,7 @@ H5A__get_create_plist(H5A_t *attr) herr_t H5A__get_info(const H5A_t *attr, H5A_info_t *ainfo) { - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_PACKAGE_NOERR /* Check args */ assert(attr); @@ -1115,7 +1158,7 @@ H5A__get_info(const H5A_t *attr, H5A_info_t *ainfo) ainfo->corder = attr->shared->crt_idx; } /* end else */ - FUNC_LEAVE_NOAPI(ret_value) + FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5A__get_info() */ /*------------------------------------------------------------------------- @@ -1319,13 +1362,14 @@ H5A_oloc(H5A_t *attr) { H5O_loc_t *ret_value = NULL; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(NULL) assert(attr); /* Set return value */ ret_value = &(attr->oloc); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5A_oloc() */ @@ -1346,13 +1390,14 @@ H5A_nameof(H5A_t *attr) { H5G_name_t *ret_value = NULL; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(NULL) assert(attr); /* Set return value */ ret_value = &(attr->path); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5A_nameof() */ @@ -1371,13 +1416,14 @@ H5A_type(const H5A_t *attr) { H5T_t *ret_value = NULL; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(NULL) assert(attr); /* Set return value */ ret_value = attr->shared->dt; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5A_type() */ @@ -1435,6 +1481,7 @@ H5A__exists_by_name(H5G_loc_t loc, const char *obj_name, const char *attr_name, * into table. * * Return: Non-negative on success/Negative on failure + * *------------------------------------------------------------------------- */ static herr_t @@ -1936,7 +1983,7 @@ H5A__get_ainfo(H5F_t *f, H5O_t *oh, H5O_ainfo_t *ainfo) H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ htri_t ret_value = FAIL; /* Return value */ - FUNC_ENTER_NOAPI_TAG(oh->cache_info.addr, FAIL) + FUNC_ENTER_PACKAGE_TAG(oh->cache_info.addr) /* check arguments */ assert(f); diff --git a/src/H5Amodule.h b/src/H5Amodule.h index 42715535367..7e0e2bb76e7 100644 --- a/src/H5Amodule.h +++ b/src/H5Amodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5A_MODULE -#define H5_MY_PKG H5A -#define H5_MY_PKG_ERR H5E_ATTR +#define H5_MY_PKG H5A +#define H5_MY_PKG_ERR H5E_ATTR +#define H5_MY_PKG_INIT YES /** \page H5A_UG HDF5 Attributes * diff --git a/src/H5Apkg.h b/src/H5Apkg.h index 239d7550c46..4c6b35ec34e 100644 --- a/src/H5Apkg.h +++ b/src/H5Apkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Aprivate.h b/src/H5Aprivate.h index 33f0134004f..120cf2789b2 100644 --- a/src/H5Aprivate.h +++ b/src/H5Aprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Apublic.h b/src/H5Apublic.h index 97d3a204cc2..a009e478483 100644 --- a/src/H5Apublic.h +++ b/src/H5Apublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -52,6 +52,8 @@ typedef struct { * indicating failure. The iterator can be restarted at the next * attribute. * + * \callback_note + * * \since 1.8.0 * */ @@ -661,6 +663,8 @@ H5_DLL hid_t H5Aget_type(hid_t attr_id); * \warning Adding or removing attributes to the object during iteration * will lead to undefined behavior. * + * \callback_note + * * \since 1.8.0 * */ @@ -1191,6 +1195,8 @@ H5_DLL int H5Aget_num_attrs(hid_t loc_id); * \warning Adding or removing attributes to the object during iteration * will lead to undefined behavior. * + * \callback_note + * * \version 1.8.0 The function \p H5Aiterate was renamed to H5Aiterate1() * and deprecated in this release. * \since 1.0.0 diff --git a/src/H5Atest.c b/src/H5Atest.c index 141f5110160..0cdb75d2cb6 100644 --- a/src/H5Atest.c +++ b/src/H5Atest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -105,9 +105,10 @@ H5A__is_shared_test(hid_t attr_id) herr_t H5A__get_shared_rc_test(hid_t attr_id, hsize_t *ref_count) { - H5A_t *attr; /* Attribute object for ID */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5A_t *attr; /* Attribute object for ID */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -116,7 +117,7 @@ H5A__get_shared_rc_test(hid_t attr_id, hsize_t *ref_count) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not an attribute"); /* Push API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_ATTR, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; diff --git a/src/H5B.c b/src/H5B.c index 30e39ef71a6..81ba3dfb156 100644 --- a/src/H5B.c +++ b/src/H5B.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -153,6 +153,9 @@ static H5B_t *H5B__copy(const H5B_t *old_bt); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare a free list to manage the haddr_t sequence information */ H5FL_SEQ_DEFINE(haddr_t); @@ -212,7 +215,7 @@ H5B_create(H5F_t *f, const H5B_class_t *type, void *udata, haddr_t *addr_p /*out /* * Allocate file and memory data structures. */ - if (NULL == (bt = H5FL_MALLOC(H5B_t))) + if (NULL == (bt = H5FL_CALLOC(H5B_t))) HGOTO_ERROR(H5E_BTREE, H5E_CANTALLOC, FAIL, "memory allocation failed for B-tree root node"); memset(&bt->cache_info, 0, sizeof(H5AC_info_t)); bt->level = 0; @@ -306,6 +309,7 @@ H5B_find(H5F_t *f, const H5B_class_t *type, haddr_t addr, bool *found, void *uda cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; if (NULL == (bt = (H5B_t *)H5AC_protect(f, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node"); @@ -425,6 +429,7 @@ H5B__split(H5F_t *f, H5B_ins_ud_t *bt_ud, unsigned idx, void *udata, H5B_ins_ud_ cache_udata.f = f; cache_udata.type = shared->type; cache_udata.rc_shared = bt_ud->bt->rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; if (NULL == (split_bt_ud->bt = (H5B_t *)H5AC_protect(f, H5AC_BT, split_bt_ud->addr, &cache_udata, H5AC__NO_FLAGS_SET))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree"); @@ -532,6 +537,7 @@ H5B_insert(H5F_t *f, const H5B_class_t *type, haddr_t addr, void *udata) cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; bt_ud.addr = addr; if (NULL == (bt_ud.bt = (H5B_t *)H5AC_protect(f, H5AC_BT, addr, &cache_udata, H5AC__NO_FLAGS_SET))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to locate root of B-tree"); @@ -789,6 +795,7 @@ H5B__insert_helper(H5F_t *f, H5B_ins_ud_t *bt_ud, const H5B_class_t *type, uint8 cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; if (0 == bt->nchildren) { /* @@ -1045,7 +1052,8 @@ H5B__insert_helper(H5F_t *f, H5B_ins_ud_t *bt_ud, const H5B_class_t *type, uint8 *------------------------------------------------------------------------- */ static herr_t -H5B__iterate_helper(H5F_t *f, const H5B_class_t *type, haddr_t addr, H5B_operator_t op, void *udata) +H5B__iterate_helper(H5F_t *f, const H5B_class_t *type, haddr_t addr, int exp_level, H5B_operator_t op, + void *udata) { H5B_t *bt = NULL; /* Pointer to current B-tree node */ H5UC_t *rc_shared; /* Ref-counted shared info */ @@ -1075,13 +1083,14 @@ H5B__iterate_helper(H5F_t *f, const H5B_class_t *type, haddr_t addr, H5B_operato cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = exp_level; if (NULL == (bt = (H5B_t *)H5AC_protect(f, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5_ITER_ERROR, "unable to load B-tree node"); /* Iterate over node's children */ for (u = 0; u < bt->nchildren && ret_value == H5_ITER_CONT; u++) { if (bt->level > 0) - ret_value = H5B__iterate_helper(f, type, bt->child[u], op, udata); + ret_value = H5B__iterate_helper(f, type, bt->child[u], (int)(bt->level - 1), op, udata); else ret_value = (*op)(f, H5B_NKEY(bt, shared, u), bt->child[u], H5B_NKEY(bt, shared, u + 1), udata); if (ret_value < 0) @@ -1122,7 +1131,7 @@ H5B_iterate(H5F_t *f, const H5B_class_t *type, haddr_t addr, H5B_operator_t op, assert(udata); /* Iterate over the B-tree records */ - if ((ret_value = H5B__iterate_helper(f, type, addr, op, udata)) < 0) + if ((ret_value = H5B__iterate_helper(f, type, addr, H5B_UNKNOWN_NODELEVEL, op, udata)) < 0) HERROR(H5E_BTREE, H5E_BADITER, "B-tree iteration failed"); FUNC_LEAVE_NOAPI(ret_value) @@ -1188,6 +1197,7 @@ H5B__remove_helper(H5F_t *f, haddr_t addr, const H5B_class_t *type, int level, u cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; if (NULL == (bt = (H5B_t *)H5AC_protect(f, H5AC_BT, addr, &cache_udata, H5AC__NO_FLAGS_SET))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, H5B_INS_ERROR, "unable to load B-tree node"); @@ -1540,6 +1550,7 @@ H5B_delete(H5F_t *f, const H5B_class_t *type, haddr_t addr, void *udata) cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; if (NULL == (bt = (H5B_t *)H5AC_protect(f, H5AC_BT, addr, &cache_udata, H5AC__NO_FLAGS_SET))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node"); @@ -1780,6 +1791,7 @@ H5B__get_info_helper(H5F_t *f, const H5B_class_t *type, haddr_t addr, const H5B_ cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; if (NULL == (bt = (H5B_t *)H5AC_protect(f, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to load B-tree node"); @@ -1875,7 +1887,7 @@ H5B_get_info(H5F_t *f, const H5B_class_t *type, haddr_t addr, H5B_info_t *bt_inf /* Iterate over the B-tree records, making any "leaf" callbacks */ /* (Only if operator defined) */ if (op) - if ((ret_value = H5B__iterate_helper(f, type, addr, op, udata)) < 0) + if ((ret_value = H5B__iterate_helper(f, type, addr, H5B_UNKNOWN_NODELEVEL, op, udata)) < 0) HERROR(H5E_BTREE, H5E_BADITER, "B-tree iteration failed"); done: @@ -1921,6 +1933,7 @@ H5B_valid(H5F_t *f, const H5B_class_t *type, haddr_t addr) cache_udata.f = f; cache_udata.type = type; cache_udata.rc_shared = rc_shared; + cache_udata.exp_level = H5B_UNKNOWN_NODELEVEL; if (NULL == (bt = (H5B_t *)H5AC_protect(f, H5AC_BT, addr, &cache_udata, H5AC__READ_ONLY_FLAG))) HGOTO_ERROR(H5E_BTREE, H5E_CANTPROTECT, FAIL, "unable to protect B-tree node"); diff --git a/src/H5B2.c b/src/H5B2.c index d3eceff756e..82e58243f75 100644 --- a/src/H5B2.c +++ b/src/H5B2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -59,6 +59,9 @@ /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* v2 B-tree client ID to class mapping */ /* Remember to add client ID to H5B2_subid_t in H5B2private.h when adding a new diff --git a/src/H5B2cache.c b/src/H5B2cache.c index c78b54c33f5..3f2b52b57ad 100644 --- a/src/H5B2cache.c +++ b/src/H5B2cache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5B2dbg.c b/src/H5B2dbg.c index 0977a4c96d2..0c1600b3070 100644 --- a/src/H5B2dbg.c +++ b/src/H5B2dbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5B2hdr.c b/src/H5B2hdr.c index f46b1d0820a..1a966edac73 100644 --- a/src/H5B2hdr.c +++ b/src/H5B2hdr.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -404,7 +404,7 @@ H5B2__hdr_decr(H5B2_hdr_t *hdr) herr_t H5B2__hdr_fuse_incr(H5B2_hdr_t *hdr) { - FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_ENTER_PACKAGE_NOERR /* Sanity check */ assert(hdr); @@ -427,7 +427,7 @@ H5B2__hdr_fuse_incr(H5B2_hdr_t *hdr) size_t H5B2__hdr_fuse_decr(H5B2_hdr_t *hdr) { - FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_ENTER_PACKAGE_NOERR /* Sanity check */ assert(hdr); diff --git a/src/H5B2int.c b/src/H5B2int.c index 0174b527879..74d431d63d7 100644 --- a/src/H5B2int.c +++ b/src/H5B2int.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1847,7 +1847,7 @@ H5B2__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* Sanity check */ assert(parent_entry); @@ -2006,7 +2006,7 @@ H5B2__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* Sanity check */ assert(parent_entry); diff --git a/src/H5B2internal.c b/src/H5B2internal.c index 82e686a9569..00f163d6a08 100644 --- a/src/H5B2internal.c +++ b/src/H5B2internal.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5B2leaf.c b/src/H5B2leaf.c index 3351909484c..8fffb8193c1 100644 --- a/src/H5B2leaf.c +++ b/src/H5B2leaf.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5B2module.h b/src/H5B2module.h index 8eaea2f266d..d29a54d3f04 100644 --- a/src/H5B2module.h +++ b/src/H5B2module.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5B2_MODULE -#define H5_MY_PKG H5B2 -#define H5_MY_PKG_ERR H5E_BTREE +#define H5_MY_PKG H5B2 +#define H5_MY_PKG_ERR H5E_BTREE +#define H5_MY_PKG_INIT NO #endif /* H5B2module_H */ diff --git a/src/H5B2pkg.h b/src/H5B2pkg.h index d60e1ac0c85..3f636b8f6b8 100644 --- a/src/H5B2pkg.h +++ b/src/H5B2pkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5B2private.h b/src/H5B2private.h index bf06a8bd846..1a8d5fb0eb0 100644 --- a/src/H5B2private.h +++ b/src/H5B2private.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5B2stat.c b/src/H5B2stat.c index 52af55417b5..5a478ec6e2f 100644 --- a/src/H5B2stat.c +++ b/src/H5B2stat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5B2test.c b/src/H5B2test.c index 4a5a325b031..f295bc6b622 100644 --- a/src/H5B2test.c +++ b/src/H5B2test.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -417,7 +417,7 @@ H5B2__test2_debug(FILE *stream, int indent, int fwidth, const void *record, cons herr_t H5B2__get_root_addr_test(H5B2_t *bt2, haddr_t *root_addr) { - FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_ENTER_PACKAGE_NOERR /* Check arguments. */ assert(bt2); diff --git a/src/H5Bcache.c b/src/H5Bcache.c index 0b1010ba832..a832425c78b 100644 --- a/src/H5Bcache.c +++ b/src/H5Bcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -170,6 +170,11 @@ H5B__cache_deserialize(const void *_image, size_t len, void *_udata, bool H5_ATT HGOTO_ERROR(H5E_BTREE, H5E_CANTLOAD, NULL, "incorrect B-tree node type"); bt->level = *image++; + /* Check in case of level is corrupted, if expected level is known */ + if (udata->exp_level != H5B_UNKNOWN_NODELEVEL) + if (bt->level != (unsigned)udata->exp_level) + HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "level is not as expected, possibly corrupted"); + /* Entries used */ if (H5_IS_BUFFER_OVERFLOW(image, 2, p_end)) HGOTO_ERROR(H5E_BTREE, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding"); @@ -179,12 +184,6 @@ H5B__cache_deserialize(const void *_image, size_t len, void *_udata, bool H5_ATT if (bt->nchildren > shared->two_k) HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, "number of children is greater than maximum"); - /* Check in case of level is corrupted, it is unreasonable for level to be - larger than the number of entries */ - if (bt->level > bt->nchildren) - HGOTO_ERROR(H5E_BTREE, H5E_BADVALUE, NULL, - "level cannot be greater than the number of children, possibly corrupted"); - /* Sibling pointers */ if (H5_IS_BUFFER_OVERFLOW(image, H5F_sizeof_addr(udata->f), p_end)) HGOTO_ERROR(H5E_BTREE, H5E_OVERFLOW, NULL, "ran off end of input buffer while decoding"); diff --git a/src/H5Bdbg.c b/src/H5Bdbg.c index 6bbda059320..d6d6abc2ee4 100644 --- a/src/H5Bdbg.c +++ b/src/H5Bdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Bmodule.h b/src/H5Bmodule.h index 0ded7562a7f..ed7c14b6b96 100644 --- a/src/H5Bmodule.h +++ b/src/H5Bmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5B_MODULE -#define H5_MY_PKG H5B -#define H5_MY_PKG_ERR H5E_BTREE +#define H5_MY_PKG H5B +#define H5_MY_PKG_ERR H5E_BTREE +#define H5_MY_PKG_INIT NO #endif /* H5Bmodule_H */ diff --git a/src/H5Bpkg.h b/src/H5Bpkg.h index d1ad647ae7d..b56a6f3a7e9 100644 --- a/src/H5Bpkg.h +++ b/src/H5Bpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -39,6 +39,11 @@ /* # of bits for node level: 1 byte */ #define LEVEL_BITS 8 +/* Indicates that the level of the current node is unknown. When the level + * is known, it can be used to detect corrupted level during decoding + */ +#define H5B_UNKNOWN_NODELEVEL -1 + /****************************/ /* Package Private Typedefs */ /****************************/ @@ -60,6 +65,7 @@ typedef struct H5B_t { typedef struct H5B_cache_ud_t { H5F_t *f; /* File that B-tree node is within */ const struct H5B_class_t *type; /* Type of tree */ + int exp_level; /* Expected level of the current node */ H5UC_t *rc_shared; /* Ref-counted shared info */ } H5B_cache_ud_t; diff --git a/src/H5Bprivate.h b/src/H5Bprivate.h index f354dea2ac0..22bcaf53aee 100644 --- a/src/H5Bprivate.h +++ b/src/H5Bprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5C.c b/src/H5C.c index 44d499df964..66de1c5e3a5 100644 --- a/src/H5C.c +++ b/src/H5C.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -84,6 +84,9 @@ /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare a free list to manage the tag info struct */ H5FL_DEFINE(H5C_tag_info_t); diff --git a/src/H5CX.c b/src/H5CX.c index dbcb49e2e6b..78892aacbd4 100644 --- a/src/H5CX.c +++ b/src/H5CX.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -60,41 +60,43 @@ /* Check if the property list is already available */ \ if (NULL == (*head)->ctx.PL) \ /* Get the property list pointer */ \ - if (NULL == ((*head)->ctx.PL = (H5P_genplist_t *)H5I_object((*head)->ctx.H5_GLUE(PL, _id)))) \ + if (H5_UNLIKELY(NULL == \ + ((*head)->ctx.PL = (H5P_genplist_t *)H5I_object((*head)->ctx.H5_GLUE(PL, _id))))) \ HGOTO_ERROR(H5E_CONTEXT, H5E_BADTYPE, (FAILVAL), "can't get property list"); /* Common macro for the duplicated code to retrieve properties from a property list */ #define H5CX_RETRIEVE_PROP_COMMON(PL, DEF_PL, PROP_NAME, PROP_FIELD) \ - /* Check for default property list */ \ - if ((*head)->ctx.H5_GLUE(PL, _id) == (DEF_PL)) \ - H5MM_memcpy(&(*head)->ctx.PROP_FIELD, &H5_GLUE3(H5CX_def_, PL, _cache).PROP_FIELD, \ - sizeof(H5_GLUE3(H5CX_def_, PL, _cache).PROP_FIELD)); \ - else { \ - /* Retrieve the property list */ \ - H5CX_RETRIEVE_PLIST(PL, FAIL) \ + { \ + \ + /* Check for default property list */ \ + if ((*head)->ctx.H5_GLUE(PL, _id) == (DEF_PL)) \ + H5MM_memcpy(&(*head)->ctx.PROP_FIELD, &H5_GLUE3(H5CX_def_, PL, _cache).PROP_FIELD, \ + sizeof(H5_GLUE3(H5CX_def_, PL, _cache).PROP_FIELD)); \ + else { \ + /* Retrieve the property list */ \ + H5CX_RETRIEVE_PLIST(PL, FAIL) \ \ - /* Get the property */ \ - if (H5P_get((*head)->ctx.PL, (PROP_NAME), &(*head)->ctx.PROP_FIELD) < 0) \ - HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "can't retrieve value from API context"); \ - } /* end else */ \ + /* Get the property */ \ + if (H5_UNLIKELY(H5P_get((*head)->ctx.PL, (PROP_NAME), &(*head)->ctx.PROP_FIELD) < 0)) \ + HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "can't retrieve value from API context"); \ + } /* end else */ \ \ - /* Mark the field as valid */ \ - (*head)->ctx.H5_GLUE(PROP_FIELD, _valid) = true; + /* Mark the field as valid */ \ + (*head)->ctx.H5_GLUE(PROP_FIELD, _valid) = true; \ + } /* Macro for the duplicated code to retrieve a value from a plist if the context value is invalid */ #define H5CX_RETRIEVE_PROP_VALID(PL, DEF_PL, PROP_NAME, PROP_FIELD) \ /* Check if the value has been retrieved already */ \ - if (!(*head)->ctx.H5_GLUE(PROP_FIELD, _valid)) { \ - H5CX_RETRIEVE_PROP_COMMON(PL, DEF_PL, PROP_NAME, PROP_FIELD) \ - } /* end if */ + if (!(*head)->ctx.H5_GLUE(PROP_FIELD, _valid)) \ + H5CX_RETRIEVE_PROP_COMMON(PL, DEF_PL, PROP_NAME, PROP_FIELD) /* Macro for the duplicated code to retrieve a value from a plist if the context value is invalid, or the * library has previously modified the context value for return */ #define H5CX_RETRIEVE_PROP_VALID_SET(PL, DEF_PL, PROP_NAME, PROP_FIELD) \ /* Check if the value has been retrieved already */ \ - if (!((*head)->ctx.H5_GLUE(PROP_FIELD, _valid) || (*head)->ctx.H5_GLUE(PROP_FIELD, _set))) { \ - H5CX_RETRIEVE_PROP_COMMON(PL, DEF_PL, PROP_NAME, PROP_FIELD) \ - } /* end if */ + if (!((*head)->ctx.H5_GLUE(PROP_FIELD, _valid) || (*head)->ctx.H5_GLUE(PROP_FIELD, _set))) \ + H5CX_RETRIEVE_PROP_COMMON(PL, DEF_PL, PROP_NAME, PROP_FIELD) #if defined(H5_HAVE_PARALLEL) && defined(H5_HAVE_INSTRUMENTED_LIBRARY) /* Macro for the duplicated code to set a context field that may not exist as a property */ @@ -107,7 +109,7 @@ /* Retrieve the dataset transfer property list */ \ H5CX_RETRIEVE_PLIST(dxpl, FAIL) \ \ - if ((check_prop = H5P_exist_plist((*head)->ctx.dxpl, PROP_NAME)) < 0) \ + if (H5_UNLIKELY((check_prop = H5P_exist_plist((*head)->ctx.dxpl, PROP_NAME)) < 0)) \ HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "error checking for property"); \ } /* end if */ \ \ @@ -124,247 +126,17 @@ #define H5CX_SET_PROP(PROP_NAME, PROP_FIELD) \ if ((*head)->ctx.H5_GLUE(PROP_FIELD, _set)) { \ /* Retrieve the dataset transfer property list */ \ - H5CX_RETRIEVE_PLIST(dxpl, NULL) \ + H5CX_RETRIEVE_PLIST(dxpl, FAIL) \ \ /* Set the property */ \ - if (H5P_set((*head)->ctx.dxpl, PROP_NAME, &(*head)->ctx.PROP_FIELD) < 0) \ - HGOTO_ERROR(H5E_CONTEXT, H5E_CANTSET, NULL, "error setting data xfer property"); \ + if (H5_UNLIKELY(H5P_set((*head)->ctx.dxpl, PROP_NAME, &(*head)->ctx.PROP_FIELD) < 0)) \ + HGOTO_ERROR(H5E_CONTEXT, H5E_CANTSET, FAIL, "error setting data xfer property"); \ } /* end if */ /******************/ /* Local Typedefs */ /******************/ -/* Typedef for context about each API call, as it proceeds */ -/* Fields in this struct are of several types: - * - The DXPL & LAPL ID are either library default ones (from the API context - * initialization) or passed in from the application via an API call - * parameter. The corresponding H5P_genplist_t* is just the underlying - * property list struct for the ID, to optimize retrieving properties - * from the list multiple times. - * - * - Internal fields, used and set only within the library, for managing the - * operation under way. These do not correspond to properties in the - * DXPL or LAPL and can have any name. - * - * - Cached fields, which are not returned to the application, for managing - * the operation under way. These correspond to properties in the DXPL - * or LAPL, and are retrieved either from the (global) cache for a - * default property list, or from the corresponding property in the - * application's (non-default) property list. Getting / setting these - * properties within the library does _not_ affect the application's - * property list. Note that the naming of these fields, and - * _valid, is important for the H5CX_RETRIEVE_PROP_VALID - * macro to work properly. - * - * - "Return-only" properties that are returned to the application, mainly - * for sending out "introspection" information ("Why did collective I/O - * get broken for this operation?", "Which filters are set on the chunk I - * just directly read in?", etc) Setting these fields will cause the - * corresponding property in the property list to be set when the API - * context is popped, when returning from the API routine. Note that the - * naming of these fields, and _set, is important for the - * H5CX_TEST_SET_PROP and H5CX_SET_PROP macros to work properly. - * - * - "Return-and-read" properties that are returned to the application to send out introspection information, - * but are also queried by the library internally. If the context value has been 'set' by an accessor, - * all future queries will return the stored value from the context, to avoid later queries overwriting - * that stored value with the value from the property list. - * - * These properties have both a 'valid' and 'set' flag. _valid is true if the field has ever been - * populated from its underlying property list. _set flag is true if this field has ever been set on - * the context for application introspection. The naming of these fields is important for the - * H5CX_RETRIEVE_PROP_VALID_SET macro to work properly. - * - * If a field has been set on the context but never read internally, _valid will be false - * despite the context containing a meaningful cached value. - */ -typedef struct H5CX_t { - /* DXPL */ - hid_t dxpl_id; /* DXPL ID for API operation */ - H5P_genplist_t *dxpl; /* Dataset Transfer Property List */ - - /* LCPL */ - hid_t lcpl_id; /* LCPL ID for API operation */ - H5P_genplist_t *lcpl; /* Link Creation Property List */ - - /* LAPL */ - hid_t lapl_id; /* LAPL ID for API operation */ - H5P_genplist_t *lapl; /* Link Access Property List */ - - /* DCPL */ - hid_t dcpl_id; /* DCPL ID for API operation */ - H5P_genplist_t *dcpl; /* Dataset Creation Property List */ - - /* DAPL */ - hid_t dapl_id; /* DAPL ID for API operation */ - H5P_genplist_t *dapl; /* Dataset Access Property List */ - - /* FAPL */ - hid_t fapl_id; /* FAPL ID for API operation */ - H5P_genplist_t *fapl; /* File Access Property List */ - - /* Internal: Object tagging info */ - haddr_t tag; /* Current object's tag (ohdr chunk #0 address) */ - - /* Internal: Metadata cache info */ - H5AC_ring_t ring; /* Current metadata cache ring for entries */ - -#ifdef H5_HAVE_PARALLEL - /* Internal: Parallel I/O settings */ - bool coll_metadata_read; /* Whether to use collective I/O for metadata read */ - MPI_Datatype btype; /* MPI datatype for buffer, when using collective I/O */ - MPI_Datatype ftype; /* MPI datatype for file, when using collective I/O */ - bool mpi_file_flushing; /* Whether an MPI-opened file is being flushed */ - bool rank0_bcast; /* Whether a dataset meets read-with-rank0-and-bcast requirements */ -#endif /* H5_HAVE_PARALLEL */ - - /* Cached DXPL properties */ - size_t max_temp_buf; /* Maximum temporary buffer size (H5D_XFER_MAX_TEMP_BUF_NAME) .*/ - bool max_temp_buf_valid; /* Whether maximum temporary buffer size is valid */ - void *tconv_buf; /* Temporary conversion buffer (H5D_XFER_TCONV_BUF_NAME) */ - bool tconv_buf_valid; /* Whether temporary conversion buffer is valid */ - void *bkgr_buf; /* Background conversion buffer (H5D_XFER_BKGR_BUF_NAME) */ - bool bkgr_buf_valid; /* Whether background conversion buffer is valid */ - H5T_bkg_t bkgr_buf_type; /* Background buffer type (H5D_XFER_BKGR_BUF_TYPE_NAME) */ - bool bkgr_buf_type_valid; /* Whether background buffer type is valid */ - double btree_split_ratio[3]; /* B-tree split ratios (H5D_XFER_BTREE_SPLIT_RATIO_NAME) */ - bool btree_split_ratio_valid; /* Whether B-tree split ratios are valid */ - size_t vec_size; /* Size of hyperslab vector (H5D_XFER_HYPER_VECTOR_SIZE_NAME) */ - bool vec_size_valid; /* Whether hyperslab vector is valid */ -#ifdef H5_HAVE_PARALLEL - H5FD_mpio_xfer_t io_xfer_mode; /* Parallel transfer mode for this request (H5D_XFER_IO_XFER_MODE_NAME) */ - bool io_xfer_mode_valid; /* Whether parallel transfer mode is valid */ - H5FD_mpio_collective_opt_t mpio_coll_opt; /* Parallel transfer with independent IO or collective IO with - this mode (H5D_XFER_MPIO_COLLECTIVE_OPT_NAME) */ - bool mpio_coll_opt_valid; /* Whether parallel transfer option is valid */ - H5FD_mpio_chunk_opt_t - mpio_chunk_opt_mode; /* Collective chunk option (H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME) */ - bool mpio_chunk_opt_mode_valid; /* Whether collective chunk option is valid */ - unsigned mpio_chunk_opt_num; /* Collective chunk threshold (H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME) */ - bool mpio_chunk_opt_num_valid; /* Whether collective chunk threshold is valid */ - unsigned mpio_chunk_opt_ratio; /* Collective chunk ratio (H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME) */ - bool mpio_chunk_opt_ratio_valid; /* Whether collective chunk ratio is valid */ -#endif /* H5_HAVE_PARALLEL */ - H5Z_EDC_t err_detect; /* Error detection info (H5D_XFER_EDC_NAME) */ - bool err_detect_valid; /* Whether error detection info is valid */ - H5Z_cb_t filter_cb; /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */ - bool filter_cb_valid; /* Whether filter callback function is valid */ - H5Z_data_xform_t *data_transform; /* Data transform info (H5D_XFER_XFORM_NAME) */ - bool data_transform_valid; /* Whether data transform info is valid */ - H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */ - bool vl_alloc_info_valid; /* Whether VL datatype alloc info is valid */ - H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */ - bool dt_conv_cb_valid; /* Whether datatype conversion struct is valid */ - H5D_selection_io_mode_t selection_io_mode; /* Selection I/O mode (H5D_XFER_SELECTION_IO_MODE_NAME) */ - bool selection_io_mode_valid; /* Whether selection I/O mode is valid */ - bool modify_write_buf; /* Whether the library can modify write buffers (H5D_XFER_MODIFY_WRITE_BUF_NAME)*/ - bool modify_write_buf_valid; /* Whether the modify_write_buf field is valid */ - - /* Return-only DXPL properties to return to application */ -#ifdef H5_HAVE_PARALLEL - H5D_mpio_actual_chunk_opt_mode_t mpio_actual_chunk_opt; /* Chunk optimization mode used for parallel I/O - (H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME) */ - bool mpio_actual_chunk_opt_set; /* Whether chunk optimization mode used for parallel I/O is set */ - H5D_mpio_actual_io_mode_t - mpio_actual_io_mode; /* Actual I/O mode used for parallel I/O (H5D_MPIO_ACTUAL_IO_MODE_NAME) */ - bool mpio_actual_io_mode_set; /* Whether actual I/O mode used for parallel I/O is set */ - uint32_t mpio_local_no_coll_cause; /* Local reason for breaking collective I/O - (H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME) */ - bool mpio_local_no_coll_cause_set; /* Whether local reason for breaking collective I/O is set */ - bool mpio_local_no_coll_cause_valid; /* Whether local reason for breaking collective I/O is valid */ - uint32_t mpio_global_no_coll_cause; /* Global reason for breaking collective I/O - (H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME) */ - bool mpio_global_no_coll_cause_set; /* Whether global reason for breaking collective I/O is set */ - bool mpio_global_no_coll_cause_valid; /* Whether global reason for breaking collective I/O is valid */ -#ifdef H5_HAVE_INSTRUMENTED_LIBRARY - int mpio_coll_chunk_link_hard; /* Instrumented "collective chunk link hard" value - (H5D_XFER_COLL_CHUNK_LINK_HARD_NAME) */ - bool mpio_coll_chunk_link_hard_set; /* Whether instrumented "collective chunk link hard" value is set */ - int mpio_coll_chunk_multi_hard; /* Instrumented "collective chunk multi hard" value - (H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME) */ - bool mpio_coll_chunk_multi_hard_set; /* Whether instrumented "collective chunk multi hard" value is set */ - int mpio_coll_chunk_link_num_true; /* Instrumented "collective chunk link num true" value - (H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME) */ - bool mpio_coll_chunk_link_num_true_set; /* Whether instrumented "collective chunk link num true" value - is set */ - int mpio_coll_chunk_link_num_false; /* Instrumented "collective chunk link num false" value - (H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME) */ - bool mpio_coll_chunk_link_num_false_set; /* Whether instrumented "collective chunk link num false" - value is set */ - int mpio_coll_chunk_multi_ratio_coll; /* Instrumented "collective chunk multi ratio coll" value - (H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME) */ - bool mpio_coll_chunk_multi_ratio_coll_set; /* Whether instrumented "collective chunk multi ratio coll" - value is set */ - int mpio_coll_chunk_multi_ratio_ind; /* Instrumented "collective chunk multi ratio ind" value - (H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME) */ - bool mpio_coll_chunk_multi_ratio_ind_set; /* Whether instrumented "collective chunk multi ratio ind" - value is set */ - bool mpio_coll_rank0_bcast; /* Instrumented "collective rank 0 broadcast" value - (H5D_XFER_COLL_RANK0_BCAST_NAME) */ - bool mpio_coll_rank0_bcast_set; /* Whether instrumented "collective rank 0 broadcast" value is set */ -#endif /* H5_HAVE_INSTRUMENTED_LIBRARY */ -#endif /* H5_HAVE_PARALLEL */ - uint32_t no_selection_io_cause; /* Reason for not performing selection I/O - (H5D_XFER_NO_SELECTION_IO_CAUSE_NAME) */ - bool no_selection_io_cause_set; /* Whether reason for not performing selection I/O is set */ - bool no_selection_io_cause_valid; /* Whether reason for not performing selection I/O is valid */ - - uint32_t actual_selection_io_mode; /* Actual selection I/O mode used - (H5D_XFER_ACTUAL_SELECTION_IO_MODE_NAME) */ - bool actual_selection_io_mode_set; /* Whether actual selection I/O mode is set */ - bool actual_selection_io_mode_valid; /* Whether actual selection I/O mode is valid */ - - /* Cached LCPL properties */ - H5T_cset_t encoding; /* Link name character encoding (H5P_STRCRT_CHAR_ENCODING_NAME) */ - bool encoding_valid; /* Whether link name character encoding is valid */ - unsigned intermediate_group; /* Whether to create intermediate groups (H5L_CRT_INTERMEDIATE_GROUP_NAME) */ - bool intermediate_group_valid; /* Whether create intermediate group flag is valid */ - - /* Cached LAPL properties */ - size_t nlinks; /* Number of soft / UD links to traverse (H5L_ACS_NLINKS_NAME) */ - bool nlinks_valid; /* Whether number of soft / UD links to traverse is valid */ - - /* Cached DCPL properties */ - bool do_min_dset_ohdr; /* Whether to minimize dataset object header (H5D_CRT_MIN_DSET_HDR_SIZE_NAME) */ - bool do_min_dset_ohdr_valid; /* Whether minimize dataset object header flag is valid */ - uint8_t ohdr_flags; /* Object header flags (H5O_CRT_OHDR_FLAGS_NAME) */ - bool ohdr_flags_valid; /* Whether the object headers flags are valid */ - - /* Cached DAPL properties */ - const char *extfile_prefix; /* Prefix for external file (H5D_ACS_EFILE_PREFIX_NAME) */ - bool extfile_prefix_valid; /* Whether the prefix for external file is valid */ - const char *vds_prefix; /* Prefix for VDS (H5D_ACS_VDS_PREFIX_NAME) */ - bool vds_prefix_valid; /* Whether the prefix for VDS is valid */ - - /* Cached FAPL properties */ - H5F_libver_t low_bound; /* low_bound property for H5Pset_libver_bounds() - (H5F_ACS_LIBVER_LOW_BOUND_NAME) */ - bool low_bound_valid; /* Whether low_bound property is valid */ - H5F_libver_t high_bound; /* high_bound property for H5Pset_libver_bounds - (H5F_ACS_LIBVER_HIGH_BOUND_NAME) */ - bool high_bound_valid; /* Whether high_bound property is valid */ - - /* Cached VOL settings */ - H5VL_connector_prop_t vol_connector_prop; /* Property for VOL connector ID & info - This is treated as an independent field with - no relation to the property H5F_ACS_VOL_CONN_NAME stored on the FAPL */ - bool vol_connector_prop_valid; /* Whether property for VOL connector ID & info is valid */ - void *vol_wrap_ctx; /* VOL connector's "wrap context" for creating IDs */ - bool vol_wrap_ctx_valid; /* Whether VOL connector's "wrap context" for creating IDs is valid */ -} H5CX_t; - -/* Typedef for nodes on the API context stack */ -/* Each entry into the library through an API routine invokes H5CX_push() - * in a FUNC_ENTER_API* macro, which pushes an H5CX_node_t on the API - * context [thread-local] stack, after initializing it with default values - * in H5CX__push_common(). - */ -typedef struct H5CX_node_t { - H5CX_t ctx; /* Context for current API call */ - struct H5CX_node_t *next; /* Pointer to previous context, on stack */ -} H5CX_node_t; - /* Typedef for cached default dataset transfer property list information */ /* This is initialized to the values in the default DXPL during package * initialization and then remains constant for the rest of the library's @@ -442,13 +214,14 @@ typedef struct H5CX_fapl_cache_t { /********************/ /* Local Prototypes */ /********************/ -static void H5CX__push_common(H5CX_node_t *cnode); -static H5CX_node_t *H5CX__pop_common(bool update_dxpl_props); /*********************/ /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*******************/ /* Local Variables */ /*******************/ @@ -475,23 +248,21 @@ static H5CX_dapl_cache_t H5CX_def_dapl_cache; /* Define a "default" file access property list cache structure to use for default FAPLs */ static H5CX_fapl_cache_t H5CX_def_fapl_cache; -/* Declare a static free list to manage H5CX_node_t structs */ -H5FL_DEFINE_STATIC(H5CX_node_t); - /* Declare a static free list to manage H5CX_state_t structs */ H5FL_DEFINE_STATIC(H5CX_state_t); -/*------------------------------------------------------------------------- - * Function: H5CX_init - * - * Purpose: Initialize the interface from some other layer. - * - * Return: Success: non-negative - * Failure: negative - *------------------------------------------------------------------------- - */ +/*-------------------------------------------------------------------------- +NAME + H5CX__init_package -- Initialize interface-specific information +USAGE + herr_t H5CX__init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------*/ herr_t -H5CX_init(void) +H5CX__init_package(void) { H5P_genplist_t *dx_plist; /* Data transfer property list */ H5P_genplist_t *lc_plist; /* Link creation property list */ @@ -501,7 +272,7 @@ H5CX_init(void) H5P_genplist_t *fa_plist; /* File access property list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Reset the "default DXPL cache" information */ memset(&H5CX_def_dxpl_cache, 0, sizeof(H5CX_dxpl_cache_t)); @@ -685,9 +456,10 @@ H5CX_init(void) if (H5P_get(fa_plist, H5F_ACS_LIBVER_HIGH_BOUND_NAME, &H5CX_def_fapl_cache.high_bound) < 0) HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "Can't retrieve dataset minimize flag"); + done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5CX__init_package() */ /*------------------------------------------------------------------------- * Function: H5CX_term_package @@ -705,19 +477,18 @@ H5CX_term_package(void) { FUNC_ENTER_NOAPI_NOINIT_NOERR - H5CX_node_t *cnode; /* Context node */ + if (H5_PKG_INIT_VAR) { + H5CX_node_t **head = NULL; /* Pointer to head of API context list */ - /* Pop the top context node from the stack */ - /* (Can't check for errors, as rest of library is shut down) */ - cnode = H5CX__pop_common(false); + /* Get the pointer to the head of the API context, for this thread */ + head = H5CX_get_my_context(); + assert(head); - /* Free the context node */ - /* (Allocated with malloc() in H5CX_push_special() ) */ - free(cnode); + /* Reset head of context list */ + *head = NULL; -#ifndef H5_HAVE_THREADSAFE - H5CX_head_g = NULL; -#endif /* H5_HAVE_THREADSAFE */ + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(0) } /* end H5CX_term_package() */ @@ -734,31 +505,36 @@ H5CX_term_package(void) bool H5CX_pushed(void) { - H5CX_node_t **head = NULL; /* Pointer to head of API context list */ + H5CX_node_t **head = NULL; /* Pointer to head of API context list */ + bool is_pushed = false; /* Flag to indicate context is pushed */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI_NOINIT_NOERR head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ assert(head); - FUNC_LEAVE_NOAPI(*head != NULL); + /* Set return value */ + is_pushed = (*head != NULL); + + FUNC_LEAVE_NOAPI(is_pushed) } /*------------------------------------------------------------------------- - * Function: H5CX__push_common + * Function: H5CX_push * - * Purpose: Internal routine to push a context for an API call. + * Purpose: Pushes a context for an API call. * * Return: Non-negative on success / Negative on failure * *------------------------------------------------------------------------- */ -static void -H5CX__push_common(H5CX_node_t *cnode) +herr_t +H5CX_push(H5CX_node_t *cnode) { - H5CX_node_t **head = NULL; /* Pointer to head of API context list */ + H5CX_node_t **head = NULL; /* Pointer to head of API context list */ + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_PACKAGE_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ assert(cnode); @@ -784,65 +560,10 @@ H5CX__push_common(H5CX_node_t *cnode) cnode->next = *head; *head = cnode; - FUNC_LEAVE_NOAPI_VOID -} /* end H5CX__push_common() */ - -/*------------------------------------------------------------------------- - * Function: H5CX_push - * - * Purpose: Pushes a context for an API call. - * - * Return: Non-negative on success / Negative on failure - * - *------------------------------------------------------------------------- - */ -herr_t -H5CX_push(void) -{ - H5CX_node_t *cnode = NULL; /* Context node */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Allocate & clear API context node */ - if (NULL == (cnode = H5FL_CALLOC(H5CX_node_t))) - HGOTO_ERROR(H5E_CONTEXT, H5E_CANTALLOC, FAIL, "unable to allocate new struct"); - - /* Set context info */ - H5CX__push_common(cnode); - done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_push() */ -/*------------------------------------------------------------------------- - * Function: H5CX_push_special - * - * Purpose: Pushes a context for an API call, without using library routines. - * - * Note: This should only be called in special circumstances, like H5close. - * - * Return: - * - *------------------------------------------------------------------------- - */ -void -H5CX_push_special(void) -{ - H5CX_node_t *cnode = NULL; /* Context node */ - - FUNC_ENTER_NOAPI_NOINIT_NOERR - - /* Allocate & clear API context node, without using library API routines */ - cnode = (H5CX_node_t *)calloc(1, sizeof(H5CX_node_t)); - assert(cnode); - - /* Set context info */ - H5CX__push_common(cnode); - - FUNC_LEAVE_NOAPI_VOID -} /* end H5CX_push_special() */ - /*------------------------------------------------------------------------- * Function: H5CX_retrieve_state * @@ -1196,7 +917,7 @@ H5CX_set_libver_bounds(H5F_t *f) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -1210,6 +931,7 @@ H5CX_set_libver_bounds(H5F_t *f) (*head)->ctx.low_bound_valid = true; (*head)->ctx.high_bound_valid = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_libver_bounds() */ @@ -1458,7 +1180,7 @@ H5CX_set_vol_wrap_ctx(void *vol_wrap_ctx) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -1470,6 +1192,7 @@ H5CX_set_vol_wrap_ctx(void *vol_wrap_ctx) /* Mark the value as valid */ (*head)->ctx.vol_wrap_ctx_valid = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_vol_wrap_ctx() */ @@ -1488,7 +1211,7 @@ H5CX_set_vol_connector_prop(const H5VL_connector_prop_t *vol_connector_prop) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -1500,6 +1223,7 @@ H5CX_set_vol_connector_prop(const H5VL_connector_prop_t *vol_connector_prop) /* Mark the value as valid */ (*head)->ctx.vol_connector_prop_valid = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_vol_connector_prop() */ @@ -1613,7 +1337,7 @@ H5CX_get_vol_connector_prop(H5VL_connector_prop_t *vol_connector_prop) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ assert(vol_connector_prop); @@ -1627,6 +1351,7 @@ H5CX_get_vol_connector_prop(H5VL_connector_prop_t *vol_connector_prop) else memset(vol_connector_prop, 0, sizeof(H5VL_connector_prop_t)); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_get_vol_connector_prop() */ @@ -1729,7 +1454,7 @@ H5CX_get_mpi_coll_datatypes(MPI_Datatype *btype, MPI_Datatype *ftype) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ assert(btype); @@ -1741,6 +1466,7 @@ H5CX_get_mpi_coll_datatypes(MPI_Datatype *btype, MPI_Datatype *ftype) *btype = (*head)->ctx.btype; *ftype = (*head)->ctx.ftype; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_get_mpi_coll_datatypes() */ @@ -2948,11 +2674,10 @@ H5CX_set_coll_metadata_read(bool cmdr) herr_t H5CX_set_mpi_coll_datatypes(MPI_Datatype btype, MPI_Datatype ftype) { - H5CX_node_t **head = NULL; /* Pointer to head of API context list */ - - herr_t ret_value = SUCCEED; /* Return value */ + H5CX_node_t **head = NULL; /* Pointer to head of API context list */ + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -2962,6 +2687,7 @@ H5CX_set_mpi_coll_datatypes(MPI_Datatype btype, MPI_Datatype ftype) (*head)->ctx.btype = btype; (*head)->ctx.ftype = ftype; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_mpi_coll_datatypes() */ @@ -2980,7 +2706,7 @@ H5CX_set_io_xfer_mode(H5FD_mpio_xfer_t io_xfer_mode) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -2992,6 +2718,7 @@ H5CX_set_io_xfer_mode(H5FD_mpio_xfer_t io_xfer_mode) /* Mark the value as valid */ (*head)->ctx.io_xfer_mode_valid = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_io_xfer_mode() */ @@ -3010,7 +2737,7 @@ H5CX_set_mpio_coll_opt(H5FD_mpio_collective_opt_t mpio_coll_opt) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -3022,6 +2749,7 @@ H5CX_set_mpio_coll_opt(H5FD_mpio_collective_opt_t mpio_coll_opt) /* Mark the value as valid */ (*head)->ctx.mpio_coll_opt_valid = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_mpio_coll_opt() */ @@ -3092,7 +2820,7 @@ H5CX_set_vlen_alloc_info(H5MM_allocate_t alloc_func, void *alloc_info, H5MM_free H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -3107,6 +2835,7 @@ H5CX_set_vlen_alloc_info(H5MM_allocate_t alloc_func, void *alloc_info, H5MM_free /* Mark the value as valid */ (*head)->ctx.vl_alloc_info_valid = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_vlen_alloc_info() */ @@ -3125,7 +2854,7 @@ H5CX_set_nlinks(size_t nlinks) H5CX_node_t **head = NULL; /* Pointer to head of API context list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -3137,6 +2866,7 @@ H5CX_set_nlinks(size_t nlinks) /* Mark the value as valid */ (*head)->ctx.nlinks_valid = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5CX_set_nlinks() */ @@ -3574,21 +3304,21 @@ H5CX_get_ohdr_flags(uint8_t *ohdr_flags) } /* End H5CX_get_ohdr_flags() */ /*------------------------------------------------------------------------- - * Function: H5CX__pop_common + * Function: H5CX_pop * - * Purpose: Common code for popping the context for an API call. + * Purpose: Pops the context for an API call. * * Return: Non-negative on success / Negative on failure * *------------------------------------------------------------------------- */ -static H5CX_node_t * -H5CX__pop_common(bool update_dxpl_props) +herr_t +H5CX_pop(bool update_dxpl_props) { - H5CX_node_t **head = NULL; /* Pointer to head of API context list */ - H5CX_node_t *ret_value = NULL; /* Return value */ + H5CX_node_t **head = NULL; /* Pointer to head of API context list */ + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_PACKAGE + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ head = H5CX_get_my_context(); /* Get the pointer to the head of the API context, for this thread */ @@ -3625,36 +3355,7 @@ H5CX__pop_common(bool update_dxpl_props) } /* end if */ /* Pop the top context node from the stack */ - ret_value = (*head); - (*head) = (*head)->next; - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5CX__pop_common() */ - -/*------------------------------------------------------------------------- - * Function: H5CX_pop - * - * Purpose: Pops the context for an API call. - * - * Return: Non-negative on success / Negative on failure - * - *------------------------------------------------------------------------- - */ -herr_t -H5CX_pop(bool update_dxpl_props) -{ - H5CX_node_t *cnode; /* Context node */ - herr_t ret_value = SUCCEED; /* Return value */ - - FUNC_ENTER_NOAPI(FAIL) - - /* Perform common operations and get top context from stack */ - if (NULL == (cnode = H5CX__pop_common(update_dxpl_props))) - HGOTO_ERROR(H5E_CONTEXT, H5E_CANTGET, FAIL, "error getting API context node"); - - /* Free the context node */ - cnode = H5FL_FREE(H5CX_node_t, cnode); + (*head) = (*head)->next; done: FUNC_LEAVE_NOAPI(ret_value) diff --git a/src/H5CXmodule.h b/src/H5CXmodule.h index ffb4804ab57..722eb765c99 100644 --- a/src/H5CXmodule.h +++ b/src/H5CXmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5CX_MODULE -#define H5_MY_PKG H5CX -#define H5_MY_PKG_ERR H5E_CONTEXT +#define H5_MY_PKG H5CX +#define H5_MY_PKG_ERR H5E_CONTEXT +#define H5_MY_PKG_INIT YES #endif /* H5CXmodule_H */ diff --git a/src/H5CXprivate.h b/src/H5CXprivate.h index 2a49d9ef031..ad61a1a430e 100644 --- a/src/H5CXprivate.h +++ b/src/H5CXprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,6 +22,9 @@ #ifdef H5_HAVE_PARALLEL #include "H5FDprivate.h" /* File drivers */ #endif /* H5_HAVE_PARALLEL */ +#include "H5Pprivate.h" /* Property lists */ +#include "H5Tprivate.h" /* Datatypes */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Zprivate.h" /* Data filters */ /**************************/ @@ -47,6 +50,235 @@ typedef struct H5CX_state_t { #endif /* H5_HAVE_PARALLEL */ } H5CX_state_t; +/* Typedef for context about each API call, as it proceeds */ +/* Fields in this struct are of several types: + * - The DXPL & LAPL ID are either library default ones (from the API context + * initialization) or passed in from the application via an API call + * parameter. The corresponding H5P_genplist_t* is just the underlying + * property list struct for the ID, to optimize retrieving properties + * from the list multiple times. + * + * - Internal fields, used and set only within the library, for managing the + * operation under way. These do not correspond to properties in the + * DXPL or LAPL and can have any name. + * + * - Cached fields, which are not returned to the application, for managing + * the operation under way. These correspond to properties in the DXPL + * or LAPL, and are retrieved either from the (global) cache for a + * default property list, or from the corresponding property in the + * application's (non-default) property list. Getting / setting these + * properties within the library does _not_ affect the application's + * property list. Note that the naming of these fields, and + * _valid, is important for the H5CX_RETRIEVE_PROP_VALID + * macro to work properly. + * + * - "Return-only" properties that are returned to the application, mainly + * for sending out "introspection" information ("Why did collective I/O + * get broken for this operation?", "Which filters are set on the chunk I + * just directly read in?", etc) Setting these fields will cause the + * corresponding property in the property list to be set when the API + * context is popped, when returning from the API routine. Note that the + * naming of these fields, and _set, is important for the + * H5CX_TEST_SET_PROP and H5CX_SET_PROP macros to work properly. + * + * - "Return-and-read" properties that are returned to the application to send out introspection information, + * but are also queried by the library internally. If the context value has been 'set' by an accessor, + * all future queries will return the stored value from the context, to avoid later queries overwriting + * that stored value with the value from the property list. + * + * These properties have both a 'valid' and 'set' flag. _valid is true if the field has ever been + * populated from its underlying property list. _set flag is true if this field has ever been set on + * the context for application introspection. The naming of these fields is important for the + * H5CX_RETRIEVE_PROP_VALID_SET macro to work properly. + * + * If a field has been set on the context but never read internally, _valid will be false + * despite the context containing a meaningful cached value. + */ +typedef struct H5CX_t { + /* DXPL */ + hid_t dxpl_id; /* DXPL ID for API operation */ + H5P_genplist_t *dxpl; /* Dataset Transfer Property List */ + + /* LCPL */ + hid_t lcpl_id; /* LCPL ID for API operation */ + H5P_genplist_t *lcpl; /* Link Creation Property List */ + + /* LAPL */ + hid_t lapl_id; /* LAPL ID for API operation */ + H5P_genplist_t *lapl; /* Link Access Property List */ + + /* DCPL */ + hid_t dcpl_id; /* DCPL ID for API operation */ + H5P_genplist_t *dcpl; /* Dataset Creation Property List */ + + /* DAPL */ + hid_t dapl_id; /* DAPL ID for API operation */ + H5P_genplist_t *dapl; /* Dataset Access Property List */ + + /* FAPL */ + hid_t fapl_id; /* FAPL ID for API operation */ + H5P_genplist_t *fapl; /* File Access Property List */ + + /* Internal: Object tagging info */ + haddr_t tag; /* Current object's tag (ohdr chunk #0 address) */ + + /* Internal: Metadata cache info */ + H5AC_ring_t ring; /* Current metadata cache ring for entries */ + +#ifdef H5_HAVE_PARALLEL + /* Internal: Parallel I/O settings */ + bool coll_metadata_read; /* Whether to use collective I/O for metadata read */ + MPI_Datatype btype; /* MPI datatype for buffer, when using collective I/O */ + MPI_Datatype ftype; /* MPI datatype for file, when using collective I/O */ + bool mpi_file_flushing; /* Whether an MPI-opened file is being flushed */ + bool rank0_bcast; /* Whether a dataset meets read-with-rank0-and-bcast requirements */ +#endif /* H5_HAVE_PARALLEL */ + + /* Cached DXPL properties */ + size_t max_temp_buf; /* Maximum temporary buffer size (H5D_XFER_MAX_TEMP_BUF_NAME) .*/ + bool max_temp_buf_valid; /* Whether maximum temporary buffer size is valid */ + void *tconv_buf; /* Temporary conversion buffer (H5D_XFER_TCONV_BUF_NAME) */ + bool tconv_buf_valid; /* Whether temporary conversion buffer is valid */ + void *bkgr_buf; /* Background conversion buffer (H5D_XFER_BKGR_BUF_NAME) */ + bool bkgr_buf_valid; /* Whether background conversion buffer is valid */ + H5T_bkg_t bkgr_buf_type; /* Background buffer type (H5D_XFER_BKGR_BUF_TYPE_NAME) */ + bool bkgr_buf_type_valid; /* Whether background buffer type is valid */ + double btree_split_ratio[3]; /* B-tree split ratios (H5D_XFER_BTREE_SPLIT_RATIO_NAME) */ + bool btree_split_ratio_valid; /* Whether B-tree split ratios are valid */ + size_t vec_size; /* Size of hyperslab vector (H5D_XFER_HYPER_VECTOR_SIZE_NAME) */ + bool vec_size_valid; /* Whether hyperslab vector is valid */ +#ifdef H5_HAVE_PARALLEL + H5FD_mpio_xfer_t io_xfer_mode; /* Parallel transfer mode for this request (H5D_XFER_IO_XFER_MODE_NAME) */ + bool io_xfer_mode_valid; /* Whether parallel transfer mode is valid */ + H5FD_mpio_collective_opt_t mpio_coll_opt; /* Parallel transfer with independent IO or collective IO with + this mode (H5D_XFER_MPIO_COLLECTIVE_OPT_NAME) */ + bool mpio_coll_opt_valid; /* Whether parallel transfer option is valid */ + H5FD_mpio_chunk_opt_t + mpio_chunk_opt_mode; /* Collective chunk option (H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME) */ + bool mpio_chunk_opt_mode_valid; /* Whether collective chunk option is valid */ + unsigned mpio_chunk_opt_num; /* Collective chunk threshold (H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME) */ + bool mpio_chunk_opt_num_valid; /* Whether collective chunk threshold is valid */ + unsigned mpio_chunk_opt_ratio; /* Collective chunk ratio (H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME) */ + bool mpio_chunk_opt_ratio_valid; /* Whether collective chunk ratio is valid */ +#endif /* H5_HAVE_PARALLEL */ + H5Z_EDC_t err_detect; /* Error detection info (H5D_XFER_EDC_NAME) */ + bool err_detect_valid; /* Whether error detection info is valid */ + H5Z_cb_t filter_cb; /* Filter callback function (H5D_XFER_FILTER_CB_NAME) */ + bool filter_cb_valid; /* Whether filter callback function is valid */ + H5Z_data_xform_t *data_transform; /* Data transform info (H5D_XFER_XFORM_NAME) */ + bool data_transform_valid; /* Whether data transform info is valid */ + H5T_vlen_alloc_info_t vl_alloc_info; /* VL datatype alloc info (H5D_XFER_VLEN_*_NAME) */ + bool vl_alloc_info_valid; /* Whether VL datatype alloc info is valid */ + H5T_conv_cb_t dt_conv_cb; /* Datatype conversion struct (H5D_XFER_CONV_CB_NAME) */ + bool dt_conv_cb_valid; /* Whether datatype conversion struct is valid */ + H5D_selection_io_mode_t selection_io_mode; /* Selection I/O mode (H5D_XFER_SELECTION_IO_MODE_NAME) */ + bool selection_io_mode_valid; /* Whether selection I/O mode is valid */ + bool modify_write_buf; /* Whether the library can modify write buffers (H5D_XFER_MODIFY_WRITE_BUF_NAME)*/ + bool modify_write_buf_valid; /* Whether the modify_write_buf field is valid */ + + /* Return-only DXPL properties to return to application */ +#ifdef H5_HAVE_PARALLEL + H5D_mpio_actual_chunk_opt_mode_t mpio_actual_chunk_opt; /* Chunk optimization mode used for parallel I/O + (H5D_MPIO_ACTUAL_CHUNK_OPT_MODE_NAME) */ + bool mpio_actual_chunk_opt_set; /* Whether chunk optimization mode used for parallel I/O is set */ + H5D_mpio_actual_io_mode_t + mpio_actual_io_mode; /* Actual I/O mode used for parallel I/O (H5D_MPIO_ACTUAL_IO_MODE_NAME) */ + bool mpio_actual_io_mode_set; /* Whether actual I/O mode used for parallel I/O is set */ + uint32_t mpio_local_no_coll_cause; /* Local reason for breaking collective I/O + (H5D_MPIO_LOCAL_NO_COLLECTIVE_CAUSE_NAME) */ + bool mpio_local_no_coll_cause_set; /* Whether local reason for breaking collective I/O is set */ + bool mpio_local_no_coll_cause_valid; /* Whether local reason for breaking collective I/O is valid */ + uint32_t mpio_global_no_coll_cause; /* Global reason for breaking collective I/O + (H5D_MPIO_GLOBAL_NO_COLLECTIVE_CAUSE_NAME) */ + bool mpio_global_no_coll_cause_set; /* Whether global reason for breaking collective I/O is set */ + bool mpio_global_no_coll_cause_valid; /* Whether global reason for breaking collective I/O is valid */ +#ifdef H5_HAVE_INSTRUMENTED_LIBRARY + int mpio_coll_chunk_link_hard; /* Instrumented "collective chunk link hard" value + (H5D_XFER_COLL_CHUNK_LINK_HARD_NAME) */ + bool mpio_coll_chunk_link_hard_set; /* Whether instrumented "collective chunk link hard" value is set */ + int mpio_coll_chunk_multi_hard; /* Instrumented "collective chunk multi hard" value + (H5D_XFER_COLL_CHUNK_MULTI_HARD_NAME) */ + bool mpio_coll_chunk_multi_hard_set; /* Whether instrumented "collective chunk multi hard" value is set */ + int mpio_coll_chunk_link_num_true; /* Instrumented "collective chunk link num true" value + (H5D_XFER_COLL_CHUNK_LINK_NUM_TRUE_NAME) */ + bool mpio_coll_chunk_link_num_true_set; /* Whether instrumented "collective chunk link num true" value + is set */ + int mpio_coll_chunk_link_num_false; /* Instrumented "collective chunk link num false" value + (H5D_XFER_COLL_CHUNK_LINK_NUM_FALSE_NAME) */ + bool mpio_coll_chunk_link_num_false_set; /* Whether instrumented "collective chunk link num false" + value is set */ + int mpio_coll_chunk_multi_ratio_coll; /* Instrumented "collective chunk multi ratio coll" value + (H5D_XFER_COLL_CHUNK_MULTI_RATIO_COLL_NAME) */ + bool mpio_coll_chunk_multi_ratio_coll_set; /* Whether instrumented "collective chunk multi ratio coll" + value is set */ + int mpio_coll_chunk_multi_ratio_ind; /* Instrumented "collective chunk multi ratio ind" value + (H5D_XFER_COLL_CHUNK_MULTI_RATIO_IND_NAME) */ + bool mpio_coll_chunk_multi_ratio_ind_set; /* Whether instrumented "collective chunk multi ratio ind" + value is set */ + bool mpio_coll_rank0_bcast; /* Instrumented "collective rank 0 broadcast" value + (H5D_XFER_COLL_RANK0_BCAST_NAME) */ + bool mpio_coll_rank0_bcast_set; /* Whether instrumented "collective rank 0 broadcast" value is set */ +#endif /* H5_HAVE_INSTRUMENTED_LIBRARY */ +#endif /* H5_HAVE_PARALLEL */ + uint32_t no_selection_io_cause; /* Reason for not performing selection I/O + (H5D_XFER_NO_SELECTION_IO_CAUSE_NAME) */ + bool no_selection_io_cause_set; /* Whether reason for not performing selection I/O is set */ + bool no_selection_io_cause_valid; /* Whether reason for not performing selection I/O is valid */ + + uint32_t actual_selection_io_mode; /* Actual selection I/O mode used + (H5D_XFER_ACTUAL_SELECTION_IO_MODE_NAME) */ + bool actual_selection_io_mode_set; /* Whether actual selection I/O mode is set */ + bool actual_selection_io_mode_valid; /* Whether actual selection I/O mode is valid */ + + /* Cached LCPL properties */ + H5T_cset_t encoding; /* Link name character encoding (H5P_STRCRT_CHAR_ENCODING_NAME) */ + bool encoding_valid; /* Whether link name character encoding is valid */ + unsigned intermediate_group; /* Whether to create intermediate groups (H5L_CRT_INTERMEDIATE_GROUP_NAME) */ + bool intermediate_group_valid; /* Whether create intermediate group flag is valid */ + + /* Cached LAPL properties */ + size_t nlinks; /* Number of soft / UD links to traverse (H5L_ACS_NLINKS_NAME) */ + bool nlinks_valid; /* Whether number of soft / UD links to traverse is valid */ + + /* Cached DCPL properties */ + bool do_min_dset_ohdr; /* Whether to minimize dataset object header (H5D_CRT_MIN_DSET_HDR_SIZE_NAME) */ + bool do_min_dset_ohdr_valid; /* Whether minimize dataset object header flag is valid */ + uint8_t ohdr_flags; /* Object header flags (H5O_CRT_OHDR_FLAGS_NAME) */ + bool ohdr_flags_valid; /* Whether the object headers flags are valid */ + + /* Cached DAPL properties */ + const char *extfile_prefix; /* Prefix for external file (H5D_ACS_EFILE_PREFIX_NAME) */ + bool extfile_prefix_valid; /* Whether the prefix for external file is valid */ + const char *vds_prefix; /* Prefix for VDS (H5D_ACS_VDS_PREFIX_NAME) */ + bool vds_prefix_valid; /* Whether the prefix for VDS is valid */ + + /* Cached FAPL properties */ + H5F_libver_t low_bound; /* low_bound property for H5Pset_libver_bounds() + (H5F_ACS_LIBVER_LOW_BOUND_NAME) */ + bool low_bound_valid; /* Whether low_bound property is valid */ + H5F_libver_t high_bound; /* high_bound property for H5Pset_libver_bounds + (H5F_ACS_LIBVER_HIGH_BOUND_NAME) */ + bool high_bound_valid; /* Whether high_bound property is valid */ + + /* Cached VOL settings */ + H5VL_connector_prop_t vol_connector_prop; /* Property for VOL connector ID & info + This is treated as an independent field with + no relation to the property H5F_ACS_VOL_CONN_NAME stored on the FAPL */ + bool vol_connector_prop_valid; /* Whether property for VOL connector ID & info is valid */ + void *vol_wrap_ctx; /* VOL connector's "wrap context" for creating IDs */ + bool vol_wrap_ctx_valid; /* Whether VOL connector's "wrap context" for creating IDs is valid */ +} H5CX_t; + +/* Typedef for nodes on the API context stack */ +/* Each entry into the library through an API routine invokes H5CX_push() + * in a FUNC_ENTER_API* macro, which pushes an H5CX_node_t on the API + * context [thread-local] stack, after initializing it with default values. + */ +typedef struct H5CX_node_t { + H5CX_t ctx; /* Context for current API call */ + struct H5CX_node_t *next; /* Pointer to previous context, on stack */ +} H5CX_node_t; + /*****************************/ /* Library-private Variables */ /*****************************/ @@ -56,13 +288,10 @@ typedef struct H5CX_state_t { /***************************************/ /* Library private routines */ -#ifndef H5private_H -H5_DLL herr_t H5CX_push(void); +H5_DLL herr_t H5CX_push(H5CX_node_t *cnode); H5_DLL herr_t H5CX_pop(bool update_dxpl_props); -#endif /* H5private_H */ -H5_DLL bool H5CX_pushed(void); -H5_DLL void H5CX_push_special(void); -H5_DLL bool H5CX_is_def_dxpl(void); +H5_DLL bool H5CX_pushed(void); +H5_DLL bool H5CX_is_def_dxpl(void); /* API context state routines */ H5_DLL herr_t H5CX_retrieve_state(H5CX_state_t **api_state); @@ -159,8 +388,6 @@ H5_DLL herr_t H5CX_set_vlen_alloc_info(H5MM_allocate_t alloc_func, void *alloc_i /* "Setter" routines for LAPL properties cached in API context */ H5_DLL herr_t H5CX_set_nlinks(size_t nlinks); -H5_DLL herr_t H5CX_init(void); - /* "Setter" routines for cached DXPL properties that must be returned to application */ H5_DLL void H5CX_set_no_selection_io_cause(uint32_t no_selection_io_cause); diff --git a/src/H5Cdbg.c b/src/H5Cdbg.c index 55bfcd28600..418f24579a0 100644 --- a/src/H5Cdbg.c +++ b/src/H5Cdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Centry.c b/src/H5Centry.c index 1ca7479cf7e..74cd42a4aaa 100644 --- a/src/H5Centry.c +++ b/src/H5Centry.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cepoch.c b/src/H5Cepoch.c index ef105f839a4..79fe6cb0c9c 100644 --- a/src/H5Cepoch.c +++ b/src/H5Cepoch.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cimage.c b/src/H5Cimage.c index eb89b735f27..d626640dbdd 100644 --- a/src/H5Cimage.c +++ b/src/H5Cimage.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cint.c b/src/H5Cint.c index 905cbf951ec..7ebd9457856 100644 --- a/src/H5Cint.c +++ b/src/H5Cint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Clog.c b/src/H5Clog.c index 255b28f25e7..60fc058ad5f 100644 --- a/src/H5Clog.c +++ b/src/H5Clog.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Clog.h b/src/H5Clog.h index eb74a339900..01bbf17a86a 100644 --- a/src/H5Clog.h +++ b/src/H5Clog.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Clog_json.c b/src/H5Clog_json.c index e273f55d2ba..3dd0bb12764 100644 --- a/src/H5Clog_json.c +++ b/src/H5Clog_json.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Clog_trace.c b/src/H5Clog_trace.c index 4b845d56e88..6000a28a4cf 100644 --- a/src/H5Clog_trace.c +++ b/src/H5Clog_trace.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cmodule.h b/src/H5Cmodule.h index 64c5279d92f..03a55b7a5fe 100644 --- a/src/H5Cmodule.h +++ b/src/H5Cmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5C_MODULE -#define H5_MY_PKG H5C -#define H5_MY_PKG_ERR H5E_CACHE +#define H5_MY_PKG H5C +#define H5_MY_PKG_ERR H5E_CACHE +#define H5_MY_PKG_INIT NO #endif /* H5Cmodule_H */ diff --git a/src/H5Cmpio.c b/src/H5Cmpio.c index 233e4f92d2d..67435d362ca 100644 --- a/src/H5Cmpio.c +++ b/src/H5Cmpio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cpkg.h b/src/H5Cpkg.h index b8d579a6df0..3e3da929faa 100644 --- a/src/H5Cpkg.h +++ b/src/H5Cpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cprefetched.c b/src/H5Cprefetched.c index 1a890678a58..a87b9cd2a7e 100644 --- a/src/H5Cprefetched.c +++ b/src/H5Cprefetched.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cprivate.h b/src/H5Cprivate.h index d7065799a67..e1832614292 100644 --- a/src/H5Cprivate.h +++ b/src/H5Cprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cpublic.h b/src/H5Cpublic.h index 69c86cdef9b..56e361537f8 100644 --- a/src/H5Cpublic.h +++ b/src/H5Cpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Cquery.c b/src/H5Cquery.c index 2df9bb1a90d..04063d17157 100644 --- a/src/H5Cquery.c +++ b/src/H5Cquery.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ctag.c b/src/H5Ctag.c index 71eb24d2577..089c9f4b7b2 100644 --- a/src/H5Ctag.c +++ b/src/H5Ctag.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ctest.c b/src/H5Ctest.c index c2af1dc2b65..eb99d0c5468 100644 --- a/src/H5Ctest.c +++ b/src/H5Ctest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5D.c b/src/H5D.c index 574ea404053..0e47235ee2f 100644 --- a/src/H5D.c +++ b/src/H5D.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -63,6 +63,9 @@ static herr_t H5D__set_extent_api_common(hid_t dset_id, const hsize_t size[], vo /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ diff --git a/src/H5Dbtree.c b/src/H5Dbtree.c index 6c32c26f345..92a95aa6808 100644 --- a/src/H5Dbtree.c +++ b/src/H5Dbtree.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dbtree2.c b/src/H5Dbtree2.c index 7a26b6d016c..c93ee87223f 100644 --- a/src/H5Dbtree2.c +++ b/src/H5Dbtree2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dchunk.c b/src/H5Dchunk.c index beb90012032..f07d9b227d8 100644 --- a/src/H5Dchunk.c +++ b/src/H5Dchunk.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -43,21 +43,21 @@ /***********/ /* Headers */ /***********/ -#include "H5private.h" /* Generic Functions */ +#include "H5private.h" /* Generic Functions */ #ifdef H5_HAVE_PARALLEL -#include "H5ACprivate.h" /* Metadata cache */ +#include "H5ACprivate.h" /* Metadata cache */ #endif /* H5_HAVE_PARALLEL */ -#include "H5CXprivate.h" /* API Contexts */ -#include "H5Dpkg.h" /* Dataset functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5Fprivate.h" /* File functions */ -#include "H5FLprivate.h" /* Free Lists */ -#include "H5Iprivate.h" /* IDs */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5MFprivate.h" /* File memory management */ -#include "H5PBprivate.h" /* Page Buffer */ +#include "H5CXprivate.h" /* API Contexts */ +#include "H5Dpkg.h" /* Dataset functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Fprivate.h" /* File functions */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5Iprivate.h" /* IDs */ +#include "H5MMprivate.h" /* Memory management */ +#include "H5MFprivate.h" /* File memory management */ +#include "H5PBprivate.h" /* Page Buffer */ #include "H5SLprivate.h" /* Skip Lists */ -#include "H5VMprivate.h" /* Vector and array functions */ +#include "H5VMprivate.h" /* Vector and array functions */ /****************/ /* Local Macros */ @@ -759,7 +759,7 @@ H5D__chunk_set_sizes(H5D_t *dset) unsigned u; /* Iterator */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity checks */ assert(dset); @@ -5728,13 +5728,16 @@ H5D__chunk_cmp_coll_fill_info(const void *_entry1, const void *_entry2) { const struct chunk_coll_fill_info *entry1; const struct chunk_coll_fill_info *entry2; + int ret_value = 0; FUNC_ENTER_PACKAGE_NOERR entry1 = (const struct chunk_coll_fill_info *)_entry1; entry2 = (const struct chunk_coll_fill_info *)_entry2; - FUNC_LEAVE_NOAPI(H5_addr_cmp(entry1->addr, entry2->addr)) + ret_value = H5_addr_cmp(entry1->addr, entry2->addr); + + FUNC_LEAVE_NOAPI(ret_value) } /* end H5D__chunk_cmp_coll_fill_info() */ #endif /* H5_HAVE_PARALLEL */ @@ -8226,7 +8229,7 @@ H5D__chunk_get_offset_copy(const H5D_t *dset, const hsize_t *offset, hsize_t *of unsigned u; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE assert(dset); assert(offset); diff --git a/src/H5Dcompact.c b/src/H5Dcompact.c index de84034f638..aa18f255586 100644 --- a/src/H5Dcompact.c +++ b/src/H5Dcompact.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dcontig.c b/src/H5Dcontig.c index 11b0a8e4ef8..902b512d2c2 100644 --- a/src/H5Dcontig.c +++ b/src/H5Dcontig.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ddbg.c b/src/H5Ddbg.c index d011303d3c6..1baed0231e8 100644 --- a/src/H5Ddbg.c +++ b/src/H5Ddbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ddeprec.c b/src/H5Ddeprec.c index a8f92fe5c55..0b98a5e726a 100644 --- a/src/H5Ddeprec.c +++ b/src/H5Ddeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dearray.c b/src/H5Dearray.c index 965eaacaca3..d2335f5a2bf 100644 --- a/src/H5Dearray.c +++ b/src/H5Dearray.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Defl.c b/src/H5Defl.c index 42678761a00..7f25e69d92c 100644 --- a/src/H5Defl.c +++ b/src/H5Defl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dfarray.c b/src/H5Dfarray.c index 8d06de47b02..f8770322cde 100644 --- a/src/H5Dfarray.c +++ b/src/H5Dfarray.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dfill.c b/src/H5Dfill.c index 56609844021..e4703b8af74 100644 --- a/src/H5Dfill.c +++ b/src/H5Dfill.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dint.c b/src/H5Dint.c index ffb3b38cfce..c064e2b8d5a 100644 --- a/src/H5Dint.c +++ b/src/H5Dint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -140,6 +140,9 @@ static const H5I_class_t H5I_DATASET_CLS[1] = {{ (H5I_free_t)H5D__close_cb /* Callback routine for closing objects of this class */ }}; +/* Flag indicating "top" of interface has been initialized */ +static bool H5D_top_package_initialize_s = false; + /* Prefixes of VDS and external file from the environment variables * HDF5_EXTFILE_PREFIX and HDF5_VDS_PREFIX */ static const char *H5D_prefix_ext_env = NULL; @@ -157,11 +160,38 @@ static const char *H5D_prefix_vds_env = NULL; */ herr_t H5D_init(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5D_init() */ + +/*-------------------------------------------------------------------------- +NAME + H5D__init_package -- Initialize interface-specific information +USAGE + herr_t H5D__init_package() + +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +NOTES + Care must be taken when using the H5P functions, since they can cause + a deadlock in the library when the library is attempting to terminate -QAK + +--------------------------------------------------------------------------*/ +herr_t +H5D__init_package(void) { H5P_genplist_t *def_dcpl; /* Default Dataset Creation Property list */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Initialize the ID group for the dataset IDs */ if (H5I_register_type(H5I_DATASET_CLS) < 0) @@ -191,13 +221,16 @@ H5D_init(void) if (H5P_get(def_dcpl, H5O_CRT_PIPELINE_NAME, &H5D_def_dset.dcpl_cache.pline) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't retrieve pipeline filter"); + /* Mark "top" of interface as initialized, too */ + H5D_top_package_initialize_s = true; + /* Retrieve the prefixes of VDS and external file from the environment variable */ H5D_prefix_vds_env = getenv("HDF5_VDS_PREFIX"); H5D_prefix_ext_env = getenv("HDF5_EXTFILE_PREFIX"); done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5D_init() */ +} /* end H5D__init_package() */ /*------------------------------------------------------------------------- * Function: H5D_top_term_package @@ -216,32 +249,38 @@ H5D_top_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - if (H5I_nmembers(H5I_DATASET) > 0) { - /* The dataset API uses the "force" flag set to true because it - * is using the "file objects" (H5FO) API functions to track open - * objects in the file. Using the H5FO code means that dataset - * IDs can have reference counts >1, when an existing dataset is - * opened more than once. However, the H5I code does not attempt - * to close objects with reference counts>1 unless the "force" flag - * is set to true. - * - * At some point (probably after the group and datatypes use the - * the H5FO code), the H5FO code might need to be switched around - * to storing pointers to the objects being tracked (H5D_t, H5G_t, - * etc) and reference count those itself instead of relying on the - * reference counting in the H5I layer. Then, the "force" flag can - * be put back to false. - * - * Setting the "force" flag to true for all the interfaces won't - * work because the "file driver" (H5FD) APIs use the H5I reference - * counting to avoid closing a file driver out from underneath an - * open file... - * - * QAK - 5/13/03 - */ - (void)H5I_clear_type(H5I_DATASET, true, false); - n++; /*H5I*/ - } + if (H5D_top_package_initialize_s) { + if (H5I_nmembers(H5I_DATASET) > 0) { + /* The dataset API uses the "force" flag set to true because it + * is using the "file objects" (H5FO) API functions to track open + * objects in the file. Using the H5FO code means that dataset + * IDs can have reference counts >1, when an existing dataset is + * opened more than once. However, the H5I code does not attempt + * to close objects with reference counts>1 unless the "force" flag + * is set to true. + * + * At some point (probably after the group and datatypes use the + * the H5FO code), the H5FO code might need to be switched around + * to storing pointers to the objects being tracked (H5D_t, H5G_t, + * etc) and reference count those itself instead of relying on the + * reference counting in the H5I layer. Then, the "force" flag can + * be put back to false. + * + * Setting the "force" flag to true for all the interfaces won't + * work because the "file driver" (H5FD) APIs use the H5I reference + * counting to avoid closing a file driver out from underneath an + * open file... + * + * QAK - 5/13/03 + */ + (void)H5I_clear_type(H5I_DATASET, true, false); + n++; /*H5I*/ + } /* end if */ + + /* Mark closed */ + if (0 == n) + H5D_top_package_initialize_s = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5D_top_term_package() */ @@ -266,11 +305,18 @@ H5D_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Sanity checks */ - assert(0 == H5I_nmembers(H5I_DATASET)); + if (H5_PKG_INIT_VAR) { + /* Sanity checks */ + assert(0 == H5I_nmembers(H5I_DATASET)); + assert(false == H5D_top_package_initialize_s); + + /* Destroy the dataset object id group */ + n += (H5I_dec_type_ref(H5I_DATASET) > 0); - /* Destroy the dataset object id group */ - n += (H5I_dec_type_ref(H5I_DATASET) > 0); + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5D_term_package() */ diff --git a/src/H5Dio.c b/src/H5Dio.c index 312c7fd854b..436e9c95650 100644 --- a/src/H5Dio.c +++ b/src/H5Dio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -103,7 +103,7 @@ H5D__read(size_t count, H5D_dset_io_info_t *dset_info) char fake_char; /* Temporary variable for NULL buffer pointers */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE #ifdef H5_HAVE_PARALLEL /* Reset the actual io mode properties to the default values in case @@ -530,7 +530,7 @@ H5D__write(size_t count, H5D_dset_io_info_t *dset_info) char fake_char; /* Temporary variable for NULL buffer pointers */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE #ifdef H5_HAVE_PARALLEL /* Reset the actual io mode properties to the default values in case diff --git a/src/H5Dlayout.c b/src/H5Dlayout.c index ae2b9aa4a74..26903b2408d 100644 --- a/src/H5Dlayout.c +++ b/src/H5Dlayout.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -48,8 +48,7 @@ const unsigned H5O_layout_ver_bounds[] = { H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V110 */ H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V112 */ H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V114 */ - H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V116 */ - H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V118 */ + H5O_LAYOUT_VERSION_4, /* H5F_LIBVER_V200 */ H5O_LAYOUT_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; @@ -286,7 +285,7 @@ H5D__layout_set_version(H5F_t *f, H5O_layout_t *layout) unsigned version; /* Message version */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity check */ assert(layout); diff --git a/src/H5Dmodule.h b/src/H5Dmodule.h index 96c5b1a704e..d7acb0d9f51 100644 --- a/src/H5Dmodule.h +++ b/src/H5Dmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5D_MODULE -#define H5_MY_PKG H5D -#define H5_MY_PKG_ERR H5E_DATASET +#define H5_MY_PKG H5D +#define H5_MY_PKG_ERR H5E_DATASET +#define H5_MY_PKG_INIT YES /** \page H5D_UG HDF5 Datasets * @@ -1612,7 +1613,8 @@ allocated if necessary. * care must be taken to assure that all the external files are accessible in the new location. * * \subsection subsec_dataset_filters Using HDF5 Filters - * This section describes in detail how to use the n-bit, scale-offset filters and szip filters. + * This section describes in detail how to use the n-bit, scale-offset filters and szip filters. For + * details on the how filters are used in the read / write of data, see /def subsubsec_dataset_transfer_pipe. * * \subsubsection subsubsec_dataset_filters_nbit Using the N‐bit Filter * N-bit data has n significant bits, where n may not correspond to a precise number of bytes. On @@ -2732,7 +2734,117 @@ allocated if necessary. * * * \subsubsection subsubsec_dataset_filters_szip Using the SZip Filter - * See The HDF Group website for further information regarding the SZip filter. + * Szip compression software, providing lossless compression of scientific data, has been provided with HDF + * software products as of HDF5 Release 1.6.0. Szip is an implementation of the extended-Rice lossless + * compression algorithm. The Consultative Committee on Space Data Systems (CCSDS) has adopted the + * extended-Rice algorithm for international standards for space applications[1,6,7]. Szip is reported + * to provide fast and effective compression, specifically for the EOS data generated by the NASA Earth + * Observatory System (EOS)[1]. + * It was originally developed at University of New Mexico (UNM) and integrated with HDF by UNM researchers + * and developers. + * + * The primary gain with Szip compression is in speed of processing. Szip also provides some advantage in + * compression ratio over other compression methods. + * + *

Szip and HDF5

+ * Using Szip compression in HDF5: Szip is a stand-alone library that is configured as an optional filter in + * HDF5. + * Depending on which Szip library is used (encoder enabled or decode-only), an HDF5 application can + * create, write, and read datasets compressed with Szip compression, or can only read datasets + * compressed with Szip. + * Applications use Szip by setting Szip as an optional filter when a dataset is created. If the Szip + * encoder is enabled with the HDF5 library, data is automatically compressed and decompressed with + * Szip during I/O. + * If only the decoder is present, the HDF5 library cannot create and write Szip-compressed datasets, + * but it automatically decompresses Szip-compressed data when data is read. + * + * This sample HDF5 program illustrates the use of Szip compression with HDF5. + * \code + * Example of Szip Usage in HDF5 + * The following sample program illustrates the use of Szip compression in HDF5. This sample program is + * also available in the subdirectory HDF5Examples. + * #include "hdf5.h" + * #define NX 500 + * #define NY 600 + * #define CH_NX 100 + * #define CH_NY 25 + * + * int main(void) + * { + * hid_t file, data_space, dataset32, properties; + * float buf[NX][NY]; + * float buf_r[NX][NY]; + * hsize_t dims[2], chunk_size[2]; + * int i, j; + * unsigned szip_options_mask; + * unsigned szip_pixels_per_block; + * + * // Initialize data buffer with some bogus data. + * for (i=0; i < NX; i++) { + * for (j=0; j < NY; j++) + * buf[i][j] = i + j; + * } + * + * // Describe the size of the array. + * dims[0] = NX; + * dims[1] = NY; + * data_space = H5Screate_simple (2, dims, NULL); + * + * // Create a new file using read/write access, default file + * // creation properties, and default file access properties. + * file = H5Fcreate ("test.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + * + * // Set the dataset creation property list to specify that + * // the raw data is to be partitioned into 100x100 element + * // chunks and that each chunk is to be compressed. + * chunk_size[0] = CH_NX; + * chunk_size[1] = CH_NY; + * properties = H5Pcreate (H5P_DATASET_CREATE); + * H5Pset_chunk (properties, 2, chunk_size); + * + * // Set parameters for SZIP compression; check the description of + * // the H5Pset_szip function in the HDF5 Reference Manual for more + * // information. + * szip_options_mask=H5_SZIP_NN_OPTION_MASK; + * szip_pixels_per_block=32; + * + * H5Pset_szip (properties, szip_options_mask, szip_pixels_per_block); + * + * // Create a new dataset within the file. The datatype + * // and data space describe the data on disk, which may + * // be different from the format used in the application's + * // memory. + * + * dataset32 = H5Dcreate (file, "datasetF32", H5T_NATIVE_FLOAT, data_space, properties); + * + * // Write the array to the file. The datatype and dataspace + * // describe the format of the data in the `buf' buffer. + * // The raw data is translated to the format required on disk, + * // as defined above. We use default raw data transfer properties. + * + * H5Dwrite (dataset32, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); + * + * // Read the array. This is similar to writing data, + * // except the data flows in the opposite direction. + * // Note: Decompression is automatic. + * + * H5Dread (dataset32, H5T_NATIVE_FLOAT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf_r); + * + * H5Dclose (dataset32); + * H5Sclose (data_space); + * H5Pclose (properties); + * H5Fclose (file); + * } + * \endcode + * + * Details of the required and optional parameters are provided in the H5Pset_szip entry + * in the \ref RM. + * + * Software distribution: Starting with Release 1.6.0, HDF5 has been distributed with Szip enabled, + * making it easier to use Szip compression. The software is distributed as follows: + * - Pre-compiled HDF5 binaries are provided with the Szip encoder enabled. + * - Szip source code can be obtained at: + * LIBAEC(SZIP) repository * * \subsubsection subsubsec_dataset_filters_dyn Using Dynamically-Loadable Filters * see \ref sec_filter_plugins for further information regarding the dynamically-loadable filters. diff --git a/src/H5Dmpio.c b/src/H5Dmpio.c index 84a0f25356f..c19f0ab4b68 100644 --- a/src/H5Dmpio.c +++ b/src/H5Dmpio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -2716,13 +2716,16 @@ H5D__cmp_piece_addr(const void *piece_info1, const void *piece_info2) { haddr_t addr1; haddr_t addr2; + int ret_value = 0; FUNC_ENTER_PACKAGE_NOERR addr1 = (*((const H5D_piece_info_t *const *)piece_info1))->faddr; addr2 = (*((const H5D_piece_info_t *const *)piece_info2))->faddr; - FUNC_LEAVE_NOAPI(H5_addr_cmp(addr1, addr2)) + ret_value = H5_addr_cmp(addr1, addr2); + + FUNC_LEAVE_NOAPI(ret_value) } /* end H5D__cmp_chunk_addr() */ /*------------------------------------------------------------------------- @@ -2744,9 +2747,9 @@ H5D__cmp_filtered_collective_io_info_entry(const void *filtered_collective_io_in { const H5D_filtered_collective_chunk_info_t *entry1; const H5D_filtered_collective_chunk_info_t *entry2; - haddr_t addr1 = HADDR_UNDEF; - haddr_t addr2 = HADDR_UNDEF; - int ret_value; + haddr_t addr1 = HADDR_UNDEF; + haddr_t addr2 = HADDR_UNDEF; + int ret_value = 0; FUNC_ENTER_PACKAGE_NOERR @@ -2803,7 +2806,7 @@ H5D__cmp_chunk_redistribute_info(const void *_entry1, const void *_entry2) const H5D_chunk_redistribute_info_t *entry2; haddr_t oloc_addr1; haddr_t oloc_addr2; - int ret_value; + int ret_value = 0; FUNC_ENTER_PACKAGE_NOERR @@ -2863,9 +2866,9 @@ H5D__cmp_chunk_redistribute_info_orig_owner(const void *_entry1, const void *_en { const H5D_chunk_redistribute_info_t *entry1; const H5D_chunk_redistribute_info_t *entry2; - int owner1 = -1; - int owner2 = -1; - int ret_value; + int owner1 = -1; + int owner2 = -1; + int ret_value = 0; FUNC_ENTER_PACKAGE_NOERR diff --git a/src/H5Dnone.c b/src/H5Dnone.c index b319bd26fc6..0d747c82d47 100644 --- a/src/H5Dnone.c +++ b/src/H5Dnone.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Doh.c b/src/H5Doh.c index 1008948972e..387a2c1dae8 100644 --- a/src/H5Doh.c +++ b/src/H5Doh.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dpkg.h b/src/H5Dpkg.h index 0087c35b05e..538f5045c7d 100644 --- a/src/H5Dpkg.h +++ b/src/H5Dpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dprivate.h b/src/H5Dprivate.h index e539d872f9e..ad55dcc5d6c 100644 --- a/src/H5Dprivate.h +++ b/src/H5Dprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dpublic.h b/src/H5Dpublic.h index e393da59654..67cea7a66b2 100644 --- a/src/H5Dpublic.h +++ b/src/H5Dpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -264,6 +264,8 @@ typedef herr_t (*H5D_gather_func_t)(const void *dst_buf, size_t dst_buf_bytes_us * \li A negative (#H5_ITER_ERROR) causes the iterator to immediately * return that value, indicating failure. * + * \callback_note + * * \since 1.14.0 * */ @@ -776,6 +778,8 @@ H5_DLL herr_t H5Dget_chunk_info_by_coord(hid_t dset_id, const hsize_t *offset, u * Iterate over all chunked datasets and chunks in a file. * \snippet H5D_examples.c H5Ovisit_cb * + * \callback_note + * * \since 1.14.0 * */ @@ -1324,7 +1328,7 @@ H5_DLL herr_t H5Dwrite_chunk(hid_t dset_id, hid_t dxpl_id, uint32_t filters, con * conversion of data from one datatype to another, and the filter * pipeline to write the chunk. Developers should have experience * with these processes before using this function. Please see - * Using the Direct Chunk Write Function for more information. + * \ref subsec_hldo_direct_chunk_using for more information. * * \note H5Dread_chunk() and H5Dwrite_chunk() are currently not supported * with parallel HDF5 and do not support variable-length datatypes. @@ -1364,6 +1368,8 @@ H5_DLL herr_t H5Dread_chunk(hid_t dset_id, hid_t dxpl_id, const hsize_t *offset, * \warning Modifying the selection of \p space_id during iteration * will lead to undefined behavior. * + * \callback_note + * * \since 1.10.2 * */ @@ -1652,6 +1658,8 @@ H5_DLL herr_t H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id, hi * in \p dst_buf. The callback function should return zero (0) * to indicate success, and a negative value to indicate failure. * + * \callback_note + * * \since 1.10.2 * */ diff --git a/src/H5Dscatgath.c b/src/H5Dscatgath.c index 997c72c115e..56b556615a8 100644 --- a/src/H5Dscatgath.c +++ b/src/H5Dscatgath.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dselect.c b/src/H5Dselect.c index e018da5b4a5..9534c5346ac 100644 --- a/src/H5Dselect.c +++ b/src/H5Dselect.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dsingle.c b/src/H5Dsingle.c index a08fa10d871..fb9ffc27273 100644 --- a/src/H5Dsingle.c +++ b/src/H5Dsingle.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dtest.c b/src/H5Dtest.c index 5f700b38237..929a32a5243 100644 --- a/src/H5Dtest.c +++ b/src/H5Dtest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Dvirtual.c b/src/H5Dvirtual.c index d10f4af8520..bdb093ed07b 100644 --- a/src/H5Dvirtual.c +++ b/src/H5Dvirtual.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -890,6 +890,7 @@ H5D__virtual_open_source_dset(const H5D_t *vdset, H5O_storage_virtual_ent_t *vir if (src_file) { H5G_loc_t src_root_loc; /* Object location of source file root group */ + bool exists = false; /* Set up the root group in the destination file */ if (NULL == (src_root_loc.oloc = H5G_oloc(H5G_rootof(src_file)))) @@ -897,18 +898,18 @@ H5D__virtual_open_source_dset(const H5D_t *vdset, H5O_storage_virtual_ent_t *vir if (NULL == (src_root_loc.path = H5G_nameof(H5G_rootof(src_file)))) HGOTO_ERROR(H5E_DATASET, H5E_BADVALUE, FAIL, "unable to get path for root group"); - /* Try opening the source dataset */ - source_dset->dset = H5D__open_name(&src_root_loc, source_dset->dset_name, - vdset->shared->layout.storage.u.virt.source_dapl); + /* Check if the source dataset exists */ + if (H5G_loc_exists(&src_root_loc, source_dset->dset_name, &exists /*out*/) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTFIND, FAIL, "can't check object's existence"); - /* Dataset does not exist */ - if (NULL == source_dset->dset) { - /* Reset the error stack */ - H5E_clear_stack(); + /* Dataset exists */ + if (exists) { + /* Try opening the source dataset */ + if (NULL == + (source_dset->dset = H5D__open_name(&src_root_loc, source_dset->dset_name, + vdset->shared->layout.storage.u.virt.source_dapl))) + HGOTO_ERROR(H5E_DATASET, H5E_CANTOPENOBJ, FAIL, "unable to open source dataset"); - source_dset->dset_exists = false; - } /* end if */ - else { /* Dataset exists */ source_dset->dset_exists = true; @@ -919,7 +920,10 @@ H5D__virtual_open_source_dset(const H5D_t *vdset, H5O_storage_virtual_ent_t *vir virtual_ent->source_space_status = H5O_VIRTUAL_STATUS_CORRECT; } /* end if */ } /* end else */ - } /* end if */ + else + /* Dataset does not exist */ + source_dset->dset_exists = false; + } /* end if */ done: /* Release resources */ @@ -1260,7 +1264,7 @@ H5D_virtual_free_parsed_name(H5O_storage_virtual_name_seg_t *name_seg) H5O_storage_virtual_name_seg_t *next_seg; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Walk name segments, freeing them */ while (name_seg) { @@ -1270,6 +1274,7 @@ H5D_virtual_free_parsed_name(H5O_storage_virtual_name_seg_t *name_seg) name_seg = next_seg; } /* end while */ +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5D_virtual_free_parsed_name() */ diff --git a/src/H5E.c b/src/H5E.c index a037ffa595e..b1063f7b861 100644 --- a/src/H5E.c +++ b/src/H5E.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -73,6 +73,9 @@ /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare extern the free list to manage the H5E_stack_t struct */ H5FL_EXTERN(H5E_stack_t); diff --git a/src/H5EA.c b/src/H5EA.c index 82b7da6cefa..09258449a4c 100644 --- a/src/H5EA.c +++ b/src/H5EA.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -72,6 +72,9 @@ static H5EA_t *H5EA__new(H5F_t *f, haddr_t ea_addr, bool from_open, void *ctx_ud /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Extensible array client ID to class mapping */ /* Remember to add client ID to H5EA_cls_id_t in H5EAprivate.h when adding a new diff --git a/src/H5EAcache.c b/src/H5EAcache.c index 951c40dccc1..7eb289a2b53 100644 --- a/src/H5EAcache.c +++ b/src/H5EAcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAdbg.c b/src/H5EAdbg.c index d744ac53d1c..d4893050e80 100644 --- a/src/H5EAdbg.c +++ b/src/H5EAdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAdblkpage.c b/src/H5EAdblkpage.c index 1fd04b2ee8c..a18dbcc4e70 100644 --- a/src/H5EAdblkpage.c +++ b/src/H5EAdblkpage.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAdblock.c b/src/H5EAdblock.c index 848985f0641..7b0298b4379 100644 --- a/src/H5EAdblock.c +++ b/src/H5EAdblock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAhdr.c b/src/H5EAhdr.c index 96c027ec581..e565c37ac28 100644 --- a/src/H5EAhdr.c +++ b/src/H5EAhdr.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAiblock.c b/src/H5EAiblock.c index 086d0ad75fa..4d007153fda 100644 --- a/src/H5EAiblock.c +++ b/src/H5EAiblock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAint.c b/src/H5EAint.c index 8ca3bc75157..68941887104 100644 --- a/src/H5EAint.c +++ b/src/H5EAint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAmodule.h b/src/H5EAmodule.h index f992393ed56..3c8b4c0006a 100644 --- a/src/H5EAmodule.h +++ b/src/H5EAmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5EA_MODULE -#define H5_MY_PKG H5EA -#define H5_MY_PKG_ERR H5E_EARRAY +#define H5_MY_PKG H5EA +#define H5_MY_PKG_ERR H5E_EARRAY +#define H5_MY_PKG_INIT NO #endif /* H5EAmodule_H */ diff --git a/src/H5EApkg.h b/src/H5EApkg.h index 3dd2a2da516..5bcb823e17f 100644 --- a/src/H5EApkg.h +++ b/src/H5EApkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAprivate.h b/src/H5EAprivate.h index 2780cb199d3..6ea3e14a6c8 100644 --- a/src/H5EAprivate.h +++ b/src/H5EAprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAsblock.c b/src/H5EAsblock.c index 75dd26acf96..dabcdf2ff86 100644 --- a/src/H5EAsblock.c +++ b/src/H5EAsblock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAstat.c b/src/H5EAstat.c index a564455c0e2..3f01e804c74 100644 --- a/src/H5EAstat.c +++ b/src/H5EAstat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5EAtest.c b/src/H5EAtest.c index 13e7c98140a..ef271f4b687 100644 --- a/src/H5EAtest.c +++ b/src/H5EAtest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ES.c b/src/H5ES.c index 7b830b5f740..2e633d5a907 100644 --- a/src/H5ES.c +++ b/src/H5ES.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ESdevelop.h b/src/H5ESdevelop.h index b2facaacec7..d373ee81f06 100644 --- a/src/H5ESdevelop.h +++ b/src/H5ESdevelop.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ESevent.c b/src/H5ESevent.c index d925fb407d8..84f2110d860 100644 --- a/src/H5ESevent.c +++ b/src/H5ESevent.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ESint.c b/src/H5ESint.c index eef68d579c2..6a72d911440 100644 --- a/src/H5ESint.c +++ b/src/H5ESint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -103,6 +103,9 @@ static int H5ES__close_failed_cb(H5ES_event_t *ev, void *_ctx); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -123,20 +126,22 @@ static const H5I_class_t H5I_EVENTSET_CLS[1] = {{ H5FL_DEFINE_STATIC(H5ES_t); /*------------------------------------------------------------------------- - * Function: H5ES_init + * Function: H5ES__init_package + * + * Purpose: Initializes any interface-specific data or routines. + * + * Return: Non-negative on success / Negative on failure * * Purpose: Initialize the interface from some other layer. * - * Return: Success: non-negative - * Failure: negative *------------------------------------------------------------------------- */ herr_t -H5ES_init(void) +H5ES__init_package(void) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Initialize the ID group for the event set IDs */ if (H5I_register_type(H5I_EVENTSET_CLS) < 0) @@ -144,7 +149,7 @@ H5ES_init(void) done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5ES__init_package() */ /*------------------------------------------------------------------------- * Function: H5ES_term_package @@ -164,8 +169,14 @@ H5ES_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Destroy the event set ID group */ - n += (H5I_dec_type_ref(H5I_EVENTSET) > 0); + if (H5_PKG_INIT_VAR) { + /* Destroy the event set ID group */ + n += (H5I_dec_type_ref(H5I_EVENTSET) > 0); + + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5ES_term_package() */ diff --git a/src/H5ESlist.c b/src/H5ESlist.c index 90eef90fab6..b3f1a0f2f27 100644 --- a/src/H5ESlist.c +++ b/src/H5ESlist.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ESmodule.h b/src/H5ESmodule.h index f63852db384..5d05e2f82ce 100644 --- a/src/H5ESmodule.h +++ b/src/H5ESmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5ES_MODULE -#define H5_MY_PKG H5ES -#define H5_MY_PKG_ERR H5E_EVENTSET +#define H5_MY_PKG H5ES +#define H5_MY_PKG_ERR H5E_EVENTSET +#define H5_MY_PKG_INIT YES /** \page H5ES_UG HDF5 Event Set * @todo Under Construction diff --git a/src/H5ESpkg.h b/src/H5ESpkg.h index 853f39fefad..9138b6dcc9f 100644 --- a/src/H5ESpkg.h +++ b/src/H5ESpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5ESprivate.h b/src/H5ESprivate.h index 2de833de459..1899cdc24c0 100644 --- a/src/H5ESprivate.h +++ b/src/H5ESprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -47,8 +47,7 @@ typedef struct H5ES_t H5ES_t; /***************************************/ /* Library-private Function Prototypes */ /***************************************/ -herr_t H5ES_insert(hid_t es_id, H5VL_connector_t *connector, void *token, const char *caller, - const char *caller_args, ...); -H5_DLL herr_t H5ES_init(void); +herr_t H5ES_insert(hid_t es_id, H5VL_connector_t *connector, void *token, const char *caller, + const char *caller_args, ...); #endif /* H5ESprivate_H */ diff --git a/src/H5ESpublic.h b/src/H5ESpublic.h index 0f3e739d72f..635ad86170a 100644 --- a/src/H5ESpublic.h +++ b/src/H5ESpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Edefin.h b/src/H5Edefin.h new file mode 100644 index 00000000000..edefe9b4def --- /dev/null +++ b/src/H5Edefin.h @@ -0,0 +1,255 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the LICENSE file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_err -- do not edit */ +/* Add new errors to H5err.txt file */ + +#ifndef H5Edefin_H +#define H5Edefin_H + +/* Major error IDs */ +hid_t H5E_ARGS_g = H5I_INVALID_HID; /* Invalid arguments to routine */ +hid_t H5E_ATTR_g = H5I_INVALID_HID; /* Attribute */ +hid_t H5E_BTREE_g = H5I_INVALID_HID; /* B-Tree node */ +hid_t H5E_CACHE_g = H5I_INVALID_HID; /* Object cache */ +hid_t H5E_CONTEXT_g = H5I_INVALID_HID; /* API Context */ +hid_t H5E_DATASET_g = H5I_INVALID_HID; /* Dataset */ +hid_t H5E_DATASPACE_g = H5I_INVALID_HID; /* Dataspace */ +hid_t H5E_DATATYPE_g = H5I_INVALID_HID; /* Datatype */ +hid_t H5E_EARRAY_g = H5I_INVALID_HID; /* Extensible Array */ +hid_t H5E_EFL_g = H5I_INVALID_HID; /* External file list */ +hid_t H5E_ERROR_g = H5I_INVALID_HID; /* Error API */ +hid_t H5E_EVENTSET_g = H5I_INVALID_HID; /* Event Set */ +hid_t H5E_FARRAY_g = H5I_INVALID_HID; /* Fixed Array */ +hid_t H5E_FILE_g = H5I_INVALID_HID; /* File accessibility */ +hid_t H5E_FSPACE_g = H5I_INVALID_HID; /* Free Space Manager */ +hid_t H5E_FUNC_g = H5I_INVALID_HID; /* Function entry/exit */ +hid_t H5E_HEAP_g = H5I_INVALID_HID; /* Heap */ +hid_t H5E_ID_g = H5I_INVALID_HID; /* Object ID */ +hid_t H5E_INTERNAL_g = H5I_INVALID_HID; /* Internal error (too specific to document in detail) */ +hid_t H5E_IO_g = H5I_INVALID_HID; /* Low-level I/O */ +hid_t H5E_LIB_g = H5I_INVALID_HID; /* General library infrastructure */ +hid_t H5E_LINK_g = H5I_INVALID_HID; /* Links */ +hid_t H5E_MAP_g = H5I_INVALID_HID; /* Map */ +hid_t H5E_NONE_MAJOR_g = H5I_INVALID_HID; /* No error */ +hid_t H5E_OHDR_g = H5I_INVALID_HID; /* Object header */ +hid_t H5E_PAGEBUF_g = H5I_INVALID_HID; /* Page Buffering */ +hid_t H5E_PLINE_g = H5I_INVALID_HID; /* Data filters */ +hid_t H5E_PLIST_g = H5I_INVALID_HID; /* Property lists */ +hid_t H5E_PLUGIN_g = H5I_INVALID_HID; /* Plugin for dynamically loaded library */ +hid_t H5E_REFERENCE_g = H5I_INVALID_HID; /* References */ +hid_t H5E_RESOURCE_g = H5I_INVALID_HID; /* Resource unavailable */ +hid_t H5E_RS_g = H5I_INVALID_HID; /* Reference Counted Strings */ +hid_t H5E_SLIST_g = H5I_INVALID_HID; /* Skip Lists */ +hid_t H5E_SOHM_g = H5I_INVALID_HID; /* Shared Object Header Messages */ +hid_t H5E_STORAGE_g = H5I_INVALID_HID; /* Data storage */ +hid_t H5E_SYM_g = H5I_INVALID_HID; /* Symbol table */ +hid_t H5E_THREADSAFE_g = H5I_INVALID_HID; /* Threadsafety */ +hid_t H5E_TST_g = H5I_INVALID_HID; /* Ternary Search Trees */ +hid_t H5E_VFL_g = H5I_INVALID_HID; /* Virtual File Layer */ +hid_t H5E_VOL_g = H5I_INVALID_HID; /* Virtual Object Layer */ + +/* Number of major error messages */ +#define H5E_NUM_MAJ_ERRORS 40 + +/* Minor error IDs */ + +/* ARGS: Argument errors */ +hid_t H5E_BADRANGE_g = H5I_INVALID_HID; /* Out of range */ +hid_t H5E_BADTYPE_g = H5I_INVALID_HID; /* Inappropriate type */ +hid_t H5E_BADVALUE_g = H5I_INVALID_HID; /* Bad value */ +hid_t H5E_UNINITIALIZED_g = H5I_INVALID_HID; /* Information is uinitialized */ +hid_t H5E_UNSUPPORTED_g = H5I_INVALID_HID; /* Feature is unsupported */ + +/* ASYNC: Asynchronous operation errors */ +hid_t H5E_CANTCANCEL_g = H5I_INVALID_HID; /* Can't cancel operation */ +hid_t H5E_CANTWAIT_g = H5I_INVALID_HID; /* Can't wait on operation */ + +/* BTREE: B-tree related errors */ +hid_t H5E_CANTDECODE_g = H5I_INVALID_HID; /* Unable to decode value */ +hid_t H5E_CANTENCODE_g = H5I_INVALID_HID; /* Unable to encode value */ +hid_t H5E_CANTFIND_g = H5I_INVALID_HID; /* Unable to check for record */ +hid_t H5E_CANTINSERT_g = H5I_INVALID_HID; /* Unable to insert object */ +hid_t H5E_CANTLIST_g = H5I_INVALID_HID; /* Unable to list node */ +hid_t H5E_CANTMODIFY_g = H5I_INVALID_HID; /* Unable to modify record */ +hid_t H5E_CANTREDISTRIBUTE_g = H5I_INVALID_HID; /* Unable to redistribute records */ +hid_t H5E_CANTREMOVE_g = H5I_INVALID_HID; /* Unable to remove object */ +hid_t H5E_CANTSPLIT_g = H5I_INVALID_HID; /* Unable to split node */ +hid_t H5E_CANTSWAP_g = H5I_INVALID_HID; /* Unable to swap records */ +hid_t H5E_EXISTS_g = H5I_INVALID_HID; /* Object already exists */ +hid_t H5E_NOTFOUND_g = H5I_INVALID_HID; /* Object not found */ + +/* CACHE: Cache related errors */ +hid_t H5E_CANTCLEAN_g = H5I_INVALID_HID; /* Unable to mark metadata as clean */ +hid_t H5E_CANTCORK_g = H5I_INVALID_HID; /* Unable to cork an object */ +hid_t H5E_CANTDEPEND_g = H5I_INVALID_HID; /* Unable to create a flush dependency */ +hid_t H5E_CANTDIRTY_g = H5I_INVALID_HID; /* Unable to mark metadata as dirty */ +hid_t H5E_CANTEXPUNGE_g = H5I_INVALID_HID; /* Unable to expunge a metadata cache entry */ +hid_t H5E_CANTFLUSH_g = H5I_INVALID_HID; /* Unable to flush data from cache */ +hid_t H5E_CANTINS_g = H5I_INVALID_HID; /* Unable to insert metadata into cache */ +hid_t H5E_CANTLOAD_g = H5I_INVALID_HID; /* Unable to load metadata into cache */ +hid_t H5E_CANTMARKCLEAN_g = H5I_INVALID_HID; /* Unable to mark a pinned entry as clean */ +hid_t H5E_CANTMARKDIRTY_g = H5I_INVALID_HID; /* Unable to mark a pinned entry as dirty */ +hid_t H5E_CANTMARKSERIALIZED_g = H5I_INVALID_HID; /* Unable to mark an entry as serialized */ +hid_t H5E_CANTMARKUNSERIALIZED_g = H5I_INVALID_HID; /* Unable to mark an entry as unserialized */ +hid_t H5E_CANTNOTIFY_g = H5I_INVALID_HID; /* Unable to notify object about action */ +hid_t H5E_CANTPIN_g = H5I_INVALID_HID; /* Unable to pin cache entry */ +hid_t H5E_CANTPROTECT_g = H5I_INVALID_HID; /* Unable to protect metadata */ +hid_t H5E_CANTRESIZE_g = H5I_INVALID_HID; /* Unable to resize a metadata cache entry */ +hid_t H5E_CANTSERIALIZE_g = H5I_INVALID_HID; /* Unable to serialize data from cache */ +hid_t H5E_CANTTAG_g = H5I_INVALID_HID; /* Unable to tag metadata in the cache */ +hid_t H5E_CANTUNCORK_g = H5I_INVALID_HID; /* Unable to uncork an object */ +hid_t H5E_CANTUNDEPEND_g = H5I_INVALID_HID; /* Unable to destroy a flush dependency */ +hid_t H5E_CANTUNPIN_g = H5I_INVALID_HID; /* Unable to un-pin cache entry */ +hid_t H5E_CANTUNPROTECT_g = H5I_INVALID_HID; /* Unable to unprotect metadata */ +hid_t H5E_CANTUNSERIALIZE_g = H5I_INVALID_HID; /* Unable to mark metadata as unserialized */ +hid_t H5E_LOGGING_g = H5I_INVALID_HID; /* Failure in the cache logging framework */ +hid_t H5E_NOTCACHED_g = H5I_INVALID_HID; /* Metadata not currently cached */ +hid_t H5E_PROTECT_g = H5I_INVALID_HID; /* Protected metadata error */ +hid_t H5E_SYSTEM_g = H5I_INVALID_HID; /* Internal error detected */ + +/* DSPACE: Dataspace errors */ +hid_t H5E_BADSELECT_g = H5I_INVALID_HID; /* Invalid selection */ +hid_t H5E_CANTAPPEND_g = H5I_INVALID_HID; /* Can't append object */ +hid_t H5E_CANTCLIP_g = H5I_INVALID_HID; /* Can't clip hyperslab region */ +hid_t H5E_CANTCOMPARE_g = H5I_INVALID_HID; /* Can't compare objects */ +hid_t H5E_CANTCOUNT_g = H5I_INVALID_HID; /* Can't count elements */ +hid_t H5E_CANTNEXT_g = H5I_INVALID_HID; /* Can't move to next iterator location */ +hid_t H5E_CANTSELECT_g = H5I_INVALID_HID; /* Can't select hyperslab */ +hid_t H5E_INCONSISTENTSTATE_g = H5I_INVALID_HID; /* Internal states are inconsistent */ + +/* FILE: Generic low-level file I/O errors */ +hid_t H5E_CLOSEERROR_g = H5I_INVALID_HID; /* Close failed */ +hid_t H5E_FCNTL_g = H5I_INVALID_HID; /* File control (fcntl) failed */ +hid_t H5E_OVERFLOW_g = H5I_INVALID_HID; /* Address overflowed */ +hid_t H5E_READERROR_g = H5I_INVALID_HID; /* Read failed */ +hid_t H5E_SEEKERROR_g = H5I_INVALID_HID; /* Seek failed */ +hid_t H5E_WRITEERROR_g = H5I_INVALID_HID; /* Write failed */ + +/* FILEACC: File accessibility errors */ +hid_t H5E_BADFILE_g = H5I_INVALID_HID; /* Bad file ID accessed */ +hid_t H5E_CANTCLOSEFILE_g = H5I_INVALID_HID; /* Unable to close file */ +hid_t H5E_CANTCREATE_g = H5I_INVALID_HID; /* Unable to create file */ +hid_t H5E_CANTDELETEFILE_g = H5I_INVALID_HID; /* Unable to delete file */ +hid_t H5E_CANTLOCKFILE_g = H5I_INVALID_HID; /* Unable to lock file */ +hid_t H5E_CANTOPENFILE_g = H5I_INVALID_HID; /* Unable to open file */ +hid_t H5E_CANTUNLOCKFILE_g = H5I_INVALID_HID; /* Unable to unlock file */ +hid_t H5E_FILEEXISTS_g = H5I_INVALID_HID; /* File already exists */ +hid_t H5E_FILEOPEN_g = H5I_INVALID_HID; /* File already open */ +hid_t H5E_MOUNT_g = H5I_INVALID_HID; /* File mount error */ +hid_t H5E_NOTHDF5_g = H5I_INVALID_HID; /* Not an HDF5 file */ +hid_t H5E_TRUNCATED_g = H5I_INVALID_HID; /* File has been truncated */ +hid_t H5E_UNMOUNT_g = H5I_INVALID_HID; /* File unmount error */ + +/* FSPACE: Free space errors */ +hid_t H5E_CANTMERGE_g = H5I_INVALID_HID; /* Can't merge objects */ +hid_t H5E_CANTREVIVE_g = H5I_INVALID_HID; /* Can't revive object */ +hid_t H5E_CANTSHRINK_g = H5I_INVALID_HID; /* Can't shrink container */ + +/* FUNC: Function entry/exit interface errors */ +hid_t H5E_ALREADYINIT_g = H5I_INVALID_HID; /* Object already initialized */ +hid_t H5E_CANTINIT_g = H5I_INVALID_HID; /* Unable to initialize object */ +hid_t H5E_CANTRELEASE_g = H5I_INVALID_HID; /* Unable to release object */ + +/* GROUP: Group related errors */ +hid_t H5E_CANTCLOSEOBJ_g = H5I_INVALID_HID; /* Can't close object */ +hid_t H5E_CANTOPENOBJ_g = H5I_INVALID_HID; /* Can't open object */ +hid_t H5E_COMPLEN_g = H5I_INVALID_HID; /* Name component is too long */ +hid_t H5E_PATH_g = H5I_INVALID_HID; /* Problem with path to object */ + +/* HEAP: Heap errors */ +hid_t H5E_CANTATTACH_g = H5I_INVALID_HID; /* Can't attach object */ +hid_t H5E_CANTCOMPUTE_g = H5I_INVALID_HID; /* Can't compute value */ +hid_t H5E_CANTEXTEND_g = H5I_INVALID_HID; /* Can't extend heap's space */ +hid_t H5E_CANTOPERATE_g = H5I_INVALID_HID; /* Can't operate on object */ +hid_t H5E_CANTRESTORE_g = H5I_INVALID_HID; /* Can't restore condition */ +hid_t H5E_CANTUPDATE_g = H5I_INVALID_HID; /* Can't update object */ + +/* ID: Object ID related errors */ +hid_t H5E_BADGROUP_g = H5I_INVALID_HID; /* Unable to find ID group information */ +hid_t H5E_BADID_g = H5I_INVALID_HID; /* Unable to find ID information (already closed?) */ +hid_t H5E_CANTDEC_g = H5I_INVALID_HID; /* Unable to decrement reference count */ +hid_t H5E_CANTINC_g = H5I_INVALID_HID; /* Unable to increment reference count */ +hid_t H5E_CANTREGISTER_g = H5I_INVALID_HID; /* Unable to register new ID */ +hid_t H5E_NOIDS_g = H5I_INVALID_HID; /* Out of IDs for group */ + +/* LINK: Link related errors */ +hid_t H5E_CANTMOVE_g = H5I_INVALID_HID; /* Can't move object */ +hid_t H5E_CANTSORT_g = H5I_INVALID_HID; /* Can't sort objects */ +hid_t H5E_NLINKS_g = H5I_INVALID_HID; /* Too many soft links in path */ +hid_t H5E_NOTREGISTERED_g = H5I_INVALID_HID; /* Link class not registered */ +hid_t H5E_TRAVERSE_g = H5I_INVALID_HID; /* Link traversal failure */ + +/* MAP: Map related errors */ +hid_t H5E_CANTPUT_g = H5I_INVALID_HID; /* Can't put value */ + +/* MPI: Parallel MPI errors */ +hid_t H5E_CANTGATHER_g = H5I_INVALID_HID; /* Can't gather data */ +hid_t H5E_CANTRECV_g = H5I_INVALID_HID; /* Can't receive data */ +hid_t H5E_MPI_g = H5I_INVALID_HID; /* Some MPI function failed */ +hid_t H5E_MPIERRSTR_g = H5I_INVALID_HID; /* MPI Error String */ +hid_t H5E_NO_INDEPENDENT_g = H5I_INVALID_HID; /* Can't perform independent IO */ + +/* NONE: No error */ +hid_t H5E_NONE_MINOR_g = H5I_INVALID_HID; /* No error */ + +/* OHDR: Object header related errors */ +hid_t H5E_ALIGNMENT_g = H5I_INVALID_HID; /* Alignment error */ +hid_t H5E_BADITER_g = H5I_INVALID_HID; /* Iteration failed */ +hid_t H5E_BADMESG_g = H5I_INVALID_HID; /* Unrecognized message */ +hid_t H5E_CANTDELETE_g = H5I_INVALID_HID; /* Can't delete message */ +hid_t H5E_CANTPACK_g = H5I_INVALID_HID; /* Can't pack messages */ +hid_t H5E_CANTRENAME_g = H5I_INVALID_HID; /* Unable to rename object */ +hid_t H5E_CANTRESET_g = H5I_INVALID_HID; /* Can't reset object */ +hid_t H5E_LINKCOUNT_g = H5I_INVALID_HID; /* Bad object header link count */ +hid_t H5E_VERSION_g = H5I_INVALID_HID; /* Wrong version number */ + +/* PIPELINE: I/O pipeline errors */ +hid_t H5E_CALLBACK_g = H5I_INVALID_HID; /* Callback failed */ +hid_t H5E_CANAPPLY_g = H5I_INVALID_HID; /* Error from filter 'can apply' callback */ +hid_t H5E_CANTFILTER_g = H5I_INVALID_HID; /* Filter operation failed */ +hid_t H5E_NOENCODER_g = H5I_INVALID_HID; /* Filter present but encoding disabled */ +hid_t H5E_NOFILTER_g = H5I_INVALID_HID; /* Requested filter is not available */ +hid_t H5E_SETLOCAL_g = H5I_INVALID_HID; /* Error from filter 'set local' callback */ + +/* PLIST: Property list errors */ +hid_t H5E_CANTGET_g = H5I_INVALID_HID; /* Can't get value */ +hid_t H5E_CANTSET_g = H5I_INVALID_HID; /* Can't set value */ +hid_t H5E_DUPCLASS_g = H5I_INVALID_HID; /* Duplicate class name in parent class */ +hid_t H5E_SETDISALLOWED_g = H5I_INVALID_HID; /* Disallowed operation */ + +/* PLUGIN: Plugin errors */ +hid_t H5E_OPENERROR_g = H5I_INVALID_HID; /* Can't open directory or file */ + +/* RESOURCE: Resource errors */ +hid_t H5E_ALREADYEXISTS_g = H5I_INVALID_HID; /* Object already exists */ +hid_t H5E_CANTALLOC_g = H5I_INVALID_HID; /* Can't allocate space */ +hid_t H5E_CANTCOPY_g = H5I_INVALID_HID; /* Unable to copy object */ +hid_t H5E_CANTFREE_g = H5I_INVALID_HID; /* Unable to free object */ +hid_t H5E_CANTGC_g = H5I_INVALID_HID; /* Unable to garbage collect */ +hid_t H5E_CANTGETSIZE_g = H5I_INVALID_HID; /* Unable to compute size */ +hid_t H5E_CANTLOCK_g = H5I_INVALID_HID; /* Unable to lock object */ +hid_t H5E_CANTUNLOCK_g = H5I_INVALID_HID; /* Unable to unlock object */ +hid_t H5E_NOSPACE_g = H5I_INVALID_HID; /* No space available for allocation */ +hid_t H5E_OBJOPEN_g = H5I_INVALID_HID; /* Object is already open */ + +/* SYSTEM: System level errors */ +hid_t H5E_SYSERRSTR_g = H5I_INVALID_HID; /* System error message */ + +/* TYPECONV: Datatype conversion errors */ +hid_t H5E_BADSIZE_g = H5I_INVALID_HID; /* Bad size for object */ +hid_t H5E_CANTCONVERT_g = H5I_INVALID_HID; /* Can't convert datatypes */ + +/* Number of minor error messages */ +#define H5E_NUM_MIN_ERRORS 140 + +#endif /* H5Edefin_H */ diff --git a/src/H5Edeprec.c b/src/H5Edeprec.c index 87b39e4133f..5f32ccd204f 100644 --- a/src/H5Edeprec.c +++ b/src/H5Edeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Einit.h b/src/H5Einit.h new file mode 100644 index 00000000000..95c1ddec733 --- /dev/null +++ b/src/H5Einit.h @@ -0,0 +1,814 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the LICENSE file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_err -- do not edit */ +/* Add new errors to H5err.txt file */ + +#ifndef H5Einit_H +#define H5Einit_H + +/*********************/ +/* Major error codes */ +/*********************/ + +/* H5E_ARGS */ +assert(H5I_INVALID_HID == H5E_ARGS_g); +if((H5E_ARGS_g = H5I_register(H5I_ERROR_MSG, &H5E_ARGS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Remember first major error code ID */ +assert(H5E_first_maj_id_g==H5I_INVALID_HID); +H5E_first_maj_id_g = H5E_ARGS_g; + +/* H5E_ATTR */ +assert(H5I_INVALID_HID == H5E_ATTR_g); +if((H5E_ATTR_g = H5I_register(H5I_ERROR_MSG, &H5E_ATTR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_BTREE */ +assert(H5I_INVALID_HID == H5E_BTREE_g); +if((H5E_BTREE_g = H5I_register(H5I_ERROR_MSG, &H5E_BTREE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CACHE */ +assert(H5I_INVALID_HID == H5E_CACHE_g); +if((H5E_CACHE_g = H5I_register(H5I_ERROR_MSG, &H5E_CACHE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CONTEXT */ +assert(H5I_INVALID_HID == H5E_CONTEXT_g); +if((H5E_CONTEXT_g = H5I_register(H5I_ERROR_MSG, &H5E_CONTEXT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_DATASET */ +assert(H5I_INVALID_HID == H5E_DATASET_g); +if((H5E_DATASET_g = H5I_register(H5I_ERROR_MSG, &H5E_DATASET_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_DATASPACE */ +assert(H5I_INVALID_HID == H5E_DATASPACE_g); +if((H5E_DATASPACE_g = H5I_register(H5I_ERROR_MSG, &H5E_DATASPACE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_DATATYPE */ +assert(H5I_INVALID_HID == H5E_DATATYPE_g); +if((H5E_DATATYPE_g = H5I_register(H5I_ERROR_MSG, &H5E_DATATYPE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_EARRAY */ +assert(H5I_INVALID_HID == H5E_EARRAY_g); +if((H5E_EARRAY_g = H5I_register(H5I_ERROR_MSG, &H5E_EARRAY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_EFL */ +assert(H5I_INVALID_HID == H5E_EFL_g); +if((H5E_EFL_g = H5I_register(H5I_ERROR_MSG, &H5E_EFL_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_ERROR */ +assert(H5I_INVALID_HID == H5E_ERROR_g); +if((H5E_ERROR_g = H5I_register(H5I_ERROR_MSG, &H5E_ERROR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_EVENTSET */ +assert(H5I_INVALID_HID == H5E_EVENTSET_g); +if((H5E_EVENTSET_g = H5I_register(H5I_ERROR_MSG, &H5E_EVENTSET_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_FARRAY */ +assert(H5I_INVALID_HID == H5E_FARRAY_g); +if((H5E_FARRAY_g = H5I_register(H5I_ERROR_MSG, &H5E_FARRAY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_FILE */ +assert(H5I_INVALID_HID == H5E_FILE_g); +if((H5E_FILE_g = H5I_register(H5I_ERROR_MSG, &H5E_FILE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_FSPACE */ +assert(H5I_INVALID_HID == H5E_FSPACE_g); +if((H5E_FSPACE_g = H5I_register(H5I_ERROR_MSG, &H5E_FSPACE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_FUNC */ +assert(H5I_INVALID_HID == H5E_FUNC_g); +if((H5E_FUNC_g = H5I_register(H5I_ERROR_MSG, &H5E_FUNC_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_HEAP */ +assert(H5I_INVALID_HID == H5E_HEAP_g); +if((H5E_HEAP_g = H5I_register(H5I_ERROR_MSG, &H5E_HEAP_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_ID */ +assert(H5I_INVALID_HID == H5E_ID_g); +if((H5E_ID_g = H5I_register(H5I_ERROR_MSG, &H5E_ID_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_INTERNAL */ +assert(H5I_INVALID_HID == H5E_INTERNAL_g); +if((H5E_INTERNAL_g = H5I_register(H5I_ERROR_MSG, &H5E_INTERNAL_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_IO */ +assert(H5I_INVALID_HID == H5E_IO_g); +if((H5E_IO_g = H5I_register(H5I_ERROR_MSG, &H5E_IO_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_LIB */ +assert(H5I_INVALID_HID == H5E_LIB_g); +if((H5E_LIB_g = H5I_register(H5I_ERROR_MSG, &H5E_LIB_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_LINK */ +assert(H5I_INVALID_HID == H5E_LINK_g); +if((H5E_LINK_g = H5I_register(H5I_ERROR_MSG, &H5E_LINK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_MAP */ +assert(H5I_INVALID_HID == H5E_MAP_g); +if((H5E_MAP_g = H5I_register(H5I_ERROR_MSG, &H5E_MAP_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NONE_MAJOR */ +assert(H5I_INVALID_HID == H5E_NONE_MAJOR_g); +if((H5E_NONE_MAJOR_g = H5I_register(H5I_ERROR_MSG, &H5E_NONE_MAJOR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_OHDR */ +assert(H5I_INVALID_HID == H5E_OHDR_g); +if((H5E_OHDR_g = H5I_register(H5I_ERROR_MSG, &H5E_OHDR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_PAGEBUF */ +assert(H5I_INVALID_HID == H5E_PAGEBUF_g); +if((H5E_PAGEBUF_g = H5I_register(H5I_ERROR_MSG, &H5E_PAGEBUF_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_PLINE */ +assert(H5I_INVALID_HID == H5E_PLINE_g); +if((H5E_PLINE_g = H5I_register(H5I_ERROR_MSG, &H5E_PLINE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_PLIST */ +assert(H5I_INVALID_HID == H5E_PLIST_g); +if((H5E_PLIST_g = H5I_register(H5I_ERROR_MSG, &H5E_PLIST_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_PLUGIN */ +assert(H5I_INVALID_HID == H5E_PLUGIN_g); +if((H5E_PLUGIN_g = H5I_register(H5I_ERROR_MSG, &H5E_PLUGIN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_REFERENCE */ +assert(H5I_INVALID_HID == H5E_REFERENCE_g); +if((H5E_REFERENCE_g = H5I_register(H5I_ERROR_MSG, &H5E_REFERENCE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_RESOURCE */ +assert(H5I_INVALID_HID == H5E_RESOURCE_g); +if((H5E_RESOURCE_g = H5I_register(H5I_ERROR_MSG, &H5E_RESOURCE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_RS */ +assert(H5I_INVALID_HID == H5E_RS_g); +if((H5E_RS_g = H5I_register(H5I_ERROR_MSG, &H5E_RS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_SLIST */ +assert(H5I_INVALID_HID == H5E_SLIST_g); +if((H5E_SLIST_g = H5I_register(H5I_ERROR_MSG, &H5E_SLIST_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_SOHM */ +assert(H5I_INVALID_HID == H5E_SOHM_g); +if((H5E_SOHM_g = H5I_register(H5I_ERROR_MSG, &H5E_SOHM_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_STORAGE */ +assert(H5I_INVALID_HID == H5E_STORAGE_g); +if((H5E_STORAGE_g = H5I_register(H5I_ERROR_MSG, &H5E_STORAGE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_SYM */ +assert(H5I_INVALID_HID == H5E_SYM_g); +if((H5E_SYM_g = H5I_register(H5I_ERROR_MSG, &H5E_SYM_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_THREADSAFE */ +assert(H5I_INVALID_HID == H5E_THREADSAFE_g); +if((H5E_THREADSAFE_g = H5I_register(H5I_ERROR_MSG, &H5E_THREADSAFE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_TST */ +assert(H5I_INVALID_HID == H5E_TST_g); +if((H5E_TST_g = H5I_register(H5I_ERROR_MSG, &H5E_TST_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_VFL */ +assert(H5I_INVALID_HID == H5E_VFL_g); +if((H5E_VFL_g = H5I_register(H5I_ERROR_MSG, &H5E_VFL_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_VOL */ +assert(H5I_INVALID_HID == H5E_VOL_g); +if((H5E_VOL_g = H5I_register(H5I_ERROR_MSG, &H5E_VOL_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Remember last major error code ID */ +assert(H5E_last_maj_id_g==H5I_INVALID_HID); +H5E_last_maj_id_g = H5E_VOL_g; + + +/*********************/ +/* Minor error codes */ +/*********************/ + + +/* Argument errors */ +/* H5E_BADRANGE */ +assert(H5I_INVALID_HID == H5E_BADRANGE_g); +if((H5E_BADRANGE_g = H5I_register(H5I_ERROR_MSG, &H5E_BADRANGE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Remember first minor error code ID */ +assert(H5E_first_min_id_g==H5I_INVALID_HID); +H5E_first_min_id_g = H5E_BADRANGE_g; + +/* H5E_BADTYPE */ +assert(H5I_INVALID_HID == H5E_BADTYPE_g); +if((H5E_BADTYPE_g = H5I_register(H5I_ERROR_MSG, &H5E_BADTYPE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_BADVALUE */ +assert(H5I_INVALID_HID == H5E_BADVALUE_g); +if((H5E_BADVALUE_g = H5I_register(H5I_ERROR_MSG, &H5E_BADVALUE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_UNINITIALIZED */ +assert(H5I_INVALID_HID == H5E_UNINITIALIZED_g); +if((H5E_UNINITIALIZED_g = H5I_register(H5I_ERROR_MSG, &H5E_UNINITIALIZED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_UNSUPPORTED */ +assert(H5I_INVALID_HID == H5E_UNSUPPORTED_g); +if((H5E_UNSUPPORTED_g = H5I_register(H5I_ERROR_MSG, &H5E_UNSUPPORTED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Asynchronous operation errors */ +/* H5E_CANTCANCEL */ +assert(H5I_INVALID_HID == H5E_CANTCANCEL_g); +if((H5E_CANTCANCEL_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCANCEL_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTWAIT */ +assert(H5I_INVALID_HID == H5E_CANTWAIT_g); +if((H5E_CANTWAIT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTWAIT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* B-tree related errors */ +/* H5E_CANTDECODE */ +assert(H5I_INVALID_HID == H5E_CANTDECODE_g); +if((H5E_CANTDECODE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTDECODE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTENCODE */ +assert(H5I_INVALID_HID == H5E_CANTENCODE_g); +if((H5E_CANTENCODE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTENCODE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTFIND */ +assert(H5I_INVALID_HID == H5E_CANTFIND_g); +if((H5E_CANTFIND_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTFIND_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTINSERT */ +assert(H5I_INVALID_HID == H5E_CANTINSERT_g); +if((H5E_CANTINSERT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTINSERT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTLIST */ +assert(H5I_INVALID_HID == H5E_CANTLIST_g); +if((H5E_CANTLIST_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTLIST_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTMODIFY */ +assert(H5I_INVALID_HID == H5E_CANTMODIFY_g); +if((H5E_CANTMODIFY_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTMODIFY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTREDISTRIBUTE */ +assert(H5I_INVALID_HID == H5E_CANTREDISTRIBUTE_g); +if((H5E_CANTREDISTRIBUTE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTREDISTRIBUTE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTREMOVE */ +assert(H5I_INVALID_HID == H5E_CANTREMOVE_g); +if((H5E_CANTREMOVE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTREMOVE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTSPLIT */ +assert(H5I_INVALID_HID == H5E_CANTSPLIT_g); +if((H5E_CANTSPLIT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTSPLIT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTSWAP */ +assert(H5I_INVALID_HID == H5E_CANTSWAP_g); +if((H5E_CANTSWAP_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTSWAP_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_EXISTS */ +assert(H5I_INVALID_HID == H5E_EXISTS_g); +if((H5E_EXISTS_g = H5I_register(H5I_ERROR_MSG, &H5E_EXISTS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOTFOUND */ +assert(H5I_INVALID_HID == H5E_NOTFOUND_g); +if((H5E_NOTFOUND_g = H5I_register(H5I_ERROR_MSG, &H5E_NOTFOUND_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Cache related errors */ +/* H5E_CANTCLEAN */ +assert(H5I_INVALID_HID == H5E_CANTCLEAN_g); +if((H5E_CANTCLEAN_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCLEAN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCORK */ +assert(H5I_INVALID_HID == H5E_CANTCORK_g); +if((H5E_CANTCORK_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCORK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTDEPEND */ +assert(H5I_INVALID_HID == H5E_CANTDEPEND_g); +if((H5E_CANTDEPEND_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTDEPEND_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTDIRTY */ +assert(H5I_INVALID_HID == H5E_CANTDIRTY_g); +if((H5E_CANTDIRTY_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTDIRTY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTEXPUNGE */ +assert(H5I_INVALID_HID == H5E_CANTEXPUNGE_g); +if((H5E_CANTEXPUNGE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTEXPUNGE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTFLUSH */ +assert(H5I_INVALID_HID == H5E_CANTFLUSH_g); +if((H5E_CANTFLUSH_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTFLUSH_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTINS */ +assert(H5I_INVALID_HID == H5E_CANTINS_g); +if((H5E_CANTINS_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTINS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTLOAD */ +assert(H5I_INVALID_HID == H5E_CANTLOAD_g); +if((H5E_CANTLOAD_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTLOAD_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTMARKCLEAN */ +assert(H5I_INVALID_HID == H5E_CANTMARKCLEAN_g); +if((H5E_CANTMARKCLEAN_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTMARKCLEAN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTMARKDIRTY */ +assert(H5I_INVALID_HID == H5E_CANTMARKDIRTY_g); +if((H5E_CANTMARKDIRTY_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTMARKDIRTY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTMARKSERIALIZED */ +assert(H5I_INVALID_HID == H5E_CANTMARKSERIALIZED_g); +if((H5E_CANTMARKSERIALIZED_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTMARKSERIALIZED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTMARKUNSERIALIZED */ +assert(H5I_INVALID_HID == H5E_CANTMARKUNSERIALIZED_g); +if((H5E_CANTMARKUNSERIALIZED_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTMARKUNSERIALIZED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTNOTIFY */ +assert(H5I_INVALID_HID == H5E_CANTNOTIFY_g); +if((H5E_CANTNOTIFY_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTNOTIFY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTPIN */ +assert(H5I_INVALID_HID == H5E_CANTPIN_g); +if((H5E_CANTPIN_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTPIN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTPROTECT */ +assert(H5I_INVALID_HID == H5E_CANTPROTECT_g); +if((H5E_CANTPROTECT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTPROTECT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTRESIZE */ +assert(H5I_INVALID_HID == H5E_CANTRESIZE_g); +if((H5E_CANTRESIZE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTRESIZE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTSERIALIZE */ +assert(H5I_INVALID_HID == H5E_CANTSERIALIZE_g); +if((H5E_CANTSERIALIZE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTSERIALIZE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTTAG */ +assert(H5I_INVALID_HID == H5E_CANTTAG_g); +if((H5E_CANTTAG_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTTAG_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUNCORK */ +assert(H5I_INVALID_HID == H5E_CANTUNCORK_g); +if((H5E_CANTUNCORK_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUNCORK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUNDEPEND */ +assert(H5I_INVALID_HID == H5E_CANTUNDEPEND_g); +if((H5E_CANTUNDEPEND_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUNDEPEND_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUNPIN */ +assert(H5I_INVALID_HID == H5E_CANTUNPIN_g); +if((H5E_CANTUNPIN_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUNPIN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUNPROTECT */ +assert(H5I_INVALID_HID == H5E_CANTUNPROTECT_g); +if((H5E_CANTUNPROTECT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUNPROTECT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUNSERIALIZE */ +assert(H5I_INVALID_HID == H5E_CANTUNSERIALIZE_g); +if((H5E_CANTUNSERIALIZE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUNSERIALIZE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_LOGGING */ +assert(H5I_INVALID_HID == H5E_LOGGING_g); +if((H5E_LOGGING_g = H5I_register(H5I_ERROR_MSG, &H5E_LOGGING_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOTCACHED */ +assert(H5I_INVALID_HID == H5E_NOTCACHED_g); +if((H5E_NOTCACHED_g = H5I_register(H5I_ERROR_MSG, &H5E_NOTCACHED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_PROTECT */ +assert(H5I_INVALID_HID == H5E_PROTECT_g); +if((H5E_PROTECT_g = H5I_register(H5I_ERROR_MSG, &H5E_PROTECT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_SYSTEM */ +assert(H5I_INVALID_HID == H5E_SYSTEM_g); +if((H5E_SYSTEM_g = H5I_register(H5I_ERROR_MSG, &H5E_SYSTEM_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Dataspace errors */ +/* H5E_BADSELECT */ +assert(H5I_INVALID_HID == H5E_BADSELECT_g); +if((H5E_BADSELECT_g = H5I_register(H5I_ERROR_MSG, &H5E_BADSELECT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTAPPEND */ +assert(H5I_INVALID_HID == H5E_CANTAPPEND_g); +if((H5E_CANTAPPEND_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTAPPEND_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCLIP */ +assert(H5I_INVALID_HID == H5E_CANTCLIP_g); +if((H5E_CANTCLIP_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCLIP_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCOMPARE */ +assert(H5I_INVALID_HID == H5E_CANTCOMPARE_g); +if((H5E_CANTCOMPARE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCOMPARE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCOUNT */ +assert(H5I_INVALID_HID == H5E_CANTCOUNT_g); +if((H5E_CANTCOUNT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCOUNT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTNEXT */ +assert(H5I_INVALID_HID == H5E_CANTNEXT_g); +if((H5E_CANTNEXT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTNEXT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTSELECT */ +assert(H5I_INVALID_HID == H5E_CANTSELECT_g); +if((H5E_CANTSELECT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTSELECT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_INCONSISTENTSTATE */ +assert(H5I_INVALID_HID == H5E_INCONSISTENTSTATE_g); +if((H5E_INCONSISTENTSTATE_g = H5I_register(H5I_ERROR_MSG, &H5E_INCONSISTENTSTATE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Generic low-level file I/O errors */ +/* H5E_CLOSEERROR */ +assert(H5I_INVALID_HID == H5E_CLOSEERROR_g); +if((H5E_CLOSEERROR_g = H5I_register(H5I_ERROR_MSG, &H5E_CLOSEERROR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_FCNTL */ +assert(H5I_INVALID_HID == H5E_FCNTL_g); +if((H5E_FCNTL_g = H5I_register(H5I_ERROR_MSG, &H5E_FCNTL_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_OVERFLOW */ +assert(H5I_INVALID_HID == H5E_OVERFLOW_g); +if((H5E_OVERFLOW_g = H5I_register(H5I_ERROR_MSG, &H5E_OVERFLOW_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_READERROR */ +assert(H5I_INVALID_HID == H5E_READERROR_g); +if((H5E_READERROR_g = H5I_register(H5I_ERROR_MSG, &H5E_READERROR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_SEEKERROR */ +assert(H5I_INVALID_HID == H5E_SEEKERROR_g); +if((H5E_SEEKERROR_g = H5I_register(H5I_ERROR_MSG, &H5E_SEEKERROR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_WRITEERROR */ +assert(H5I_INVALID_HID == H5E_WRITEERROR_g); +if((H5E_WRITEERROR_g = H5I_register(H5I_ERROR_MSG, &H5E_WRITEERROR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* File accessibility errors */ +/* H5E_BADFILE */ +assert(H5I_INVALID_HID == H5E_BADFILE_g); +if((H5E_BADFILE_g = H5I_register(H5I_ERROR_MSG, &H5E_BADFILE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCLOSEFILE */ +assert(H5I_INVALID_HID == H5E_CANTCLOSEFILE_g); +if((H5E_CANTCLOSEFILE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCLOSEFILE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCREATE */ +assert(H5I_INVALID_HID == H5E_CANTCREATE_g); +if((H5E_CANTCREATE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCREATE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTDELETEFILE */ +assert(H5I_INVALID_HID == H5E_CANTDELETEFILE_g); +if((H5E_CANTDELETEFILE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTDELETEFILE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTLOCKFILE */ +assert(H5I_INVALID_HID == H5E_CANTLOCKFILE_g); +if((H5E_CANTLOCKFILE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTLOCKFILE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTOPENFILE */ +assert(H5I_INVALID_HID == H5E_CANTOPENFILE_g); +if((H5E_CANTOPENFILE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTOPENFILE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUNLOCKFILE */ +assert(H5I_INVALID_HID == H5E_CANTUNLOCKFILE_g); +if((H5E_CANTUNLOCKFILE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUNLOCKFILE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_FILEEXISTS */ +assert(H5I_INVALID_HID == H5E_FILEEXISTS_g); +if((H5E_FILEEXISTS_g = H5I_register(H5I_ERROR_MSG, &H5E_FILEEXISTS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_FILEOPEN */ +assert(H5I_INVALID_HID == H5E_FILEOPEN_g); +if((H5E_FILEOPEN_g = H5I_register(H5I_ERROR_MSG, &H5E_FILEOPEN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_MOUNT */ +assert(H5I_INVALID_HID == H5E_MOUNT_g); +if((H5E_MOUNT_g = H5I_register(H5I_ERROR_MSG, &H5E_MOUNT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOTHDF5 */ +assert(H5I_INVALID_HID == H5E_NOTHDF5_g); +if((H5E_NOTHDF5_g = H5I_register(H5I_ERROR_MSG, &H5E_NOTHDF5_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_TRUNCATED */ +assert(H5I_INVALID_HID == H5E_TRUNCATED_g); +if((H5E_TRUNCATED_g = H5I_register(H5I_ERROR_MSG, &H5E_TRUNCATED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_UNMOUNT */ +assert(H5I_INVALID_HID == H5E_UNMOUNT_g); +if((H5E_UNMOUNT_g = H5I_register(H5I_ERROR_MSG, &H5E_UNMOUNT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Free space errors */ +/* H5E_CANTMERGE */ +assert(H5I_INVALID_HID == H5E_CANTMERGE_g); +if((H5E_CANTMERGE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTMERGE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTREVIVE */ +assert(H5I_INVALID_HID == H5E_CANTREVIVE_g); +if((H5E_CANTREVIVE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTREVIVE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTSHRINK */ +assert(H5I_INVALID_HID == H5E_CANTSHRINK_g); +if((H5E_CANTSHRINK_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTSHRINK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Function entry/exit interface errors */ +/* H5E_ALREADYINIT */ +assert(H5I_INVALID_HID == H5E_ALREADYINIT_g); +if((H5E_ALREADYINIT_g = H5I_register(H5I_ERROR_MSG, &H5E_ALREADYINIT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTINIT */ +assert(H5I_INVALID_HID == H5E_CANTINIT_g); +if((H5E_CANTINIT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTINIT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTRELEASE */ +assert(H5I_INVALID_HID == H5E_CANTRELEASE_g); +if((H5E_CANTRELEASE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTRELEASE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Group related errors */ +/* H5E_CANTCLOSEOBJ */ +assert(H5I_INVALID_HID == H5E_CANTCLOSEOBJ_g); +if((H5E_CANTCLOSEOBJ_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCLOSEOBJ_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTOPENOBJ */ +assert(H5I_INVALID_HID == H5E_CANTOPENOBJ_g); +if((H5E_CANTOPENOBJ_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTOPENOBJ_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_COMPLEN */ +assert(H5I_INVALID_HID == H5E_COMPLEN_g); +if((H5E_COMPLEN_g = H5I_register(H5I_ERROR_MSG, &H5E_COMPLEN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_PATH */ +assert(H5I_INVALID_HID == H5E_PATH_g); +if((H5E_PATH_g = H5I_register(H5I_ERROR_MSG, &H5E_PATH_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Heap errors */ +/* H5E_CANTATTACH */ +assert(H5I_INVALID_HID == H5E_CANTATTACH_g); +if((H5E_CANTATTACH_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTATTACH_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCOMPUTE */ +assert(H5I_INVALID_HID == H5E_CANTCOMPUTE_g); +if((H5E_CANTCOMPUTE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCOMPUTE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTEXTEND */ +assert(H5I_INVALID_HID == H5E_CANTEXTEND_g); +if((H5E_CANTEXTEND_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTEXTEND_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTOPERATE */ +assert(H5I_INVALID_HID == H5E_CANTOPERATE_g); +if((H5E_CANTOPERATE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTOPERATE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTRESTORE */ +assert(H5I_INVALID_HID == H5E_CANTRESTORE_g); +if((H5E_CANTRESTORE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTRESTORE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUPDATE */ +assert(H5I_INVALID_HID == H5E_CANTUPDATE_g); +if((H5E_CANTUPDATE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUPDATE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Object ID related errors */ +/* H5E_BADGROUP */ +assert(H5I_INVALID_HID == H5E_BADGROUP_g); +if((H5E_BADGROUP_g = H5I_register(H5I_ERROR_MSG, &H5E_BADGROUP_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_BADID */ +assert(H5I_INVALID_HID == H5E_BADID_g); +if((H5E_BADID_g = H5I_register(H5I_ERROR_MSG, &H5E_BADID_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTDEC */ +assert(H5I_INVALID_HID == H5E_CANTDEC_g); +if((H5E_CANTDEC_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTDEC_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTINC */ +assert(H5I_INVALID_HID == H5E_CANTINC_g); +if((H5E_CANTINC_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTINC_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTREGISTER */ +assert(H5I_INVALID_HID == H5E_CANTREGISTER_g); +if((H5E_CANTREGISTER_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTREGISTER_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOIDS */ +assert(H5I_INVALID_HID == H5E_NOIDS_g); +if((H5E_NOIDS_g = H5I_register(H5I_ERROR_MSG, &H5E_NOIDS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Link related errors */ +/* H5E_CANTMOVE */ +assert(H5I_INVALID_HID == H5E_CANTMOVE_g); +if((H5E_CANTMOVE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTMOVE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTSORT */ +assert(H5I_INVALID_HID == H5E_CANTSORT_g); +if((H5E_CANTSORT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTSORT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NLINKS */ +assert(H5I_INVALID_HID == H5E_NLINKS_g); +if((H5E_NLINKS_g = H5I_register(H5I_ERROR_MSG, &H5E_NLINKS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOTREGISTERED */ +assert(H5I_INVALID_HID == H5E_NOTREGISTERED_g); +if((H5E_NOTREGISTERED_g = H5I_register(H5I_ERROR_MSG, &H5E_NOTREGISTERED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_TRAVERSE */ +assert(H5I_INVALID_HID == H5E_TRAVERSE_g); +if((H5E_TRAVERSE_g = H5I_register(H5I_ERROR_MSG, &H5E_TRAVERSE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Map related errors */ +/* H5E_CANTPUT */ +assert(H5I_INVALID_HID == H5E_CANTPUT_g); +if((H5E_CANTPUT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTPUT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Parallel MPI errors */ +/* H5E_CANTGATHER */ +assert(H5I_INVALID_HID == H5E_CANTGATHER_g); +if((H5E_CANTGATHER_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTGATHER_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTRECV */ +assert(H5I_INVALID_HID == H5E_CANTRECV_g); +if((H5E_CANTRECV_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTRECV_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_MPI */ +assert(H5I_INVALID_HID == H5E_MPI_g); +if((H5E_MPI_g = H5I_register(H5I_ERROR_MSG, &H5E_MPI_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_MPIERRSTR */ +assert(H5I_INVALID_HID == H5E_MPIERRSTR_g); +if((H5E_MPIERRSTR_g = H5I_register(H5I_ERROR_MSG, &H5E_MPIERRSTR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NO_INDEPENDENT */ +assert(H5I_INVALID_HID == H5E_NO_INDEPENDENT_g); +if((H5E_NO_INDEPENDENT_g = H5I_register(H5I_ERROR_MSG, &H5E_NO_INDEPENDENT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* No error */ +/* H5E_NONE_MINOR */ +assert(H5I_INVALID_HID == H5E_NONE_MINOR_g); +if((H5E_NONE_MINOR_g = H5I_register(H5I_ERROR_MSG, &H5E_NONE_MINOR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Object header related errors */ +/* H5E_ALIGNMENT */ +assert(H5I_INVALID_HID == H5E_ALIGNMENT_g); +if((H5E_ALIGNMENT_g = H5I_register(H5I_ERROR_MSG, &H5E_ALIGNMENT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_BADITER */ +assert(H5I_INVALID_HID == H5E_BADITER_g); +if((H5E_BADITER_g = H5I_register(H5I_ERROR_MSG, &H5E_BADITER_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_BADMESG */ +assert(H5I_INVALID_HID == H5E_BADMESG_g); +if((H5E_BADMESG_g = H5I_register(H5I_ERROR_MSG, &H5E_BADMESG_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTDELETE */ +assert(H5I_INVALID_HID == H5E_CANTDELETE_g); +if((H5E_CANTDELETE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTDELETE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTPACK */ +assert(H5I_INVALID_HID == H5E_CANTPACK_g); +if((H5E_CANTPACK_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTPACK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTRENAME */ +assert(H5I_INVALID_HID == H5E_CANTRENAME_g); +if((H5E_CANTRENAME_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTRENAME_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTRESET */ +assert(H5I_INVALID_HID == H5E_CANTRESET_g); +if((H5E_CANTRESET_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTRESET_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_LINKCOUNT */ +assert(H5I_INVALID_HID == H5E_LINKCOUNT_g); +if((H5E_LINKCOUNT_g = H5I_register(H5I_ERROR_MSG, &H5E_LINKCOUNT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_VERSION */ +assert(H5I_INVALID_HID == H5E_VERSION_g); +if((H5E_VERSION_g = H5I_register(H5I_ERROR_MSG, &H5E_VERSION_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* I/O pipeline errors */ +/* H5E_CALLBACK */ +assert(H5I_INVALID_HID == H5E_CALLBACK_g); +if((H5E_CALLBACK_g = H5I_register(H5I_ERROR_MSG, &H5E_CALLBACK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANAPPLY */ +assert(H5I_INVALID_HID == H5E_CANAPPLY_g); +if((H5E_CANAPPLY_g = H5I_register(H5I_ERROR_MSG, &H5E_CANAPPLY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTFILTER */ +assert(H5I_INVALID_HID == H5E_CANTFILTER_g); +if((H5E_CANTFILTER_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTFILTER_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOENCODER */ +assert(H5I_INVALID_HID == H5E_NOENCODER_g); +if((H5E_NOENCODER_g = H5I_register(H5I_ERROR_MSG, &H5E_NOENCODER_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOFILTER */ +assert(H5I_INVALID_HID == H5E_NOFILTER_g); +if((H5E_NOFILTER_g = H5I_register(H5I_ERROR_MSG, &H5E_NOFILTER_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_SETLOCAL */ +assert(H5I_INVALID_HID == H5E_SETLOCAL_g); +if((H5E_SETLOCAL_g = H5I_register(H5I_ERROR_MSG, &H5E_SETLOCAL_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Property list errors */ +/* H5E_CANTGET */ +assert(H5I_INVALID_HID == H5E_CANTGET_g); +if((H5E_CANTGET_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTGET_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTSET */ +assert(H5I_INVALID_HID == H5E_CANTSET_g); +if((H5E_CANTSET_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTSET_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_DUPCLASS */ +assert(H5I_INVALID_HID == H5E_DUPCLASS_g); +if((H5E_DUPCLASS_g = H5I_register(H5I_ERROR_MSG, &H5E_DUPCLASS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_SETDISALLOWED */ +assert(H5I_INVALID_HID == H5E_SETDISALLOWED_g); +if((H5E_SETDISALLOWED_g = H5I_register(H5I_ERROR_MSG, &H5E_SETDISALLOWED_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Plugin errors */ +/* H5E_OPENERROR */ +assert(H5I_INVALID_HID == H5E_OPENERROR_g); +if((H5E_OPENERROR_g = H5I_register(H5I_ERROR_MSG, &H5E_OPENERROR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Resource errors */ +/* H5E_ALREADYEXISTS */ +assert(H5I_INVALID_HID == H5E_ALREADYEXISTS_g); +if((H5E_ALREADYEXISTS_g = H5I_register(H5I_ERROR_MSG, &H5E_ALREADYEXISTS_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTALLOC */ +assert(H5I_INVALID_HID == H5E_CANTALLOC_g); +if((H5E_CANTALLOC_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTALLOC_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCOPY */ +assert(H5I_INVALID_HID == H5E_CANTCOPY_g); +if((H5E_CANTCOPY_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCOPY_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTFREE */ +assert(H5I_INVALID_HID == H5E_CANTFREE_g); +if((H5E_CANTFREE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTFREE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTGC */ +assert(H5I_INVALID_HID == H5E_CANTGC_g); +if((H5E_CANTGC_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTGC_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTGETSIZE */ +assert(H5I_INVALID_HID == H5E_CANTGETSIZE_g); +if((H5E_CANTGETSIZE_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTGETSIZE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTLOCK */ +assert(H5I_INVALID_HID == H5E_CANTLOCK_g); +if((H5E_CANTLOCK_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTLOCK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTUNLOCK */ +assert(H5I_INVALID_HID == H5E_CANTUNLOCK_g); +if((H5E_CANTUNLOCK_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTUNLOCK_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_NOSPACE */ +assert(H5I_INVALID_HID == H5E_NOSPACE_g); +if((H5E_NOSPACE_g = H5I_register(H5I_ERROR_MSG, &H5E_NOSPACE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_OBJOPEN */ +assert(H5I_INVALID_HID == H5E_OBJOPEN_g); +if((H5E_OBJOPEN_g = H5I_register(H5I_ERROR_MSG, &H5E_OBJOPEN_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* System level errors */ +/* H5E_SYSERRSTR */ +assert(H5I_INVALID_HID == H5E_SYSERRSTR_g); +if((H5E_SYSERRSTR_g = H5I_register(H5I_ERROR_MSG, &H5E_SYSERRSTR_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Datatype conversion errors */ +/* H5E_BADSIZE */ +assert(H5I_INVALID_HID == H5E_BADSIZE_g); +if((H5E_BADSIZE_g = H5I_register(H5I_ERROR_MSG, &H5E_BADSIZE_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); +/* H5E_CANTCONVERT */ +assert(H5I_INVALID_HID == H5E_CANTCONVERT_g); +if((H5E_CANTCONVERT_g = H5I_register(H5I_ERROR_MSG, &H5E_CANTCONVERT_msg_s, false)) < 0) + HGOTO_ERROR(H5E_ERROR, H5E_CANTREGISTER, FAIL, "can't register error message"); + +/* Remember last minor error code ID */ +assert(H5E_last_min_id_g==H5I_INVALID_HID); +H5E_last_min_id_g = H5E_CANTCONVERT_g; + +#endif /* H5Einit_H */ diff --git a/src/H5Eint.c b/src/H5Eint.c index 333bc202c0b..8227e7cd421 100644 --- a/src/H5Eint.c +++ b/src/H5Eint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -160,10 +160,10 @@ static const H5E_stack_t H5E_err_stack_def = { /* H5E_auto_op_t */ #ifndef H5_NO_DEPRECATED_SYMBOLS #ifdef H5_USE_16_API_DEFAULT - {1, TRUE, (H5E_auto1_t)H5Eprint1, (H5E_auto2_t)H5E__print2, (H5E_auto1_t)H5Eprint1, + {1, true, (H5E_auto1_t)H5Eprint1, (H5E_auto2_t)H5E__print2, (H5E_auto1_t)H5Eprint1, (H5E_auto2_t)H5E__print2}, #else /* H5_USE_16_API */ - {2, TRUE, (H5E_auto1_t)H5Eprint1, (H5E_auto2_t)H5E__print2, (H5E_auto1_t)H5Eprint1, + {2, true, (H5E_auto1_t)H5Eprint1, (H5E_auto2_t)H5E__print2, (H5E_auto1_t)H5Eprint1, (H5E_auto2_t)H5E__print2}, #endif /* H5_USE_16_API_DEFAULT */ #else /* H5_NO_DEPRECATED_SYMBOLS */ @@ -228,6 +228,30 @@ H5E_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5E_init() */ + +/*-------------------------------------------------------------------------- + * Function: H5E__init_package + * + * Purpose: Initialize interface-specific information + * + * Return: SUCCEED/FAIL + * + * Programmer: Raymond Lu + * Friday, July 11, 2003 + * + *-------------------------------------------------------------------------- + */ +herr_t +H5E__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE /* Initialize the ID group for the error class IDs */ if (H5I_register_type(H5I_ERRCLS_CLS) < 0) @@ -254,7 +278,7 @@ H5E_init(void) done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5E__init_package() */ /*------------------------------------------------------------------------- * Function: H5E_term_package @@ -275,61 +299,66 @@ H5E_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - int64_t ncls, nmsg, nstk; - - /* Check if there are any open error stacks, classes or messages */ - ncls = H5I_nmembers(H5I_ERROR_CLASS); - nmsg = H5I_nmembers(H5I_ERROR_MSG); - nstk = H5I_nmembers(H5I_ERROR_STACK); - - if ((ncls + nmsg + nstk) > 0) { - /* Clear the default error stack. Note that - * the following H5I_clear_type calls do not - * force the clears and will not be able to - * clear any error message IDs that are still - * in use by the default error stack unless we - * clear that stack manually. - * - * Error message IDs will typically still be - * in use by the default error stack when the - * application does H5E_BEGIN/END_TRY cleanup - * at the very end. - */ - H5E_clear_stack(); - - /* Clear any outstanding error stacks */ - if (nstk > 0) - (void)H5I_clear_type(H5I_ERROR_STACK, false, false); - - /* Clear all the error classes */ - if (ncls > 0) { - (void)H5I_clear_type(H5I_ERROR_CLASS, false, false); - - /* Reset the HDF5 error class, if its been closed */ - if (H5I_nmembers(H5I_ERROR_CLASS) == 0) - H5E_ERR_CLS_g = H5I_INVALID_HID; - } /* end if */ + if (H5_PKG_INIT_VAR) { + int64_t ncls, nmsg, nstk; + + /* Check if there are any open error stacks, classes or messages */ + ncls = H5I_nmembers(H5I_ERROR_CLASS); + nmsg = H5I_nmembers(H5I_ERROR_MSG); + nstk = H5I_nmembers(H5I_ERROR_STACK); + + if ((ncls + nmsg + nstk) > 0) { + /* Clear the default error stack. Note that + * the following H5I_clear_type calls do not + * force the clears and will not be able to + * clear any error message IDs that are still + * in use by the default error stack unless we + * clear that stack manually. + * + * Error message IDs will typically still be + * in use by the default error stack when the + * application does H5E_BEGIN/END_TRY cleanup + * at the very end. + */ + H5E_clear_stack(); + + /* Clear any outstanding error stacks */ + if (nstk > 0) + (void)H5I_clear_type(H5I_ERROR_STACK, false, false); + + /* Clear all the error classes */ + if (ncls > 0) { + (void)H5I_clear_type(H5I_ERROR_CLASS, false, false); + + /* Reset the HDF5 error class, if its been closed */ + if (H5I_nmembers(H5I_ERROR_CLASS) == 0) + H5E_ERR_CLS_g = H5I_INVALID_HID; + } /* end if */ - /* Clear all the error messages */ - if (nmsg > 0) { - (void)H5I_clear_type(H5I_ERROR_MSG, false, false); + /* Clear all the error messages */ + if (nmsg > 0) { + (void)H5I_clear_type(H5I_ERROR_MSG, false, false); - /* Reset the HDF5 error messages, if they've been closed */ - if (H5I_nmembers(H5I_ERROR_MSG) == 0) { + /* Reset the HDF5 error messages, if they've been closed */ + if (H5I_nmembers(H5I_ERROR_MSG) == 0) { /* Include the automatically generated error code termination */ #include "H5Eterm.h" - } /* end if */ - } /* end if */ - - n++; /*H5I*/ - } /* end if */ - else { - /* Destroy the error class, message, and stack id groups */ - n += (H5I_dec_type_ref(H5I_ERROR_STACK) > 0); - n += (H5I_dec_type_ref(H5I_ERROR_CLASS) > 0); - n += (H5I_dec_type_ref(H5I_ERROR_MSG) > 0); + } /* end if */ + } /* end if */ - } /* end else */ + n++; /*H5I*/ + } /* end if */ + else { + /* Destroy the error class, message, and stack id groups */ + n += (H5I_dec_type_ref(H5I_ERROR_STACK) > 0); + n += (H5I_dec_type_ref(H5I_ERROR_CLASS) > 0); + n += (H5I_dec_type_ref(H5I_ERROR_MSG) > 0); + + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end else */ + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5E_term_package() */ @@ -1787,7 +1816,7 @@ H5E_dump_api_stack(void) H5E_stack_t *estack = H5E__get_my_stack(); herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) assert(estack); @@ -1805,6 +1834,7 @@ H5E_dump_api_stack(void) } /* end else */ #endif /* H5_NO_DEPRECATED_SYMBOLS */ +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5E_dump_api_stack() */ @@ -1836,7 +1866,7 @@ H5E_pause_stack(void) { H5E_stack_t *estack = H5E__get_my_stack(); - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI_NOINIT_NOERR assert(estack); @@ -1874,7 +1904,7 @@ H5E_resume_stack(void) { H5E_stack_t *estack = H5E__get_my_stack(); - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI_NOINIT_NOERR assert(estack); assert(estack->paused); diff --git a/src/H5Emajdef.h b/src/H5Emajdef.h new file mode 100644 index 00000000000..7062a5036a7 --- /dev/null +++ b/src/H5Emajdef.h @@ -0,0 +1,66 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the LICENSE file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_err -- do not edit */ +/* Add new errors to H5err.txt file */ + +#ifndef H5Emajdef_H +#define H5Emajdef_H + +/***********************************/ +/* Major error message definitions */ +/***********************************/ + +/* clang-format off */ +static const H5E_msg_t H5E_ARGS_msg_s = {false, "Invalid arguments to routine", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_ATTR_msg_s = {false, "Attribute", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_BTREE_msg_s = {false, "B-Tree node", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CACHE_msg_s = {false, "Object cache", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CONTEXT_msg_s = {false, "API Context", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_DATASET_msg_s = {false, "Dataset", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_DATASPACE_msg_s = {false, "Dataspace", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_DATATYPE_msg_s = {false, "Datatype", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_EARRAY_msg_s = {false, "Extensible Array", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_EFL_msg_s = {false, "External file list", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_ERROR_msg_s = {false, "Error API", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_EVENTSET_msg_s = {false, "Event Set", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_FARRAY_msg_s = {false, "Fixed Array", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_FILE_msg_s = {false, "File accessibility", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_FSPACE_msg_s = {false, "Free Space Manager", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_FUNC_msg_s = {false, "Function entry/exit", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_HEAP_msg_s = {false, "Heap", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_ID_msg_s = {false, "Object ID", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_INTERNAL_msg_s = {false, "Internal error (too specific to document in detail)", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_IO_msg_s = {false, "Low-level I/O", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_LIB_msg_s = {false, "General library infrastructure", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_LINK_msg_s = {false, "Links", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_MAP_msg_s = {false, "Map", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NONE_MAJOR_msg_s = {false, "No error", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_OHDR_msg_s = {false, "Object header", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_PAGEBUF_msg_s = {false, "Page Buffering", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_PLINE_msg_s = {false, "Data filters", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_PLIST_msg_s = {false, "Property lists", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_PLUGIN_msg_s = {false, "Plugin for dynamically loaded library", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_REFERENCE_msg_s = {false, "References", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_RESOURCE_msg_s = {false, "Resource unavailable", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_RS_msg_s = {false, "Reference Counted Strings", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_SLIST_msg_s = {false, "Skip Lists", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_SOHM_msg_s = {false, "Shared Object Header Messages", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_STORAGE_msg_s = {false, "Data storage", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_SYM_msg_s = {false, "Symbol table", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_THREADSAFE_msg_s = {false, "Threadsafety", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_TST_msg_s = {false, "Ternary Search Trees", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_VFL_msg_s = {false, "Virtual File Layer", H5E_MAJOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_VOL_msg_s = {false, "Virtual Object Layer", H5E_MAJOR, &H5E_err_cls_s}; +/* clang-format on */ + +#endif /* H5Emajdef_H */ diff --git a/src/H5Emindef.h b/src/H5Emindef.h new file mode 100644 index 00000000000..5bcb99f9f04 --- /dev/null +++ b/src/H5Emindef.h @@ -0,0 +1,212 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the LICENSE file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_err -- do not edit */ +/* Add new errors to H5err.txt file */ + +#ifndef H5Emindef_H +#define H5Emindef_H + +/***********************************/ +/* Minor error message definitions */ +/***********************************/ + +/* clang-format off */ + +/* ARGS: Argument errors */ +static const H5E_msg_t H5E_BADRANGE_msg_s = {false, "Out of range", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_BADTYPE_msg_s = {false, "Inappropriate type", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_BADVALUE_msg_s = {false, "Bad value", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_UNINITIALIZED_msg_s = {false, "Information is uinitialized", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_UNSUPPORTED_msg_s = {false, "Feature is unsupported", H5E_MINOR, &H5E_err_cls_s}; + +/* ASYNC: Asynchronous operation errors */ +static const H5E_msg_t H5E_CANTCANCEL_msg_s = {false, "Can't cancel operation", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTWAIT_msg_s = {false, "Can't wait on operation", H5E_MINOR, &H5E_err_cls_s}; + +/* BTREE: B-tree related errors */ +static const H5E_msg_t H5E_CANTDECODE_msg_s = {false, "Unable to decode value", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTENCODE_msg_s = {false, "Unable to encode value", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTFIND_msg_s = {false, "Unable to check for record", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTINSERT_msg_s = {false, "Unable to insert object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTLIST_msg_s = {false, "Unable to list node", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTMODIFY_msg_s = {false, "Unable to modify record", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTREDISTRIBUTE_msg_s = {false, "Unable to redistribute records", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTREMOVE_msg_s = {false, "Unable to remove object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTSPLIT_msg_s = {false, "Unable to split node", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTSWAP_msg_s = {false, "Unable to swap records", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_EXISTS_msg_s = {false, "Object already exists", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOTFOUND_msg_s = {false, "Object not found", H5E_MINOR, &H5E_err_cls_s}; + +/* CACHE: Cache related errors */ +static const H5E_msg_t H5E_CANTCLEAN_msg_s = {false, "Unable to mark metadata as clean", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCORK_msg_s = {false, "Unable to cork an object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTDEPEND_msg_s = {false, "Unable to create a flush dependency", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTDIRTY_msg_s = {false, "Unable to mark metadata as dirty", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTEXPUNGE_msg_s = {false, "Unable to expunge a metadata cache entry", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTFLUSH_msg_s = {false, "Unable to flush data from cache", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTINS_msg_s = {false, "Unable to insert metadata into cache", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTLOAD_msg_s = {false, "Unable to load metadata into cache", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTMARKCLEAN_msg_s = {false, "Unable to mark a pinned entry as clean", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTMARKDIRTY_msg_s = {false, "Unable to mark a pinned entry as dirty", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTMARKSERIALIZED_msg_s = {false, "Unable to mark an entry as serialized", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTMARKUNSERIALIZED_msg_s = {false, "Unable to mark an entry as unserialized", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTNOTIFY_msg_s = {false, "Unable to notify object about action", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTPIN_msg_s = {false, "Unable to pin cache entry", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTPROTECT_msg_s = {false, "Unable to protect metadata", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTRESIZE_msg_s = {false, "Unable to resize a metadata cache entry", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTSERIALIZE_msg_s = {false, "Unable to serialize data from cache", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTTAG_msg_s = {false, "Unable to tag metadata in the cache", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUNCORK_msg_s = {false, "Unable to uncork an object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUNDEPEND_msg_s = {false, "Unable to destroy a flush dependency", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUNPIN_msg_s = {false, "Unable to un-pin cache entry", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUNPROTECT_msg_s = {false, "Unable to unprotect metadata", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUNSERIALIZE_msg_s = {false, "Unable to mark metadata as unserialized", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_LOGGING_msg_s = {false, "Failure in the cache logging framework", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOTCACHED_msg_s = {false, "Metadata not currently cached", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_PROTECT_msg_s = {false, "Protected metadata error", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_SYSTEM_msg_s = {false, "Internal error detected", H5E_MINOR, &H5E_err_cls_s}; + +/* DSPACE: Dataspace errors */ +static const H5E_msg_t H5E_BADSELECT_msg_s = {false, "Invalid selection", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTAPPEND_msg_s = {false, "Can't append object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCLIP_msg_s = {false, "Can't clip hyperslab region", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCOMPARE_msg_s = {false, "Can't compare objects", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCOUNT_msg_s = {false, "Can't count elements", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTNEXT_msg_s = {false, "Can't move to next iterator location", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTSELECT_msg_s = {false, "Can't select hyperslab", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_INCONSISTENTSTATE_msg_s = {false, "Internal states are inconsistent", H5E_MINOR, &H5E_err_cls_s}; + +/* FILE: Generic low-level file I/O errors */ +static const H5E_msg_t H5E_CLOSEERROR_msg_s = {false, "Close failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_FCNTL_msg_s = {false, "File control (fcntl) failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_OVERFLOW_msg_s = {false, "Address overflowed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_READERROR_msg_s = {false, "Read failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_SEEKERROR_msg_s = {false, "Seek failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_WRITEERROR_msg_s = {false, "Write failed", H5E_MINOR, &H5E_err_cls_s}; + +/* FILEACC: File accessibility errors */ +static const H5E_msg_t H5E_BADFILE_msg_s = {false, "Bad file ID accessed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCLOSEFILE_msg_s = {false, "Unable to close file", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCREATE_msg_s = {false, "Unable to create file", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTDELETEFILE_msg_s = {false, "Unable to delete file", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTLOCKFILE_msg_s = {false, "Unable to lock file", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTOPENFILE_msg_s = {false, "Unable to open file", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUNLOCKFILE_msg_s = {false, "Unable to unlock file", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_FILEEXISTS_msg_s = {false, "File already exists", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_FILEOPEN_msg_s = {false, "File already open", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_MOUNT_msg_s = {false, "File mount error", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOTHDF5_msg_s = {false, "Not an HDF5 file", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_TRUNCATED_msg_s = {false, "File has been truncated", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_UNMOUNT_msg_s = {false, "File unmount error", H5E_MINOR, &H5E_err_cls_s}; + +/* FSPACE: Free space errors */ +static const H5E_msg_t H5E_CANTMERGE_msg_s = {false, "Can't merge objects", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTREVIVE_msg_s = {false, "Can't revive object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTSHRINK_msg_s = {false, "Can't shrink container", H5E_MINOR, &H5E_err_cls_s}; + +/* FUNC: Function entry/exit interface errors */ +static const H5E_msg_t H5E_ALREADYINIT_msg_s = {false, "Object already initialized", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTINIT_msg_s = {false, "Unable to initialize object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTRELEASE_msg_s = {false, "Unable to release object", H5E_MINOR, &H5E_err_cls_s}; + +/* GROUP: Group related errors */ +static const H5E_msg_t H5E_CANTCLOSEOBJ_msg_s = {false, "Can't close object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTOPENOBJ_msg_s = {false, "Can't open object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_COMPLEN_msg_s = {false, "Name component is too long", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_PATH_msg_s = {false, "Problem with path to object", H5E_MINOR, &H5E_err_cls_s}; + +/* HEAP: Heap errors */ +static const H5E_msg_t H5E_CANTATTACH_msg_s = {false, "Can't attach object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCOMPUTE_msg_s = {false, "Can't compute value", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTEXTEND_msg_s = {false, "Can't extend heap's space", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTOPERATE_msg_s = {false, "Can't operate on object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTRESTORE_msg_s = {false, "Can't restore condition", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUPDATE_msg_s = {false, "Can't update object", H5E_MINOR, &H5E_err_cls_s}; + +/* ID: Object ID related errors */ +static const H5E_msg_t H5E_BADGROUP_msg_s = {false, "Unable to find ID group information", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_BADID_msg_s = {false, "Unable to find ID information (already closed?)", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTDEC_msg_s = {false, "Unable to decrement reference count", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTINC_msg_s = {false, "Unable to increment reference count", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTREGISTER_msg_s = {false, "Unable to register new ID", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOIDS_msg_s = {false, "Out of IDs for group", H5E_MINOR, &H5E_err_cls_s}; + +/* LINK: Link related errors */ +static const H5E_msg_t H5E_CANTMOVE_msg_s = {false, "Can't move object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTSORT_msg_s = {false, "Can't sort objects", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NLINKS_msg_s = {false, "Too many soft links in path", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOTREGISTERED_msg_s = {false, "Link class not registered", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_TRAVERSE_msg_s = {false, "Link traversal failure", H5E_MINOR, &H5E_err_cls_s}; + +/* MAP: Map related errors */ +static const H5E_msg_t H5E_CANTPUT_msg_s = {false, "Can't put value", H5E_MINOR, &H5E_err_cls_s}; + +/* MPI: Parallel MPI errors */ +static const H5E_msg_t H5E_CANTGATHER_msg_s = {false, "Can't gather data", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTRECV_msg_s = {false, "Can't receive data", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_MPI_msg_s = {false, "Some MPI function failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_MPIERRSTR_msg_s = {false, "MPI Error String", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NO_INDEPENDENT_msg_s = {false, "Can't perform independent IO", H5E_MINOR, &H5E_err_cls_s}; + +/* NONE: No error */ +static const H5E_msg_t H5E_NONE_MINOR_msg_s = {false, "No error", H5E_MINOR, &H5E_err_cls_s}; + +/* OHDR: Object header related errors */ +static const H5E_msg_t H5E_ALIGNMENT_msg_s = {false, "Alignment error", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_BADITER_msg_s = {false, "Iteration failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_BADMESG_msg_s = {false, "Unrecognized message", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTDELETE_msg_s = {false, "Can't delete message", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTPACK_msg_s = {false, "Can't pack messages", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTRENAME_msg_s = {false, "Unable to rename object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTRESET_msg_s = {false, "Can't reset object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_LINKCOUNT_msg_s = {false, "Bad object header link count", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_VERSION_msg_s = {false, "Wrong version number", H5E_MINOR, &H5E_err_cls_s}; + +/* PIPELINE: I/O pipeline errors */ +static const H5E_msg_t H5E_CALLBACK_msg_s = {false, "Callback failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANAPPLY_msg_s = {false, "Error from filter 'can apply' callback", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTFILTER_msg_s = {false, "Filter operation failed", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOENCODER_msg_s = {false, "Filter present but encoding disabled", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOFILTER_msg_s = {false, "Requested filter is not available", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_SETLOCAL_msg_s = {false, "Error from filter 'set local' callback", H5E_MINOR, &H5E_err_cls_s}; + +/* PLIST: Property list errors */ +static const H5E_msg_t H5E_CANTGET_msg_s = {false, "Can't get value", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTSET_msg_s = {false, "Can't set value", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_DUPCLASS_msg_s = {false, "Duplicate class name in parent class", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_SETDISALLOWED_msg_s = {false, "Disallowed operation", H5E_MINOR, &H5E_err_cls_s}; + +/* PLUGIN: Plugin errors */ +static const H5E_msg_t H5E_OPENERROR_msg_s = {false, "Can't open directory or file", H5E_MINOR, &H5E_err_cls_s}; + +/* RESOURCE: Resource errors */ +static const H5E_msg_t H5E_ALREADYEXISTS_msg_s = {false, "Object already exists", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTALLOC_msg_s = {false, "Can't allocate space", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCOPY_msg_s = {false, "Unable to copy object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTFREE_msg_s = {false, "Unable to free object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTGC_msg_s = {false, "Unable to garbage collect", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTGETSIZE_msg_s = {false, "Unable to compute size", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTLOCK_msg_s = {false, "Unable to lock object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTUNLOCK_msg_s = {false, "Unable to unlock object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_NOSPACE_msg_s = {false, "No space available for allocation", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_OBJOPEN_msg_s = {false, "Object is already open", H5E_MINOR, &H5E_err_cls_s}; + +/* SYSTEM: System level errors */ +static const H5E_msg_t H5E_SYSERRSTR_msg_s = {false, "System error message", H5E_MINOR, &H5E_err_cls_s}; + +/* TYPECONV: Datatype conversion errors */ +static const H5E_msg_t H5E_BADSIZE_msg_s = {false, "Bad size for object", H5E_MINOR, &H5E_err_cls_s}; +static const H5E_msg_t H5E_CANTCONVERT_msg_s = {false, "Can't convert datatypes", H5E_MINOR, &H5E_err_cls_s}; +/* clang-format on */ + +#endif /* H5Emindef_H */ diff --git a/src/H5Emodule.h b/src/H5Emodule.h index f46456a1369..7243655cc03 100644 --- a/src/H5Emodule.h +++ b/src/H5Emodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5E_MODULE -#define H5_MY_PKG H5E -#define H5_MY_PKG_ERR H5E_ERROR +#define H5_MY_PKG H5E +#define H5_MY_PKG_ERR H5E_ERROR +#define H5_MY_PKG_INIT YES /** \page H5E_UG HDF5 Error Handling * diff --git a/src/H5Epkg.h b/src/H5Epkg.h index 2eda2b24e2d..4eaad76fb6f 100644 --- a/src/H5Epkg.h +++ b/src/H5Epkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Eprivate.h b/src/H5Eprivate.h index a3f8b693b33..1bb6d714eea 100644 --- a/src/H5Eprivate.h +++ b/src/H5Eprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Epubgen.h b/src/H5Epubgen.h new file mode 100644 index 00000000000..aca2ccbd948 --- /dev/null +++ b/src/H5Epubgen.h @@ -0,0 +1,442 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the LICENSE file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_err -- do not edit */ +/* Add new errors to H5err.txt file */ + +#ifndef H5Epubgen_H +#define H5Epubgen_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************/ +/* Major error codes */ +/*********************/ + +#define H5E_ARGS (H5OPEN H5E_ARGS_g) +#define H5E_ATTR (H5OPEN H5E_ATTR_g) +#define H5E_BTREE (H5OPEN H5E_BTREE_g) +#define H5E_CACHE (H5OPEN H5E_CACHE_g) +#define H5E_CONTEXT (H5OPEN H5E_CONTEXT_g) +#define H5E_DATASET (H5OPEN H5E_DATASET_g) +#define H5E_DATASPACE (H5OPEN H5E_DATASPACE_g) +#define H5E_DATATYPE (H5OPEN H5E_DATATYPE_g) +#define H5E_EARRAY (H5OPEN H5E_EARRAY_g) +#define H5E_EFL (H5OPEN H5E_EFL_g) +#define H5E_ERROR (H5OPEN H5E_ERROR_g) +#define H5E_EVENTSET (H5OPEN H5E_EVENTSET_g) +#define H5E_FARRAY (H5OPEN H5E_FARRAY_g) +#define H5E_FILE (H5OPEN H5E_FILE_g) +#define H5E_FSPACE (H5OPEN H5E_FSPACE_g) +#define H5E_FUNC (H5OPEN H5E_FUNC_g) +#define H5E_HEAP (H5OPEN H5E_HEAP_g) +#define H5E_ID (H5OPEN H5E_ID_g) +#define H5E_INTERNAL (H5OPEN H5E_INTERNAL_g) +#define H5E_IO (H5OPEN H5E_IO_g) +#define H5E_LIB (H5OPEN H5E_LIB_g) +#define H5E_LINK (H5OPEN H5E_LINK_g) +#define H5E_MAP (H5OPEN H5E_MAP_g) +#define H5E_NONE_MAJOR (H5OPEN H5E_NONE_MAJOR_g) +#define H5E_OHDR (H5OPEN H5E_OHDR_g) +#define H5E_PAGEBUF (H5OPEN H5E_PAGEBUF_g) +#define H5E_PLINE (H5OPEN H5E_PLINE_g) +#define H5E_PLIST (H5OPEN H5E_PLIST_g) +#define H5E_PLUGIN (H5OPEN H5E_PLUGIN_g) +#define H5E_REFERENCE (H5OPEN H5E_REFERENCE_g) +#define H5E_RESOURCE (H5OPEN H5E_RESOURCE_g) +#define H5E_RS (H5OPEN H5E_RS_g) +#define H5E_SLIST (H5OPEN H5E_SLIST_g) +#define H5E_SOHM (H5OPEN H5E_SOHM_g) +#define H5E_STORAGE (H5OPEN H5E_STORAGE_g) +#define H5E_SYM (H5OPEN H5E_SYM_g) +#define H5E_THREADSAFE (H5OPEN H5E_THREADSAFE_g) +#define H5E_TST (H5OPEN H5E_TST_g) +#define H5E_VFL (H5OPEN H5E_VFL_g) +#define H5E_VOL (H5OPEN H5E_VOL_g) +H5_DLLVAR hid_t H5E_ARGS_g; /* Invalid arguments to routine */ +H5_DLLVAR hid_t H5E_ATTR_g; /* Attribute */ +H5_DLLVAR hid_t H5E_BTREE_g; /* B-Tree node */ +H5_DLLVAR hid_t H5E_CACHE_g; /* Object cache */ +H5_DLLVAR hid_t H5E_CONTEXT_g; /* API Context */ +H5_DLLVAR hid_t H5E_DATASET_g; /* Dataset */ +H5_DLLVAR hid_t H5E_DATASPACE_g; /* Dataspace */ +H5_DLLVAR hid_t H5E_DATATYPE_g; /* Datatype */ +H5_DLLVAR hid_t H5E_EARRAY_g; /* Extensible Array */ +H5_DLLVAR hid_t H5E_EFL_g; /* External file list */ +H5_DLLVAR hid_t H5E_ERROR_g; /* Error API */ +H5_DLLVAR hid_t H5E_EVENTSET_g; /* Event Set */ +H5_DLLVAR hid_t H5E_FARRAY_g; /* Fixed Array */ +H5_DLLVAR hid_t H5E_FILE_g; /* File accessibility */ +H5_DLLVAR hid_t H5E_FSPACE_g; /* Free Space Manager */ +H5_DLLVAR hid_t H5E_FUNC_g; /* Function entry/exit */ +H5_DLLVAR hid_t H5E_HEAP_g; /* Heap */ +H5_DLLVAR hid_t H5E_ID_g; /* Object ID */ +H5_DLLVAR hid_t H5E_INTERNAL_g; /* Internal error (too specific to document in detail) */ +H5_DLLVAR hid_t H5E_IO_g; /* Low-level I/O */ +H5_DLLVAR hid_t H5E_LIB_g; /* General library infrastructure */ +H5_DLLVAR hid_t H5E_LINK_g; /* Links */ +H5_DLLVAR hid_t H5E_MAP_g; /* Map */ +H5_DLLVAR hid_t H5E_NONE_MAJOR_g; /* No error */ +H5_DLLVAR hid_t H5E_OHDR_g; /* Object header */ +H5_DLLVAR hid_t H5E_PAGEBUF_g; /* Page Buffering */ +H5_DLLVAR hid_t H5E_PLINE_g; /* Data filters */ +H5_DLLVAR hid_t H5E_PLIST_g; /* Property lists */ +H5_DLLVAR hid_t H5E_PLUGIN_g; /* Plugin for dynamically loaded library */ +H5_DLLVAR hid_t H5E_REFERENCE_g; /* References */ +H5_DLLVAR hid_t H5E_RESOURCE_g; /* Resource unavailable */ +H5_DLLVAR hid_t H5E_RS_g; /* Reference Counted Strings */ +H5_DLLVAR hid_t H5E_SLIST_g; /* Skip Lists */ +H5_DLLVAR hid_t H5E_SOHM_g; /* Shared Object Header Messages */ +H5_DLLVAR hid_t H5E_STORAGE_g; /* Data storage */ +H5_DLLVAR hid_t H5E_SYM_g; /* Symbol table */ +H5_DLLVAR hid_t H5E_THREADSAFE_g; /* Threadsafety */ +H5_DLLVAR hid_t H5E_TST_g; /* Ternary Search Trees */ +H5_DLLVAR hid_t H5E_VFL_g; /* Virtual File Layer */ +H5_DLLVAR hid_t H5E_VOL_g; /* Virtual Object Layer */ + +/*********************/ +/* Minor error codes */ +/*********************/ + +/* Argument errors */ +#define H5E_BADRANGE (H5OPEN H5E_BADRANGE_g) +#define H5E_BADTYPE (H5OPEN H5E_BADTYPE_g) +#define H5E_BADVALUE (H5OPEN H5E_BADVALUE_g) +#define H5E_UNINITIALIZED (H5OPEN H5E_UNINITIALIZED_g) +#define H5E_UNSUPPORTED (H5OPEN H5E_UNSUPPORTED_g) +H5_DLLVAR hid_t H5E_BADRANGE_g; /* Out of range */ +H5_DLLVAR hid_t H5E_BADTYPE_g; /* Inappropriate type */ +H5_DLLVAR hid_t H5E_BADVALUE_g; /* Bad value */ +H5_DLLVAR hid_t H5E_UNINITIALIZED_g; /* Information is uinitialized */ +H5_DLLVAR hid_t H5E_UNSUPPORTED_g; /* Feature is unsupported */ + +/* Asynchronous operation errors */ +#define H5E_CANTCANCEL (H5OPEN H5E_CANTCANCEL_g) +#define H5E_CANTWAIT (H5OPEN H5E_CANTWAIT_g) +H5_DLLVAR hid_t H5E_CANTCANCEL_g; /* Can't cancel operation */ +H5_DLLVAR hid_t H5E_CANTWAIT_g; /* Can't wait on operation */ + +/* B-tree related errors */ +#define H5E_CANTDECODE (H5OPEN H5E_CANTDECODE_g) +#define H5E_CANTENCODE (H5OPEN H5E_CANTENCODE_g) +#define H5E_CANTFIND (H5OPEN H5E_CANTFIND_g) +#define H5E_CANTINSERT (H5OPEN H5E_CANTINSERT_g) +#define H5E_CANTLIST (H5OPEN H5E_CANTLIST_g) +#define H5E_CANTMODIFY (H5OPEN H5E_CANTMODIFY_g) +#define H5E_CANTREDISTRIBUTE (H5OPEN H5E_CANTREDISTRIBUTE_g) +#define H5E_CANTREMOVE (H5OPEN H5E_CANTREMOVE_g) +#define H5E_CANTSPLIT (H5OPEN H5E_CANTSPLIT_g) +#define H5E_CANTSWAP (H5OPEN H5E_CANTSWAP_g) +#define H5E_EXISTS (H5OPEN H5E_EXISTS_g) +#define H5E_NOTFOUND (H5OPEN H5E_NOTFOUND_g) +H5_DLLVAR hid_t H5E_CANTDECODE_g; /* Unable to decode value */ +H5_DLLVAR hid_t H5E_CANTENCODE_g; /* Unable to encode value */ +H5_DLLVAR hid_t H5E_CANTFIND_g; /* Unable to check for record */ +H5_DLLVAR hid_t H5E_CANTINSERT_g; /* Unable to insert object */ +H5_DLLVAR hid_t H5E_CANTLIST_g; /* Unable to list node */ +H5_DLLVAR hid_t H5E_CANTMODIFY_g; /* Unable to modify record */ +H5_DLLVAR hid_t H5E_CANTREDISTRIBUTE_g; /* Unable to redistribute records */ +H5_DLLVAR hid_t H5E_CANTREMOVE_g; /* Unable to remove object */ +H5_DLLVAR hid_t H5E_CANTSPLIT_g; /* Unable to split node */ +H5_DLLVAR hid_t H5E_CANTSWAP_g; /* Unable to swap records */ +H5_DLLVAR hid_t H5E_EXISTS_g; /* Object already exists */ +H5_DLLVAR hid_t H5E_NOTFOUND_g; /* Object not found */ + +/* Cache related errors */ +#define H5E_CANTCLEAN (H5OPEN H5E_CANTCLEAN_g) +#define H5E_CANTCORK (H5OPEN H5E_CANTCORK_g) +#define H5E_CANTDEPEND (H5OPEN H5E_CANTDEPEND_g) +#define H5E_CANTDIRTY (H5OPEN H5E_CANTDIRTY_g) +#define H5E_CANTEXPUNGE (H5OPEN H5E_CANTEXPUNGE_g) +#define H5E_CANTFLUSH (H5OPEN H5E_CANTFLUSH_g) +#define H5E_CANTINS (H5OPEN H5E_CANTINS_g) +#define H5E_CANTLOAD (H5OPEN H5E_CANTLOAD_g) +#define H5E_CANTMARKCLEAN (H5OPEN H5E_CANTMARKCLEAN_g) +#define H5E_CANTMARKDIRTY (H5OPEN H5E_CANTMARKDIRTY_g) +#define H5E_CANTMARKSERIALIZED (H5OPEN H5E_CANTMARKSERIALIZED_g) +#define H5E_CANTMARKUNSERIALIZED (H5OPEN H5E_CANTMARKUNSERIALIZED_g) +#define H5E_CANTNOTIFY (H5OPEN H5E_CANTNOTIFY_g) +#define H5E_CANTPIN (H5OPEN H5E_CANTPIN_g) +#define H5E_CANTPROTECT (H5OPEN H5E_CANTPROTECT_g) +#define H5E_CANTRESIZE (H5OPEN H5E_CANTRESIZE_g) +#define H5E_CANTSERIALIZE (H5OPEN H5E_CANTSERIALIZE_g) +#define H5E_CANTTAG (H5OPEN H5E_CANTTAG_g) +#define H5E_CANTUNCORK (H5OPEN H5E_CANTUNCORK_g) +#define H5E_CANTUNDEPEND (H5OPEN H5E_CANTUNDEPEND_g) +#define H5E_CANTUNPIN (H5OPEN H5E_CANTUNPIN_g) +#define H5E_CANTUNPROTECT (H5OPEN H5E_CANTUNPROTECT_g) +#define H5E_CANTUNSERIALIZE (H5OPEN H5E_CANTUNSERIALIZE_g) +#define H5E_LOGGING (H5OPEN H5E_LOGGING_g) +#define H5E_NOTCACHED (H5OPEN H5E_NOTCACHED_g) +#define H5E_PROTECT (H5OPEN H5E_PROTECT_g) +#define H5E_SYSTEM (H5OPEN H5E_SYSTEM_g) +H5_DLLVAR hid_t H5E_CANTCLEAN_g; /* Unable to mark metadata as clean */ +H5_DLLVAR hid_t H5E_CANTCORK_g; /* Unable to cork an object */ +H5_DLLVAR hid_t H5E_CANTDEPEND_g; /* Unable to create a flush dependency */ +H5_DLLVAR hid_t H5E_CANTDIRTY_g; /* Unable to mark metadata as dirty */ +H5_DLLVAR hid_t H5E_CANTEXPUNGE_g; /* Unable to expunge a metadata cache entry */ +H5_DLLVAR hid_t H5E_CANTFLUSH_g; /* Unable to flush data from cache */ +H5_DLLVAR hid_t H5E_CANTINS_g; /* Unable to insert metadata into cache */ +H5_DLLVAR hid_t H5E_CANTLOAD_g; /* Unable to load metadata into cache */ +H5_DLLVAR hid_t H5E_CANTMARKCLEAN_g; /* Unable to mark a pinned entry as clean */ +H5_DLLVAR hid_t H5E_CANTMARKDIRTY_g; /* Unable to mark a pinned entry as dirty */ +H5_DLLVAR hid_t H5E_CANTMARKSERIALIZED_g; /* Unable to mark an entry as serialized */ +H5_DLLVAR hid_t H5E_CANTMARKUNSERIALIZED_g; /* Unable to mark an entry as unserialized */ +H5_DLLVAR hid_t H5E_CANTNOTIFY_g; /* Unable to notify object about action */ +H5_DLLVAR hid_t H5E_CANTPIN_g; /* Unable to pin cache entry */ +H5_DLLVAR hid_t H5E_CANTPROTECT_g; /* Unable to protect metadata */ +H5_DLLVAR hid_t H5E_CANTRESIZE_g; /* Unable to resize a metadata cache entry */ +H5_DLLVAR hid_t H5E_CANTSERIALIZE_g; /* Unable to serialize data from cache */ +H5_DLLVAR hid_t H5E_CANTTAG_g; /* Unable to tag metadata in the cache */ +H5_DLLVAR hid_t H5E_CANTUNCORK_g; /* Unable to uncork an object */ +H5_DLLVAR hid_t H5E_CANTUNDEPEND_g; /* Unable to destroy a flush dependency */ +H5_DLLVAR hid_t H5E_CANTUNPIN_g; /* Unable to un-pin cache entry */ +H5_DLLVAR hid_t H5E_CANTUNPROTECT_g; /* Unable to unprotect metadata */ +H5_DLLVAR hid_t H5E_CANTUNSERIALIZE_g; /* Unable to mark metadata as unserialized */ +H5_DLLVAR hid_t H5E_LOGGING_g; /* Failure in the cache logging framework */ +H5_DLLVAR hid_t H5E_NOTCACHED_g; /* Metadata not currently cached */ +H5_DLLVAR hid_t H5E_PROTECT_g; /* Protected metadata error */ +H5_DLLVAR hid_t H5E_SYSTEM_g; /* Internal error detected */ + +/* Dataspace errors */ +#define H5E_BADSELECT (H5OPEN H5E_BADSELECT_g) +#define H5E_CANTAPPEND (H5OPEN H5E_CANTAPPEND_g) +#define H5E_CANTCLIP (H5OPEN H5E_CANTCLIP_g) +#define H5E_CANTCOMPARE (H5OPEN H5E_CANTCOMPARE_g) +#define H5E_CANTCOUNT (H5OPEN H5E_CANTCOUNT_g) +#define H5E_CANTNEXT (H5OPEN H5E_CANTNEXT_g) +#define H5E_CANTSELECT (H5OPEN H5E_CANTSELECT_g) +#define H5E_INCONSISTENTSTATE (H5OPEN H5E_INCONSISTENTSTATE_g) +H5_DLLVAR hid_t H5E_BADSELECT_g; /* Invalid selection */ +H5_DLLVAR hid_t H5E_CANTAPPEND_g; /* Can't append object */ +H5_DLLVAR hid_t H5E_CANTCLIP_g; /* Can't clip hyperslab region */ +H5_DLLVAR hid_t H5E_CANTCOMPARE_g; /* Can't compare objects */ +H5_DLLVAR hid_t H5E_CANTCOUNT_g; /* Can't count elements */ +H5_DLLVAR hid_t H5E_CANTNEXT_g; /* Can't move to next iterator location */ +H5_DLLVAR hid_t H5E_CANTSELECT_g; /* Can't select hyperslab */ +H5_DLLVAR hid_t H5E_INCONSISTENTSTATE_g; /* Internal states are inconsistent */ + +/* Generic low-level file I/O errors */ +#define H5E_CLOSEERROR (H5OPEN H5E_CLOSEERROR_g) +#define H5E_FCNTL (H5OPEN H5E_FCNTL_g) +#define H5E_OVERFLOW (H5OPEN H5E_OVERFLOW_g) +#define H5E_READERROR (H5OPEN H5E_READERROR_g) +#define H5E_SEEKERROR (H5OPEN H5E_SEEKERROR_g) +#define H5E_WRITEERROR (H5OPEN H5E_WRITEERROR_g) +H5_DLLVAR hid_t H5E_CLOSEERROR_g; /* Close failed */ +H5_DLLVAR hid_t H5E_FCNTL_g; /* File control (fcntl) failed */ +H5_DLLVAR hid_t H5E_OVERFLOW_g; /* Address overflowed */ +H5_DLLVAR hid_t H5E_READERROR_g; /* Read failed */ +H5_DLLVAR hid_t H5E_SEEKERROR_g; /* Seek failed */ +H5_DLLVAR hid_t H5E_WRITEERROR_g; /* Write failed */ + +/* File accessibility errors */ +#define H5E_BADFILE (H5OPEN H5E_BADFILE_g) +#define H5E_CANTCLOSEFILE (H5OPEN H5E_CANTCLOSEFILE_g) +#define H5E_CANTCREATE (H5OPEN H5E_CANTCREATE_g) +#define H5E_CANTDELETEFILE (H5OPEN H5E_CANTDELETEFILE_g) +#define H5E_CANTLOCKFILE (H5OPEN H5E_CANTLOCKFILE_g) +#define H5E_CANTOPENFILE (H5OPEN H5E_CANTOPENFILE_g) +#define H5E_CANTUNLOCKFILE (H5OPEN H5E_CANTUNLOCKFILE_g) +#define H5E_FILEEXISTS (H5OPEN H5E_FILEEXISTS_g) +#define H5E_FILEOPEN (H5OPEN H5E_FILEOPEN_g) +#define H5E_MOUNT (H5OPEN H5E_MOUNT_g) +#define H5E_NOTHDF5 (H5OPEN H5E_NOTHDF5_g) +#define H5E_TRUNCATED (H5OPEN H5E_TRUNCATED_g) +#define H5E_UNMOUNT (H5OPEN H5E_UNMOUNT_g) +H5_DLLVAR hid_t H5E_BADFILE_g; /* Bad file ID accessed */ +H5_DLLVAR hid_t H5E_CANTCLOSEFILE_g; /* Unable to close file */ +H5_DLLVAR hid_t H5E_CANTCREATE_g; /* Unable to create file */ +H5_DLLVAR hid_t H5E_CANTDELETEFILE_g; /* Unable to delete file */ +H5_DLLVAR hid_t H5E_CANTLOCKFILE_g; /* Unable to lock file */ +H5_DLLVAR hid_t H5E_CANTOPENFILE_g; /* Unable to open file */ +H5_DLLVAR hid_t H5E_CANTUNLOCKFILE_g; /* Unable to unlock file */ +H5_DLLVAR hid_t H5E_FILEEXISTS_g; /* File already exists */ +H5_DLLVAR hid_t H5E_FILEOPEN_g; /* File already open */ +H5_DLLVAR hid_t H5E_MOUNT_g; /* File mount error */ +H5_DLLVAR hid_t H5E_NOTHDF5_g; /* Not an HDF5 file */ +H5_DLLVAR hid_t H5E_TRUNCATED_g; /* File has been truncated */ +H5_DLLVAR hid_t H5E_UNMOUNT_g; /* File unmount error */ + +/* Free space errors */ +#define H5E_CANTMERGE (H5OPEN H5E_CANTMERGE_g) +#define H5E_CANTREVIVE (H5OPEN H5E_CANTREVIVE_g) +#define H5E_CANTSHRINK (H5OPEN H5E_CANTSHRINK_g) +H5_DLLVAR hid_t H5E_CANTMERGE_g; /* Can't merge objects */ +H5_DLLVAR hid_t H5E_CANTREVIVE_g; /* Can't revive object */ +H5_DLLVAR hid_t H5E_CANTSHRINK_g; /* Can't shrink container */ + +/* Function entry/exit interface errors */ +#define H5E_ALREADYINIT (H5OPEN H5E_ALREADYINIT_g) +#define H5E_CANTINIT (H5OPEN H5E_CANTINIT_g) +#define H5E_CANTRELEASE (H5OPEN H5E_CANTRELEASE_g) +H5_DLLVAR hid_t H5E_ALREADYINIT_g; /* Object already initialized */ +H5_DLLVAR hid_t H5E_CANTINIT_g; /* Unable to initialize object */ +H5_DLLVAR hid_t H5E_CANTRELEASE_g; /* Unable to release object */ + +/* Group related errors */ +#define H5E_CANTCLOSEOBJ (H5OPEN H5E_CANTCLOSEOBJ_g) +#define H5E_CANTOPENOBJ (H5OPEN H5E_CANTOPENOBJ_g) +#define H5E_COMPLEN (H5OPEN H5E_COMPLEN_g) +#define H5E_PATH (H5OPEN H5E_PATH_g) +H5_DLLVAR hid_t H5E_CANTCLOSEOBJ_g; /* Can't close object */ +H5_DLLVAR hid_t H5E_CANTOPENOBJ_g; /* Can't open object */ +H5_DLLVAR hid_t H5E_COMPLEN_g; /* Name component is too long */ +H5_DLLVAR hid_t H5E_PATH_g; /* Problem with path to object */ + +/* Heap errors */ +#define H5E_CANTATTACH (H5OPEN H5E_CANTATTACH_g) +#define H5E_CANTCOMPUTE (H5OPEN H5E_CANTCOMPUTE_g) +#define H5E_CANTEXTEND (H5OPEN H5E_CANTEXTEND_g) +#define H5E_CANTOPERATE (H5OPEN H5E_CANTOPERATE_g) +#define H5E_CANTRESTORE (H5OPEN H5E_CANTRESTORE_g) +#define H5E_CANTUPDATE (H5OPEN H5E_CANTUPDATE_g) +H5_DLLVAR hid_t H5E_CANTATTACH_g; /* Can't attach object */ +H5_DLLVAR hid_t H5E_CANTCOMPUTE_g; /* Can't compute value */ +H5_DLLVAR hid_t H5E_CANTEXTEND_g; /* Can't extend heap's space */ +H5_DLLVAR hid_t H5E_CANTOPERATE_g; /* Can't operate on object */ +H5_DLLVAR hid_t H5E_CANTRESTORE_g; /* Can't restore condition */ +H5_DLLVAR hid_t H5E_CANTUPDATE_g; /* Can't update object */ + +/* Object ID related errors */ +#define H5E_BADGROUP (H5OPEN H5E_BADGROUP_g) +#define H5E_BADID (H5OPEN H5E_BADID_g) +#define H5E_CANTDEC (H5OPEN H5E_CANTDEC_g) +#define H5E_CANTINC (H5OPEN H5E_CANTINC_g) +#define H5E_CANTREGISTER (H5OPEN H5E_CANTREGISTER_g) +#define H5E_NOIDS (H5OPEN H5E_NOIDS_g) +H5_DLLVAR hid_t H5E_BADGROUP_g; /* Unable to find ID group information */ +H5_DLLVAR hid_t H5E_BADID_g; /* Unable to find ID information (already closed?) */ +H5_DLLVAR hid_t H5E_CANTDEC_g; /* Unable to decrement reference count */ +H5_DLLVAR hid_t H5E_CANTINC_g; /* Unable to increment reference count */ +H5_DLLVAR hid_t H5E_CANTREGISTER_g; /* Unable to register new ID */ +H5_DLLVAR hid_t H5E_NOIDS_g; /* Out of IDs for group */ + +/* Link related errors */ +#define H5E_CANTMOVE (H5OPEN H5E_CANTMOVE_g) +#define H5E_CANTSORT (H5OPEN H5E_CANTSORT_g) +#define H5E_NLINKS (H5OPEN H5E_NLINKS_g) +#define H5E_NOTREGISTERED (H5OPEN H5E_NOTREGISTERED_g) +#define H5E_TRAVERSE (H5OPEN H5E_TRAVERSE_g) +H5_DLLVAR hid_t H5E_CANTMOVE_g; /* Can't move object */ +H5_DLLVAR hid_t H5E_CANTSORT_g; /* Can't sort objects */ +H5_DLLVAR hid_t H5E_NLINKS_g; /* Too many soft links in path */ +H5_DLLVAR hid_t H5E_NOTREGISTERED_g; /* Link class not registered */ +H5_DLLVAR hid_t H5E_TRAVERSE_g; /* Link traversal failure */ + +/* Map related errors */ +#define H5E_CANTPUT (H5OPEN H5E_CANTPUT_g) +H5_DLLVAR hid_t H5E_CANTPUT_g; /* Can't put value */ + +/* Parallel MPI errors */ +#define H5E_CANTGATHER (H5OPEN H5E_CANTGATHER_g) +#define H5E_CANTRECV (H5OPEN H5E_CANTRECV_g) +#define H5E_MPI (H5OPEN H5E_MPI_g) +#define H5E_MPIERRSTR (H5OPEN H5E_MPIERRSTR_g) +#define H5E_NO_INDEPENDENT (H5OPEN H5E_NO_INDEPENDENT_g) +H5_DLLVAR hid_t H5E_CANTGATHER_g; /* Can't gather data */ +H5_DLLVAR hid_t H5E_CANTRECV_g; /* Can't receive data */ +H5_DLLVAR hid_t H5E_MPI_g; /* Some MPI function failed */ +H5_DLLVAR hid_t H5E_MPIERRSTR_g; /* MPI Error String */ +H5_DLLVAR hid_t H5E_NO_INDEPENDENT_g; /* Can't perform independent IO */ + +/* No error */ +#define H5E_NONE_MINOR (H5OPEN H5E_NONE_MINOR_g) +H5_DLLVAR hid_t H5E_NONE_MINOR_g; /* No error */ + +/* Object header related errors */ +#define H5E_ALIGNMENT (H5OPEN H5E_ALIGNMENT_g) +#define H5E_BADITER (H5OPEN H5E_BADITER_g) +#define H5E_BADMESG (H5OPEN H5E_BADMESG_g) +#define H5E_CANTDELETE (H5OPEN H5E_CANTDELETE_g) +#define H5E_CANTPACK (H5OPEN H5E_CANTPACK_g) +#define H5E_CANTRENAME (H5OPEN H5E_CANTRENAME_g) +#define H5E_CANTRESET (H5OPEN H5E_CANTRESET_g) +#define H5E_LINKCOUNT (H5OPEN H5E_LINKCOUNT_g) +#define H5E_VERSION (H5OPEN H5E_VERSION_g) +H5_DLLVAR hid_t H5E_ALIGNMENT_g; /* Alignment error */ +H5_DLLVAR hid_t H5E_BADITER_g; /* Iteration failed */ +H5_DLLVAR hid_t H5E_BADMESG_g; /* Unrecognized message */ +H5_DLLVAR hid_t H5E_CANTDELETE_g; /* Can't delete message */ +H5_DLLVAR hid_t H5E_CANTPACK_g; /* Can't pack messages */ +H5_DLLVAR hid_t H5E_CANTRENAME_g; /* Unable to rename object */ +H5_DLLVAR hid_t H5E_CANTRESET_g; /* Can't reset object */ +H5_DLLVAR hid_t H5E_LINKCOUNT_g; /* Bad object header link count */ +H5_DLLVAR hid_t H5E_VERSION_g; /* Wrong version number */ + +/* I/O pipeline errors */ +#define H5E_CALLBACK (H5OPEN H5E_CALLBACK_g) +#define H5E_CANAPPLY (H5OPEN H5E_CANAPPLY_g) +#define H5E_CANTFILTER (H5OPEN H5E_CANTFILTER_g) +#define H5E_NOENCODER (H5OPEN H5E_NOENCODER_g) +#define H5E_NOFILTER (H5OPEN H5E_NOFILTER_g) +#define H5E_SETLOCAL (H5OPEN H5E_SETLOCAL_g) +H5_DLLVAR hid_t H5E_CALLBACK_g; /* Callback failed */ +H5_DLLVAR hid_t H5E_CANAPPLY_g; /* Error from filter 'can apply' callback */ +H5_DLLVAR hid_t H5E_CANTFILTER_g; /* Filter operation failed */ +H5_DLLVAR hid_t H5E_NOENCODER_g; /* Filter present but encoding disabled */ +H5_DLLVAR hid_t H5E_NOFILTER_g; /* Requested filter is not available */ +H5_DLLVAR hid_t H5E_SETLOCAL_g; /* Error from filter 'set local' callback */ + +/* Property list errors */ +#define H5E_CANTGET (H5OPEN H5E_CANTGET_g) +#define H5E_CANTSET (H5OPEN H5E_CANTSET_g) +#define H5E_DUPCLASS (H5OPEN H5E_DUPCLASS_g) +#define H5E_SETDISALLOWED (H5OPEN H5E_SETDISALLOWED_g) +H5_DLLVAR hid_t H5E_CANTGET_g; /* Can't get value */ +H5_DLLVAR hid_t H5E_CANTSET_g; /* Can't set value */ +H5_DLLVAR hid_t H5E_DUPCLASS_g; /* Duplicate class name in parent class */ +H5_DLLVAR hid_t H5E_SETDISALLOWED_g; /* Disallowed operation */ + +/* Plugin errors */ +#define H5E_OPENERROR (H5OPEN H5E_OPENERROR_g) +H5_DLLVAR hid_t H5E_OPENERROR_g; /* Can't open directory or file */ + +/* Resource errors */ +#define H5E_ALREADYEXISTS (H5OPEN H5E_ALREADYEXISTS_g) +#define H5E_CANTALLOC (H5OPEN H5E_CANTALLOC_g) +#define H5E_CANTCOPY (H5OPEN H5E_CANTCOPY_g) +#define H5E_CANTFREE (H5OPEN H5E_CANTFREE_g) +#define H5E_CANTGC (H5OPEN H5E_CANTGC_g) +#define H5E_CANTGETSIZE (H5OPEN H5E_CANTGETSIZE_g) +#define H5E_CANTLOCK (H5OPEN H5E_CANTLOCK_g) +#define H5E_CANTUNLOCK (H5OPEN H5E_CANTUNLOCK_g) +#define H5E_NOSPACE (H5OPEN H5E_NOSPACE_g) +#define H5E_OBJOPEN (H5OPEN H5E_OBJOPEN_g) +H5_DLLVAR hid_t H5E_ALREADYEXISTS_g; /* Object already exists */ +H5_DLLVAR hid_t H5E_CANTALLOC_g; /* Can't allocate space */ +H5_DLLVAR hid_t H5E_CANTCOPY_g; /* Unable to copy object */ +H5_DLLVAR hid_t H5E_CANTFREE_g; /* Unable to free object */ +H5_DLLVAR hid_t H5E_CANTGC_g; /* Unable to garbage collect */ +H5_DLLVAR hid_t H5E_CANTGETSIZE_g; /* Unable to compute size */ +H5_DLLVAR hid_t H5E_CANTLOCK_g; /* Unable to lock object */ +H5_DLLVAR hid_t H5E_CANTUNLOCK_g; /* Unable to unlock object */ +H5_DLLVAR hid_t H5E_NOSPACE_g; /* No space available for allocation */ +H5_DLLVAR hid_t H5E_OBJOPEN_g; /* Object is already open */ + +/* System level errors */ +#define H5E_SYSERRSTR (H5OPEN H5E_SYSERRSTR_g) +H5_DLLVAR hid_t H5E_SYSERRSTR_g; /* System error message */ + +/* Datatype conversion errors */ +#define H5E_BADSIZE (H5OPEN H5E_BADSIZE_g) +#define H5E_CANTCONVERT (H5OPEN H5E_CANTCONVERT_g) +H5_DLLVAR hid_t H5E_BADSIZE_g; /* Bad size for object */ +H5_DLLVAR hid_t H5E_CANTCONVERT_g; /* Can't convert datatypes */ + +#ifdef __cplusplus +} +#endif + +#endif /* H5Epubgen_H */ diff --git a/src/H5Epublic.h b/src/H5Epublic.h index 9263c3c96bf..328cd4d2d84 100644 --- a/src/H5Epublic.h +++ b/src/H5Epublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -49,14 +49,6 @@ typedef struct H5E_error2_t { /**< Optional supplied description */ } H5E_error2_t; -/* When this header is included from a private header, don't make calls to H5open() */ -#undef H5OPEN -#ifndef H5private_H -#define H5OPEN H5open(), -#else /* H5private_H */ -#define H5OPEN -#endif /* H5private_H */ - /* HDF5 error class */ /* Extern "C" block needed to compile C++ filter plugins with some compilers */ #ifdef __cplusplus diff --git a/src/H5Eterm.h b/src/H5Eterm.h new file mode 100644 index 00000000000..63f9e4b0903 --- /dev/null +++ b/src/H5Eterm.h @@ -0,0 +1,259 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the LICENSE file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_err -- do not edit */ +/* Add new errors to H5err.txt file */ + +#ifndef H5Eterm_H +#define H5Eterm_H + +/* Reset major error IDs */ + H5E_ARGS_g = + H5E_ATTR_g = + H5E_BTREE_g = + H5E_CACHE_g = + H5E_CONTEXT_g = + H5E_DATASET_g = + H5E_DATASPACE_g = + H5E_DATATYPE_g = + H5E_EARRAY_g = + H5E_EFL_g = + H5E_ERROR_g = + H5E_EVENTSET_g = + H5E_FARRAY_g = + H5E_FILE_g = + H5E_FSPACE_g = + H5E_FUNC_g = + H5E_HEAP_g = + H5E_ID_g = + H5E_INTERNAL_g = + H5E_IO_g = + H5E_LIB_g = + H5E_LINK_g = + H5E_MAP_g = + H5E_NONE_MAJOR_g = + H5E_OHDR_g = + H5E_PAGEBUF_g = + H5E_PLINE_g = + H5E_PLIST_g = + H5E_PLUGIN_g = + H5E_REFERENCE_g = + H5E_RESOURCE_g = + H5E_RS_g = + H5E_SLIST_g = + H5E_SOHM_g = + H5E_STORAGE_g = + H5E_SYM_g = + H5E_THREADSAFE_g = + H5E_TST_g = + H5E_VFL_g = + H5E_VOL_g = + H5I_INVALID_HID; + +H5E_first_maj_id_g = H5I_INVALID_HID; +H5E_last_maj_id_g = H5I_INVALID_HID; + + +/* Reset minor error IDs */ + +/* ARGS: Argument errors */ + H5E_BADRANGE_g = + H5E_BADTYPE_g = + H5E_BADVALUE_g = + H5E_UNINITIALIZED_g = + H5E_UNSUPPORTED_g = + +/* ASYNC: Asynchronous operation errors */ + H5E_CANTCANCEL_g = + H5E_CANTWAIT_g = + +/* BTREE: B-tree related errors */ + H5E_CANTDECODE_g = + H5E_CANTENCODE_g = + H5E_CANTFIND_g = + H5E_CANTINSERT_g = + H5E_CANTLIST_g = + H5E_CANTMODIFY_g = + H5E_CANTREDISTRIBUTE_g = + H5E_CANTREMOVE_g = + H5E_CANTSPLIT_g = + H5E_CANTSWAP_g = + H5E_EXISTS_g = + H5E_NOTFOUND_g = + +/* CACHE: Cache related errors */ + H5E_CANTCLEAN_g = + H5E_CANTCORK_g = + H5E_CANTDEPEND_g = + H5E_CANTDIRTY_g = + H5E_CANTEXPUNGE_g = + H5E_CANTFLUSH_g = + H5E_CANTINS_g = + H5E_CANTLOAD_g = + H5E_CANTMARKCLEAN_g = + H5E_CANTMARKDIRTY_g = + H5E_CANTMARKSERIALIZED_g = + H5E_CANTMARKUNSERIALIZED_g = + H5E_CANTNOTIFY_g = + H5E_CANTPIN_g = + H5E_CANTPROTECT_g = + H5E_CANTRESIZE_g = + H5E_CANTSERIALIZE_g = + H5E_CANTTAG_g = + H5E_CANTUNCORK_g = + H5E_CANTUNDEPEND_g = + H5E_CANTUNPIN_g = + H5E_CANTUNPROTECT_g = + H5E_CANTUNSERIALIZE_g = + H5E_LOGGING_g = + H5E_NOTCACHED_g = + H5E_PROTECT_g = + H5E_SYSTEM_g = + +/* DSPACE: Dataspace errors */ + H5E_BADSELECT_g = + H5E_CANTAPPEND_g = + H5E_CANTCLIP_g = + H5E_CANTCOMPARE_g = + H5E_CANTCOUNT_g = + H5E_CANTNEXT_g = + H5E_CANTSELECT_g = + H5E_INCONSISTENTSTATE_g = + +/* FILE: Generic low-level file I/O errors */ + H5E_CLOSEERROR_g = + H5E_FCNTL_g = + H5E_OVERFLOW_g = + H5E_READERROR_g = + H5E_SEEKERROR_g = + H5E_WRITEERROR_g = + +/* FILEACC: File accessibility errors */ + H5E_BADFILE_g = + H5E_CANTCLOSEFILE_g = + H5E_CANTCREATE_g = + H5E_CANTDELETEFILE_g = + H5E_CANTLOCKFILE_g = + H5E_CANTOPENFILE_g = + H5E_CANTUNLOCKFILE_g = + H5E_FILEEXISTS_g = + H5E_FILEOPEN_g = + H5E_MOUNT_g = + H5E_NOTHDF5_g = + H5E_TRUNCATED_g = + H5E_UNMOUNT_g = + +/* FSPACE: Free space errors */ + H5E_CANTMERGE_g = + H5E_CANTREVIVE_g = + H5E_CANTSHRINK_g = + +/* FUNC: Function entry/exit interface errors */ + H5E_ALREADYINIT_g = + H5E_CANTINIT_g = + H5E_CANTRELEASE_g = + +/* GROUP: Group related errors */ + H5E_CANTCLOSEOBJ_g = + H5E_CANTOPENOBJ_g = + H5E_COMPLEN_g = + H5E_PATH_g = + +/* HEAP: Heap errors */ + H5E_CANTATTACH_g = + H5E_CANTCOMPUTE_g = + H5E_CANTEXTEND_g = + H5E_CANTOPERATE_g = + H5E_CANTRESTORE_g = + H5E_CANTUPDATE_g = + +/* ID: Object ID related errors */ + H5E_BADGROUP_g = + H5E_BADID_g = + H5E_CANTDEC_g = + H5E_CANTINC_g = + H5E_CANTREGISTER_g = + H5E_NOIDS_g = + +/* LINK: Link related errors */ + H5E_CANTMOVE_g = + H5E_CANTSORT_g = + H5E_NLINKS_g = + H5E_NOTREGISTERED_g = + H5E_TRAVERSE_g = + +/* MAP: Map related errors */ + H5E_CANTPUT_g = + +/* MPI: Parallel MPI errors */ + H5E_CANTGATHER_g = + H5E_CANTRECV_g = + H5E_MPI_g = + H5E_MPIERRSTR_g = + H5E_NO_INDEPENDENT_g = + +/* NONE: No error */ + H5E_NONE_MINOR_g = + +/* OHDR: Object header related errors */ + H5E_ALIGNMENT_g = + H5E_BADITER_g = + H5E_BADMESG_g = + H5E_CANTDELETE_g = + H5E_CANTPACK_g = + H5E_CANTRENAME_g = + H5E_CANTRESET_g = + H5E_LINKCOUNT_g = + H5E_VERSION_g = + +/* PIPELINE: I/O pipeline errors */ + H5E_CALLBACK_g = + H5E_CANAPPLY_g = + H5E_CANTFILTER_g = + H5E_NOENCODER_g = + H5E_NOFILTER_g = + H5E_SETLOCAL_g = + +/* PLIST: Property list errors */ + H5E_CANTGET_g = + H5E_CANTSET_g = + H5E_DUPCLASS_g = + H5E_SETDISALLOWED_g = + +/* PLUGIN: Plugin errors */ + H5E_OPENERROR_g = + +/* RESOURCE: Resource errors */ + H5E_ALREADYEXISTS_g = + H5E_CANTALLOC_g = + H5E_CANTCOPY_g = + H5E_CANTFREE_g = + H5E_CANTGC_g = + H5E_CANTGETSIZE_g = + H5E_CANTLOCK_g = + H5E_CANTUNLOCK_g = + H5E_NOSPACE_g = + H5E_OBJOPEN_g = + +/* SYSTEM: System level errors */ + H5E_SYSERRSTR_g = + +/* TYPECONV: Datatype conversion errors */ + H5E_BADSIZE_g = + H5E_CANTCONVERT_g = + H5I_INVALID_HID; + +H5E_first_min_id_g = H5I_INVALID_HID; +H5E_last_min_id_g = H5I_INVALID_HID; + + +#endif /* H5Eterm_H */ diff --git a/src/H5F.c b/src/H5F.c index b35ed2ef7c3..d0e7bcfcca1 100644 --- a/src/H5F.c +++ b/src/H5F.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FA.c b/src/H5FA.c index d30ea60cce3..b170e8ffb15 100644 --- a/src/H5FA.c +++ b/src/H5FA.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -61,6 +61,9 @@ static H5FA_t *H5FA__new(H5F_t *f, haddr_t fa_addr, bool from_open, void *ctx_ud /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Fixed array client ID to class mapping */ /* Remember to add client ID to H5FA_cls_id_t in H5FAprivate.h when adding a new diff --git a/src/H5FAcache.c b/src/H5FAcache.c index ecc25e216a2..0696a63b5cb 100644 --- a/src/H5FAcache.c +++ b/src/H5FAcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAdbg.c b/src/H5FAdbg.c index 1e624b3e13c..42331d5ac2d 100644 --- a/src/H5FAdbg.c +++ b/src/H5FAdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAdblkpage.c b/src/H5FAdblkpage.c index 89f346db403..9810d65059f 100644 --- a/src/H5FAdblkpage.c +++ b/src/H5FAdblkpage.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAdblock.c b/src/H5FAdblock.c index 558d9bf732d..d055b8992e8 100644 --- a/src/H5FAdblock.c +++ b/src/H5FAdblock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAhdr.c b/src/H5FAhdr.c index 3a3ee2db8a9..4aa683307eb 100644 --- a/src/H5FAhdr.c +++ b/src/H5FAhdr.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAint.c b/src/H5FAint.c index f4070ee03ae..b2c4f207f12 100644 --- a/src/H5FAint.c +++ b/src/H5FAint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAmodule.h b/src/H5FAmodule.h index 8ef75820d57..3fe56c012b2 100644 --- a/src/H5FAmodule.h +++ b/src/H5FAmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5FA_MODULE -#define H5_MY_PKG H5FA -#define H5_MY_PKG_ERR H5E_FARRAY +#define H5_MY_PKG H5FA +#define H5_MY_PKG_ERR H5E_FARRAY +#define H5_MY_PKG_INIT NO #endif /* H5FAmodule_H */ diff --git a/src/H5FApkg.h b/src/H5FApkg.h index 79213e94401..fc178764a68 100644 --- a/src/H5FApkg.h +++ b/src/H5FApkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAprivate.h b/src/H5FAprivate.h index 9bdc0742c75..fe49f11d0bf 100644 --- a/src/H5FAprivate.h +++ b/src/H5FAprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAstat.c b/src/H5FAstat.c index 4ea4177045d..a8247ee313a 100644 --- a/src/H5FAstat.c +++ b/src/H5FAstat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FAtest.c b/src/H5FAtest.c index 666b922fa27..febd7ddbb9b 100644 --- a/src/H5FAtest.c +++ b/src/H5FAtest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FD.c b/src/H5FD.c index a6f35ad6a87..567eb2c809f 100644 --- a/src/H5FD.c +++ b/src/H5FD.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -59,6 +59,12 @@ static herr_t H5FD__query(const H5FD_t *f, unsigned long *flags /*out*/); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + +/* Whether to ignore file locks when disabled (env var value) */ +htri_t H5FD_ignore_disabled_file_locks_p = FAIL; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -92,10 +98,11 @@ static const H5I_class_t H5I_VFL_CLS[1] = {{ /*------------------------------------------------------------------------- * Function: H5FD_init * - * Purpose: Initialize the interface from some other layer. + * Purpose: Initialize the interface from some other package. + * + * Return: Success: non-negative + * Failure: negative * - * Return: Success: non-negative - * Failure: negative *------------------------------------------------------------------------- */ herr_t @@ -104,6 +111,28 @@ H5FD_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD_init() */ + +/*------------------------------------------------------------------------- + * Function: H5FD__init_package + * + * Purpose: Initialize the virtual file layer. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5FD__init_package(void) +{ + char *lock_env_var = NULL; /* Environment variable pointer */ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE if (H5I_register_type(H5I_VFL_CLS) < 0) HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "unable to initialize interface"); @@ -111,9 +140,64 @@ H5FD_init(void) /* Reset the file serial numbers */ H5FD_file_serial_no_g = 0; + /* Check the use disabled file locks environment variable */ + lock_env_var = getenv(HDF5_USE_FILE_LOCKING); + if (lock_env_var && !strcmp(lock_env_var, "BEST_EFFORT")) + H5FD_ignore_disabled_file_locks_p = true; /* Override: Ignore disabled locks */ + else if (lock_env_var && (!strcmp(lock_env_var, "TRUE") || !strcmp(lock_env_var, "1"))) + H5FD_ignore_disabled_file_locks_p = false; /* Override: Don't ignore disabled locks */ + else + H5FD_ignore_disabled_file_locks_p = FAIL; /* Environment variable not set, or not set correctly */ + + /* Initialize all internal VFD drivers, so their driver IDs are set up */ + if (H5FD__core_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register core VFD"); +#ifdef H5_HAVE_DIRECT + if (H5FD__direct_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register direct VFD"); +#endif + if (H5FD__family_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register family VFD"); +#ifdef H5_HAVE_LIBHDFS + if (H5FD__hdfs_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register hdfs VFD"); +#endif +#ifdef H5_HAVE_IOC_VFD + if (H5FD__ioc_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register ioc VFD"); +#endif + if (H5FD__log_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register log VFD"); +#ifdef H5_HAVE_MIRROR_VFD + if (H5FD__mirror_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register mirror VFD"); +#endif +#ifdef H5_HAVE_PARALLEL + if (H5FD__mpio_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register mpio VFD"); +#endif + if (H5FD__multi_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register multi VFD"); + if (H5FD__onion_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register onion VFD"); +#ifdef H5_HAVE_ROS3_VFD + if (H5FD__ros3_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register ros3 VFD"); +#endif + if (H5FD__sec2_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register sec2 VFD"); + if (H5FD__splitter_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register splitter VFD"); + if (H5FD__stdio_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register stdio VFD"); +#ifdef H5_HAVE_SUBFILING_VFD + if (H5FD__subfiling_register() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register subfiling VFD"); +#endif + done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5FD__init_package() */ /*------------------------------------------------------------------------- * Function: H5FD_term_package @@ -137,14 +221,52 @@ H5FD_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - if (H5I_nmembers(H5I_VFL) > 0) { - (void)H5I_clear_type(H5I_VFL, false, false); - n++; /*H5I*/ - } /* end if */ - else { - /* Destroy the VFL driver ID group */ - n += (H5I_dec_type_ref(H5I_VFL) > 0); - } /* end else */ + if (H5_PKG_INIT_VAR) { + if (H5I_nmembers(H5I_VFL) > 0) { + (void)H5I_clear_type(H5I_VFL, false, false); + + /* Reset all internal VFD driver IDs */ + H5FD__core_unregister(); +#ifdef H5_HAVE_DIRECT + H5FD__direct_unregister(); +#endif + H5FD__family_unregister(); +#ifdef H5_HAVE_LIBHDFS + H5FD__hdfs_unregister(); +#endif +#ifdef H5_HAVE_IOC_VFD + H5FD__ioc_unregister(); +#endif + H5FD__log_unregister(); +#ifdef H5_HAVE_MIRROR_VFD + H5FD__mirror_unregister(); +#endif +#ifdef H5_HAVE_PARALLEL + H5FD__mpio_unregister(); +#endif + H5FD__multi_unregister(); + H5FD__onion_unregister(); +#ifdef H5_HAVE_ROS3_VFD + H5FD__ros3_unregister(); +#endif + H5FD__sec2_unregister(); + H5FD__splitter_unregister(); + H5FD__stdio_unregister(); +#ifdef H5_HAVE_SUBFILING_VFD + H5FD__subfiling_unregister(); +#endif + + n++; /*H5I*/ + } /* end if */ + else { + /* Destroy the VFL driver ID group */ + n += (H5I_dec_type_ref(H5I_VFL) > 0); + + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end else */ + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5FD_term_package() */ @@ -154,7 +276,7 @@ H5FD_term_package(void) * * Purpose: Frees a file driver class struct and returns an indication of * success. This function is used as the free callback for the - * virtual file layer object identifiers (cf H5FD_init). + * virtual file layer object identifiers (cf H5FD__init_package). * * Return: SUCCEED/FAIL * @@ -441,7 +563,7 @@ H5FD_sb_size(H5FD_t *file) { hsize_t ret_value = 0; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(0) /* Sanity checks */ assert(file); @@ -451,6 +573,7 @@ H5FD_sb_size(H5FD_t *file) if (file->cls->sb_size) ret_value = (file->cls->sb_size)(file); +done: FUNC_LEAVE_NOAPI(ret_value) } @@ -578,7 +701,7 @@ H5FD_fapl_get(H5FD_t *file) { void *ret_value = NULL; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(NULL) /* Sanity checks */ assert(file); @@ -588,6 +711,7 @@ H5FD_fapl_get(H5FD_t *file) if (file->cls->fapl_get) ret_value = (file->cls->fapl_get)(file); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_fapl_get() */ @@ -945,7 +1069,7 @@ H5FD_cmp(const H5FD_t *f1, const H5FD_t *f2) { int ret_value = -1; /* Return value */ - FUNC_ENTER_NOAPI_NOERR /* return value is arbitrary */ + FUNC_ENTER_NOAPI(-1) /* return value is arbitrary */ if ((!f1 || !f1->cls) && (!f2 || !f2->cls)) HGOTO_DONE(0); @@ -1299,7 +1423,7 @@ H5FD_get_maxaddr(const H5FD_t *file) { haddr_t ret_value = HADDR_UNDEF; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(HADDR_UNDEF) /* Sanity checks */ assert(file); @@ -1307,6 +1431,7 @@ H5FD_get_maxaddr(const H5FD_t *file) /* Set return value */ ret_value = file->maxaddr; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_get_maxaddr() */ diff --git a/src/H5FDcore.c b/src/H5FDcore.c index a05b1d037f0..408b7c57f59 100644 --- a/src/H5FDcore.c +++ b/src/H5FDcore.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,13 +16,13 @@ * access to small, temporary hdf5 files. */ -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FDcore.h" /* Core file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FLprivate.h" /* Free lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ @@ -30,10 +30,7 @@ #include "H5SLprivate.h" /* Skip lists */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_CORE_g = 0; - -/* Whether to ignore file locks when disabled (env var value) */ -static htri_t ignore_disabled_file_locks_s = FAIL; +hid_t H5FD_CORE_id_g = H5I_INVALID_HID; /* The skip list node type. Represents a region in the file. */ typedef struct H5FD_core_region_t { @@ -106,27 +103,27 @@ typedef struct H5FD_core_fapl_t { /* These macros check for overflow of various quantities. These macros * assume that file_offset_t is signed and haddr_t and size_t are unsigned. * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. + * CORE_ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' + * is too large to be represented by the second argument + * of the file seek function. * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. + * CORE_SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too + * large to be represented by the `size_t' type. * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely in memory. + * CORE_REGION_OVERFLOW: Checks whether an address and size pair describe data + * which can be addressed entirely in memory. */ -#define MAXADDR ((haddr_t)((~(size_t)0) - 1)) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || (A) > (haddr_t)MAXADDR) -#define SIZE_OVERFLOW(Z) ((Z) > (hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || (size_t)((A) + (Z)) < (size_t)(A)) +#define CORE_MAXADDR ((haddr_t)((~(size_t)0) - 1)) +#define CORE_ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || (A) > (haddr_t)CORE_MAXADDR) +#define CORE_SIZE_OVERFLOW(Z) ((Z) > (hsize_t)CORE_MAXADDR) +#define CORE_REGION_OVERFLOW(A, Z) \ + (CORE_ADDR_OVERFLOW(A) || CORE_SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || \ + (size_t)((A) + (Z)) < (size_t)(A)) /* Prototypes */ static herr_t H5FD__core_add_dirty_region(H5FD_core_t *file, haddr_t start, haddr_t end); static herr_t H5FD__core_destroy_dirty_list(H5FD_core_t *file); static herr_t H5FD__core_write_to_bstore(H5FD_core_t *file, haddr_t addr, size_t size); -static herr_t H5FD__core_term(void); static void *H5FD__core_fapl_get(H5FD_t *_file); static H5FD_t *H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr); static herr_t H5FD__core_close(H5FD_t *_file); @@ -151,9 +148,9 @@ static const H5FD_class_t H5FD_core_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_CORE_VALUE, /* value */ "core", /* name */ - MAXADDR, /* maxaddr */ + CORE_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__core_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -443,61 +440,48 @@ H5FD__core_get_default_config(void) } /* end H5FD__core_get_default_config() */ /*------------------------------------------------------------------------- - * Function: H5FD_core_init + * Function: H5FD__core_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. * - * Return: Success: The driver ID for the core driver - * Failure: H5I_INVALID_HID + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ -hid_t -H5FD_core_init(void) +herr_t +H5FD__core_register(void) { - char *lock_env_var = NULL; /* Environment variable pointer */ - hid_t ret_value = H5I_INVALID_HID; /* Return value */ - - FUNC_ENTER_NOAPI_NOERR - - /* Check the use disabled file locks environment variable */ - lock_env_var = getenv(HDF5_USE_FILE_LOCKING); - if (lock_env_var && !strcmp(lock_env_var, "BEST_EFFORT")) - ignore_disabled_file_locks_s = true; /* Override: Ignore disabled locks */ - else if (lock_env_var && (!strcmp(lock_env_var, "TRUE") || !strcmp(lock_env_var, "1"))) - ignore_disabled_file_locks_s = false; /* Override: Don't ignore disabled locks */ - else - ignore_disabled_file_locks_s = FAIL; /* Environment variable not set, or not set correctly */ + herr_t ret_value = SUCCEED; /* Return value */ - if (H5I_VFL != H5I_get_type(H5FD_CORE_g)) - H5FD_CORE_g = H5FD_register(&H5FD_core_g, sizeof(H5FD_class_t), false); + FUNC_ENTER_PACKAGE - /* Set return value */ - ret_value = H5FD_CORE_g; + if (H5I_VFL != H5I_get_type(H5FD_CORE_id_g)) + if ((H5FD_CORE_id_g = H5FD_register(&H5FD_core_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register core driver"); +done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_core_init() */ +} /* end H5FD__core_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__core_term + * Function: H5FD__core_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__core_term(void) +herr_t +H5FD__core_unregister(void) { FUNC_ENTER_PACKAGE_NOERR /* Reset VFL ID */ - H5FD_CORE_g = 0; + H5FD_CORE_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__core_term() */ +} /* end H5FD__core_unregister() */ /*------------------------------------------------------------------------- * Function: H5Pset_core_write_tracking @@ -724,7 +708,7 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (CORE_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "maxaddr overflow"); assert(H5P_DEFAULT != fapl_id); if (NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id))) @@ -798,9 +782,9 @@ H5FD__core_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr file->fi_callbacks = file_image_info.callbacks; /* Check the file locking flags in the fapl */ - if (ignore_disabled_file_locks_s != FAIL) + if (H5FD_ignore_disabled_file_locks_p != FAIL) /* The environment variable was set, so use that preferentially */ - file->ignore_disabled_file_locks = ignore_disabled_file_locks_s; + file->ignore_disabled_file_locks = H5FD_ignore_disabled_file_locks_p; else { /* Use the value in the property list */ if (H5P_get(plist, H5F_ACS_IGNORE_DISABLED_FILE_LOCKS_NAME, &file->ignore_disabled_file_locks) < 0) @@ -1172,7 +1156,7 @@ H5FD__core_set_eoa(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, haddr_t addr) FUNC_ENTER_PACKAGE - if (ADDR_OVERFLOW(addr)) + if (CORE_ADDR_OVERFLOW(addr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "address overflow"); file->eoa = addr; @@ -1288,7 +1272,7 @@ H5FD__core_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU /* Check for overflow conditions */ if (HADDR_UNDEF == addr) HGOTO_ERROR(H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed"); - if (REGION_OVERFLOW(addr, size)) + if (CORE_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed"); /* Read the part which is before the EOF marker */ @@ -1342,7 +1326,7 @@ H5FD__core_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN assert(buf); /* Check for overflow conditions */ - if (REGION_OVERFLOW(addr, size)) + if (CORE_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_IO, H5E_OVERFLOW, FAIL, "file address overflowed"); /* diff --git a/src/H5FDcore.h b/src/H5FDcore.h index cd45c8d6061..97aa138761f 100644 --- a/src/H5FDcore.h +++ b/src/H5FDcore.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,8 +16,11 @@ #ifndef H5FDcore_H #define H5FDcore_H -/** Initializer for the core VFD */ -#define H5FD_CORE (H5FDperform_init(H5FD_core_init)) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + +/** ID for the core VFD */ +#define H5FD_CORE (H5OPEN H5FD_CORE_id_g) /** Identifier for the core VFD */ #define H5FD_CORE_VALUE H5_VFD_CORE @@ -28,9 +31,9 @@ extern "C" { /** @private * - * \brief Private initializer for the core VFD + * \brief ID for the core VFD */ -H5_DLL hid_t H5FD_core_init(void); +H5_DLLVAR hid_t H5FD_CORE_id_g; /** * \ingroup FAPL diff --git a/src/H5FDdevelop.h b/src/H5FDdevelop.h index 5f1be973d64..f6915ef3c73 100644 --- a/src/H5FDdevelop.h +++ b/src/H5FDdevelop.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -359,7 +359,6 @@ typedef hid_t (*H5FD_init_t)(void); extern "C" { #endif -H5_DLL hid_t H5FDperform_init(H5FD_init_t op); H5_DLL hid_t H5FDregister(const H5FD_class_t *cls); H5_DLL htri_t H5FDis_driver_registered_by_name(const char *driver_name); H5_DLL htri_t H5FDis_driver_registered_by_value(H5FD_class_value_t driver_value); diff --git a/src/H5FDdirect.c b/src/H5FDdirect.c index b072eeeec08..ba287b9d4a4 100644 --- a/src/H5FDdirect.c +++ b/src/H5FDdirect.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,13 +16,13 @@ * buffer. The main system support this feature is Linux. */ -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FDdirect.h" /* Direct file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ @@ -31,10 +31,7 @@ #ifdef H5_HAVE_DIRECT /* The driver identification number, initialized at runtime */ -static hid_t H5FD_DIRECT_g = 0; - -/* Whether to ignore file locks when disabled (env var value) */ -static htri_t ignore_disabled_file_locks_s = FAIL; +hid_t H5FD_DIRECT_id_g = H5I_INVALID_HID; /* File operations */ #define OP_UNKNOWN 0 @@ -93,29 +90,7 @@ typedef struct H5FD_direct_t { } H5FD_direct_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. - * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) -#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) - /* Prototypes */ -static herr_t H5FD__direct_term(void); static herr_t H5FD__direct_populate_config(size_t boundary, size_t block_size, size_t cbuf_size, H5FD_direct_fapl_t *fa_out); static void *H5FD__direct_fapl_get(H5FD_t *file); @@ -141,9 +116,9 @@ static const H5FD_class_t H5FD_direct_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_DIRECT_VALUE, /* value */ "direct", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__direct_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -184,65 +159,48 @@ static const H5FD_class_t H5FD_direct_g = { H5FL_DEFINE_STATIC(H5FD_direct_t); /*------------------------------------------------------------------------- - * Function: H5FD_direct_init + * Function: H5FD__direct_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. * - * Return: Success: The driver ID for the direct driver - * Failure: H5I_INVALID_HID + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ -hid_t -H5FD_direct_init(void) +herr_t +H5FD__direct_register(void) { - char *lock_env_var = NULL; /* Environment variable pointer */ - hid_t ret_value = H5I_INVALID_HID; /* Return value */ - - FUNC_ENTER_NOAPI(H5I_INVALID_HID) - - /* Check the use disabled file locks environment variable */ - lock_env_var = getenv(HDF5_USE_FILE_LOCKING); - if (lock_env_var && !strcmp(lock_env_var, "BEST_EFFORT")) - ignore_disabled_file_locks_s = true; /* Override: Ignore disabled locks */ - else if (lock_env_var && (!strcmp(lock_env_var, "TRUE") || !strcmp(lock_env_var, "1"))) - ignore_disabled_file_locks_s = false; /* Override: Don't ignore disabled locks */ - else - ignore_disabled_file_locks_s = FAIL; /* Environment variable not set, or not set correctly */ + herr_t ret_value = SUCCEED; /* Return value */ - if (H5I_VFL != H5I_get_type(H5FD_DIRECT_g)) { - H5FD_DIRECT_g = H5FD_register(&H5FD_direct_g, sizeof(H5FD_class_t), false); - if (H5I_INVALID_HID == H5FD_DIRECT_g) - HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register direct"); - } + FUNC_ENTER_PACKAGE - /* Set return value */ - ret_value = H5FD_DIRECT_g; + if (H5I_VFL != H5I_get_type(H5FD_DIRECT_id_g)) + if ((H5FD_DIRECT_id_g = H5FD_register(&H5FD_direct_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register direct driver"); done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_direct_init() */ +} /* end H5FD__direct_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__direct_term + * Function: H5FD__direct_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: Non-negative on success or negative on failure * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__direct_term(void) +herr_t +H5FD__direct_unregister(void) { FUNC_ENTER_PACKAGE_NOERR /* Reset VFL ID */ - H5FD_DIRECT_g = 0; + H5FD_DIRECT_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__direct_term() */ +} /* end H5FD__direct_unregister() */ /*------------------------------------------------------------------------- * Function: H5Pset_fapl_direct @@ -437,7 +395,7 @@ H5FD__direct_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxad int fd = (-1); H5FD_direct_t *file = NULL; const H5FD_direct_fapl_t *fa; - H5FD_direct_fapl_t default_fa; + H5FD_direct_fapl_t default_fa = {0}; #ifdef H5_HAVE_WIN32_API HFILE filehandle; struct _BY_HANDLE_FILE_INFORMATION fileinfo; @@ -457,7 +415,7 @@ H5FD__direct_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxad HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); /* Build the open flags */ @@ -511,9 +469,9 @@ H5FD__direct_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxad file->fa.cbsize = fa->cbsize; /* Check the file locking flags in the fapl */ - if (ignore_disabled_file_locks_s != FAIL) + if (H5FD_ignore_disabled_file_locks_p != FAIL) /* The environment variable was set, so use that preferentially */ - file->ignore_disabled_file_locks = ignore_disabled_file_locks_s; + file->ignore_disabled_file_locks = H5FD_ignore_disabled_file_locks_p; else { /* Use the value in the property list */ if (H5P_get(plist, H5F_ACS_IGNORE_DISABLED_FILE_LOCKS_NAME, &file->ignore_disabled_file_locks) < 0) @@ -839,7 +797,7 @@ H5FD__direct_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_U /* Check for overflow conditions */ if (HADDR_UNDEF == addr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined"); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow"); /* If the system doesn't require data to be aligned, read the data in @@ -1019,7 +977,7 @@ H5FD__direct_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_ /* Check for overflow conditions */ if (HADDR_UNDEF == addr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined"); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow"); /* If the system doesn't require data to be aligned, read the data in diff --git a/src/H5FDdirect.h b/src/H5FDdirect.h index 1e60bb08119..6ceca0e9c17 100644 --- a/src/H5FDdirect.h +++ b/src/H5FDdirect.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,10 +16,13 @@ #ifndef H5FDdirect_H #define H5FDdirect_H +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + #ifdef H5_HAVE_DIRECT -/** Initializer for the direct VFD */ -#define H5FD_DIRECT (H5FDperform_init(H5FD_direct_init)) +/** ID for the direct VFD */ +#define H5FD_DIRECT (H5OPEN H5FD_DIRECT_id_g) /** Identifier for the direct VFD */ #define H5FD_DIRECT_VALUE H5_VFD_DIRECT @@ -50,9 +53,9 @@ extern "C" { /** @private * - * \brief Private initializer for the direct VFD + * \brief ID for the direct VFD */ -H5_DLL hid_t H5FD_direct_init(void); +H5_DLLVAR hid_t H5FD_DIRECT_id_g; /** * \ingroup FAPL diff --git a/src/H5FDfamily.c b/src/H5FDfamily.c index 335c63a94f1..e186c06017e 100644 --- a/src/H5FDfamily.c +++ b/src/H5FDfamily.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -28,13 +28,13 @@ * */ -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FDfamily.h" /* Family file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ @@ -46,7 +46,7 @@ #define H5FD_FAM_DEF_MEM_SIZE ((hsize_t)(100 * H5_MB)) /* The driver identification number, initialized at runtime */ -static hid_t H5FD_FAMILY_g = 0; +hid_t H5FD_FAMILY_id_g = H5I_INVALID_HID; /* The description of a file belonging to this driver. */ typedef struct H5FD_family_t { @@ -80,7 +80,6 @@ static herr_t H5FD__family_get_default_config(H5FD_family_fapl_t *fa_out); static char *H5FD__family_get_default_printf_filename(const char *old_filename); /* Callback prototypes */ -static herr_t H5FD__family_term(void); static void *H5FD__family_fapl_get(H5FD_t *_file); static void *H5FD__family_fapl_copy(const void *_old_fa); static herr_t H5FD__family_fapl_free(void *_fa); @@ -112,7 +111,7 @@ static const H5FD_class_t H5FD_family_g = { "family", /* name */ HADDR_MAX, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__family_term, /* terminate */ + NULL, /* terminate */ H5FD__family_sb_size, /* sb_size */ H5FD__family_sb_encode, /* sb_encode */ H5FD__family_sb_decode, /* sb_decode */ @@ -267,51 +266,48 @@ H5FD__family_get_default_printf_filename(const char *old_filename) } /* end H5FD__family_get_default_printf_filename() */ /*------------------------------------------------------------------------- - * Function: H5FD_family_init + * Function: H5FD__family_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. * - * Return: Success: The driver ID for the family driver - * Failure: H5I_INVALID_HID + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ -hid_t -H5FD_family_init(void) +herr_t +H5FD__family_register(void) { - hid_t ret_value = H5I_INVALID_HID; + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR - - if (H5I_VFL != H5I_get_type(H5FD_FAMILY_g)) - H5FD_FAMILY_g = H5FD_register(&H5FD_family_g, sizeof(H5FD_class_t), false); + FUNC_ENTER_PACKAGE - /* Set return value */ - ret_value = H5FD_FAMILY_g; + if (H5I_VFL != H5I_get_type(H5FD_FAMILY_id_g)) + if ((H5FD_FAMILY_id_g = H5FD_register(&H5FD_family_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register family driver"); +done: FUNC_LEAVE_NOAPI(ret_value) -} /* H5FD_family_init() */ +} /* H5FD__family_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__family_term + * Function: H5FD__family_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: Non-negative on success or negative on failure * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__family_term(void) +herr_t +H5FD__family_unregister(void) { FUNC_ENTER_PACKAGE_NOERR /* Reset VFL ID */ - H5FD_FAMILY_g = 0; + H5FD_FAMILY_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__family_term() */ +} /* end H5FD__family_unregister() */ /*------------------------------------------------------------------------- * Function: H5Pset_fapl_family diff --git a/src/H5FDfamily.h b/src/H5FDfamily.h index 32e885c422d..3f032f8aae1 100644 --- a/src/H5FDfamily.h +++ b/src/H5FDfamily.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,8 +16,11 @@ #ifndef H5FDfamily_H #define H5FDfamily_H -/** Initializer for the family VFD */ -#define H5FD_FAMILY (H5FDperform_init(H5FD_family_init)) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + +/** ID for the family VFD */ +#define H5FD_FAMILY (H5OPEN H5FD_FAMILY_id_g) /** Identifier for the family VFD */ #define H5FD_FAMILY_VALUE H5_VFD_FAMILY @@ -28,9 +31,9 @@ extern "C" { /** @private * - * \brief Private initializer for the family VFD + * \brief ID for the family VFD */ -H5_DLL hid_t H5FD_family_init(void); +H5_DLLVAR hid_t H5FD_FAMILY_id_g; /** * \ingroup FAPL diff --git a/src/H5FDhdfs.c b/src/H5FDhdfs.c index 25fe7cba95a..615067d1e22 100644 --- a/src/H5FDhdfs.c +++ b/src/H5FDhdfs.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -15,21 +15,19 @@ * File System (HDFS). */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + +#include "H5private.h" /* Generic Functions */ + #ifdef H5_HAVE_LIBHDFS -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" -#endif -#include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FDhdfs.h" /* hdfs file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ -#ifdef H5_HAVE_LIBHDFS - /* HDFS routines */ #include "hdfs.h" @@ -40,7 +38,12 @@ #define HDFS_STATS 0 /* The driver identification number, initialized at runtime */ -static hid_t H5FD_HDFS_g = 0; +hid_t H5FD_HDFS_id_g = H5I_INVALID_HID; + +/* Flag to indicate whether global driver resources & settings have been + * initialized. + */ +static bool H5FD_hdfs_init_s = false; #if HDFS_STATS @@ -227,21 +230,7 @@ typedef struct H5FD_hdfs_t { #endif } H5FD_hdfs_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * Only included if HDFS code should compile. - * - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) - /* Prototypes */ -static herr_t H5FD__hdfs_term(void); static void *H5FD__hdfs_fapl_get(H5FD_t *_file); static void *H5FD__hdfs_fapl_copy(const void *_old_fa); static herr_t H5FD__hdfs_fapl_free(void *_fa); @@ -265,9 +254,9 @@ static const H5FD_class_t H5FD_hdfs_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_HDFS_VALUE, /* value */ "hdfs", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__hdfs_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -308,61 +297,44 @@ static const H5FD_class_t H5FD_hdfs_g = { H5FL_DEFINE_STATIC(H5FD_hdfs_t); /*------------------------------------------------------------------------- - * Function: H5FD_hdfs_init + * Function: H5FD__hdfs_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. * - * Return: Success: The driver ID for the hdfs driver. - * Failure: Negative + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ -hid_t -H5FD_hdfs_init(void) +herr_t +H5FD__hdfs_register(void) { - hid_t ret_value = H5I_INVALID_HID; -#if HDFS_STATS - unsigned int bin_i; -#endif + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5I_INVALID_HID) + FUNC_ENTER_PACKAGE #if HDFS_DEBUG fprintf(stdout, "called %s.\n", __func__); #endif - if (H5I_VFL != H5I_get_type(H5FD_HDFS_g)) - H5FD_HDFS_g = H5FD_register(&H5FD_hdfs_g, sizeof(H5FD_class_t), false); - -#if HDFS_STATS - /* pre-compute statsbin boundaries - */ - for (bin_i = 0; bin_i < HDFS_STATS_BIN_COUNT; bin_i++) { - unsigned long long value = 0; - - HDFS_STATS_POW(bin_i, &value) - hdfs_stats_boundaries[bin_i] = value; - } -#endif - - ret_value = H5FD_HDFS_g; + if (H5I_VFL != H5I_get_type(H5FD_HDFS_id_g)) + if ((H5FD_HDFS_id_g = H5FD_register(&H5FD_hdfs_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register hdfs driver"); done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_hdfs_init() */ +} /* end H5FD__hdfs_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__hdfs_term + * Function: H5FD__hdfs_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__hdfs_term(void) +herr_t +H5FD__hdfs_unregister(void) { FUNC_ENTER_PACKAGE_NOERR @@ -371,10 +343,48 @@ H5FD__hdfs_term(void) #endif /* Reset VFL ID */ - H5FD_HDFS_g = 0; + H5FD_HDFS_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__hdfs_term() */ +} /* end H5FD__hdfs_unregister() */ + +/*------------------------------------------------------------------------- + * Function: H5FD__hdfs_init + * + * Purpose: Singleton to initialize global driver settings & resources. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +static herr_t +H5FD__hdfs_init(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + +#if HDFS_DEBUG + fprintf(stdout, "called %s.\n", __func__); +#endif + +#if HDFS_STATS + /* pre-compute statsbin boundaries + */ + for (unsigned bin_i = 0; bin_i < HDFS_STATS_BIN_COUNT; bin_i++) { + unsigned long long value = 0; + + HDFS_STATS_POW(bin_i, &value) + hdfs_stats_boundaries[bin_i] = value; + } +#endif + + /* Indicate that driver is set up */ + H5FD_hdfs_init_s = true; + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD__hdfs_init() */ /*-------------------------------------------------------------------------- * Function: H5FD__hdfs_handle_open @@ -401,6 +411,11 @@ H5FD__hdfs_handle_open(const char *path, const char *namenode_name, const int32_ fprintf(stdout, "called %s.\n", __func__); #endif + /* Initialize driver, if it's not yet */ + if (!H5FD_hdfs_init_s) + if (H5FD__hdfs_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "can't initialize driver"); + if (path == NULL || path[0] == '\0') HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "path cannot be null"); if (namenode_name == NULL) @@ -812,7 +827,7 @@ H5FD__hdfs_open(const char *path, unsigned flags, hid_t fapl_id, haddr_t maxaddr HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); if (flags != H5F_ACC_RDONLY) HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, NULL, "only Read-Only access allowed"); diff --git a/src/H5FDhdfs.h b/src/H5FDhdfs.h index 3150a45801b..cc667ac1d81 100644 --- a/src/H5FDhdfs.h +++ b/src/H5FDhdfs.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -18,10 +18,13 @@ #ifndef H5FDhdfs_H #define H5FDhdfs_H +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + #ifdef H5_HAVE_LIBHDFS -/** Initializer for the hdfs VFD */ -#define H5FD_HDFS (H5FDperform_init(H5FD_hdfs_init)) +/** ID for the HDFS VFD */ +#define H5FD_HDFS (H5OPEN H5FD_HDFS_id_g) /** Identifier for the hdfs VFD */ #define H5FD_HDFS_VALUE H5_VFD_HDFS @@ -37,9 +40,6 @@ #endif /* H5_HAVE_LIBHDFS */ #ifdef H5_HAVE_LIBHDFS -#ifdef __cplusplus -extern "C" { -#endif /** * The version number of the H5FD_hdfs_fapl_t configuration @@ -93,11 +93,15 @@ typedef struct H5FD_hdfs_fapl_t { int32_t stream_buffer_size; } H5FD_hdfs_fapl_t; +#ifdef __cplusplus +extern "C" { +#endif + /** @private * - * \brief Private initializer for the hdfs VFD + * \brief ID for the HDFS VFD */ -H5_DLL hid_t H5FD_hdfs_init(void); +H5_DLLVAR hid_t H5FD_HDFS_id_g; /** * \ingroup FAPL diff --git a/src/H5FDint.c b/src/H5FDint.c index a0b2c7d1ecb..07761742c13 100644 --- a/src/H5FDint.c +++ b/src/H5FDint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -850,7 +850,7 @@ H5FD__read_selection_translate(uint32_t skip_vector_cb, H5FD_t *file, H5FD_mem_t size_t vec_arr_nused = 0; herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity checks */ assert(file); @@ -1542,7 +1542,7 @@ H5FD__write_selection_translate(uint32_t skip_vector_cb, H5FD_t *file, H5FD_mem_ size_t vec_arr_nused = 0; herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity checks */ assert(file); @@ -3044,7 +3044,7 @@ H5FD_check_plugin_load(const H5FD_class_t *cls, const H5PL_key_t *key, bool *suc { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity checks */ assert(cls); @@ -3066,6 +3066,7 @@ H5FD_check_plugin_load(const H5FD_class_t *cls, const H5PL_key_t *key, bool *suc *success = true; } +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD_check_plugin_load() */ diff --git a/src/H5FDlog.c b/src/H5FDlog.c index 8c02415ce08..f3877f684ed 100644 --- a/src/H5FDlog.c +++ b/src/H5FDlog.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -20,23 +20,20 @@ * With custom modifications... */ -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FDlog.h" /* Logging file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_LOG_g = 0; - -/* Whether to ignore file locks when disabled (env var value) */ -static htri_t ignore_disabled_file_locks_s = FAIL; +hid_t H5FD_LOG_id_g = H5I_INVALID_HID; /* Driver-specific file access properties */ typedef struct H5FD_log_fapl_t { @@ -132,29 +129,7 @@ typedef struct H5FD_log_t { H5FD_log_fapl_t fa; /* Driver-specific file access properties */ } H5FD_log_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. - * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) -#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) - /* Prototypes */ -static herr_t H5FD__log_term(void); static void *H5FD__log_fapl_get(H5FD_t *file); static void *H5FD__log_fapl_copy(const void *_old_fa); static herr_t H5FD__log_fapl_free(void *_fa); @@ -181,9 +156,9 @@ static const H5FD_class_t H5FD_log_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_LOG_VALUE, /* value */ "log", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__log_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -227,61 +202,48 @@ static const H5FD_log_fapl_t H5FD_log_default_config_g = {NULL, H5FD_LOG_LOC_IO H5FL_DEFINE_STATIC(H5FD_log_t); /*------------------------------------------------------------------------- - * Function: H5FD_log_init + * Function: H5FD__log_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. * - * Return: Success: The driver ID for the log driver - * Failure: H5I_INVALID_HID + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ -hid_t -H5FD_log_init(void) +herr_t +H5FD__log_register(void) { - char *lock_env_var = NULL; /* Environment variable pointer */ - hid_t ret_value = H5I_INVALID_HID; /* Return value */ - - FUNC_ENTER_NOAPI_NOERR + herr_t ret_value = SUCCEED; /* Return value */ - /* Check the use disabled file locks environment variable */ - lock_env_var = getenv(HDF5_USE_FILE_LOCKING); - if (lock_env_var && !strcmp(lock_env_var, "BEST_EFFORT")) - ignore_disabled_file_locks_s = true; /* Override: Ignore disabled locks */ - else if (lock_env_var && (!strcmp(lock_env_var, "TRUE") || !strcmp(lock_env_var, "1"))) - ignore_disabled_file_locks_s = false; /* Override: Don't ignore disabled locks */ - else - ignore_disabled_file_locks_s = FAIL; /* Environment variable not set, or not set correctly */ + FUNC_ENTER_PACKAGE - if (H5I_VFL != H5I_get_type(H5FD_LOG_g)) - H5FD_LOG_g = H5FD_register(&H5FD_log_g, sizeof(H5FD_class_t), false); - - /* Set return value */ - ret_value = H5FD_LOG_g; + if (H5I_VFL != H5I_get_type(H5FD_LOG_id_g)) + if ((H5FD_LOG_id_g = H5FD_register(&H5FD_log_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register log driver"); +done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_log_init() */ +} /* end H5FD__log_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__log_term + * Function: H5FD__log_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__log_term(void) +herr_t +H5FD__log_unregister(void) { FUNC_ENTER_PACKAGE_NOERR /* Reset VFL ID */ - H5FD_LOG_g = 0; + H5FD_LOG_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__log_term() */ +} /* end H5FD__log_unregister() */ /*------------------------------------------------------------------------- * Function: H5Pset_fapl_log @@ -467,7 +429,7 @@ H5FD__log_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); /* Initialize timers */ @@ -599,9 +561,9 @@ H5FD__log_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) } /* Check the file locking flags in the fapl */ - if (ignore_disabled_file_locks_s != FAIL) + if (H5FD_ignore_disabled_file_locks_p != FAIL) /* The environment variable was set, so use that preferentially */ - file->ignore_disabled_file_locks = ignore_disabled_file_locks_s; + file->ignore_disabled_file_locks = H5FD_ignore_disabled_file_locks_p; else { /* Use the value in the property list */ if (H5P_get(plist, H5F_ACS_IGNORE_DISABLED_FILE_LOCKS_NAME, &file->ignore_disabled_file_locks) < 0) @@ -1137,7 +1099,7 @@ H5FD__log_read(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, had /* Check for overflow conditions */ if (!H5_addr_defined(addr)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu", (unsigned long long)addr); /* Log the I/O information about the read */ @@ -1361,7 +1323,7 @@ H5FD__log_write(H5FD_t *_file, H5FD_mem_t type, hid_t H5_ATTR_UNUSED dxpl_id, ha /* Check for overflow conditions */ if (!H5_addr_defined(addr)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size = %llu", (unsigned long long)addr, (unsigned long long)size); diff --git a/src/H5FDlog.h b/src/H5FDlog.h index ca431bdc691..871845cf189 100644 --- a/src/H5FDlog.h +++ b/src/H5FDlog.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,7 +17,11 @@ #define H5FDlog_H /** Initializer for the log VFD */ -#define H5FD_LOG (H5FDperform_init(H5FD_log_init)) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + +/** ID for the log VFD */ +#define H5FD_LOG (H5OPEN H5FD_LOG_id_g) /** Identifier for the log VFD */ #define H5FD_LOG_VALUE H5_VFD_LOG @@ -67,9 +71,9 @@ extern "C" { /** @private * - * \brief Private initializer for the log VFD + * \brief ID for the log VFD */ -H5_DLL hid_t H5FD_log_init(void); +H5_DLLVAR hid_t H5FD_LOG_id_g; /** * \ingroup FAPL diff --git a/src/H5FDmirror.c b/src/H5FDmirror.c index bde3647f652..d566eafe080 100644 --- a/src/H5FDmirror.c +++ b/src/H5FDmirror.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -15,24 +15,24 @@ * a remote host. */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + #include "H5private.h" /* Generic Functions */ #ifdef H5_HAVE_MIRROR_VFD -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ - #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FDmirror.h" /* "Mirror" definitions */ #include "H5FDmirror_priv.h" /* Private header for the mirror VFD */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_MIRROR_g = 0; +hid_t H5FD_MIRROR_id_g = H5I_INVALID_HID; /* Virtual file structure for a Mirror Driver */ typedef struct H5FD_mirror_t { @@ -45,24 +45,6 @@ typedef struct H5FD_mirror_t { uint32_t xmit_i; /* Counter of transmission sent and rec'd */ } H5FD_mirror_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. - * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) - #ifndef BSWAP_64 #define BSWAP_64(X) \ (uint64_t)((((X) & 0x00000000000000FF) << 56) | (((X) & 0x000000000000FF00) << 40) | \ @@ -139,7 +121,6 @@ typedef struct H5FD_mirror_t { #endif /* MIRROR_DEBUG_OP_CALLS */ /* Prototypes */ -static herr_t H5FD__mirror_term(void); static void *H5FD__mirror_fapl_get(H5FD_t *_file); static void *H5FD__mirror_fapl_copy(const void *_old_fa); static herr_t H5FD__mirror_fapl_free(void *_fa); @@ -163,9 +144,9 @@ static const H5FD_class_t H5FD_mirror_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_MIRROR_VALUE, /* value */ "mirror", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__mirror_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -212,55 +193,52 @@ H5FL_DEFINE_STATIC(H5FD_mirror_t); H5FL_DEFINE_STATIC(H5FD_mirror_xmit_open_t); /* ------------------------------------------------------------------------- - * Function: H5FD_mirror_init + * Function: H5FD__mirror_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. + * + * Return: SUCCEED/FAIL * - * Return: Success: The driver ID for the mirror driver. - * Failure: Negative * ------------------------------------------------------------------------- */ -hid_t -H5FD_mirror_init(void) +herr_t +H5FD__mirror_register(void) { - hid_t ret_value = H5I_INVALID_HID; + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5I_INVALID_HID) + FUNC_ENTER_PACKAGE LOG_OP_CALL(__func__); - if (H5I_VFL != H5I_get_type(H5FD_MIRROR_g)) { - H5FD_MIRROR_g = H5FD_register(&H5FD_mirror_g, sizeof(H5FD_class_t), false); - if (H5I_INVALID_HID == H5FD_MIRROR_g) - HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register mirror"); - } - ret_value = H5FD_MIRROR_g; + if (H5I_VFL != H5I_get_type(H5FD_MIRROR_id_g)) + if ((H5FD_MIRROR_id_g = H5FD_register(&H5FD_mirror_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register mirror driver"); done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_mirror_init() */ +} /* end H5FD__mirror_register() */ /* --------------------------------------------------------------------------- - * Function: H5FD__mirror_term + * Function: H5FD__mirror_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) + * * --------------------------------------------------------------------------- */ -static herr_t -H5FD__mirror_term(void) +herr_t +H5FD__mirror_unregister(void) { FUNC_ENTER_PACKAGE_NOERR - /* Reset VFL ID */ - H5FD_MIRROR_g = 0; - LOG_OP_CALL(__func__); + /* Reset VFL ID */ + H5FD_MIRROR_id_g = H5I_INVALID_HID; + FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__mirror_term() */ +} /* end H5FD__mirror_unregister() */ /* --------------------------------------------------------------------------- * Function: H5FD__mirror_xmit_decode_uint16 @@ -1362,7 +1340,7 @@ H5FD__mirror_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxad HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "filename is too long"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); if (H5Pget_fapl_mirror(fapl_id, &fa) == FAIL) diff --git a/src/H5FDmirror.h b/src/H5FDmirror.h index 95ce936594d..3758dc083fa 100644 --- a/src/H5FDmirror.h +++ b/src/H5FDmirror.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,10 +17,13 @@ #ifndef H5FDmirror_H #define H5FDmirror_H +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + #ifdef H5_HAVE_MIRROR_VFD -/** Initializer for the mirror VFD */ -#define H5FD_MIRROR (H5FDperform_init(H5FD_mirror_init)) +/** ID for the mirror VFD */ +#define H5FD_MIRROR (H5OPEN H5FD_MIRROR_id_g) /** Identifier for the mirror VFD */ #define H5FD_MIRROR_VALUE H5_VFD_MIRROR @@ -75,9 +78,9 @@ extern "C" { /** @private * - * \brief Private initializer for the mirror VFD + * \brief ID for the mirror VFD */ -H5_DLL hid_t H5FD_mirror_init(void); +H5_DLLVAR hid_t H5FD_MIRROR_id_g; /** * \ingroup FAPL diff --git a/src/H5FDmirror_priv.h b/src/H5FDmirror_priv.h index 693d4ebb21e..72693d53180 100644 --- a/src/H5FDmirror_priv.h +++ b/src/H5FDmirror_priv.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDmodule.h b/src/H5FDmodule.h index 1e29ca912a6..d692b8fef0d 100644 --- a/src/H5FDmodule.h +++ b/src/H5FDmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5FD_MODULE -#define H5_MY_PKG H5FD -#define H5_MY_PKG_ERR H5E_VFL +#define H5_MY_PKG H5FD +#define H5_MY_PKG_ERR H5E_VFL +#define H5_MY_PKG_INIT YES #endif /* H5FDmodule_H */ diff --git a/src/H5FDmpi.c b/src/H5FDmpi.c index bfa21253af8..e5cbc2458c3 100644 --- a/src/H5FDmpi.c +++ b/src/H5FDmpi.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -14,13 +14,16 @@ * Purpose: Common routines for all MPI-based VFL drivers. */ -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDmpi.h" /* Common MPI file driver */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + +#include "H5private.h" /* Generic Functions */ #ifdef H5_HAVE_PARALLEL +#include "H5Eprivate.h" /* Error handling */ +#include "H5FDmpi.h" /* Common MPI file driver */ +#include "H5FDpkg.h" /* File drivers */ + /*------------------------------------------------------------------------- * Function: H5FD_mpi_get_rank * @@ -36,10 +39,10 @@ int H5FD_mpi_get_rank(H5FD_t *file) { const H5FD_class_t *cls; - uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; - int rank = -1; - void *rank_ptr = (void *)(&rank); - int ret_value; + uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; + int rank = -1; + void *rank_ptr = (void *)(&rank); + int ret_value = -1; FUNC_ENTER_NOAPI(FAIL) @@ -75,10 +78,10 @@ int H5FD_mpi_get_size(H5FD_t *file) { const H5FD_class_t *cls; - uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; - int size = 0; - void *size_ptr = (void *)(&size); - int ret_value; + uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; + int size = 0; + void *size_ptr = (void *)(&size); + int ret_value = 0; FUNC_ENTER_NOAPI(FAIL) @@ -114,10 +117,10 @@ MPI_Comm H5FD_mpi_get_comm(H5FD_t *file) { const H5FD_class_t *cls; - uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; - MPI_Comm comm = MPI_COMM_NULL; - void *comm_ptr = (void *)(&comm); - MPI_Comm ret_value; + uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; + MPI_Comm comm = MPI_COMM_NULL; + void *comm_ptr = (void *)(&comm); + MPI_Comm ret_value = MPI_COMM_NULL; FUNC_ENTER_NOAPI(MPI_COMM_NULL) @@ -153,10 +156,10 @@ MPI_Info H5FD_mpi_get_info(H5FD_t *file) { const H5FD_class_t *cls; - uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; - MPI_Info info = MPI_INFO_NULL; - void *info_ptr = (void *)(&info); - MPI_Info ret_value; + uint64_t flags = H5FD_CTL_FAIL_IF_UNKNOWN_FLAG | H5FD_CTL_ROUTE_TO_TERMINAL_VFD_FLAG; + MPI_Info info = MPI_INFO_NULL; + void *info_ptr = (void *)(&info); + MPI_Info ret_value = MPI_INFO_NULL; FUNC_ENTER_NOAPI(MPI_INFO_NULL) diff --git a/src/H5FDmpi.h b/src/H5FDmpi.h index 9cee0e69b74..c168ae89b7d 100644 --- a/src/H5FDmpi.h +++ b/src/H5FDmpi.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDmpio.c b/src/H5FDmpio.c index 0819bd68f7e..cce5d2ee1ff 100644 --- a/src/H5FDmpio.c +++ b/src/H5FDmpio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -14,34 +14,40 @@ * Purpose: This is the MPI I/O driver. */ -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + +#include "H5private.h" /* Generic Functions */ + +#ifdef H5_HAVE_PARALLEL -#include "H5private.h" /* Generic Functions */ #include "H5CXprivate.h" /* API Contexts */ #include "H5Dprivate.h" /* Dataset functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ #include "H5FDmpi.h" /* MPI-based file drivers */ +#include "H5FDpkg.h" /* File drivers */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ -#ifdef H5_HAVE_PARALLEL - /* * The driver identification number, initialized at runtime if H5_HAVE_PARALLEL * is defined. This allows applications to still have the H5FD_MPIO * "constants" in their source code. */ -static hid_t H5FD_MPIO_g = 0; +hid_t H5FD_MPIO_id_g = H5I_INVALID_HID; + +/* Flag to indicate whether global driver resources & settings have been + * initialized. + */ +static bool H5FD_mpio_init_s = false; /* Whether to allow collective I/O operations */ /* (Can be changed by setting "HDF5_MPI_OPT_TYPES" environment variable to '0' or '1') */ bool H5FD_mpi_opt_types_g = true; /* Whether the driver initialized MPI on its own */ -static bool H5FD_mpi_self_initialized = false; +static bool H5FD_mpi_self_initialized_s = false; /* * The view is set to this value @@ -256,79 +262,110 @@ H5FD__mem_t_to_str(H5FD_mem_t mem_type) #endif /* H5FDmpio_DEBUG */ /*------------------------------------------------------------------------- - * Function: H5FD_mpio_init + * Function: H5FD__mpio_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. * - * Return: Success: The driver ID for the mpio driver - * Failure: H5I_INVALID_HID + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ -hid_t -H5FD_mpio_init(void) +herr_t +H5FD__mpio_register(void) { - static int H5FD_mpio_Debug_inited = 0; - char *env = NULL; - hid_t ret_value = H5I_INVALID_HID; /* Return value */ + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(H5I_INVALID_HID) + FUNC_ENTER_PACKAGE /* Register the MPI-IO VFD, if it isn't already */ - if (H5I_VFL != H5I_get_type(H5FD_MPIO_g)) { - H5FD_MPIO_g = H5FD_register((const H5FD_class_t *)&H5FD_mpio_g, sizeof(H5FD_class_t), false); - - /* Check if MPI driver has been loaded dynamically */ - env = getenv(HDF5_DRIVER); - if (env && !strcmp(env, "mpio")) { - int mpi_initialized = 0; - - /* Initialize MPI if not already initialized */ - if (MPI_SUCCESS != MPI_Initialized(&mpi_initialized)) - HGOTO_ERROR(H5E_VFL, H5E_UNINITIALIZED, H5I_INVALID_HID, "can't check if MPI is initialized"); - if (!mpi_initialized) { - if (MPI_SUCCESS != MPI_Init(NULL, NULL)) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, H5I_INVALID_HID, "can't initialize MPI"); - H5FD_mpi_self_initialized = true; - } + if (H5I_VFL != H5I_get_type(H5FD_MPIO_id_g)) + if ((H5FD_MPIO_id_g = H5FD_register(&H5FD_mpio_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register mpio driver"); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD__mpio_register() */ + +/*--------------------------------------------------------------------------- + * Function: H5FD__mpio_unregister + * + * Purpose: Reset library driver info. + * + * Returns: SUCCEED (Can't fail) + * + *--------------------------------------------------------------------------- + */ +herr_t +H5FD__mpio_unregister(void) +{ + FUNC_ENTER_PACKAGE_NOERR + + /* Reset VFL ID */ + H5FD_MPIO_id_g = H5I_INVALID_HID; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5FD__mpio_unregister() */ + +/*------------------------------------------------------------------------- + * Function: H5FD__mpio_init + * + * Purpose: Singleton to initialize global driver settings & resources. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +static herr_t +H5FD__mpio_init(void) +{ + char *env = NULL; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + + /* Check if MPI driver has been loaded dynamically */ + env = getenv(HDF5_DRIVER); + if (env && !strcmp(env, "mpio")) { + int mpi_initialized = 0; + + /* Initialize MPI if not already initialized */ + if (MPI_SUCCESS != MPI_Initialized(&mpi_initialized)) + HGOTO_ERROR(H5E_VFL, H5E_UNINITIALIZED, FAIL, "can't check if MPI is initialized"); + if (!mpi_initialized) { + if (MPI_SUCCESS != MPI_Init(NULL, NULL)) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize MPI"); + H5FD_mpi_self_initialized_s = true; } } - if (!H5FD_mpio_Debug_inited) { - const char *s; /* String for environment variables */ - - /* Allow MPI buf-and-file-type optimizations? */ - s = getenv("HDF5_MPI_OPT_TYPES"); - if (s && isdigit(*s)) - H5FD_mpi_opt_types_g = (0 == strtol(s, NULL, 0)) ? false : true; + /* Allow MPI buf-and-file-type optimizations? */ + env = getenv("HDF5_MPI_OPT_TYPES"); + if (env && isdigit(*env)) + H5FD_mpi_opt_types_g = (0 == strtol(env, NULL, 0)) ? false : true; #ifdef H5FDmpio_DEBUG - /* Clear the flag buffer */ - memset(H5FD_mpio_debug_flags_s, 0, sizeof(H5FD_mpio_debug_flags_s)); + /* Clear the flag buffer */ + memset(H5FD_mpio_debug_flags_s, 0, sizeof(H5FD_mpio_debug_flags_s)); - /* Retrieve MPI-IO debugging environment variable */ - s = getenv("H5FD_mpio_Debug"); - if (s) - H5FD__mpio_parse_debug_str(s); + /* Retrieve MPI-IO debugging environment variable */ + env = getenv("H5FD_mpio_Debug"); + if (env) + H5FD__mpio_parse_debug_str(env); #endif /* H5FDmpio_DEBUG */ - H5FD_mpio_Debug_inited++; - } /* end if */ - - /* Set return value */ - ret_value = H5FD_MPIO_g; + /* Indicate that driver is set up */ + H5FD_mpio_init_s = true; done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_mpio_init() */ +} /* end H5FD__mpio_init() */ /*--------------------------------------------------------------------------- * Function: H5FD__mpio_term * * Purpose: Shut down the VFD * - * Returns: Non-negative on success or negative on failure + * Returns: SUCCEED (Can't fail) * *--------------------------------------------------------------------------- */ @@ -338,19 +375,16 @@ H5FD__mpio_term(void) FUNC_ENTER_PACKAGE_NOERR /* Terminate MPI if the driver initialized it */ - if (H5FD_mpi_self_initialized) { + if (H5FD_mpi_self_initialized_s) { int mpi_finalized = 0; MPI_Finalized(&mpi_finalized); if (!mpi_finalized) MPI_Finalize(); - H5FD_mpi_self_initialized = false; + H5FD_mpi_self_initialized_s = false; } - /* Reset VFL ID */ - H5FD_MPIO_g = 0; - FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5FD__mpio_term() */ @@ -398,6 +432,11 @@ H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info) if (MPI_COMM_NULL == comm) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "MPI_COMM_NULL is not a valid communicator"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Set the MPI communicator and info object */ if (H5P_set(plist, H5F_ACS_MPI_PARAMS_COMM_NAME, &comm) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "can't set MPI communicator"); @@ -451,6 +490,11 @@ H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm /*out*/, MPI_Info *info /*out*/) if (H5FD_MPIO != H5P_peek_driver(plist)) HGOTO_ERROR(H5E_PLIST, H5E_BADVALUE, FAIL, "VFL driver is not MPI-I/O"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Get the MPI communicator and info object */ if (comm) if (H5P_get(plist, H5F_ACS_MPI_PARAMS_COMM_NAME, comm) < 0) @@ -510,6 +554,11 @@ H5Pset_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t xfer_mode) if (H5FD_MPIO_INDEPENDENT != xfer_mode && H5FD_MPIO_COLLECTIVE != xfer_mode) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "incorrect xfer_mode"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Set the transfer mode */ if (H5P_set(plist, H5D_XFER_IO_XFER_MODE_NAME, &xfer_mode) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value"); @@ -543,6 +592,11 @@ H5Pget_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t *xfer_mode /*out*/) if (NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER))) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Get the transfer mode */ if (xfer_mode) if (H5P_get(plist, H5D_XFER_IO_XFER_MODE_NAME, xfer_mode) < 0) @@ -582,6 +636,11 @@ H5Pset_dxpl_mpio_collective_opt(hid_t dxpl_id, H5FD_mpio_collective_opt_t opt_mo if (NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER))) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Set the transfer mode */ if (H5P_set(plist, H5D_XFER_MPIO_COLLECTIVE_OPT_NAME, &opt_mode) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value"); @@ -620,6 +679,11 @@ H5Pset_dxpl_mpio_chunk_opt(hid_t dxpl_id, H5FD_mpio_chunk_opt_t opt_mode) if (NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER))) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Set the transfer mode */ if (H5P_set(plist, H5D_XFER_MPIO_CHUNK_OPT_HARD_NAME, &opt_mode) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value"); @@ -656,6 +720,11 @@ H5Pset_dxpl_mpio_chunk_opt_num(hid_t dxpl_id, unsigned num_chunk_per_proc) if (NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER))) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Set the transfer mode */ if (H5P_set(plist, H5D_XFER_MPIO_CHUNK_OPT_NUM_NAME, &num_chunk_per_proc) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value"); @@ -695,6 +764,11 @@ H5Pset_dxpl_mpio_chunk_opt_ratio(hid_t dxpl_id, unsigned percent_num_proc_per_ch if (NULL == (plist = H5P_object_verify(dxpl_id, H5P_DATASET_XFER))) HGOTO_ERROR(H5E_PLIST, H5E_BADTYPE, FAIL, "not a dxpl"); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + /* Set the transfer mode */ if (H5P_set(plist, H5D_XFER_MPIO_CHUNK_OPT_RATIO_NAME, &percent_num_proc_per_chunk) < 0) HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set value"); @@ -824,11 +898,16 @@ H5FD__mpio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t H5_ATTR FUNC_ENTER_PACKAGE + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "can't initialize driver"); + /* Get a pointer to the fapl */ if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list"); - if (H5FD_mpi_self_initialized) { + if (H5FD_mpi_self_initialized_s) { comm = MPI_COMM_WORLD; } else { @@ -3738,11 +3817,16 @@ H5FD__mpio_delete(const char *filename, hid_t fapl_id) assert(filename); + /* Initialize driver, if it's not yet */ + if (!H5FD_mpio_init_s) + if (H5FD__mpio_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); assert(H5FD_MPIO == H5P_peek_driver(plist)); - if (H5FD_mpi_self_initialized) { + if (H5FD_mpi_self_initialized_s) { comm = MPI_COMM_WORLD; } else { @@ -3820,7 +3904,7 @@ H5FD__mpio_ctl(H5FD_t *_file, uint64_t op_code, uint64_t flags, const void H5_AT H5FD_mpio_t *file = (H5FD_mpio_t *)_file; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity checks */ assert(file); diff --git a/src/H5FDmpio.h b/src/H5FDmpio.h index 5e7ecf30353..1ae96ab517c 100644 --- a/src/H5FDmpio.h +++ b/src/H5FDmpio.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,10 +16,13 @@ #ifndef H5FDmpio_H #define H5FDmpio_H +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + #ifdef H5_HAVE_PARALLEL -/** Initializer for the mpio VFD */ -#define H5FD_MPIO (H5FDperform_init(H5FD_mpio_init)) +/** ID for the mpio VFD */ +#define H5FD_MPIO (H5OPEN H5FD_MPIO_id_g) #else @@ -35,19 +38,19 @@ #define H5FDmpio_DEBUG #endif -/* Global var whose value comes from environment variable */ -/* (Defined in H5FDmpio.c) */ -H5_DLLVAR hbool_t H5FD_mpi_opt_types_g; - #ifdef __cplusplus extern "C" { #endif +/* Global var whose value comes from environment variable */ +/* (Defined in H5FDmpio.c) */ +H5_DLLVAR hbool_t H5FD_mpi_opt_types_g; + /** @private * - * \brief Private initializer for the mpio VFD + * \brief ID for the mpio VFD */ -H5_DLL hid_t H5FD_mpio_init(void); +H5_DLLVAR hid_t H5FD_MPIO_id_g; /** * \ingroup FAPL diff --git a/src/H5FDmulti.c b/src/H5FDmulti.c index 2838ed00bff..72d7fd4c455 100644 --- a/src/H5FDmulti.c +++ b/src/H5FDmulti.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -24,6 +24,8 @@ #include "hdf5.h" +#include "H5warnings.h" + #ifndef false #define false 0 #endif @@ -40,34 +42,6 @@ #define my_strdup strdup #endif -/* Macros for enabling/disabling particular GCC / clang warnings - * - * These are duplicated in H5private.h. If you make changes here, be sure to - * update those as well. - * - * (see the following web-sites for more info: - * http://www.dbp-consulting.com/tutorials/SuppressingGCCWarnings.html - * http://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html#Diagnostic-Pragmas - */ -#define H5_MULTI_DIAG_JOINSTR(x, y) x y -#define H5_MULTI_DIAG_DO_PRAGMA(x) _Pragma(#x) -#define H5_MULTI_DIAG_PRAGMA(x) H5_MULTI_DIAG_DO_PRAGMA(GCC diagnostic x) - -#define H5_MULTI_DIAG_OFF(x) \ - H5_MULTI_DIAG_PRAGMA(push) H5_MULTI_DIAG_PRAGMA(ignored H5_MULTI_DIAG_JOINSTR("-W", x)) -#define H5_MULTI_DIAG_ON(x) H5_MULTI_DIAG_PRAGMA(pop) - -/* Macros for enabling/disabling particular GCC / clang warnings. - * These macros should be used for warnings supported by both gcc and clang. - */ -#if (((__GNUC__ * 100) + __GNUC_MINOR__) >= 406) || defined(__clang__) -#define H5_MULTI_GCC_CLANG_DIAG_OFF(x) H5_MULTI_DIAG_OFF(x) -#define H5_MULTI_GCC_CLANG_DIAG_ON(x) H5_MULTI_DIAG_ON(x) -#else -#define H5_MULTI_GCC_CLANG_DIAG_OFF(x) -#define H5_MULTI_GCC_CLANG_DIAG_ON(x) -#endif - /* Loop through all mapped files */ #define UNIQUE_MEMBERS_CORE(MAP, ITER, SEEN, LOOPVAR) \ { \ @@ -98,9 +72,6 @@ #define H5FD_MULT_MAX_FILE_NAME_LEN 1024 -/* The driver identification number, initialized at runtime */ -static hid_t H5FD_MULTI_g = 0; - /* Driver-specific file access properties */ typedef struct H5FD_multi_fapl_t { H5FD_mem_t memb_map[H5FD_MEM_NTYPES]; /*memory usage map */ @@ -145,7 +116,6 @@ static int compute_next(H5FD_multi_t *file); static int open_members(H5FD_multi_t *file); /* Callback prototypes */ -static herr_t H5FD_multi_term(void); static hsize_t H5FD_multi_sb_size(H5FD_t *file); static herr_t H5FD_multi_sb_encode(H5FD_t *file, char *name /*out*/, unsigned char *buf /*out*/); static herr_t H5FD_multi_sb_decode(H5FD_t *file, const char *name, const unsigned char *buf); @@ -176,13 +146,13 @@ static herr_t H5FD_multi_ctl(H5FD_t *_file, uint64_t op_code, uint64_t flags, c void **output); /* The class struct */ -static const H5FD_class_t H5FD_multi_g = { +const H5FD_class_t H5FD_multi_g = { H5FD_CLASS_VERSION, /* struct version */ H5_VFD_MULTI, /* value */ "multi", /* name */ HADDR_MAX, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD_multi_term, /* terminate */ + NULL, /* terminate */ H5FD_multi_sb_size, /* sb_size */ H5FD_multi_sb_encode, /* sb_encode */ H5FD_multi_sb_decode, /* sb_decode */ @@ -219,47 +189,6 @@ static const H5FD_class_t H5FD_multi_g = { H5FD_FLMAP_DEFAULT /* fl_map */ }; -/*------------------------------------------------------------------------- - * Function: H5FD_multi_init - * - * Purpose: Initialize this driver by registering the driver with the - * library. - * - * Return: Success: The driver ID for the multi driver - * Failure: H5I_INVALID_HID - * - *------------------------------------------------------------------------- - */ -hid_t -H5FD_multi_init(void) -{ - /* Clear the error stack */ - H5Eclear2(H5E_DEFAULT); - - if (H5I_VFL != H5Iget_type(H5FD_MULTI_g)) - H5FD_MULTI_g = H5FDregister(&H5FD_multi_g); - - return H5FD_MULTI_g; -} /* end H5FD_multi_init() */ - -/*--------------------------------------------------------------------------- - * Function: H5FD_multi_term - * - * Purpose: Shut down the VFD - * - * Returns: Non-negative on success or negative on failure - * - *--------------------------------------------------------------------------- - */ -static herr_t -H5FD_multi_term(void) -{ - /* Reset VFL ID */ - H5FD_MULTI_g = 0; - - return 0; -} /* end H5FD_multi_term() */ - /*------------------------------------------------------------------------- * Function: H5Pset_fapl_split * @@ -277,15 +206,14 @@ herr_t H5Pset_fapl_split(hid_t fapl, const char *meta_ext, hid_t meta_plist_id, const char *raw_ext, hid_t raw_plist_id) { - H5FD_multi_fapl_t fa; - static const char *func = "H5Pset_fapl_split"; /* Function Name for error reporting */ + H5FD_multi_fapl_t fa; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); if (H5FD_split_populate_config(meta_ext, meta_plist_id, raw_ext, raw_plist_id, true, &fa) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "can't setup split driver configuration", - -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, + "can't setup split driver configuration", -1); return H5Pset_driver(fapl, H5FD_MULTI, &fa); } @@ -367,17 +295,16 @@ herr_t H5Pset_fapl_multi(hid_t fapl_id, const H5FD_mem_t *memb_map, const hid_t *memb_fapl, const char *const *memb_name, const haddr_t *memb_addr, hbool_t relax) { - H5FD_multi_fapl_t fa; - static const char *func = "H5FDset_fapl_multi"; /* Function Name for error reporting */ + H5FD_multi_fapl_t fa; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); /* Check arguments and supply default values */ if (H5I_GENPROP_LST != H5Iget_type(fapl_id) || true != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "not an access list", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "not an access list", -1); if (H5FD_multi_populate_config(memb_map, memb_fapl, memb_name, memb_addr, relax, &fa) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "can't setup driver configuration", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "can't setup driver configuration", -1); return H5Pset_driver(fapl_id, H5FD_MULTI, &fa); } @@ -402,15 +329,14 @@ H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map /*out*/, hid_t *memb_fapl const H5FD_multi_fapl_t *fa; H5FD_multi_fapl_t default_fa; H5FD_mem_t mt; - static const char *func = "H5FDget_fapl_multi"; /* Function Name for error reporting */ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); if (H5I_GENPROP_LST != H5Iget_type(fapl_id) || true != H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADTYPE, "not an access list", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_PLIST, H5E_BADTYPE, "not an access list", -1); if (H5FD_MULTI != H5Pget_driver(fapl_id)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "incorrect VFL driver", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_PLIST, H5E_BADVALUE, "incorrect VFL driver", -1); H5E_BEGIN_TRY { fa = (const H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id); @@ -418,8 +344,8 @@ H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map /*out*/, hid_t *memb_fapl H5E_END_TRY if (!fa || (H5P_FILE_ACCESS_DEFAULT == fapl_id)) { if (H5FD_multi_populate_config(NULL, NULL, NULL, NULL, true, &default_fa) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTSET, "can't setup default driver configuration", - -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTSET, + "can't setup default driver configuration", -1); fa = &default_fa; } @@ -464,7 +390,6 @@ static herr_t H5FD_split_populate_config(const char *meta_ext, hid_t meta_plist_id, const char *raw_ext, hid_t raw_plist_id, bool relax, H5FD_multi_fapl_t *fa_out) { - static const char *func = "H5FD_split_populate_config"; /* Function Name for error reporting */ static char meta_name_g[H5FD_MULT_MAX_FILE_NAME_LEN]; /* Static scratch buffer to store metadata member name */ static char @@ -536,18 +461,20 @@ H5FD_split_populate_config(const char *meta_ext, hid_t meta_plist_id, const char /* Map usage type */ H5FD_mem_t mmt = _memb_map[mt]; if (mmt < 0 || mmt >= H5FD_MEM_NTYPES) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADRANGE, "file resource type out of range", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADRANGE, "file resource type out of range", + -1); /* * All members of MEMB_FAPL must be either defaults or actual file * access property lists. */ if (H5P_DEFAULT != _memb_fapl[mmt] && true != H5Pisa_class(_memb_fapl[mmt], H5P_FILE_ACCESS)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type incorrect", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type incorrect", + -1); /* All names must be defined */ if (!_memb_name[mmt] || !_memb_name[mmt][0]) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type not set", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type not set", -1); } END_MEMBERS @@ -567,7 +494,7 @@ H5FD_split_populate_config(const char *meta_ext, hid_t meta_plist_id, const char if (fa_out->memb_fapl[mt] == H5P_DEFAULT) { fa_out->memb_fapl[mt] = H5Pcreate(H5P_FILE_ACCESS); if (H5Pset_fapl_sec2(fa_out->memb_fapl[mt]) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "can't set sec2 driver on member FAPL", -1); } } @@ -590,7 +517,6 @@ static herr_t H5FD_multi_populate_config(const H5FD_mem_t *memb_map, const hid_t *memb_fapl, const char *const *memb_name, const haddr_t *memb_addr, bool relax, H5FD_multi_fapl_t *fa_out) { - static const char *func = "H5FD_multi_populate_config"; /* Function Name for error reporting */ static const char *letters = "Xsbrglo"; static char _memb_name_g[H5FD_MEM_NTYPES][16]; /* Static scratch buffer to store member names */ H5FD_mem_t mt, mmt; @@ -611,7 +537,7 @@ H5FD_multi_populate_config(const H5FD_mem_t *memb_map, const hid_t *memb_fapl, c for (mt = H5FD_MEM_DEFAULT; mt < H5FD_MEM_NTYPES; mt = (H5FD_mem_t)(mt + 1)) { _memb_fapl[mt] = H5Pcreate(H5P_FILE_ACCESS); if (H5Pset_fapl_sec2(_memb_fapl[mt]) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "can't set sec2 driver on member FAPL", -1); } memb_fapl = _memb_fapl; @@ -634,7 +560,8 @@ H5FD_multi_populate_config(const H5FD_mem_t *memb_map, const hid_t *memb_fapl, c /* Map usage type */ mmt = memb_map[mt]; if (mmt < 0 || mmt >= H5FD_MEM_NTYPES) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADRANGE, "file resource type out of range", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADRANGE, "file resource type out of range", + -1); if (H5FD_MEM_DEFAULT == mmt) mmt = mt; @@ -643,11 +570,12 @@ H5FD_multi_populate_config(const H5FD_mem_t *memb_map, const hid_t *memb_fapl, c * access property lists. */ if (H5P_DEFAULT != memb_fapl[mmt] && true != H5Pisa_class(memb_fapl[mmt], H5P_FILE_ACCESS)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type incorrect", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type incorrect", + -1); /* All names must be defined */ if (!memb_name[mmt] || !memb_name[mmt][0]) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type not set", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "file resource type not set", -1); } /* @@ -666,7 +594,7 @@ H5FD_multi_populate_config(const H5FD_mem_t *memb_map, const hid_t *memb_fapl, c if (fa_out->memb_fapl[mt] == H5P_DEFAULT) { fa_out->memb_fapl[mt] = H5Pcreate(H5P_FILE_ACCESS); if (H5Pset_fapl_sec2(fa_out->memb_fapl[mt]) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "can't set sec2 driver on member FAPL", -1); } } @@ -738,13 +666,12 @@ H5FD_multi_sb_size(H5FD_t *_file) static herr_t H5FD_multi_sb_encode(H5FD_t *_file, char *name /*out*/, unsigned char *buf /*out*/) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - haddr_t memb_eoa; - unsigned char *p; - size_t nseen; - size_t i; - H5FD_mem_t m; - static const char *func = "H5FD_multi_sb_encode"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + haddr_t memb_eoa; + unsigned char *p; + size_t nseen; + size_t i; + H5FD_mem_t m; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -780,7 +707,8 @@ H5FD_multi_sb_encode(H5FD_t *_file, char *name /*out*/, unsigned char *buf /*out } END_MEMBERS if (H5Tconvert(H5T_NATIVE_HADDR, H5T_STD_U64LE, nseen * 2, buf + 8, NULL, H5P_DEFAULT) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_DATATYPE, H5E_CANTCONVERT, "can't convert superblock info", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_DATATYPE, H5E_CANTCONVERT, "can't convert superblock info", + -1); /* Encode all name templates */ p = buf + 8 + nseen * 2 * 8; @@ -816,25 +744,24 @@ H5FD_multi_sb_encode(H5FD_t *_file, char *name /*out*/, unsigned char *buf /*out static herr_t H5FD_multi_sb_decode(H5FD_t *_file, const char *name, const unsigned char *buf) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - char x[2 * H5FD_MEM_NTYPES * 8]; - H5FD_mem_t map[H5FD_MEM_NTYPES]; - int i; - size_t nseen = 0; - bool map_changed = false; - bool in_use[H5FD_MEM_NTYPES]; - const char *memb_name[H5FD_MEM_NTYPES]; - haddr_t memb_addr[H5FD_MEM_NTYPES]; - haddr_t memb_eoa[H5FD_MEM_NTYPES]; - haddr_t *ap; - static const char *func = "H5FD_multi_sb_decode"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + char x[2 * H5FD_MEM_NTYPES * 8]; + H5FD_mem_t map[H5FD_MEM_NTYPES]; + int i; + size_t nseen = 0; + bool map_changed = false; + bool in_use[H5FD_MEM_NTYPES]; + const char *memb_name[H5FD_MEM_NTYPES]; + haddr_t memb_addr[H5FD_MEM_NTYPES]; + haddr_t memb_eoa[H5FD_MEM_NTYPES]; + haddr_t *ap; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); /* Make sure the name/version number is correct */ if (strcmp(name, "NCSAmult") != 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "invalid multi superblock", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "invalid multi superblock", -1); /* Set default values */ ALL_MEMBERS (mt) { @@ -866,7 +793,8 @@ H5FD_multi_sb_decode(H5FD_t *_file, const char *name, const unsigned char *buf) memcpy(x, buf, (nseen * 2 * 8)); buf += nseen * 2 * 8; if (H5Tconvert(H5T_STD_U64LE, H5T_NATIVE_HADDR, nseen * 2, x, NULL, H5P_DEFAULT) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_DATATYPE, H5E_CANTCONVERT, "can't convert superblock info", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_DATATYPE, H5E_CANTCONVERT, "can't convert superblock info", + -1); ap = (haddr_t *)((void *)x); /* Extra (void *) cast to quiet "cast to create alignment" warning - 2019/07/05, QAK */ UNIQUE_MEMBERS (map, mt) { @@ -923,17 +851,17 @@ H5FD_multi_sb_decode(H5FD_t *_file, const char *name, const unsigned char *buf) } END_MEMBERS if (compute_next(file) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "compute_next() failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "compute_next() failed", -1); /* Open all necessary files */ if (open_members(file) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "open_members() failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "open_members() failed", -1); /* Set the EOA marker for all open files */ UNIQUE_MEMBERS (file->fa.memb_map, mt) { if (file->memb[mt]) if (H5FDset_eoa(file->memb[mt], mt, memb_eoa[mt]) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "set_eoa() failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_CANTSET, "set_eoa() failed", -1); /* Save the individual EOAs in one place for later comparison (in H5FD_multi_set_eoa) */ @@ -986,7 +914,6 @@ H5FD_multi_fapl_copy(const void *_old_fa) const H5FD_multi_fapl_t *old_fa = (const H5FD_multi_fapl_t *)_old_fa; H5FD_multi_fapl_t *new_fa = (H5FD_multi_fapl_t *)calloc(1, sizeof(H5FD_multi_fapl_t)); int nerrors = 0; - static const char *func = "H5FD_multi_fapl_copy"; /* Function Name for error reporting */ assert(new_fa); @@ -1021,7 +948,7 @@ H5FD_multi_fapl_copy(const void *_old_fa) } END_MEMBERS free(new_fa); - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "can't release object on error", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "can't release object on error", NULL); } return new_fa; } @@ -1040,8 +967,7 @@ H5FD_multi_fapl_copy(const void *_old_fa) static herr_t H5FD_multi_fapl_free(void *_fa) { - H5FD_multi_fapl_t *fa = (H5FD_multi_fapl_t *)_fa; - static const char *func = "H5FD_multi_fapl_free"; /* Function Name for error reporting */ + H5FD_multi_fapl_t *fa = (H5FD_multi_fapl_t *)_fa; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1049,7 +975,8 @@ H5FD_multi_fapl_free(void *_fa) ALL_MEMBERS (mt) { if (fa->memb_fapl[mt] >= 0) if (H5Idec_ref(fa->memb_fapl[mt]) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTCLOSEOBJ, "can't close property list", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTCLOSEOBJ, "can't close property list", + -1); if (fa->memb_name[mt]) free(fa->memb_name[mt]); } @@ -1079,16 +1006,15 @@ H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr hid_t close_fapl = -1; const H5FD_multi_fapl_t *fa; H5FD_mem_t m; - static const char *func = "H5FD_multi_open"; /* Function Name for error reporting */ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); /* Check arguments */ if (!name || !*name) - H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADVALUE, "invalid file name", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_ARGS, H5E_BADVALUE, "invalid file name", NULL); if (0 == maxaddr || HADDR_UNDEF == maxaddr) - H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADRANGE, "bogus maxaddr", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_ARGS, H5E_BADRANGE, "bogus maxaddr", NULL); /* * Initialize the file from the file access properties, using default @@ -1097,7 +1023,7 @@ H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr * in H5FD_multi_t. */ if (NULL == (file = (H5FD_multi_t *)calloc((size_t)1, sizeof(H5FD_multi_t)))) - H5Epush_ret(func, H5E_ERR_CLS, H5E_RESOURCE, H5E_NOSPACE, "memory allocation failed", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_RESOURCE, H5E_NOSPACE, "memory allocation failed", NULL); H5E_BEGIN_TRY { fa = (const H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id); @@ -1109,11 +1035,11 @@ H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr close_fapl = fapl_id = H5Pcreate(H5P_FILE_ACCESS); if (env && !strcmp(env, "split")) { if (H5Pset_fapl_split(fapl_id, NULL, H5P_DEFAULT, NULL, H5P_DEFAULT) < 0) - H5Epush_goto(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTSET, "can't set property value", error); + H5Epush_goto(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTSET, "can't set property value", error); } else { if (H5Pset_fapl_multi(fapl_id, NULL, NULL, NULL, NULL, true) < 0) - H5Epush_goto(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTSET, "can't set property value", error); + H5Epush_goto(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTSET, "can't set property value", error); } fa = (const H5FD_multi_fapl_t *)H5Pget_driver_info(fapl_id); @@ -1136,13 +1062,14 @@ H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr file->name = my_strdup(name); if (close_fapl >= 0) if (H5Pclose(close_fapl) < 0) - H5Epush_goto(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTCLOSEOBJ, "can't close property list", error); + H5Epush_goto(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTCLOSEOBJ, "can't close property list", + error); /* Compute derived properties and open member files */ if (compute_next(file) < 0) - H5Epush_goto(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "compute_next() failed", error); + H5Epush_goto(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "compute_next() failed", error); if (open_members(file) < 0) - H5Epush_goto(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "open_members() failed", error); + H5Epush_goto(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "open_members() failed", error); /* We must have opened at least the superblock file */ if (H5FD_MEM_DEFAULT == (m = file->fa.memb_map[H5FD_MEM_SUPER])) @@ -1187,9 +1114,8 @@ H5FD_multi_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr static herr_t H5FD_multi_close(H5FD_t *_file) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - int nerrors = 0; - static const char *func = "H5FD_multi_close"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + int nerrors = 0; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1207,7 +1133,7 @@ H5FD_multi_close(H5FD_t *_file) } END_MEMBERS if (nerrors) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error closing member files", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error closing member files", -1); /* Clean up other stuff */ ALL_MEMBERS (mt) { @@ -1337,7 +1263,6 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type) { const H5FD_multi_t *file = (const H5FD_multi_t *)_file; haddr_t eoa = 0; - static const char *func = "H5FD_multi_get_eoa"; /* Function Name for error reporting */ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1361,8 +1286,8 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type) H5E_END_TRY if (HADDR_UNDEF == memb_eoa) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", - HADDR_UNDEF); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, + "member file has unknown eoa", HADDR_UNDEF); if (memb_eoa > 0) memb_eoa += file->fa.memb_addr[mt]; } @@ -1375,7 +1300,7 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type) assert(HADDR_UNDEF != memb_eoa); } else { - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF); } if (memb_eoa > eoa) @@ -1397,7 +1322,7 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type) H5E_END_TRY if (HADDR_UNDEF == eoa) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eoa", HADDR_UNDEF); if (eoa > 0) eoa += file->fa.memb_addr[mmt]; @@ -1411,7 +1336,7 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type) assert(HADDR_UNDEF != eoa); } else { - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eoa", HADDR_UNDEF); } } @@ -1435,10 +1360,9 @@ H5FD_multi_get_eoa(const H5FD_t *_file, H5FD_mem_t type) static herr_t H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - H5FD_mem_t mmt; - herr_t status; - static const char *func = "H5FD_multi_set_eoa"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + H5FD_mem_t mmt; + herr_t status; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1474,7 +1398,7 @@ H5FD_multi_set_eoa(H5FD_t *_file, H5FD_mem_t type, haddr_t eoa) } H5E_END_TRY if (status < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "member H5FDset_eoa failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_BADVALUE, "member H5FDset_eoa failed", -1); return 0; } /* end H5FD_multi_set_eoa() */ @@ -1498,7 +1422,6 @@ H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type) { const H5FD_multi_t *file = (const H5FD_multi_t *)_file; haddr_t eof = 0; - static const char *func = "H5FD_multi_get_eof"; /* Function Name for error reporting */ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1516,8 +1439,8 @@ H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type) H5E_END_TRY if (HADDR_UNDEF == tmp_eof) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", - HADDR_UNDEF); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, + "member file has unknown eof", HADDR_UNDEF); if (tmp_eof > 0) tmp_eof += file->fa.memb_addr[mt]; } @@ -1530,7 +1453,7 @@ H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type) assert(HADDR_UNDEF != tmp_eof); } else { - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF); } if (tmp_eof > eof) eof = tmp_eof; @@ -1552,7 +1475,7 @@ H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type) H5E_END_TRY if (HADDR_UNDEF == eof) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file has unknown eof", HADDR_UNDEF); if (eof > 0) eof += file->fa.memb_addr[mmt]; @@ -1566,7 +1489,7 @@ H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type) assert(HADDR_UNDEF != eof); } else { - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "bad eof", HADDR_UNDEF); } } return eof; @@ -1584,16 +1507,15 @@ H5FD_multi_get_eof(const H5FD_t *_file, H5FD_mem_t type) static herr_t H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void **file_handle) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - H5FD_mem_t type, mmt; - static const char *func = "H5FD_multi_get_handle"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + H5FD_mem_t type, mmt; /* Get data type for multi driver */ if (H5Pget_multi_type(fapl, &type) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "can't get data type for multi driver", + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "can't get data type for multi driver", -1); if (type < H5FD_MEM_DEFAULT || type >= H5FD_MEM_NTYPES) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "data type is out of range", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "data type is out of range", -1); mmt = file->fa.memb_map[type]; if (H5FD_MEM_DEFAULT == mmt) mmt = type; @@ -1615,10 +1537,9 @@ H5FD_multi_get_handle(H5FD_t *_file, hid_t fapl, void **file_handle) static haddr_t H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - H5FD_mem_t mmt; - haddr_t addr; - static const char *func = "H5FD_multi_alloc"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + H5FD_mem_t mmt; + haddr_t addr; mmt = file->fa.memb_map[type]; if (H5FD_MEM_DEFAULT == mmt) @@ -1634,23 +1555,10 @@ H5FD_multi_alloc(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size) } if (HADDR_UNDEF == (addr = H5FDalloc(file->memb[mmt], mmt, dxpl_id, size))) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file can't alloc", HADDR_UNDEF); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "member file can't alloc", + HADDR_UNDEF); addr += file->fa.memb_addr[mmt]; - /*#ifdef TMP - if ( addr + size > file->eoa ) { - - if ( H5FD_multi_set_eoa(_file, addr + size) < 0 ) { - - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, \ - "can't set eoa", HADDR_UNDEF); - } - } - #else - if ( addr + size > file->eoa ) - file->eoa = addr + size; - #endif */ - return addr; } @@ -1784,42 +1692,9 @@ H5FD_multi_write(H5FD_t *_file, H5FD_mem_t type, hid_t dxpl_id, haddr_t addr, si static herr_t H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, bool closing) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - H5FD_mem_t mt; - int nerrors = 0; - static const char *func = "H5FD_multi_flush"; /* Function Name for error reporting */ - -#if 0 - H5FD_mem_t mmt; - - /* Debugging stuff... */ - fprintf(stderr, "multifile access information:\n"); - - /* print the map */ - fprintf(stderr, " map="); - for (mt=1; mtmemb_map[mt]; - if (H5FD_MEM_DEFAULT==mmt) mmt = mt; - fprintf(stderr, "%s%d", 1==mt?"":",", (int)mmt); - } - fprintf(stderr, "\n"); - - /* print info about each file */ - fprintf(stderr, " File Starting Allocated Next Member\n"); - fprintf(stderr, " Number Address Size Address Name\n"); - fprintf(stderr, " ------ -------------------- -------------------- -------------------- ------------------------------\n"); - - for (mt=1; mtmemb_addr[mt]) { - haddr_t eoa = H5FDget_eoa(file->memb[mt], mt); - fprintf(stderr, " %6d %20llu %20llu %20llu %s\n", - (int)mt, (unsigned long long)(file->memb_addr[mt]), - (unsigned long long)eoa, - (unsigned long long)(file->memb_next[mt]), - file->memb_name[mt]); - } - } -#endif + H5FD_multi_t *file = (H5FD_multi_t *)_file; + H5FD_mem_t mt; + int nerrors = 0; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1836,7 +1711,7 @@ H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, bool closing) } } if (nerrors) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error flushing member files", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error flushing member files", -1); return 0; } @@ -1854,10 +1729,9 @@ H5FD_multi_flush(H5FD_t *_file, hid_t dxpl_id, bool closing) static herr_t H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, bool closing) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - H5FD_mem_t mt; - int nerrors = 0; - static const char *func = "H5FD_multi_truncate"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + H5FD_mem_t mt; + int nerrors = 0; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1874,7 +1748,7 @@ H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, bool closing) } } if (nerrors) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error truncating member files", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error truncating member files", -1); return 0; } /* end H5FD_multi_truncate() */ @@ -1895,10 +1769,9 @@ H5FD_multi_truncate(H5FD_t *_file, hid_t dxpl_id, bool closing) static herr_t H5FD_multi_lock(H5FD_t *_file, bool rw) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - int nerrors = 0; - H5FD_mem_t out_mt = H5FD_MEM_DEFAULT; - static const char *func = "H5FD_multi_unlock"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + int nerrors = 0; + H5FD_mem_t out_mt = H5FD_MEM_DEFAULT; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1934,7 +1807,7 @@ H5FD_multi_lock(H5FD_t *_file, bool rw) } /* end if */ if (nerrors) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTLOCKFILE, "error locking member files", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTLOCKFILE, "error locking member files", -1); return 0; } /* H5FD_multi_lock() */ @@ -1954,9 +1827,8 @@ H5FD_multi_lock(H5FD_t *_file, bool rw) static herr_t H5FD_multi_unlock(H5FD_t *_file) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - int nerrors = 0; - static const char *func = "H5FD_multi_unlock"; /* Function Name for error reporting */ + H5FD_multi_t *file = (H5FD_multi_t *)_file; + int nerrors = 0; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1969,7 +1841,7 @@ H5FD_multi_unlock(H5FD_t *_file) END_MEMBERS if (nerrors) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTUNLOCKFILE, "error unlocking member files", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTUNLOCKFILE, "error unlocking member files", -1); return 0; } /* H5FD_multi_unlock() */ @@ -2032,14 +1904,13 @@ compute_next(H5FD_multi_t *file) * tmp in the code below, but early (4.4.7, at least) gcc only * allows diagnostic pragmas to be toggled outside of functions. */ -H5_MULTI_GCC_CLANG_DIAG_OFF("format-nonliteral") +H5_GCC_CLANG_DIAG_OFF("format-nonliteral") static int open_members(H5FD_multi_t *file) { - char tmp[H5FD_MULT_MAX_FILE_NAME_LEN]; - int nerrors = 0; - int nchars; - static const char *func = "(H5FD_multi)open_members"; /* Function Name for error reporting */ + char tmp[H5FD_MULT_MAX_FILE_NAME_LEN]; + int nerrors = 0; + int nchars; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -2051,7 +1922,7 @@ open_members(H5FD_multi_t *file) nchars = snprintf(tmp, sizeof(tmp), file->fa.memb_name[mt], file->name); if (nchars < 0 || nchars >= (int)sizeof(tmp)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_BADVALUE, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_BADVALUE, "filename is too long and would be truncated", -1); H5E_BEGIN_TRY @@ -2066,11 +1937,11 @@ open_members(H5FD_multi_t *file) } END_MEMBERS if (nerrors) - H5Epush_ret(func, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error opening member files", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_INTERNAL, H5E_BADVALUE, "error opening member files", -1); return 0; } -H5_MULTI_GCC_CLANG_DIAG_ON("format-nonliteral") +H5_GCC_CLANG_DIAG_ON("format-nonliteral") /*------------------------------------------------------------------------- * Function: H5FD_multi_delete @@ -2081,7 +1952,7 @@ H5_MULTI_GCC_CLANG_DIAG_ON("format-nonliteral") * *------------------------------------------------------------------------- */ -H5_MULTI_GCC_CLANG_DIAG_OFF("format-nonliteral") +H5_GCC_CLANG_DIAG_OFF("format-nonliteral") static herr_t H5FD_multi_delete(const char *filename, hid_t fapl_id) { @@ -2089,7 +1960,6 @@ H5FD_multi_delete(const char *filename, hid_t fapl_id) int nchars; const H5FD_multi_fapl_t *fa; H5FD_multi_fapl_t default_fa; - static const char *func = "H5FD_multi_delete"; /* Function Name for error reporting */ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -2107,11 +1977,13 @@ H5FD_multi_delete(const char *filename, hid_t fapl_id) if (env && !strcmp(env, "split")) { if (H5FD_split_populate_config(NULL, H5P_DEFAULT, NULL, H5P_DEFAULT, true, &default_fa) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTSET, "can't setup driver configuration", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTSET, "can't setup driver configuration", + -1); } else { if (H5FD_multi_populate_config(NULL, NULL, NULL, NULL, true, &default_fa) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTSET, "can't setup driver configuration", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTSET, "can't setup driver configuration", + -1); } fa = &default_fa; @@ -2125,17 +1997,17 @@ H5FD_multi_delete(const char *filename, hid_t fapl_id) nchars = snprintf(full_filename, sizeof(full_filename), fa->memb_name[mt], filename); if (nchars < 0 || nchars >= (int)sizeof(full_filename)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_BADVALUE, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_BADVALUE, "filename is too long and would be truncated", -1); if (H5FDdelete(full_filename, fa->memb_fapl[mt]) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_BADVALUE, "error deleting member files", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_BADVALUE, "error deleting member files", -1); } END_MEMBERS return 0; } /* end H5FD_multi_delete() */ -H5_MULTI_GCC_CLANG_DIAG_ON("format-nonliteral") +H5_GCC_CLANG_DIAG_ON("format-nonliteral") /*------------------------------------------------------------------------- * Function: H5FD_multi_ctl @@ -2160,9 +2032,8 @@ H5_MULTI_GCC_CLANG_DIAG_ON("format-nonliteral") static herr_t H5FD_multi_ctl(H5FD_t *_file, uint64_t op_code, uint64_t flags, const void *input, void **output) { - H5FD_multi_t *file = (H5FD_multi_t *)_file; - static const char *func = "H5FD_multi_ctl"; /* Function Name for error reporting */ - herr_t ret_value = 0; + H5FD_multi_t *file = (H5FD_multi_t *)_file; + herr_t ret_value = 0; /* Silence compiler */ (void)file; @@ -2176,7 +2047,7 @@ H5FD_multi_ctl(H5FD_t *_file, uint64_t op_code, uint64_t flags, const void *inpu /* Unknown op code */ default: if (flags & H5FD_CTL_FAIL_IF_UNKNOWN_FLAG) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_FCNTL, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_FCNTL, "VFD ctl request failed (unknown op code and fail if unknown flag is set)", -1); break; diff --git a/src/H5FDmulti.h b/src/H5FDmulti.h index 0bb86157f89..3ac0788a8dd 100644 --- a/src/H5FDmulti.h +++ b/src/H5FDmulti.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,8 +16,11 @@ #ifndef H5FDmulti_H #define H5FDmulti_H -/** Initializer for the multi VFD */ -#define H5FD_MULTI (H5FDperform_init(H5FD_multi_init)) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + +/** ID for the multi VFD */ +#define H5FD_MULTI (H5OPEN H5FD_MULTI_id_g) #ifdef __cplusplus extern "C" { @@ -25,9 +28,9 @@ extern "C" { /** @private * - * \brief Private initializer for the multi VFD + * \brief ID for the multi VFD */ -H5_DLL hid_t H5FD_multi_init(void); +H5_DLLVAR hid_t H5FD_MULTI_id_g; /** * \ingroup FAPL diff --git a/src/H5FDmulti_int.c b/src/H5FDmulti_int.c new file mode 100644 index 00000000000..714aee2d518 --- /dev/null +++ b/src/H5FDmulti_int.c @@ -0,0 +1,83 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Purpose: Private routines for the multi VFD. + * + * Necessary for using internal library routines, which are + * disallowed within the actual multi VFD code. + * + */ + +/****************/ +/* Module Setup */ +/****************/ + +#define H5FD_FRIEND /* Suppress error about including H5FDpkg */ + +/***********/ +/* Headers */ +/***********/ + +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5FDpkg.h" /* File drivers */ + +#include "H5FDmulti_private.h" /* multi VFD */ + +/* The driver identification number, initialized at runtime */ +hid_t H5FD_MULTI_id_g = H5I_INVALID_HID; + +/*------------------------------------------------------------------------- + * Function: H5FD__multi_register + * + * Purpose: Register the driver with the library. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5FD__multi_register(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + + if (H5I_VFL != H5I_get_type(H5FD_MULTI_id_g)) + if ((H5FD_MULTI_id_g = H5FD_register(&H5FD_multi_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register multi driver"); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD__multi_register() */ + +/*--------------------------------------------------------------------------- + * Function: H5FD__multi_unregister + * + * Purpose: Reset library driver info. + * + * Returns: SUCCEED (Can't fail) + * + *--------------------------------------------------------------------------- + */ +herr_t +H5FD__multi_unregister(void) +{ + FUNC_ENTER_PACKAGE_NOERR + + /* Reset VFL ID */ + H5FD_MULTI_id_g = H5I_INVALID_HID; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5FD_multi_unregister() */ diff --git a/src/H5FDmulti_private.h b/src/H5FDmulti_private.h new file mode 100644 index 00000000000..47e3b7121b0 --- /dev/null +++ b/src/H5FDmulti_private.h @@ -0,0 +1,45 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the LICENSE file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Purpose: The private header file for the multi VFD + */ + +#ifndef H5FDmulti_private_H +#define H5FDmulti_private_H + +/* Include VFD's public header */ +#include "H5FDmulti.h" /* multi VFD */ + +/* Private headers needed by this file */ +#include "H5FDprivate.h" /* File drivers */ + +/**************************/ +/* Library Private Macros */ +/**************************/ + +/****************************/ +/* Library Private Typedefs */ +/****************************/ + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + +/* multi VFD's class struct */ +H5_DLLVAR const H5FD_class_t H5FD_multi_g; + +/******************************/ +/* Library Private Prototypes */ +/******************************/ + +#endif /* H5FDmulti_private_H */ diff --git a/src/H5FDonion.c b/src/H5FDonion.c index 96f9166b244..ddbc25bc04c 100644 --- a/src/H5FDonion.c +++ b/src/H5FDonion.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,22 +16,20 @@ * Purpose: Provide in-file provenance and revision/version control. */ -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* Files */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDonion.h" /* Onion file driver */ +#include "H5FDsec2.h" /* Sec2 file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDonion_priv.h" /* Onion file driver internals */ -#include "H5FDsec2.h" /* Sec2 file driver */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_ONION_g = 0; +hid_t H5FD_ONION_id_g = H5I_INVALID_HID; /****************************************************************************** * @@ -149,8 +147,6 @@ typedef struct H5FD_onion_t { H5FL_DEFINE_STATIC(H5FD_onion_t); -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) - #define H5FD_CTL_GET_NUM_REVISIONS 20001 /* Prototypes */ @@ -160,7 +156,6 @@ static haddr_t H5FD__onion_get_eof(const H5FD_t *, H5FD_mem_t); static H5FD_t *H5FD__onion_open(const char *, unsigned int, hid_t, haddr_t); static herr_t H5FD__onion_read(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, void *); static herr_t H5FD__onion_set_eoa(H5FD_t *, H5FD_mem_t, haddr_t); -static herr_t H5FD__onion_term(void); static herr_t H5FD__onion_write(H5FD_t *, H5FD_mem_t, hid_t, haddr_t, size_t, const void *); static herr_t H5FD__onion_open_rw(H5FD_onion_t *, unsigned int, haddr_t, bool new_open); @@ -178,9 +173,9 @@ static const H5FD_class_t H5FD_onion_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_ONION_VALUE, /* value */ "onion", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__onion_term, /* terminate */ + NULL, /* terminate */ H5FD__onion_sb_size, /* sb_size */ H5FD__onion_sb_encode, /* sb_encode */ H5FD__onion_sb_decode, /* sb_decode */ @@ -218,50 +213,48 @@ static const H5FD_class_t H5FD_onion_g = { }; /*----------------------------------------------------------------------------- - * Function: H5FD_onion_init + * Function: H5FD__onion_register + * + * Purpose: Register the driver with the library. * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Return: SUCCEED/FAIL * - * Return: Success: The driver ID for the onion driver. - * Failure: Negative *----------------------------------------------------------------------------- */ -hid_t -H5FD_onion_init(void) +herr_t +H5FD__onion_register(void) { - hid_t ret_value = H5I_INVALID_HID; - - FUNC_ENTER_NOAPI_NOERR + herr_t ret_value = SUCCEED; /* Return value */ - if (H5I_VFL != H5I_get_type(H5FD_ONION_g)) - H5FD_ONION_g = H5FD_register(&H5FD_onion_g, sizeof(H5FD_class_t), false); + FUNC_ENTER_PACKAGE - /* Set return value */ - ret_value = H5FD_ONION_g; + if (H5I_VFL != H5I_get_type(H5FD_ONION_id_g)) + if ((H5FD_ONION_id_g = H5FD_register(&H5FD_onion_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register onion driver"); +done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_onion_init() */ +} /* end H5FD__onion_register() */ /*----------------------------------------------------------------------------- - * Function: H5FD__onion_term + * Function: H5FD__onion_unregister * - * Purpose: Shut down the Onion VFD. + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) + * *----------------------------------------------------------------------------- */ -static herr_t -H5FD__onion_term(void) +herr_t +H5FD__onion_unregister(void) { FUNC_ENTER_PACKAGE_NOERR /* Reset VFL ID */ - H5FD_ONION_g = 0; + H5FD_ONION_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) - -} /* end H5FD__onion_term() */ +} /* end H5FD__onion_unregister() */ /*----------------------------------------------------------------------------- * Function: H5Pget_fapl_onion diff --git a/src/H5FDonion.h b/src/H5FDonion.h index 4aaab6d3c3e..5c374bb16dd 100644 --- a/src/H5FDonion.h +++ b/src/H5FDonion.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,8 +16,11 @@ #ifndef H5FDonion_H #define H5FDonion_H -/** Initializer for the onion VFD */ -#define H5FD_ONION (H5FDperform_init(H5FD_onion_init)) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + +/** ID for the onion VFD */ +#define H5FD_ONION (H5OPEN H5FD_ONION_id_g) /** Identifier for the onion VFD */ #define H5FD_ONION_VALUE H5_VFD_ONION @@ -115,9 +118,9 @@ extern "C" { /** @private * - * \brief Private initializer for the onion VFD + * \brief ID for the onion VFD */ -H5_DLL hid_t H5FD_onion_init(void); +H5_DLLVAR hid_t H5FD_ONION_id_g; /** * -------------------------------------------------------------------------- diff --git a/src/H5FDonion_header.c b/src/H5FDonion_header.c index e6790b3290e..2411f6e712f 100644 --- a/src/H5FDonion_header.c +++ b/src/H5FDonion_header.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,13 +16,11 @@ * Purpose: Code for the onion file's header */ -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDonion.h" /* Onion file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDonion_priv.h" /* Onion file driver internals */ #include "H5MMprivate.h" /* Memory management */ diff --git a/src/H5FDonion_header.h b/src/H5FDonion_header.h index f8dd739d13e..774bd6020bf 100644 --- a/src/H5FDonion_header.h +++ b/src/H5FDonion_header.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDonion_history.c b/src/H5FDonion_history.c index 32bf483ccda..13231683a6b 100644 --- a/src/H5FDonion_history.c +++ b/src/H5FDonion_history.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,13 +16,11 @@ * Purpose: Code for the onion file's history */ -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDonion.h" /* Onion file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDonion_priv.h" /* Onion file driver internals */ #include "H5MMprivate.h" /* Memory management */ diff --git a/src/H5FDonion_history.h b/src/H5FDonion_history.h index 5980bf7e1ac..59c1378efe9 100644 --- a/src/H5FDonion_history.h +++ b/src/H5FDonion_history.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDonion_index.c b/src/H5FDonion_index.c index 4d1320ed809..8e9512c102c 100644 --- a/src/H5FDonion_index.c +++ b/src/H5FDonion_index.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,13 +16,11 @@ * Purpose: Code for the archival and revision indexes */ -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDonion.h" /* Onion file driver */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDonion_priv.h" /* Onion file driver internals */ #include "H5MMprivate.h" /* Memory management */ diff --git a/src/H5FDonion_index.h b/src/H5FDonion_index.h index 7dbd30a922d..91dd4492d2a 100644 --- a/src/H5FDonion_index.h +++ b/src/H5FDonion_index.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDonion_priv.h b/src/H5FDonion_priv.h index 907d39f668a..d95c5eb3bf0 100644 --- a/src/H5FDonion_priv.h +++ b/src/H5FDonion_priv.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -21,6 +21,10 @@ #ifndef H5FDonion_priv_H #define H5FDonion_priv_H +/* Public headers */ +#include "H5FDonion.h" + +/* Private headers */ #include "H5FDonion_header.h" #include "H5FDonion_history.h" #include "H5FDonion_index.h" diff --git a/src/H5FDperform.c b/src/H5FDperform.c deleted file mode 100644 index 7d9f49afdd5..00000000000 --- a/src/H5FDperform.c +++ /dev/null @@ -1,57 +0,0 @@ -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * - * Copyright by The HDF Group. * - * All rights reserved. * - * * - * This file is part of HDF5. The full HDF5 copyright notice, including * - * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * - * distribution tree, or in https://www.hdfgroup.org/licenses. * - * If you do not have access to either file, you may request a copy from * - * help@hdfgroup.org. * - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ - -/****************/ -/* Module Setup */ -/****************/ - -#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ - -/***********/ -/* Headers */ -/***********/ -#include "H5private.h" /* Generic Functions */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5FDpkg.h" /* File Drivers */ -#include "H5Iprivate.h" /* IDs */ - -/*------------------------------------------------------------------------- - * Function: H5FDperform_init - * - * Purpose: Ensure that the library is initialized and then call - * the provided VFD initializer - * - * Return: Success: Identifier for the VFD just initialized - * Failure: H5I_INVALID_HID - *------------------------------------------------------------------------- - */ -hid_t -H5FDperform_init(H5FD_init_t op) -{ - hid_t ret_value = H5I_INVALID_HID; /* Return value */ - - FUNC_ENTER_API_NOINIT - - /* It is possible that an application will evaluate an - * `H5FD_*` symbol (`H5FD_FAMILY`, `H5FD_MULTI`, `H5FD_SEC2`, etc. - * before the library has had an opportunity to initialize. Call - * H5_init_library() to make sure that the library has been initialized - * before `init` is run. - */ - if (H5_init_library() < 0) - HGOTO_ERROR(H5E_FUNC, H5E_CANTINIT, H5I_INVALID_HID, "library initialization failed"); - - ret_value = op(); - -done: - FUNC_LEAVE_API_NOINIT(ret_value) -} diff --git a/src/H5FDpkg.h b/src/H5FDpkg.h index 0d0a7b706c9..ee8ac1cc5f5 100644 --- a/src/H5FDpkg.h +++ b/src/H5FDpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -31,6 +31,30 @@ /* Package Private Macros */ /**************************/ +/* These macros check for overflow of various quantities. They are suitable + * for VFDs that are "file-like" where lseek(2), etc. is used to move around + * via HDoff_t units (i.e., most VFDs aside from the core VFD). + * + * These macros assume that HDoff_t is signed and haddr_t and size_t are unsigned. + * + * H5FD_ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' + * is too large to be represented by the second argument + * of the file seek function. + * + * H5FD_SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too + * large to be represented by the `size_t' type. + * + * H5FD_REGION_OVERFLOW: Checks whether an address and size pair describe data + * which can be addressed entirely by the second + * argument of the file seek function. + */ +#define H5FD_MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) +#define H5FD_ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)H5FD_MAXADDR)) +#define H5FD_SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)H5FD_MAXADDR) +#define H5FD_REGION_OVERFLOW(A, Z) \ + (H5FD_ADDR_OVERFLOW(A) || H5FD_SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || \ + (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) + /****************************/ /* Package Private Typedefs */ /****************************/ @@ -39,6 +63,9 @@ /* Package Private Variables */ /*****************************/ +/* Whether to ignore file locks when disabled (env var value) */ +H5_DLLVAR htri_t H5FD_ignore_disabled_file_locks_p; + /******************************/ /* Package Private Prototypes */ /******************************/ @@ -46,6 +73,52 @@ H5_DLL haddr_t H5FD__alloc_real(H5FD_t *file, H5FD_mem_t type, hsize_t size, had hsize_t *align_size); H5_DLL herr_t H5FD__free_real(H5FD_t *file, H5FD_mem_t type, haddr_t addr, hsize_t size); +/* Internal VFD init/term routines */ +H5_DLL herr_t H5FD__core_register(void); +H5_DLL herr_t H5FD__core_unregister(void); +#ifdef H5_HAVE_DIRECT +H5_DLL herr_t H5FD__direct_register(void); +H5_DLL herr_t H5FD__direct_unregister(void); +#endif +H5_DLL herr_t H5FD__family_register(void); +H5_DLL herr_t H5FD__family_unregister(void); +#ifdef H5_HAVE_LIBHDFS +H5_DLL herr_t H5FD__hdfs_register(void); +H5_DLL herr_t H5FD__hdfs_unregister(void); +#endif +#ifdef H5_HAVE_IOC_VFD +H5_DLL herr_t H5FD__ioc_register(void); +H5_DLL herr_t H5FD__ioc_unregister(void); +#endif +H5_DLL herr_t H5FD__log_register(void); +H5_DLL herr_t H5FD__log_unregister(void); +#ifdef H5_HAVE_MIRROR_VFD +H5_DLL herr_t H5FD__mirror_register(void); +H5_DLL herr_t H5FD__mirror_unregister(void); +#endif +#ifdef H5_HAVE_PARALLEL +H5_DLL herr_t H5FD__mpio_register(void); +H5_DLL herr_t H5FD__mpio_unregister(void); +#endif +H5_DLL herr_t H5FD__multi_register(void); +H5_DLL herr_t H5FD__multi_unregister(void); +H5_DLL herr_t H5FD__onion_register(void); +H5_DLL herr_t H5FD__onion_unregister(void); +#ifdef H5_HAVE_ROS3_VFD +H5_DLL herr_t H5FD__ros3_register(void); +H5_DLL herr_t H5FD__ros3_unregister(void); +#endif +H5_DLL herr_t H5FD__sec2_register(void); +H5_DLL herr_t H5FD__sec2_unregister(void); +H5_DLL herr_t H5FD__splitter_register(void); +H5_DLL herr_t H5FD__splitter_unregister(void); +H5_DLL herr_t H5FD__stdio_register(void); +H5_DLL herr_t H5FD__stdio_unregister(void); +#ifdef H5_HAVE_SUBFILING_VFD +H5_DLL herr_t H5FD__subfiling_register(void); +H5_DLL herr_t H5FD__subfiling_unregister(void); +#endif + /* Testing functions */ #ifdef H5FD_TESTING H5_DLL bool H5FD__supports_swmr_test(const char *vfd_name); diff --git a/src/H5FDprivate.h b/src/H5FDprivate.h index 942dc21e2e5..68a40f1fec6 100644 --- a/src/H5FDprivate.h +++ b/src/H5FDprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -109,6 +109,7 @@ struct H5S_t; struct H5F_t; union H5PL_key_t; +H5_DLL herr_t H5FD_init(void); H5_DLL int H5FD_term_interface(void); H5_DLL herr_t H5FD_locate_signature(H5FD_t *file, haddr_t *sig_addr); H5_DLL H5FD_class_t *H5FD_get_class(hid_t id); @@ -124,7 +125,7 @@ H5_DLL htri_t H5FD_is_driver_registered_by_name(const char *driver_name, H5_DLL htri_t H5FD_is_driver_registered_by_value(H5FD_class_value_t driver_value, hid_t *registered_id); H5_DLL hid_t H5FD_get_driver_id_by_name(const char *name, bool is_api); H5_DLL hid_t H5FD_get_driver_id_by_value(H5FD_class_value_t value, bool is_api); -H5_DLL herr_t H5FD_open(bool try, H5FD_t **file, const char *name, unsigned flags, hid_t fapl_id, +H5_DLL herr_t H5FD_open(bool attempt, H5FD_t **file, const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr); H5_DLL herr_t H5FD_close(H5FD_t *file); H5_DLL int H5FD_cmp(const H5FD_t *f1, const H5FD_t *f2); @@ -197,7 +198,6 @@ H5_DLL herr_t H5FD_sort_selection_io_req(bool *selection_was_sorted, size_t coun H5_flexible_const_ptr_t bufs[], hid_t **s_mem_space_ids, hid_t **s_file_space_ids, haddr_t **s_offsets_ptr, size_t **s_element_sizes_ptr, H5_flexible_const_ptr_t **s_bufs_ptr); -H5_DLL herr_t H5FD_init(void); /* Function prototypes for MPI based VFDs*/ #ifdef H5_HAVE_PARALLEL diff --git a/src/H5FDpublic.h b/src/H5FDpublic.h index d8d77d6534b..d8e080edab9 100644 --- a/src/H5FDpublic.h +++ b/src/H5FDpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDros3.c b/src/H5FDros3.c index eebf9edca3c..02698c59399 100644 --- a/src/H5FDros3.c +++ b/src/H5FDros3.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,21 +17,19 @@ * Relies on "s3comms" utility layer to implement the AWS REST API. */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + +#include "H5private.h" /* Generic Functions */ + #ifdef H5_HAVE_ROS3_VFD -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" -#endif -#include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDros3.h" /* ros3 file driver */ +#include "H5FDs3comms.h" /* S3 Communications */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ -#include "H5FDs3comms.h" /* S3 Communications */ - -#ifdef H5_HAVE_ROS3_VFD /* Define to turn on stats collection and reporting */ /* #define ROS3_STATS */ @@ -40,7 +38,12 @@ #define ROS3_MAX_CACHE_SIZE 16777216 /* The driver identification number, initialized at runtime */ -static hid_t H5FD_ROS3_g = 0; +hid_t H5FD_ROS3_id_g = H5I_INVALID_HID; + +/* Flag to indicate whether global driver resources & settings have been + * initialized. + */ +static bool H5FD_ros3_init_s = false; /* Session/security token property name */ #define ROS3_TOKEN_PROP_NAME "ros3_token_prop" @@ -126,20 +129,7 @@ typedef struct H5FD_ros3_t { #endif } H5FD_ros3_t; -/* These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * Only included if it may be used -- ROS3 VFD is enabled. - * - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) - /* Prototypes */ -static herr_t H5FD__ros3_term(void); static void *H5FD__ros3_fapl_get(H5FD_t *_file); static void *H5FD__ros3_fapl_copy(const void *_old_fa); static herr_t H5FD__ros3_fapl_free(void *_fa); @@ -174,9 +164,9 @@ static const H5FD_class_t H5FD_ros3_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_ROS3_VALUE, /* value */ "ros3", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__ros3_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -217,59 +207,74 @@ static const H5FD_class_t H5FD_ros3_g = { H5FL_DEFINE_STATIC(H5FD_ros3_t); /*------------------------------------------------------------------------- - * Function: H5FD_ros3_init + * Function: H5FD__ros3_register + * + * Purpose: Register the driver with the library. * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Return: SUCCEED/FAIL * - * Return: Success: The driver ID for the ros3 driver - * Failure: H5I_INVALID_HID *------------------------------------------------------------------------- */ -hid_t -H5FD_ros3_init(void) +herr_t +H5FD__ros3_register(void) { - hid_t ret_value = H5I_INVALID_HID; - - FUNC_ENTER_NOAPI(H5I_INVALID_HID) + herr_t ret_value = SUCCEED; /* Return value */ - if (H5I_VFL != H5I_get_type(H5FD_ROS3_g)) { - H5FD_ROS3_g = H5FD_register(&H5FD_ros3_g, sizeof(H5FD_class_t), false); - if (H5I_INVALID_HID == H5FD_ROS3_g) { - HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register ros3"); - } - -#ifdef ROS3_STATS - /* Pre-compute stats bin boundaries on powers of 2 >= 10 */ - for (int i = 0; i < ROS3_STATS_BIN_COUNT; i++) - ros3_stats_boundaries_g[i] = 1 << (10 + i); -#endif - } + FUNC_ENTER_PACKAGE - ret_value = H5FD_ROS3_g; + if (H5I_VFL != H5I_get_type(H5FD_ROS3_id_g)) + if ((H5FD_ROS3_id_g = H5FD_register(&H5FD_ros3_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register ros3 driver"); done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_ros3_init() */ +} /* end H5FD__ros3_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__ros3_term + * Function: H5FD__ros3_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) + * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__ros3_term(void) +herr_t +H5FD__ros3_unregister(void) { FUNC_ENTER_PACKAGE_NOERR /* Reset VFL ID */ - H5FD_ROS3_g = 0; + H5FD_ROS3_id_g = H5I_INVALID_HID; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5FD__ros3_unregister() */ + +/*------------------------------------------------------------------------- + * Function: H5FD__ros3_init + * + * Purpose: Singleton to initialize global driver settings & resources. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +static herr_t +H5FD__ros3_init(void) +{ + FUNC_ENTER_PACKAGE_NOERR + +#ifdef ROS3_STATS + /* Pre-compute stats bin boundaries on powers of 2 >= 10 */ + for (int i = 0; i < ROS3_STATS_BIN_COUNT; i++) + ros3_stats_boundaries_g[i] = 1 << (10 + i); +#endif + + /* Indicate that driver is set up */ + H5FD_ros3_init_s = true; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__ros3_term() */ +} /* end H5FD__ros3_init() */ /*------------------------------------------------------------------------- * Function: H5Pset_fapl_ros3 @@ -708,13 +713,18 @@ H5FD__ros3_open(const char *url, unsigned flags, hid_t fapl_id, haddr_t maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); if (flags != H5F_ACC_RDONLY) HGOTO_ERROR(H5E_ARGS, H5E_UNSUPPORTED, NULL, "only Read-Only access allowed"); if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list"); + /* Initialize driver, if it's not yet */ + if (!H5FD_ros3_init_s) + if (H5FD__ros3_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "can't initialize driver"); + /* Init curl */ if (CURLE_OK != curl_global_init(CURL_GLOBAL_DEFAULT)) HGOTO_ERROR(H5E_VFL, H5E_BADVALUE, NULL, "unable to initialize curl global (placeholder flags)"); diff --git a/src/H5FDros3.h b/src/H5FDros3.h index f7d59c83c89..8117ad8a1e5 100644 --- a/src/H5FDros3.h +++ b/src/H5FDros3.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,12 +16,17 @@ #ifndef H5FDros3_H #define H5FDros3_H +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + #ifdef H5_HAVE_ROS3_VFD -/** Initializer for the ros3 VFD */ -#define H5FD_ROS3 (H5FDperform_init(H5FD_ros3_init)) + +/** ID for the ros3 VFD */ +#define H5FD_ROS3 (H5OPEN H5FD_ROS3_id_g) /** Identifier for the ros3 VFD */ #define H5FD_ROS3_VALUE H5_VFD_ROS3 + #else /** Initializer for the ros3 VFD (disabled) */ #define H5FD_ROS3 (H5I_INVALID_HID) @@ -32,48 +37,6 @@ #ifdef H5_HAVE_ROS3_VFD -/**************************************************************************** - * - * Structure: H5FD_ros3_fapl_t - * - * Purpose: - * - * H5FD_ros3_fapl_t is a public structure that is used to pass S3 - * authentication data to the appropriate S3 VFD via the FAPL. A pointer - * to an instance of this structure is a parameter to H5Pset_fapl_ros3() - * and H5Pget_fapl_ros3(). - * - * - * - * `version` (int32_t) - * - * Version number of the H5FD_ros3_fapl_t structure. Any instance passed - * to the above calls must have a recognized version number, or an error - * will be flagged. - * - * This field should be set to H5FD_CURR_ROS3_FAPL_T_VERSION. - * - * `authenticate` (hbool_t) - * - * Flag true or false whether or not requests are to be authenticated - * with the AWS4 algorithm. - * If true, `aws_region`, `secret_id`, and `secret_key` must be populated. - * If false, those three components are unused. - * - * `aws_region` (char[]) - * - * String: name of the AWS "region" of the host, e.g. "us-east-1". - * - * `secret_id` (char[]) - * - * String: "Access ID" for the resource. - * - * `secret_key` (char[]) - * - * String: "Secret Access Key" associated with the ID and resource. - * - ****************************************************************************/ - /** * \def H5FD_CURR_ROS3_FAPL_T_VERSION * The version number of the H5FD_ros3_fapl_t configuration @@ -120,9 +83,11 @@ * \var hbool_t H5FD_ros3_fapl_t::authenticate * A Boolean which specifies if security credentials should be used for * accessing a S3 bucket. + * If true, `aws_region`, `secret_id`, and `secret_key` must be populated. + * If false, those three components are unused. * * \var char H5FD_ros3_fapl_t::aws_region[H5FD_ROS3_MAX_REGION_LEN + 1] - * A string which specifies the AWS region of the S3 bucket. + * A string which specifies the AWS region of the S3 bucket, e.g. "us-east-1". * * \var char H5FD_ros3_fapl_t::secret_id[H5FD_ROS3_MAX_SECRET_ID_LEN + 1] * A string which specifies the security ID. @@ -145,9 +110,9 @@ extern "C" { /** @private * - * \brief Private initializer for the ros3 VFD + * \brief ID for the ros3 VFD */ -H5_DLL hid_t H5FD_ros3_init(void); +H5_DLLVAR hid_t H5FD_ROS3_id_g; /** * \ingroup FAPL diff --git a/src/H5FDs3comms.c b/src/H5FDs3comms.c index 78ed5273f52..c5de645ddb8 100644 --- a/src/H5FDs3comms.c +++ b/src/H5FDs3comms.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDs3comms.h b/src/H5FDs3comms.h index 62855e3d952..fdf13ac6b99 100644 --- a/src/H5FDs3comms.h +++ b/src/H5FDs3comms.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDsec2.c b/src/H5FDsec2.c index ed4093adf74..0475f9a7647 100644 --- a/src/H5FDsec2.c +++ b/src/H5FDsec2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -19,22 +19,19 @@ * application to the same file). */ -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDsec2.h" /* Sec2 file driver */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ #include "H5Pprivate.h" /* Property lists */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_SEC2_g = 0; - -/* Whether to ignore file locks when disabled (env var value) */ -static htri_t ignore_disabled_file_locks_s = FAIL; +hid_t H5FD_SEC2_id_g = H5I_INVALID_HID; /* The description of a file belonging to this driver. The 'eoa' and 'eof' * determine the amount of hdf5 address space in use and the high-water mark @@ -97,29 +94,7 @@ typedef struct H5FD_sec2_t { bool fam_to_single; } H5FD_sec2_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. - * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) -#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) - /* Prototypes */ -static herr_t H5FD__sec2_term(void); static H5FD_t *H5FD__sec2_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr); static herr_t H5FD__sec2_close(H5FD_t *_file); static int H5FD__sec2_cmp(const H5FD_t *_f1, const H5FD_t *_f2); @@ -143,9 +118,9 @@ static const H5FD_class_t H5FD_sec2_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_SEC2_VALUE, /* value */ "sec2", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__sec2_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -186,61 +161,48 @@ static const H5FD_class_t H5FD_sec2_g = { H5FL_DEFINE_STATIC(H5FD_sec2_t); /*------------------------------------------------------------------------- - * Function: H5FD_sec2_init + * Function: H5FD__sec2_register * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Register the driver with the library. * - * Return: Success: The driver ID for the sec2 driver - * Failure: H5I_INVALID_HID + * Return: SUCCEED/FAIL * *------------------------------------------------------------------------- */ -hid_t -H5FD_sec2_init(void) +herr_t +H5FD__sec2_register(void) { - char *lock_env_var = NULL; /* Environment variable pointer */ - hid_t ret_value = H5I_INVALID_HID; /* Return value */ - - FUNC_ENTER_NOAPI_NOERR - - /* Check the use disabled file locks environment variable */ - lock_env_var = getenv(HDF5_USE_FILE_LOCKING); - if (lock_env_var && !strcmp(lock_env_var, "BEST_EFFORT")) - ignore_disabled_file_locks_s = true; /* Override: Ignore disabled locks */ - else if (lock_env_var && (!strcmp(lock_env_var, "TRUE") || !strcmp(lock_env_var, "1"))) - ignore_disabled_file_locks_s = false; /* Override: Don't ignore disabled locks */ - else - ignore_disabled_file_locks_s = FAIL; /* Environment variable not set, or not set correctly */ + herr_t ret_value = SUCCEED; /* Return value */ - if (H5I_VFL != H5I_get_type(H5FD_SEC2_g)) - H5FD_SEC2_g = H5FD_register(&H5FD_sec2_g, sizeof(H5FD_class_t), false); + FUNC_ENTER_PACKAGE - /* Set return value */ - ret_value = H5FD_SEC2_g; + if (H5I_VFL != H5I_get_type(H5FD_SEC2_id_g)) + if ((H5FD_SEC2_id_g = H5FD_register(&H5FD_sec2_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register sec2 driver"); +done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_sec2_init() */ +} /* end H5FD__sec2_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__sec2_term + * Function: H5FD__sec2_unregister * - * Purpose: Shut down the VFD + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__sec2_term(void) +herr_t +H5FD__sec2_unregister(void) { FUNC_ENTER_PACKAGE_NOERR /* Reset VFL ID */ - H5FD_SEC2_g = 0; + H5FD_SEC2_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__sec2_term() */ +} /* end H5FD__sec2_unregister() */ /*------------------------------------------------------------------------- * Function: H5Pset_fapl_sec2 @@ -305,7 +267,7 @@ H5FD__sec2_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); /* Build the open flags */ @@ -361,9 +323,9 @@ H5FD__sec2_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr HGOTO_ERROR(H5E_VFL, H5E_BADTYPE, NULL, "not a file access property list"); /* Check the file locking flags in the fapl */ - if (ignore_disabled_file_locks_s != FAIL) + if (H5FD_ignore_disabled_file_locks_p != FAIL) /* The environment variable was set, so use that preferentially */ - file->ignore_disabled_file_locks = ignore_disabled_file_locks_s; + file->ignore_disabled_file_locks = H5FD_ignore_disabled_file_locks_p; else { /* Use the value in the property list */ if (H5P_get(plist, H5F_ACS_IGNORE_DISABLED_FILE_LOCKS_NAME, &file->ignore_disabled_file_locks) < 0) @@ -661,7 +623,7 @@ H5FD__sec2_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNU /* Check for overflow conditions */ if (!H5_addr_defined(addr)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu", (unsigned long long)addr); #ifndef H5_HAVE_PREADWRITE @@ -771,7 +733,7 @@ H5FD__sec2_write(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UN /* Check for overflow conditions */ if (!H5_addr_defined(addr)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu, size = %llu", (unsigned long long)addr, (unsigned long long)size); diff --git a/src/H5FDsec2.h b/src/H5FDsec2.h index dd0a4d8918d..d748fc92ece 100644 --- a/src/H5FDsec2.h +++ b/src/H5FDsec2.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,8 +17,11 @@ #ifndef H5FDsec2_H #define H5FDsec2_H -/** Initializer for the sec2 VFD */ -#define H5FD_SEC2 (H5FDperform_init(H5FD_sec2_init)) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + +/** ID for the sec2 VFD */ +#define H5FD_SEC2 (H5OPEN H5FD_SEC2_id_g) /** Identifier for the sec2 VFD */ #define H5FD_SEC2_VALUE H5_VFD_SEC2 @@ -29,9 +32,9 @@ extern "C" { /** @private * - * \brief Private initializer for the sec2 VFD + * \brief ID for the sec2 VFD */ -H5_DLL hid_t H5FD_sec2_init(void); +H5_DLLVAR hid_t H5FD_SEC2_id_g; /** * \ingroup FAPL diff --git a/src/H5FDspace.c b/src/H5FDspace.c index 6e658bca794..3bf233d56e5 100644 --- a/src/H5FDspace.c +++ b/src/H5FDspace.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FDsplitter.c b/src/H5FDsplitter.c index 778d112822e..495328c40eb 100644 --- a/src/H5FDsplitter.c +++ b/src/H5FDsplitter.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,13 +16,12 @@ * another underlying VFD. Maintains two files simultaneously. */ -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5Eprivate.h" /* Error handling */ #include "H5Fprivate.h" /* File access */ -#include "H5FDprivate.h" /* File drivers */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDsplitter.h" /* Splitter file driver */ #include "H5FLprivate.h" /* Free Lists */ #include "H5Iprivate.h" /* IDs */ @@ -30,7 +29,7 @@ #include "H5Pprivate.h" /* Property lists */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_SPLITTER_g = 0; +hid_t H5FD_SPLITTER_id_g = H5I_INVALID_HID; /* Driver-specific file access properties */ typedef struct H5FD_splitter_fapl_t { @@ -51,27 +50,6 @@ typedef struct H5FD_splitter_t { FILE *logfp; /* Log file pointer */ } H5FD_splitter_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. - * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) -#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) - /* This macro provides a wrapper for shared fail-log-ignore behavior * for errors arising in the splitter's W/O channel. * Logs an error entry in a log file, if the file exists. @@ -103,7 +81,6 @@ static herr_t H5FD__splitter_log_error(const H5FD_splitter_t *file, const char * static int H5FD__copy_plist(hid_t fapl_id, hid_t *id_out_ptr); /* Prototypes */ -static herr_t H5FD__splitter_term(void); static herr_t H5FD__splitter_populate_config(H5FD_splitter_vfd_config_t *vfd_config, H5FD_splitter_fapl_t *fapl_out); static herr_t H5FD__splitter_get_default_wo_path(char *new_path, size_t new_path_len, @@ -141,9 +118,9 @@ static const H5FD_class_t H5FD_splitter_g = { H5FD_CLASS_VERSION, /* struct version */ H5FD_SPLITTER_VALUE, /* value */ "splitter", /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD__splitter_term, /* terminate */ + NULL, /* terminate */ H5FD__splitter_sb_size, /* sb_size */ H5FD__splitter_sb_encode, /* sb_encode */ H5FD__splitter_sb_decode, /* sb_decode */ @@ -187,52 +164,52 @@ H5FL_DEFINE_STATIC(H5FD_splitter_t); H5FL_DEFINE_STATIC(H5FD_splitter_fapl_t); /*------------------------------------------------------------------------- - * Function: H5FD_splitter_init + * Function: H5FD__splitter_register * - * Purpose: Initialize the splitter driver by registering it with the - * library. + * Purpose: Register the driver with the library. + * + * Return: SUCCEED/FAIL * - * Return: Success: The driver ID for the splitter driver. - * Failure: Negative *------------------------------------------------------------------------- */ -hid_t -H5FD_splitter_init(void) +herr_t +H5FD__splitter_register(void) { - hid_t ret_value = H5I_INVALID_HID; + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_PACKAGE H5FD_SPLITTER_LOG_CALL(__func__); - if (H5I_VFL != H5I_get_type(H5FD_SPLITTER_g)) - H5FD_SPLITTER_g = H5FDregister(&H5FD_splitter_g); - - ret_value = H5FD_SPLITTER_g; + if (H5I_VFL != H5I_get_type(H5FD_SPLITTER_id_g)) + if ((H5FD_SPLITTER_id_g = H5FD_register(&H5FD_splitter_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register splitter driver"); +done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_splitter_init() */ +} /* end H5FD__splitter_register() */ /*--------------------------------------------------------------------------- - * Function: H5FD__splitter_term + * Function: H5FD__splitter_unregister * - * Purpose: Shut down the splitter VFD. + * Purpose: Reset library driver info. * * Returns: SUCCEED (Can't fail) + * *--------------------------------------------------------------------------- */ -static herr_t -H5FD__splitter_term(void) +herr_t +H5FD__splitter_unregister(void) { FUNC_ENTER_PACKAGE_NOERR H5FD_SPLITTER_LOG_CALL(__func__); /* Reset VFL ID */ - H5FD_SPLITTER_g = 0; + H5FD_SPLITTER_id_g = H5I_INVALID_HID; FUNC_LEAVE_NOAPI(SUCCEED) -} /* end H5FD__splitter_term() */ +} /* end H5FD__splitter_unregister() */ /*------------------------------------------------------------------------- * Function: H5FD__copy_plist @@ -617,7 +594,7 @@ H5FD__splitter_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR /* Check for overflow conditions */ if (!H5_addr_defined(addr)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %llu", (unsigned long long)addr); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %llu", (unsigned long long)addr); /* Only read from R/W channel */ @@ -800,7 +777,7 @@ H5FD__splitter_open(const char *name, unsigned flags, hid_t splitter_fapl_id, ha HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); if (H5FD_SPLITTER != H5Pget_driver(splitter_fapl_id)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "driver is not splitter"); diff --git a/src/H5FDsplitter.h b/src/H5FDsplitter.h index 99a471e5ce3..66e3ebaf38f 100644 --- a/src/H5FDsplitter.h +++ b/src/H5FDsplitter.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,8 +17,11 @@ #ifndef H5FDsplitter_H #define H5FDsplitter_H -/** Initializer for the splitter VFD */ -#define H5FD_SPLITTER (H5FDperform_init(H5FD_splitter_init)) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + +/** ID for the splitter VFD */ +#define H5FD_SPLITTER (H5OPEN H5FD_SPLITTER_id_g) /** Identifier for the splitter VFD */ #define H5FD_SPLITTER_VALUE H5_VFD_SPLITTER @@ -61,9 +64,9 @@ extern "C" { /** @private * - * \brief Private initializer for the splitter VFD + * \brief ID for the splitter VFD */ -H5_DLL hid_t H5FD_splitter_init(void); +H5_DLLVAR hid_t H5FD_SPLITTER_id_g; /** * \ingroup FAPL diff --git a/src/H5FDstdio.c b/src/H5FDstdio.c index b53dd3dc1ad..9de221120ef 100644 --- a/src/H5FDstdio.c +++ b/src/H5FDstdio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -47,8 +47,10 @@ #endif /* H5_HAVE_WIN32_API */ -/* The driver identification number, initialized at runtime */ -static hid_t H5FD_STDIO_g = 0; +/* Flag to indicate whether global driver resources & settings have been + * initialized. + */ +static bool H5FD_stdio_init_s = false; /* Whether to ignore file locks when disabled (env var value) */ static htri_t ignore_disabled_file_locks_s = -1; @@ -117,50 +119,48 @@ typedef struct H5FD_stdio_t { #endif /* H5_HAVE_WIN32_API */ } H5FD_stdio_t; -/* Use similar structure as in H5private.h by defining Windows stuff first. */ +/* Platform-independent names for some file-oriented functions */ + #ifdef H5_HAVE_WIN32_API -#ifndef H5_HAVE_MINGW -#define file_fseek _fseeki64 -#define file_offset_t __int64 -#define file_ftruncate _chsize_s /* Supported in VS 2005 or newer */ -#define file_ftell _ftelli64 -#endif /* H5_HAVE_MINGW */ -#endif /* H5_HAVE_WIN32_API */ +/* Windows and MinGW */ +#define file_ftell _ftelli64 +#else +/* Everyone else */ +#define file_ftell ftello +#endif -/* If these functions weren't re-defined for Windows, give them - * more platform-independent names. - */ -#ifndef file_fseek +#if defined(H5_HAVE_WIN32_API) && !defined(H5_HAVE_MINGW) +/* Windows (but NOT MinGW) */ +#define file_fseek _fseeki64 +#define file_ftruncate _chsize_s +#else +/* Everyone else */ #define file_fseek fseeko -#define file_offset_t off_t #define file_ftruncate ftruncate -#define file_ftell ftello -#endif /* file_fseek */ +#endif /* These macros check for overflow of various quantities. These macros - * assume that file_offset_t is signed and haddr_t and size_t are unsigned. + * assume that HDoff_t is signed and haddr_t and size_t are unsigned. * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. + * MY_ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' + * is too large to be represented by the second argument + * of the file seek function. * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. + * MY_SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too + * large to be represented by the `size_t' type. * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. + * MY_REGION_OVERFLOW: Checks whether an address and size pair describe data + * which can be addressed entirely by the second + * argument of the file seek function. */ -/* adding for windows NT filesystem support. */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(file_offset_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) -#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || \ - (file_offset_t)((A) + (Z)) < (file_offset_t)(A)) +#define MY_MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) +#define MY_ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MY_MAXADDR)) +#define MY_SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MY_MAXADDR) +#define MY_REGION_OVERFLOW(A, Z) \ + (MY_ADDR_OVERFLOW(A) || MY_SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || \ + (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) /* Prototypes */ -static herr_t H5FD_stdio_term(void); static H5FD_t *H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr); static herr_t H5FD_stdio_close(H5FD_t *lf); static int H5FD_stdio_cmp(const H5FD_t *_f1, const H5FD_t *_f2); @@ -180,13 +180,13 @@ static herr_t H5FD_stdio_lock(H5FD_t *_file, bool rw); static herr_t H5FD_stdio_unlock(H5FD_t *_file); static herr_t H5FD_stdio_delete(const char *filename, hid_t fapl_id); -static const H5FD_class_t H5FD_stdio_g = { +const H5FD_class_t H5FD_stdio_g = { H5FD_CLASS_VERSION, /* struct version */ H5_VFD_STDIO, /* value */ "stdio", /* name */ - MAXADDR, /* maxaddr */ + MY_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ - H5FD_stdio_term, /* terminate */ + NULL, /* terminate */ NULL, /* sb_size */ NULL, /* sb_encode */ NULL, /* sb_decode */ @@ -224,25 +224,19 @@ static const H5FD_class_t H5FD_stdio_g = { }; /*------------------------------------------------------------------------- - * Function: H5FD_stdio_init + * Function: H5FD__stdio_init * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Singleton to initialize global driver settings & resources. * - * Return: Success: The driver ID for the stdio driver. - * - * Failure: Negative. + * Return: Non-negative on success/Negative on failure * *------------------------------------------------------------------------- */ -hid_t -H5FD_stdio_init(void) +static herr_t +H5FD__stdio_init(void) { char *lock_env_var = NULL; /* Environment variable pointer */ - /* Clear the error stack */ - H5Eclear2(H5E_DEFAULT); - /* Check the use disabled file locks environment variable */ lock_env_var = getenv(HDF5_USE_FILE_LOCKING); if (lock_env_var && !strcmp(lock_env_var, "BEST_EFFORT")) @@ -252,29 +246,11 @@ H5FD_stdio_init(void) else ignore_disabled_file_locks_s = -1; /* Environment variable not set, or not set correctly */ - if (H5I_VFL != H5Iget_type(H5FD_STDIO_g)) - H5FD_STDIO_g = H5FDregister(&H5FD_stdio_g); - - return H5FD_STDIO_g; -} /* end H5FD_stdio_init() */ - -/*--------------------------------------------------------------------------- - * Function: H5FD_stdio_term - * - * Purpose: Shut down the VFD - * - * Returns: Non-negative on success or negative on failure - * - *--------------------------------------------------------------------------- - */ -static herr_t -H5FD_stdio_term(void) -{ - /* Reset VFL ID */ - H5FD_STDIO_g = 0; + /* Indicate that driver is set up */ + H5FD_stdio_init_s = true; return 0; -} /* end H5FD_stdio_term() */ +} /* end H5FD__stdio_init() */ /*------------------------------------------------------------------------- * Function: H5Pset_fapl_stdio @@ -290,13 +266,12 @@ H5FD_stdio_term(void) herr_t H5Pset_fapl_stdio(hid_t fapl_id) { - static const char *func = "H5FDset_fapl_stdio"; /*for error reporting*/ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); if (0 == H5Pisa_class(fapl_id, H5P_FILE_ACCESS)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_PLIST, H5E_BADTYPE, "not a file access property list", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_PLIST, H5E_BADTYPE, "not a file access property list", -1); return H5Pset_driver(fapl_id, H5FD_STDIO, NULL); } /* end H5Pset_fapl_stdio() */ @@ -325,10 +300,9 @@ H5Pset_fapl_stdio(hid_t fapl_id) static H5FD_t * H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) { - FILE *f = NULL; - unsigned write_access = 0; /* File opened with write access? */ - H5FD_stdio_t *file = NULL; - static const char *func = "H5FD_stdio_open"; /* Function Name for error reporting */ + FILE *f = NULL; + unsigned write_access = 0; /* File opened with write access? */ + H5FD_stdio_t *file = NULL; #ifdef H5_HAVE_WIN32_API struct _BY_HANDLE_FILE_INFORMATION fileinfo; #else /* H5_HAVE_WIN32_API */ @@ -336,7 +310,7 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr #endif /* H5_HAVE_WIN32_API */ /* Sanity check on file offsets */ - assert(sizeof(file_offset_t) >= sizeof(size_t)); + assert(sizeof(HDoff_t) >= sizeof(size_t)); /* Quiet compiler */ (void)fapl_id; @@ -344,13 +318,18 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); + /* Initialize driver, if it's not yet */ + if (!H5FD_stdio_init_s) + if (H5FD__stdio_init() < 0) + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTINIT, "can't initialize driver", NULL); + /* Check arguments */ if (!name || !*name) - H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADVALUE, "invalid file name", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_ARGS, H5E_BADVALUE, "invalid file name", NULL); if (0 == maxaddr || HADDR_UNDEF == maxaddr) - H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_BADRANGE, "bogus maxaddr", NULL); - if (ADDR_OVERFLOW(maxaddr)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_ARGS, H5E_OVERFLOW, "maxaddr too large", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_ARGS, H5E_BADRANGE, "bogus maxaddr", NULL); + if (MY_ADDR_OVERFLOW(maxaddr)) + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_ARGS, H5E_OVERFLOW, "maxaddr too large", NULL); /* Tentatively open file in read-only mode, to check for existence */ if (flags & H5F_ACC_RDWR) @@ -366,14 +345,14 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr write_access = 1; /* Note the write access */ } else - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_CANTOPENFILE, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_CANTOPENFILE, "file doesn't exist and CREAT wasn't specified", NULL); } else if (flags & H5F_ACC_EXCL) { /* File exists, but EXCL is passed. Fail. */ assert(flags & H5F_ACC_CREAT); fclose(f); - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_FILEEXISTS, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_FILEEXISTS, "file exists but CREAT and EXCL were specified", NULL); } else if (flags & H5F_ACC_RDWR) { @@ -385,22 +364,22 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr * as the tentative open will work */ if (!f) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_CANTOPENFILE, "fopen failed", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_CANTOPENFILE, "fopen failed", NULL); /* Build the return value */ if (NULL == (file = (H5FD_stdio_t *)calloc((size_t)1, sizeof(H5FD_stdio_t)))) { fclose(f); - H5Epush_ret(func, H5E_ERR_CLS, H5E_RESOURCE, H5E_NOSPACE, "memory allocation failed", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_RESOURCE, H5E_NOSPACE, "memory allocation failed", NULL); } /* end if */ file->fp = f; file->op = H5FD_STDIO_OP_SEEK; file->pos = HADDR_UNDEF; file->write_access = write_access; /* Note the write_access for later */ - if (file_fseek(file->fp, (file_offset_t)0, SEEK_END) < 0) { + if (file_fseek(file->fp, 0, SEEK_END) < 0) { file->op = H5FD_STDIO_OP_UNKNOWN; } else { - file_offset_t x = file_ftell(file->fp); + HDoff_t x = file_ftell(file->fp); assert(x >= 0); file->eof = (haddr_t)x; } @@ -416,7 +395,7 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr if (H5Pget_file_locking(fapl_id, &unused, &file->ignore_disabled_file_locks) < 0) { free(file); fclose(f); - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTGET, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTGET, "unable to get use disabled file locks property", NULL); } } @@ -430,7 +409,7 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr if (file->fd < 0) { free(file); fclose(f); - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get file descriptor", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get file descriptor", NULL); } /* end if */ #ifdef H5_HAVE_WIN32_API @@ -438,13 +417,14 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr if (INVALID_HANDLE_VALUE == file->hFile) { free(file); fclose(f); - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get Windows file handle", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get Windows file handle", + NULL); } /* end if */ if (!GetFileInformationByHandle((HANDLE)file->hFile, &fileinfo)) { free(file); fclose(f); - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_CANTOPENFILE, "unable to get Windows file descriptor information", NULL); } /* end if */ @@ -455,7 +435,7 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr if (fstat(file->fd, &sb) < 0) { free(file); fclose(f); - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_BADFILE, "unable to fstat file", NULL); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_BADFILE, "unable to fstat file", NULL); } /* end if */ file->device = sb.st_dev; file->inode = sb.st_ino; @@ -479,14 +459,13 @@ H5FD_stdio_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr static herr_t H5FD_stdio_close(H5FD_t *_file) { - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; - static const char *func = "H5FD_stdio_close"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); if (fclose(file->fp) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_CLOSEERROR, "fclose failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_CLOSEERROR, "fclose failed", -1); free(file); @@ -727,8 +706,7 @@ H5FD_stdio_get_eof(const H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type) static herr_t H5FD_stdio_get_handle(H5FD_t *_file, hid_t /*UNUSED*/ fapl, void **file_handle) { - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; - static const char *func = "H5FD_stdio_get_handle"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* Quiet the compiler */ (void)fapl; @@ -738,7 +716,7 @@ H5FD_stdio_get_handle(H5FD_t *_file, hid_t /*UNUSED*/ fapl, void **file_handle) *file_handle = &(file->fp); if (*file_handle == NULL) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "get handle failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "get handle failed", -1); return 0; } /* end H5FD_stdio_get_handle() */ @@ -762,8 +740,7 @@ static herr_t H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl_id, haddr_t addr, size_t size, void /*OUT*/ *buf) { - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; - static const char *func = "H5FD_stdio_read"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* Quiet the compiler */ (void)type; @@ -774,9 +751,9 @@ H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl /* Check for overflow */ if (HADDR_UNDEF == addr) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); - if (REGION_OVERFLOW(addr, size)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); + if (MY_REGION_OVERFLOW(addr, size)) + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); /* Check easy cases */ if (0 == size) @@ -788,10 +765,10 @@ H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl /* Seek to the correct file position. */ if (!(file->op == H5FD_STDIO_OP_READ || file->op == H5FD_STDIO_OP_SEEK) || file->pos != addr) { - if (file_fseek(file->fp, (file_offset_t)addr, SEEK_SET) < 0) { + if (file_fseek(file->fp, (HDoff_t)addr, SEEK_SET) < 0) { file->op = H5FD_STDIO_OP_UNKNOWN; file->pos = HADDR_UNDEF; - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "fseek failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "fseek failed", -1); } file->pos = addr; } @@ -823,7 +800,7 @@ H5FD_stdio_read(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl if (0 == bytes_read && ferror(file->fp)) { /* error */ file->op = H5FD_STDIO_OP_UNKNOWN; file->pos = HADDR_UNDEF; - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_READERROR, "fread failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_READERROR, "fread failed", -1); } /* end if */ if (0 == bytes_read && feof(file->fp)) { @@ -862,8 +839,7 @@ static herr_t H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxpl_id, haddr_t addr, size_t size, const void *buf) { - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; - static const char *func = "H5FD_stdio_write"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* Quiet the compiler */ (void)dxpl_id; @@ -874,16 +850,16 @@ H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxp /* Check for overflow conditions */ if (HADDR_UNDEF == addr) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); - if (REGION_OVERFLOW(addr, size)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); + if (MY_REGION_OVERFLOW(addr, size)) + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_OVERFLOW, "file address overflowed", -1); /* Seek to the correct file position. */ if ((file->op != H5FD_STDIO_OP_WRITE && file->op != H5FD_STDIO_OP_SEEK) || file->pos != addr) { - if (file_fseek(file->fp, (file_offset_t)addr, SEEK_SET) < 0) { + if (file_fseek(file->fp, (HDoff_t)addr, SEEK_SET) < 0) { file->op = H5FD_STDIO_OP_UNKNOWN; file->pos = HADDR_UNDEF; - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "fseek failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "fseek failed", -1); } file->pos = addr; } @@ -908,7 +884,7 @@ H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxp if (bytes_wrote != bytes_in || (0 == bytes_wrote && ferror(file->fp))) { /* error */ file->op = H5FD_STDIO_OP_UNKNOWN; file->pos = HADDR_UNDEF; - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fwrite failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fwrite failed", -1); } /* end if */ assert(bytes_wrote > 0); @@ -946,8 +922,7 @@ H5FD_stdio_write(H5FD_t *_file, H5FD_mem_t /*UNUSED*/ type, hid_t /*UNUSED*/ dxp static herr_t H5FD_stdio_flush(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, bool closing) { - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; - static const char *func = "H5FD_stdio_flush"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* Quiet the compiler */ (void)dxpl_id; @@ -959,7 +934,7 @@ H5FD_stdio_flush(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, bool closing) if (file->write_access) { if (!closing) { if (fflush(file->fp) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1); /* Reset last file I/O information */ file->pos = HADDR_UNDEF; @@ -987,8 +962,7 @@ H5FD_stdio_flush(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, bool closing) static herr_t H5FD_stdio_truncate(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, bool /*UNUSED*/ closing) { - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; - static const char *func = "H5FD_stdio_truncate"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* Quiet the compiler */ (void)dxpl_id; @@ -1025,20 +999,21 @@ H5FD_stdio_truncate(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, bool /*UNUSED*/ clo if (INVALID_SET_FILE_POINTER == dwPtrLow) { dwError = GetLastError(); if (dwError != NO_ERROR) - H5Epush_ret(func, H5E_ERR_CLS, H5E_FILE, H5E_FILEOPEN, "unable to set file pointer", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_FILE, H5E_FILEOPEN, "unable to set file pointer", + -1); } bError = SetEndOfFile(file->hFile); if (0 == bError) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "unable to truncate/extend file properly", -1); #else /* H5_HAVE_WIN32_API */ /* Reset seek offset to beginning of file, so that file isn't re-extended later */ rewind(file->fp); /* Truncate file to proper length */ - if (-1 == file_ftruncate(file->fd, (file_offset_t)file->eoa)) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, + if (-1 == file_ftruncate(file->fd, (HDoff_t)file->eoa)) + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_SEEKERROR, "unable to truncate/extend file properly", -1); #endif /* H5_HAVE_WIN32_API */ @@ -1053,7 +1028,7 @@ H5FD_stdio_truncate(H5FD_t *_file, hid_t /*UNUSED*/ dxpl_id, bool /*UNUSED*/ clo else { /* Double-check for problems */ if (file->eoa > file->eof) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_TRUNCATED, "eoa > eof!", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_TRUNCATED, "eoa > eof!", -1); } /* end else */ return 0; @@ -1076,9 +1051,8 @@ static herr_t H5FD_stdio_lock(H5FD_t *_file, bool rw) { #ifdef H5_HAVE_FLOCK - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* VFD file struct */ - int lock_flags; /* file locking flags */ - static const char *func = "H5FD_stdio_lock"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* VFD file struct */ + int lock_flags; /* file locking flags */ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1096,12 +1070,12 @@ H5FD_stdio_lock(H5FD_t *_file, bool rw) */ errno = 0; else - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTLOCKFILE, "file lock failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTLOCKFILE, "file lock failed", -1); } /* end if */ /* Flush the stream */ if (fflush(file->fp) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1); #endif /* H5_HAVE_FLOCK */ @@ -1125,8 +1099,7 @@ static herr_t H5FD_stdio_unlock(H5FD_t *_file) { #ifdef H5_HAVE_FLOCK - H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* VFD file struct */ - static const char *func = "H5FD_stdio_unlock"; /* Function Name for error reporting */ + H5FD_stdio_t *file = (H5FD_stdio_t *)_file; /* VFD file struct */ /* Clear the error stack */ H5Eclear2(H5E_DEFAULT); @@ -1135,7 +1108,7 @@ H5FD_stdio_unlock(H5FD_t *_file) /* Flush the stream */ if (fflush(file->fp) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_IO, H5E_WRITEERROR, "fflush failed", -1); /* Place a non-blocking lock on the file */ if (flock(file->fd, LOCK_UN) < 0) { @@ -1145,7 +1118,7 @@ H5FD_stdio_unlock(H5FD_t *_file) */ errno = 0; else - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTUNLOCKFILE, "file unlock failed", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTUNLOCKFILE, "file unlock failed", -1); } /* end if */ #endif /* H5_HAVE_FLOCK */ @@ -1165,18 +1138,22 @@ H5FD_stdio_unlock(H5FD_t *_file) static herr_t H5FD_stdio_delete(const char *filename, hid_t /*UNUSED*/ fapl_id) { - static const char *func = "H5FD_stdio_delete"; /* Function Name for error reporting */ - - /* Clear the error stack */ - H5Eclear2(H5E_DEFAULT); assert(filename); /* Quiet compiler */ (void)fapl_id; + /* Clear the error stack */ + H5Eclear2(H5E_DEFAULT); + + /* Initialize driver, if it's not yet */ + if (!H5FD_stdio_init_s) + if (H5FD__stdio_init() < 0) + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTINIT, "can't initialize driver", -1); + if (remove(filename) < 0) - H5Epush_ret(func, H5E_ERR_CLS, H5E_VFL, H5E_CANTDELETEFILE, "can't delete file)", -1); + H5Epush_ret(__func__, H5E_ERR_CLS, H5E_VFL, H5E_CANTDELETEFILE, "can't delete file)", -1); return 0; } /* end H5FD_stdio_delete() */ diff --git a/src/H5FDstdio.h b/src/H5FDstdio.h index 794fe31bf61..087a2e5cbe3 100644 --- a/src/H5FDstdio.h +++ b/src/H5FDstdio.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,10 +16,11 @@ #ifndef H5FDstdio_H #define H5FDstdio_H -#include "H5Ipublic.h" +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ -/** Initializer for the stdio VFD */ -#define H5FD_STDIO (H5FDperform_init(H5FD_stdio_init)) +/** ID for the stdio VFD */ +#define H5FD_STDIO (H5OPEN H5FD_STDIO_id_g) #ifdef __cplusplus extern "C" { @@ -27,9 +28,9 @@ extern "C" { /** @private * - * \brief Private initializer for the stdio VFD + * \brief ID for the stdio VFD */ -H5_DLL hid_t H5FD_stdio_init(void); +H5_DLLVAR hid_t H5FD_STDIO_id_g; /** * \ingroup FAPL diff --git a/src/H5FDstdio_int.c b/src/H5FDstdio_int.c new file mode 100644 index 00000000000..1f8cb63324c --- /dev/null +++ b/src/H5FDstdio_int.c @@ -0,0 +1,83 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Purpose: Private routines for the stdio VFD. + * + * Necessary for using internal library routines, which are + * disallowed within the actual stdio VFD code. + * + */ + +/****************/ +/* Module Setup */ +/****************/ + +#define H5FD_FRIEND /* Suppress error about including H5FDpkg */ + +/***********/ +/* Headers */ +/***********/ + +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5FDpkg.h" /* File drivers */ + +#include "H5FDstdio_private.h" /* stdio VFD */ + +/* The driver identification number, initialized at runtime */ +hid_t H5FD_STDIO_id_g = H5I_INVALID_HID; + +/*------------------------------------------------------------------------- + * Function: H5FD__stdio_register + * + * Purpose: Register the driver with the library. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ +herr_t +H5FD__stdio_register(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + + if (H5I_VFL != H5I_get_type(H5FD_STDIO_id_g)) + if ((H5FD_STDIO_id_g = H5FD_register(&H5FD_stdio_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "unable to register stdio driver"); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD__stdio_register() */ + +/*--------------------------------------------------------------------------- + * Function: H5FD_stdio_unregister + * + * Purpose: Reset library driver info. + * + * Returns: SUCCEED (Can't fail) + * + *--------------------------------------------------------------------------- + */ +herr_t +H5FD__stdio_unregister(void) +{ + FUNC_ENTER_PACKAGE_NOERR + + /* Reset VFL ID */ + H5FD_STDIO_id_g = H5I_INVALID_HID; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5FD_stdio_unregister() */ diff --git a/src/H5FDdrvr_module.h b/src/H5FDstdio_private.h similarity index 53% rename from src/H5FDdrvr_module.h rename to src/H5FDstdio_private.h index c984cf51004..af65eeb8f44 100644 --- a/src/H5FDdrvr_module.h +++ b/src/H5FDstdio_private.h @@ -11,17 +11,35 @@ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ /* - * Purpose: This file contains declarations which define macros for the - * H5FD driver package. Including this header means that the source file - * is part of the H5FD driver package. + * Purpose: The private header file for the stdio VFD */ -#ifndef H5FDdrvr_module_H -#define H5FDdrvr_module_H -/* Define the proper control macros for the generic FUNC_ENTER/LEAVE and error - * reporting macros. - */ -#define H5_MY_PKG H5FD -#define H5_MY_PKG_ERR H5E_FILE +#ifndef H5FDstdio_private_H +#define H5FDstdio_private_H + +/* Include VFD's public header */ +#include "H5FDstdio.h" /* stdio VFD */ + +/* Private headers needed by this file */ +#include "H5FDprivate.h" /* File drivers */ + +/**************************/ +/* Library Private Macros */ +/**************************/ + +/****************************/ +/* Library Private Typedefs */ +/****************************/ + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + +/* stdio VFD's class struct */ +H5_DLLVAR const H5FD_class_t H5FD_stdio_g; + +/******************************/ +/* Library Private Prototypes */ +/******************************/ -#endif /* H5FDdrvr_module_H */ +#endif /* H5FDstdio_private_H */ diff --git a/src/H5FDsubfiling/H5FDioc.c b/src/H5FDsubfiling/H5FDioc.c index 8ec066a0a68..e1c61883169 100644 --- a/src/H5FDsubfiling/H5FDioc.c +++ b/src/H5FDsubfiling/H5FDioc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,27 +16,29 @@ * another underlying VFD. Maintains two files simultaneously. */ -/* This source code file is part of the H5FD driver module */ -#include "H5FDdrvr_module.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ -#include "H5FDpublic.h" /* Basic H5FD definitions */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDioc.h" /* IOC file driver */ -#include "H5FDioc_priv.h" /* IOC file driver */ +#include "H5Fprivate.h" /* File access */ +#include "H5FDpkg.h" /* File drivers */ +#include "H5FDioc_priv.h" /* I/O concetrator file driver */ #include "H5FDmpio.h" /* MPI I/O VFD */ #include "H5FLprivate.h" /* Free Lists */ -#include "H5Fprivate.h" /* File access */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_IOC_g = H5I_INVALID_HID; +hid_t H5FD_IOC_id_g = H5I_INVALID_HID; + +/* Flag to indicate whether global driver resources & settings have been + * initialized. + */ +static bool H5FD_ioc_init_s = false; /* Whether the driver initialized MPI on its own */ -static bool H5FD_mpi_self_initialized = false; +static bool H5FD_mpi_self_initialized_s = false; /* Pointer to value for MPI_TAG_UB */ int *H5FD_IOC_tag_ub_val_ptr = NULL; @@ -67,27 +69,6 @@ typedef struct H5FD_ioc_t { char *file_path; /* The user defined filename */ } H5FD_ioc_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. - * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) -#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) - /* Private functions */ /* Prototypes */ static herr_t H5FD__ioc_term(void); @@ -113,7 +94,7 @@ static herr_t H5FD__ioc_read_vector(H5FD_t *file, hid_t dxpl_id, uint32_t count static herr_t H5FD__ioc_write_vector(H5FD_t *file, hid_t dxpl_id, uint32_t count, H5FD_mem_t types[], haddr_t addrs[], size_t sizes[], const void *bufs[] /* in */); static herr_t H5FD__ioc_truncate(H5FD_t *_file, hid_t dxpl_id, bool closing); -static herr_t H5FD__ioc_del(const char *name, hid_t fapl); +static herr_t H5FD__ioc_delete(const char *name, hid_t fapl); /* static herr_t H5FD__ioc_ctl(H5FD_t *file, uint64_t op_code, uint64_t flags, const void *input, void **result); @@ -133,7 +114,7 @@ static const H5FD_class_t H5FD_ioc_g = { H5FD_CLASS_VERSION, /* VFD interface version */ H5_VFD_IOC, /* value */ H5FD_IOC_NAME, /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ H5FD__ioc_term, /* terminate */ H5FD__ioc_sb_size, /* sb_size */ @@ -167,7 +148,7 @@ static const H5FD_class_t H5FD_ioc_g = { H5FD__ioc_truncate, /* truncate */ NULL, /* lock */ NULL, /* unlock */ - H5FD__ioc_del, /* del */ + H5FD__ioc_delete, /* del */ NULL, /* ctl */ H5FD_FLMAP_DICHOTOMY /* fl_map */ }; @@ -179,77 +160,112 @@ H5FL_DEFINE_STATIC(H5FD_ioc_t); H5FL_DEFINE_STATIC(H5FD_ioc_config_t); /*------------------------------------------------------------------------- - * Function: H5FD_ioc_init + * Function: H5FD__ioc_register * - * Purpose: Initialize the IOC driver by registering it with the - * library. + * Purpose: Register the driver with the library. + * + * Return: SUCCEED/FAIL * - * Return: Success: The driver ID for the ioc driver. - * Failure: Negative *------------------------------------------------------------------------- */ -hid_t -H5FD_ioc_init(void) +herr_t +H5FD__ioc_register(void) { - hid_t ret_value = H5I_INVALID_HID; + herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI(H5I_INVALID_HID) + FUNC_ENTER_PACKAGE /* Register the IOC VFD, if it isn't already registered */ - if (H5I_VFL != H5I_get_type(H5FD_IOC_g)) { - char *env_var; - int key_val_retrieved = 0; - int mpi_code; - - if ((H5FD_IOC_g = H5FD_register(&H5FD_ioc_g, sizeof(H5FD_class_t), false)) < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, H5I_INVALID_HID, "can't register IOC VFD"); - - /* Check if IOC VFD has been loaded dynamically */ - env_var = getenv(HDF5_DRIVER); - if (env_var && strlen(env_var) > 0 && !strcmp(env_var, H5FD_IOC_NAME)) { - int mpi_initialized = 0; - int provided = 0; - - /* Initialize MPI if not already initialized */ - if (MPI_SUCCESS != (mpi_code = MPI_Initialized(&mpi_initialized))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Initialized failed", mpi_code); - if (mpi_initialized) { - /* If MPI is initialized, validate that it was initialized with MPI_THREAD_MULTIPLE */ - if (MPI_SUCCESS != (mpi_code = MPI_Query_thread(&provided))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Query_thread failed", mpi_code); - if (provided != MPI_THREAD_MULTIPLE) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, H5I_INVALID_HID, - "IOC VFD requires the use of MPI_Init_thread with MPI_THREAD_MULTIPLE"); - } - else { - int required = MPI_THREAD_MULTIPLE; - - /* Otherwise, initialize MPI */ - if (MPI_SUCCESS != (mpi_code = MPI_Init_thread(NULL, NULL, required, &provided))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Init_thread failed", mpi_code); - - H5FD_mpi_self_initialized = true; - - if (provided != required) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, H5I_INVALID_HID, - "MPI doesn't support MPI_Init_thread with MPI_THREAD_MULTIPLE"); - } + if (H5I_VFL != H5I_get_type(H5FD_IOC_id_g)) + if ((H5FD_IOC_id_g = H5FD_register(&H5FD_ioc_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "can't register IOC VFD"); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD__ioc_register() */ + +/*--------------------------------------------------------------------------- + * Function: H5FD__ioc_unregister + * + * Purpose: Reset library driver info. + * + * Return: SUCCEED/FAIL + * + *--------------------------------------------------------------------------- + */ +herr_t +H5FD__ioc_unregister(void) +{ + FUNC_ENTER_PACKAGE_NOERR + + /* Reset VFL ID */ + H5FD_IOC_id_g = H5I_INVALID_HID; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5FD__ioc_unregister() */ + +/*------------------------------------------------------------------------- + * Function: H5FD__ioc_init + * + * Purpose: Singleton to initialize global driver settings & resources. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +static herr_t +H5FD__ioc_init(void) +{ + char *env_var; + int key_val_retrieved = 0; + int mpi_code; + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + + /* Check if IOC VFD has been loaded dynamically */ + env_var = getenv(HDF5_DRIVER); + if (env_var && strlen(env_var) > 0 && !strcmp(env_var, H5FD_IOC_NAME)) { + int mpi_initialized = 0; + int provided = 0; + + /* Initialize MPI if not already initialized */ + if (MPI_SUCCESS != (mpi_code = MPI_Initialized(&mpi_initialized))) + HMPI_GOTO_ERROR(FAIL, "MPI_Initialized failed", mpi_code); + if (mpi_initialized) { + /* If MPI is initialized, validate that it was initialized with MPI_THREAD_MULTIPLE */ + if (MPI_SUCCESS != (mpi_code = MPI_Query_thread(&provided))) + HMPI_GOTO_ERROR(FAIL, "MPI_Query_thread failed", mpi_code); + if (provided != MPI_THREAD_MULTIPLE) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, + "IOC VFD requires the use of MPI_Init_thread with MPI_THREAD_MULTIPLE"); } + else { + /* Otherwise, initialize MPI */ + if (MPI_SUCCESS != (mpi_code = MPI_Init_thread(NULL, NULL, MPI_THREAD_MULTIPLE, &provided))) + HMPI_GOTO_ERROR(FAIL, "MPI_Init_thread failed", mpi_code); - /* Retrieve upper bound for MPI message tag value */ - if (MPI_SUCCESS != (mpi_code = MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &H5FD_IOC_tag_ub_val_ptr, - &key_val_retrieved))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Comm_get_attr failed", mpi_code); + H5FD_mpi_self_initialized_s = true; - if (!key_val_retrieved) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, H5I_INVALID_HID, "couldn't retrieve value for MPI_TAG_UB"); + if (provided != MPI_THREAD_MULTIPLE) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, + "MPI doesn't support MPI_Init_thread with MPI_THREAD_MULTIPLE"); + } } - ret_value = H5FD_IOC_g; + /* Retrieve upper bound for MPI message tag value */ + if (MPI_SUCCESS != (mpi_code = MPI_Comm_get_attr(MPI_COMM_WORLD, MPI_TAG_UB, &H5FD_IOC_tag_ub_val_ptr, + &key_val_retrieved))) + HMPI_GOTO_ERROR(FAIL, "MPI_Comm_get_attr failed", mpi_code); + if (!key_val_retrieved) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "couldn't retrieve value for MPI_TAG_UB"); + + /* Indicate that driver is set up */ + H5FD_ioc_init_s = true; done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_ioc_init() */ +} /* end H5FD__ioc_init() */ /*--------------------------------------------------------------------------- * Function: H5FD__ioc_term @@ -257,6 +273,7 @@ H5FD_ioc_init(void) * Purpose: Shut down the IOC VFD. * * Return: SUCCEED/FAIL + * *--------------------------------------------------------------------------- */ static herr_t @@ -266,26 +283,21 @@ H5FD__ioc_term(void) FUNC_ENTER_PACKAGE - if (H5FD_IOC_g >= 0) { - /* Terminate MPI if the driver initialized it */ - if (H5FD_mpi_self_initialized) { - int mpi_finalized = 0; - int mpi_code; + /* Terminate MPI if the driver initialized it */ + if (H5FD_mpi_self_initialized_s) { + int mpi_finalized = 0; + int mpi_code; - if (MPI_SUCCESS != (mpi_code = MPI_Finalized(&mpi_finalized))) - HMPI_GOTO_ERROR(FAIL, "MPI_Finalized failed", mpi_code); - if (!mpi_finalized) - if (MPI_SUCCESS != (mpi_code = MPI_Finalize())) - HMPI_GOTO_ERROR(FAIL, "MPI_Finalize failed", mpi_code); + if (MPI_SUCCESS != (mpi_code = MPI_Finalized(&mpi_finalized))) + HMPI_GOTO_ERROR(FAIL, "MPI_Finalized failed", mpi_code); + if (!mpi_finalized) + if (MPI_SUCCESS != (mpi_code = MPI_Finalize())) + HMPI_GOTO_ERROR(FAIL, "MPI_Finalize failed", mpi_code); - H5FD_mpi_self_initialized = false; - } + H5FD_mpi_self_initialized_s = false; } done: - /* Reset VFL ID */ - H5FD_IOC_g = H5I_INVALID_HID; - FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__ioc_term() */ @@ -310,6 +322,11 @@ H5Pset_fapl_ioc(hid_t fapl_id, H5FD_ioc_config_t *vfd_config) if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); + /* Initialize driver, if it's not yet */ + if (!H5FD_ioc_init_s) + if (H5FD__ioc_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + if (vfd_config == NULL) { /* Get IOC VFD defaults */ if (H5FD__subfiling_get_default_ioc_config(&ioc_conf) < 0) @@ -355,6 +372,11 @@ H5Pget_fapl_ioc(hid_t fapl_id, H5FD_ioc_config_t *config_out) if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); + /* Initialize driver, if it's not yet */ + if (!H5FD_ioc_init_s) + if (H5FD__ioc_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + if (H5FD_IOC != H5P_peek_driver(plist)) use_default_config = true; else { @@ -676,9 +698,14 @@ H5FD__ioc_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); + /* Initialize driver, if it's not yet */ + if (!H5FD_ioc_init_s) + if (H5FD__ioc_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "can't initialize driver"); + if (NULL == (file = (H5FD_ioc_t *)H5FL_CALLOC(H5FD_ioc_t))) HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, NULL, "unable to allocate file struct"); file->comm = MPI_COMM_NULL; @@ -695,7 +722,7 @@ H5FD__ioc_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t maxaddr) if (NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list"); - if (H5FD_mpi_self_initialized) { + if (H5FD_mpi_self_initialized_s) { file->comm = MPI_COMM_WORLD; file->info = MPI_INFO_NULL; @@ -1062,7 +1089,7 @@ H5FD__ioc_read(H5FD_t *_file, H5FD_mem_t H5_ATTR_UNUSED type, hid_t H5_ATTR_UNUS /* Check for overflow conditions */ if (!H5_addr_defined(addr)) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr undefined, addr = %" PRIuHADDR, addr); - if (REGION_OVERFLOW(addr, size)) + if (H5FD_REGION_OVERFLOW(addr, size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr overflow, addr = %" PRIuHADDR, addr); if (H5FD__ioc_read_vector_internal(file, 1, &addr, &size, &buf) < 0) @@ -1192,8 +1219,17 @@ H5FD__ioc_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, bool H5_ATTR_UNU FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__ioc_truncate */ +/*------------------------------------------------------------------------- + * Function: H5FD__ioc_delete + * + * Purpose: Delete a file + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ static herr_t -H5FD__ioc_del(const char *name, hid_t fapl) +H5FD__ioc_delete(const char *name, hid_t fapl) { H5P_genplist_t *plist; MPI_Comm comm = MPI_COMM_NULL; @@ -1208,11 +1244,16 @@ H5FD__ioc_del(const char *name, hid_t fapl) FUNC_ENTER_PACKAGE + /* Initialize driver, if it's not yet */ + if (!H5FD_ioc_init_s) + if (H5FD__ioc_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + if (NULL == (plist = H5P_object_verify(fapl, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); assert(H5FD_IOC == H5P_peek_driver(plist)); - if (H5FD_mpi_self_initialized) + if (H5FD_mpi_self_initialized_s) comm = MPI_COMM_WORLD; else { /* Get the MPI communicator and info from the fapl */ @@ -1314,7 +1355,7 @@ H5FD__ioc_del(const char *name, hid_t fapl) HMPI_DONE_ERROR(FAIL, "MPI_Barrier failed", mpi_code); } - if (!H5FD_mpi_self_initialized) { + if (!H5FD_mpi_self_initialized_s) { /* Free duplicated MPI Communicator and Info objects */ if (H5_mpi_comm_free(&comm) < 0) HDONE_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "unable to free MPI communicator"); diff --git a/src/H5FDsubfiling/H5FDioc.h b/src/H5FDsubfiling/H5FDioc.h index 8f0255c5583..c9fe0d751ae 100644 --- a/src/H5FDsubfiling/H5FDioc.h +++ b/src/H5FDsubfiling/H5FDioc.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -20,14 +20,16 @@ #ifndef H5FDioc_H #define H5FDioc_H -#include "H5FDsubfiling.h" +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ #ifdef H5_HAVE_IOC_VFD + /** * \def H5FD_IOC * Macro that returns the identifier for the #H5FD_IOC driver. \hid_t{file driver} */ -#define H5FD_IOC (H5FDperform_init(H5FD_ioc_init)) +#define H5FD_IOC (H5OPEN H5FD_IOC_id_g) #else #define H5FD_IOC (H5I_INVALID_HID) #endif @@ -114,11 +116,12 @@ typedef struct H5FD_ioc_config_t { extern "C" { #endif -/** - * \brief Internal routine to initialize #H5FD_IOC driver. Not meant to be - * called directly by an HDF5 application +/** @private + * + * \brief ID for the IOC VFD */ -H5_DLL hid_t H5FD_ioc_init(void); +H5_DLLVAR hid_t H5FD_IOC_id_g; + /** * \ingroup FAPL * diff --git a/src/H5FDsubfiling/H5FDioc_int.c b/src/H5FDsubfiling/H5FDioc_int.c index e528a362f80..c334624726c 100644 --- a/src/H5FDsubfiling/H5FDioc_int.c +++ b/src/H5FDsubfiling/H5FDioc_int.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -14,7 +14,12 @@ * Purpose: This is part of an I/O concentrator driver. */ -#include "H5FDioc_priv.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FDpkg.h" /* File drivers */ +#include "H5FDioc_priv.h" /* I/O concetrator file driver */ /* * Given a file offset, the stripe size, the number of IOCs and the number of @@ -80,12 +85,12 @@ herr_t H5FD__ioc_write_independent_async(int64_t context_id, int64_t offset, int64_t elements, const void *data, io_req_t **io_req) { - subfiling_context_t *sf_context = NULL; - MPI_Request ack_request = MPI_REQUEST_NULL; - io_req_t *sf_io_request = NULL; - int64_t ioc_start; - int64_t ioc_offset; - int64_t ioc_subfile_idx; + subfiling_context_t *sf_context = NULL; + MPI_Request ack_request = MPI_REQUEST_NULL; + io_req_t *sf_io_request = NULL; + int64_t ioc_start = -1; + int64_t ioc_offset = -1; + int64_t ioc_subfile_idx = -1; int64_t msg[3] = {0}; int *io_concentrators = NULL; int num_io_concentrators; @@ -236,13 +241,13 @@ herr_t H5FD__ioc_read_independent_async(int64_t context_id, int64_t offset, int64_t elements, void *data, io_req_t **io_req) { - subfiling_context_t *sf_context = NULL; - MPI_Request ack_request = MPI_REQUEST_NULL; - io_req_t *sf_io_request = NULL; - bool need_data_tag = false; - int64_t ioc_start; - int64_t ioc_offset; - int64_t ioc_subfile_idx; + subfiling_context_t *sf_context = NULL; + MPI_Request ack_request = MPI_REQUEST_NULL; + io_req_t *sf_io_request = NULL; + bool need_data_tag = false; + int64_t ioc_start = -1; + int64_t ioc_offset = -1; + int64_t ioc_subfile_idx = -1; int64_t msg[3] = {0}; int *io_concentrators = NULL; int num_io_concentrators; diff --git a/src/H5FDsubfiling/H5FDioc_priv.h b/src/H5FDsubfiling/H5FDioc_priv.h index c1b47661de5..a506392a160 100644 --- a/src/H5FDsubfiling/H5FDioc_priv.h +++ b/src/H5FDsubfiling/H5FDioc_priv.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -21,16 +21,12 @@ /* H5 Headers */ /**************/ +/* Public header */ +#include "H5FDioc.h" /* IOC VFD */ + +/* Private headers */ #include "H5private.h" /* Generic Functions */ -#include "H5CXprivate.h" /* API Contexts */ -#include "H5Dprivate.h" /* Datasets */ -#include "H5Eprivate.h" /* Error handling */ -#include "H5FDioc.h" /* IOC VFD */ -#include "H5Iprivate.h" /* IDs */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5Pprivate.h" /* Property lists */ #include "H5TSprivate.h" /* Threadsafety */ - #include "H5subfiling_common.h" /* diff --git a/src/H5FDsubfiling/H5FDioc_threads.c b/src/H5FDsubfiling/H5FDioc_threads.c index da110e72bd7..21999a0ed9b 100644 --- a/src/H5FDsubfiling/H5FDioc_threads.c +++ b/src/H5FDsubfiling/H5FDioc_threads.c @@ -4,15 +4,18 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include "H5FDioc_priv.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ -#include "H5FDsubfiling.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FDpkg.h" /* File drivers */ +#include "H5FDioc_priv.h" /* I/O concetrator file driver */ #define MIN_READ_RETRIES 10 diff --git a/src/H5FDsubfiling/H5FDsubfile_int.c b/src/H5FDsubfiling/H5FDsubfile_int.c index bf01fc0a2e4..e073f5c8fdd 100644 --- a/src/H5FDsubfiling/H5FDsubfile_int.c +++ b/src/H5FDsubfiling/H5FDsubfile_int.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -19,7 +19,12 @@ /* Headers */ /***********/ -#include "H5FDsubfiling_priv.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FDpkg.h" /* File drivers */ +#include "H5FDsubfiling_priv.h" /* Subfiling file driver */ /*------------------------------------------------------------------------- * Function: H5FD__subfiling__truncate_sub_files diff --git a/src/H5FDsubfiling/H5FDsubfiling.c b/src/H5FDsubfiling/H5FDsubfiling.c index 159b7175589..8deb746cfa0 100644 --- a/src/H5FDsubfiling/H5FDsubfiling.c +++ b/src/H5FDsubfiling/H5FDsubfiling.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,27 +16,30 @@ * mirror, and family VFDs. */ -#include "H5FDdrvr_module.h" /* This source code file is part of the H5FD driver module */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ #include "H5private.h" /* Generic Functions */ #include "H5CXprivate.h" /* API contexts, etc. */ -#include "H5Dprivate.h" /* Dataset stuff */ #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDsubfiling.h" /* Subfiling file driver */ -#include "H5FDsubfiling_priv.h" /* Subfiling file driver */ +#include "H5Fprivate.h" /* File access */ +#include "H5FDpkg.h" /* File drivers */ #include "H5FDsec2.h" /* Sec2 VFD */ +#include "H5FDsubfiling_priv.h" /* Subfiling file driver */ #include "H5FLprivate.h" /* Free Lists */ -#include "H5Fprivate.h" /* File access */ #include "H5Iprivate.h" /* IDs */ #include "H5MMprivate.h" /* Memory management */ #include "H5Pprivate.h" /* Property lists */ /* The driver identification number, initialized at runtime */ -static hid_t H5FD_SUBFILING_g = H5I_INVALID_HID; +hid_t H5FD_SUBFILING_id_g = H5I_INVALID_HID; + +/* Flag to indicate whether global driver resources & settings have been + * initialized. + */ +static bool H5FD_subfiling_init_s = false; /* Whether the driver initialized MPI on its own */ -static bool H5FD_mpi_self_initialized = false; +static bool H5FD_mpi_self_initialized_s = false; /* The description of a file belonging to this driver. The 'eoa' and 'eof' * determine the amount of hdf5 address space in use and the high-water mark @@ -126,27 +129,6 @@ typedef enum H5FD_subfiling_io_type_t { IO_TYPE_READ, } H5FD_subfiling_io_type_t; -/* - * These macros check for overflow of various quantities. These macros - * assume that HDoff_t is signed and haddr_t and size_t are unsigned. - * - * ADDR_OVERFLOW: Checks whether a file address of type `haddr_t' - * is too large to be represented by the second argument - * of the file seek function. - * - * SIZE_OVERFLOW: Checks whether a buffer size of type `hsize_t' is too - * large to be represented by the `size_t' type. - * - * REGION_OVERFLOW: Checks whether an address and size pair describe data - * which can be addressed entirely by the second - * argument of the file seek function. - */ -#define MAXADDR (((haddr_t)1 << (8 * sizeof(HDoff_t) - 1)) - 1) -#define ADDR_OVERFLOW(A) (HADDR_UNDEF == (A) || ((A) & ~(haddr_t)MAXADDR)) -#define SIZE_OVERFLOW(Z) ((Z) & ~(hsize_t)MAXADDR) -#define REGION_OVERFLOW(A, Z) \ - (ADDR_OVERFLOW(A) || SIZE_OVERFLOW(Z) || HADDR_UNDEF == (A) + (Z) || (HDoff_t)((A) + (Z)) < (HDoff_t)(A)) - /* * NOTE: Must be kept in sync with the private * H5F_MAX_DRVINFOBLOCK_SIZE macro value for now @@ -178,7 +160,7 @@ static herr_t H5FD__subfiling_read_vector(H5FD_t *file, hid_t dxpl_id, uint32_t static herr_t H5FD__subfiling_write_vector(H5FD_t *file, hid_t dxpl_id, uint32_t count, H5FD_mem_t types[], haddr_t addrs[], size_t sizes[], const void *bufs[] /* in */); static herr_t H5FD__subfiling_truncate(H5FD_t *_file, hid_t dxpl_id, bool closing); -static herr_t H5FD__subfiling_del(const char *name, hid_t fapl); +static herr_t H5FD__subfiling_delete(const char *name, hid_t fapl); static herr_t H5FD__subfiling_ctl(H5FD_t *_file, uint64_t op_code, uint64_t flags, const void *input, void **output); @@ -238,13 +220,11 @@ static void H5_subfiling_dump_iovecs(subfiling_context_t *sf_context, size_t ior haddr_t *io_addrs, size_t *io_sizes, H5_flexible_const_ptr_t *io_bufs); #endif -void H5FD__subfiling_mpi_finalize(void); - static const H5FD_class_t H5FD_subfiling_g = { H5FD_CLASS_VERSION, /* VFD interface version */ H5_VFD_SUBFILING, /* value */ H5FD_SUBFILING_NAME, /* name */ - MAXADDR, /* maxaddr */ + H5FD_MAXADDR, /* maxaddr */ H5F_CLOSE_WEAK, /* fc_degree */ H5FD__subfiling_term, /* terminate */ H5FD__subfiling_sb_size, /* sb_size */ @@ -278,7 +258,7 @@ static const H5FD_class_t H5FD_subfiling_g = { H5FD__subfiling_truncate, /* truncate */ NULL, /* lock */ NULL, /* unlock */ - H5FD__subfiling_del, /* del */ + H5FD__subfiling_delete, /* del */ H5FD__subfiling_ctl, /* ctl */ H5FD_FLMAP_DICHOTOMY /* fl_map */ }; @@ -286,101 +266,110 @@ static const H5FD_class_t H5FD_subfiling_g = { /* Declare a free list to manage the H5FD_subfiling_t struct */ H5FL_DEFINE_STATIC(H5FD_subfiling_t); -/* - * If this VFD initialized MPI, this routine will be registered - * as an atexit handler in order to finalize MPI before the - * application exits. +/*------------------------------------------------------------------------- + * Function: H5FD__subfiling_register + * + * Purpose: Register the driver with the library. + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- */ -void -H5FD__subfiling_mpi_finalize(void) +herr_t +H5FD__subfiling_register(void) { - /* - * Don't call normal FUNC_ENTER() since we don't want to initialize the - * whole library just to release it all right away. It is safe to call - * this function for an uninitialized library. - */ - FUNC_ENTER_NOAPI_NOINIT_NOERR + herr_t ret_value = SUCCEED; /* Return value */ - H5_term_library(); - MPI_Finalize(); + FUNC_ENTER_PACKAGE - FUNC_LEAVE_NOAPI_VOID -} + /* Register the Subfiling VFD, if it isn't already registered */ + if (H5I_VFL != H5I_get_type(H5FD_SUBFILING_id_g)) + if ((H5FD_SUBFILING_id_g = H5FD_register(&H5FD_subfiling_g, sizeof(H5FD_class_t), false)) < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, FAIL, "can't register subfiling VFD"); -/*------------------------------------------------------------------------- - * Function: H5FD_subfiling_init +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FD__subfiling_register() */ + +/*--------------------------------------------------------------------------- + * Function: H5FD__subfiling_unregister * - * Purpose: Initialize this driver by registering the driver with the - * library. + * Purpose: Reset library driver info. * - * Return: Success: The driver ID for the subfiling driver - * Failure: H5I_INVALID_HID + * Returns: SUCCEED (Can't fail) * - *------------------------------------------------------------------------- + *--------------------------------------------------------------------------- */ -hid_t -H5FD_subfiling_init(void) +herr_t +H5FD__subfiling_unregister(void) { - hid_t ret_value = H5I_INVALID_HID; /* Return value */ + FUNC_ENTER_PACKAGE_NOERR - FUNC_ENTER_NOAPI(H5I_INVALID_HID) + /* Reset VFL ID */ + H5FD_SUBFILING_id_g = H5I_INVALID_HID; - /* Register the Subfiling VFD, if it isn't already registered */ - if (H5I_VFL != H5I_get_type(H5FD_SUBFILING_g)) { - int mpi_initialized = 0; - int provided = 0; - int mpi_code; - - if ((H5FD_SUBFILING_g = H5FD_register(&H5FD_subfiling_g, sizeof(H5FD_class_t), false)) < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTREGISTER, H5I_INVALID_HID, "can't register subfiling VFD"); - - /* Initialize MPI if not already initialized */ - if (MPI_SUCCESS != (mpi_code = MPI_Initialized(&mpi_initialized))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Initialized failed", mpi_code); - if (mpi_initialized) { - /* If MPI is initialized, validate that it was initialized with MPI_THREAD_MULTIPLE */ - if (MPI_SUCCESS != (mpi_code = MPI_Query_thread(&provided))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Query_thread failed", mpi_code); - if (provided != MPI_THREAD_MULTIPLE) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, H5I_INVALID_HID, - "Subfiling VFD requires the use of MPI_Init_thread with MPI_THREAD_MULTIPLE"); - } - else { - int required = MPI_THREAD_MULTIPLE; + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5FD__subfiling_unregister() */ + +/*------------------------------------------------------------------------- + * Function: H5FD__subfiling_init + * + * Purpose: Singleton to initialize global driver settings & resources. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +static herr_t +H5FD__subfiling_init(void) +{ + int mpi_initialized = 0; + int provided = 0; + int mpi_code; + herr_t ret_value = SUCCEED; /* Return value */ - if (MPI_SUCCESS != (mpi_code = MPI_Init_thread(NULL, NULL, required, &provided))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Init_thread failed", mpi_code); + FUNC_ENTER_PACKAGE - H5FD_mpi_self_initialized = true; + /* Initialize MPI if not already initialized */ + if (MPI_SUCCESS != (mpi_code = MPI_Initialized(&mpi_initialized))) + HMPI_GOTO_ERROR(FAIL, "MPI_Initialized failed", mpi_code); + if (mpi_initialized) { + /* If MPI is initialized, validate that it was initialized with MPI_THREAD_MULTIPLE */ + if (MPI_SUCCESS != (mpi_code = MPI_Query_thread(&provided))) + HMPI_GOTO_ERROR(FAIL, "MPI_Query_thread failed", mpi_code); + if (provided != MPI_THREAD_MULTIPLE) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, + "Subfiling VFD requires the use of MPI_Init_thread with MPI_THREAD_MULTIPLE"); + } + else { + if (MPI_SUCCESS != (mpi_code = MPI_Init_thread(NULL, NULL, MPI_THREAD_MULTIPLE, &provided))) + HMPI_GOTO_ERROR(FAIL, "MPI_Init_thread failed", mpi_code); - if (provided != required) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, H5I_INVALID_HID, - "MPI doesn't support MPI_Init_thread with MPI_THREAD_MULTIPLE"); + H5FD_mpi_self_initialized_s = true; - if (atexit(H5FD__subfiling_mpi_finalize) < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, H5I_INVALID_HID, - "can't register atexit handler for MPI_Finalize"); - } + if (provided != MPI_THREAD_MULTIPLE) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, + "MPI doesn't support MPI_Init_thread with MPI_THREAD_MULTIPLE"); + } - /* - * Create the MPI Datatype that will be used - * for sending/receiving RPC messages - */ - HDcompile_assert(sizeof(((sf_work_request_t *)NULL)->header) == 3 * sizeof(int64_t)); - if (H5_subfiling_rpc_msg_type == MPI_DATATYPE_NULL) { - if (MPI_SUCCESS != (mpi_code = MPI_Type_contiguous(3, MPI_INT64_T, &H5_subfiling_rpc_msg_type))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Type_contiguous failed", mpi_code); - if (MPI_SUCCESS != (mpi_code = MPI_Type_commit(&H5_subfiling_rpc_msg_type))) - HMPI_GOTO_ERROR(H5I_INVALID_HID, "MPI_Type_commit failed", mpi_code); - } + /* + * Create the MPI Datatype that will be used + * for sending/receiving RPC messages + */ + HDcompile_assert(sizeof(((sf_work_request_t *)NULL)->header) == 3 * sizeof(int64_t)); + if (H5_subfiling_rpc_msg_type == MPI_DATATYPE_NULL) { + if (MPI_SUCCESS != (mpi_code = MPI_Type_contiguous(3, MPI_INT64_T, &H5_subfiling_rpc_msg_type))) + HMPI_GOTO_ERROR(FAIL, "MPI_Type_contiguous failed", mpi_code); + if (MPI_SUCCESS != (mpi_code = MPI_Type_commit(&H5_subfiling_rpc_msg_type))) + HMPI_GOTO_ERROR(FAIL, "MPI_Type_commit failed", mpi_code); } - /* Set return value */ - ret_value = H5FD_SUBFILING_g; + /* Indicate that driver is set up */ + H5FD_subfiling_init_s = true; done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5FD_subfiling_init() */ +} /* end H5FD__subfiling_init() */ /*--------------------------------------------------------------------------- * Function: H5FD__subfiling_term @@ -394,44 +383,45 @@ H5FD_subfiling_init(void) static herr_t H5FD__subfiling_term(void) { + int mpi_finalized; + int mpi_code; herr_t ret_value = SUCCEED; FUNC_ENTER_PACKAGE - if (H5FD_SUBFILING_g >= 0) { - int mpi_finalized; - int mpi_code; - - /* - * Retrieve status of whether MPI has already been terminated. - * This can happen if an HDF5 ID is left unclosed and HDF5 - * shuts down after MPI_Finalize() is called in an application. - */ - if (MPI_SUCCESS != (mpi_code = MPI_Finalized(&mpi_finalized))) - HMPI_GOTO_ERROR(FAIL, "MPI_Finalized failed", mpi_code); + /* + * Retrieve status of whether MPI has already been terminated. + * This can happen if an HDF5 ID is left unclosed and HDF5 + * shuts down after MPI_Finalize() is called in an application. + */ + if (MPI_SUCCESS != (mpi_code = MPI_Finalized(&mpi_finalized))) + HMPI_GOTO_ERROR(FAIL, "MPI_Finalized failed", mpi_code); + if (!mpi_finalized) { /* Free RPC message MPI Datatype */ - if (H5_subfiling_rpc_msg_type != MPI_DATATYPE_NULL) { - if (!mpi_finalized) { - if (MPI_SUCCESS != (mpi_code = MPI_Type_free(&H5_subfiling_rpc_msg_type))) - HMPI_GOTO_ERROR(FAIL, "MPI_Type_free failed", mpi_code); - } + if (H5_subfiling_rpc_msg_type != MPI_DATATYPE_NULL) + if (MPI_SUCCESS != (mpi_code = MPI_Type_free(&H5_subfiling_rpc_msg_type))) + HMPI_GOTO_ERROR(FAIL, "MPI_Type_free failed", mpi_code); + + /* Terminate MPI if the driver initialized it */ + if (H5FD_mpi_self_initialized_s) { + if (MPI_SUCCESS != (mpi_code = MPI_Finalize())) + HMPI_GOTO_ERROR(FAIL, "MPI_Finalize failed", mpi_code); + + H5FD_mpi_self_initialized_s = false; + } + } #ifdef H5_SUBFILING_DEBUG - else - printf("** WARNING **: HDF5 is terminating the Subfiling VFD after MPI_Finalize() was called " - "- an HDF5 ID was probably left unclosed\n"); + else + printf("** WARNING **: HDF5 is terminating the Subfiling VFD after MPI_Finalize() was called " + "- an HDF5 ID was probably left unclosed\n"); #endif - } - /* Clean up resources */ - if (H5FD__subfiling_terminate() < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTFREE, FAIL, "can't cleanup internal subfiling resources"); - } + /* Clean up resources */ + if (H5FD__subfiling_terminate() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTRELEASE, FAIL, "can't cleanup internal subfiling resources"); done: - /* Reset VFL ID */ - H5FD_SUBFILING_g = H5I_INVALID_HID; - FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__subfiling_term() */ @@ -461,13 +451,14 @@ H5Pset_fapl_subfiling(hid_t fapl_id, const H5FD_subfiling_config_t *vfd_config) FUNC_ENTER_API(FAIL) - /* Ensure Subfiling (and therefore MPI) is initialized before doing anything */ - if (H5FD_subfiling_init() < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize subfiling VFD"); - if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); + /* Initialize driver, if it's not yet */ + if (!H5FD_subfiling_init_s) + if (H5FD__subfiling_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + if (vfd_config == NULL) { if (NULL == (subfiling_conf = H5MM_calloc(sizeof(*subfiling_conf)))) HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, FAIL, "can't allocate subfiling VFD configuration"); @@ -544,6 +535,11 @@ H5Pget_fapl_subfiling(hid_t fapl_id, H5FD_subfiling_config_t *config_out) if (NULL == (plist = H5P_object_verify(fapl_id, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); + /* Initialize driver, if it's not yet */ + if (!H5FD_subfiling_init_s) + if (H5FD__subfiling_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + if (H5FD_SUBFILING != H5P_peek_driver(plist)) use_default_config = true; else { @@ -1110,9 +1106,14 @@ H5FD__subfiling_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t ma HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, NULL, "invalid file name"); if (0 == maxaddr || HADDR_UNDEF == maxaddr) HGOTO_ERROR(H5E_ARGS, H5E_BADRANGE, NULL, "bogus maxaddr"); - if (ADDR_OVERFLOW(maxaddr)) + if (H5FD_ADDR_OVERFLOW(maxaddr)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, NULL, "bogus maxaddr"); + /* Initialize driver, if it's not yet */ + if (!H5FD_subfiling_init_s) + if (H5FD__subfiling_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, NULL, "can't initialize driver"); + if (NULL == (file = (H5FD_subfiling_t *)H5FL_CALLOC(H5FD_subfiling_t))) HGOTO_ERROR(H5E_VFL, H5E_CANTALLOC, NULL, "unable to allocate file struct"); file->comm = MPI_COMM_NULL; @@ -1127,7 +1128,7 @@ H5FD__subfiling_open(const char *name, unsigned flags, hid_t fapl_id, haddr_t ma if (NULL == (plist = (H5P_genplist_t *)H5I_object(fapl_id))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "not a file access property list"); - if (H5FD_mpi_self_initialized) { + if (H5FD_mpi_self_initialized_s) { file->comm = MPI_COMM_WORLD; file->info = MPI_INFO_NULL; } @@ -1759,8 +1760,17 @@ H5FD__subfiling_truncate(H5FD_t *_file, hid_t H5_ATTR_UNUSED dxpl_id, bool H5_AT FUNC_LEAVE_NOAPI(ret_value) } /* end H5FD__subfiling_truncate() */ +/*------------------------------------------------------------------------- + * Function: H5FD__subfiling_delete + * + * Purpose: Delete a file + * + * Return: SUCCEED/FAIL + * + *------------------------------------------------------------------------- + */ static herr_t -H5FD__subfiling_del(const char *name, hid_t fapl) +H5FD__subfiling_delete(const char *name, hid_t fapl) { const H5FD_subfiling_config_t *subfiling_config = NULL; H5FD_subfiling_config_t default_config; @@ -1769,6 +1779,11 @@ H5FD__subfiling_del(const char *name, hid_t fapl) FUNC_ENTER_PACKAGE + /* Initialize driver, if it's not yet */ + if (!H5FD_subfiling_init_s) + if (H5FD__subfiling_init() < 0) + HGOTO_ERROR(H5E_VFL, H5E_CANTINIT, FAIL, "can't initialize driver"); + if (NULL == (plist = H5P_object_verify(fapl, H5P_FILE_ACCESS))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file access property list"); @@ -1918,7 +1933,7 @@ H5FD__subfiling_io_helper(H5FD_subfiling_t *file, size_t io_count, H5FD_mem_t ty if (!H5_addr_defined(addrs[i])) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "addr[%zu] undefined, addr = %" PRIuHADDR, i, addrs[i]); - if (REGION_OVERFLOW(addrs[i], io_size)) + if (H5FD_REGION_OVERFLOW(addrs[i], io_size)) HGOTO_ERROR(H5E_ARGS, H5E_OVERFLOW, FAIL, "addr[%zu] overflow, addr = %" PRIuHADDR ", size = %zu", i, addrs[i], io_size); if ((addrs[i] + io_size) > file_eoa) diff --git a/src/H5FDsubfiling/H5FDsubfiling.h b/src/H5FDsubfiling/H5FDsubfiling.h index d6d2ffd16da..01938e4f8d9 100644 --- a/src/H5FDsubfiling/H5FDsubfiling.h +++ b/src/H5FDsubfiling/H5FDsubfiling.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -14,12 +14,16 @@ #ifndef H5FDsubfiling_H #define H5FDsubfiling_H +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ + #ifdef H5_HAVE_SUBFILING_VFD + /** * \def H5FD_SUBFILING * Macro that returns the identifier for the #H5FD_SUBFILING driver. \hid_t{file driver} */ -#define H5FD_SUBFILING (H5FDperform_init(H5FD_subfiling_init)) +#define H5FD_SUBFILING (H5OPEN H5FD_SUBFILING_id_g) #else #define H5FD_SUBFILING (H5I_INVALID_HID) #endif @@ -319,11 +323,12 @@ typedef struct H5FD_subfiling_config_t { extern "C" { #endif -/** - * \brief Internal routine to initialize #H5FD_SUBFILING driver. Not meant to be - * called directly by an HDF5 application +/** @private + * + * \brief ID for the SUBFILING VFD */ -H5_DLL hid_t H5FD_subfiling_init(void); +H5_DLLVAR hid_t H5FD_SUBFILING_id_g; + /** * \ingroup FAPL * diff --git a/src/H5FDsubfiling/H5FDsubfiling_priv.h b/src/H5FDsubfiling/H5FDsubfiling_priv.h index fdb946e73ef..b746326959c 100644 --- a/src/H5FDsubfiling/H5FDsubfiling_priv.h +++ b/src/H5FDsubfiling/H5FDsubfiling_priv.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -21,16 +21,11 @@ /* H5 Headers */ /**************/ -#include "H5private.h" /* Generic Functions */ -#include "H5CXprivate.h" /* API Contexts */ -#include "H5Dprivate.h" /* Datasets */ -#include "H5Eprivate.h" /* Error handling */ +/* Public header */ #include "H5FDsubfiling.h" /* Subfiling VFD */ -#include "H5FDioc.h" /* IOC VFD */ -#include "H5Iprivate.h" /* IDs */ -#include "H5MMprivate.h" /* Memory management */ -#include "H5Pprivate.h" /* Property lists */ +/* Private headers */ +#include "H5private.h" /* Generic Functions */ #include "H5subfiling_common.h" #define DRIVER_INFO_MESSAGE_MAX_INFO 65536 diff --git a/src/H5FDsubfiling/H5subfiling_common.c b/src/H5FDsubfiling/H5subfiling_common.c index 00a2b7017c4..9b393412242 100644 --- a/src/H5FDsubfiling/H5subfiling_common.c +++ b/src/H5FDsubfiling/H5subfiling_common.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -14,11 +14,15 @@ * Generic code for integrating an HDF5 VFD with the subfiling feature */ -#include "H5subfiling_common.h" +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ -#include "H5Eprivate.h" -#include "H5MMprivate.h" -#include "H5TSprivate.h" /* Threadsafety */ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FDpkg.h" /* File drivers */ +#include "H5Iprivate.h" /* IDs */ +#include "H5MMprivate.h" /* Memory management */ +#include "H5TSprivate.h" /* Threadsafety */ +#include "H5subfiling_common.h" typedef struct { /* Format of a context map entry */ uint64_t file_id; /* key value (linear search of the cache) */ @@ -94,7 +98,7 @@ static int64_t H5FD__subfiling_new_object_id(sf_obj_type_t obj_type) { int64_t index_val = 0; - int64_t ret_value; + int64_t ret_value = 0; FUNC_ENTER_PACKAGE diff --git a/src/H5FDsubfiling/H5subfiling_common.h b/src/H5FDsubfiling/H5subfiling_common.h index 7e7ada5bcfe..6e140cccb4c 100644 --- a/src/H5FDsubfiling/H5subfiling_common.h +++ b/src/H5FDsubfiling/H5subfiling_common.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -17,14 +17,11 @@ #ifndef H5_SUBFILING_COMMON_H #define H5_SUBFILING_COMMON_H -#include "H5private.h" /* Generic Functions */ -#include "H5FDprivate.h" /* File Drivers */ -#include "H5Iprivate.h" /* IDs */ -#include "H5Pprivate.h" /* Property lists */ -#include "H5TSprivate.h" /* Threads */ - -#include "H5FDsubfiling.h" -#include "H5FDioc.h" +#include "H5private.h" /* Generic Functions */ +#include "H5FDsubfiling.h" /* Subfiling file driver */ +#include "H5FDioc.h" /* I/O concentrator file driver */ +#include "H5Pprivate.h" /* Property lists */ +#include "H5TSprivate.h" /* Threads */ #ifndef PATH_MAX #define PATH_MAX 4096 diff --git a/src/H5FDtest.c b/src/H5FDtest.c index 2a48fb5b8cd..086d41f7808 100644 --- a/src/H5FDtest.c +++ b/src/H5FDtest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -88,7 +88,7 @@ H5FD__supports_swmr_test(const char *vfd_name) { bool ret_value = false; - FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_ENTER_PACKAGE_NOERR if (!vfd_name) vfd_name = getenv("HDF5_TEST_DRIVER"); diff --git a/src/H5FDwindows.c b/src/H5FDwindows.c index 74389db913d..182958fcb15 100644 --- a/src/H5FDwindows.c +++ b/src/H5FDwindows.c @@ -4,21 +4,24 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ -#include "H5private.h" /* Generic Functions */ +#include "H5FDmodule.h" /* This source code file is part of the H5FD module */ + +#include "H5private.h" /* Generic Functions */ + +#ifdef H5_HAVE_WINDOWS + #include "H5Eprivate.h" /* Error handling */ -#include "H5FDprivate.h" /* File drivers */ -#include "H5FDwindows.h" /* Windows file driver */ #include "H5FDsec2.h" /* Windows file driver */ +#include "H5FDpkg.h" /* File drivers */ +#include "H5FDwindows.h" /* Windows file driver */ #include "H5Pprivate.h" /* Property lists */ -#ifdef H5_HAVE_WINDOWS - /*------------------------------------------------------------------------- * Function: H5Pset_fapl_windows * diff --git a/src/H5FDwindows.h b/src/H5FDwindows.h index 673d1c93b59..9ab9b6a94f3 100644 --- a/src/H5FDwindows.h +++ b/src/H5FDwindows.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -20,8 +20,12 @@ #ifndef H5FDwindows_H #define H5FDwindows_H -/** Initializer for the Windows VFD */ -#define H5FD_WINDOWS (H5FD_sec2_init()) +/* Public header files */ +#include "H5FDpublic.h" /* File drivers */ +#include "H5FDsec2.h" /* sec2 driver */ + +/** ID for the windows VFD */ +#define H5FD_WINDOWS (H5OPEN H5FD_SEC2_id_g) #ifdef __cplusplus extern "C" { diff --git a/src/H5FL.c b/src/H5FL.c index cdcdc0cbda9..087017e03e9 100644 --- a/src/H5FL.c +++ b/src/H5FL.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -110,6 +110,9 @@ struct H5FL_fac_node_t { struct H5FL_fac_node_t *next; /* Pointer to next block in free list */ }; +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* The head of the list of factory things to garbage collect */ static H5FL_fac_gc_list_t H5FL_fac_gc_head = {0, NULL}; @@ -168,15 +171,20 @@ H5FL_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR + if (H5_PKG_INIT_VAR) { /* Garbage collect any nodes on the free lists */ - (void) - H5FL_garbage_coll(); + (void)H5FL_garbage_coll(); + + /* Shut down the various kinds of free lists */ + n += H5FL__reg_term(); + n += H5FL__fac_term_all(); + n += H5FL__arr_term(); + n += H5FL__blk_term(); - /* Shut down the various kinds of free lists */ - n += H5FL__reg_term(); - n += H5FL__fac_term_all(); - n += H5FL__arr_term(); - n += H5FL__blk_term(); + /* Mark interface closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5FL_term_package() */ @@ -1933,7 +1941,7 @@ H5FL__fac_gc(void) H5FL_fac_gc_node_t *gc_node; /* Pointer into the list of things to garbage collect */ herr_t ret_value = SUCCEED; /* return value*/ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* Walk through all the free lists, free()'ing the nodes */ gc_node = H5FL_fac_gc_head.first; diff --git a/src/H5FLmodule.h b/src/H5FLmodule.h index 5e9f15733f5..97fbed8f345 100644 --- a/src/H5FLmodule.h +++ b/src/H5FLmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5FL_MODULE -#define H5_MY_PKG H5FL -#define H5_MY_PKG_ERR H5E_RESOURCE +#define H5_MY_PKG H5FL +#define H5_MY_PKG_ERR H5E_RESOURCE +#define H5_MY_PKG_INIT NO #endif /* H5FLmodule_H */ diff --git a/src/H5FLprivate.h b/src/H5FLprivate.h index 823e0fda61e..c9f79b3c7da 100644 --- a/src/H5FLprivate.h +++ b/src/H5FLprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FO.c b/src/H5FO.c index 74daa7b55b0..a5c47fdb4bd 100644 --- a/src/H5FO.c +++ b/src/H5FO.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FOprivate.h b/src/H5FOprivate.h index 5f5fe9c7d11..286dfa5d646 100644 --- a/src/H5FOprivate.h +++ b/src/H5FOprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FS.c b/src/H5FS.c index 64bf51f5d46..d00c870ff04 100644 --- a/src/H5FS.c +++ b/src/H5FS.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -58,6 +58,9 @@ static herr_t H5FS__sinfo_free_node_cb(void *item, void *key, void *op_data); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare a free list to manage the H5FS_section_class_t sequence information */ H5FL_SEQ_DEFINE(H5FS_section_class_t); diff --git a/src/H5FScache.c b/src/H5FScache.c index 7f8edf69f13..a9b430d3698 100644 --- a/src/H5FScache.c +++ b/src/H5FScache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -766,7 +766,7 @@ H5FS__cache_hdr_notify(H5AC_notify_action_t action, void *_thing) H5FS_t *fspace = (H5FS_t *)_thing; /* Pointer to the object */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* Sanity check */ assert(fspace); diff --git a/src/H5FSdbg.c b/src/H5FSdbg.c index 5105032a053..3d013b25223 100644 --- a/src/H5FSdbg.c +++ b/src/H5FSdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FSint.c b/src/H5FSint.c index da9f9b85837..011a9822563 100644 --- a/src/H5FSint.c +++ b/src/H5FSint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -64,6 +64,28 @@ /* Local Variables */ /*******************/ +/*------------------------------------------------------------------------- + * Function: H5FS_init + * + * Purpose: Initialize the interface in case it is unable to initialize + * itself soon enough. + * + * Return: Success: non-negative + * Failure: negative + * + *------------------------------------------------------------------------- + */ +herr_t +H5FS_init(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI_NOERR + /* FUNC_ENTER() does all the work */ + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5FS_init() */ + /*------------------------------------------------------------------------- * Function: H5FS__create_flush_depend * @@ -78,7 +100,7 @@ H5FS__create_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* Sanity check */ assert(parent_entry); @@ -106,7 +128,7 @@ H5FS__destroy_flush_depend(H5AC_info_t *parent_entry, H5AC_info_t *child_entry) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* Sanity check */ assert(parent_entry); diff --git a/src/H5FSmodule.h b/src/H5FSmodule.h index 46bf8bf0c27..48ae8d37277 100644 --- a/src/H5FSmodule.h +++ b/src/H5FSmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5FS_MODULE -#define H5_MY_PKG H5FS -#define H5_MY_PKG_ERR H5E_FSPACE +#define H5_MY_PKG H5FS +#define H5_MY_PKG_ERR H5E_FSPACE +#define H5_MY_PKG_INIT NO #endif /* H5FSmodule_H */ diff --git a/src/H5FSpkg.h b/src/H5FSpkg.h index 6e14deb4ecb..e40b0b3936c 100644 --- a/src/H5FSpkg.h +++ b/src/H5FSpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FSprivate.h b/src/H5FSprivate.h index f917a253944..957f6f9a665 100644 --- a/src/H5FSprivate.h +++ b/src/H5FSprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -183,6 +183,9 @@ H5FL_SEQ_EXTERN(H5FS_section_class_t); /* Library-private Function Prototypes */ /***************************************/ +/* Package initialization routine */ +H5_DLL herr_t H5FS_init(void); + /* Free space manager routines */ H5_DLL H5FS_t *H5FS_create(H5F_t *f, haddr_t *fs_addr, const H5FS_create_t *fs_create, uint16_t nclasses, const H5FS_section_class_t *classes[], void *cls_init_udata, hsize_t alignment, diff --git a/src/H5FSsection.c b/src/H5FSsection.c index 57022a2c02c..4131a92854e 100644 --- a/src/H5FSsection.c +++ b/src/H5FSsection.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FSstat.c b/src/H5FSstat.c index 3617f18ff62..577d08fc4ca 100644 --- a/src/H5FSstat.c +++ b/src/H5FSstat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5FStest.c b/src/H5FStest.c index 30f598dd28e..f372ba7e9ef 100644 --- a/src/H5FStest.c +++ b/src/H5FStest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Faccum.c b/src/H5Faccum.c index 5fabf5266a0..4d713576ca6 100644 --- a/src/H5Faccum.c +++ b/src/H5Faccum.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -405,7 +405,7 @@ H5F__accum_write(H5F_shared_t *f_sh, H5FD_mem_t map_type, haddr_t addr, size_t s H5FD_t *file; /* File driver pointer */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity checks */ assert(f_sh); @@ -1004,7 +1004,7 @@ H5F__accum_flush(H5F_shared_t *f_sh) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity checks */ assert(f_sh); diff --git a/src/H5Fcwfs.c b/src/H5Fcwfs.c index c946fa453e1..f6674b2d703 100644 --- a/src/H5Fcwfs.c +++ b/src/H5Fcwfs.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -240,7 +240,7 @@ H5F_cwfs_advance_heap(H5F_t *f, H5HG_heap_t *heap, bool add_heap) unsigned u; /* Local index variable */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Check args */ assert(f); @@ -260,6 +260,7 @@ H5F_cwfs_advance_heap(H5F_t *f, H5HG_heap_t *heap, bool add_heap) f->shared->cwfs[f->shared->ncwfs - 1] = heap; } /* end if */ +done: FUNC_LEAVE_NOAPI(ret_value) } /* H5F_cwfs_advance_heap() */ @@ -279,7 +280,7 @@ H5F_cwfs_remove_heap(H5F_shared_t *shared, H5HG_heap_t *heap) unsigned u; /* Local index variable */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Check args */ assert(shared); @@ -294,5 +295,6 @@ H5F_cwfs_remove_heap(H5F_shared_t *shared, H5HG_heap_t *heap) } /* end if */ } /* end for */ +done: FUNC_LEAVE_NOAPI(ret_value) } /* H5F_cwfs_remove_heap() */ diff --git a/src/H5Fdbg.c b/src/H5Fdbg.c index 3b1aad37dbd..daf76057ee3 100644 --- a/src/H5Fdbg.c +++ b/src/H5Fdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fdeprec.c b/src/H5Fdeprec.c index c7552840bc1..e0616a444fe 100644 --- a/src/H5Fdeprec.c +++ b/src/H5Fdeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fefc.c b/src/H5Fefc.c index e8ecc6d0efe..5c24c0a6dea 100644 --- a/src/H5Fefc.c +++ b/src/H5Fefc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ffake.c b/src/H5Ffake.c index ad9fc8fb2ff..dde8f3181ab 100644 --- a/src/H5Ffake.c +++ b/src/H5Ffake.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fint.c b/src/H5Fint.c index 0764bb43beb..d2ede2f978d 100644 --- a/src/H5Fint.c +++ b/src/H5Fint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -91,6 +91,9 @@ static herr_t H5F__flush_phase2(H5F_t *f, bool closing); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Based on the value of the HDF5_USE_FILE_LOCKING environment variable. * true/false have obvious meanings. FAIL means the environment variable was * not set, so the code should ignore it and use the fapl value instead. @@ -136,6 +139,29 @@ H5F_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5F_init() */ + +/*-------------------------------------------------------------------------- +NAME + H5F__init_package -- Initialize interface-specific information +USAGE + herr_t H5F__init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. + +--------------------------------------------------------------------------*/ +herr_t +H5F__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE /* Initialize the ID group for the file IDs */ if (H5I_register_type(H5I_FILE_CLS) < 0) @@ -147,7 +173,7 @@ H5F_init(void) done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5F_init() */ +} /* H5F__init_package() */ /*------------------------------------------------------------------------- * Function: H5F_term_package @@ -171,17 +197,23 @@ H5F_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - if (H5I_nmembers(H5I_FILE) > 0) { - (void)H5I_clear_type(H5I_FILE, false, false); - n++; /*H5I*/ - } /* end if */ - else { - /* Make certain we've cleaned up all the shared file objects */ - H5F_sfile_assert_num(0); + if (H5_PKG_INIT_VAR) { + if (H5I_nmembers(H5I_FILE) > 0) { + (void)H5I_clear_type(H5I_FILE, false, false); + n++; /*H5I*/ + } /* end if */ + else { + /* Make certain we've cleaned up all the shared file objects */ + H5F_sfile_assert_num(0); - /* Destroy the file object id group */ - n += (H5I_dec_type_ref(H5I_FILE) > 0); - } /* end else */ + /* Destroy the file object id group */ + n += (H5I_dec_type_ref(H5I_FILE) > 0); + + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end else */ + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5F_term_package() */ @@ -3181,7 +3213,8 @@ H5F__set_libver_bounds(H5F_t *f, H5F_libver_t low, H5F_libver_t high) assert(f->shared); /* Set the bounds only if the existing setting is different from the inputs */ - if (f->shared->low_bound != low || f->shared->high_bound != high) { + if ((f->shared->low_bound != low || f->shared->high_bound != high) && + !(H5F_INTENT(f) & H5F_ACC_SWMR_WRITE)) { /* Call the flush routine, for this file */ /* Note: This is done in case the binary format for representing a * metadata entry class changes when the file format low / high @@ -3704,6 +3737,7 @@ H5F_get_metadata_read_retry_info(H5F_t *file, H5F_retry_info_t *info) * --only allow datasets and groups without attributes * --disallow named datatype with/without attributes * --disallow opened attributes attached to objects + * --disallow opened objects below 1.10 * * NOTE: Currently, only opened groups and datasets are allowed * when enabling SWMR via H5Fstart_swmr_write(). @@ -3746,7 +3780,7 @@ H5F__start_swmr_write(H5F_t *f) if (f->shared->sblock->super_vers < HDF5_SUPERBLOCK_VERSION_3) HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "file superblock version - should be at least 3"); - /* Check for correct file format version */ + /* Check for correct file format version to start SWMR writing */ if ((f->shared->low_bound < H5F_LIBVER_V110) || (f->shared->high_bound < H5F_LIBVER_V110)) HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "file format version does not support SWMR - needs to be 1.10 or greater"); @@ -3783,6 +3817,31 @@ H5F__start_swmr_write(H5F_t *f) /* Allocate space for group and object locations */ if ((obj_ids = (hid_t *)H5MM_malloc(grp_dset_count * sizeof(hid_t))) == NULL) HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "can't allocate buffer for hid_t"); + + /* Get the list of opened object ids (groups & datasets) */ + if (H5F_get_obj_ids(f, H5F_OBJ_GROUP | H5F_OBJ_DATASET, grp_dset_count, obj_ids, false, + &grp_dset_count) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "H5F_get_obj_ids failed"); + + /* Ensure that there's no old-style opened objects */ + for (u = 0; u < grp_dset_count; u++) { + H5O_native_info_t ninfo; + H5O_loc_t *oloc; + uint8_t version; + + if (NULL == (oloc = H5O_get_loc(obj_ids[u]))) + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "H5O_get_loc() failed"); + + if (H5O_get_native_info(oloc, &ninfo, H5O_NATIVE_INFO_HDR) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "H5O_get_native_info() failed"); + + if (H5O_get_version_bound(f->shared->low_bound, &version) < 0) + HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "H5O_get_version_bound() failed"); + + if (ninfo.hdr.version < version) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "disallow opened objects below 1.10"); + } + if ((obj_glocs = (H5G_loc_t *)H5MM_malloc(grp_dset_count * sizeof(H5G_loc_t))) == NULL) HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "can't allocate buffer for object group locations"); if ((obj_olocs = (H5O_loc_t *)H5MM_malloc(grp_dset_count * sizeof(H5O_loc_t))) == NULL) @@ -3797,11 +3856,6 @@ H5F__start_swmr_write(H5F_t *f) HGOTO_ERROR(H5E_FILE, H5E_CANTALLOC, FAIL, "can't allocate buffer for hid_t"); assert(obj_apl_ids[0] == H5P_DEFAULT); - /* Get the list of opened object ids (groups & datasets) */ - if (H5F_get_obj_ids(f, H5F_OBJ_GROUP | H5F_OBJ_DATASET, grp_dset_count, obj_ids, false, - &grp_dset_count) < 0) - HGOTO_ERROR(H5E_FILE, H5E_CANTGET, FAIL, "H5F_get_obj_ids failed"); - /* Save the VOL connector and the object wrapping context for the refresh step */ if (grp_dset_count > 0) { H5VL_object_t *vol_obj; diff --git a/src/H5Fio.c b/src/H5Fio.c index 3d50b50fc51..44e5aeb3851 100644 --- a/src/H5Fio.c +++ b/src/H5Fio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fmodule.h b/src/H5Fmodule.h index c9f1b31ceac..e83214bb40e 100644 --- a/src/H5Fmodule.h +++ b/src/H5Fmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5F_MODULE -#define H5_MY_PKG H5F -#define H5_MY_PKG_ERR H5E_FILE +#define H5_MY_PKG H5F +#define H5_MY_PKG_ERR H5E_FILE +#define H5_MY_PKG_INIT YES /** \page H5F_UG HDF5 File * @@ -232,14 +233,13 @@ * } * \endcode * - * Note that the root group, indicated above by /, was automatically created when the file was created. + * Note that the root group, indicated above by /, was automatically created when the file was created. * * h5dump is described on the - * - * Tools + * \ref subsecViewToolsViewContent_h5dump * page under - * Command-line Tools. - * The HDF5 DDL grammar is described in the document \ref DDLBNF114. + * \ref ViewToolsCommand. + * The HDF5 DDL grammar is described in the document \ref DDLBNF200. * * \subsection subsec_file_summary File Function Summaries * General library (\ref H5 functions and macros), (\ref H5F functions), file related @@ -511,7 +511,7 @@ * as a model for the user. Other file creation and file access properties are mentioned and defined * briefly, but the model is not expanded for each; complete syntax, parameter, and usage * information for every property list function is provided in the \ref H5P - * section of the HDF5 Reference Manual. + * section of the \ref RM. * * For more information, @see \ref sec_plist. * @@ -565,7 +565,7 @@ * and the value 4096 would be returned in the parameter size. * * Other properties, described below, are set and queried in exactly the same manner. Syntax and - * usage are detailed in the @ref H5P section of the HDF5 Reference Manual. + * usage are detailed in the @ref H5P section of the \ref RM. * *

Offset and Length Sizes

* This property specifies the number of bytes used to store the offset and length of objects in the @@ -682,7 +682,7 @@ * \snippet{doc} tables/fileDriverLists.dox supported_file_driver_table * * - * For more information, see the HDF5 Reference Manual entries for the function calls shown in + * For more information, see the \ref RM entries for the function calls shown in * the column on the right in the table above. * * Note that the low-level file drivers manage alternative file storage layouts. Dataset storage @@ -889,8 +889,7 @@ * * Additional parameters may be added to these functions in the future. * - * see - * HDF5 File Image Operations + * see \ref H5FIM_UG * section for information on more advanced usage of the Memory file driver, and * see @@ -957,7 +956,7 @@ * family name (the default is 1GB). block_size and member_size may be suffixed with the letters * g, m, or k for GB, MB, or KB respectively. * - * The h5repart utility is described on the Tools page of the HDF5 Reference Manual. + * The h5repart utility is described on the Tools page of the \ref RM. * * An existing HDF5 file can be split into a family of files by running the file through split(1) on a * UNIX system and numbering the output files. However, the HDF5 Library is lazy about @@ -1000,7 +999,7 @@ * modified by the rule indicated in memb_name. File access will be governed by the file access * property list memb_properties. * - * See #H5Pset_fapl_multi and #H5Pget_fapl_multi in the HDF5 Reference Manual for descriptions + * See #H5Pset_fapl_multi and #H5Pget_fapl_multi in the \ref RM for descriptions * of these functions and their usage. * * Additional parameters may be added to these functions in the future. @@ -1185,10 +1184,1436 @@ * list identifier. * For more information, @see \ref sec_group. * - * See the entries for #H5Fmount, #H5Funmount, and #H5Lcreate_external in the HDF5 Reference Manual. + * See the entries for #H5Fmount, #H5Funmount, and #H5Lcreate_external in the \ref RM. * * Previous Chapter \ref sec_program - Next Chapter \ref sec_group * + * \page H5FIM_UG HDF5 File Image + * + * \section sec_file_image HDF5 File Image + * \subsection subsec_file_image_intro Introduction to HDF5 File Image Operations + * File image operations allow users to work with HDF5 files in memory in the same ways that users currently + * work with HDF5 files on disk. Disk I/O is not required when file images are opened, created, read from, + * or written to. + * + * An HDF5 file image is an HDF5 file that is held in a buffer in main memory. Setting up a file image in + * memory involves using either a buffer in the file access property list or a buffer in the \ref + * subsubsec_file_alternate_drivers_mem file driver. The advantage of working with a file in memory is faster + * access to the data. + * + * The challenge of working with files in memory buffers is maximizing performance and minimizing memory + * footprint while working within the constraints of the property list mechanism. This should be a non-issue + * for small file images, but may be a major issue for large images. + * + * If invoked with the appropriate flags, the #H5LTopen_file_image high level library call should deal with + * these challenges in most cases. However, some applications may require the programmer to address these + * issues directly. + * + * \subsubsection subsubsec_file_image_intro_sum HDF5 File Image Operations Function Summary + * Functions used in file image operations are listed below. + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
File image operations functions
C FunctionPurpose
#H5Pset_file_imageAllows an application to specify an initial file image. For more information, see section \ref + * FI211.
#H5Pget_file_imageAllows an application to retrieve a copy of the file image designated for a VFD to use as the initial + * contents of a file. For more information, see section \ref FI212.
#H5Pset_file_image_callbacksAllows an application to manage file image buffer allocation, copying, reallocation, and release. For + * more information, see section \ref FI213.
#H5Pget_file_image_callbacksAllows an application to obtain the current file image callbacks from a file access property list. For + * more information, see section \ref FI214.
#H5Fget_file_imageProvides a simple way to retrieve a copy of the image of an existing, open file. For more information, + * see section \ref FI216.
#H5LTopen_file_imageProvides a convenient way to open an initial file image with the Core VFD. For more information, + * see section \ref FI221.
+ * + * \subsubsection subsubsec_file_image_intro_abbr Abbreviations + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Abbreviations
AbbreviationThis abbreviation is short for
FAPL or faplFile Access Property List. In code samples, fapl is used.
VFDVirtual File Driver
VFLVirtual File Layer
+ * + * \subsubsection subsubsec_file_image_intro_pre Developer Prerequisites + * Developers who use the file image operations described in this document should be proficient + * and experienced users of the HDF5 C Library APIs. More specifically, developers should have a + * working knowledge of property lists, callbacks, and virtual file drivers. + * + * \subsubsection subsubsec_file_image_intro_res Resources + * See the following for more information. + * + * The \ref subsec_file_alternate_drivers section is in \ref sec_file + * chapter of the \ref UG. + * + * The #H5Pset_fapl_core function call can be used to modify the file access property list so + * that the Memory virtual file driver, #H5FD_CORE, is used. The Memory file driver is also known + * as the Core file driver. + * + * Links to the \ref VFL and List of Functions documents can be found in the HDF5 \ref TN. + * + * \subsection subsec_file_image_api File Image C API Call Syntax + * The C API function calls described in this chapter fall into two categories: low-level routines that are + * part of the main HDF5 C Library and one high-level routine that is part of the “lite” API in the + * high-level wrapper library. The high-level routine uses the low-level routines and presents frequently + * requested functionality conveniently packaged for application developers’ use. + * + * \subsubsection subsubsec_file_image_api_low Low-level C API Routines + * The purpose of this section is to describe the low-level C API routines that support file image operations. + * These routines allow an in-memory image of an HDF5 file to be opened without requiring file system I/O. + * + * The basic approach to opening an in-memory image of an HDF5 file is to pass the image to the Core file + * driver, and then tell the Core file driver to open the file. We do this by using the + * #H5Pget_file_image/#H5Pset_file_image calls. These calls allow the user to specify an initial file image. + * + * A potential problem with the #H5Pget_file_image/#H5Pset_file_image calls is the overhead of allocating and + * copying of large file image buffers. The callback routines enable application programs to avoid this + * problem. However, the use of these callbacks is complex and potentially hazardous: the particulars are + * discussed in the semantics and examples chapters below (see section \ref subsubsec_file_image_semantics_cbk + * and section \ref subsubsec_file_image_example_read respectively). Fortunately, use of the file image + * callbacks should seldom be necessary: the #H5LTopen_file_image call should address most use cases. + * + * The property list facility in HDF5 is employed in file image operations. This facility was designed for + * passing data, not consumable resources, into API calls. The peculiar ways in which the file image + * allocation callbacks may be used allows us to avoid extending the property list structure to handle + * consumable resources cleanly and to avoid constructing a new facility for the purpose. + * + * The sub-sections below describe the low-level C APIs that are used with file image operations. + * + * \anchor FI211

#H5Pset_file_image

+ * The #H5Pset_file_image routine allows an application to provide an image for a file driver to use as the + * initial contents of the file. This call was designed initially for use with the Core VFD, but it can be + * used with any VFD that supports using an initial file image when opening a file. See the \ref FI215 section + * for more information. Calling this routine makes a copy of the provided file image buffer. See the \ref + * FI213 section for more information. + * + * The signature of #H5Pset_file_image is defined as follows: + * \code + * herr_t H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len) + * \endcode + * + * The parameters of #H5Pset_file_image are defined as follows: + * \li fapl_id contains the ID of the target file access property list. + * \li buf_ptr supplies a pointer to the initial file image, or NULL if no initial file image is desired. + * \li buf_len contains the size of the supplied buffer, or 0 + * if no initial image is desired. If either the buf_len parameter is zero, or the buf_ptr parameter is NULL, + * no file image will be set in the FAPL, and any existing file image buffer in the FAPL will be released. If + * a buffer is released, the FAPL’s file image buf_len will be set to 0 and buf_ptr will be set to NULL. + * + * Given the tight interaction between the file image callbacks and the file image, the file image callbacks + * in a property list cannot be changed while a file image is defined. + * + * With properly constructed file image callbacks, it is possible to avoid actually copying the file image. + * The particulars of this are discussed in greater detail in the \ref subsec_file_image_semantics chapter + * and in the \ref subsec_file_image_example chapter. + * + * \anchor FI212

#H5Pget_file_image

+ * The #H5Pget_file_image routine allows an application to retrieve a copy of the file image designated for a + * VFD to use as the initial contents of a file. This routine uses the file image callbacks (if defined) when + * allocating and loading the buffer to return to the application, or it uses malloc and memcpy if the + * callbacks are undefined. When malloc and memcpy are used, it will be the caller’s responsibility to discard + * the returned buffer via a call to free. + * + * The signature of #H5Pget_file_image is defined as follows: + * \code + * herr_t H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr) + * \endcode + * + * The parameters of #H5Pget_file_image are defined as follows: + * \li fapl_id contains the ID of the target file access property list. + * \li buf_ptr_ptr contains a NULL or a pointer to a void*. If buf_ptr_ptr is not NULL, on successful + * return, *buf_ptr_ptr will contain a pointer to a copy of the initial image provided in the last + * call to #H5Pset_file_image for the supplied fapl_id. If no initial image has been + * set, *buf_ptr_ptr will be NULL. + * \li buf_len_ptr contains a NULL or a pointer to size_t. If buf_len_ptr is not NULL, on + * successful return, *buf_len_ptr will contain the value of the buf_len parameter for the + * initial image in the supplied fapl_id. If no initial image is set, the value of *buf_len_ptr + * will be 0. As with #H5Pset_file_image, appropriately defined file image callbacks can allow + * this function to avoid buffer allocation and memory copy operations. + * + * \anchor FI213

#H5Pset_file_image_callbacks

+ * The #H5Pset_file_image_callbacks API call exists to allow an application to control the management of + * file image buffers through user defined callbacks. These callbacks will be used in the management of + * file image buffers in property lists and in select file drivers. These routines are invoked when a new + * file image buffer is allocated, when an existing file image buffer is copied or resized, or when a file + * image buffer is released from use. From the perspective of the HDF5 Library, the operations of the + * image_malloc, image_memcpy, image_realloc, and image_free callbacks must be identical to those of the + * corresponding C standard library calls (malloc, memcpy, realloc, and free). While the operations must + * be identical, the file image callbacks have more parameters. The callbacks and their parameters are + * described below. The return values of image_malloc and image_realloc are identical to the return + * values of malloc and realloc. However, the return values of image_memcpy and image_free are different + * than the return values of memcpy and free: the return values of image_memcpy and image_free can also + * indicate failure. See the \ref subsec_file_image_semantics section for more information. + * + * The signature of #H5Pset_file_image_callbacks is defined as follows: + * \code + * typedef enum { H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SET, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY, + * H5FD_FILE_IMAGE_OP_PROPERTY_LIST_GET, H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE, H5FD_FILE_IMAGE_OP_FILE_OPEN, + * H5FD_FILE_IMAGE_OP_FILE_RESIZE, H5FD_FILE_IMAGE_OP_FILE_CLOSE } H5FD_file_image_op_t; + * + * typedef struct { + * void *(*image_malloc)(size_t size, H5FD_file_image_op_t file_image_op, void *udata); + * void *(*image_memcpy)(void *dest, const void *src, size_t size, H5FD_file_image_op_t file_image_op, + * void *udata); void *(*image_realloc)(void *ptr, size_t size, H5FD_file_image_op_t file_image_op, void + * *udata); herr_t (*image_free)(void *ptr, H5FD_file_image_op_t file_image_op, void *udata); void + * *(*udata_copy)(void *udata); herr_t (*udata_free)(void *udata); void *udata; } H5FD_file_image_callbacks_t; + * + * herr_t H5Pset_file_image_callbacks(hid_t fapl_id, H5FD_file_image_callbacks_t *callbacks_ptr) + * \endcode + * + * The parameters of #H5Pset_file_image_callbacks are defined as follows: + * \li fapl_id contains the ID of the target file access property list. + * \li callbacks_ptr contains a pointer to an instance of the #H5FD_file_image_callbacks_t structure. + * + * The fields of the #H5FD_file_image_callbacks_t structure are defined as follows: + * \li image_malloc contains a pointer to a function with (from the perspective of HDF5) functionality + * identical to the standard C library malloc() call. + * The parameters of the image_malloc callback are defined as follows: + *
    + *
  • size contains the size in bytes of the image buffer to allocate.
  • + *
  • file_image_op contains one of the values of #H5FD_file_image_op_t.
  • + * These values indicate the operation being performed on the file image when this callback is + * invoked. Possible values for file_image_op are discussed in \ref FITable2.
  • udata holds the value + * passed in for the udata parameter to #H5Pset_file_image_callbacks. Setting image_malloc to NULL indicates + * that the HDF5 Library should invoke the standard C library malloc() routine when allocating file image + * buffers.
  • + *
+ * \li image_memcpy contains a pointer to a function with (from the perspective of HDF5) functionality + * identical to the standard C library memcpy() call except that it returns NULL on failure. Recall that the + * memcpy C Library routine is defined to return the dest parameter in all cases. The parameters of the + * image_memcpy callback are defined as follows:
  • dest contains the address of the destination + * buffer.
  • src contains the address of the source buffer.
  • size contains the number of bytes + * to copy.
  • file_image_op contains one of the values of #H5FD_file_image_op_t. These values indicate + * the operation being performed on the file image when this callback is invoked. Possible values for + * file_image_op are discussed in \ref FITable2.
  • + *
  • udata holds the value passed in for the udata parameter to #H5Pset_file_image_callbacks. + * Setting image_memcpy to NULL indicates that the HDF5 Library should invoke the standard C + * library memcpy() routine when copying buffers.
  • + *
+ * \li image_realloc contains a pointer to a function with (from the perspective of HDF5) functionality + * identical to the standard C library realloc() call. The parameters of the image_realloc callback are + * defined as follows:
  • ptr contains the pointer to the buffer being reallocated.
  • size + * contains the desired size in bytes of the buffer after realloc.
  • file_image_op contains one of the + * values of H5FD_file_image_op_t. These values indicate the operation being performed on the file image when + * this callback is invoked. Possible values for file_image_op are discussed in \ref FITable2.
  • udata + * holds the value passed in for the udata parameter to #H5Pset_file_image_callbacks. Setting image_realloc to + * NULL indicates that the HDF5 Library should invoke the standard C library realloc() routine when resizing + * file image buffers.
  • + *
+ * \li image_free contains a pointer to a function with (from the perspective of HDF5) functionality identical + * to the standard C library free() call except that it will return 0 (SUCCEED) on success and -1 (FAIL) on + * failure. The parameters of the image_free callback are defined as follows: + *
    + *
  • ptr contains the pointer to the buffer being released.
  • + *
  • file_image_op contains one of the values of H5FD_file_image_op_t. These values indicate the + * operation being performed on the file image when this callback is invoked. Possible values + * for file_image_op are discussed in \ref FITable2.
  • + *
  • udata holds the value passed in for the udata parameter to #H5Pset_file_image_callbacks. + * Setting image_free to NULL indicates that the HDF5 Library should invoke the standard C + * library free() routine when releasing file image buffers.
  • + *
+ * \li udata_copy contains a pointer to a function that (from the perspective of HDF5) allocates a buffer of + * suitable size, copies the contents of the supplied udata into the new buffer, and returns the address + * of the new buffer. The function returns NULL on failure. This function is necessary if a non-NULL udata + * parameter is supplied, so that property lists containing the image callbacks can be copied. If the udata + * parameter (below) is NULL, then this parameter should be NULL as well. The parameter of the udata_copy + * callback is defined as follows: + *
    + *
  • udata contains the pointer to the user data block being copied.
  • + *
  • udata_free contains a pointer to a function that (from the perspective of HDF5) frees a + * user data block. This function is necessary if a non-NULL udata parameter is supplied + * so that property lists containing image callbacks can be discarded without a memory leak. + * If the udata parameter (below) is NULL, this parameter should be NULL as well. The + * parameter of the udata_free callback is defined as follows: + *
      + *
    • udata contains the pointer to the user data block to be freed.
    • + *
    • udata_free returns 0 (SUCCEED) on success and -1 (FAIL) on failure.
    • + *
  • + *
+ * \li udata contains a pointer value, potentially to user-defined data, that will be passed to the + * image_malloc, image_memcpy, image_realloc, and image_free callbacks. The semantics of the values + * that can be set for the file_image_op parameter to the above callbacks are described in the table below: + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Values for the file_image_op parameter
#H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SETThis value is passed to the image_malloc and image_memcpy + * callbacks when an image buffer is being copied while being set in a FAPL.
#H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPYThis + * value is passed to the image_malloc and image_memcpy callbacks when an image buffer is being copied when + * a FAPL is copied.
#H5FD_FILE_IMAGE_OP_PROPERTY_LIST_GETThis value is passed to the image_malloc and image_memcpy + * callbacks when an image buffer is being copied while being retrieved from a FAPL.
#H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSEThis value is passed to the image_free callback + * when an image buffer is being released during a FAPL close operation.
#H5FD_FILE_IMAGE_OP_FILE_OPENThis value is passed to the image_malloc and image_memcpy + * callbacks when an image buffer is copied during a file open operation. While the image being opened will + * typically be copied from a FAPL, this need not always be the case. An example of an exception is when the + * Core file driver takes its initial image from a file.
#H5FD_FILE_IMAGE_OP_FILE_RESIZEThis value is passed to the image_realloc + * callback when a file driver needs to resize an image buffer.
#H5FD_FILE_IMAGE_OP_FILE_CLOSEThis value is passed + * to the image_free callback when an image buffer is being released during a file close operation.
+ * + * In closing our discussion of #H5Pset_file_image_callbacks, we note the interaction between this call and + * the #H5Pget_file_image/#H5Pset_file_image calls above: since the malloc, memcpy, and free callbacks defined + * in the instance of #H5FD_file_image_callbacks_t are used by #H5Pget_file_image/#H5Pset_file_image, + * #H5Pset_file_image_callbacks will fail if a file image is already set in the target property list. + * + * For more information on writing the file image to disk, set the backing_store parameter. See the + * #H5Pset_fapl_core entry in the \ref RM. + * + * \anchor FI214

#H5Pget_file_image_callbacks

+ * The #H5Pget_file_image_callbacks routine is designed to obtain the current file image callbacks from a file + * access property list. + * + * The signature of #H5Pget_file_image_callbacks() is defined as follows: + * \code + * herr_t H5Pget_file_image_callbacks(hid_t fapl_id, H5FD_file_image_callbacks_t *callbacks_ptr) + * \endcode + * The parameters of #H5Pget_file_image_callbacks are defined as follows: + * \li fapl_id contains the ID of the target file access property list. + * \li callbacks_ptr contains a pointer to an + * instance of the #H5FD_file_image_callbacks_t structure. All fields should be initialized to NULL. See + * the \ref subsubsec_file_image_semantics_cbk section for more information on the + * #H5FD_file_image_callbacks_t structure. + * + * Upon successful return, the fields of callbacks_ptr shall contain values as defined below: + * \li callbacks_ptr->image_malloc will contain the pointer passed as the image_malloc + * field of the instance of #H5FD_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the + * last call to #H5Pset_file_image_callbacks for the specified FAPL, or NULL if there has been no such call. + * \li callbacks_ptr->image_memcpy will contain the pointer passed as the image_memcpy field + * of the instance of #H5FD_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last + * call to #H5Pset_file_image_callbacks for the specified FAPL, or NULL if there has been no such call. \li + * callbacks_ptr->image_realloc will contain the pointer passed as the image_realloc field of the instance of + * #H5FD_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to + * #H5Pset_file_image_callbacks for the specified FAPL, or NULL if there has been no such call. \li + * callbacks_ptr->image_free_ptr will contain the pointer passed as the image_free field of the instance of + * #H5FD_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to + * #H5Pset_file_image_callbacks for the specified FAPL, or NULL if there has been no such call. \li + * callbacks_ptr->udata_copy will contain the pointer passed as the udata_copy field of the instance of + * #H5FD_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to + * #H5Pset_file_image_callbacks for the specified FAPL, or NULL if there has been no such call. + * \li callbacks_ptr-> udata_free will contain the pointer passed as the udata_free field of the instance + * of #H5FD_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to + * #H5Pset_file_image_callbacks() for the specified FAPL, or NULL if there has been no such call. \li + * callbacks_ptr->udata will contain the pointer passed as the udata field of the instance of + * #H5FD_file_image_callbacks_t pointed to by the callbacks_ptr parameter of the last call to + * #H5Pset_file_image_callbacks for the specified FAPL, or NULL if there has been no such call. + * + * \anchor FI215

Virtual File Driver Feature Flags

+ * Implementation of the #H5Pget_file_image_callbacks/#H5Pset_file_image_callbacks + * and #H5Pget_file_image/#H5Pset_file_image function calls requires a pair of + * virtual file driver feature flags. The flags are #H5FD_FEAT_ALLOW_FILE_IMAGE and + * #H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS. Both of these are defined in H5FDpublic.h. + * + * The first flag, #H5FD_FEAT_ALLOW_FILE_IMAGE, allows a file driver to indicate whether or not it supports + * file images. A VFD that sets this flag when its ‘query’ callback is invoked indicates that the file image + * set in the FAPL will be used as the initial contents of a file. Support for setting an initial file image + * is designed primarily for use with the Core VFD. However, any VFD can indicate support for this feature by + * setting the flag and copying the image in an appropriate way for the VFD (possibly by writing the image to + * a file and then opening the file). However, such a VFD need not employ the file image after file open time. + * In such cases, the VFD will not make an in-memory copy of the file image and will not employ the file image + * callbacks. + * + * File drivers that maintain a copy of the file in memory (only the Core file driver at present) can be + * constructed to use the initial image callbacks (if defined). Those that do must set + * the #H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag, the second flag, when their ‘query’ callbacks are + * invoked. + * + * Thus file drivers that set the #H5FD_FEAT_ALLOW_FILE_IMAGE flag but not the + * #H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flag may read the supplied image from the property list (if + * present) and use it to initialize the contents of the file. However, they will not discard the image when + * done, nor will they make any use of any file image callbacks (if defined). + * + * If an initial file image appears in a file allocation property list that is used in an H5Fopen() call, and + * if the underlying file driver does not set the #H5FD_FEAT_ALLOW_FILE_IMAGE flag, then the open will fail. + * + * If a driver sets both the #H5FD_FEAT_ALLOW_FILE_IMAGE flag and the #H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS + * flag, then that driver will allocate a buffer of the required size, copy the contents of the initial image + * buffer from the file access property list, and then open the copy as if it had just loaded it from file. If + * the file image allocation callbacks are defined, the driver shall use them for all memory management tasks. + * Otherwise it will use the standard malloc, memcpy, realloc, and free C library calls for this purpose. + * + * If the VFD sets the #H5FD_FEAT_ALLOW_FILE_IMAGE flag, and an initial file image is defined by an + * application, the VFD should ensure that file creation operations (as opposed to file open operations) + * bypass use of the file image, and create a new, empty file. + * + * Finally, it is logically possible that a file driver would set the #H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS + * flag, but not the #H5FD_FEAT_ALLOW_FILE_IMAGE flag. While it is hard to think of a situation in which this + * would be desirable, setting the flags this way will not cause any problems: the two capabilities are + * logically distinct. + * + * \anchor FI216

#H5Fget_file_image

+ * The purpose of the #H5Fget_file_image routine is to provide a simple way to retrieve a copy of the image of + * an existing, open file. This routine can be used with files opened using the SEC2 (aka POSIX), STDIO, + * and Core (aka Memory) VFDs. + * + * The signature of #H5Fget_file_image is defined as follows: + * \code + * ssize_t H5Fget_file_image(hid_t file_id, void *buf_ptr, size_t buf_len) + * \endcode + * + * The parameters of #H5Fget_file_image are defined as follows: + * \li file_id contains the ID of the target file. + * \li buf_ptr contains a pointer to the buffer into which the image + * of the HDF5 file is to be copied. If buf_ptr is NULL, no data will be copied, but the return value will + * still indicate the buffer size required (or a negative value on error). + * \li buf_len contains the size of the + * supplied buffer. If the return value of #H5Fget_file_image is a positive value, then the value will be the + * length of buffer required to store the file image (in other words, the length of the file). A negative + * value might be returned if the file is too large to store in the supplied buffer or on failure. + * + * The current file size can be obtained via a call to #H5Fget_filesize. Note that this function returns the + * value of the end of file (EOF) and not the end of address space (EOA). While these values are frequently + * the same, it is possible for the EOF to be larger than the EOA. Since #H5Fget_file_image will only obtain + * a copy of the file from the beginning of the superblock to the EOA, it will be best to use + * #H5Fget_file_image to determine the size of the buffer required to contain the image. + * + *

Other Design Considerations

+ * + * Here are some other notes regarding the design and implementation of #H5Fget_file_image. + * + * The #H5Fget_file_image call should be part of the high-level library. However, a file driver agnostic + * implementation of the routine requires access to data structures that are hidden within the HDF5 Library. + * We chose to implement the call in the library proper rather than expose those data structures. + * + * There is no reason why the #H5Fget_file_image API call could not work on files opened with any file driver. + * However, the Family, Multi, and Split file drivers have issues that make the call problematic. At present, + * files opened with the Family file driver are marked as being created with that file driver in the + * superblock, and the HDF5 Library refuses to open files so marked with any other file driver. This negates + * the purpose of the #H5Fget_file_image call. While this mark can be removed from the image, the necessary + * code is not trivial. + * + * Thus we will not support the Family file driver in #H5Fget_file_image unless there is demand for it. Files + * created with the Multi and Split file drivers are also marked in the superblock. In addition, they + * typically use a very sparse address space. A sparse address space would require the use of an impractically + * large buffer for an image, and most of the buffer would be empty. So, we see no point in supporting the + * Multi and Split file drivers in #H5Fget_file_image under any foreseeable circumstances. + * + * \subsubsection subsubsec_file_image_api_high High-level C API Routine + * The #H5LTopen_file_image high-level routine encapsulates the capabilities of routines in the main + * HDF5 Library with conveniently accessible abstractions. + * + * \anchor FI221

#H5LTopen_file_image

+ * The #H5LTopen_file_image routine is designed to provide an easier way to open an initial file image + * with the Core VFD. Flags to #H5LTopen_file_image allow for various file image buffer ownership policies + * to be requested. See the \ref RM for more information on high-level APIs. + * + * The signature of #H5LTopen_file_image is defined as follows: + * \code + * hid_t H5LTopen_file_image(void *buf_ptr, size_t buf_len, unsigned flags) + * \endcode + * + * The parameters of #H5LTopen_file_image are defined as follows: + * \li buf_ptr contains a pointer to the supplied initial image. A NULL value is invalid and will + * cause #H5LTopen_file_image to fail. + * \li buf_len contains the size of the supplied buffer. A value of 0 is invalid and will cause + * #H5LTopen_file_image to fail. \li flags contains a set of flags indicating whether the image is to be + * opened read/write, whether HDF5 is to take control of the buffer, and how long the application promises to + * maintain the buffer. Possible flags are described in the table below: + * + * + * + * + * + * + * + *
Flags + * for #H5LTopen_file_image
#H5LT_FILE_IMAGE_OPEN_RWIndicates that the HDF5 + * Library should open the image read/write instead of the default read-only.
#H5LT_FILE_IMAGE_DONT_COPYIndicates that the HDF5 Library should not copy the file image + * buffer provided, but should use it directly. The HDF5 Library will release the file image when finished. + * The supplied buffer must have been allocated via a call to the standard C library malloc() or calloc() + * routines. The HDF5 Library will call free() to release the buffer. In the absence of this flag, the HDF5 + * Library will copy the buffer provided. The #H5LT_FILE_IMAGE_DONT_COPY flag provides an application with + * the ability to “give ownership” of a file image buffer to the HDF5 Library.
+ * The HDF5 Library will modify the buffer on write if the image is opened read/write and + * the #H5LT_FILE_IMAGE_DONT_COPY flag is set.
+ * The #H5LT_FILE_IMAGE_DONT_RELEASE flag, see below, is invalid unless the #H5LT_FILE_IMAGE_DONT_COPY flag is + * set.
#H5LT_FILE_IMAGE_DONT_RELEASEIndicates that the HDF5 Library should not attempt to release the + * buffer when the file is closed. This implies that the application will tend to this detail and that the + * application will not discard the buffer until after the file image is closed.
+ * Since there is no way to return a changed buffer base address to the application, and since realloc + * can change this value, calls to realloc() must be barred when this flag is set. As a result, any + * write that requires an increased buffer size will fail.
+ * This flag is invalid unless the #H5LT_FILE_IMAGE_DONT_COPY flag, see above, is set.
+ * If the #H5LT_FILE_IMAGE_DONT_COPY flag is set and this flag is not set, the HDF5 Library will release the + * file image buffer after the file is closed using the standard C library free() routine.
+ * Using this flag and the #H5LT_FILE_IMAGE_DONT_COPY flag provides a way for the application to specify a + * buffer that the HDF5 Library can use for opening and accessing as a file image while letting + * the application retain ownership of the buffer.
+ * + * The following table is intended to summarize the semantics of the #H5LT_FILE_IMAGE_DONT_COPY + * and #H5LT_FILE_IMAGE_DONT_RELEASE flags (shown as “Don’t Copy Flag” and “Don’t Release Flag” + * respectively in the table): + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + *
Summary of Don’t Copy and Don’t Release Flag Actions
Don’t Copy FlagDon’t Release FlagMake Copy of User Supplied BufferPass User + * Supplied Buffer to File DriverRelease User Supplied Buffer When DonePermit realloc of + * Buffer Used by File Driver
FalseDon’t careTrueFalseFalseTrue
TrueFalseFalseTrueTrueTrue
TrueTrueFalseTrueFalseFalse
+ * + * The return value of #H5LTopen_file_image will be a file ID on success or a negative value on failure. + * The file ID returned should be closed with #H5Fclose. + * + * Note that there is no way currently to specify a “backing store” file name in this definition of + * #H5LTopen_file_image. + * + * \subsection subsec_file_image_semantics C API Call Semantics + * The purpose of this chapter is to describe some issues that developers should consider when + * using file image buffers, property lists, and callback APIs. + * + * \subsubsection subsubsec_file_image_semantics_cbk File Image Callback Semantics + * The #H5Pget_file_image_callbacks/#H5Pset_file_image_callbacks API calls allow an application to hook the + * memory management operations used when allocating, duplicating, and discarding file images in the property + * list, in the Core file driver, and potentially in any in-memory file driver developed in the future. + * + * From the perspective of the HDF5 Library, the supplied image_malloc(), image_memcpy(), image_realloc(), + * and image_free() callback routines must function identically to the C standard library malloc(), + * memcpy(), realloc(), and free() calls. What happens on the application side can be much more nuanced, + * particularly with the ability to pass user data to the callbacks. However, whatever the application + * does with these calls, it must maintain the illusion that the calls have had the expected effect. + * Maintaining this illusion requires some understanding of how the property list structure works, and what + * HDF5 will do with the initial images passed to it. + * + * At the beginning of this document, we talked about the need to work within the constraints of the property + * list mechanism. When we said “from the perspective of the HDF5 Library…” in the paragraph above, we are + * making reference to this point. + * + * The property list mechanism was developed as a way to add parameters to functions without changing the + * parameter list and breaking existing code. However, it was designed to use only “call by value” semantics, + * not “call by reference”. The decision to use “call by value” semantics requires that the values of supplied + * variables be copied into the property list. This has the advantage of simplifying the copying and deletion + * of property lists. However, if the value to be copied is large (say a 2 GB file image), the overhead can be + * unacceptable. + * + * The usual solution to this problem is to use “call by reference” where only a pointer to an object is + * placed in a parameter list rather than a copy of the object itself. However, use of “call by reference” + * semantics would greatly complicate the property list mechanism: at a minimum, it would be necessary to + * maintain reference counts to dynamically allocated objects so that the owner of the object would know when + * it was safe to free the object. + * + * After much discussion, we decided that the file image operations calls were sufficiently specialized that + * it made no sense to rework the property list mechanism to support “call by reference.” Instead we provided + * the file image callback mechanism to allow the user to implement some version of “call by reference” when + * needed. It should be noted that we expect this mechanism to be used rarely if at all. For small file + * images, the copying overhead should be negligible, and for large images, most use cases should be addressed + * by the #H5LTopen_file_image call. + * + * In the (hopefully) rare event that use of the file image callbacks is necessary, the fundamental point to + * remember is that the callbacks must be constructed and used in such a way as to maintain the library’s + * illusion that it is using “call by value” semantics. + * + * Thus the property list mechanism must think that it is allocating a new buffer and copying the supplied + * buffer into it when the file image property is set. Similarly, it must think that it is allocating a new + * buffer and copying the contents of the existing buffer into it when it copies a property list that contains + * a file image. Likewise, it must think it is de-allocating a buffer when it discards a property list that + * contains a file image. + * + * Similar illusions must be maintained when a file image buffer is copied into the Core file driver (or any + * future driver that uses the file image callbacks) when the file driver re-sizes the buffer containing the + * image and finally when the driver discards the buffer. + * + * \anchor FI311

Buffer Ownership

+ * The owner of a file image in a buffer is the party that has the responsibility to discard the file + * image buffer when it is no longer needed. In this context, the owner is either the HDF5 Library or + * the application program. + * + * We implemented the image_* callback facility to allow efficient management of large file images. These + * facilities can be used to allow sharing of file image buffers between the application and the HDF5 library, + * and also transfer of ownership in either direction. In such operations, care must be taken to ensure that + * ownership is clear and that file image buffers are not discarded before all references to them are + * discarded by the non-owning party. + * + * Ownership of a file image buffer will only be passed to the application program if the file image callbacks + * are designed to do this. In such cases, the application program must refrain from freeing the buffer until + * the library has deleted all references to it. This in turn will happen after all property lists (if any) + * that refer to the buffer have been discarded, and the file driver (if any) that used the buffer has closed + * the file and thinks it has discarded the buffer. + * + * \anchor FI312

Sharing a File image Buffer with the HDF5 Library

+ * As mentioned above, the HDF5 property lists are a mechanism for passing values into HDF5 Library calls. + * They were created to allow calls to be extended with new parameters without changing the actual API or + * breaking existing code. They were designed based on the assumption that all new parameters would + * be “call by value” and not “call by reference.” Having “call by value” parameters means property lists + * can be copied, reused, and discarded with ease. + * + * Suppose an application wished to share a file image buffer with the HDF5 Library. This means the + * library would be allowed to read the file image, but not free it. The file image callbacks might + * be constructed as follows to share a buffer: + * \li Construct the image_malloc() call so that it returns the address of the buffer instead of allocating + * new space. This will keep the library thinking that the buffers are distinct even when they are not. + * Support this by including the address of the buffer in the user data. As a sanity check, include + * the buffer’s size in the user data as well, and require image_malloc() to fail if the requested + * buffer size is unexpected. Finally, include a reference counter in the user data, and increment + * the reference counter on each call to image_malloc(). + * \li Construct the image_memcpy() call so that it + * does nothing. As a sanity check, make it fail if the source and destination pointers do not match + * the buffer address in the user data or if the size is unexpected. + * \li Construct the image_free() + * routine so that it does nothing. As a sanity check, make it compare the supplied pointer with the + * expected pointer in the user data. Also, make it decrement the reference counter and notify the + * application that the HDF5 Library is done with the buffer when the reference count drops to 0. + * + * As the property list code will never resize a buffer, we do not discuss the image_realloc() call here. + * The behavior of image_realloc() in this scenario depends on what the application wants to do with + * the file image after it has been opened. We discuss this issue in the next section. Note also that + * the operation passed into the file image callbacks allow the callbacks to behave differently depending + * on the context in which they are used. + * + * For more information on user defined data, see the \ref subsubsec_file_image_semantics_cbk section. + * + * \anchor FI313

File Driver Considerations

+ * When a file image is opened by a driver that sets both the #H5FD_FEAT_ALLOW_FILE_IMAGE and + * the #H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS flags, the driver will allocate a buffer large enough + * for the initial file image and then copy the image from the property list into this buffer. As + * processing progresses, the driver will reallocate the image as necessary to increase its size and + * will eventually discard the image at file close. If defined, the driver will use the file image + * callbacks for these operations; otherwise, the driver will use the standard C library calls. See + * the \ref subsubsec_file_image_semantics_cbk section for more information. + * + * As described above, the file image callbacks can be constructed so as to avoid the overhead of buffer + * allocations and copies while allowing the HDF5 Library to maintain its illusions on the subject. There + * are two possible complications involving the file driver. The complications are the possibility of + * reallocation calls from the driver and the possibility of the continued existence of property lists + * containing references to the buffer. + * + * Suppose an application wishes to share a file image buffer with the HDF5 Library. The application allows + * the library to read (and possibly write) the image, but not free it. We must first decide whether the + * image is to be opened read-only or read/write. + * + * If the image will be opened read-only (or if we know that any writes will not change the size of the + * image), the image_realloc() call should never be invoked. Thus the image_realloc() routine can be + * constructed so as to always fail, and the image_malloc(), image_memcpy(), and image_free() routines can be + * constructed as described in the section above. + * + * Suppose, however, that the file image will be opened read/write and may grow during the computation. We + * must now allow for the base address of the buffer to change due to reallocation calls, and we must employ + * the user data structure to communicate any change in the buffer base address and size to the application. + * We pass buffer changes to the application so that the application will be able to eventually free the + * buffer. To this end, we might define a user data structure as shown in the example below: + * + * Using a user data structure to communicate with an application + * \code + * typedef struct udata { + * void *init_ptr; + * size_t init_size; + * int init_ref_count; + * void *mod_ptr; + * size_t mod_size; + * int mod_ref_count; + * } + * \endcode + * + * We initialize an instance of the structure so that init_ptr points to the buffer to be shared, + * init_size contains the initial size of the buffer, and all other fields are initialized to + * either NULL or 0 as indicated by their type. We then pass a pointer to the instance of the + * user data structure to the HDF5 Library along with allocation callback functions constructed as follows: + * \li Construct the image_malloc() call so that it returns the value in the init_ptr field of the user data + * structure and increments the init_ref_count. As a sanity check, the function should fail if the + * requested size does not match the init_size field in the user data structure or if any of the modified + * fields have values other than their initial values. \li Construct the image_memcpy() call so that it does + * nothing. As a sanity check, it should be made to fail if the source, destination, and size parameters do + * not match the init_ptr and init_size fields as appropriate. \li Construct the image_realloc() call so that + * it performs a standard realloc. Sanity checking, assuming that the realloc is successful, should be as + * follows:
  • If the mod_ptr, mod_size, or mod_ref_count fields of the user data structure still have + * their initial values, verify that the supplied pointer matches the init_ptr field and that the supplied + * size does not match the init_size field. Decrement init_ref_count, set mod_ptr equal to the address + * returned by realloc, set mod_size equal to the supplied size, and set mod_ref_count to 1.
  • + *
  • If the mod_ptr, mod_size, or mod_ref_count fields of the user data structure are defined, verify + * that the supplied pointer matches the value of mod_ptr and that the supplied size does not match + * mod_size. Set mod_ptr equal to the value returned by realloc, and set mod_size equal to the supplied + * size.
  • + *
+ * In both cases, if all sanity checks pass, return the value returned by the realloc call. Otherwise, + * return NULL. \li Construct the image_free() routine so that it does nothing. Perform sanity checks as + * follows:
  • If the #H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE flag is set, decrement the init_ref_count + * field of the user data structure. Flag an error if init_ref_count drops below zero.
  • If the + * #H5FD_FILE_IMAGE_OP_FILE_CLOSE flag is set, check to see if the mod_ptr, mod_size, or mod_ref_count fields + * of the user data structure have been modified from their initial values. If they have, verify that + * mod_ref_count contains 1 and then set that field to zero. If they have not been modified, proceed as + * per the #H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE case.
  • + *
+ * + * In either case, if both the init_ref_count and mod_ref_count + * fields have dropped to zero, notify the application that the HDF5 Library is done with the buffer. If the + * mod_ptr or mod_size fields have been modified, pass these values on to the application as well. + * + * \subsubsection subsubsec_file_image_semantics_init Initial File Image Semantics + * One can argue whether creating a file with an initial file image is closer to creating a file + * or opening a file. The consensus seems to be that it is closer to a file open, and thus we shall + * require that the initial image only be used for calls to #H5Fopen. + * + * Whatever our convention, from an internal perspective, opening a file with an initial file image is a + * bit of both creating a file and opening a file. Conceptually, we will create a file on disk, write the + * supplied image to the file, close the file, open the file as an HDF5 file, and then proceed as usual + * (of course, the Core VFD will not write to the file system unless it is configured to do so). This process + * is similar to a file create: we are creating a file that did not exist on disk to begin with and writing + * data to it. Also, we must verify that no file of the supplied name is open. However, this process is + * also similar to a file open: we must read the superblock and handle the usual file open tasks. + * + * Implementing the above sequence of actions has a number of implications on the behavior of the #H5Fopen + * call when an initial file image is supplied: + * \li #H5Fopen must fail if the target file driver does not set the #H5FD_FEAT_ALLOW_FILE_IMAGE flag and + * a file image is specified in the FAPL. + * \li If the target file driver supports the #H5FD_FEAT_ALLOW_FILE_IMAGE flag, then #H5Fopen must fail if + * the file is already open or if a file of the specified name exists. + * \li Even if the above constraints are satisfied, #H5Fopen must still fail if the image does not contain + * a valid (or perhaps just plausibly valid) image of an HDF5 file. In particular, the superblock must + * be processed, and the file structure be set up accordingly. + * + * See the \ref FI215 section for more information. + * + * As we indicated earlier, if an initial file image appears in the property list of an #H5Fcreate call, it is + * ignored. + * + * While the above section on the semantics of the file image callbacks may seem rather gloomy, + * we get the payback here. The above says everything that needs to be said about initial file + * image semantics in general. The sub-section below has a few more observations on the Core file driver. + * + * \anchor FI321

Applying Initial File Image Semantics to the Core File Driver

+ * At present, the Core file driver uses the open() and read() system calls to load an HDF5 file image from + * the file system into RAM. Further, if the backing_store flag is set in the FAPL entry specifying the use of + * the Core file driver, the Core file driver’s internal image will be used to overwrite the source file on + * either flush or close. See the #H5Pset_fapl_core entry in the \ref RM for more information. + * + * This results in the following observations. In all cases assume that use of the Core file driver has been + * specified in the FAPL. \li If the file specified in the #H5Fopen call does not exist, and no initial image + * is specified in the FAPL, the open must fail because there is no source for the initial image needed by the + * Core file driver. \li If the file specified in the #H5Fopen call does exist, and an initial image is + * specified in the FAPL, the open must fail because the source of the needed initial image is ambiguous: the + * file image could be taken either from file or from the FAPL. \li If the file specified in the #H5Fopen call + * does not exist, and an initial image is specified in the FAPL, the open will succeed. This assumes that the + * supplied image is valid. Further, if the backing store flag is set, the file specified in the #H5Fopen call + * will be created, and the contents of the Core file driver’s internal buffer will be written to the new file + * on flush or close. + * + * Thus a call to #H5Fopen can result in the creation of a new HDF5 file in the file system. + * + * \subsection subsec_file_image_example Examples + * The purpose of this chapter is to provide examples of how to read or build an in-memory HDF5 file image. + * + * \subsubsection subsubsec_file_image_example_read Reading an In-memory HDF5 File Image + * The #H5Pset_file_image function call allows the Core file driver to be initialized from an application + * provided buffer. The following pseudo code illustrates its use: + * + * Example 2. Using #H5Pset_file_image to initialize the Core file driver + * \code + * + * + * + * H5Pset_file_image(fapl_id, buf, buf_len); + * + * + * + * + * \endcode + * + * This solution is easy to code, but the supplied buffer is duplicated twice. The first time is in the call + * to #H5Pset_file_image when the image is duplicated and the duplicate inserted into the property list. The + * second time is when the file is opened: the image is copied from the property list into the initial buffer + * allocated by the Core file driver. This is a non-issue for small images, but this could become a + * significant performance hit for large images. + * + * If we want to avoid the extra malloc and memcpy calls, we must decide whether the application should + * retain ownership of the buffer or pass ownership to the HDF5 Library. + * + * The following pseudo code illustrates opening the image read-only using the #H5LTopen_file_image() + * routine. In this example, the application retains ownership of the buffer and avoids extra buffer + * allocations and memcpy calls. + * + * Example 3. Using H5LTopen_file_image to open a read-only file image where the application retains + * ownership of the buffer \code hid_t file_id; unsigned flags + * = H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE; file_id = H5LTopen_file_image(buf, buf_len, + * flags); \endcode + * + * If the application wants to transfer ownership of the buffer to the HDF5 Library, and the standard + * C library routine free is an acceptable way of discarding it, the above example can be modified as follows: + * + * Example 4. Using H5LTopen_file_image to open a read-only file image where the application transfers + * ownership of the buffer \code hid_t file_id; unsigned flags + * = H5LT_FILE_IMAGE_DONT_COPY; file_id = H5LTopen_file_image(buf, buf_len, flags); \endcode + * + * Again, file access is read-only. Read/write access can be obtained via the #H5LTopen_file_image call, but + * we will explore that in the section below. + * + * \subsubsection subsubsec_file_image_example_const In-memory HDF5 File Image Construction + * Before the implementation of file image operations, HDF5 supported construction of an image of an + * HDF5 file in memory with the Core file driver. The #H5Fget_file_image function call allows an + * application access to the file image without first writing it to disk. + * See the following code fragment: + * + * Example 5. Accessing the image of a file in memory + * \code + * + * H5Fflush(fid); + * size = H5Fget_file_image(fid, NULL, 0); + * buffer_ptr = malloc(size); + * H5Fget_file_image(fid, buffer_ptr, size); + * \endcode + * + * The use of #H5Fget_file_image may be acceptable for small images. For large images, the cost of the + * malloc() and memcpy() operations may be excessive. To address this issue, the #H5Pset_file_image_callbacks + * call allows an application to manage dynamic memory allocation for file images and memory-based file + * drivers (only the Core file driver at present). The following code fragment illustrates its use. Note + * that most error checking is omitted for simplicity and that #H5Pset_file_image is not used to set the + * initial file image. + * + * Example 6. Using #H5Pset_file_image_callbacks to improve memory allocation + * \code + * struct udata_t { + * void * image_ptr; + * size_t image_size; + * } udata = {NULL, 0}; + * + * void *image_malloc(size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * ((struct udata_t *)udata)->image_size = size; + * return(malloc(size)); + * } + * + * void *image_memcpy)(void *dest, const void *src, size_t size, + * H5FD_file_image_op_t file_image_op, void *udata) { + * assert(FALSE); // Should never be invoked in this scenario. + * return(NULL); // always fails + * } + * + * void image_realloc(void *ptr, size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * ((struct udata_t *)udata)->image_size = size; + * return(realloc(ptr, size)); + * } + * + * herr_t image_free(void *ptr, H5FD_file_image_op_t file_image_op, void *udata) { + * assert(file_image_op == H5FD_FILE_IMAGE_OP_FILE_CLOSE); + * ((struct udata_t *)udata)->image_ptr = ptr; + * return(0); // if we get here, we must have been successful + * } + * + * void *udata_copy(void *udata) { + * return(udata); + * } + * + * herr_t udata_free(void *udata) { + * return(0); + * } + * + * H5FD_file_image_callbacks_t callbacks = {image_malloc, image_memcpy, + * image_realloc, image_free, udata_copy, udata_free, (void *)(&udata)}; + * + * + * + * H5Pset_file_image_callbacks(fapl_id, &callbacks); + * + * + * + * assert(udata.image_ptr!= NULL); + * + * // udata now contains the base address and length of the final version of the core file + * + * + * \endcode + * + * The above code fragment gives the application full ownership of the buffer used by the Core file driver + * after the file is closed, and it notifies the application that the HDF5 Library is done with the buffer by + * setting udata.image_ptr to something other than NULL. If read access to the buffer is sufficient, + * the #H5Fget_vfd_handle call can be used as an alternate solution to get access to the base address of + * the Core file driver’s buffer. + * + * The above solution avoids some unnecessary malloc and memcpy calls and should be quite adequate if an + * image of an HDF5 file is constructed only occasionally. However, if an HDF5 file image must be + * constructed regularly, and if we can put a strong and tight upper bound on the size of the necessary + * buffer, then the following pseudo code demonstrates a method of avoiding memory allocation completely. + * The downside, however, is that buffer is allocated statically. Again, much error checking is omitted for + * clarity. + * + * Example 7. Using #H5Pset_file_image_callbacks with a static buffer + * \code + * char buf[BIG_ENOUGH]; + * struct udata_t { + * void * image_ptr; + * size_t image_size; + * size_t max_image_size; + * int ref_count; + * } udata = {(void *)(&(buf[0]), 0, BIG_ENOUGH, 0}; + * + * void *image_malloc(size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * assert(size <= ((struct udata_t *)udata)->max_image_size); + * assert(((struct udata_t *)udata)->ref_count == 0); + * ((struct udata_t *)udata)->image_size = size; + * (((struct udata_t *)udata)->ref_count)++; + * return((((struct udata_t *)udata)->image_ptr); + * } + * + * void *image_memcpy)(void *dest, const void *src, size_t size, H5FD_file_image_op_t file_image_op, void + * *udata) { assert(FALSE); // Should never be invoked in this scenario. return(NULL); // always fails + * } + * + * void *image_realloc(void *ptr, size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * assert(ptr == ((struct udata_t *)udata)->image_ptr); + * assert(size <= ((struct udata_t *)udata)->max_image_size); + * assert(((struct udata_t *)udata)->ref_count == 1); + * ((struct udata_t *)udata)->image_size = size; + * return((((struct udata_t *)udata)->image_ptr); + * } + * + * herr_t image_free(void *ptr, H5FD_file_image_op_t file_image_op, void *udata) { + * assert(file_image_op == H5FD_FILE_IMAGE_OP_FILE_CLOSE); + * assert(ptr == ((struct udata_t *)udata)->image_ptr); + * assert(((struct udata_t *)udata)->ref_count == 1); + * (((struct udata_t *)udata)->ref_count)--; + * return(0); // if we get here, we must have been successful + * } + * + * void *udata_copy(void *udata) { + * return(udata); + * } + * + * herr_t udata_free(void *udata) { + * return(0); + * } + * + * H5FD_file_image_callbacks_t callbacks = {image_malloc, image_memcpy, image_realloc, image_free, + * udata_copy, udata_free, (void *)(&udata)}; + * // end of initialization + * + * + * + * H5Pset_file_image_callbacks(fapl_id, &callbacks); + * + * + * + * + * + * + * + * assert(udata.ref_count == 0); + * + * // udata now contains the base address and length of the final version of the core file + * + * + * \endcode + * + * If we can further arrange matters so that only the contents of the datasets in the HDF5 file image change, + * but not the structure of the file itself, we can optimize still further by re-using the image and changing + * only the contents of the datasets after the initial write to the buffer. The following pseudo code shows + * how this might be done. Note that the code assumes that buf already contains the image of the HDF5 file + * whose dataset contents are to be overwritten. Again, much error checking is omitted for clarity. Also, + * observe that the file image callbacks do not support the #H5Pget_file_image call. + * + * Example 8. Using #H5Pset_file_image_callbacks where only the datasets change + * \code + * + * + * + * + * void *image_malloc(size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * assert(size <= ((struct udata_t *)udata)->max_image_size); + * assert(size == ((struct udata_t *)udata)->image_size); + * assert(((struct udata_t *)udata)->ref_count >= 0); + * ((struct udata_t *)udata)->image_size = size; + * (((struct udata_t *)udata)->ref_count)++; + * return((((struct udata_t *)udata)->image_ptr); + * } + * + * void *image_memcpy)(void *dest, const void *src, size_t size, + * H5FD_file_image_op_t file_image_op, void *udata) { + * assert(dest == ((struct udata_t *)udata)->image_ptr); + * assert(src == ((struct udata_t *)udata)->image_ptr); + * assert(size <= ((struct udata_t *)udata)->max_image_size); + * assert(size == ((struct udata_t *)udata)->image_size); + * assert(((struct udata_t *)udata)->ref_count >= 1); + * return(dest); // if we get here, we must have been successful + * } + * + * void *image_realloc(void *ptr, size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * // One would think that this function is not needed in this scenario, as + * // only the contents of the HDF5 file is being changed, not its size or + * // structure. However, the Core file driver calls realloc() just before + * // close to clip the buffer to the size indicated by the end of the + * // address space. + * // + * // While this call must be supported in this case, the size of + * // the image should never change. Hence the function can limit itself + * // to performing sanity checks, and returning the base address of the + * // statically allocated buffer. + * // + * assert(ptr == ((struct udata_t *)udata)->image_ptr); + * assert(size <= ((struct udata_t *)udata)->max_image_size); + * assert(((struct udata_t *)udata)->ref_count >= 1); + * assert(((struct udata_t *)udata)->image_size == size); + * return((((struct udata_t *)udata)->image_ptr); + * } + * + * herr_t image_free(void *ptr, H5FD_file_image_op_t file_image_op, void *udata) { + * assert((file_image_op == H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE) || + * (file_image_op == H5FD_FILE_IMAGE_OP_FILE_CLOSE)); + * assert(((struct udata_t *)udata)->ref_count >= 1); + * (((struct udata_t *)udata)->ref_count)--; + * return(0); // if we get here, we must have been successful + * } + * + * void *udata_copy(void *udata) { + * return(udata); + * } + * + * herr_t udata_free(void *udata) { + * return(0); + * } + * + * H5FD_file_image_callbacks_t callbacks = {image_malloc, image_memcpy, image_realloc, image_free, + * udata_copy, udata_free, (void *)(&udata)}; + * // end of initialization + * + * + * + * H5Pset_file_image_callbacks(fapl_id, &callbacks); + * H5Pset_file_image(fapl_id, udata.image_ptr, udata.image_len); + * + * + * + * + * + * + * + * assert(udata.ref_count == 0); + * + * // udata now contains the base address and length of the final version of the core file + * + * + * + * \endcode + * + * Before we go on, we should note that the above pseudo code can be written more compactly, albeit with + * fewer sanity checks, using the #H5LTopen_file_image call. See the example below: + * + * Example 9. Using #H5LTopen_file_image where only the datasets change + * \code + * + * + * + * + * hid_t file_id; + * + * unsigned flags = H5LT_FILE_IMAGE_OPEN_RW | H5LT_FILE_IMAGE_DONT_COPY | H5LT_FILE_IMAGE_DONT_RELEASE; + * // end initialization + * + * file_id = H5LTopen_file_image(udata.image_ptr, udata.image_len, flags); + * + * + * + * // udata now contains the base address and length of the final version of the core file + * + * + * + * \endcode + * + * While the scenario above is plausible, we will finish this section with a more general scenario. In + * the pseudo code below, we assume sufficient RAM to retain the HDF5 file image between uses, but we + * do not assume that the HDF5 file structure remains constant or that we can place a hard per bound on the + * image size. + * + * Since we must use malloc, realloc, and free in this example, and since realloc can change the base + * address of a buffer, we must maintain two of ptr, size, and ref_count triples in the udata structure. + * The first triple is for the property list (which will never change the buffer), and the second triple + * is for the file driver. As shall be seen, this complicates the file image callbacks considerably. + * Note also that while we do not use H5Pget_file_image() in this example, we do include support for it + * in the file image callbacks. As usual, much error checking is omitted in favor of clarity. + * + * Example 10. Using #H5LTopen_file_image where only the datasets change and where the file structure and + * image size might not be constant \code struct udata_t { void* fapl_image_ptr; size_t fapl_image_size; + * int fapl_ref_count; + * void* vfd_image_ptr; + * size_t vfd_image_size; + * int vfd_ref_count; + * } udata = {NULL, 0, 0, NULL, 0, 0}; + * + * boolean initial_file_open = TRUE; + * void *image_malloc(size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * void * return_value = NULL; + * + * switch ( file_image_op ) { + * case H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SET: + * case H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY: + * assert(((struct udata_t *)udata)->fapl_image_ptr != NULL); + * assert(((struct udata_t *)udata)->fapl_image_size == size); + * assert(((struct udata_t *)udata)->fapl_ref_count >= 0); + * return_value = ((struct udata_t *)udata)->fapl_image_ptr; + * (((struct udata_t *)udata)->fapl_ref_count)++; + * break; + * + * case H5FD_FILE_IMAGE_OP_PROPERTY_LIST_GET: + * assert(((struct udata_t *)udata)->fapl_image_ptr != NULL); + * assert(((struct udata_t *)udata)->vfd_image_size == size); + * assert(((struct udata_t *)udata)->fapl_ref_count >= 1); + * return_value = ((struct udata_t *)udata)->fapl_image_ptr; + * // don’t increment ref count + * break; + * + * case H5FD_FILE_IMAGE_OP_FILE_OPEN: + * assert(((struct udata_t *)udata)->vfd_image_ptr == NULL); + * assert(((struct udata_t *)udata)->vfd_image_size == 0); + * assert(((struct udata_t *)udata)->vfd_ref_count == 0); + * if (((struct udata_t *)udata)->fapl_image_ptr == NULL ) { + * ((struct udata_t *)udata)->vfd_image_ptr = malloc(size); + * ((struct udata_t *)udata)->vfd_image_size = size; + * } + * else { + * assert(((struct udata_t *)udata)->fapl_image_size == size); + * assert(((struct udata_t *)udata)->fapl_ref_count >= 1); + * ((struct udata_t *)udata)->vfd_image_ptr = ((struct udata_t *)udata)->fapl_image_ptr; + * ((struct udata_t *)udata)->vfd_image_size = size; + * } + * return_value = ((struct udata_t *)udata)->vfd_image_ptr; + * (((struct udata_t *)udata)->vfd_ref_count)++; + * break; + * + * default: + * assert(FALSE); + * } + * return(return_value); + * } + * + * void *image_memcpy)(void *dest, const void *src, size_t size, H5FD_file_image_op_t file_image_op, void + * *udata) { switch(file_image_op) { case H5FD_FILE_IMAGE_OP_PROPERTY_LIST_SET: case + * H5FD_FILE_IMAGE_OP_PROPERTY_LIST_COPY: case H5FD_FILE_IMAGE_OP_PROPERTY_LIST_GET: assert(dest == ((struct + * udata_t *)udata)->fapl_image_ptr); assert(src == ((struct udata_t *)udata)->fapl_image_ptr); assert(size == + * ((struct udata_t *)udata)->fapl_image_size); assert(((struct udata_t *)udata)->fapl_ref_count >= 1); break; + * + * case H5FD_FILE_IMAGE_OP_FILE_OPEN: + * assert(dest == ((struct udata_t *)udata)->vfd_image_ptr); + * assert(src == ((struct udata_t *)udata)->fapl_image_ptr); + * assert(size == ((struct udata_t *)udata)->fapl_image_size); + * assert(size == ((struct udata_t *)udata)->vfd_image_size); + * assert(((struct udata_t *)udata)->fapl_ref_count >= 1); + * assert(((struct udata_t *)udata)->vfd_ref_count == 1); + * break; + * + * default: + * assert(FALSE); + * break; + * } + * return(dest); // if we get here, we must have been successful + * } + * + * void *image_realloc(void *ptr, size_t size, H5FD_file_image_op_t file_image_op, void *udata) { + * assert(ptr == ((struct udata_t *)udata)->vfd_image_ptr); + * assert(((struct udata_t *)udata)->vfd_ref_count == 1); + * ((struct udata_t *)udata)->vfd_image_ptr = realloc(ptr, size); + * ((struct udata_t *)udata)->vfd_image_size = size; + * return((((struct udata_t *)udata)->vfd_image_ptr); + * } + * + * herr_t image_free(void *ptr, H5FD_file_image_op_t file_image_op, void *udata) { + * switch(file_image_op) { + * case H5FD_FILE_IMAGE_OP_PROPERTY_LIST_CLOSE: + * assert(ptr == ((struct udata_t *)udata)->fapl_image_ptr); + * assert(((struct udata_t *)udata)->fapl_ref_count >= 1); + * (((struct udata_t *)udata)->fapl_ref_count)--; + * break; + * + * case H5FD_FILE_IMAGE_OP_FILE_CLOSE: + * assert(ptr == ((struct udata_t *)udata)->vfd_image_ptr); + * assert(((struct udata_t *)udata)->vfd_ref_count == 1); + * (((struct udata_t *)udata)->vfd_ref_count)--; + * break; + * + * default: + * assert(FALSE); + * break; + * } + * return(0); // if we get here, we must have been successful + * } + * + * void *udata_copy(void *udata) { + * return(udata); + * } + * + * herr_t udata_free(void *udata) { + * return(0); + * } + * + * H5FD_file_image_callbacks_t callbacks = {image_malloc, image_memcpy, image_realloc, image_free, + * udata_copy, udata_free, (void *)(&udata)}; + * // end of initialization + * + * + * + * H5Pset_file_image_callbacks(fapl_id, &callbacks); + * if ( initial_file_open ) { + * initial_file_open = FALSE; + * } + * else { + * assert(udata.vfd_image_ptr != NULL); + * assert(udata.vfd_image_size > 0); + * assert(udata.vfd_ref_count == 0); + * assert(udata.fapl_ref_count == 0); + * udata.fapl_image_ptr = udata.vfd_image_ptr; + * udata.fapl_image_size = udata.vfd_image_size; + * udata.vfd_image_ptr = NULL; + * udata.vfd_image_size = 0; + * H5Pset_file_image(fapl_id, udata.fapl_image_ptr, udata.fapl_image_size); + * } + * + * + * + * + * + * + * + * assert(udata.fapl_ref_count == 0); + * assert(udata.vfd_ref_count == 0); + * + * // udata.vfd_image_ptr and udata.vfd_image_size now contain the base address + * // and length of the final version of the core file + * + * + * + * + * + * \endcode + * + * The above pseudo code shows how a buffer can be passed back and forth between the application and the + * HDF5 Library. The code also shows the application having control of the actual allocation, reallocation, + * and freeing of the buffer. + * + * \subsubsection subsubsec_file_image_example_dp Using HDF5 to Construct and Read a Data Packet + * Using the file image operations described in this document, we can bundle up data in an image of an + * HDF5 file on one process, transmit the image to a second process, and then open and read the image on + * the second process without any mandatory file system I/O. + * + * We have already demonstrated the construction and reading of such buffers above, but it may be useful + * to offer an example of the full operation. We do so in the example below using as simple a set of calls + * as possible. The set of calls in the example has extra buffer allocations. To reduce extra buffer + * allocations, see the sections above. + * + * In the following example, we construct an HDF5 file image on process A and then transmit the image to + * process B where we then open the image and extract the desired data. Note that no file system I/O is + * performed: all the processing is done in memory with the Core file driver. + * + * Example 11. Building and passing a file image from one process to another + * + * + * + * + *
*** Process A ****** Process B ***
+ * \code + * + * H5Fflush(fid); + * size = H5Fget_file_image(fid, NULL, 0); + * buffer_ptr = malloc(size); + * H5Fget_file_image(fid, buffer_ptr, size); + * + * + * free(buffer_ptr); + * + * \endcode + * + * \code + * hid_t file_id; + * + * buffer_ptr = malloc(size) + * + * file_id = H5LTopen_file_image(buf, + * buf_len, + * H5LT_FILE_IMAGE_DONT_COPY); + * + * \endcode + *
+ * + * \subsubsection subsubsec_file_image_example_template Using a Template File + * After the above examples, an example of the use of a template file might seem anti-climactic. A + * template file might be used to enforce consistency on file structure between files or in parallel + * HDF5 to avoid long sequences of collective operations to create the desired groups, datatypes, + * and possibly datasets. The following pseudo code outlines a potential use: + * + * Example 12. Using a template file + * \code + * + * + * + * + * + * + * + * + * + * + * + * + * + * \endcode + * + * Observe that the above pseudo code includes an unnecessary buffer allocation and copy in the call + * to #H5Pset_file_image. As we have already discussed ways of avoiding this, we will not address that issue + * here. + * + * What is interesting in this case is to consider why the application would find this use case attractive. + * + * In the serial case, at first glance there seems little reason to use the initial image facility at all. + * It is easy enough to use standard C calls to duplicate a template file, rename it as desired, and then + * open it as an HDF5 file. + * + * However, this assumes that the template file will always be available and in the expected place. This + * is a questionable assumption for an application that will be widely distributed. Thus, we can at least + * make an argument for either keeping an image of the template file in the executable or for including + * code for writing the desired standard definitions to new HDF5 files. + * + * Assuming the image is relatively small, we can further make an argument for the image in place of the code, + * as, quite simply, the image should be easier to maintain and modify with an HDF5 file editor. + * + * However, there remains the question of why one should pass the image to the HDF5 Library instead of writing + * it directly with standard C calls and then using HDF5 to open it. Other than convenience and a slight + * reduction in code size, we are hard pressed to offer a reason. + * + * In contrast, the argument is stronger in the parallel case since group, datatype, and dataset creations are + * all expensive collective operations. The argument is also weaker: simply copying an existing template file + * and opening it should lose many of its disadvantages in the HPC context although we would imagine that it + * is always useful to reduce the number of files in a deployment. + * + * In closing, we would like to consider one last point. In the parallel case, we would expect template files + * to be quite large. Parallel HDF5 requires eager space allocation for chunked datasets. For similar reasons, + * we would expect template files in this context to contain long sequences of zeros with a scattering of + * metadata here and there. Such files would compress well, and the compressed images would be cheap to + * distribute across the available processes if necessary. Once distributed, each process could uncompress the + * image and write to file those sections containing actual data that lay within the section of the file + * assigned to the process. This approach might be significantly faster than a simple copy as it would allow + * sparse writes, and thus it might provide a compelling use case for template files. However, this approach + * would require extending our current API to allow compressed images. We would also have to add the + * H5Pget_image_decompression_callback/H5Pset_image_decompression_callback API calls. We see no problem in + * doing this. However, it is beyond the scope of the current effort, and thus we will not pursue the matter + * further unless there is interest in our doing so. + * + * \subsection subsec_file_image_java Java Signatures for File Image Operations API Calls + * Java function call signatures for the file image operation APIs have not yet been implemented, and there + * are no immediate plans for implementation. + * + * \subsection subsec_file_image_fort Fortran Signatures for File Image Operations API Calls + * Fortran function call signatures for the file image operation APIs are described in this section. + * + * \subsubsection subsubsec_file_image_fort_low + * The Fortran low-level APIs make use of Fortran 2003’s ISO_C_BINDING module in order to achieve portable + * and standard conforming interoperability with the C APIs. The C pointer (C_PTR) and function pointer + * (C_FUN_PTR) types are returned from the intrinsic procedures C_LOC(X) and C_FUNLOC(X), respectively, + * defined in the ISO_C_BINDING module. The argument X is the data or function to which the C pointers point + * to and must have the TARGET attribute in the calling program. Note that the variable name lengths of the + * Fortran equivalent of the predefined C constants were shortened to less than 31 characters in order to be + * Fortran standard compliant. + * + * + * + * + *
h5pget_file_image_f
+ * \code + * SUBROUTINE h5pget_file_image_f(fapl_id, buf_ptr, buf_len_ptr, hdferr) + * IMPLICIT NONE + * INTEGER(HID_T) , INTENT(IN) :: fapl_id + * TYPE(C_PTR) , INTENT(IN), DIMENSION(*) :: buf_ptr + * INTEGER(SIZE_T), INTENT(OUT) :: buf_len_ptr + * INTEGER , INTENT(OUT) :: hdferr + * \endcode + *
+ * + * + * + * + *
h5pset_file_image_f
+ * \code + * SUBROUTINE h5pset_file_image_f(fapl_id, buf_ptr, buf_len, hdferr) + * IMPLICIT NONE + * INTEGER(HID_T) , INTENT(IN) :: fapl_id + * TYPE(C_PTR) , INTENT(IN) :: buf_ptr + * INTEGER(SIZE_T), INTENT(IN) :: buf_len + * INTEGER , INTENT(OUT) :: hdferr + * \endcode + *
+ * + * + * + * + *
h5fget_file_image_f
+ * \code + * SUBROUTINE h5fget_file_image_f(file_id, buf_ptr, buf_len, hdferr, buf_size) + * IMPLICIT NONE + * INTEGER(HID_T) , INTENT(IN) :: file_id + * TYPE(C_PTR) , INTENT(INOUT) :: buf_ptr + * INTEGER(SIZE_T), INTENT(IN) :: buf_len + * INTEGER , INTENT(OUT) :: hdferr + * INTEGER(SIZE_T), INTENT(OUT) , OPTIONAL :: buf_size + * \endcode + *
+ * + * \subsubsection subsubsec_file_image_fort_high + * Fortran function call signatures for the file image operation APIs have not yet been implemented yet. + * + * Previous Chapter \ref sec_vol - Next Chapter \ref sec_async + * */ /** diff --git a/src/H5Fmount.c b/src/H5Fmount.c index 6f497468e3e..fb3ba603c9d 100644 --- a/src/H5Fmount.c +++ b/src/H5Fmount.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fmpi.c b/src/H5Fmpi.c index 4e6ca64253d..78909aa1bf2 100644 --- a/src/H5Fmpi.c +++ b/src/H5Fmpi.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -432,7 +432,7 @@ H5F_mpi_retrieve_comm(hid_t loc_id, hid_t acspl_id, MPI_Comm *mpi_comm) bool H5F_get_coll_metadata_reads(const H5F_t *file) { - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file && file->shared); @@ -458,7 +458,7 @@ H5F_shared_get_coll_metadata_reads(const H5F_shared_t *f_sh) H5P_coll_md_read_flag_t file_flag = H5P_USER_FALSE; bool ret_value = false; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI_NOINIT_NOERR assert(f_sh); @@ -536,7 +536,7 @@ H5F_set_coll_metadata_reads(H5F_t *file, H5P_coll_md_read_flag_t *file_flag, boo H5P_coll_md_read_flag_t prev_file_flag = H5P_USER_FALSE; bool prev_context_flag = false; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI_NOINIT_NOERR assert(file && file->shared); assert(file_flag); diff --git a/src/H5Fpkg.h b/src/H5Fpkg.h index 275fa378f0e..3fd7cb624d8 100644 --- a/src/H5Fpkg.h +++ b/src/H5Fpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fprivate.h b/src/H5Fprivate.h index 5d9f5011927..1894a49cd1b 100644 --- a/src/H5Fprivate.h +++ b/src/H5Fprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -124,7 +124,7 @@ typedef struct H5F_t H5F_t; #define H5F_HAS_FEATURE(F, FL) (H5F_has_feature(F, FL)) #define H5F_BASE_ADDR(F) (H5F_get_base_addr(F)) #define H5F_SYM_LEAF_K(F) (H5F_sym_leaf_k(F)) -#define H5F_KVALUE(F, T) (H5F_Kvalue(F, T)) +#define H5F_KVALUE(F, T) (H5F_kvalue(F, T)) #define H5F_NREFS(F) (H5F_get_nrefs(F)) #define H5F_SIZEOF_ADDR(F) (H5F_sizeof_addr(F)) #define H5F_SIZEOF_SIZE(F) (H5F_sizeof_size(F)) @@ -493,7 +493,7 @@ typedef enum H5F_prefix_open_t { /* Private functions */ H5_DLL herr_t H5F_init(void); -H5_DLL herr_t H5F_open(bool try, H5F_t **file, const char *name, unsigned flags, hid_t fcpl_id, +H5_DLL herr_t H5F_open(bool attempt, H5F_t **file, const char *name, unsigned flags, hid_t fcpl_id, hid_t fapl_id); H5_DLL herr_t H5F_try_close(H5F_t *f, bool *was_closed /*out*/); H5_DLL hid_t H5F_get_file_id(H5VL_object_t *vol_obj, H5I_type_t obj_type, bool app_ref); @@ -532,7 +532,7 @@ H5_DLL uint64_t H5F_get_rfic_flags(const H5F_t *f); /* Functions than retrieve values set/cached from the superblock/FCPL */ H5_DLL haddr_t H5F_get_base_addr(const H5F_t *f); H5_DLL unsigned H5F_sym_leaf_k(const H5F_t *f); -H5_DLL unsigned H5F_Kvalue(const H5F_t *f, const struct H5B_class_t *type); +H5_DLL unsigned H5F_kvalue(const H5F_t *f, const struct H5B_class_t *type); H5_DLL unsigned H5F_get_nrefs(const H5F_t *f); H5_DLL uint8_t H5F_sizeof_addr(const H5F_t *f); H5_DLL uint8_t H5F_sizeof_size(const H5F_t *f); @@ -657,9 +657,9 @@ H5_DLL herr_t H5F_shared_get_mpi_file_sync_required(const H5F_shared_t *f_sh, H5_DLL herr_t H5F_efc_close(H5F_t *parent, H5F_t *file); /* File prefix routines */ -H5_DLL herr_t H5F_prefix_open_file(bool try, H5F_t **file, H5F_t *primary_file, H5F_prefix_open_t prefix_type, - const char *prop_prefix, const char *file_name, unsigned file_intent, - hid_t fapl_id); +H5_DLL herr_t H5F_prefix_open_file(bool attempt, H5F_t **file, H5F_t *primary_file, + H5F_prefix_open_t prefix_type, const char *prop_prefix, + const char *file_name, unsigned file_intent, hid_t fapl_id); /* Global heap CWFS routines */ H5_DLL herr_t H5F_cwfs_add(H5F_t *f, struct H5HG_heap_t *heap); diff --git a/src/H5Fpublic.h b/src/H5Fpublic.h index 53dfaa78c31..1fb32c2c142 100644 --- a/src/H5Fpublic.h +++ b/src/H5Fpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -20,48 +20,28 @@ #include "H5ACpublic.h" /* Metadata Cache */ #include "H5Ipublic.h" /* Identifiers */ -/* When this header is included from a private header, don't make calls to H5check() */ -#undef H5CHECK -#ifndef H5private_H -#define H5CHECK H5check(), -#else /* H5private_H */ -#define H5CHECK -#endif /* H5private_H */ - -/* When this header is included from a private HDF5 header, don't make calls to H5open() */ -#undef H5OPEN -#ifndef H5private_H -#define H5OPEN H5open(), -#else /* H5private_H */ -#define H5OPEN -#endif /* H5private_H */ - /* * These are the bits that can be passed to the `flags' argument of * H5Fcreate() and H5Fopen(). Use the bit-wise OR operator (|) to combine - * them as needed. As a side effect, they call H5check_version() to make sure - * that the application is compiled with a version of the hdf5 header files - * which are compatible with the library to which the application is linked. - * We're assuming that these constants are used rather early in the hdf5 - * session. - */ -#define H5F_ACC_RDONLY (H5CHECK H5OPEN 0x0000u) /**< Absence of RDWR: read-only */ -#define H5F_ACC_RDWR (H5CHECK H5OPEN 0x0001u) /**< Open for read and write */ -#define H5F_ACC_TRUNC (H5CHECK H5OPEN 0x0002u) /**< Overwrite existing files */ -#define H5F_ACC_EXCL (H5CHECK H5OPEN 0x0004u) /**< Fail if file already exists*/ + * them as needed. + */ +#define H5F_ACC_RDONLY (0x0000u) /**< Absence of RDWR: read-only */ +#define H5F_ACC_RDWR (0x0001u) /**< Open for read and write */ +#define H5F_ACC_TRUNC (0x0002u) /**< Overwrite existing files */ +#define H5F_ACC_EXCL (0x0004u) /**< Fail if file already exists*/ /* NOTE: 0x0008u was H5F_ACC_DEBUG, now deprecated */ -#define H5F_ACC_CREAT (H5CHECK H5OPEN 0x0010u) /**< Create non-existing files */ +#define H5F_ACC_CREAT (0x0010u) /**< Create non-existing files */ #define H5F_ACC_SWMR_WRITE \ - (H5CHECK 0x0020u) /**< Indicate that this file is open for writing in a \ - * single-writer/multi-reader (SWMR) scenario. \ - * Note that the process(es) opening the file for reading \ - * must open the file with #H5F_ACC_RDONLY and use the \ - * #H5F_ACC_SWMR_READ access flag. */ + (0x0020u) /**< Indicate that this file is open for writing in a \ + * single-writer/multi-reader (SWMR) scenario. \ + * Note that the process(es) opening the file for reading \ + * must open the file with #H5F_ACC_RDONLY and use the \ + * #H5F_ACC_SWMR_READ access flag. */ #define H5F_ACC_SWMR_READ \ - (H5CHECK 0x0040u) /**< Indicate that this file is open for reading in a \ - * single-writer/multi-reader (SWMR) scenario. Note that \ - * the process(es) opening the file for SWMR reading must \ - * also open the file with the #H5F_ACC_RDONLY flag. */ + (0x0040u) /**< Indicate that this file is open for reading in a \ + * single-writer/multi-reader (SWMR) scenario. Note that \ + * the process(es) opening the file for SWMR reading must \ + * also open the file with the #H5F_ACC_RDONLY flag. */ /** * Default property list identifier @@ -69,7 +49,7 @@ * \internal Value passed to H5Pset_elink_acc_flags to cause flags to be taken from the parent file. * \internal ignore setting on lapl */ -#define H5F_ACC_DEFAULT (H5CHECK H5OPEN 0xffffu) +#define H5F_ACC_DEFAULT (0xffffu) /* Flags for H5Fget_obj_count() & H5Fget_obj_ids() calls */ #define H5F_OBJ_FILE (0x0001u) /**< File objects */ @@ -183,18 +163,16 @@ typedef struct H5F_sect_info_t { */ typedef enum H5F_libver_t { H5F_LIBVER_ERROR = -1, - H5F_LIBVER_EARLIEST = 0, /**< Use the earliest possible format for storing objects */ - H5F_LIBVER_V18 = 1, /**< Use the latest v18 format for storing objects */ - H5F_LIBVER_V110 = 2, /**< Use the latest v110 format for storing objects */ - H5F_LIBVER_V112 = 3, /**< Use the latest v112 format for storing objects */ - H5F_LIBVER_V114 = 4, /**< Use the latest v114 format for storing objects */ - H5F_LIBVER_V116 = 5, /**< Use the latest v116 format for storing objects */ - H5F_LIBVER_V118 = 6, /**< Use the latest v118 format for storing objects */ + H5F_LIBVER_EARLIEST = 0, /**< Use the earliest possible file format for storing objects */ + H5F_LIBVER_V18 = 1, /**< Use the 1.8 file format for storing objects */ + H5F_LIBVER_V110 = 2, /**< Use the 1.10 file format for storing objects */ + H5F_LIBVER_V112 = 3, /**< Use the 1.12 file format for storing objects */ + H5F_LIBVER_V114 = 4, /**< Use the 1.14 file format for storing objects */ + H5F_LIBVER_V200 = 5, /**< Use the 2.0 file format for storing objects */ + H5F_LIBVER_LATEST = 5, /**< Use the latest file format for storing objects */ H5F_LIBVER_NBOUNDS /**< Sentinel */ } H5F_libver_t; -#define H5F_LIBVER_LATEST H5F_LIBVER_V118 - /** * File space handling strategy */ @@ -1044,7 +1022,7 @@ H5_DLL herr_t H5Fincrement_filesize(hid_t file_id, hsize_t increment); * * \note \Bold{Recommended Reading:} This function is part of the file image * operations feature set. It is highly recommended to study the guide - * \ref_file_image_ops before using this feature set. + * \ref H5FIM_UG before using this feature set. * * \attention H5Pget_file_image() will fail, returning a negative value, if the * file is too large for the supplied buffer. @@ -1879,7 +1857,7 @@ H5_DLL herr_t H5Fformat_convert(hid_t fid); #ifndef H5_NO_DEPRECATED_SYMBOLS /* Macros */ -#define H5F_ACC_DEBUG (H5CHECK H5OPEN 0x0000u) /**< Print debug info \deprecated In which version? */ +#define H5F_ACC_DEBUG (0x0000u) /**< Print debug info \deprecated In which version? */ /* Typedefs */ diff --git a/src/H5Fquery.c b/src/H5Fquery.c index 526795a9870..8d02a9dc9ab 100644 --- a/src/H5Fquery.c +++ b/src/H5Fquery.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -515,7 +515,7 @@ H5F_get_min_dset_ohdr(const H5F_t *f) } /* end H5F_get_min_dset_ohdr */ /*------------------------------------------------------------------------- - * Function: H5F_Kvalue + * Function: H5F_kvalue * * Purpose: Replaced a macro to retrieve a B-tree key value for a certain * type, now that the generic properties are being used to store @@ -527,7 +527,7 @@ H5F_get_min_dset_ohdr(const H5F_t *f) *------------------------------------------------------------------------- */ unsigned -H5F_Kvalue(const H5F_t *f, const H5B_class_t *type) +H5F_kvalue(const H5F_t *f, const H5B_class_t *type) { /* Use FUNC_ENTER_NOAPI_NOINIT_NOERR here to avoid performance issues */ FUNC_ENTER_NOAPI_NOINIT_NOERR @@ -538,7 +538,7 @@ H5F_Kvalue(const H5F_t *f, const H5B_class_t *type) assert(type); FUNC_LEAVE_NOAPI(f->shared->sblock->btree_k[type->id]) -} /* end H5F_Kvalue() */ +} /* end H5F_kvalue() */ /*------------------------------------------------------------------------- * Function: H5F_get_nrefs @@ -1365,7 +1365,7 @@ H5F_get_use_file_locking(const H5F_t *f) bool H5F_has_vector_select_io(const H5F_t *f, bool is_write) { - bool ret_value; /* Return value */ + bool ret_value = false; /* Return value */ FUNC_ENTER_NOAPI_NOINIT_NOERR diff --git a/src/H5Fsfile.c b/src/H5Fsfile.c index 6cf2c809b8c..7eb4422be02 100644 --- a/src/H5Fsfile.c +++ b/src/H5Fsfile.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fspace.c b/src/H5Fspace.c index 9c6afd3f226..e73218d3ee1 100644 --- a/src/H5Fspace.c +++ b/src/H5Fspace.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Fsuper.c b/src/H5Fsuper.c index 39c92f34b17..1a84c455f83 100644 --- a/src/H5Fsuper.c +++ b/src/H5Fsuper.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -71,8 +71,7 @@ static const unsigned HDF5_superblock_ver_bounds[] = { HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V110 */ HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V112 */ HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V114 */ - HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V116 */ - HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V118 */ + HDF5_SUPERBLOCK_VERSION_3, /* H5F_LIBVER_V200 */ HDF5_SUPERBLOCK_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; @@ -432,45 +431,27 @@ H5F__super_read(H5F_t *f, H5P_genplist_t *fa_plist, bool initial_read) HGOTO_ERROR(H5E_FILE, H5E_CANTPROTECT, FAIL, "unable to load superblock"); /* - * When opening a file with SWMR-write access, the library will first - * check to ensure that superblock version 3 is used. Otherwise fail - * file open. - * - * Then the library will upgrade the file's low_bound depending on - * superblock version as follows: - * --version 0 or 1: no change to low_bound - * --version 2: upgrade low_bound to at least V18 - * --version 3: upgrade low_bound to at least V110 + * When opening a file with SWMR-write access, the library will check to + * ensure that: + * --superblock version 3 is used + * --superblock version does not exceed the version allowed by high bound + * --upgrade low_bound to at least V110 + * Otherwise fail file open for SMWR-write access * * Upgrading low_bound will give the best format versions available for * that superblock version. Due to the possible upgrade, the fapl returned * from H5Fget_access_plist() might indicate a low_bound higher than what * the user originally set. * - * After upgrading low_bound, the library will check to ensure that the - * superblock version does not exceed the version allowed by high_bound. - * Otherwise fail file open. - * * For details, please see RFC:Setting Bounds for Object Creation in HDF5 1.10.0. */ - - /* Check to ensure that superblock version 3 is used for SWMR-write access */ if (H5F_INTENT(f) & H5F_ACC_SWMR_WRITE) { if (sblock->super_vers < HDF5_SUPERBLOCK_VERSION_3) HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "superblock version for SWMR is less than 3"); - } - - /* Upgrade low_bound to at least V18 when encountering version 2 superblock */ - if (sblock->super_vers == HDF5_SUPERBLOCK_VERSION_2) - f->shared->low_bound = MAX(H5F_LIBVER_V18, f->shared->low_bound); - - /* Upgrade low_bound to at least V110 when encountering version 3 superblock */ - if (sblock->super_vers >= HDF5_SUPERBLOCK_VERSION_3) + if (sblock->super_vers > HDF5_superblock_ver_bounds[f->shared->high_bound]) + HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "superblock version exceeds high bound"); f->shared->low_bound = MAX(H5F_LIBVER_V110, f->shared->low_bound); - - /* Version bounds check */ - if (sblock->super_vers > HDF5_superblock_ver_bounds[f->shared->high_bound]) - HGOTO_ERROR(H5E_FILE, H5E_BADVALUE, FAIL, "superblock version exceeds high bound"); + } /* Pin the superblock in the cache */ if (H5AC_pin_protected_entry(sblock) < 0) diff --git a/src/H5Fsuper_cache.c b/src/H5Fsuper_cache.c index 2a425099b47..8a040cbed7c 100644 --- a/src/H5Fsuper_cache.c +++ b/src/H5Fsuper_cache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ftest.c b/src/H5Ftest.c index 7e34e0af9b9..540ef9c9b91 100644 --- a/src/H5Ftest.c +++ b/src/H5Ftest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -82,9 +82,10 @@ herr_t H5F__get_sohm_mesg_count_test(hid_t file_id, unsigned type_id, size_t *mesg_count) { - H5F_t *file; /* File info */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5F_t *file; /* File info */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -93,7 +94,7 @@ H5F__get_sohm_mesg_count_test(hid_t file_id, unsigned type_id, size_t *mesg_coun HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file"); /* Push API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -123,9 +124,10 @@ H5F__get_sohm_mesg_count_test(hid_t file_id, unsigned type_id, size_t *mesg_coun herr_t H5F__check_cached_stab_test(hid_t file_id) { - H5F_t *file; /* File info */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5F_t *file; /* File info */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -134,7 +136,7 @@ H5F__check_cached_stab_test(hid_t file_id) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a file"); /* Push API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_FILE, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; diff --git a/src/H5G.c b/src/H5G.c index 8919788c809..5fb9d3b6506 100644 --- a/src/H5G.c +++ b/src/H5G.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gbtree2.c b/src/H5Gbtree2.c index fcefd1d0214..0a2291d8942 100644 --- a/src/H5Gbtree2.c +++ b/src/H5Gbtree2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gcache.c b/src/H5Gcache.c index 9e34e77c253..f16eb75a860 100644 --- a/src/H5Gcache.c +++ b/src/H5Gcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gcompact.c b/src/H5Gcompact.c index 4ed675118ba..50d3d69a5b9 100644 --- a/src/H5Gcompact.c +++ b/src/H5Gcompact.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gdense.c b/src/H5Gdense.c index 531549e6423..6d081f33bfa 100644 --- a/src/H5Gdense.c +++ b/src/H5Gdense.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gdeprec.c b/src/H5Gdeprec.c index 287f609553e..c24fc549b8d 100644 --- a/src/H5Gdeprec.c +++ b/src/H5Gdeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gent.c b/src/H5Gent.c index 2d6ece74083..3dcc618262b 100644 --- a/src/H5Gent.c +++ b/src/H5Gent.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gint.c b/src/H5Gint.c index 2580bf08ce0..c037b99de8b 100644 --- a/src/H5Gint.c +++ b/src/H5Gint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -89,6 +89,9 @@ static herr_t H5G__close_cb(H5VL_object_t *grp_vol_obj, void **request); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare a free list to manage the H5G_t struct */ H5FL_DEFINE(H5G_t); H5FL_DEFINE(H5G_shared_t); @@ -112,6 +115,9 @@ static const H5I_class_t H5I_GROUP_CLS[1] = {{ (H5I_free_t)H5G__close_cb /* Callback routine for closing objects of this class */ }}; +/* Flag indicating "top" of interface has been initialized */ +static bool H5G_top_package_initialize_s = false; + /*------------------------------------------------------------------------- * Function: H5G_init * @@ -128,13 +134,48 @@ H5G_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5G_init() */ + +/*------------------------------------------------------------------------- + * Function: H5G__init_package + * + * Purpose: Initializes the H5G interface. + * + * Return: Non-negative on success/Negative on failure + * + * Programmer: Robb Matzke + * Monday, January 5, 1998 + * + * Notes: The group creation properties are registered in the property + * list interface initialization routine (H5P_init_package) + * so that the file creation property class can inherit from it + * correctly. (Which allows the file creation property list to + * control the group creation properties of the root group of + * a file) QAK - 24/10/2005 + * + *------------------------------------------------------------------------- + */ +herr_t +H5G__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE + /* Initialize the ID group for the group IDs */ if (H5I_register_type(H5I_GROUP_CLS) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTINIT, FAIL, "unable to initialize interface"); + /* Mark "top" of interface as initialized, too */ + H5G_top_package_initialize_s = true; + done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5G_init() */ +} /* end H5G__init_package() */ /*------------------------------------------------------------------------- * Function: H5G_top_term_package @@ -154,10 +195,16 @@ H5G_top_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - if (H5I_nmembers(H5I_GROUP) > 0) { - (void)H5I_clear_type(H5I_GROUP, false, false); - n++; - } + if (H5G_top_package_initialize_s) { + if (H5I_nmembers(H5I_GROUP) > 0) { + (void)H5I_clear_type(H5I_GROUP, false, false); + n++; + } + + /* Mark closed */ + if (0 == n) + H5G_top_package_initialize_s = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5G_top_term_package() */ @@ -183,11 +230,18 @@ H5G_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Sanity checks */ - assert(0 == H5I_nmembers(H5I_GROUP)); + if (H5_PKG_INIT_VAR) { + /* Sanity checks */ + assert(0 == H5I_nmembers(H5I_GROUP)); + assert(false == H5G_top_package_initialize_s); + + /* Destroy the group object id group */ + n += (H5I_dec_type_ref(H5I_GROUP) > 0); - /* Destroy the group object id group */ - n += (H5I_dec_type_ref(H5I_GROUP) > 0); + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5G_term_package() */ diff --git a/src/H5Glink.c b/src/H5Glink.c index 1982f54984c..4614d622a3c 100644 --- a/src/H5Glink.c +++ b/src/H5Glink.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gloc.c b/src/H5Gloc.c index 7bb59ea9e2f..d22ffd6a779 100644 --- a/src/H5Gloc.c +++ b/src/H5Gloc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -581,17 +581,13 @@ H5G__loc_exists_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc /*in*/, const char H5_ATTR_ const H5O_link_t H5_ATTR_UNUSED *lnk, H5G_loc_t *obj_loc, void *_udata /*in,out*/, H5G_own_loc_t *own_loc /*out*/) { - bool *exists = (bool *)_udata; /* User data passed in */ - herr_t ret_value = SUCCEED; /* Return value */ + bool *exists = (bool *)_udata; /* User data passed in */ - FUNC_ENTER_PACKAGE + FUNC_ENTER_PACKAGE_NOERR /* Check if the name in this group resolved to a valid object */ if (obj_loc == NULL) - if (lnk) - *exists = false; - else - HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "no object or link info?"); + *exists = false; else *exists = true; @@ -599,8 +595,7 @@ H5G__loc_exists_cb(H5G_loc_t H5_ATTR_UNUSED *grp_loc /*in*/, const char H5_ATTR_ * location for the object */ *own_loc = H5G_OWN_NONE; -done: - FUNC_LEAVE_NOAPI(ret_value) + FUNC_LEAVE_NOAPI(SUCCEED) } /* end H5G__loc_exists_cb() */ /*------------------------------------------------------------------------- diff --git a/src/H5Gmodule.h b/src/H5Gmodule.h index 49fc9ed9472..901f3b5b640 100644 --- a/src/H5Gmodule.h +++ b/src/H5Gmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5G_MODULE -#define H5_MY_PKG H5G -#define H5_MY_PKG_ERR H5E_SYM +#define H5_MY_PKG H5G +#define H5_MY_PKG_ERR H5E_SYM +#define H5_MY_PKG_INIT YES /** \page H5G_UG HDF5 Groups * @@ -343,7 +344,7 @@ * * h5dump is described on the “HDF5 Tools” page of the \ref RM. * - * The HDF5 DDL grammar is described in the @ref DDLBNF114. + * The HDF5 DDL grammar is described in the @ref DDLBNF200. * * \subsection subsec_group_function Group Function Summaries * Functions that can be used with groups (\ref H5G functions) and property list functions that can used diff --git a/src/H5Gname.c b/src/H5Gname.c index 4a1225b2ffd..a6c9afdd860 100644 --- a/src/H5Gname.c +++ b/src/H5Gname.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -199,17 +199,23 @@ H5G__common_path(const H5RS_str_t *fullpath_r, const H5RS_str_t *prefix_r) size_t nchars1, nchars2; /* Number of characters in components */ htri_t ret_value = false; /* Return value */ - FUNC_ENTER_PACKAGE_NOERR + FUNC_ENTER_PACKAGE /* Get component of each name */ - fullpath = H5RS_get_str(fullpath_r); - assert(fullpath); - fullpath = H5G__component(fullpath, &nchars1); - assert(fullpath); - prefix = H5RS_get_str(prefix_r); - assert(prefix); - prefix = H5G__component(prefix, &nchars2); - assert(prefix); + if (NULL == (fullpath = H5RS_get_str(fullpath_r))) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve full path"); + nchars1 = SIZE_MAX; + if (NULL == (fullpath = H5G__component(fullpath, &nchars1))) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve pointer to path component"); + if (SIZE_MAX == nchars1) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve component length"); + if (NULL == (prefix = H5RS_get_str(prefix_r))) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve path prefix"); + nchars2 = SIZE_MAX; + if (NULL == (prefix = H5G__component(prefix, &nchars2))) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve pointer to path component"); + if (SIZE_MAX == nchars2) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve component length"); /* Check if we have a real string for each component */ while (*fullpath && *prefix) { @@ -226,6 +232,15 @@ H5G__common_path(const H5RS_str_t *fullpath_r, const H5RS_str_t *prefix_r) assert(fullpath); prefix = H5G__component(prefix, &nchars2); assert(prefix); + if (NULL == (fullpath = H5G__component(fullpath, &nchars1))) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve pointer to path component"); + if (SIZE_MAX == nchars1) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve component length"); + nchars2 = SIZE_MAX; + if (NULL == (prefix = H5G__component(prefix, &nchars2))) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve pointer to path component"); + if (SIZE_MAX == nchars2) + HGOTO_ERROR(H5E_SYM, H5E_CANTGET, FAIL, "can't retrieve component length"); } /* end if */ else HGOTO_DONE(false); diff --git a/src/H5Gnode.c b/src/H5Gnode.c index c89417750e2..d647096b18c 100644 --- a/src/H5Gnode.c +++ b/src/H5Gnode.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gobj.c b/src/H5Gobj.c index 51feeaad56d..3a11246c24e 100644 --- a/src/H5Gobj.c +++ b/src/H5Gobj.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Goh.c b/src/H5Goh.c index ce98960e8aa..e4ffc46ebce 100644 --- a/src/H5Goh.c +++ b/src/H5Goh.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gpkg.h b/src/H5Gpkg.h index f4f1749dc88..72a5b03445f 100644 --- a/src/H5Gpkg.h +++ b/src/H5Gpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gprivate.h b/src/H5Gprivate.h index a756a1c324f..b87597feb22 100644 --- a/src/H5Gprivate.h +++ b/src/H5Gprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gpublic.h b/src/H5Gpublic.h index d3dd64e7a7b..e0389531395 100644 --- a/src/H5Gpublic.h +++ b/src/H5Gpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -838,7 +838,7 @@ H5_DLL herr_t H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, * the \ref UG for further details. * * \attention Exercise care in moving groups as it is possible to render data in - * a file inaccessible with H5Gunlink(). See The Group Interface in the + * a file inaccessible with H5Gunlink(). See \ref sec_group in the * \ref UG. * * \version 1.8.0 Function deprecated in this release. @@ -1032,6 +1032,8 @@ H5_DLL int H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, char * * \warning Adding or removing members to the group during iteration * will lead to undefined behavior. * + * \callback_note + * * \version 1.8.0 Function deprecated in this release. * * \since 1.0.0 diff --git a/src/H5Groot.c b/src/H5Groot.c index 0b524b7b4de..7948de4d32c 100644 --- a/src/H5Groot.c +++ b/src/H5Groot.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Gstab.c b/src/H5Gstab.c index 594842830c4..c86406422b7 100644 --- a/src/H5Gstab.c +++ b/src/H5Gstab.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -685,7 +685,7 @@ H5G__stab_get_name_by_idx(const H5O_loc_t *oloc, H5_iter_order_t order, hsize_t /* Portably clear udata struct (before FUNC_ENTER) */ memset(&udata, 0, sizeof(udata)); - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity check */ assert(oloc); diff --git a/src/H5Gtest.c b/src/H5Gtest.c index 0b0708119e1..c82411b754c 100644 --- a/src/H5Gtest.c +++ b/src/H5Gtest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -83,11 +83,12 @@ htri_t H5G__is_empty_test(hid_t gid) { - H5G_t *grp = NULL; /* Pointer to group */ - htri_t msg_exists = false; /* Indicate that a header message is present */ - htri_t linfo_exists = false; /* Indicate that the 'link info' message is present */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - htri_t ret_value = true; /* Return value */ + H5G_t *grp = NULL; /* Pointer to group */ + htri_t msg_exists = false; /* Indicate that a header message is present */ + htri_t linfo_exists = false; /* Indicate that the 'link info' message is present */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + htri_t ret_value = true; /* Return value */ FUNC_ENTER_PACKAGE @@ -96,7 +97,7 @@ H5G__is_empty_test(hid_t gid) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -203,10 +204,11 @@ H5G__is_empty_test(hid_t gid) htri_t H5G__has_links_test(hid_t gid, unsigned *nmsgs) { - H5G_t *grp = NULL; /* Pointer to group */ - htri_t msg_exists = 0; /* Indicate that a header message is present */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - htri_t ret_value = true; /* Return value */ + H5G_t *grp = NULL; /* Pointer to group */ + htri_t msg_exists = 0; /* Indicate that a header message is present */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + htri_t ret_value = true; /* Return value */ FUNC_ENTER_PACKAGE @@ -215,7 +217,7 @@ H5G__has_links_test(hid_t gid, unsigned *nmsgs) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -269,10 +271,11 @@ H5G__has_links_test(hid_t gid, unsigned *nmsgs) htri_t H5G__has_stab_test(hid_t gid) { - H5G_t *grp = NULL; /* Pointer to group */ - htri_t msg_exists = 0; /* Indicate that a header message is present */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - htri_t ret_value = true; /* Return value */ + H5G_t *grp = NULL; /* Pointer to group */ + htri_t msg_exists = 0; /* Indicate that a header message is present */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + htri_t ret_value = true; /* Return value */ FUNC_ENTER_PACKAGE @@ -281,7 +284,7 @@ H5G__has_stab_test(hid_t gid) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -327,10 +330,11 @@ H5G__has_stab_test(hid_t gid) htri_t H5G__is_new_dense_test(hid_t gid) { - H5G_t *grp = NULL; /* Pointer to group */ - htri_t msg_exists = 0; /* Indicate that a header message is present */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - htri_t ret_value = true; /* Return value */ + H5G_t *grp = NULL; /* Pointer to group */ + htri_t msg_exists = 0; /* Indicate that a header message is present */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + htri_t ret_value = true; /* Return value */ FUNC_ENTER_PACKAGE @@ -339,7 +343,7 @@ H5G__is_new_dense_test(hid_t gid) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -403,12 +407,13 @@ H5G__is_new_dense_test(hid_t gid) herr_t H5G__new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count) { - H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ - H5B2_t *bt2_corder = NULL; /* v2 B-tree handle for creation order index */ - H5O_linfo_t linfo; /* Link info message */ - H5G_t *grp = NULL; /* Pointer to group */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ + H5B2_t *bt2_corder = NULL; /* v2 B-tree handle for creation order index */ + H5O_linfo_t linfo; /* Link info message */ + H5G_t *grp = NULL; /* Pointer to group */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -417,7 +422,7 @@ H5G__new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -494,10 +499,11 @@ H5G__new_dense_info_test(hid_t gid, hsize_t *name_count, hsize_t *corder_count) herr_t H5G__lheap_size_test(hid_t gid, size_t *lheap_size) { - H5G_t *grp = NULL; /* Pointer to group */ - H5O_stab_t stab; /* Symbol table message */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5G_t *grp = NULL; /* Pointer to group */ + H5O_stab_t stab; /* Symbol table message */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -506,7 +512,7 @@ H5G__lheap_size_test(hid_t gid, size_t *lheap_size) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a group"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -550,10 +556,11 @@ H5G__lheap_size_test(hid_t gid, size_t *lheap_size) herr_t H5G__user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsigned *obj_hidden) { - void *obj_ptr; /* Pointer to object for ID */ - const H5G_name_t *obj_path; /* Pointer to group hier. path for obj */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + void *obj_ptr; /* Pointer to object for ID */ + const H5G_name_t *obj_path; /* Pointer to group hier. path for obj */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -566,7 +573,7 @@ H5G__user_path_test(hid_t obj_id, char *user_path, size_t *user_path_len, unsign HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "can't get object for ID"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; diff --git a/src/H5Gtraverse.c b/src/H5Gtraverse.c index d113b576b18..4f0e03fb849 100644 --- a/src/H5Gtraverse.c +++ b/src/H5Gtraverse.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -180,7 +180,11 @@ H5G__traverse_ud(const H5G_loc_t *grp_loc /*in,out*/, const H5O_link_t *lnk, H5G if ((cur_grp = H5VL_wrap_register(H5I_GROUP, grp, false)) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTREGISTER, FAIL, "unable to register group"); - /* User-defined callback function */ + /* Pause recording errors, if we are just checking for object's existence */ + if (target & H5G_TARGET_EXISTS) + H5E_pause_stack(); + + /* Invoke user-defined callback function */ #ifndef H5_NO_DEPRECATED_SYMBOLS /* (Backwardly compatible with v0 H5L_class_t traversal callback) */ if (link_class->version == H5L_LINK_CLASS_T_VERS_0) @@ -194,13 +198,14 @@ H5G__traverse_ud(const H5G_loc_t *grp_loc /*in,out*/, const H5O_link_t *lnk, H5G H5CX_get_dxpl()); #endif /* H5_NO_DEPRECATED_SYMBOLS */ + /* Resume recording errors, if we were just checking for object's existence */ + if (target & H5G_TARGET_EXISTS) + H5E_resume_stack(); + /* Check for failing to locate the object */ if (cb_return < 0) { /* Check if we just needed to know if the object exists */ if (target & H5G_TARGET_EXISTS) { - /* Clear any errors from the stack */ - H5E_clear_stack(); - /* Indicate that the object doesn't exist */ *obj_exists = false; diff --git a/src/H5HF.c b/src/H5HF.c index bbc5ce7e455..24af93a7a4e 100644 --- a/src/H5HF.c +++ b/src/H5HF.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -59,6 +59,9 @@ /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ diff --git a/src/H5HFbtree2.c b/src/H5HFbtree2.c index 56e5270e088..6ce9b69c32e 100644 --- a/src/H5HFbtree2.c +++ b/src/H5HFbtree2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFcache.c b/src/H5HFcache.c index db55bf0b4d0..3b65f227f0e 100644 --- a/src/H5HFcache.c +++ b/src/H5HFcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFdbg.c b/src/H5HFdbg.c index d9a6c19bf19..779a7b59f61 100644 --- a/src/H5HFdbg.c +++ b/src/H5HFdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFdblock.c b/src/H5HFdblock.c index 8a6df298482..b535024c5d9 100644 --- a/src/H5HFdblock.c +++ b/src/H5HFdblock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFdtable.c b/src/H5HFdtable.c index f03060d879e..8464156dbef 100644 --- a/src/H5HFdtable.c +++ b/src/H5HFdtable.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFhdr.c b/src/H5HFhdr.c index 9f457385c31..2741c0af56f 100644 --- a/src/H5HFhdr.c +++ b/src/H5HFhdr.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFhuge.c b/src/H5HFhuge.c index b1778587e9d..b7216363394 100644 --- a/src/H5HFhuge.c +++ b/src/H5HFhuge.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -192,7 +192,7 @@ H5HF__huge_init(H5HF_hdr_t *hdr) hdr->huge_ids_direct = false; } /* end if */ else { - if ((hdr->sizeof_addr + hdr->sizeof_size) <= (hdr->id_len - 1)) { + if ((unsigned)(hdr->sizeof_addr + hdr->sizeof_size) <= (unsigned)(hdr->id_len - 1)) { /* Indicate that v2 B-tree doesn't have to be used to locate object */ hdr->huge_ids_direct = true; diff --git a/src/H5HFiblock.c b/src/H5HFiblock.c index 6ec2d763711..6b6a0d811f2 100644 --- a/src/H5HFiblock.c +++ b/src/H5HFiblock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFiter.c b/src/H5HFiter.c index 9fc564d09cd..3d889728dc6 100644 --- a/src/H5HFiter.c +++ b/src/H5HFiter.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFman.c b/src/H5HFman.c index edbb48e059f..09d9255aa17 100644 --- a/src/H5HFman.c +++ b/src/H5HFman.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFmodule.h b/src/H5HFmodule.h index c4fb437d4f1..ac617415c59 100644 --- a/src/H5HFmodule.h +++ b/src/H5HFmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5HF_MODULE -#define H5_MY_PKG H5HF -#define H5_MY_PKG_ERR H5E_HEAP +#define H5_MY_PKG H5HF +#define H5_MY_PKG_ERR H5E_HEAP +#define H5_MY_PKG_INIT NO #endif /* H5HFmodule_H */ diff --git a/src/H5HFpkg.h b/src/H5HFpkg.h index ceef78f0c84..28ea5b4c314 100644 --- a/src/H5HFpkg.h +++ b/src/H5HFpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFprivate.h b/src/H5HFprivate.h index ca7948aa2e6..0908c0c22cd 100644 --- a/src/H5HFprivate.h +++ b/src/H5HFprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFsection.c b/src/H5HFsection.c index 2a61ad43a2a..589b5f84693 100644 --- a/src/H5HFsection.c +++ b/src/H5HFsection.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -673,10 +673,10 @@ H5HF__sect_single_reduce(H5HF_hdr_t *hdr, H5HF_free_section_t *sect, size_t amt) static herr_t H5HF__sect_single_full_dblock(H5HF_hdr_t *hdr, H5HF_free_section_t *sect) { - haddr_t dblock_addr; /* Section's direct block's address */ - size_t dblock_size; /* Section's direct block's size */ - size_t dblock_overhead; /* Direct block's overhead */ - herr_t ret_value = SUCCEED; /* Return value */ + haddr_t dblock_addr = HADDR_UNDEF; /* Section's direct block's address */ + size_t dblock_size = SIZE_MAX; /* Section's direct block's size */ + size_t dblock_overhead; /* Direct block's overhead */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -688,6 +688,10 @@ H5HF__sect_single_full_dblock(H5HF_hdr_t *hdr, H5HF_free_section_t *sect) /* Retrieve direct block address from section */ if (H5HF__sect_single_dblock_info(hdr, sect, &dblock_addr, &dblock_size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information"); + if (!H5_addr_defined(dblock_addr)) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve data block address"); + if (SIZE_MAX == dblock_size) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve data block size"); /* Check for section occupying entire direct block */ /* (and not the root direct block) */ @@ -971,9 +975,9 @@ H5HF__sect_single_shrink(H5FS_section_info_t **_sect, void *_udata) H5HF_sect_add_ud_t *udata = (H5HF_sect_add_ud_t *)_udata; /* User callback data */ H5HF_hdr_t *hdr = udata->hdr; /* Fractal heap header */ H5HF_direct_t *dblock; /* Pointer to direct block for section */ - haddr_t dblock_addr; /* Section's direct block's address */ - size_t dblock_size; /* Section's direct block's size */ - herr_t ret_value = SUCCEED; /* Return value */ + haddr_t dblock_addr = HADDR_UNDEF; /* Section's direct block's address */ + size_t dblock_size = SIZE_MAX; /* Section's direct block's size */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -990,6 +994,10 @@ H5HF__sect_single_shrink(H5FS_section_info_t **_sect, void *_udata) /* Retrieve direct block address from section */ if (H5HF__sect_single_dblock_info(hdr, (*sect), &dblock_addr, &dblock_size) < 0) HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information"); + if (!H5_addr_defined(dblock_addr)) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve data block address"); + if (SIZE_MAX == dblock_size) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve data block size"); /* Protect the direct block for the section */ /* (should be a root direct block) */ @@ -1066,8 +1074,9 @@ static herr_t H5HF__sect_single_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls, const H5FS_section_info_t *_sect) { const H5HF_free_section_t *sect = (const H5HF_free_section_t *)_sect; /* Pointer to section to check */ + herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_PACKAGE_NOERR + FUNC_ENTER_PACKAGE /* Check arguments. */ assert(sect); @@ -1077,8 +1086,8 @@ H5HF__sect_single_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls, const H5 /* (not enough information to check on a single section in a root direct block) */ if (sect->u.single.parent != NULL) { H5HF_indirect_t *iblock; /* Indirect block that section's direct block resides in */ - haddr_t dblock_addr; /* Direct block address */ - size_t dblock_size; /* Direct block size */ + haddr_t dblock_addr = HADDR_UNDEF; /* Direct block address */ + size_t dblock_size = SIZE_MAX; /* Direct block size */ unsigned dblock_status = 0; /* Direct block's status in the metadata cache */ size_t H5_ATTR_NDEBUG_UNUSED dblock_overhead; /* Direct block's overhead */ herr_t H5_ATTR_NDEBUG_UNUSED status; /* Generic status value */ @@ -1088,11 +1097,14 @@ H5HF__sect_single_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls, const H5 assert(H5_addr_defined(iblock->ents[sect->u.single.par_entry].addr)); /* Retrieve direct block address from section */ - status = H5HF__sect_single_dblock_info(iblock->hdr, (const H5HF_free_section_t *)sect, - &dblock_addr, &dblock_size); - assert(status >= 0); + if (H5HF__sect_single_dblock_info(iblock->hdr, (const H5HF_free_section_t *)sect, &dblock_addr, + &dblock_size) < 0) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve direct block information"); + if (!H5_addr_defined(dblock_addr)) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve data block address"); + if (SIZE_MAX == dblock_size) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve data block size"); assert(H5_addr_eq(iblock->ents[sect->u.single.par_entry].addr, dblock_addr)); - assert(dblock_size > 0); /* Check if the section is actually within the heap */ assert(sect->sect_info.addr < iblock->hdr->man_iter_off); @@ -1132,7 +1144,8 @@ H5HF__sect_single_valid(const H5FS_section_class_t H5_ATTR_UNUSED *cls, const H5 } /* end if */ } /* end if */ - FUNC_LEAVE_NOAPI(SUCCEED) +done: + FUNC_LEAVE_NOAPI(ret_value) } /* H5HF__sect_single_valid() */ /*------------------------------------------------------------------------- @@ -3259,15 +3272,15 @@ H5HF__sect_indirect_get_iblock(H5HF_free_section_t *sect) static herr_t H5HF__sect_indirect_merge_row(H5HF_hdr_t *hdr, H5HF_free_section_t *row_sect1, H5HF_free_section_t *row_sect2) { - H5HF_free_section_t *sect1, *sect2; /* Indirect sections underlying row sections */ - unsigned start_entry1; /* Start entry for section #1 */ - unsigned start_row1, start_col1; /* Starting row & column for section #1 */ - unsigned end_entry1; /* End entry for section #1 */ - unsigned end_row1; /* Ending row for section #1 */ - unsigned start_row2; /* Starting row for section #2 */ - bool merged_rows; /* Flag to indicate that rows was merged together */ - unsigned u; /* Local index variable */ - herr_t ret_value = SUCCEED; /* Return value */ + H5HF_free_section_t *sect1 = NULL, *sect2 = NULL; /* Indirect sections underlying row sections */ + unsigned start_entry1; /* Start entry for section #1 */ + unsigned start_row1, start_col1; /* Starting row & column for section #1 */ + unsigned end_entry1; /* End entry for section #1 */ + unsigned end_row1; /* Ending row for section #1 */ + unsigned start_row2; /* Starting row for section #2 */ + bool merged_rows; /* Flag to indicate that rows was merged together */ + unsigned u; /* Local index variable */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -3280,10 +3293,10 @@ H5HF__sect_indirect_merge_row(H5HF_hdr_t *hdr, H5HF_free_section_t *row_sect1, H assert(row_sect2->sect_info.type == H5HF_FSPACE_SECT_FIRST_ROW); /* Set up indirect section information */ - sect1 = H5HF__sect_indirect_top(row_sect1->u.row.under); - assert(sect1); - sect2 = H5HF__sect_indirect_top(row_sect2->u.row.under); - assert(sect2); + if (NULL == (sect1 = H5HF__sect_indirect_top(row_sect1->u.row.under))) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve pointer to sections"); + if (NULL == (sect2 = H5HF__sect_indirect_top(row_sect2->u.row.under))) + HGOTO_ERROR(H5E_HEAP, H5E_CANTGET, FAIL, "can't retrieve pointer to sections"); /* Sanity check some assumptions about the indirect sections */ assert(sect1->u.indirect.span_size > 0); diff --git a/src/H5HFspace.c b/src/H5HFspace.c index 8c9f0c041ff..97c1e2e5eae 100644 --- a/src/H5HFspace.c +++ b/src/H5HFspace.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFstat.c b/src/H5HFstat.c index 411ad7ab79c..8e6fbe8e894 100644 --- a/src/H5HFstat.c +++ b/src/H5HFstat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFtest.c b/src/H5HFtest.c index 16ea5292b9c..c62e898b33b 100644 --- a/src/H5HFtest.c +++ b/src/H5HFtest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HFtiny.c b/src/H5HFtiny.c index 0f5f1a56b4a..a7a674066a7 100644 --- a/src/H5HFtiny.c +++ b/src/H5HFtiny.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HG.c b/src/H5HG.c index a859b40f100..0354489f28d 100644 --- a/src/H5HG.c +++ b/src/H5HG.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -81,6 +81,9 @@ static size_t H5HG__alloc(H5F_t *f, H5HG_heap_t *heap, size_t size, unsigned *h /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare a free list to manage the H5HG_heap_t struct */ H5FL_DEFINE(H5HG_heap_t); @@ -838,7 +841,7 @@ H5HG__free(H5HG_heap_t *heap) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Check arguments */ assert(heap); diff --git a/src/H5HGcache.c b/src/H5HGcache.c index f885ecf973a..28099d1684b 100644 --- a/src/H5HGcache.c +++ b/src/H5HGcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HGdbg.c b/src/H5HGdbg.c index 8f33052421b..0fc4c305820 100644 --- a/src/H5HGdbg.c +++ b/src/H5HGdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HGmodule.h b/src/H5HGmodule.h index 772ebe6163d..8ec5d9de5f1 100644 --- a/src/H5HGmodule.h +++ b/src/H5HGmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5HG_MODULE -#define H5_MY_PKG H5HG -#define H5_MY_PKG_ERR H5E_HEAP +#define H5_MY_PKG H5HG +#define H5_MY_PKG_ERR H5E_HEAP +#define H5_MY_PKG_INIT NO #endif /* H5HGmodule_H */ diff --git a/src/H5HGpkg.h b/src/H5HGpkg.h index 99725d86f94..490086121b8 100644 --- a/src/H5HGpkg.h +++ b/src/H5HGpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HGprivate.h b/src/H5HGprivate.h index 892a0c7326a..f3e88b2dfaa 100644 --- a/src/H5HGprivate.h +++ b/src/H5HGprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HGquery.c b/src/H5HGquery.c index 3d329b60a8a..7a001288446 100644 --- a/src/H5HGquery.c +++ b/src/H5HGquery.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HL.c b/src/H5HL.c index f6e589b016d..b55b3690617 100644 --- a/src/H5HL.c +++ b/src/H5HL.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -64,6 +64,9 @@ static herr_t H5HL__dirty(H5HL_t *heap); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare a free list to manage the H5HL_free_t struct */ H5FL_DEFINE(H5HL_free_t); diff --git a/src/H5HLcache.c b/src/H5HLcache.c index d0836fed4f7..11dcc20aeae 100644 --- a/src/H5HLcache.c +++ b/src/H5HLcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HLdbg.c b/src/H5HLdbg.c index 1308f8d7437..c0d906874c1 100644 --- a/src/H5HLdbg.c +++ b/src/H5HLdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HLdblk.c b/src/H5HLdblk.c index dfcca97ff6f..746b0cf72f9 100644 --- a/src/H5HLdblk.c +++ b/src/H5HLdblk.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HLint.c b/src/H5HLint.c index 9369875afa7..1b120e531e4 100644 --- a/src/H5HLint.c +++ b/src/H5HLint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HLmodule.h b/src/H5HLmodule.h index 1a871abf745..40e32563de7 100644 --- a/src/H5HLmodule.h +++ b/src/H5HLmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5HL_MODULE -#define H5_MY_PKG H5HL -#define H5_MY_PKG_ERR H5E_HEAP +#define H5_MY_PKG H5HL +#define H5_MY_PKG_ERR H5E_HEAP +#define H5_MY_PKG_INIT NO #endif /* H5HLmodule_H */ diff --git a/src/H5HLpkg.h b/src/H5HLpkg.h index 9d23049dd35..2018db25f8a 100644 --- a/src/H5HLpkg.h +++ b/src/H5HLpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -42,15 +42,6 @@ H5FL_BLK_EXTERN(lheap_chunk); /* Package Private Macros */ /**************************/ -/* If this package header is being included in one of the H5HL source files, - * define the proper control macros for the generic FUNC_ENTER/LEAVE and - * error reporting macros. - */ -#ifdef H5HL_PACKAGE -#define H5_MY_PKG H5HL -#define H5_MY_PKG_ERR H5E_HEAP -#endif - #define H5HL_SIZEOF_HDR(F) \ H5HL_ALIGN(H5_SIZEOF_MAGIC + /* heap signature */ \ 1 + /* version */ \ diff --git a/src/H5HLprfx.c b/src/H5HLprfx.c index 6011e8ec2ab..48e423316fa 100644 --- a/src/H5HLprfx.c +++ b/src/H5HLprfx.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5HLprivate.h b/src/H5HLprivate.h index 045c5d7ac1e..16c1c6b4a1d 100644 --- a/src/H5HLprivate.h +++ b/src/H5HLprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5I.c b/src/H5I.c index 9202be2fa4d..731f0f31c56 100644 --- a/src/H5I.c +++ b/src/H5I.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Idbg.c b/src/H5Idbg.c index ee963fd1823..3091786e81e 100644 --- a/src/H5Idbg.c +++ b/src/H5Idbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Idevelop.h b/src/H5Idevelop.h index 2eaa61abf41..49cba70e21f 100644 --- a/src/H5Idevelop.h +++ b/src/H5Idevelop.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Iint.c b/src/H5Iint.c index 57a6d9f708f..785dd9f0e86 100644 --- a/src/H5Iint.c +++ b/src/H5Iint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -84,6 +84,9 @@ static int H5I__find_id_cb(void *_item, void *_key, void *_udata); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declared extern in H5Ipkg.h and documented there */ H5I_type_info_t *H5I_type_info_array_g[H5I_MAX_NUM_TYPES]; int H5I_next_type_g = (int)H5I_NTYPES; @@ -123,24 +126,30 @@ H5I_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - H5I_type_info_t *type_info = NULL; /* Pointer to ID type */ - int i; - - /* Count the number of types still in use */ - for (i = 0; i < H5I_next_type_g; i++) - if ((type_info = H5I_type_info_array_g[i]) && type_info->hash_table) - in_use++; - - /* If no types are still being used then clean up */ - if (0 == in_use) { - for (i = 0; i < H5I_next_type_g; i++) { - type_info = H5I_type_info_array_g[i]; - if (type_info) { - assert(NULL == type_info->hash_table); - type_info = H5MM_xfree(type_info); - H5I_type_info_array_g[i] = NULL; + if (H5_PKG_INIT_VAR) { + H5I_type_info_t *type_info = NULL; /* Pointer to ID type */ + int i; + + /* Count the number of types still in use */ + for (i = 0; i < H5I_next_type_g; i++) + if ((type_info = H5I_type_info_array_g[i]) && type_info->hash_table) in_use++; + + /* If no types are still being used then clean up */ + if (0 == in_use) { + for (i = 0; i < H5I_next_type_g; i++) { + type_info = H5I_type_info_array_g[i]; + if (type_info) { + assert(NULL == type_info->hash_table); + type_info = H5MM_xfree(type_info); + H5I_type_info_array_g[i] = NULL; + in_use++; + } } + + /* Mark interface closed */ + if (0 == in_use) + H5_PKG_INIT_VAR = false; } } diff --git a/src/H5Imodule.h b/src/H5Imodule.h index f8924d3df62..45631409862 100644 --- a/src/H5Imodule.h +++ b/src/H5Imodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5I_MODULE -#define H5_MY_PKG H5I -#define H5_MY_PKG_ERR H5E_ID +#define H5_MY_PKG H5I +#define H5_MY_PKG_ERR H5E_ID +#define H5_MY_PKG_INIT NO /** \page H5I_UG HDF5 Identifiers * @todo Under Construction diff --git a/src/H5Ipkg.h b/src/H5Ipkg.h index c42c61d3d1b..852ab151dc5 100644 --- a/src/H5Ipkg.h +++ b/src/H5Ipkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Iprivate.h b/src/H5Iprivate.h index 75a5787b616..404cfc11c61 100644 --- a/src/H5Iprivate.h +++ b/src/H5Iprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ipublic.h b/src/H5Ipublic.h index d14e53dfaf9..9a28dac9094 100644 --- a/src/H5Ipublic.h +++ b/src/H5Ipublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -610,6 +610,8 @@ H5_DLL void *H5Isearch(H5I_type_t type, H5I_search_func_t func, void *key); * \warning Adding or removing members of the identifier type during iteration * will lead to undefined behavior. * + * \callback_note + * * \since 1.12.0 * */ diff --git a/src/H5Itest.c b/src/H5Itest.c index a6d2c1ee3bb..f1600eed72b 100644 --- a/src/H5Itest.c +++ b/src/H5Itest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -63,17 +63,18 @@ ssize_t H5I__get_name_test(hid_t id, char *name /*out*/, size_t size, bool *cached) { - H5VL_object_t *vol_obj; /* Object of id */ - H5G_loc_t loc; /* Object location */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - bool vol_wrapper_set = false; /* Whether the VOL object wrapping context was set up */ - size_t name_len = 0; /* Length of name */ - ssize_t ret_value = -1; /* Return value */ + H5VL_object_t *vol_obj; /* Object of id */ + H5G_loc_t loc; /* Object location */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + bool vol_wrapper_set = false; /* Whether the VOL object wrapping context was set up */ + size_t name_len = 0; /* Length of name */ + ssize_t ret_value = -1; /* Return value */ FUNC_ENTER_PACKAGE /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_SYM, H5E_CANTSET, (-1), "can't set API context"); api_ctx_pushed = true; diff --git a/src/H5L.c b/src/H5L.c index 6b1e7fe9947..5a0c5973aab 100644 --- a/src/H5L.c +++ b/src/H5L.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ldeprec.c b/src/H5Ldeprec.c index 819aea87f10..bac57f2bf45 100644 --- a/src/H5Ldeprec.c +++ b/src/H5Ldeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ldevelop.h b/src/H5Ldevelop.h index 148a5a57468..21d7458d512 100644 --- a/src/H5Ldevelop.h +++ b/src/H5Ldevelop.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Lexternal.c b/src/H5Lexternal.c index 88ee6baa201..888ff404679 100644 --- a/src/H5Lexternal.c +++ b/src/H5Lexternal.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Lint.c b/src/H5Lint.c index 10b935ab09d..ab066dd20fd 100644 --- a/src/H5Lint.c +++ b/src/H5Lint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -174,6 +174,9 @@ static herr_t H5L__get_name_by_idx_cb(H5G_loc_t *grp_loc /*in*/, const char *nam /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -204,6 +207,27 @@ H5L_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5L_init() */ + +/*------------------------------------------------------------------------- + * Function: H5L__init_package + * + * Purpose: Initialize information specific to H5L interface. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5L__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE /* Initialize user-defined link classes */ if (H5L_register_external() < 0) @@ -211,12 +235,12 @@ H5L_init(void) done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5L_init() */ +} /* end H5L_init_package() */ /*------------------------------------------------------------------------- * Function: H5L_term_package * - * Purpose: Terminate any resources allocated in H5L_init. + * Purpose: Terminate any resources allocated in H5L__init_package. * * Return: Non-negative on success/Negative on failure * @@ -229,11 +253,17 @@ H5L_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Free the table of link types */ - if (H5L_table_g) { - H5L_table_g = (H5L_class_t *)H5MM_xfree(H5L_table_g); - H5L_table_used_g = H5L_table_alloc_g = 0; - n++; + if (H5_PKG_INIT_VAR) { + /* Free the table of link types */ + if (H5L_table_g) { + H5L_table_g = (H5L_class_t *)H5MM_xfree(H5L_table_g); + H5L_table_used_g = H5L_table_alloc_g = 0; + n++; + } /* end if */ + + /* Mark the interface as uninitialized */ + if (0 == n) + H5_PKG_INIT_VAR = false; } /* end if */ FUNC_LEAVE_NOAPI(n) diff --git a/src/H5Lmodule.h b/src/H5Lmodule.h index f29aa5c50c0..963005ab34e 100644 --- a/src/H5Lmodule.h +++ b/src/H5Lmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5L_MODULE -#define H5_MY_PKG H5L -#define H5_MY_PKG_ERR H5E_LINK +#define H5_MY_PKG H5L +#define H5_MY_PKG_ERR H5E_LINK +#define H5_MY_PKG_INIT YES /** \page H5L_UG HDF5 Links * @todo Under Construction diff --git a/src/H5Lpkg.h b/src/H5Lpkg.h index 0b04fdcb769..33305f82221 100644 --- a/src/H5Lpkg.h +++ b/src/H5Lpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Lprivate.h b/src/H5Lprivate.h index ff3ace83dbd..21fb142d8a8 100644 --- a/src/H5Lprivate.h +++ b/src/H5Lprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Lpublic.h b/src/H5Lpublic.h index ec325b8ad77..a10d19f1a6a 100644 --- a/src/H5Lpublic.h +++ b/src/H5Lpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -914,6 +914,7 @@ H5_DLL ssize_t H5Lget_name_by_idx(hid_t loc_id, const char *group_name, H5_index * This does not limit the ability to change link destinations * while iterating, but caution is advised. * + * \callback_note * * \since 1.12.0 * @@ -999,6 +1000,8 @@ H5_DLL herr_t H5Literate_async(hid_t group_id, H5_index_t idx_type, H5_iter_orde * \note H5Literate_by_name2() is the same as H5Literate2(), except that * H5Literate2() always proceeds in alphanumeric order. * + * \callback_note + * * \since 1.12.0 * * \see H5Literate(), H5Lvisit() @@ -1083,6 +1086,8 @@ H5_DLL herr_t H5Literate_by_name2(hid_t loc_id, const char *group_name, H5_index * presented to the application for whatever processing the * application requires. * + * \callback_note + * * \since 1.12.0 * * \see H5Literate() @@ -1168,6 +1173,8 @@ H5_DLL herr_t H5Lvisit2(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order * file has been presented to the application for whatever processing * the application requires. * + * \callback_note + * * \since 1.12.0 * */ @@ -1680,6 +1687,8 @@ H5_DLL herr_t H5Lget_info_by_idx1(hid_t loc_id, const char *group_name, H5_index * This does not limit the ability to change link destinations * while iterating, but caution is advised. * + * \callback_note + * * \version 1.12.0 Function was deprecated in this release. * \since 1.8.0 * @@ -1749,6 +1758,8 @@ H5_DLL herr_t H5Literate1(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t ord * recursion, explicitly calling H5Literate_by_name1() on discovered * subgroups. * + * \callback_note + * * \note H5Literate_by_name1() is the same as H5Giterate(), except that * H5Giterate() always proceeds in lexicographic order. * @@ -1842,6 +1853,8 @@ H5_DLL herr_t H5Literate_by_name1(hid_t loc_id, const char *group_name, H5_index * presented to the application for whatever processing the * application requires. * + * \callback_note + * * \version 1.12.0 Function was renamed from H5Lvisit() to H5Lvisit1() and * deprecated. * @@ -1935,6 +1948,8 @@ H5_DLL herr_t H5Lvisit1(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order * file has been presented to the application for whatever processing * the application requires. * + * \callback_note + * * \version 1.12.0 Function renamed from H5Lvisit_by_name() to * H5Lvisit_by_name1() and deprecated. * diff --git a/src/H5M.c b/src/H5M.c index c55f881d6d5..8108303e43f 100644 --- a/src/H5M.c +++ b/src/H5M.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -57,6 +57,9 @@ static herr_t H5M__get_api_common(hid_t map_id, hid_t key_mem_type_id, const voi /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -73,6 +76,9 @@ static const H5I_class_t H5I_MAP_CLS[1] = {{ (H5I_free_t)H5M__close_cb /* Callback routine for closing objects of this class */ }}; +/* Flag indicating "top" of interface has been initialized */ +static bool H5M_top_package_initialize_s = false; + /*------------------------------------------------------------------------- * Function: H5M_init * @@ -89,14 +95,40 @@ H5M_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5M_init() */ + +/*------------------------------------------------------------------------- +NAME + H5M__init_package -- Initialize interface-specific information +USAGE + herr_t H5M__init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------- +*/ +herr_t +H5M__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE /* Initialize the ID group for the map IDs */ if (H5I_register_type(H5I_MAP_CLS) < 0) HGOTO_ERROR(H5E_MAP, H5E_CANTINIT, FAIL, "unable to initialize interface"); + /* Mark "top" of interface as initialized, too */ + H5M_top_package_initialize_s = true; + done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5M_init() */ +} /* end H5M__init_package() */ /*------------------------------------------------------------------------- * Function: H5M_top_term_package @@ -115,10 +147,16 @@ H5M_top_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - if (H5I_nmembers(H5I_MAP) > 0) { - (void)H5I_clear_type(H5I_MAP, false, false); - n++; - } + if (H5M_top_package_initialize_s) { + if (H5I_nmembers(H5I_MAP) > 0) { + (void)H5I_clear_type(H5I_MAP, false, false); + n++; + } + + /* Mark closed */ + if (0 == n) + H5M_top_package_initialize_s = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5M_top_term_package() */ @@ -143,11 +181,18 @@ H5M_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Sanity checks */ - assert(0 == H5I_nmembers(H5I_MAP)); + if (H5_PKG_INIT_VAR) { + /* Sanity checks */ + assert(0 == H5I_nmembers(H5I_MAP)); + assert(false == H5M_top_package_initialize_s); - /* Destroy the dataset object id group */ - n += (H5I_dec_type_ref(H5I_MAP) > 0); + /* Destroy the dataset object id group */ + n += (H5I_dec_type_ref(H5I_MAP) > 0); + + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5M_term_package() */ diff --git a/src/H5MF.c b/src/H5MF.c index 2de3e7ad197..f259318c0ac 100644 --- a/src/H5MF.c +++ b/src/H5MF.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -111,6 +111,9 @@ static herr_t H5MF__sects_cb(H5FS_section_info_t *_sect, void *_udata); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -1229,14 +1232,14 @@ H5MF_xfree(H5F_t *f, H5FD_mem_t alloc_type, haddr_t addr, hsize_t size) htri_t H5MF_try_extend(H5F_t *f, H5FD_mem_t alloc_type, haddr_t addr, hsize_t size, hsize_t extra_requested) { - H5AC_ring_t orig_ring = H5AC_RING_INV; /* Original ring value */ - H5AC_ring_t fsm_ring; /* Ring of FSM */ - haddr_t end; /* End of block to extend */ - H5FD_mem_t map_type; /* Mapped type */ - H5F_mem_page_t fs_type; /* free space type */ - htri_t allow_extend = true; /* Possible to extend the block */ - hsize_t frag_size = 0; /* Size of mis-aligned fragment */ - htri_t ret_value = false; /* Return value */ + H5AC_ring_t orig_ring = H5AC_RING_INV; /* Original ring value */ + H5AC_ring_t fsm_ring; /* Ring of FSM */ + haddr_t end; /* End of block to extend */ + H5FD_mem_t map_type; /* Mapped type */ + H5F_mem_page_t fs_type = H5F_MEM_PAGE_NTYPES; /* free space type */ + htri_t allow_extend = true; /* Possible to extend the block */ + hsize_t frag_size = 0; /* Size of mis-aligned fragment */ + htri_t ret_value = false; /* Return value */ FUNC_ENTER_NOAPI_TAG(H5AC__FREESPACE_TAG, FAIL) #ifdef H5MF_ALLOC_DEBUG @@ -2552,14 +2555,14 @@ H5MF_settle_raw_data_fsm(H5F_t *f, bool *fsm_settled) { int pass_count; hsize_t alloc_size; - H5F_mem_t mem_type; /* Memory type for iteration */ - H5F_mem_page_t fsm_type; /* FSM type for iteration */ - H5O_fsinfo_t fsinfo; /* Free space manager info message */ - H5FS_stat_t fs_stat; /* Information for free-space manager */ - H5AC_ring_t orig_ring = H5AC_RING_INV; /* Original ring value */ - H5AC_ring_t curr_ring = H5AC_RING_INV; /* Current ring value */ - H5AC_ring_t needed_ring = H5AC_RING_INV; /* Ring value needed for this iteration */ - herr_t ret_value = SUCCEED; /* Return value */ + H5F_mem_t mem_type; /* Memory type for iteration */ + H5F_mem_page_t fsm_type = H5F_MEM_PAGE_NTYPES; /* FSM type for iteration */ + H5O_fsinfo_t fsinfo; /* Free space manager info message */ + H5FS_stat_t fs_stat; /* Information for free-space manager */ + H5AC_ring_t orig_ring = H5AC_RING_INV; /* Original ring value */ + H5AC_ring_t curr_ring = H5AC_RING_INV; /* Current ring value */ + H5AC_ring_t needed_ring = H5AC_RING_INV; /* Ring value needed for this iteration */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI_TAG(H5AC__FREESPACE_TAG, FAIL) @@ -3018,8 +3021,8 @@ H5MF_settle_raw_data_fsm(H5F_t *f, bool *fsm_settled) herr_t H5MF_settle_meta_data_fsm(H5F_t *f, bool *fsm_settled) { - H5F_mem_page_t sm_fshdr_fs_type; /* small fs hdr fsm */ - H5F_mem_page_t sm_fssinfo_fs_type; /* small fs sinfo fsm */ + H5F_mem_page_t sm_fshdr_fs_type = H5F_MEM_PAGE_NTYPES; /* small fs hdr fsm */ + H5F_mem_page_t sm_fssinfo_fs_type = H5F_MEM_PAGE_NTYPES; /* small fs sinfo fsm */ H5F_mem_page_t lg_fshdr_fs_type = H5F_MEM_PAGE_DEFAULT; /* large fs hdr fsm */ H5F_mem_page_t lg_fssinfo_fs_type = H5F_MEM_PAGE_DEFAULT; /* large fs sinfo fsm */ H5FS_t *sm_hdr_fspace = NULL; /* ptr to sm FSM hdr alloc FSM */ @@ -3309,11 +3312,11 @@ H5MF__continue_alloc_fsm(H5F_shared_t *f_sh, H5FS_t *sm_hdr_fspace, H5FS_t *sm_s static bool H5MF__fsm_type_is_self_referential(H5F_shared_t *f_sh, H5F_mem_page_t fsm_type) { - H5F_mem_page_t sm_fshdr_fsm; - H5F_mem_page_t sm_fssinfo_fsm; - H5F_mem_page_t lg_fshdr_fsm; - H5F_mem_page_t lg_fssinfo_fsm; - bool result = false; + H5F_mem_page_t sm_fshdr_fsm = H5F_MEM_PAGE_NTYPES; + H5F_mem_page_t sm_fssinfo_fsm = H5F_MEM_PAGE_NTYPES; + H5F_mem_page_t lg_fshdr_fsm = H5F_MEM_PAGE_NTYPES; + H5F_mem_page_t lg_fssinfo_fsm = H5F_MEM_PAGE_NTYPES; + bool result = false; FUNC_ENTER_PACKAGE_NOERR @@ -3361,9 +3364,9 @@ H5MF__fsm_type_is_self_referential(H5F_shared_t *f_sh, H5F_mem_page_t fsm_type) static bool H5MF__fsm_is_self_referential(H5F_shared_t *f_sh, H5FS_t *fspace) { - H5F_mem_page_t sm_fshdr_fsm; - H5F_mem_page_t sm_fssinfo_fsm; - bool result = false; + H5F_mem_page_t sm_fshdr_fsm = H5F_MEM_PAGE_NTYPES; + H5F_mem_page_t sm_fssinfo_fsm = H5F_MEM_PAGE_NTYPES; + bool result = false; FUNC_ENTER_PACKAGE_NOERR @@ -3375,8 +3378,8 @@ H5MF__fsm_is_self_referential(H5F_shared_t *f_sh, H5FS_t *fspace) H5MF__alloc_to_fs_type(f_sh, H5FD_MEM_FSPACE_SINFO, (size_t)1, &sm_fssinfo_fsm); if (H5F_SHARED_PAGED_AGGR(f_sh)) { - H5F_mem_page_t lg_fshdr_fsm; - H5F_mem_page_t lg_fssinfo_fsm; + H5F_mem_page_t lg_fshdr_fsm = H5F_MEM_PAGE_NTYPES; + H5F_mem_page_t lg_fssinfo_fsm = H5F_MEM_PAGE_NTYPES; H5MF__alloc_to_fs_type(f_sh, H5FD_MEM_FSPACE_HDR, f_sh->fs_page_size + 1, &lg_fshdr_fsm); H5MF__alloc_to_fs_type(f_sh, H5FD_MEM_FSPACE_SINFO, f_sh->fs_page_size + 1, &lg_fssinfo_fsm); diff --git a/src/H5MFaggr.c b/src/H5MFaggr.c index fa39c7256ef..550fb65efa9 100644 --- a/src/H5MFaggr.c +++ b/src/H5MFaggr.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5MFdbg.c b/src/H5MFdbg.c index 3c5060f84e1..9e3f8b07e61 100644 --- a/src/H5MFdbg.c +++ b/src/H5MFdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5MFmodule.h b/src/H5MFmodule.h index dd32cdc210d..e196ab03e61 100644 --- a/src/H5MFmodule.h +++ b/src/H5MFmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5MF_MODULE -#define H5_MY_PKG H5MF -#define H5_MY_PKG_ERR H5E_RESOURCE +#define H5_MY_PKG H5MF +#define H5_MY_PKG_ERR H5E_RESOURCE +#define H5_MY_PKG_INIT NO #endif /* H5MFmodule_H */ diff --git a/src/H5MFpkg.h b/src/H5MFpkg.h index 32d04d35a0e..2830b25fbf5 100644 --- a/src/H5MFpkg.h +++ b/src/H5MFpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5MFprivate.h b/src/H5MFprivate.h index 5342cc7d94e..79dc808af83 100644 --- a/src/H5MFprivate.h +++ b/src/H5MFprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5MFsection.c b/src/H5MFsection.c index a3b3988b38c..83026004750 100644 --- a/src/H5MFsection.c +++ b/src/H5MFsection.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5MM.c b/src/H5MM.c index 100ea297388..777a5581ce6 100644 --- a/src/H5MM.c +++ b/src/H5MM.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5MMprivate.h b/src/H5MMprivate.h index 39bba2c6e00..04302f82ce3 100644 --- a/src/H5MMprivate.h +++ b/src/H5MMprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5MMpublic.h b/src/H5MMpublic.h index 62172c9ea09..6e9311d1e12 100644 --- a/src/H5MMpublic.h +++ b/src/H5MMpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Mmodule.h b/src/H5Mmodule.h index 375399751b5..a143fe3f1a5 100644 --- a/src/H5Mmodule.h +++ b/src/H5Mmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5M_MODULE -#define H5_MY_PKG H5M -#define H5_MY_PKG_ERR H5E_MAP +#define H5_MY_PKG H5M +#define H5_MY_PKG_ERR H5E_MAP +#define H5_MY_PKG_INIT YES /** * \page H5M_UG HDF5 VOL Data Mapping diff --git a/src/H5Mpkg.h b/src/H5Mpkg.h index d6b86ffa6dd..b4d27e0b9ca 100644 --- a/src/H5Mpkg.h +++ b/src/H5Mpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Mprivate.h b/src/H5Mprivate.h index 6dfb55641c0..9dca6e13176 100644 --- a/src/H5Mprivate.h +++ b/src/H5Mprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Mpublic.h b/src/H5Mpublic.h index f2d45720bfe..dd9def1939c 100644 --- a/src/H5Mpublic.h +++ b/src/H5Mpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -571,6 +571,8 @@ H5_DLL herr_t H5Mexists(hid_t map_id, hid_t key_mem_type_id, const void *key, hb * \warning Adding or removing key-value pairs to the map during iteration * will lead to undefined behavior. * + * \callback_note + * * \since 1.12.0 * */ @@ -615,6 +617,8 @@ H5_DLL herr_t H5Miterate(hid_t map_id, hsize_t *idx, hid_t key_mem_type_id, H5M_ * \warning Adding or removing key-value pairs to the map during iteration * will lead to undefined behavior. * + * \callback_note + * * \since 1.12.0 * */ diff --git a/src/H5O.c b/src/H5O.c index 14118668d03..566c4b162eb 100644 --- a/src/H5O.c +++ b/src/H5O.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Oainfo.c b/src/H5Oainfo.c index 8b4340d2392..390b741ee55 100644 --- a/src/H5Oainfo.c +++ b/src/H5Oainfo.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Oalloc.c b/src/H5Oalloc.c index 4eadc315e05..14421c03635 100644 --- a/src/H5Oalloc.c +++ b/src/H5Oalloc.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Oattr.c b/src/H5Oattr.c index 6d1d23740f7..1f11892e2f1 100644 --- a/src/H5Oattr.c +++ b/src/H5Oattr.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -564,7 +564,7 @@ H5O__attr_delete(H5F_t *f, H5O_t *oh, void *_mesg) H5A_t *attr = (H5A_t *)_mesg; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* check args */ assert(f); diff --git a/src/H5Oattribute.c b/src/H5Oattribute.c index 4929be56717..39637e48669 100644 --- a/src/H5Oattribute.c +++ b/src/H5Oattribute.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -201,7 +201,7 @@ H5O__attr_create(const H5O_loc_t *loc, H5A_t *attr) htri_t shared_mesg; /* Should this message be stored in the Shared Message table? */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE /* Check arguments */ assert(loc); diff --git a/src/H5Obogus.c b/src/H5Obogus.c index 4948d61c96d..2ba320d539e 100644 --- a/src/H5Obogus.c +++ b/src/H5Obogus.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Obtreek.c b/src/H5Obtreek.c index 42e1ce0c32c..6e3701f328c 100644 --- a/src/H5Obtreek.c +++ b/src/H5Obtreek.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ocache.c b/src/H5Ocache.c index 87f321cb986..a5bf35aa7ba 100644 --- a/src/H5Ocache.c +++ b/src/H5Ocache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ocache_image.c b/src/H5Ocache_image.c index d91b46341c0..30f0732d671 100644 --- a/src/H5Ocache_image.c +++ b/src/H5Ocache_image.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ochunk.c b/src/H5Ochunk.c index 37ce88b5759..540495ceffc 100644 --- a/src/H5Ochunk.c +++ b/src/H5Ochunk.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ocont.c b/src/H5Ocont.c index 621095a1986..c58ed3e9008 100644 --- a/src/H5Ocont.c +++ b/src/H5Ocont.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ocopy.c b/src/H5Ocopy.c index bd19cd34f44..9317be0b4f7 100644 --- a/src/H5Ocopy.c +++ b/src/H5Ocopy.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ocopy_ref.c b/src/H5Ocopy_ref.c index c509732dfb8..1327a1db591 100644 --- a/src/H5Ocopy_ref.c +++ b/src/H5Ocopy_ref.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Odbg.c b/src/H5Odbg.c index cfdff270e40..32ad9df3a1d 100644 --- a/src/H5Odbg.c +++ b/src/H5Odbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Odeprec.c b/src/H5Odeprec.c index f56480392e4..c4395c1c011 100644 --- a/src/H5Odeprec.c +++ b/src/H5Odeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Odrvinfo.c b/src/H5Odrvinfo.c index baec777d0f9..c07c0832811 100644 --- a/src/H5Odrvinfo.c +++ b/src/H5Odrvinfo.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Odtype.c b/src/H5Odtype.c index a359575a646..bd3871c23b6 100644 --- a/src/H5Odtype.c +++ b/src/H5Odtype.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -830,6 +830,52 @@ H5O__dtype_decode_helper(unsigned *ioflags /*in,out*/, const uint8_t **pp, H5T_t dt->shared->force_conv = true; break; + case H5T_COMPLEX: { + bool homogeneous; + + /* + * Complex number datatypes... + */ + + /* Set whether the complex number datatype is homogeneous */ + homogeneous = (bool)(flags & 0x01); + + if (!homogeneous) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "heterogeneous complex number datatypes are currently unsupported"); + + /* Set the form of the complex number datatype */ + dt->shared->u.cplx.form = (H5T_complex_form_t)((flags >> 1) & 0x03); + + if (dt->shared->u.cplx.form != H5T_COMPLEX_RECTANGULAR) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "only complex number datatypes in rectangular form are currently supported"); + + /* Other bits of the flags beyond bits 0,1,2 should not be set */ + if ((flags >> 3) != 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, FAIL, + "invalid flag bits set for complex number datatype"); + + /* Decode the base datatype of the complex number */ + if (NULL == (dt->shared->parent = H5T__alloc())) + HGOTO_ERROR(H5E_DATATYPE, H5E_NOSPACE, FAIL, + "unable to allocate complex number base datatype"); + if (H5O__dtype_decode_helper(ioflags, pp, dt->shared->parent, skip, p_end) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, + "unable to decode complex number base datatype"); + + /* Check if the parent of this complex number type has a version greater + * than the type itself. + */ + H5O_DTYPE_CHECK_VERSION(dt, version, dt->shared->parent->shared->version, ioflags, "complex", + FAIL) + + /* There should be no complex number datatypes with version < 5. */ + H5O_DTYPE_CHECK_VERSION(dt, version, H5O_DTYPE_VERSION_5, ioflags, "complex", FAIL) + + break; + } + case H5T_NO_CLASS: case H5T_NCLASSES: default: @@ -1347,6 +1393,32 @@ H5O__dtype_encode_helper(uint8_t **pp, const H5T_t *dt) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, "unable to encode VL parent type"); break; + case H5T_COMPLEX: + /* Check that the version is valid */ + assert(dt->shared->version >= H5O_DTYPE_VERSION_5); + + /* Check that the version is at least as great as the parent */ + assert(dt->shared->version >= dt->shared->parent->shared->version); + + if (dt->shared->u.cplx.form != H5T_COMPLEX_RECTANGULAR) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, + "complex number datatypes not in rectangular form are currently unsupported"); + + /* Store that complex number is homogeneous in first flag bit; + * Currently, only homogeneous complex number datatypes are supported. + */ + flags |= 0x01; + + /* Store complex number form in next two bits */ + flags = (unsigned)(flags | (((unsigned)dt->shared->u.cplx.form & 0x03) << 1)); + + /* Encode the base datatype of the complex number */ + if (H5O__dtype_encode_helper(pp, dt->shared->parent) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTENCODE, FAIL, + "unable to encode complex number base datatype"); + + break; + case H5T_NO_CLASS: case H5T_NCLASSES: default: @@ -1644,6 +1716,10 @@ H5O__dtype_size(const H5F_t *f, const void *_mesg) ret_value += H5O__dtype_size(f, dt->shared->parent); break; + case H5T_COMPLEX: + ret_value += H5O__dtype_size(f, dt->shared->parent); + break; + case H5T_NO_CLASS: case H5T_STRING: case H5T_REFERENCE: @@ -2001,6 +2077,10 @@ H5O__dtype_debug(H5F_t *f, const void *mesg, FILE *stream, int indent, int fwidt s = "vlen"; break; + case H5T_COMPLEX: + s = "complex number"; + break; + case H5T_NO_CLASS: case H5T_NCLASSES: default: @@ -2244,6 +2324,25 @@ H5O__dtype_debug(H5F_t *f, const void *mesg, FILE *stream, int indent, int fwidt fprintf(stream, "%*s%s\n", indent, "", "Base type:"); H5O__dtype_debug(f, dt->shared->parent, stream, indent + 3, MAX(0, fwidth - 3)); } /* end else if */ + else if (H5T_COMPLEX == dt->shared->type) { + switch (dt->shared->u.cplx.form) { + case H5T_COMPLEX_RECTANGULAR: + fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Form:", "rectangular"); + break; + case H5T_COMPLEX_POLAR: + fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Form:", "polar"); + break; + case H5T_COMPLEX_EXPONENTIAL: + fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Form:", "exponential"); + break; + default: + fprintf(stream, "%*s%-*s %s\n", indent, "", fwidth, "Form:", "invalid"); + break; + } + + fprintf(stream, "%*s%s\n", indent, "", "Base type:"); + H5O__dtype_debug(f, dt->shared->parent, stream, indent + 3, MAX(0, fwidth - 3)); + } else { switch (dt->shared->u.atomic.order) { case H5T_ORDER_LE: diff --git a/src/H5Oefl.c b/src/H5Oefl.c index 351dbd30211..ea3c8b2754d 100644 --- a/src/H5Oefl.c +++ b/src/H5Oefl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ofill.c b/src/H5Ofill.c index 2b1faac30ca..7f111bfbf66 100644 --- a/src/H5Ofill.c +++ b/src/H5Ofill.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -153,8 +153,7 @@ const unsigned H5O_fill_ver_bounds[] = { H5O_FILL_VERSION_3, /* H5F_LIBVER_V110 */ H5O_FILL_VERSION_3, /* H5F_LIBVER_V112 */ H5O_FILL_VERSION_3, /* H5F_LIBVER_V114 */ - H5O_FILL_VERSION_3, /* H5F_LIBVER_V116 */ - H5O_FILL_VERSION_3, /* H5F_LIBVER_V118 */ + H5O_FILL_VERSION_3, /* H5F_LIBVER_V200 */ H5O_FILL_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; diff --git a/src/H5Oflush.c b/src/H5Oflush.c index 7bd38f0eb89..c6e051e276b 100644 --- a/src/H5Oflush.c +++ b/src/H5Oflush.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ofsinfo.c b/src/H5Ofsinfo.c index 674e3ff05ff..2860f4f5809 100644 --- a/src/H5Ofsinfo.c +++ b/src/H5Ofsinfo.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -69,8 +69,7 @@ static const unsigned H5O_fsinfo_ver_bounds[] = { H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V110 */ H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V112 */ H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V114 */ - H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V116 */ - H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V118 */ + H5O_FSINFO_VERSION_1, /* H5F_LIBVER_V200 */ H5O_FSINFO_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; #define N_FSINFO_VERSION_BOUNDS H5F_LIBVER_NBOUNDS diff --git a/src/H5Oginfo.c b/src/H5Oginfo.c index 645c5ff81af..97243545910 100644 --- a/src/H5Oginfo.c +++ b/src/H5Oginfo.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Oint.c b/src/H5Oint.c index 4256f9cc79f..7f7921aeaf8 100644 --- a/src/H5Oint.c +++ b/src/H5Oint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -82,6 +82,9 @@ static herr_t H5O__reset_info2(H5O_info2_t *oinfo); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Header message ID to class mapping * * Remember to increment H5O_MSG_TYPES in H5Opkg.h when adding a new @@ -127,8 +130,7 @@ const unsigned H5O_obj_ver_bounds[] = { H5O_VERSION_2, /* H5F_LIBVER_V110 */ H5O_VERSION_2, /* H5F_LIBVER_V112 */ H5O_VERSION_2, /* H5F_LIBVER_V114 */ - H5O_VERSION_2, /* H5F_LIBVER_V116 */ - H5O_VERSION_2, /* H5F_LIBVER_V118 */ + H5O_VERSION_2, /* H5F_LIBVER_V200 */ H5O_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; @@ -180,10 +182,11 @@ static const H5O_obj_class_t *const H5O_obj_class_g[] = { /*------------------------------------------------------------------------- * Function: H5O_init * - * Purpose: Initialize the interface from some other layer. + * Purpose: Initialize the interface from some other package. + * + * Return: Success: non-negative + * Failure: negative * - * Return: Success: non-negative - * Failure: negative *------------------------------------------------------------------------- */ H5_ATTR_CONST herr_t @@ -191,7 +194,27 @@ H5O_init(void) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5O_init() */ + +/*------------------------------------------------------------------------- + * Function: H5O__init_package + * + * Purpose: Initialize information specific to H5O interface. + * + * Return: Success: non-negative + * Failure: negative + * + *------------------------------------------------------------------------- + */ +herr_t +H5O__init_package(void) +{ + FUNC_ENTER_PACKAGE_NOERR /* H5O interface sanity checks */ HDcompile_assert(H5O_MSG_TYPES == NELMTS(H5O_msg_class_g)); @@ -199,8 +222,8 @@ H5O_init(void) HDcompile_assert(H5O_UNKNOWN_ID < H5O_MSG_TYPES); - FUNC_LEAVE_NOAPI(ret_value) -} + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O__init_package() */ /*------------------------------------------------------------------------- * Function: H5O__set_version @@ -546,7 +569,7 @@ H5O_open(H5O_loc_t *loc) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Check args */ assert(loc); @@ -558,6 +581,7 @@ H5O_open(H5O_loc_t *loc) else H5F_INCR_NOPEN_OBJS(loc->file); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5O_open() */ @@ -2623,7 +2647,9 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_or H5O_loc_t obj_oloc; /* Opened object object location */ bool loc_found = false; /* Entry at 'name' found */ H5O_info2_t oinfo; /* Object info struct */ - void *obj = NULL; /* Object */ + H5O_info2_t int_oinfo; /* Internal object info */ + H5O_info2_t *oinfop = &oinfo; /* Object info pointer */ + void *obj = NULL; /* Object */ H5I_type_t opened_type; /* ID type of object */ hid_t obj_id = H5I_INVALID_HID; /* ID of object */ herr_t ret_value = FAIL; /* Return value */ @@ -2650,6 +2676,14 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_or if (H5O_get_info(&obj_oloc, &oinfo, fields) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to get object info"); + /* If basic fields are not requested, get object basic info to use here */ + if (!(fields & H5O_INFO_BASIC)) { + oinfop = &int_oinfo; + /* Get the object's basic info for local use */ + if (H5O_get_info(&obj_oloc, &int_oinfo, H5O_INFO_BASIC) < 0) + HGOTO_ERROR(H5E_OHDR, H5E_CANTGET, FAIL, "unable to get object's basic info"); + } + /* Open the object */ /* (Takes ownership of the obj_loc information) */ if (NULL == (obj = H5O_open_by_loc(&obj_loc, &opened_type))) @@ -2668,7 +2702,7 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_or HGOTO_DONE(ret_value); /* Check for object being a group */ - if (oinfo.type == H5O_TYPE_GROUP) { + if (oinfop->type == H5O_TYPE_GROUP) { H5G_loc_t start_loc; /* Location of starting group */ H5G_loc_t vis_loc; /* Location of visited group */ @@ -2689,7 +2723,7 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_or /* If its ref count is > 1, we add it to the list of visited objects */ /* (because it could come up again during traversal) */ - if (oinfo.rc > 1) { + if (oinfop->rc > 1) { H5_obj_t *obj_pos; /* New object node for visited list */ /* Allocate new object "position" node */ @@ -2697,10 +2731,10 @@ H5O__visit(H5G_loc_t *loc, const char *obj_name, H5_index_t idx_type, H5_iter_or HGOTO_ERROR(H5E_OHDR, H5E_NOSPACE, FAIL, "can't allocate object node"); /* Construct unique "position" for this object */ - obj_pos->fileno = oinfo.fileno; + obj_pos->fileno = oinfop->fileno; /* De-serialize object token into an object address */ - if (H5VL_native_token_to_addr(loc->oloc->file, H5I_FILE, oinfo.token, &(obj_pos->addr)) < 0) + if (H5VL_native_token_to_addr(loc->oloc->file, H5I_FILE, oinfop->token, &(obj_pos->addr)) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTUNSERIALIZE, FAIL, "can't deserialize object token into address"); @@ -2959,3 +2993,20 @@ H5O_has_chksum(const H5O_t *oh) FUNC_LEAVE_NOAPI(H5O_SIZEOF_CHKSUM_OH(oh) > 0) } /* end H5O_has_chksum() */ + +/*------------------------------------------------------------------------- + * Function: H5O_get_version_bound + * + * Purpose: Retrieve the version for a given bound from object version array + * + *------------------------------------------------------------------------- + */ +herr_t +H5O_get_version_bound(H5F_libver_t bound, uint8_t *version) +{ + FUNC_ENTER_NOAPI_NOINIT_NOERR + + *version = (uint8_t)H5O_obj_ver_bounds[bound]; + + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5O_get_version_bound() */ diff --git a/src/H5Olayout.c b/src/H5Olayout.c index e5ffc382476..2d612235060 100644 --- a/src/H5Olayout.c +++ b/src/H5Olayout.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Olinfo.c b/src/H5Olinfo.c index 6b5dc0b89b5..1b3760a2cfa 100644 --- a/src/H5Olinfo.c +++ b/src/H5Olinfo.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Olink.c b/src/H5Olink.c index 431e1dd4965..b530e421cba 100644 --- a/src/H5Olink.c +++ b/src/H5Olink.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Omessage.c b/src/H5Omessage.c index 7190e46a57f..9b536c56116 100644 --- a/src/H5Omessage.c +++ b/src/H5Omessage.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Omodule.h b/src/H5Omodule.h index 1c1278a0e8a..4cd06fe3b0a 100644 --- a/src/H5Omodule.h +++ b/src/H5Omodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5O_MODULE -#define H5_MY_PKG H5O -#define H5_MY_PKG_ERR H5E_OHDR +#define H5_MY_PKG H5O +#define H5_MY_PKG_ERR H5E_OHDR +#define H5_MY_PKG_INIT YES /** \page H5O_UG HDF5 Objects * @todo Under Construction diff --git a/src/H5Omtime.c b/src/H5Omtime.c index 66f8d1bf4d4..7b9b2b6e4ca 100644 --- a/src/H5Omtime.c +++ b/src/H5Omtime.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Oname.c b/src/H5Oname.c index fc85c0bb9e0..f8f58138527 100644 --- a/src/H5Oname.c +++ b/src/H5Oname.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Onull.c b/src/H5Onull.c index d6ec380cbbf..c4f52a9b18a 100644 --- a/src/H5Onull.c +++ b/src/H5Onull.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Opkg.h b/src/H5Opkg.h index d4cab42471d..b47c82e23f9 100644 --- a/src/H5Opkg.h +++ b/src/H5Opkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Opline.c b/src/H5Opline.c index 3e5eb4d7318..d0b5322dd97 100644 --- a/src/H5Opline.c +++ b/src/H5Opline.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -88,8 +88,7 @@ const unsigned H5O_pline_ver_bounds[] = { H5O_PLINE_VERSION_2, /* H5F_LIBVER_V110 */ H5O_PLINE_VERSION_2, /* H5F_LIBVER_V112 */ H5O_PLINE_VERSION_2, /* H5F_LIBVER_V114 */ - H5O_PLINE_VERSION_2, /* H5F_LIBVER_V116 */ - H5O_PLINE_VERSION_2, /* H5F_LIBVER_V118 */ + H5O_PLINE_VERSION_2, /* H5F_LIBVER_V200 */ H5O_PLINE_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; diff --git a/src/H5Oprivate.h b/src/H5Oprivate.h index 74251811174..d8e4a69431b 100644 --- a/src/H5Oprivate.h +++ b/src/H5Oprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -960,6 +960,7 @@ H5_DLL uint8_t H5O_get_oh_version(const H5O_t *oh); H5_DLL herr_t H5O_get_rc_and_type(const H5O_loc_t *oloc, unsigned *rc, H5O_type_t *otype); H5_DLL H5AC_proxy_entry_t *H5O_get_proxy(const H5O_t *oh); H5_DLL bool H5O_has_chksum(const H5O_t *oh); +H5_DLL herr_t H5O_get_version_bound(H5F_libver_t bound, uint8_t *version); /* Object header message routines */ H5_DLL herr_t H5O_msg_create(const H5O_loc_t *loc, unsigned type_id, unsigned mesg_flags, diff --git a/src/H5Opublic.h b/src/H5Opublic.h index 498e2595254..8968ac1f1e2 100644 --- a/src/H5Opublic.h +++ b/src/H5Opublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1208,6 +1208,8 @@ H5_DLL ssize_t H5Oget_comment_by_name(hid_t loc_id, const char *name, char *comm * group change during the iteration, the resulting behavior * is undefined. * + * \callback_note + * * \par Example * An example snippet from test/links.c: * \snippet links.c H5Ovisit3_snip @@ -1311,6 +1313,8 @@ H5_DLL herr_t H5Ovisit3(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order * in the file has been presented to the application for whatever * processing the application requires. * + * \callback_note + * * \par Example * An example snippet from test/links.c: * \snippet links.c H5Ovisit_by_name3_snip @@ -2254,6 +2258,8 @@ H5_DLL herr_t H5Ovisit1(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order * in the file has been presented to the application for whatever * processing the application requires. * + * \callback_note + * * \version 1.10.5 The macro #H5Ovisit_by_name was removed and the function * H5Ovisit_by_name1() was copied to #H5Ovisit_by_name. * \version 1.10.3 The H5Ovisit_by_name() function was renamed to H5Ovisit_by_name1(), @@ -2346,6 +2352,7 @@ H5_DLL herr_t H5Ovisit_by_name1(hid_t loc_id, const char *obj_name, H5_index_t i * group change during the iteration, the resulting behavior * is undefined. * + * \callback_note * * \since 1.10.3 * @@ -2456,6 +2463,8 @@ H5_DLL herr_t H5Ovisit2(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order * in the file has been presented to the application for whatever * processing the application requires. * + * \callback_note + * * \since 1.10.3 * */ diff --git a/src/H5Orefcount.c b/src/H5Orefcount.c index a93f4295a86..562d149f8b0 100644 --- a/src/H5Orefcount.c +++ b/src/H5Orefcount.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Osdspace.c b/src/H5Osdspace.c index 365e3511243..7c2fc52c496 100644 --- a/src/H5Osdspace.c +++ b/src/H5Osdspace.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Oshared.c b/src/H5Oshared.c index d562d1764a8..0007ef4886b 100644 --- a/src/H5Oshared.c +++ b/src/H5Oshared.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Oshared.h b/src/H5Oshared.h index d22e2e1b14c..a7b3fd4d442 100644 --- a/src/H5Oshared.h +++ b/src/H5Oshared.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -42,7 +42,8 @@ H5O_SHARED_DECODE(H5F_t *f, H5O_t *open_oh, unsigned mesg_flags, unsigned *iofla { void *ret_value = NULL; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + /* H5O_SHARED_DECODE will be defined as a package function */ + FUNC_ENTER_PACKAGE #ifndef H5O_SHARED_TYPE #error "Need to define H5O_SHARED_TYPE macro!" @@ -97,7 +98,8 @@ H5O_SHARED_ENCODE(H5F_t *f, bool disable_shared, size_t H5_ATTR_UNUSED p_size, u (const H5O_shared_t *)_mesg; /* Pointer to shared message portion of actual message */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + /* H5O_SHARED_ENCODE will be defined as a package function */ + FUNC_ENTER_PACKAGE #ifndef H5O_SHARED_TYPE #error "Need to define H5O_SHARED_TYPE macro!" @@ -148,7 +150,8 @@ H5O_SHARED_SIZE(const H5F_t *f, bool disable_shared, const void *_mesg) (const H5O_shared_t *)_mesg; /* Pointer to shared message portion of actual message */ size_t ret_value = 0; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + /* H5O_SHARED_SIZE will be defined as a package function */ + FUNC_ENTER_PACKAGE #ifndef H5O_SHARED_TYPE #error "Need to define H5O_SHARED_TYPE macro!" @@ -195,6 +198,7 @@ H5O_SHARED_DELETE(H5F_t *f, H5O_t *open_oh, void *_mesg) H5O_shared_t *sh_mesg = (H5O_shared_t *)_mesg; /* Pointer to shared message portion of actual message */ herr_t ret_value = SUCCEED; /* Return value */ + /* H5O_SHARED_DELETE will be defined as a package function */ FUNC_ENTER_PACKAGE #ifndef H5O_SHARED_TYPE @@ -241,6 +245,7 @@ H5O_SHARED_LINK(H5F_t *f, H5O_t *open_oh, void *_mesg) H5O_shared_t *sh_mesg = (H5O_shared_t *)_mesg; /* Pointer to shared message portion of actual message */ herr_t ret_value = SUCCEED; /* Return value */ + /* H5O_SHARED_LINK will be defined as a package function */ FUNC_ENTER_PACKAGE #ifndef H5O_SHARED_TYPE @@ -287,6 +292,7 @@ H5O_SHARED_COPY_FILE(H5F_t *file_src, void *_native_src, H5F_t *file_dst, bool * void *dst_mesg = NULL; /* Destination message */ void *ret_value = NULL; /* Return value */ + /* H5O_SHARED_COPY_FILE will be defined as a package function */ FUNC_ENTER_PACKAGE #ifndef H5O_SHARED_TYPE @@ -347,7 +353,8 @@ H5O_SHARED_POST_COPY_FILE(const H5O_loc_t H5_ATTR_NDEBUG_UNUSED *oloc_src, const H5O_shared_t *shared_dst = (H5O_shared_t *)mesg_dst; /* Alias to shared info in native destination */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + /* H5O_SHARED_POST_COPY_FILE will be defined as a package function */ + FUNC_ENTER_PACKAGE assert(oloc_src->file); assert(oloc_dst->file); @@ -409,7 +416,8 @@ H5O_SHARED_DEBUG(H5F_t *f, const void *_mesg, FILE *stream, int indent, int fwid (const H5O_shared_t *)_mesg; /* Pointer to shared message portion of actual message */ herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + /* H5O_SHARED_DEBUG will be defined as a package function */ + FUNC_ENTER_PACKAGE #ifndef H5O_SHARED_TYPE #error "Need to define H5O_SHARED_TYPE macro!" diff --git a/src/H5Oshmesg.c b/src/H5Oshmesg.c index 98f18292c93..b8fa7c97c13 100644 --- a/src/H5Oshmesg.c +++ b/src/H5Oshmesg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ostab.c b/src/H5Ostab.c index c87034dc13f..9a25b228d14 100644 --- a/src/H5Ostab.c +++ b/src/H5Ostab.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Otest.c b/src/H5Otest.c index 410baa7f603..dd45ef8c50f 100644 --- a/src/H5Otest.c +++ b/src/H5Otest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -82,11 +82,12 @@ htri_t H5O__is_attr_dense_test(hid_t oid) { - H5O_t *oh = NULL; /* Object header */ - H5O_ainfo_t ainfo; /* Attribute information for object */ - H5O_loc_t *loc; /* Pointer to object's location */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - htri_t ret_value = FAIL; /* Return value */ + H5O_t *oh = NULL; /* Object header */ + H5O_ainfo_t ainfo; /* Attribute information for object */ + H5O_loc_t *loc; /* Pointer to object's location */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + htri_t ret_value = FAIL; /* Return value */ FUNC_ENTER_PACKAGE @@ -95,7 +96,7 @@ H5O__is_attr_dense_test(hid_t oid) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -151,14 +152,15 @@ H5O__is_attr_dense_test(hid_t oid) htri_t H5O__is_attr_empty_test(hid_t oid) { - H5O_t *oh = NULL; /* Object header */ - H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ - H5O_ainfo_t ainfo; /* Attribute information for object */ - htri_t ainfo_exists = false; /* Whether the attribute info exists in the file */ - H5O_loc_t *loc; /* Pointer to object's location */ - hsize_t nattrs; /* Number of attributes */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - htri_t ret_value = FAIL; /* Return value */ + H5O_t *oh = NULL; /* Object header */ + H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ + H5O_ainfo_t ainfo; /* Attribute information for object */ + htri_t ainfo_exists = false; /* Whether the attribute info exists in the file */ + H5O_loc_t *loc; /* Pointer to object's location */ + hsize_t nattrs; /* Number of attributes */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + htri_t ret_value = FAIL; /* Return value */ FUNC_ENTER_PACKAGE @@ -167,7 +169,7 @@ H5O__is_attr_empty_test(hid_t oid) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -254,13 +256,14 @@ H5O__is_attr_empty_test(hid_t oid) herr_t H5O__num_attrs_test(hid_t oid, hsize_t *nattrs) { - H5O_t *oh = NULL; /* Object header */ - H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ - H5O_ainfo_t ainfo; /* Attribute information for object */ - H5O_loc_t *loc; /* Pointer to object's location */ - hsize_t obj_nattrs; /* Number of attributes */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5O_t *oh = NULL; /* Object header */ + H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ + H5O_ainfo_t ainfo; /* Attribute information for object */ + H5O_loc_t *loc; /* Pointer to object's location */ + hsize_t obj_nattrs; /* Number of attributes */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -269,7 +272,7 @@ H5O__num_attrs_test(hid_t oid, hsize_t *nattrs) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -353,13 +356,14 @@ H5O__num_attrs_test(hid_t oid, hsize_t *nattrs) herr_t H5O__attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count) { - H5O_t *oh = NULL; /* Object header */ - H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ - H5B2_t *bt2_corder = NULL; /* v2 B-tree handle for creation order index */ - H5O_ainfo_t ainfo; /* Attribute information for object */ - H5O_loc_t *loc; /* Pointer to object's location */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5O_t *oh = NULL; /* Object header */ + H5B2_t *bt2_name = NULL; /* v2 B-tree handle for name index */ + H5B2_t *bt2_corder = NULL; /* v2 B-tree handle for creation order index */ + H5O_ainfo_t ainfo; /* Attribute information for object */ + H5O_loc_t *loc; /* Pointer to object's location */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -368,7 +372,7 @@ H5O__attr_dense_info_test(hid_t oid, hsize_t *name_count, hsize_t *corder_count) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -624,12 +628,13 @@ H5O__get_rc_test(const H5O_loc_t *loc, unsigned *rc) herr_t H5O__msg_get_chunkno_test(hid_t oid, unsigned msg_type, unsigned *chunk_num) { - H5O_t *oh = NULL; /* Object header */ - H5O_loc_t *loc; /* Pointer to object's location */ - H5O_mesg_t *idx_msg; /* Pointer to message */ - unsigned idx; /* Index of message */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5O_t *oh = NULL; /* Object header */ + H5O_loc_t *loc; /* Pointer to object's location */ + H5O_mesg_t *idx_msg; /* Pointer to message */ + unsigned idx; /* Index of message */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -638,7 +643,7 @@ H5O__msg_get_chunkno_test(hid_t oid, unsigned msg_type, unsigned *chunk_num) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; @@ -691,12 +696,13 @@ H5O__msg_get_chunkno_test(hid_t oid, unsigned msg_type, unsigned *chunk_num) herr_t H5O__msg_move_to_new_chunk_test(hid_t oid, unsigned msg_type) { - H5O_t *oh = NULL; /* Object header */ - H5O_loc_t *loc; /* Pointer to object's location */ - H5O_mesg_t *curr_msg; /* Pointer to current message */ - unsigned idx; /* Index of message */ - bool api_ctx_pushed = false; /* Whether API context pushed */ - herr_t ret_value = SUCCEED; /* Return value */ + H5O_t *oh = NULL; /* Object header */ + H5O_loc_t *loc; /* Pointer to object's location */ + H5O_mesg_t *curr_msg; /* Pointer to current message */ + unsigned idx; /* Index of message */ + H5CX_node_t api_ctx = {{0}, NULL}; /* API context node to push */ + bool api_ctx_pushed = false; /* Whether API context pushed */ + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -705,7 +711,7 @@ H5O__msg_move_to_new_chunk_test(hid_t oid, unsigned msg_type) HGOTO_ERROR(H5E_SYM, H5E_NOTFOUND, FAIL, "object not found"); /* Set API context */ - if (H5CX_push() < 0) + if (H5CX_push(&api_ctx) < 0) HGOTO_ERROR(H5E_OHDR, H5E_CANTSET, FAIL, "can't set API context"); api_ctx_pushed = true; diff --git a/src/H5Ounknown.c b/src/H5Ounknown.c index 08841021dec..d045e9b3a53 100644 --- a/src/H5Ounknown.c +++ b/src/H5Ounknown.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5P.c b/src/H5P.c index f0ccc2fc4ef..daf998fc135 100644 --- a/src/H5P.c +++ b/src/H5P.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -52,6 +52,9 @@ typedef struct { /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -1492,7 +1495,7 @@ H5Pclose(hid_t plist_id) EXAMPLES REVISION LOG --------------------------------------------------------------------------*/ -char * +H5_ATTR_MALLOC char * H5Pget_class_name(hid_t pclass_id) { H5P_genclass_t *pclass; /* Property class to query */ diff --git a/src/H5PB.c b/src/H5PB.c index 69707d14cba..37831d03e5d 100644 --- a/src/H5PB.c +++ b/src/H5PB.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -130,6 +130,9 @@ static herr_t H5PB__write_entry(H5F_shared_t *f_sh, H5PB_entry_t *page_entry); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ diff --git a/src/H5PBmodule.h b/src/H5PBmodule.h index 3a353dbd0b2..647e8205407 100644 --- a/src/H5PBmodule.h +++ b/src/H5PBmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5PB_MODULE -#define H5_MY_PKG H5PB -#define H5_MY_PKG_ERR H5E_RESOURCE +#define H5_MY_PKG H5PB +#define H5_MY_PKG_ERR H5E_RESOURCE +#define H5_MY_PKG_INIT NO #endif /* H5PBmodule_H */ diff --git a/src/H5PBpkg.h b/src/H5PBpkg.h index 527c109df74..e25c2ad0614 100644 --- a/src/H5PBpkg.h +++ b/src/H5PBpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5PBprivate.h b/src/H5PBprivate.h index d4abf8ef081..65a1e812479 100644 --- a/src/H5PBprivate.h +++ b/src/H5PBprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5PL.c b/src/H5PL.c index b132721f732..a29ff97bc23 100644 --- a/src/H5PL.c +++ b/src/H5PL.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5PLextern.h b/src/H5PLextern.h index d136051beda..9abfb2e9f1d 100644 --- a/src/H5PLextern.h +++ b/src/H5PLextern.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5PLint.c b/src/H5PLint.c index 6ee4603f63a..a1003147944 100644 --- a/src/H5PLint.c +++ b/src/H5PLint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -45,6 +45,9 @@ /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -119,21 +122,22 @@ H5PL__set_plugin_control_mask(unsigned int mask) } /* end H5PL__set_plugin_control_mask() */ /*------------------------------------------------------------------------- - * Function: H5PL_init + * Function: H5PL__init_package * - * Purpose: Initialize the interface from some other layer. + * Purpose: Initialize any package-specific data and call any init + * routines for the package. * * Return: Success: non-negative * Failure: negative *------------------------------------------------------------------------- */ herr_t -H5PL_init(void) +H5PL__init_package(void) { char *env_var = NULL; herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Check the environment variable to determine if the user wants * to ignore plugins. The special symbol H5PL_NO_PLUGIN (defined in @@ -155,7 +159,7 @@ H5PL_init(void) done: FUNC_LEAVE_NOAPI(ret_value) -} +} /* end H5PL__init_package() */ /*------------------------------------------------------------------------- * Function: H5PL_term_package @@ -178,17 +182,23 @@ H5PL_term_package(void) FUNC_ENTER_NOAPI_NOINIT - /* Close the plugin cache. - * We need to bump the return value if we did any real work here. - */ - if (H5PL__close_plugin_cache(&already_closed) < 0) - HGOTO_ERROR(H5E_PLUGIN, H5E_CANTFREE, (-1), "problem closing plugin cache"); - if (!already_closed) - ret_value++; + if (H5_PKG_INIT_VAR) { + /* Close the plugin cache. + * We need to bump the return value if we did any real work here. + */ + if (H5PL__close_plugin_cache(&already_closed) < 0) + HGOTO_ERROR(H5E_PLUGIN, H5E_CANTFREE, (-1), "problem closing plugin cache"); + if (!already_closed) + ret_value++; - /* Close the search path table and free the paths */ - if (H5PL__close_path_table() < 0) - HGOTO_ERROR(H5E_PLUGIN, H5E_CANTFREE, (-1), "problem closing search path table"); + /* Close the search path table and free the paths */ + if (H5PL__close_path_table() < 0) + HGOTO_ERROR(H5E_PLUGIN, H5E_CANTFREE, (-1), "problem closing search path table"); + + /* Mark the interface as uninitialized */ + if (0 == ret_value) + H5_PKG_INIT_VAR = false; + } /* end if */ done: FUNC_LEAVE_NOAPI(ret_value) @@ -504,9 +514,10 @@ H5PL_iterate(H5PL_iterate_type_t iter_type, H5PL_iterate_t iter_op, void *op_dat { herr_t ret_value = H5_ITER_CONT; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(H5_ITER_ERROR) ret_value = H5PL__path_table_iterate(iter_type, iter_op, op_data); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5PL_iterate() */ diff --git a/src/H5PLmodule.h b/src/H5PLmodule.h index 1aedc2783fe..5548540c533 100644 --- a/src/H5PLmodule.h +++ b/src/H5PLmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -23,8 +23,9 @@ * reporting macros. */ #define H5PL_MODULE -#define H5_MY_PKG H5PL -#define H5_MY_PKG_ERR H5E_PLUGIN +#define H5_MY_PKG H5PL +#define H5_MY_PKG_ERR H5E_PLUGIN +#define H5_MY_PKG_INIT YES /** \page H5PL_UG HDF5 Plugins * @@ -48,16 +49,23 @@ * available to the application. For example, if the application intends to apply the HDF5 bzip2 compression * filter that was registered with The HDF Group and has an identification number 307 * (
Registered - * Filters) then the application would follow the steps as outlined below: \code dcpl = H5Pcreate - * (H5P_DATASET_CREATE); status = H5Pset_filter (dcpl, (H5Z_filter_t)307, H5Z_FLAG_MANDATORY, (size_t)6, - * cd_values); dset = H5Dcreate (file, DATASET, H5T_STD_I32LE, space, H5P_DEFAULT, dcpl, status = H5Dwrite - * (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]); \endcode + * Filters) then the application would follow the steps as outlined below: + * \code + * dcpl = H5Pcreate (H5P_DATASET_CREATE); + * status = H5Pset_filter (dcpl, (H5Z_filter_t)307, H5Z_FLAG_MANDATORY, (size_t)6, cd_values); + * dset = H5Dcreate (file, DATASET, H5T_STD_I32LE, space, H5P_DEFAULT, dcpl, H5P_DEFAULT); + * status = H5Dwrite (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, wdata[0]); + * \endcode * * \subsubsection subsubsec_filter_plugins_model_read Reading Data with an Applied Third-party Filter * An application does not need to do anything special to read the data with a third-party filter applied. For * example, if one wants to read data written in the previous example, the following regular steps should be - * taken: \code file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT); dset = H5Dopen (file, DATASET, - * H5P_DEFAULT); H5Dread (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]); \endcode + * taken: + * \code + * file = H5Fopen (FILE, H5F_ACC_RDONLY, H5P_DEFAULT); + * dset = H5Dopen (file, DATASET, H5P_DEFAULT); + * H5Dread (dset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, rdata[0]); + * \endcode * * The command-line utility h5dump, for example, will read and display the data as shown: * \code @@ -161,10 +169,78 @@ * plugin on the system. * * \subsubsection subsubsec_filter_plugins_prog_write Writing a Filter Function - * The HDF5 filter function for the dynamically loaded filter feature should be written as any custom filter - * described in Custom Filters. See the - * “Example” section, section 5, of that document to get an idea of the simple filter function, and see the - * example of the more sophisticated HDF5 bzip2 filter function in the “Building an HDF5 bzip2 Plugin Example” + * The HDF5 filter function for the dynamically loaded filter feature should be written as a custom filter. + * This example shows how to define and register a simple filter + * that adds a checksum capability to the data stream. + * + * The function that acts as the filter always returns zero (failure) if the md5() function was + * not detected at configuration time (left as an exercise for the reader). Otherwise the function is broken + * down to an input and output half. The output half calculates a checksum, increases the size of the output + * buffer if necessary, and appends the checksum to the end of the buffer. The input half calculates the + * checksum on the first part of the buffer and compares it to the checksum already stored at the end of the + * buffer. If the two differ then zero (failure) is returned, otherwise the buffer size is reduced to exclude + * the checksum. /code size_t md5_filter(unsigned int flags, size_t cd_nelmts, const unsigned int cd_values[], + * size_t nbytes, size_t *buf_size, void **buf) + * { + * \c \#ifdef HAVE_MD5 + * unsigned char cksum[16]; + * + * if (flags & H5Z_REVERSE) { + * // Input + * assert(nbytes >= 16); + * md5(nbytes-16, *buf, cksum); + * // Compare + * if (memcmp(cksum, (char*)(*buf)+ nbytes- 16, 16)) { + * return 0; // fail + * } + * // Strip off checksum + * return nbytes - 16; + * } + * else { + * // Output + * md5(nbytes, *buf, cksum); + * // Increase buffer size if necessary + * if (nbytes + 16 > *buf_size) { + * *buf_size = nbytes + 16; + * *buf = realloc(*buf, *buf_size); + * } + * // Append checksum + * memcpy((char*)(*buf)+nbytes, cksum, 16); + * return nbytes+16; + * } + * \c \#else + * return 0; // fail + * \c \#endif + * } + * /endcode + * + * Once the filter function is defined it must be registered so + * the HDF5 library knows about it. Since we're testing this + * filter we choose one of the #H5Z_filter_t numbers + * from the reserved range. We'll randomly choose 305. + * + * /code + * \c \#define FILTER_MD5 305 + * herr_t status = H5Zregister(FILTER_MD5, "md5 checksum", md5_filter); + * /endcode + * + * Now we can use the filter in a pipeline. We could have added + * the filter to the pipeline before defining or registering the + * filter as long as the filter was defined and registered by time + * we tried to use it (if the filter is marked as optional then we + * could have used it without defining it and the library would + * have automatically removed it from the pipeline for each chunk + * written before the filter was defined and registered). + * + * /code + * hid_t dcpl = H5Pcreate(H5P_DATASET_CREATE); + * hsize_t chunk_size[3] = {10,10,10}; + * H5Pset_chunk(dcpl, 3, chunk_size); + * H5Pset_filter(dcpl, FILTER_MD5, 0, 0, NULL); + * hid_t dset = H5Dcreate(file, "dset", H5T_NATIVE_DOUBLE, space, dcpl); + * /endcode + * + * See the example of a more sophisticated HDF5 bzip2 filter function in the /ref subsec_filter_plugins_build * section. The HDF5 bzip2 filter function is also available for download from Filter Plugin Repository. * @@ -178,7 +254,7 @@ *
  • 3. An HDF5 filter should return zero in the case of failure.
  • * * The signature of the HDF5 filter function and the accompanying filter structure (see the section below) - * are described in the HDF5 Reference Manual #H5Z_filter_t. + * are described in the \ref RM #H5Z_filter_t. * * \subsubsection subsubsec_filter_plugins_prog_reg Registering a Filter with The HDF Group * If you are writing a filter that will be used by others, it would be a good idea to request a filter diff --git a/src/H5PLpath.c b/src/H5PLpath.c index 02e7d25d4d5..b27797fb521 100644 --- a/src/H5PLpath.c +++ b/src/H5PLpath.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5PLpkg.h b/src/H5PLpkg.h index 24a7f34d3f4..f7830504df9 100644 --- a/src/H5PLpkg.h +++ b/src/H5PLpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5PLplugin_cache.c b/src/H5PLplugin_cache.c index 3878f36efaa..3b31f1efdd5 100644 --- a/src/H5PLplugin_cache.c +++ b/src/H5PLplugin_cache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5PLprivate.h b/src/H5PLprivate.h index 0c71b176b73..504b43f89ce 100644 --- a/src/H5PLprivate.h +++ b/src/H5PLprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -82,6 +82,5 @@ typedef herr_t (*H5PL_iterate_t)(H5PL_type_t plugin_type, const void *plugin_inf /* Internal API routines */ H5_DLL const void *H5PL_load(H5PL_type_t plugin_type, const H5PL_key_t *key); H5_DLL herr_t H5PL_iterate(H5PL_iterate_type_t iter_type, H5PL_iterate_t iter_op, void *op_data); -H5_DLL herr_t H5PL_init(void); #endif /* H5PLprivate_H */ diff --git a/src/H5PLpublic.h b/src/H5PLpublic.h index ca996977485..18ca6ec51ce 100644 --- a/src/H5PLpublic.h +++ b/src/H5PLpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pacpl.c b/src/H5Pacpl.c index b4dd90b8dfc..73d8a8ec985 100644 --- a/src/H5Pacpl.c +++ b/src/H5Pacpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pdapl.c b/src/H5Pdapl.c index fd6f2e2ddf9..af123632963 100644 --- a/src/H5Pdapl.c +++ b/src/H5Pdapl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pdcpl.c b/src/H5Pdcpl.c index e0c865242c0..5a10139ae48 100644 --- a/src/H5Pdcpl.c +++ b/src/H5Pdcpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pdeprec.c b/src/H5Pdeprec.c index 3332a35a9b9..c986eb30142 100644 --- a/src/H5Pdeprec.c +++ b/src/H5Pdeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pdxpl.c b/src/H5Pdxpl.c index bd53c3affd1..4fc27f6be96 100644 --- a/src/H5Pdxpl.c +++ b/src/H5Pdxpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pencdec.c b/src/H5Pencdec.c index 19d453279ee..96cbfc3f018 100644 --- a/src/H5Pencdec.c +++ b/src/H5Pencdec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pfapl.c b/src/H5Pfapl.c index f726f63e7b4..a498b99db0b 100644 --- a/src/H5Pfapl.c +++ b/src/H5Pfapl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1461,14 +1461,14 @@ H5Pget_driver(hid_t plist_id) H5P_genplist_t *plist; /* Property list pointer */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API(FAIL) + FUNC_ENTER_API(H5I_INVALID_HID) if (NULL == (plist = (H5P_genplist_t *)H5I_object_verify(plist_id, H5I_GENPROP_LST))) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a property list"); + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "not a property list"); /* Get the driver */ if ((ret_value = H5P_peek_driver(plist)) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get driver"); + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't get driver"); done: FUNC_LEAVE_API(ret_value) diff --git a/src/H5Pfcpl.c b/src/H5Pfcpl.c index 8e43874275c..c2f44dec615 100644 --- a/src/H5Pfcpl.c +++ b/src/H5Pfcpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pfmpl.c b/src/H5Pfmpl.c index 97856c5a525..aa89e6fbec1 100644 --- a/src/H5Pfmpl.c +++ b/src/H5Pfmpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pgcpl.c b/src/H5Pgcpl.c index b7d9ca1fb23..657eecd95f6 100644 --- a/src/H5Pgcpl.c +++ b/src/H5Pgcpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pint.c b/src/H5Pint.c index f8c79bf022f..3ff94a63d3d 100644 --- a/src/H5Pint.c +++ b/src/H5Pint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -118,7 +118,7 @@ static herr_t H5P__free_del_name_cb(void *item, void H5_ATTR_UNUSED *key, void H /* * Predefined property list classes. These are initialized at runtime by - * H5P_init() in this source file. + * H5P__init_package() in this source file. */ hid_t H5P_CLS_ROOT_ID_g = H5I_INVALID_HID; H5P_genclass_t *H5P_CLS_ROOT_g = NULL; @@ -168,7 +168,7 @@ H5P_genclass_t *H5P_CLS_VOL_INITIALIZE_g = NULL; /* * Predefined property lists for each predefined class. These are initialized - * at runtime by H5P_init() in this source file. + * at runtime by H5P__init_package() in this source file. */ hid_t H5P_LST_ATTRIBUTE_ACCESS_ID_g = H5I_INVALID_HID; hid_t H5P_LST_ATTRIBUTE_CREATE_ID_g = H5I_INVALID_HID; @@ -421,13 +421,64 @@ static const H5I_class_t H5I_GENPROPLST_CLS[1] = {{ */ herr_t H5P_init_phase1(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5P_init_phase1() */ + +/*------------------------------------------------------------------------- + * Function: H5P_init_phase2 + * + * Purpose: Finish initializing the interface from some other package. + * + * Note: This is broken out as a separate routine so that the + * library's default VFL driver can be chosen and initialized + * after the entire H5P interface has been initialized. + * + * Return: Success: Non-negative + * Failure: Negative + * + *------------------------------------------------------------------------- + */ +herr_t +H5P_init_phase2(void) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_NOAPI(FAIL) + + /* Set up the default VFL driver */ + if (H5P__facc_set_def_driver() < 0) + HGOTO_ERROR(H5E_PLIST, H5E_CANTSET, FAIL, "unable to set default VFL driver"); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5P_init_phase2() */ + +/*-------------------------------------------------------------------------- +NAME + H5P__init_package -- Initialize interface-specific information +USAGE + herr_t H5P__init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------*/ +herr_t +H5P__init_package(void) { size_t tot_init = 0; /* Total # of classes initialized */ size_t pass_init; /* # of classes initialized in each pass */ size_t u; herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Sanity check */ HDcompile_assert(H5P_TYPE_REFERENCE_ACCESS == (H5P_TYPE_MAX_TYPE - 1)); @@ -518,36 +569,7 @@ H5P_init_phase1(void) } FUNC_LEAVE_NOAPI(ret_value) -} - -/*------------------------------------------------------------------------- - * Function: H5P_init_phase2 - * - * Purpose: Finish initializing the interface from some other package. - * - * Note: This is broken out as a separate routine so that the - * library's default VFL driver can be chosen and initialized - * after the entire H5P interface has been initialized. - * - * Return: Success: Non-negative - * Failure: Negative - * - *------------------------------------------------------------------------- - */ -herr_t -H5P_init_phase2(void) -{ - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI(FAIL) - - /* Set up the default VFL driver */ - if (H5P__facc_set_def_driver() < 0) - HGOTO_ERROR(H5E_VFL, H5E_CANTSET, FAIL, "unable to set default VFL driver"); - -done: - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5P_init_phase2() */ +} /* end H5P__init_package() */ /*-------------------------------------------------------------------------- NAME @@ -573,107 +595,113 @@ H5P_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - int64_t nlist, nclass; - - /* Destroy HDF5 library property classes & lists */ - - /* Check if there are any open property list classes or lists */ - nclass = H5I_nmembers(H5I_GENPROP_CLS); - nlist = H5I_nmembers(H5I_GENPROP_LST); - - /* If there are any open classes or groups, attempt to get rid of them. */ - if ((nclass + nlist) > 0) { - /* Clear the lists */ - if (nlist > 0) { - (void)H5I_clear_type(H5I_GENPROP_LST, false, false); - - /* Reset the default property lists, if they've been closed */ - if (H5I_nmembers(H5I_GENPROP_LST) == 0) { - H5P_LST_ATTRIBUTE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_ATTRIBUTE_CREATE_ID_g = H5I_INVALID_HID; - H5P_LST_DATASET_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_DATASET_CREATE_ID_g = H5I_INVALID_HID; - H5P_LST_DATASET_XFER_ID_g = H5I_INVALID_HID; - H5P_LST_DATATYPE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_DATATYPE_CREATE_ID_g = H5I_INVALID_HID; - H5P_LST_FILE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_FILE_CREATE_ID_g = H5I_INVALID_HID; - H5P_LST_FILE_MOUNT_ID_g = H5I_INVALID_HID; - H5P_LST_GROUP_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_GROUP_CREATE_ID_g = H5I_INVALID_HID; - H5P_LST_LINK_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_LINK_CREATE_ID_g = H5I_INVALID_HID; - H5P_LST_MAP_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_MAP_CREATE_ID_g = H5I_INVALID_HID; - H5P_LST_OBJECT_COPY_ID_g = H5I_INVALID_HID; - H5P_LST_REFERENCE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_LST_VOL_INITIALIZE_ID_g = H5I_INVALID_HID; + if (H5_PKG_INIT_VAR) { + int64_t nlist, nclass; + + /* Destroy HDF5 library property classes & lists */ + + /* Check if there are any open property list classes or lists */ + nclass = H5I_nmembers(H5I_GENPROP_CLS); + nlist = H5I_nmembers(H5I_GENPROP_LST); + + /* If there are any open classes or groups, attempt to get rid of them. */ + if ((nclass + nlist) > 0) { + /* Clear the lists */ + if (nlist > 0) { + (void)H5I_clear_type(H5I_GENPROP_LST, false, false); + + /* Reset the default property lists, if they've been closed */ + if (H5I_nmembers(H5I_GENPROP_LST) == 0) { + H5P_LST_ATTRIBUTE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_ATTRIBUTE_CREATE_ID_g = H5I_INVALID_HID; + H5P_LST_DATASET_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_DATASET_CREATE_ID_g = H5I_INVALID_HID; + H5P_LST_DATASET_XFER_ID_g = H5I_INVALID_HID; + H5P_LST_DATATYPE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_DATATYPE_CREATE_ID_g = H5I_INVALID_HID; + H5P_LST_FILE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_FILE_CREATE_ID_g = H5I_INVALID_HID; + H5P_LST_FILE_MOUNT_ID_g = H5I_INVALID_HID; + H5P_LST_GROUP_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_GROUP_CREATE_ID_g = H5I_INVALID_HID; + H5P_LST_LINK_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_LINK_CREATE_ID_g = H5I_INVALID_HID; + H5P_LST_MAP_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_MAP_CREATE_ID_g = H5I_INVALID_HID; + H5P_LST_OBJECT_COPY_ID_g = H5I_INVALID_HID; + H5P_LST_REFERENCE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_LST_VOL_INITIALIZE_ID_g = H5I_INVALID_HID; + } } - } - /* Only attempt to close the classes after all the lists are closed */ - if (nlist == 0 && nclass > 0) { - (void)H5I_clear_type(H5I_GENPROP_CLS, false, false); - - /* Reset the default property classes and IDs if they've been closed */ - if (H5I_nmembers(H5I_GENPROP_CLS) == 0) { - H5P_CLS_ROOT_g = NULL; - - H5P_CLS_ATTRIBUTE_ACCESS_g = NULL; - H5P_CLS_ATTRIBUTE_CREATE_g = NULL; - H5P_CLS_DATASET_ACCESS_g = NULL; - H5P_CLS_DATASET_CREATE_g = NULL; - H5P_CLS_DATASET_XFER_g = NULL; - H5P_CLS_DATATYPE_ACCESS_g = NULL; - H5P_CLS_DATATYPE_CREATE_g = NULL; - H5P_CLS_FILE_ACCESS_g = NULL; - H5P_CLS_FILE_CREATE_g = NULL; - H5P_CLS_FILE_MOUNT_g = NULL; - H5P_CLS_GROUP_ACCESS_g = NULL; - H5P_CLS_GROUP_CREATE_g = NULL; - H5P_CLS_LINK_ACCESS_g = NULL; - H5P_CLS_LINK_CREATE_g = NULL; - H5P_CLS_MAP_ACCESS_g = NULL; - H5P_CLS_MAP_CREATE_g = NULL; - H5P_CLS_OBJECT_COPY_g = NULL; - H5P_CLS_OBJECT_CREATE_g = NULL; - H5P_CLS_REFERENCE_ACCESS_g = NULL; - H5P_CLS_STRING_CREATE_g = NULL; - H5P_CLS_VOL_INITIALIZE_g = NULL; - - H5P_CLS_ROOT_ID_g = H5I_INVALID_HID; - - H5P_CLS_ATTRIBUTE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_ATTRIBUTE_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_DATASET_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_DATASET_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_DATASET_XFER_ID_g = H5I_INVALID_HID; - H5P_CLS_DATATYPE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_DATATYPE_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_FILE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_FILE_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_FILE_MOUNT_ID_g = H5I_INVALID_HID; - H5P_CLS_GROUP_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_GROUP_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_LINK_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_LINK_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_MAP_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_MAP_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_OBJECT_COPY_ID_g = H5I_INVALID_HID; - H5P_CLS_OBJECT_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_REFERENCE_ACCESS_ID_g = H5I_INVALID_HID; - H5P_CLS_STRING_CREATE_ID_g = H5I_INVALID_HID; - H5P_CLS_VOL_INITIALIZE_ID_g = H5I_INVALID_HID; + /* Only attempt to close the classes after all the lists are closed */ + if (nlist == 0 && nclass > 0) { + (void)H5I_clear_type(H5I_GENPROP_CLS, false, false); + + /* Reset the default property classes and IDs if they've been closed */ + if (H5I_nmembers(H5I_GENPROP_CLS) == 0) { + H5P_CLS_ROOT_g = NULL; + + H5P_CLS_ATTRIBUTE_ACCESS_g = NULL; + H5P_CLS_ATTRIBUTE_CREATE_g = NULL; + H5P_CLS_DATASET_ACCESS_g = NULL; + H5P_CLS_DATASET_CREATE_g = NULL; + H5P_CLS_DATASET_XFER_g = NULL; + H5P_CLS_DATATYPE_ACCESS_g = NULL; + H5P_CLS_DATATYPE_CREATE_g = NULL; + H5P_CLS_FILE_ACCESS_g = NULL; + H5P_CLS_FILE_CREATE_g = NULL; + H5P_CLS_FILE_MOUNT_g = NULL; + H5P_CLS_GROUP_ACCESS_g = NULL; + H5P_CLS_GROUP_CREATE_g = NULL; + H5P_CLS_LINK_ACCESS_g = NULL; + H5P_CLS_LINK_CREATE_g = NULL; + H5P_CLS_MAP_ACCESS_g = NULL; + H5P_CLS_MAP_CREATE_g = NULL; + H5P_CLS_OBJECT_COPY_g = NULL; + H5P_CLS_OBJECT_CREATE_g = NULL; + H5P_CLS_REFERENCE_ACCESS_g = NULL; + H5P_CLS_STRING_CREATE_g = NULL; + H5P_CLS_VOL_INITIALIZE_g = NULL; + + H5P_CLS_ROOT_ID_g = H5I_INVALID_HID; + + H5P_CLS_ATTRIBUTE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_ATTRIBUTE_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_DATASET_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_DATASET_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_DATASET_XFER_ID_g = H5I_INVALID_HID; + H5P_CLS_DATATYPE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_DATATYPE_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_FILE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_FILE_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_FILE_MOUNT_ID_g = H5I_INVALID_HID; + H5P_CLS_GROUP_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_GROUP_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_LINK_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_LINK_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_MAP_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_MAP_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_OBJECT_COPY_ID_g = H5I_INVALID_HID; + H5P_CLS_OBJECT_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_REFERENCE_ACCESS_ID_g = H5I_INVALID_HID; + H5P_CLS_STRING_CREATE_ID_g = H5I_INVALID_HID; + H5P_CLS_VOL_INITIALIZE_ID_g = H5I_INVALID_HID; + } } + + n++; /*H5I*/ } + else { + /* Destroy the property list and class id groups */ + n += (H5I_dec_type_ref(H5I_GENPROP_LST) > 0); + n += (H5I_dec_type_ref(H5I_GENPROP_CLS) > 0); - n++; /*H5I*/ - } - else { - /* Destroy the property list and class id groups */ - n += (H5I_dec_type_ref(H5I_GENPROP_LST) > 0); - n += (H5I_dec_type_ref(H5I_GENPROP_CLS) > 0); - } /* end else */ + /* Mark closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end else */ + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5P_term_package() */ @@ -3541,7 +3569,7 @@ H5P_get_nprops_pclass(const H5P_genclass_t *pclass, size_t *nprops, bool recurse { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) assert(pclass); assert(nprops); @@ -3556,6 +3584,7 @@ H5P_get_nprops_pclass(const H5P_genclass_t *pclass, size_t *nprops, bool recurse *nprops += pclass->nprops; } /* end while */ +done: FUNC_LEAVE_NOAPI(ret_value) } /* H5P_get_nprops_pclass() */ @@ -3986,7 +4015,7 @@ H5P_class_isa(const H5P_genclass_t *pclass1, const H5P_genclass_t *pclass2) { htri_t ret_value = FAIL; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) assert(pclass1); assert(pclass2); @@ -5281,13 +5310,14 @@ H5P_get_class_name(H5P_genclass_t *pclass) { char *ret_value = NULL; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(NULL) assert(pclass); /* Get class name */ ret_value = H5MM_xstrdup(pclass->name); +done: FUNC_LEAVE_NOAPI(ret_value) } /* H5P_get_class_name() */ @@ -5494,7 +5524,7 @@ H5P__close_class(H5P_genclass_t *pclass) { herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI_NOINIT + FUNC_ENTER_PACKAGE assert(pclass); diff --git a/src/H5Plapl.c b/src/H5Plapl.c index 64cd2996fc4..c6ca851e62c 100644 --- a/src/H5Plapl.c +++ b/src/H5Plapl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -1035,14 +1035,14 @@ H5Pget_elink_fapl(hid_t lapl_id) H5P_genplist_t *plist; /* Property list pointer */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API(FAIL) + FUNC_ENTER_API(H5I_INVALID_HID) /* Get the plist structure */ if (NULL == (plist = H5P_object_verify(lapl_id, H5P_LINK_ACCESS))) - HGOTO_ERROR(H5E_ID, H5E_BADID, FAIL, "can't find object for ID"); + HGOTO_ERROR(H5E_ID, H5E_BADID, H5I_INVALID_HID, "can't find object for ID"); if (H5P_get(plist, H5L_ACS_ELINK_FAPL_NAME, &ret_value) < 0) - HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, FAIL, "can't get fapl for links"); + HGOTO_ERROR(H5E_PLIST, H5E_CANTGET, H5I_INVALID_HID, "can't get fapl for links"); done: FUNC_LEAVE_API(ret_value) diff --git a/src/H5Plcpl.c b/src/H5Plcpl.c index 739ef76f3f2..9afad0a278a 100644 --- a/src/H5Plcpl.c +++ b/src/H5Plcpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pmapl.c b/src/H5Pmapl.c index 45cbd7648aa..b3b9b776075 100644 --- a/src/H5Pmapl.c +++ b/src/H5Pmapl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pmcpl.c b/src/H5Pmcpl.c index 367edb3f8b7..75836a481be 100644 --- a/src/H5Pmcpl.c +++ b/src/H5Pmcpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pmodule.h b/src/H5Pmodule.h index 8ac6f86eed9..6a65f3a269b 100644 --- a/src/H5Pmodule.h +++ b/src/H5Pmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5P_MODULE -#define H5_MY_PKG H5P -#define H5_MY_PKG_ERR H5E_PLIST +#define H5_MY_PKG H5P +#define H5_MY_PKG_ERR H5E_PLIST +#define H5_MY_PKG_INIT YES /** \page H5P_UG Properties and Property Lists in HDF5 * @@ -815,7 +816,7 @@ * * The in-memory file image feature of HDF5 uses property lists in a manner that differs * substantially from their use elsewhere in HDF5. Those who plan to use in-memory file images - * must study "File Image Operations" (PDF) in the Advanced Topics in HDF5collection. + * must study \ref H5FIM_UG. * * \subsection subsec_plist_notes Notes * diff --git a/src/H5Pocpl.c b/src/H5Pocpl.c index 7f179dbe8de..39c2081f6fc 100644 --- a/src/H5Pocpl.c +++ b/src/H5Pocpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pocpypl.c b/src/H5Pocpypl.c index 5cf809140cd..622e35f416e 100644 --- a/src/H5Pocpypl.c +++ b/src/H5Pocpypl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ppkg.h b/src/H5Ppkg.h index 0ff000ba96c..a1f3e3a5233 100644 --- a/src/H5Ppkg.h +++ b/src/H5Ppkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Pprivate.h b/src/H5Pprivate.h index 0671ed5952e..b4abbc3b549 100644 --- a/src/H5Pprivate.h +++ b/src/H5Pprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ppublic.h b/src/H5Ppublic.h index f343ec115fa..cd89de52879 100644 --- a/src/H5Ppublic.h +++ b/src/H5Ppublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -34,14 +34,6 @@ /* Public Macros */ /*****************/ -/* When this header is included from a private HDF5 header, don't make calls to H5open() */ -#undef H5OPEN -#ifndef H5private_H -#define H5OPEN H5open(), -#else /* H5private_H */ -#define H5OPEN -#endif /* H5private_H */ - /* * The library's property list classes */ @@ -4331,8 +4323,7 @@ H5_DLL herr_t H5Pget_fclose_degree(hid_t fapl_id, H5F_close_degree_t *degree); * \see H5LTopen_file_image(), H5Fget_file_image(), H5Pset_file_image(), * H5Pset_file_image_callbacks(), H5Pget_file_image_callbacks(), * \ref H5FD_file_image_callbacks_t, \ref H5FD_file_image_op_t, - * - * HDF5 File Image Operations. + * \ref H5FIM_UG. * * * \since 1.8.9 @@ -4371,8 +4362,7 @@ H5_DLL herr_t H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_l * \see H5LTopen_file_image(), H5Fget_file_image(), H5Pset_file_image(), * H5Pset_file_image_callbacks(), H5Pget_file_image_callbacks(), * \ref H5FD_file_image_callbacks_t, \ref H5FD_file_image_op_t, - * - * HDF5 File Image Operations. + * \ref H5FIM_UG. * * \since 1.8.9 * @@ -5314,9 +5304,7 @@ H5_DLL herr_t H5Pset_fclose_degree(hid_t fapl_id, H5F_close_degree_t degree); * \par Recommended Reading: * This function is part of the file image * operations feature set. It is highly recommended to study the guide - * [HDF5 File Image Operations] - * (https://\DOCURL/advanced_topics/file_image_ops.md - * ) before using this feature set. See the “See Also” section below + * \ref H5FIM_UG before using this feature set. See the “See Also” section below * for links to other elements of HDF5 file image operations. * * \see @@ -5326,10 +5314,7 @@ H5_DLL herr_t H5Pset_fclose_degree(hid_t fapl_id, H5F_close_degree_t degree); * \li H5Pset_file_image_callbacks() * \li H5Pget_file_image_callbacks() * - * \li [HDF5 File Image Operations] - * (https://\DOCURL/advanced_topics/file_image_ops.md) - * in [Advanced Topics in HDF5] - * (https://\DOCURL/advanced_topics_list.md) + * \li \ref H5FIM_UG * * \li Within H5Pset_file_image_callbacks(): * \li Callback #H5FD_file_image_callbacks_t @@ -5351,9 +5336,7 @@ H5_DLL herr_t H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len); * can then use the file without the overhead of disk I/O.\n * **Recommended Reading:** This function is part of the file * image operations feature set. It is highly recommended to study - * the guide [HDF5 File Image Operations] - * (https://\DOCURL/advanced_topics/file_image_ops.md - * ) before using this feature set. See the “See Also” section below + * the guide \ref H5FIM_UG before using this feature set. See the “See Also” section below * for links to other elements of HDF5 file image operations. * * \fapl_id @@ -5598,9 +5581,9 @@ H5_DLL herr_t H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref); * enumerated values in the #H5F_libver_t struct, which is * defined in H5Fpublic.h. * - * The macro #H5F_LIBVER_LATEST is aliased to the highest - * enumerated value in #H5F_libver_t, indicating that this is - * currently the latest format available. + * #H5F_LIBVER_LATEST is equivalent to the highest explicitly numbered + * API value in #H5F_libver_t, indicating that this is currently the + * latest format available. * * The library supports the following pairs of (\p low, \p high) * combinations as derived from the values in #H5F_libver_t: @@ -5684,26 +5667,11 @@ H5_DLL herr_t H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref); * objects created with this setting. * * - * \p low=#H5F_LIBVER_V116
    + * \p low=#H5F_LIBVER_V200
    * \p high= * * \li The library will create objects with the latest format - * versions available to library release 1.16.x. - * \li The library will allow objects to be created with the latest - * format versions available to library release specified - * in the \p high value. - * \li API calls that create objects or features that are available - * to versions of the library greater than version specified in - * \p high will fail. - * \li Earlier versions of the library may not be able to access - * objects created with this setting. - * - * - * \p low=#H5F_LIBVER_V118
    - * \p high= - * - * \li The library will create objects with the latest format - * versions available to library release 1.18.x. + * versions available to library release 2.0.x. * \li The library will allow objects to be created with the latest * format versions available to library release specified * in the \p high value. @@ -5773,10 +5741,10 @@ H5_DLL herr_t H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref); * * * \note *H5F_LIBVER_LATEST*:
    - * Since 1.16.x is also #H5F_LIBVER_LATEST, there is no upper + * Since 2.0.x is also #H5F_LIBVER_LATEST, there is no upper * limit on the format versions to use. That is, if a * newer format version is required to support a feature - * in 1.16.x series, this setting will allow the object to be + * in 2.0.x series, this setting will allow the object to be * created. * * \version 1.10.2 #H5F_LIBVER_V18 added to the enumerated defines in @@ -6724,7 +6692,7 @@ H5_DLL herr_t H5Pget_dset_no_attrs_hint(hid_t dcpl_id, hbool_t *minimize); * which is a 32-bit signed long value on Windows, which limited * the valid offset that can be returned to 2 GiB. * - * \version 1.16.0 \p offset parameter type changed to HDoff_t from off_t. + * \version 2.0.0 \p offset parameter type changed to HDoff_t from off_t. * \version 1.6.4 \p idx parameter type changed to unsigned. * \since 1.0.0 * @@ -7272,7 +7240,7 @@ H5_DLL herr_t H5Pset_dset_no_attrs_hint(hid_t dcpl_id, hbool_t minimize); * which is a 32-bit signed long value on Windows, which limited * the valid offset that can be set to 2 GiB. * - * \version 1.16.0 \p offset parameter type changed to HDoff_t from off_t. + * \version 2.0.0 \p offset parameter type changed to HDoff_t from off_t. * \since 1.0.0 * */ @@ -8969,6 +8937,8 @@ H5_DLL herr_t H5Pset_preserve(hid_t plist_id, hbool_t status); * function prototype is as follows: * \snippet H5Tpublic.h H5T_conv_except_func_t_snip * + * \callback_note + * * \since 1.8.0 * */ diff --git a/src/H5Pstrcpl.c b/src/H5Pstrcpl.c index 3facfff7d12..57543444239 100644 --- a/src/H5Pstrcpl.c +++ b/src/H5Pstrcpl.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Ptest.c b/src/H5Ptest.c index f52a3702100..094dbc44da4 100644 --- a/src/H5Ptest.c +++ b/src/H5Ptest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5R.c b/src/H5R.c index b532bf7426d..2b8dcdbf2f3 100644 --- a/src/H5R.c +++ b/src/H5R.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5RS.c b/src/H5RS.c index ad1f1d0c69e..b83f6da8401 100644 --- a/src/H5RS.c +++ b/src/H5RS.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -69,6 +69,9 @@ static herr_t H5RS__resize_for_append(H5RS_str_t *rs, size_t len); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ diff --git a/src/H5RSmodule.h b/src/H5RSmodule.h index ee6b7e80e51..5079f363447 100644 --- a/src/H5RSmodule.h +++ b/src/H5RSmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5RS_MODULE -#define H5_MY_PKG H5RS -#define H5_MY_PKG_ERR H5E_RS +#define H5_MY_PKG H5RS +#define H5_MY_PKG_ERR H5E_RS +#define H5_MY_PKG_INIT NO #endif /* H5RSmodule_H */ diff --git a/src/H5RSprivate.h b/src/H5RSprivate.h index a38214039ab..0822fbd6e15 100644 --- a/src/H5RSprivate.h +++ b/src/H5RSprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Rdeprec.c b/src/H5Rdeprec.c index 921693770a2..99b69225be6 100644 --- a/src/H5Rdeprec.c +++ b/src/H5Rdeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Rint.c b/src/H5Rint.c index cbfa910d247..30b92a380fd 100644 --- a/src/H5Rint.c +++ b/src/H5Rint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -135,6 +135,9 @@ static herr_t H5R__decode_string(const unsigned char *buf, size_t *nbytes, char /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /*****************************/ /* Library Private Variables */ /*****************************/ @@ -143,27 +146,26 @@ static herr_t H5R__decode_string(const unsigned char *buf, size_t *nbytes, char /* Local Variables */ /*******************/ -/*------------------------------------------------------------------------- - * Function: H5R_init - * - * Purpose: Initialize the interface from some other layer. - * - * Return: Success: non-negative - * Failure: negative - *------------------------------------------------------------------------- - */ +/*-------------------------------------------------------------------------- +NAME + H5R__init_package -- Initialize interface-specific information +USAGE + herr_t H5R__init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------*/ herr_t -H5R_init(void) +H5R__init_package(void) { - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI_NOINIT_NOERR + FUNC_ENTER_PACKAGE_NOERR /* Sanity check, if assert fails, H5R_REF_BUF_SIZE must be increased */ HDcompile_assert(sizeof(H5R_ref_priv_t) <= H5R_REF_BUF_SIZE); - FUNC_LEAVE_NOAPI(ret_value) -} + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5R__init_package() */ /*------------------------------------------------------------------------- * Function: H5R__create_object diff --git a/src/H5Rmodule.h b/src/H5Rmodule.h index 443c4746d71..78328effab5 100644 --- a/src/H5Rmodule.h +++ b/src/H5Rmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -21,8 +21,9 @@ * reporting macros. */ #define H5R_MODULE -#define H5_MY_PKG H5R -#define H5_MY_PKG_ERR H5E_REFERENCE +#define H5_MY_PKG H5R +#define H5_MY_PKG_ERR H5E_REFERENCE +#define H5_MY_PKG_INIT YES /** \page H5R_UG HDF5 References * diff --git a/src/H5Rpkg.h b/src/H5Rpkg.h index 8ce6041769a..1c214068477 100644 --- a/src/H5Rpkg.h +++ b/src/H5Rpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Rprivate.h b/src/H5Rprivate.h index 43e476485fb..8a3102860a1 100644 --- a/src/H5Rprivate.h +++ b/src/H5Rprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -38,6 +38,4 @@ /* Library Private Prototypes */ /******************************/ -H5_DLL herr_t H5R_init(void); - #endif /* H5Rprivate_H */ diff --git a/src/H5Rpublic.h b/src/H5Rpublic.h index 9e1f73f1c00..c7e03e126f2 100644 --- a/src/H5Rpublic.h +++ b/src/H5Rpublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5S.c b/src/H5S.c index 373115661b6..789ea606d69 100644 --- a/src/H5S.c +++ b/src/H5S.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -54,6 +54,9 @@ static htri_t H5S__is_simple(const H5S_t *sdim); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Format version bounds for dataspace */ const unsigned H5O_sdspace_ver_bounds[] = { H5O_SDSPACE_VERSION_1, /* H5F_LIBVER_EARLIEST */ @@ -61,8 +64,7 @@ const unsigned H5O_sdspace_ver_bounds[] = { H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V110 */ H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V112 */ H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V114 */ - H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V116 */ - H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V118 */ + H5O_SDSPACE_VERSION_2, /* H5F_LIBVER_V200 */ H5O_SDSPACE_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; @@ -95,6 +97,9 @@ static const H5I_class_t H5I_SPACE_SEL_ITER_CLS[1] = {{ (H5I_free_t)H5S__sel_iter_close_cb /* Callback routine for closing objects of this class */ }}; +/* Flag indicating "top" of interface has been initialized */ +static bool H5S_top_package_initialize_s = false; + /*------------------------------------------------------------------------- * Function: H5S_init * @@ -110,6 +115,28 @@ H5S_init(void) herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5S_init() */ + +/*-------------------------------------------------------------------------- +NAME + H5S__init_package -- Initialize interface-specific information +USAGE + herr_t H5S__init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------*/ +herr_t +H5S__init_package(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_PACKAGE /* Initialize the ID group for the dataspace IDs */ if (H5I_register_type(H5I_DATASPACE_CLS) < 0) @@ -120,9 +147,12 @@ H5S_init(void) HGOTO_ERROR(H5E_DATASPACE, H5E_CANTINIT, FAIL, "unable to initialize dataspace selection iterator ID class"); + /* Mark "top" of interface as initialized, too */ + H5S_top_package_initialize_s = true; + done: FUNC_LEAVE_NOAPI(ret_value) -} /* end H5S_init() */ +} /* end H5S__init_package() */ /*-------------------------------------------------------------------------- NAME @@ -149,14 +179,20 @@ H5S_top_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - if (H5I_nmembers(H5I_DATASPACE) > 0) { - (void)H5I_clear_type(H5I_DATASPACE, false, false); - n++; - } - if (H5I_nmembers(H5I_SPACE_SEL_ITER) > 0) { - (void)H5I_clear_type(H5I_SPACE_SEL_ITER, false, false); - n++; - } + if (H5S_top_package_initialize_s) { + if (H5I_nmembers(H5I_DATASPACE) > 0) { + (void)H5I_clear_type(H5I_DATASPACE, false, false); + n++; + } + if (H5I_nmembers(H5I_SPACE_SEL_ITER) > 0) { + (void)H5I_clear_type(H5I_SPACE_SEL_ITER, false, false); + n++; + } + + /* Mark "top" of interface as closed */ + if (0 == n) + H5S_top_package_initialize_s = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5S_top_term_package() */ @@ -188,15 +224,22 @@ H5S_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Sanity checks */ - assert(0 == H5I_nmembers(H5I_DATASPACE)); - assert(0 == H5I_nmembers(H5I_SPACE_SEL_ITER)); + if (H5_PKG_INIT_VAR) { + /* Sanity checks */ + assert(0 == H5I_nmembers(H5I_DATASPACE)); + assert(0 == H5I_nmembers(H5I_SPACE_SEL_ITER)); + assert(false == H5S_top_package_initialize_s); + + /* Destroy the dataspace object id group */ + n += (H5I_dec_type_ref(H5I_DATASPACE) > 0); - /* Destroy the dataspace object id group */ - n += (H5I_dec_type_ref(H5I_DATASPACE) > 0); + /* Destroy the dataspace selection iterator object id group */ + n += (H5I_dec_type_ref(H5I_SPACE_SEL_ITER) > 0); - /* Destroy the dataspace selection iterator object id group */ - n += (H5I_dec_type_ref(H5I_SPACE_SEL_ITER) > 0); + /* Mark interface as closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5S_term_package() */ @@ -330,23 +373,23 @@ H5Screate(H5S_class_t type) H5S_t *new_ds = NULL; /* New dataspace structure */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API(FAIL) + FUNC_ENTER_API(H5I_INVALID_HID) /* Check args */ if (type <= H5S_NO_CLASS || type > H5S_NULL) /* don't allow complex dataspace yet */ - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid dataspace type"); + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "invalid dataspace type"); if (NULL == (new_ds = H5S_create(type))) - HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, FAIL, "unable to create dataspace"); + HGOTO_ERROR(H5E_DATASPACE, H5E_CANTCREATE, H5I_INVALID_HID, "unable to create dataspace"); /* Register */ if ((ret_value = H5I_register(H5I_DATASPACE, new_ds, true)) < 0) - HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID"); + HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register dataspace ID"); done: if (ret_value < 0) if (new_ds && H5S_close(new_ds) < 0) - HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace"); + HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, H5I_INVALID_HID, "unable to release dataspace"); FUNC_LEAVE_API(ret_value) } /* end H5Screate() */ @@ -686,7 +729,7 @@ H5S_get_simple_extent_npoints(const H5S_t *ds) { hssize_t ret_value = -1; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(-1) /* check args */ assert(ds); @@ -694,6 +737,7 @@ H5S_get_simple_extent_npoints(const H5S_t *ds) /* Get the number of elements in extent */ ret_value = (hssize_t)ds->extent.nelem; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5S_get_simple_extent_npoints() */ @@ -1630,12 +1674,13 @@ H5S_get_simple_extent_type(const H5S_t *space) { H5S_class_t ret_value = H5S_NO_CLASS; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(H5S_NO_CLASS) assert(space); ret_value = H5S_GET_EXTENT_TYPE(space); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5S_get_simple_extent_type() */ diff --git a/src/H5SL.c b/src/H5SL.c index 54e064962f5..3b548b3ff54 100644 --- a/src/H5SL.c +++ b/src/H5SL.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -509,6 +509,9 @@ static H5SL_node_t *H5SL__insert_common(H5SL_t *slist, void *item, const void *k static herr_t H5SL__release_common(H5SL_t *slist, H5SL_operator_t op, void *op_data); static herr_t H5SL__close_common(H5SL_t *slist, H5SL_operator_t op, void *op_data); +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Declare a free list to manage the H5SL_t struct */ H5FL_DEFINE_STATIC(H5SL_t); @@ -520,21 +523,26 @@ static H5FL_fac_head_t **H5SL_fac_g; static size_t H5SL_fac_nused_g; static size_t H5SL_fac_nalloc_g; -/*------------------------------------------------------------------------- - * Function: H5SL_init - * - * Purpose: Initialize the interface from some other layer. - * - * Return: Success: non-negative - * Failure: negative - *------------------------------------------------------------------------- - */ +/*-------------------------------------------------------------------------- + NAME + H5SL__init_package + PURPOSE + Initialize interface-specific information + USAGE + herr_t H5SL__init_package() + RETURNS + Non-negative on success/Negative on failure + DESCRIPTION + Initializes any interface-specific data or routines. + GLOBAL VARIABLES + COMMENTS, BUGS, ASSUMPTIONS + EXAMPLES + REVISION LOG +--------------------------------------------------------------------------*/ herr_t -H5SL_init(void) +H5SL__init_package(void) { - herr_t ret_value = SUCCEED; - - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_PACKAGE_NOERR /* Allocate space for array of factories */ H5SL_fac_g = (H5FL_fac_head_t **)H5MM_malloc(sizeof(H5FL_fac_head_t *)); @@ -546,8 +554,8 @@ H5SL_init(void) assert(H5SL_fac_g[0]); H5SL_fac_nused_g = 1; - FUNC_LEAVE_NOAPI(ret_value) -} + FUNC_LEAVE_NOAPI(SUCCEED) +} /* end H5SL__init_package() */ /*-------------------------------------------------------------------------- NAME @@ -575,26 +583,32 @@ H5SL_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Terminate all the factories */ - if (H5SL_fac_nused_g > 0) { - size_t i; - herr_t H5_ATTR_NDEBUG_UNUSED ret; + if (H5_PKG_INIT_VAR) { + /* Terminate all the factories */ + if (H5SL_fac_nused_g > 0) { + size_t i; + herr_t H5_ATTR_NDEBUG_UNUSED ret; + + for (i = 0; i < H5SL_fac_nused_g; i++) { + ret = H5FL_fac_term(H5SL_fac_g[i]); + assert(ret >= 0); + } + H5SL_fac_nused_g = 0; - for (i = 0; i < H5SL_fac_nused_g; i++) { - ret = H5FL_fac_term(H5SL_fac_g[i]); - assert(ret >= 0); + n++; } - H5SL_fac_nused_g = 0; - n++; - } + /* Free the list of factories */ + if (H5SL_fac_g) { + H5SL_fac_g = (H5FL_fac_head_t **)H5MM_xfree((void *)H5SL_fac_g); + H5SL_fac_nalloc_g = 0; - /* Free the list of factories */ - if (H5SL_fac_g) { - H5SL_fac_g = (H5FL_fac_head_t **)H5MM_xfree((void *)H5SL_fac_g); - H5SL_fac_nalloc_g = 0; + n++; + } - n++; + /* Mark the interface as uninitialized */ + if (0 == n) + H5_PKG_INIT_VAR = false; } FUNC_LEAVE_NOAPI(n) diff --git a/src/H5SLmodule.h b/src/H5SLmodule.h index b0b3064f15b..a3a42654c93 100644 --- a/src/H5SLmodule.h +++ b/src/H5SLmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5SL_MODULE -#define H5_MY_PKG H5SL -#define H5_MY_PKG_ERR H5E_SLIST +#define H5_MY_PKG H5SL +#define H5_MY_PKG_ERR H5E_SLIST +#define H5_MY_PKG_INIT YES #endif /* H5SLmodule_H */ diff --git a/src/H5SLprivate.h b/src/H5SLprivate.h index d7eb5be8b83..cd42d92c706 100644 --- a/src/H5SLprivate.h +++ b/src/H5SLprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -81,7 +81,6 @@ H5_DLL herr_t H5SL_release(H5SL_t *slist); H5_DLL herr_t H5SL_free(H5SL_t *slist, H5SL_operator_t op, void *op_data); H5_DLL herr_t H5SL_close(H5SL_t *slist); H5_DLL herr_t H5SL_destroy(H5SL_t *slist, H5SL_operator_t op, void *op_data); -H5_DLL herr_t H5SL_init(void); H5_DLL int H5SL_term_interface(void); #endif /* H5SLprivate_H */ diff --git a/src/H5SM.c b/src/H5SM.c index 59abd24e679..2b98bdbb98b 100644 --- a/src/H5SM.c +++ b/src/H5SM.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -82,6 +82,9 @@ static herr_t H5SM__read_mesg(H5F_t *f, const H5SM_sohm_t *mesg, H5HF_t *fheap, /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + H5FL_DEFINE(H5SM_master_table_t); H5FL_ARR_DEFINE(H5SM_index_header_t, H5O_SHMESG_MAX_NINDEXES); H5FL_DEFINE(H5SM_list_t); diff --git a/src/H5SMbtree2.c b/src/H5SMbtree2.c index 6165d664f38..6e0226d04b3 100644 --- a/src/H5SMbtree2.c +++ b/src/H5SMbtree2.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5SMcache.c b/src/H5SMcache.c index 7bf0575ed45..3be26d6945c 100644 --- a/src/H5SMcache.c +++ b/src/H5SMcache.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5SMmessage.c b/src/H5SMmessage.c index 34fe8fd08af..230f381df2f 100644 --- a/src/H5SMmessage.c +++ b/src/H5SMmessage.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5SMmodule.h b/src/H5SMmodule.h index 1eaeea29e99..d669d5dc76a 100644 --- a/src/H5SMmodule.h +++ b/src/H5SMmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5SM_MODULE -#define H5_MY_PKG H5SM -#define H5_MY_PKG_ERR H5E_SOHM +#define H5_MY_PKG H5SM +#define H5_MY_PKG_ERR H5E_SOHM +#define H5_MY_PKG_INIT NO #endif /* H5SMmodule_H */ diff --git a/src/H5SMpkg.h b/src/H5SMpkg.h index dbeafc15139..b61252758fd 100644 --- a/src/H5SMpkg.h +++ b/src/H5SMpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5SMprivate.h b/src/H5SMprivate.h index f6496f3988b..b64aa6bd079 100644 --- a/src/H5SMprivate.h +++ b/src/H5SMprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5SMtest.c b/src/H5SMtest.c index 84da3195556..e6bfc7cfbbc 100644 --- a/src/H5SMtest.c +++ b/src/H5SMtest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Sall.c b/src/H5Sall.c index 1a9d8fc4029..8bdcc4ad9aa 100644 --- a/src/H5Sall.c +++ b/src/H5Sall.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Sdbg.c b/src/H5Sdbg.c index f233491cd1c..7348848d9fa 100644 --- a/src/H5Sdbg.c +++ b/src/H5Sdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Sdeprec.c b/src/H5Sdeprec.c index 062bf29fec0..8c09c1bccd5 100644 --- a/src/H5Sdeprec.c +++ b/src/H5Sdeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Shyper.c b/src/H5Shyper.c index cbf519d3aab..60b6bb96a07 100644 --- a/src/H5Shyper.c +++ b/src/H5Shyper.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -241,8 +241,7 @@ static const unsigned H5O_sds_hyper_ver_bounds[] = { H5S_HYPER_VERSION_2, /* H5F_LIBVER_V110 */ H5S_HYPER_VERSION_3, /* H5F_LIBVER_V112 */ H5S_HYPER_VERSION_3, /* H5F_LIBVER_V114 */ - H5S_HYPER_VERSION_3, /* H5F_LIBVER_V116 */ - H5S_HYPER_VERSION_3, /* H5F_LIBVER_V118 */ + H5S_HYPER_VERSION_3, /* H5F_LIBVER_V200 */ H5S_HYPER_VERSION_3 /* H5F_LIBVER_LATEST */ }; @@ -3725,10 +3724,10 @@ H5S__hyper_get_version_enc_size(H5S_t *space, hsize_t block_count, uint32_t *ver static hssize_t H5S__hyper_serial_size(H5S_t *space) { - hsize_t block_count = 0; /* block counter for regular hyperslabs */ - uint32_t version; /* Version number */ - uint8_t enc_size; /* Encoded size of hyperslab selection info */ - hssize_t ret_value = -1; /* return value */ + hsize_t block_count = 0; /* block counter for regular hyperslabs */ + uint32_t version = UINT_MAX; /* Version number */ + uint8_t enc_size; /* Encoded size of hyperslab selection info */ + hssize_t ret_value = -1; /* return value */ FUNC_ENTER_PACKAGE @@ -12100,7 +12099,7 @@ H5S_hyper_get_clip_extent(const H5S_t *clip_space, const H5S_t *match_space, boo hsize_t num_slices; /* Number of slices in unlimited dimension */ hsize_t ret_value = 0; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(0) /* Check parameters */ assert(clip_space); @@ -12122,6 +12121,7 @@ H5S_hyper_get_clip_extent(const H5S_t *clip_space, const H5S_t *match_space, boo /* Call "real" get_clip_extent function */ ret_value = H5S__hyper_get_clip_extent_real(clip_space, num_slices, incl_trail); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5S_hyper_get_clip_extent() */ @@ -12157,7 +12157,7 @@ H5S_hyper_get_clip_extent_match(const H5S_t *clip_space, const H5S_t *match_spac hsize_t num_slices; /* Number of slices in unlimited dimension */ hsize_t ret_value = 0; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(0) /* Check parameters */ assert(clip_space); @@ -12203,6 +12203,7 @@ H5S_hyper_get_clip_extent_match(const H5S_t *clip_space, const H5S_t *match_spac /* Call "real" get_clip_extent function */ ret_value = H5S__hyper_get_clip_extent_real(clip_space, num_slices, incl_trail); +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5S_hyper_get_clip_extent_match() */ @@ -12318,7 +12319,7 @@ H5S_hyper_get_first_inc_block(const H5S_t *space, hsize_t clip_size, bool *parti H5S_hyper_dim_t *diminfo; /* Convenience pointer to diminfo in unlimited dimension */ hsize_t ret_value = 0; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(0) /* Check parameters */ assert(space); @@ -12348,6 +12349,7 @@ H5S_hyper_get_first_inc_block(const H5S_t *space, hsize_t clip_size, bool *parti } /* end if */ } /* end else */ +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5S_hyper_get_first_inc_block */ diff --git a/src/H5Smodule.h b/src/H5Smodule.h index b9897485405..94103d05eb0 100644 --- a/src/H5Smodule.h +++ b/src/H5Smodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5S_MODULE -#define H5_MY_PKG H5S -#define H5_MY_PKG_ERR H5E_DATASPACE +#define H5_MY_PKG H5S +#define H5_MY_PKG_ERR H5E_DATASPACE +#define H5_MY_PKG_INIT YES /** \page H5S_UG Dataspaces and Partial I/O * diff --git a/src/H5Smpio.c b/src/H5Smpio.c index 96b20400ac5..e430c647538 100644 --- a/src/H5Smpio.c +++ b/src/H5Smpio.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Snone.c b/src/H5Snone.c index 397fb5860e1..ac3ec9beb4a 100644 --- a/src/H5Snone.c +++ b/src/H5Snone.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Spkg.h b/src/H5Spkg.h index ea0feefffa7..67125d874d6 100644 --- a/src/H5Spkg.h +++ b/src/H5Spkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Spoint.c b/src/H5Spoint.c index 6853dc3932a..c8c226bee5a 100644 --- a/src/H5Spoint.c +++ b/src/H5Spoint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -126,8 +126,7 @@ static const unsigned H5O_sds_point_ver_bounds[] = { H5S_POINT_VERSION_1, /* H5F_LIBVER_V110 */ H5S_POINT_VERSION_2, /* H5F_LIBVER_V112 */ H5S_POINT_VERSION_2, /* H5F_LIBVER_V114 */ - H5S_POINT_VERSION_2, /* H5F_LIBVER_V116 */ - H5S_POINT_VERSION_2, /* H5F_LIBVER_V118 */ + H5S_POINT_VERSION_2, /* H5F_LIBVER_V200 */ H5S_POINT_VERSION_2 /* H5F_LIBVER_LATEST */ }; diff --git a/src/H5Sprivate.h b/src/H5Sprivate.h index 24a83353f70..056d9e4dac1 100644 --- a/src/H5Sprivate.h +++ b/src/H5Sprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Spublic.h b/src/H5Spublic.h index 3697374d49c..654ab1c859c 100644 --- a/src/H5Spublic.h +++ b/src/H5Spublic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -190,6 +190,8 @@ H5_DLL herr_t H5Sclose(hid_t space_id); * composing the entire current extent). If either \p stride or * \p block is NULL, then it will be set to \p 1. * + * See H5Sselect_hyperslab() for valid operators (\p op). + * * \since 1.10.6 * */ @@ -213,6 +215,8 @@ H5_DLL hid_t H5Scombine_hyperslab(hid_t space_id, H5S_seloper_t op, const hsize_ * from \p space1_id is copied for the dataspace extent of the * newly created dataspace. * + * See H5Sselect_hyperslab() for valid operators (\p op). + * * \since 1.10.6 * */ @@ -251,10 +255,10 @@ H5_DLL hid_t H5Scopy(hid_t space_id); * Further dataspace types may be added later. * * A scalar dataspace, #H5S_SCALAR, has a single element, though that - * element may be of a complex datatype, such as a compound or array + * element may be of a composite datatype, such as a compound or array * datatype. By convention, the rank of a scalar dataspace is always \p 0 * (zero); think of it geometrically as a single, dimensionless point, - * though that point can be complex. + * though that point can be composite. * * A simple dataspace, #H5S_SIMPLE, consists of a regular array of elements. * @@ -816,6 +820,8 @@ H5_DLL htri_t H5Sis_simple(hid_t space_id); * \p space2_id. The first selection is modified to contain the * result of \p space1_id operated on by \p space2_id. * + * See H5Sselect_hyperslab() for valid operators (\p op). + * * \since 1.10.6 * */ @@ -1292,7 +1298,7 @@ H5_DLL hid_t H5Sselect_project_intersection(hid_t src_space_id, hid_t dst_space_ * This is primarily used for reading the entire selection in * one swoop. * - * \since 1.10.6 + * \since 1.10.7 * */ H5_DLL htri_t H5Sselect_shape_same(hid_t space1_id, hid_t space2_id); diff --git a/src/H5Sselect.c b/src/H5Sselect.c index 5625de3aab4..88110be5f97 100644 --- a/src/H5Sselect.c +++ b/src/H5Sselect.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -2655,39 +2655,39 @@ H5Sselect_project_intersection(hid_t src_space_id, hid_t dst_space_id, hid_t src H5S_t *proj_space = NULL; /* Output dataspace */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API(FAIL) + FUNC_ENTER_API(H5I_INVALID_HID) /* Check args */ if (NULL == (src_space = (H5S_t *)H5I_object_verify(src_space_id, H5I_DATASPACE))) - HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace"); + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace"); if (NULL == (dst_space = (H5S_t *)H5I_object_verify(dst_space_id, H5I_DATASPACE))) - HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace"); + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace"); if (NULL == (src_intersect_space = (H5S_t *)H5I_object_verify(src_intersect_space_id, H5I_DATASPACE))) - HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, FAIL, "not a dataspace"); + HGOTO_ERROR(H5E_DATASPACE, H5E_BADTYPE, H5I_INVALID_HID, "not a dataspace"); /* Check numbers of points selected matches in source and destination */ if (H5S_GET_SELECT_NPOINTS(src_space) != H5S_GET_SELECT_NPOINTS(dst_space)) - HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, + HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, H5I_INVALID_HID, "number of points selected in source space does not match that in destination space"); /* Check numbers of dimensions matches in source and source intersect spaces */ if (H5S_GET_EXTENT_NDIMS(src_space) != H5S_GET_EXTENT_NDIMS(src_intersect_space)) - HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, FAIL, + HGOTO_ERROR(H5E_DATASPACE, H5E_BADVALUE, H5I_INVALID_HID, "rank of source space does not match rank of source intersect space"); /* Perform operation */ if (H5S_select_project_intersection(src_space, dst_space, src_intersect_space, &proj_space, false) < 0) - HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, FAIL, "can't project dataspace intersection"); + HGOTO_ERROR(H5E_DATASET, H5E_CANTCLIP, H5I_INVALID_HID, "can't project dataspace intersection"); /* Register */ if ((ret_value = H5I_register(H5I_DATASPACE, proj_space, true)) < 0) - HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, FAIL, "unable to register dataspace ID"); + HGOTO_ERROR(H5E_ID, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register dataspace ID"); done: if (ret_value < 0) if (proj_space && H5S_close(proj_space) < 0) - HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, FAIL, "unable to release dataspace"); + HDONE_ERROR(H5E_DATASPACE, H5E_CANTRELEASE, H5I_INVALID_HID, "unable to release dataspace"); FUNC_LEAVE_API(ret_value) } /* end H5Sselect_project_intersection() */ diff --git a/src/H5Stest.c b/src/H5Stest.c index 422f7c1d20f..db33d9ce5dd 100644 --- a/src/H5Stest.c +++ b/src/H5Stest.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5T.c b/src/H5T.c index 1728132cf6b..1999141cfc1 100644 --- a/src/H5T.c +++ b/src/H5T.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -53,6 +53,7 @@ #include "H5Tconv_enum.h" #include "H5Tconv_vlen.h" #include "H5Tconv_array.h" +#include "H5Tconv_complex.h" /****************/ /* Local Macros */ @@ -416,8 +417,11 @@ H5T_order_t H5T_native_order_g = H5T_ORDER_ERROR; /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* - * Predefined data types. These are initialized at runtime by H5T_init(). + * Predefined data types. These are initialized at runtime by H5T__init_package(). * * If more of these are added, the new ones must be added to the list of * types to reset in H5T_term_package(). @@ -429,6 +433,13 @@ hid_t H5T_IEEE_F32LE_g = H5I_INVALID_HID; hid_t H5T_IEEE_F64BE_g = H5I_INVALID_HID; hid_t H5T_IEEE_F64LE_g = H5I_INVALID_HID; +hid_t H5T_COMPLEX_IEEE_F16BE_g = H5I_INVALID_HID; +hid_t H5T_COMPLEX_IEEE_F16LE_g = H5I_INVALID_HID; +hid_t H5T_COMPLEX_IEEE_F32BE_g = H5I_INVALID_HID; +hid_t H5T_COMPLEX_IEEE_F32LE_g = H5I_INVALID_HID; +hid_t H5T_COMPLEX_IEEE_F64BE_g = H5I_INVALID_HID; +hid_t H5T_COMPLEX_IEEE_F64LE_g = H5I_INVALID_HID; + hid_t H5T_VAX_F32_g = H5I_INVALID_HID; hid_t H5T_VAX_F64_g = H5I_INVALID_HID; @@ -469,30 +480,33 @@ hid_t H5T_C_S1_g = H5I_INVALID_HID; hid_t H5T_FORTRAN_S1_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_SCHAR_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_UCHAR_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_SHORT_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_USHORT_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_INT_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_UINT_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_LONG_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_ULONG_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_LLONG_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_ULLONG_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_FLOAT16_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_FLOAT_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_DOUBLE_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_LDOUBLE_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_B8_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_B16_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_B32_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_B64_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_OPAQUE_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_HADDR_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_HSIZE_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_HSSIZE_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_HERR_g = H5I_INVALID_HID; -hid_t H5T_NATIVE_HBOOL_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_SCHAR_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_UCHAR_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_SHORT_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_USHORT_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_INT_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_UINT_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_LONG_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_ULONG_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_LLONG_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_ULLONG_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_FLOAT16_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_FLOAT_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_DOUBLE_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_LDOUBLE_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_FLOAT_COMPLEX_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_DOUBLE_COMPLEX_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_LDOUBLE_COMPLEX_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_B8_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_B16_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_B32_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_B64_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_OPAQUE_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_HADDR_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_HSIZE_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_HSSIZE_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_HERR_g = H5I_INVALID_HID; +hid_t H5T_NATIVE_HBOOL_g = H5I_INVALID_HID; hid_t H5T_NATIVE_INT8_g = H5I_INVALID_HID; hid_t H5T_NATIVE_UINT8_g = H5I_INVALID_HID; @@ -538,20 +552,23 @@ size_t H5T_HOBJREF_ALIGN_g = 0; size_t H5T_HDSETREGREF_ALIGN_g = 0; size_t H5T_REF_ALIGN_g = 0; -size_t H5T_NATIVE_SCHAR_ALIGN_g = 0; -size_t H5T_NATIVE_UCHAR_ALIGN_g = 0; -size_t H5T_NATIVE_SHORT_ALIGN_g = 0; -size_t H5T_NATIVE_USHORT_ALIGN_g = 0; -size_t H5T_NATIVE_INT_ALIGN_g = 0; -size_t H5T_NATIVE_UINT_ALIGN_g = 0; -size_t H5T_NATIVE_LONG_ALIGN_g = 0; -size_t H5T_NATIVE_ULONG_ALIGN_g = 0; -size_t H5T_NATIVE_LLONG_ALIGN_g = 0; -size_t H5T_NATIVE_ULLONG_ALIGN_g = 0; -size_t H5T_NATIVE_FLOAT16_ALIGN_g = 0; -size_t H5T_NATIVE_FLOAT_ALIGN_g = 0; -size_t H5T_NATIVE_DOUBLE_ALIGN_g = 0; -size_t H5T_NATIVE_LDOUBLE_ALIGN_g = 0; +size_t H5T_NATIVE_SCHAR_ALIGN_g = 0; +size_t H5T_NATIVE_UCHAR_ALIGN_g = 0; +size_t H5T_NATIVE_SHORT_ALIGN_g = 0; +size_t H5T_NATIVE_USHORT_ALIGN_g = 0; +size_t H5T_NATIVE_INT_ALIGN_g = 0; +size_t H5T_NATIVE_UINT_ALIGN_g = 0; +size_t H5T_NATIVE_LONG_ALIGN_g = 0; +size_t H5T_NATIVE_ULONG_ALIGN_g = 0; +size_t H5T_NATIVE_LLONG_ALIGN_g = 0; +size_t H5T_NATIVE_ULLONG_ALIGN_g = 0; +size_t H5T_NATIVE_FLOAT16_ALIGN_g = 0; +size_t H5T_NATIVE_FLOAT_ALIGN_g = 0; +size_t H5T_NATIVE_DOUBLE_ALIGN_g = 0; +size_t H5T_NATIVE_LDOUBLE_ALIGN_g = 0; +size_t H5T_NATIVE_FLOAT_COMPLEX_ALIGN_g = 0; +size_t H5T_NATIVE_DOUBLE_COMPLEX_ALIGN_g = 0; +size_t H5T_NATIVE_LDOUBLE_COMPLEX_ALIGN_g = 0; /* Alignment constraints for C99 types */ size_t H5T_NATIVE_INT8_ALIGN_g = 0; @@ -593,10 +610,20 @@ size_t H5T_NATIVE_UINT_FAST64_ALIGN_g = 0; H5__Float16 H5T_NATIVE_FLOAT16_POS_INF_g = 0.0f; H5__Float16 H5T_NATIVE_FLOAT16_NEG_INF_g = 0.0f; #endif -float H5T_NATIVE_FLOAT_POS_INF_g = 0.0F; -float H5T_NATIVE_FLOAT_NEG_INF_g = 0.0F; -double H5T_NATIVE_DOUBLE_POS_INF_g = 0.0; -double H5T_NATIVE_DOUBLE_NEG_INF_g = 0.0; +float H5T_NATIVE_FLOAT_POS_INF_g = 0.0F; +float H5T_NATIVE_FLOAT_NEG_INF_g = 0.0F; +double H5T_NATIVE_DOUBLE_POS_INF_g = 0.0; +double H5T_NATIVE_DOUBLE_NEG_INF_g = 0.0; +long double H5T_NATIVE_LDOUBLE_POS_INF_g = 0.0L; +long double H5T_NATIVE_LDOUBLE_NEG_INF_g = 0.0L; +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_float_complex H5T_NATIVE_FLOAT_COMPLEX_POS_INF_g; +H5_float_complex H5T_NATIVE_FLOAT_COMPLEX_NEG_INF_g; +H5_double_complex H5T_NATIVE_DOUBLE_COMPLEX_POS_INF_g; +H5_double_complex H5T_NATIVE_DOUBLE_COMPLEX_NEG_INF_g; +H5_ldouble_complex H5T_NATIVE_LDOUBLE_COMPLEX_POS_INF_g; +H5_ldouble_complex H5T_NATIVE_LDOUBLE_COMPLEX_NEG_INF_g; +#endif /* Declare the free list for H5T_t's and H5T_shared_t's */ H5FL_DEFINE(H5T_t); @@ -609,8 +636,7 @@ const unsigned H5O_dtype_ver_bounds[] = { H5O_DTYPE_VERSION_3, /* H5F_LIBVER_V110 */ H5O_DTYPE_VERSION_4, /* H5F_LIBVER_V112 */ H5O_DTYPE_VERSION_4, /* H5F_LIBVER_V114 */ - H5O_DTYPE_VERSION_4, /* H5F_LIBVER_V116 */ - H5O_DTYPE_VERSION_4, /* H5F_LIBVER_V118 */ + H5O_DTYPE_VERSION_5, /* H5F_LIBVER_V200 */ H5O_DTYPE_VERSION_LATEST /* H5F_LIBVER_LATEST */ }; @@ -642,6 +668,34 @@ static const H5I_class_t H5I_DATATYPE_CLS[1] = {{ (H5I_free_t)H5T__close_cb /* Callback routine for closing objects of this class */ }}; +/* Flag indicating "top" of interface has been initialized */ +static bool H5T_top_package_initialize_s = false; + +/*------------------------------------------------------------------------- + * Function: H5T_init + * + * Purpose: Initialize the interface from some other package. + * + * Return: Success: non-negative + * Failure: negative + * + * Programmer: Robb Matzke + * Wednesday, December 16, 1998 + * + *------------------------------------------------------------------------- + */ +herr_t +H5T_init(void) +{ + herr_t ret_value = SUCCEED; /* Return value */ + + FUNC_ENTER_NOAPI(FAIL) + /* FUNC_ENTER() does all the work */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T_init() */ + /*------------------------------------------------------------------------- * Function: H5T__init_inf * @@ -747,6 +801,47 @@ H5T__init_inf(void) } /* end for */ } /* end if */ + /* Get the long double datatype */ + if (NULL == (dst_p = (H5T_t *)H5I_object(H5T_NATIVE_LDOUBLE_g))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + dst = &dst_p->shared->u.atomic; + + /* Check that we can re-order the bytes correctly */ + if (H5T_ORDER_LE != H5T_native_order_g && H5T_ORDER_BE != H5T_native_order_g) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); + + /* +Inf */ + d = (uint8_t *)&H5T_NATIVE_LDOUBLE_POS_INF_g; + H5T__bit_set(d, dst->u.f.sign, (size_t)1, false); + H5T__bit_set(d, dst->u.f.epos, dst->u.f.esize, true); + H5T__bit_set(d, dst->u.f.mpos, dst->u.f.msize, false); + + /* Swap the bytes if the machine architecture is big-endian */ + if (H5T_ORDER_BE == H5T_native_order_g) { + half_size = dst_p->shared->size / 2; + for (u = 0; u < half_size; u++) { + uint8_t tmp = d[dst_p->shared->size - (u + 1)]; + d[dst_p->shared->size - (u + 1)] = d[u]; + d[u] = tmp; + } /* end for */ + } /* end if */ + + /* -Inf */ + d = (uint8_t *)&H5T_NATIVE_LDOUBLE_NEG_INF_g; + H5T__bit_set(d, dst->u.f.sign, (size_t)1, true); + H5T__bit_set(d, dst->u.f.epos, dst->u.f.esize, true); + H5T__bit_set(d, dst->u.f.mpos, dst->u.f.msize, false); + + /* Swap the bytes if the machine architecture is big-endian */ + if (H5T_ORDER_BE == H5T_native_order_g) { + half_size = dst_p->shared->size / 2; + for (u = 0; u < half_size; u++) { + uint8_t tmp = d[dst_p->shared->size - (u + 1)]; + d[dst_p->shared->size - (u + 1)] = d[u]; + d[u] = tmp; + } /* end for */ + } /* end if */ + #ifdef H5_HAVE__FLOAT16 /* Get the _Float16 datatype */ if (NULL == (dst_p = (H5T_t *)H5I_object(H5T_NATIVE_FLOAT16_g))) @@ -790,21 +885,38 @@ H5T__init_inf(void) } /* end if */ #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + /* + * A complex number is considered to be infinite if any of its parts + * (real or imaginary) is infinite, so simply set the real part of + * the complex number positive/negative infinity values to the + * positive/negative infinity value for the base floating-point type. + * The imaginary part should be zeroed-out bits. + */ + memcpy(&H5T_NATIVE_FLOAT_COMPLEX_POS_INF_g, &H5T_NATIVE_FLOAT_POS_INF_g, sizeof(float)); + memcpy(&H5T_NATIVE_FLOAT_COMPLEX_NEG_INF_g, &H5T_NATIVE_FLOAT_NEG_INF_g, sizeof(float)); + memcpy(&H5T_NATIVE_DOUBLE_COMPLEX_POS_INF_g, &H5T_NATIVE_DOUBLE_POS_INF_g, sizeof(double)); + memcpy(&H5T_NATIVE_DOUBLE_COMPLEX_NEG_INF_g, &H5T_NATIVE_DOUBLE_NEG_INF_g, sizeof(double)); + memcpy(&H5T_NATIVE_LDOUBLE_COMPLEX_POS_INF_g, &H5T_NATIVE_LDOUBLE_POS_INF_g, sizeof(long double)); + memcpy(&H5T_NATIVE_LDOUBLE_COMPLEX_NEG_INF_g, &H5T_NATIVE_LDOUBLE_NEG_INF_g, sizeof(long double)); +#endif + done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5T__init_inf() */ -/*------------------------------------------------------------------------- - * Function: H5T_init - * - * Purpose: Initialize the interface from some other layer. - * - * Return: Success: non-negative - * Failure: negative - *------------------------------------------------------------------------- - */ +/*-------------------------------------------------------------------------- +NAME + H5T__init_package -- Initialize interface-specific information +USAGE + herr__t H5T_init_package() +RETURNS + Non-negative on success/Negative on failure +DESCRIPTION + Initializes any interface-specific data or routines. +--------------------------------------------------------------------------*/ herr_t -H5T_init(void) +H5T__init_package(void) { H5T_t *native_schar = NULL; /* Datatype structure for native signed char */ H5T_t *native_uchar = NULL; /* Datatype structure for native unsigned char */ @@ -828,6 +940,7 @@ H5T_init(void) H5T_t *std_u64le = NULL; /* Datatype structure for unsigned 64-bit little-endian integer */ H5T_t *std_u64be = NULL; /* Datatype structure for unsigned 64-bit big-endian integer */ H5T_t *dt = NULL; + H5T_t *tmp_float = NULL; H5T_t *fixedpt = NULL; /* Datatype structure for native int */ H5T_t *floatpt = NULL; /* Datatype structure for native float */ H5T_t *string = NULL; /* Datatype structure for C string */ @@ -836,6 +949,7 @@ H5T_init(void) H5T_t *enum_type = NULL; /* Datatype structure for enum objects */ H5T_t *vlen = NULL; /* Datatype structure for vlen objects */ H5T_t *array = NULL; /* Datatype structure for array objects */ + H5T_t *cplx = NULL; /* Datatype structure for complex number objects */ H5T_t *objref = NULL; /* Datatype structure for deprecated reference objects */ H5T_t *regref = NULL; /* Datatype structure for deprecated region references */ H5T_t *ref = NULL; /* Datatype structure for opaque references */ @@ -845,10 +959,16 @@ H5T_init(void) true; /* Flag to indicate whether datatype was copied or allocated (for error cleanup) */ #ifdef H5_HAVE__FLOAT16 H5T_t *native_float16 = NULL; /* Datatype structure for native _Float16 type */ +#endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + H5T_t *native_float_complex = NULL; /* Datatype structure for native float _Complex / _Fcomplex type */ + H5T_t *native_double_complex = NULL; /* Datatype structure for native double _Complex / _Dcomplex type */ + H5T_t *native_ldouble_complex = + NULL; /* Datatype structure for native long double _Complex / _Lcomplex type */ #endif herr_t ret_value = SUCCEED; /* Return value */ - FUNC_ENTER_NOAPI(FAIL) + FUNC_ENTER_PACKAGE /* Initialize the ID group for the file IDs */ if (H5I_register_type(H5I_DATATYPE_CLS) < 0) @@ -862,6 +982,12 @@ H5T_init(void) if (H5T__init_native_float_types() < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize floating-point types"); +#ifdef H5_HAVE_COMPLEX_NUMBERS + /* Initialize native complex number datatypes */ + if (H5T__init_native_complex_types() < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize complex number types"); +#endif + /* Initialize all other native types */ if (H5T__init_native_internal() < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to initialize integers"); @@ -897,6 +1023,14 @@ H5T_init(void) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); if (NULL == (native_ldouble = (H5T_t *)H5I_object(H5T_NATIVE_LDOUBLE_g))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); +#ifdef H5_HAVE_COMPLEX_NUMBERS + if (NULL == (native_float_complex = (H5T_t *)H5I_object(H5T_NATIVE_FLOAT_COMPLEX_g))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (native_double_complex = (H5T_t *)H5I_object(H5T_NATIVE_DOUBLE_COMPLEX_g))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (native_ldouble_complex = (H5T_t *)H5I_object(H5T_NATIVE_LDOUBLE_COMPLEX_g))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); +#endif /*------------------------------------------------------------ * Derived native types @@ -1120,6 +1254,59 @@ H5T_init(void) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "invalid datatype location"); ref = dt; /* Keep type for later */ + /*------------------------------------------------------------ + * Complex Number Types + *------------------------------------------------------------ + */ + + /* Complex number of 2 IEEE 2-byte little-endian floats */ + if (NULL == (tmp_float = H5I_object(H5T_IEEE_F16LE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (dt = H5T__complex_create(tmp_float))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "couldn't create complex number datatype"); + if ((H5T_COMPLEX_IEEE_F16LE_g = H5I_register(H5I_DATATYPE, dt, false)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom"); + + /* Complex number of 2 IEEE 2-byte big-endian floats */ + if (NULL == (tmp_float = H5I_object(H5T_IEEE_F16BE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (dt = H5T__complex_create(tmp_float))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "couldn't create complex number datatype"); + if ((H5T_COMPLEX_IEEE_F16BE_g = H5I_register(H5I_DATATYPE, dt, false)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom"); + + /* Complex number of 2 IEEE 4-byte little-endian floats */ + if (NULL == (tmp_float = H5I_object(H5T_IEEE_F32LE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (dt = H5T__complex_create(tmp_float))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "couldn't create complex number datatype"); + if ((H5T_COMPLEX_IEEE_F32LE_g = H5I_register(H5I_DATATYPE, dt, false)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom"); + + /* Complex number of 2 IEEE 4-byte big-endian floats */ + if (NULL == (tmp_float = H5I_object(H5T_IEEE_F32BE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (dt = H5T__complex_create(tmp_float))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "couldn't create complex number datatype"); + if ((H5T_COMPLEX_IEEE_F32BE_g = H5I_register(H5I_DATATYPE, dt, false)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom"); + + /* Complex number of 2 IEEE 8-byte little-endian floats */ + if (NULL == (tmp_float = H5I_object(H5T_IEEE_F64LE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (dt = H5T__complex_create(tmp_float))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "couldn't create complex number datatype"); + if ((H5T_COMPLEX_IEEE_F64LE_g = H5I_register(H5I_DATATYPE, dt, false)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom"); + + /* Complex number of 2 IEEE 8-byte big-endian floats */ + if (NULL == (tmp_float = H5I_object(H5T_IEEE_F64BE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype object"); + if (NULL == (dt = H5T__complex_create(tmp_float))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "couldn't create complex number datatype"); + if ((H5T_COMPLEX_IEEE_F64BE_g = H5I_register(H5I_DATATYPE, dt, false)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype atom"); + /* * Register conversion functions beginning with the most general and * ending with the most specific. @@ -1134,18 +1321,27 @@ H5T_init(void) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); if (NULL == (array = H5T__array_create(native_int, 1, dim))) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (NULL == (cplx = H5T__complex_create(native_float))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); status = 0; status |= H5T__register_int(H5T_PERS_SOFT, "i_i", fixedpt, fixedpt, H5T__conv_i_i); status |= H5T__register_int(H5T_PERS_SOFT, "i_f", fixedpt, floatpt, H5T__conv_i_f); + status |= H5T__register_int(H5T_PERS_SOFT, "i_complex", fixedpt, cplx, H5T__conv_i_complex); + status |= H5T__register_int(H5T_PERS_SOFT, "complex_i", cplx, fixedpt, H5T__conv_complex_i); status |= H5T__register_int(H5T_PERS_SOFT, "f_f", floatpt, floatpt, H5T__conv_f_f); status |= H5T__register_int(H5T_PERS_SOFT, "f_i", floatpt, fixedpt, H5T__conv_f_i); + status |= H5T__register_int(H5T_PERS_SOFT, "f_complex", floatpt, cplx, H5T__conv_f_complex); + status |= H5T__register_int(H5T_PERS_SOFT, "complex_f", cplx, floatpt, H5T__conv_complex_f); + status |= H5T__register_int(H5T_PERS_SOFT, "complex_complex", cplx, cplx, H5T__conv_complex); status |= H5T__register_int(H5T_PERS_SOFT, "s_s", string, string, H5T__conv_s_s); status |= H5T__register_int(H5T_PERS_SOFT, "b_b", bitfield, bitfield, H5T__conv_b_b); status |= H5T__register_int(H5T_PERS_SOFT, "ibo", fixedpt, fixedpt, H5T__conv_order); status |= H5T__register_int(H5T_PERS_SOFT, "ibo(opt)", fixedpt, fixedpt, H5T__conv_order_opt); status |= H5T__register_int(H5T_PERS_SOFT, "fbo", floatpt, floatpt, H5T__conv_order); status |= H5T__register_int(H5T_PERS_SOFT, "fbo(opt)", floatpt, floatpt, H5T__conv_order_opt); + status |= H5T__register_int(H5T_PERS_SOFT, "complexbo", cplx, cplx, H5T__conv_order); + status |= H5T__register_int(H5T_PERS_SOFT, "complexbo(opt)", cplx, cplx, H5T__conv_order_opt); status |= H5T__register_int(H5T_PERS_SOFT, "struct(no-opt)", compound, compound, H5T__conv_struct); status |= H5T__register_int(H5T_PERS_SOFT, "struct(opt)", compound, compound, H5T__conv_struct_opt); status |= H5T__register_int(H5T_PERS_SOFT, "enum", enum_type, enum_type, H5T__conv_enum); @@ -1158,6 +1354,12 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_SOFT, "ref", ref, ref, H5T__conv_ref); status |= H5T__register_int(H5T_PERS_SOFT, "objref_ref", objref, ref, H5T__conv_ref); status |= H5T__register_int(H5T_PERS_SOFT, "regref_ref", regref, ref, H5T__conv_ref); + status |= H5T__register_int(H5T_PERS_SOFT, "complex_array_compat", cplx, array, H5T__conv_complex_compat); + status |= H5T__register_int(H5T_PERS_SOFT, "array_complex_compat", array, cplx, H5T__conv_complex_compat); + status |= + H5T__register_int(H5T_PERS_SOFT, "complex_compound_compat", cplx, compound, H5T__conv_complex_compat); + status |= + H5T__register_int(H5T_PERS_SOFT, "compound_complex_compat", compound, cplx, H5T__conv_complex_compat); /* * Native conversions should be listed last since we can use hardware to @@ -1195,6 +1397,34 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "ldbl_flt16", native_ldouble, native_float16, H5T__conv_ldouble__Float16); #endif +#endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "flt_fcomplex", native_float, native_float_complex, + H5T__conv_float_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "flt_dcomplex", native_float, native_double_complex, + H5T__conv_float_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "flt_lcomplex", native_float, native_ldouble_complex, + H5T__conv_float_lcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "dbl_fcomplex", native_double, native_float_complex, + H5T__conv_double_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "dbl_dcomplex", native_double, native_double_complex, + H5T__conv_double_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "dbl_lcomplex", native_double, native_ldouble_complex, + H5T__conv_double_lcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ldbl_fcomplex", native_ldouble, native_float_complex, + H5T__conv_ldouble_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ldbl_dcomplex", native_ldouble, native_double_complex, + H5T__conv_ldouble_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ldbl_lcomplex", native_ldouble, native_ldouble_complex, + H5T__conv_ldouble_lcomplex); +#ifdef H5_HAVE__FLOAT16 + status |= H5T__register_int(H5T_PERS_HARD, "flt16_fcomplex", native_float16, native_float_complex, + H5T__conv__Float16_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "flt16_dcomplex", native_float16, native_double_complex, + H5T__conv__Float16_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "flt16_lcomplex", native_float16, native_ldouble_complex, + H5T__conv__Float16_lcomplex); +#endif #endif /* from long long */ @@ -1358,6 +1588,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "schar_flt16", native_schar, native_float16, H5T__conv_schar__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "schar_fcomplex", native_schar, native_float_complex, + H5T__conv_schar_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "schar_dcomplex", native_schar, native_double_complex, + H5T__conv_schar_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "schar_lcomplex", native_schar, native_ldouble_complex, + H5T__conv_schar_lcomplex); +#endif /* From unsigned char to floats */ status |= @@ -1370,6 +1608,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "uchar_flt16", native_uchar, native_float16, H5T__conv_uchar__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "uchar_fcomplex", native_uchar, native_float_complex, + H5T__conv_uchar_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "uchar_dcomplex", native_uchar, native_double_complex, + H5T__conv_uchar_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "uchar_lcomplex", native_uchar, native_ldouble_complex, + H5T__conv_uchar_lcomplex); +#endif /* From short to floats */ status |= @@ -1382,6 +1628,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "short_flt16", native_short, native_float16, H5T__conv_short__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "short_fcomplex", native_short, native_float_complex, + H5T__conv_short_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "short_dcomplex", native_short, native_double_complex, + H5T__conv_short_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "short_lcomplex", native_short, native_ldouble_complex, + H5T__conv_short_lcomplex); +#endif /* From unsigned short to floats */ status |= @@ -1394,6 +1648,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "ushort_flt16", native_ushort, native_float16, H5T__conv_ushort__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "ushort_fcomplex", native_ushort, native_float_complex, + H5T__conv_ushort_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ushort_dcomplex", native_ushort, native_double_complex, + H5T__conv_ushort_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ushort_lcomplex", native_ushort, native_ldouble_complex, + H5T__conv_ushort_lcomplex); +#endif /* From int to floats */ status |= H5T__register_int(H5T_PERS_HARD, "int_flt", native_int, native_float, H5T__conv_int_float); @@ -1403,6 +1665,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "int_flt16", native_int, native_float16, H5T__conv_int__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "int_fcomplex", native_int, native_float_complex, + H5T__conv_int_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "int_dcomplex", native_int, native_double_complex, + H5T__conv_int_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "int_lcomplex", native_int, native_ldouble_complex, + H5T__conv_int_lcomplex); +#endif /* From unsigned int to floats */ status |= H5T__register_int(H5T_PERS_HARD, "uint_flt", native_uint, native_float, H5T__conv_uint_float); @@ -1413,6 +1683,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "uint_flt16", native_uint, native_float16, H5T__conv_uint__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "uint_fcomplex", native_uint, native_float_complex, + H5T__conv_uint_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "uint_dcomplex", native_uint, native_double_complex, + H5T__conv_uint_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "uint_lcomplex", native_uint, native_ldouble_complex, + H5T__conv_uint_lcomplex); +#endif /* From long to floats */ status |= H5T__register_int(H5T_PERS_HARD, "long_flt", native_long, native_float, H5T__conv_long_float); @@ -1423,6 +1701,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "long_flt16", native_long, native_float16, H5T__conv_long__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "long_fcomplex", native_long, native_float_complex, + H5T__conv_long_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "long_dcomplex", native_long, native_double_complex, + H5T__conv_long_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "long_lcomplex", native_long, native_ldouble_complex, + H5T__conv_long_lcomplex); +#endif /* From unsigned long to floats */ status |= @@ -1435,6 +1721,14 @@ H5T_init(void) status |= H5T__register_int(H5T_PERS_HARD, "ulong_flt16", native_ulong, native_float16, H5T__conv_ulong__Float16); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "ulong_fcomplex", native_ulong, native_float_complex, + H5T__conv_ulong_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ulong_dcomplex", native_ulong, native_double_complex, + H5T__conv_ulong_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ulong_lcomplex", native_ulong, native_ldouble_complex, + H5T__conv_ulong_lcomplex); +#endif /* From long long to floats */ status |= @@ -1448,6 +1742,16 @@ H5T_init(void) #ifdef H5_HAVE__FLOAT16 status |= H5T__register_int(H5T_PERS_HARD, "llong_flt16", native_llong, native_float16, H5T__conv_llong__Float16); +#endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "llong_fcomplex", native_llong, native_float_complex, + H5T__conv_llong_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "llong_dcomplex", native_llong, native_double_complex, + H5T__conv_llong_dcomplex); +#ifdef H5T_CONV_INTERNAL_LLONG_LDOUBLE + status |= H5T__register_int(H5T_PERS_HARD, "llong_lcomplex", native_llong, native_ldouble_complex, + H5T__conv_llong_lcomplex); +#endif #endif /* From unsigned long long to floats */ @@ -1462,6 +1766,16 @@ H5T_init(void) #ifdef H5_HAVE__FLOAT16 status |= H5T__register_int(H5T_PERS_HARD, "ullong_flt16", native_ullong, native_float16, H5T__conv_ullong__Float16); +#endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + status |= H5T__register_int(H5T_PERS_HARD, "ullong_fcomplex", native_ullong, native_float_complex, + H5T__conv_ullong_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "ullong_dcomplex", native_ullong, native_double_complex, + H5T__conv_ullong_dcomplex); +#ifdef H5T_CONV_INTERNAL_ULLONG_LDOUBLE + status |= H5T__register_int(H5T_PERS_HARD, "ullong_lcomplex", native_ullong, native_ldouble_complex, + H5T__conv_ullong_lcomplex); +#endif #endif /* From floats to char */ @@ -1572,7 +1886,7 @@ H5T_init(void) H5T__register_int(H5T_PERS_HARD, "flt_ullong", native_float, native_ullong, H5T__conv_float_ullong); status |= H5T__register_int(H5T_PERS_HARD, "dbl_ullong", native_double, native_ullong, H5T__conv_double_ullong); -#if H5T_CONV_INTERNAL_LDOUBLE_ULLONG +#ifdef H5T_CONV_INTERNAL_LDOUBLE_ULLONG status |= H5T__register_int(H5T_PERS_HARD, "ldbl_ullong", native_ldouble, native_ullong, H5T__conv_ldouble_ullong); #endif /* H5T_CONV_INTERNAL_LDOUBLE_ULLONG */ @@ -1581,6 +1895,138 @@ H5T_init(void) H5T__conv__Float16_ullong); #endif +#ifdef H5_HAVE_COMPLEX_NUMBERS + /* From complex numbers to char */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_schar", native_float_complex, native_schar, + H5T__conv_fcomplex_schar); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_schar", native_double_complex, native_schar, + H5T__conv_dcomplex_schar); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_schar", native_ldouble_complex, native_schar, + H5T__conv_lcomplex_schar); + + /* From complex numbers to unsigned char */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_uchar", native_float_complex, native_uchar, + H5T__conv_fcomplex_uchar); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_uchar", native_double_complex, native_uchar, + H5T__conv_dcomplex_uchar); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_uchar", native_ldouble_complex, native_uchar, + H5T__conv_lcomplex_uchar); + + /* From complex numbers to short */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_short", native_float_complex, native_short, + H5T__conv_fcomplex_short); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_short", native_double_complex, native_short, + H5T__conv_dcomplex_short); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_short", native_ldouble_complex, native_short, + H5T__conv_lcomplex_short); + + /* From complex numbers to unsigned short */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_ushort", native_float_complex, native_ushort, + H5T__conv_fcomplex_ushort); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_ushort", native_double_complex, native_ushort, + H5T__conv_dcomplex_ushort); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_ushort", native_ldouble_complex, native_ushort, + H5T__conv_lcomplex_ushort); + + /* From complex numbers to int */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_int", native_float_complex, native_int, + H5T__conv_fcomplex_int); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_int", native_double_complex, native_int, + H5T__conv_dcomplex_int); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_int", native_ldouble_complex, native_int, + H5T__conv_lcomplex_int); + + /* From complex numbers to unsigned int */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_uint", native_float_complex, native_uint, + H5T__conv_fcomplex_uint); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_uint", native_double_complex, native_uint, + H5T__conv_dcomplex_uint); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_uint", native_ldouble_complex, native_uint, + H5T__conv_lcomplex_uint); + + /* From complex numbers to long */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_long", native_float_complex, native_long, + H5T__conv_fcomplex_long); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_long", native_double_complex, native_long, + H5T__conv_dcomplex_long); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_long", native_ldouble_complex, native_long, + H5T__conv_lcomplex_long); + + /* From complex numbers to unsigned long */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_ulong", native_float_complex, native_ulong, + H5T__conv_fcomplex_ulong); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_ulong", native_double_complex, native_ulong, + H5T__conv_dcomplex_ulong); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_ulong", native_ldouble_complex, native_ulong, + H5T__conv_lcomplex_ulong); + + /* From complex numbers to long long */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_llong", native_float_complex, native_llong, + H5T__conv_fcomplex_llong); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_llong", native_double_complex, native_llong, + H5T__conv_dcomplex_llong); +#ifdef H5T_CONV_INTERNAL_LDOUBLE_LLONG + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_llong", native_ldouble_complex, native_llong, + H5T__conv_lcomplex_llong); +#endif + + /* From complex numbers to unsigned long long */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_ullong", native_float_complex, native_ullong, + H5T__conv_fcomplex_ullong); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_ullong", native_double_complex, native_ullong, + H5T__conv_dcomplex_ullong); +#ifdef H5T_CONV_INTERNAL_LDOUBLE_ULLONG + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_ullong", native_ldouble_complex, native_ullong, + H5T__conv_lcomplex_ullong); +#endif + + /* From complex numbers to floats */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_flt", native_float_complex, native_float, + H5T__conv_fcomplex_float); + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_dbl", native_float_complex, native_double, + H5T__conv_fcomplex_double); + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_ldbl", native_float_complex, native_ldouble, + H5T__conv_fcomplex_ldouble); +#ifdef H5_HAVE__FLOAT16 + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_flt16", native_float_complex, native_float16, + H5T__conv_fcomplex__Float16); +#endif + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_flt", native_double_complex, native_float, + H5T__conv_dcomplex_float); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_dbl", native_double_complex, native_double, + H5T__conv_dcomplex_double); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_ldbl", native_double_complex, native_ldouble, + H5T__conv_dcomplex_ldouble); +#ifdef H5_HAVE__FLOAT16 + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_flt16", native_double_complex, native_float16, + H5T__conv_dcomplex__Float16); +#endif + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_flt", native_ldouble_complex, native_float, + H5T__conv_lcomplex_float); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_dbl", native_ldouble_complex, native_double, + H5T__conv_lcomplex_double); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_ldbl", native_ldouble_complex, native_ldouble, + H5T__conv_lcomplex_ldouble); +#if defined(H5_HAVE__FLOAT16) && defined(H5T_CONV_INTERNAL_LDOUBLE_FLOAT16) + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_flt16", native_ldouble_complex, native_float16, + H5T__conv_lcomplex__Float16); +#endif + + /* From complex numbers to complex numbers */ + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_dcomplex", native_float_complex, + native_double_complex, H5T__conv_fcomplex_dcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "fcomplex_lcomplex", native_float_complex, + native_ldouble_complex, H5T__conv_fcomplex_lcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_fcomplex", native_double_complex, + native_float_complex, H5T__conv_dcomplex_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "dcomplex_lcomplex", native_double_complex, + native_ldouble_complex, H5T__conv_dcomplex_lcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_fcomplex", native_ldouble_complex, + native_float_complex, H5T__conv_lcomplex_fcomplex); + status |= H5T__register_int(H5T_PERS_HARD, "lcomplex_dcomplex", native_ldouble_complex, + native_double_complex, H5T__conv_lcomplex_dcomplex); +#endif + /* * The special no-op conversion is the fastest, so we list it last. The * data types we use are not important as long as the source and @@ -1595,7 +2041,7 @@ H5T_init(void) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to register conversion function(s)"); /* Register datatype creation property class properties here. See similar - * code in H5D_init(), etc. for example. + * code in H5D__init_package(), etc. for example. */ /* Only register the default property list if it hasn't been created yet */ @@ -1608,6 +2054,9 @@ H5T_init(void) HGOTO_ERROR(H5E_PLIST, H5E_CANTREGISTER, FAIL, "can't insert property into class"); } /* end if */ + /* Mark "top" of interface as initialized, too */ + H5T_top_package_initialize_s = true; + done: /* General cleanup */ if (compound != NULL) @@ -1618,6 +2067,8 @@ H5T_init(void) (void)H5T_close_real(vlen); if (array != NULL) (void)H5T_close_real(array); + if (cplx != NULL) + (void)H5T_close_real(cplx); /* Error cleanup */ if (ret_value < 0) { @@ -1635,7 +2086,7 @@ H5T_init(void) } /* end if */ FUNC_LEAVE_NOAPI(ret_value) -} /* end H5T_init() */ +} /* end H5T__init_package() */ /*------------------------------------------------------------------------- * Function: H5T__unlock_cb @@ -1684,143 +2135,159 @@ H5T_top_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Unregister all conversion functions */ - if (H5T_g.path) { - H5T_conv_ctx_t conv_ctx = {0}; + if (H5T_top_package_initialize_s) { + /* Unregister all conversion functions */ + if (H5T_g.path) { + H5T_conv_ctx_t conv_ctx = {0}; - conv_ctx.u.free.src_type_id = H5I_INVALID_HID; - conv_ctx.u.free.dst_type_id = H5I_INVALID_HID; + conv_ctx.u.free.src_type_id = H5I_INVALID_HID; + conv_ctx.u.free.dst_type_id = H5I_INVALID_HID; - for (int i = 0; i < H5T_g.npaths; i++) { - H5T_path_t *path = H5T_g.path[i]; + for (int i = 0; i < H5T_g.npaths; i++) { + H5T_path_t *path = H5T_g.path[i]; - (void)H5T__path_free(path, &conv_ctx); + (void)H5T__path_free(path, &conv_ctx); - H5T_g.path[i] = NULL; - } /* end for */ + H5T_g.path[i] = NULL; + } /* end for */ - /* Clear conversion tables */ - H5T_g.path = (H5T_path_t **)H5MM_xfree(H5T_g.path); - H5T_g.npaths = 0; - H5T_g.apaths = 0; - H5T_g.soft = (H5T_soft_t *)H5MM_xfree(H5T_g.soft); - H5T_g.nsoft = 0; - H5T_g.asoft = 0; + /* Clear conversion tables */ + H5T_g.path = (H5T_path_t **)H5MM_xfree(H5T_g.path); + H5T_g.npaths = 0; + H5T_g.apaths = 0; + H5T_g.soft = (H5T_soft_t *)H5MM_xfree(H5T_g.soft); + H5T_g.nsoft = 0; + H5T_g.asoft = 0; - n++; - } /* end if */ + n++; + } /* end if */ + + /* Unlock all datatypes, then free them */ + /* note that we are ignoring the return value from H5I_iterate() */ + /* Also note that we are incrementing 'n' in the callback */ + H5I_iterate(H5I_DATATYPE, H5T__unlock_cb, &n, false); + + /* Release all datatype IDs */ + if (H5I_nmembers(H5I_DATATYPE) > 0) { + (void)H5I_clear_type(H5I_DATATYPE, false, false); + n++; /*H5I*/ + } /* end if */ + + /* Reset all the datatype IDs */ + if (H5T_IEEE_F32BE_g > 0) { + H5T_IEEE_F16BE_g = H5I_INVALID_HID; + H5T_IEEE_F16LE_g = H5I_INVALID_HID; + H5T_IEEE_F32BE_g = H5I_INVALID_HID; + H5T_IEEE_F32LE_g = H5I_INVALID_HID; + H5T_IEEE_F64BE_g = H5I_INVALID_HID; + H5T_IEEE_F64LE_g = H5I_INVALID_HID; + + H5T_COMPLEX_IEEE_F16BE_g = H5I_INVALID_HID; + H5T_COMPLEX_IEEE_F16LE_g = H5I_INVALID_HID; + H5T_COMPLEX_IEEE_F32BE_g = H5I_INVALID_HID; + H5T_COMPLEX_IEEE_F32LE_g = H5I_INVALID_HID; + H5T_COMPLEX_IEEE_F64BE_g = H5I_INVALID_HID; + H5T_COMPLEX_IEEE_F64LE_g = H5I_INVALID_HID; + + H5T_STD_I8BE_g = H5I_INVALID_HID; + H5T_STD_I8LE_g = H5I_INVALID_HID; + H5T_STD_I16BE_g = H5I_INVALID_HID; + H5T_STD_I16LE_g = H5I_INVALID_HID; + H5T_STD_I32BE_g = H5I_INVALID_HID; + H5T_STD_I32LE_g = H5I_INVALID_HID; + H5T_STD_I64BE_g = H5I_INVALID_HID; + H5T_STD_I64LE_g = H5I_INVALID_HID; + H5T_STD_U8BE_g = H5I_INVALID_HID; + H5T_STD_U8LE_g = H5I_INVALID_HID; + H5T_STD_U16BE_g = H5I_INVALID_HID; + H5T_STD_U16LE_g = H5I_INVALID_HID; + H5T_STD_U32BE_g = H5I_INVALID_HID; + H5T_STD_U32LE_g = H5I_INVALID_HID; + H5T_STD_U64BE_g = H5I_INVALID_HID; + H5T_STD_U64LE_g = H5I_INVALID_HID; + H5T_STD_B8BE_g = H5I_INVALID_HID; + H5T_STD_B8LE_g = H5I_INVALID_HID; + H5T_STD_B16BE_g = H5I_INVALID_HID; + H5T_STD_B16LE_g = H5I_INVALID_HID; + H5T_STD_B32BE_g = H5I_INVALID_HID; + H5T_STD_B32LE_g = H5I_INVALID_HID; + H5T_STD_B64BE_g = H5I_INVALID_HID; + H5T_STD_B64LE_g = H5I_INVALID_HID; + H5T_STD_REF_OBJ_g = H5I_INVALID_HID; + H5T_STD_REF_DSETREG_g = H5I_INVALID_HID; + H5T_STD_REF_g = H5I_INVALID_HID; + + H5T_UNIX_D32BE_g = H5I_INVALID_HID; + H5T_UNIX_D32LE_g = H5I_INVALID_HID; + H5T_UNIX_D64BE_g = H5I_INVALID_HID; + H5T_UNIX_D64LE_g = H5I_INVALID_HID; + + H5T_C_S1_g = H5I_INVALID_HID; + + H5T_FORTRAN_S1_g = H5I_INVALID_HID; + + H5T_NATIVE_SCHAR_g = H5I_INVALID_HID; + H5T_NATIVE_UCHAR_g = H5I_INVALID_HID; + H5T_NATIVE_SHORT_g = H5I_INVALID_HID; + H5T_NATIVE_USHORT_g = H5I_INVALID_HID; + H5T_NATIVE_INT_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_g = H5I_INVALID_HID; + H5T_NATIVE_LONG_g = H5I_INVALID_HID; + H5T_NATIVE_ULONG_g = H5I_INVALID_HID; + H5T_NATIVE_LLONG_g = H5I_INVALID_HID; + H5T_NATIVE_ULLONG_g = H5I_INVALID_HID; + H5T_NATIVE_FLOAT16_g = H5I_INVALID_HID; + H5T_NATIVE_FLOAT_g = H5I_INVALID_HID; + H5T_NATIVE_DOUBLE_g = H5I_INVALID_HID; + H5T_NATIVE_LDOUBLE_g = H5I_INVALID_HID; + H5T_NATIVE_FLOAT_COMPLEX_g = H5I_INVALID_HID; + H5T_NATIVE_DOUBLE_COMPLEX_g = H5I_INVALID_HID; + H5T_NATIVE_LDOUBLE_COMPLEX_g = H5I_INVALID_HID; + H5T_NATIVE_B8_g = H5I_INVALID_HID; + H5T_NATIVE_B16_g = H5I_INVALID_HID; + H5T_NATIVE_B32_g = H5I_INVALID_HID; + H5T_NATIVE_B64_g = H5I_INVALID_HID; + H5T_NATIVE_OPAQUE_g = H5I_INVALID_HID; + H5T_NATIVE_HADDR_g = H5I_INVALID_HID; + H5T_NATIVE_HSIZE_g = H5I_INVALID_HID; + H5T_NATIVE_HSSIZE_g = H5I_INVALID_HID; + H5T_NATIVE_HERR_g = H5I_INVALID_HID; + H5T_NATIVE_HBOOL_g = H5I_INVALID_HID; + + H5T_NATIVE_INT8_g = H5I_INVALID_HID; + H5T_NATIVE_UINT8_g = H5I_INVALID_HID; + H5T_NATIVE_INT_LEAST8_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_LEAST8_g = H5I_INVALID_HID; + H5T_NATIVE_INT_FAST8_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_FAST8_g = H5I_INVALID_HID; + + H5T_NATIVE_INT16_g = H5I_INVALID_HID; + H5T_NATIVE_UINT16_g = H5I_INVALID_HID; + H5T_NATIVE_INT_LEAST16_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_LEAST16_g = H5I_INVALID_HID; + H5T_NATIVE_INT_FAST16_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_FAST16_g = H5I_INVALID_HID; + + H5T_NATIVE_INT32_g = H5I_INVALID_HID; + H5T_NATIVE_UINT32_g = H5I_INVALID_HID; + H5T_NATIVE_INT_LEAST32_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_LEAST32_g = H5I_INVALID_HID; + H5T_NATIVE_INT_FAST32_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_FAST32_g = H5I_INVALID_HID; + + H5T_NATIVE_INT64_g = H5I_INVALID_HID; + H5T_NATIVE_UINT64_g = H5I_INVALID_HID; + H5T_NATIVE_INT_LEAST64_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_LEAST64_g = H5I_INVALID_HID; + H5T_NATIVE_INT_FAST64_g = H5I_INVALID_HID; + H5T_NATIVE_UINT_FAST64_g = H5I_INVALID_HID; + + n++; + } /* end if */ - /* Unlock all datatypes, then free them */ - /* note that we are ignoring the return value from H5I_iterate() */ - /* Also note that we are incrementing 'n' in the callback */ - H5I_iterate(H5I_DATATYPE, H5T__unlock_cb, &n, false); - - /* Release all datatype IDs */ - if (H5I_nmembers(H5I_DATATYPE) > 0) { - (void)H5I_clear_type(H5I_DATATYPE, false, false); - n++; /*H5I*/ - } /* end if */ - - /* Reset all the datatype IDs */ - if (H5T_IEEE_F32BE_g > 0) { - H5T_IEEE_F16BE_g = H5I_INVALID_HID; - H5T_IEEE_F16LE_g = H5I_INVALID_HID; - H5T_IEEE_F32BE_g = H5I_INVALID_HID; - H5T_IEEE_F32LE_g = H5I_INVALID_HID; - H5T_IEEE_F64BE_g = H5I_INVALID_HID; - H5T_IEEE_F64LE_g = H5I_INVALID_HID; - - H5T_STD_I8BE_g = H5I_INVALID_HID; - H5T_STD_I8LE_g = H5I_INVALID_HID; - H5T_STD_I16BE_g = H5I_INVALID_HID; - H5T_STD_I16LE_g = H5I_INVALID_HID; - H5T_STD_I32BE_g = H5I_INVALID_HID; - H5T_STD_I32LE_g = H5I_INVALID_HID; - H5T_STD_I64BE_g = H5I_INVALID_HID; - H5T_STD_I64LE_g = H5I_INVALID_HID; - H5T_STD_U8BE_g = H5I_INVALID_HID; - H5T_STD_U8LE_g = H5I_INVALID_HID; - H5T_STD_U16BE_g = H5I_INVALID_HID; - H5T_STD_U16LE_g = H5I_INVALID_HID; - H5T_STD_U32BE_g = H5I_INVALID_HID; - H5T_STD_U32LE_g = H5I_INVALID_HID; - H5T_STD_U64BE_g = H5I_INVALID_HID; - H5T_STD_U64LE_g = H5I_INVALID_HID; - H5T_STD_B8BE_g = H5I_INVALID_HID; - H5T_STD_B8LE_g = H5I_INVALID_HID; - H5T_STD_B16BE_g = H5I_INVALID_HID; - H5T_STD_B16LE_g = H5I_INVALID_HID; - H5T_STD_B32BE_g = H5I_INVALID_HID; - H5T_STD_B32LE_g = H5I_INVALID_HID; - H5T_STD_B64BE_g = H5I_INVALID_HID; - H5T_STD_B64LE_g = H5I_INVALID_HID; - H5T_STD_REF_OBJ_g = H5I_INVALID_HID; - H5T_STD_REF_DSETREG_g = H5I_INVALID_HID; - H5T_STD_REF_g = H5I_INVALID_HID; - - H5T_UNIX_D32BE_g = H5I_INVALID_HID; - H5T_UNIX_D32LE_g = H5I_INVALID_HID; - H5T_UNIX_D64BE_g = H5I_INVALID_HID; - H5T_UNIX_D64LE_g = H5I_INVALID_HID; - - H5T_C_S1_g = H5I_INVALID_HID; - - H5T_FORTRAN_S1_g = H5I_INVALID_HID; - - H5T_NATIVE_SCHAR_g = H5I_INVALID_HID; - H5T_NATIVE_UCHAR_g = H5I_INVALID_HID; - H5T_NATIVE_SHORT_g = H5I_INVALID_HID; - H5T_NATIVE_USHORT_g = H5I_INVALID_HID; - H5T_NATIVE_INT_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_g = H5I_INVALID_HID; - H5T_NATIVE_LONG_g = H5I_INVALID_HID; - H5T_NATIVE_ULONG_g = H5I_INVALID_HID; - H5T_NATIVE_LLONG_g = H5I_INVALID_HID; - H5T_NATIVE_ULLONG_g = H5I_INVALID_HID; - H5T_NATIVE_FLOAT16_g = H5I_INVALID_HID; - H5T_NATIVE_FLOAT_g = H5I_INVALID_HID; - H5T_NATIVE_DOUBLE_g = H5I_INVALID_HID; - H5T_NATIVE_LDOUBLE_g = H5I_INVALID_HID; - H5T_NATIVE_B8_g = H5I_INVALID_HID; - H5T_NATIVE_B16_g = H5I_INVALID_HID; - H5T_NATIVE_B32_g = H5I_INVALID_HID; - H5T_NATIVE_B64_g = H5I_INVALID_HID; - H5T_NATIVE_OPAQUE_g = H5I_INVALID_HID; - H5T_NATIVE_HADDR_g = H5I_INVALID_HID; - H5T_NATIVE_HSIZE_g = H5I_INVALID_HID; - H5T_NATIVE_HSSIZE_g = H5I_INVALID_HID; - H5T_NATIVE_HERR_g = H5I_INVALID_HID; - H5T_NATIVE_HBOOL_g = H5I_INVALID_HID; - - H5T_NATIVE_INT8_g = H5I_INVALID_HID; - H5T_NATIVE_UINT8_g = H5I_INVALID_HID; - H5T_NATIVE_INT_LEAST8_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_LEAST8_g = H5I_INVALID_HID; - H5T_NATIVE_INT_FAST8_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_FAST8_g = H5I_INVALID_HID; - - H5T_NATIVE_INT16_g = H5I_INVALID_HID; - H5T_NATIVE_UINT16_g = H5I_INVALID_HID; - H5T_NATIVE_INT_LEAST16_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_LEAST16_g = H5I_INVALID_HID; - H5T_NATIVE_INT_FAST16_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_FAST16_g = H5I_INVALID_HID; - - H5T_NATIVE_INT32_g = H5I_INVALID_HID; - H5T_NATIVE_UINT32_g = H5I_INVALID_HID; - H5T_NATIVE_INT_LEAST32_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_LEAST32_g = H5I_INVALID_HID; - H5T_NATIVE_INT_FAST32_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_FAST32_g = H5I_INVALID_HID; - - H5T_NATIVE_INT64_g = H5I_INVALID_HID; - H5T_NATIVE_UINT64_g = H5I_INVALID_HID; - H5T_NATIVE_INT_LEAST64_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_LEAST64_g = H5I_INVALID_HID; - H5T_NATIVE_INT_FAST64_g = H5I_INVALID_HID; - H5T_NATIVE_UINT_FAST64_g = H5I_INVALID_HID; - - n++; + /* Mark "top" of interface as closed */ + if (0 == n) + H5T_top_package_initialize_s = false; } /* end if */ FUNC_LEAVE_NOAPI(n) @@ -1848,11 +2315,18 @@ H5T_term_package(void) FUNC_ENTER_NOAPI_NOINIT_NOERR - /* Sanity check */ - assert(0 == H5I_nmembers(H5I_DATATYPE)); + if (H5_PKG_INIT_VAR) { + /* Sanity check */ + assert(0 == H5I_nmembers(H5I_DATATYPE)); + assert(false == H5T_top_package_initialize_s); + + /* Destroy the datatype object id group */ + n += (H5I_dec_type_ref(H5I_DATATYPE) > 0); - /* Destroy the datatype object id group */ - n += (H5I_dec_type_ref(H5I_DATATYPE) > 0); + /* Mark interface as closed */ + if (0 == n) + H5_PKG_INIT_VAR = false; + } /* end if */ FUNC_LEAVE_NOAPI(n) } /* end H5T_term_package() */ @@ -1921,19 +2395,19 @@ H5Tcreate(H5T_class_t type, size_t size) H5T_t *dt = NULL; /* New datatype constructed */ hid_t ret_value; /* Return value */ - FUNC_ENTER_API(FAIL) + FUNC_ENTER_API(H5I_INVALID_HID) /* check args. We support string (fixed-size or variable-length) now. */ if (size <= 0 && size != H5T_VARIABLE) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "size must be positive"); + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "size must be positive"); /* create the type */ if (NULL == (dt = H5T__create(type, size))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to create type"); + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5I_INVALID_HID, "unable to create type"); /* Get an ID for the datatype */ if ((ret_value = H5I_register(H5I_DATATYPE, dt, true)) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register datatype ID"); + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register datatype ID"); done: FUNC_LEAVE_API(ret_value) @@ -2248,7 +2722,7 @@ H5T_get_class(const H5T_t *dt, htri_t internal) { H5T_class_t ret_value = H5T_NO_CLASS; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(H5T_NO_CLASS) assert(dt); @@ -2263,6 +2737,7 @@ H5T_get_class(const H5T_t *dt, htri_t internal) ret_value = dt->shared->type; } +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5T_get_class() */ @@ -2314,7 +2789,7 @@ H5T_detect_class(const H5T_t *dt, H5T_class_t cls, bool from_api) unsigned i; htri_t ret_value = false; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) assert(dt); assert(cls > H5T_NO_CLASS && cls < H5T_NCLASSES); @@ -2342,7 +2817,7 @@ H5T_detect_class(const H5T_t *dt, H5T_class_t cls, bool from_api) HGOTO_DONE(true); /* Recurse if it's VL, compound, enum or array */ - if (H5T_IS_COMPLEX(dt->shared->u.compnd.memb[i].type->shared->type)) + if (H5T_IS_COMPOSITE(dt->shared->u.compnd.memb[i].type->shared->type)) if ((nested_ret = H5T_detect_class(dt->shared->u.compnd.memb[i].type, cls, from_api)) != false) HGOTO_DONE(nested_ret); @@ -2354,6 +2829,9 @@ H5T_detect_class(const H5T_t *dt, H5T_class_t cls, bool from_api) case H5T_ENUM: HGOTO_DONE(H5T_detect_class(dt->shared->parent, cls, from_api)); break; + case H5T_COMPLEX: + HGOTO_DONE(H5T_detect_class(dt->shared->parent, cls, from_api)); + break; case H5T_NO_CLASS: case H5T_INTEGER: case H5T_FLOAT: @@ -2489,7 +2967,9 @@ H5Tset_size(hid_t type_id, size_t size) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "only strings may be variable length"); if (H5T_ENUM == dt->shared->type && dt->shared->u.enumer.nmembs > 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not allowed after members are defined"); - if (H5T_REFERENCE == dt->shared->type) + if (H5T_ARRAY == dt->shared->type || H5T_REFERENCE == dt->shared->type || H5T_COMPLEX == dt->shared->type) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for this datatype"); + if (H5T_VLEN == dt->shared->type && H5T_VLEN_STRING != dt->shared->u.vlen.type) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "operation not defined for this datatype"); /* Modify the datatype */ @@ -3221,11 +3701,11 @@ H5Tdecode(const void *buf) H5T_t *dt; hid_t ret_value; /* Return value */ - FUNC_ENTER_API(FAIL) + FUNC_ENTER_API(H5I_INVALID_HID) /* Check args */ if (buf == NULL) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "empty buffer"); + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, H5I_INVALID_HID, "empty buffer"); /* Create datatype by decoding buffer * There is no way to get the size of the buffer, so we pass in @@ -3234,11 +3714,11 @@ H5Tdecode(const void *buf) * takes a size parameter. */ if (NULL == (dt = H5T_decode(SIZE_MAX, (const unsigned char *)buf))) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, FAIL, "can't decode object"); + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTDECODE, H5I_INVALID_HID, "can't decode object"); /* Register the type and return the ID */ if ((ret_value = H5I_register(H5I_DATATYPE, dt, true)) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, FAIL, "unable to register data type"); + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register data type"); done: FUNC_LEAVE_API(ret_value) @@ -3444,6 +3924,9 @@ H5T__create(H5T_class_t type, size_t size) case H5T_ARRAY: /* Array datatype */ HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, NULL, "base type required - use H5Tarray_create2()"); + case H5T_COMPLEX: /* Complex number datatype */ + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, NULL, "base type required - use H5Tcomplex_create()"); + case H5T_NO_CLASS: case H5T_REFERENCE: case H5T_NCLASSES: @@ -3745,6 +4228,7 @@ H5T__complete_copy(H5T_t *new_dt, const H5T_t *old_dt, H5T_shared_t *reopened_fo case H5T_TIME: case H5T_STRING: case H5T_BITFIELD: + case H5T_COMPLEX: case H5T_NCLASSES: default: break; @@ -4085,7 +4569,8 @@ H5T__free(H5T_t *dt) for (i = 0; i < dt->shared->u.compnd.nmembs; i++) { dt->shared->u.compnd.memb[i].name = (char *)H5MM_xfree(dt->shared->u.compnd.memb[i].name); if (H5T_close_real(dt->shared->u.compnd.memb[i].type) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, + /* Push errors, but keep going */ + HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close datatype for compound member"); } dt->shared->u.compnd.memb = (H5T_cmemb_t *)H5MM_xfree(dt->shared->u.compnd.memb); @@ -4113,6 +4598,7 @@ H5T__free(H5T_t *dt) case H5T_REFERENCE: case H5T_VLEN: case H5T_ARRAY: + case H5T_COMPLEX: case H5T_NCLASSES: default: break; @@ -4122,12 +4608,14 @@ H5T__free(H5T_t *dt) /* Close the parent */ assert(dt->shared->parent != dt); if (dt->shared->parent && H5T_close_real(dt->shared->parent) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close parent data type"); + /* Push errors, but keep going */ + HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close parent data type"); dt->shared->parent = NULL; /* Close the owned VOL object */ if (dt->shared->owned_vol_obj && H5VL_free_object(dt->shared->owned_vol_obj) < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close owned VOL object"); + /* Push errors, but keep going */ + HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "unable to close owned VOL object"); dt->shared->owned_vol_obj = NULL; done: @@ -4291,18 +4779,15 @@ H5T__set_size(H5T_t *dt, size_t size) assert(dt); assert(dt->shared); assert(size != 0); + assert(H5T_ARRAY != dt->shared->type); assert(H5T_REFERENCE != dt->shared->type); + assert(H5T_COMPLEX != dt->shared->type); + assert(H5T_VLEN != dt->shared->type || H5T_VLEN_STRING == dt->shared->u.vlen.type); assert(!(H5T_ENUM == dt->shared->type && 0 == dt->shared->u.enumer.nmembs)); if (dt->shared->parent) { if (H5T__set_size(dt->shared->parent, size) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "unable to set size for parent data type"); - - /* Adjust size of datatype appropriately */ - if (dt->shared->type == H5T_ARRAY) - dt->shared->size = dt->shared->parent->shared->size * dt->shared->u.array.nelem; - else if (dt->shared->type != H5T_VLEN) - dt->shared->size = dt->shared->parent->shared->size; } else { if (H5T_IS_ATOMIC(dt->shared)) { @@ -4424,6 +4909,7 @@ H5T__set_size(H5T_t *dt, size_t size) case H5T_VLEN: case H5T_ARRAY: case H5T_REFERENCE: + case H5T_COMPLEX: assert("can't happen" && 0); break; @@ -4812,6 +5298,23 @@ H5T_cmp(const H5T_t *dt1, const H5T_t *dt2, bool superset) HGOTO_DONE(1); break; + case H5T_COMPLEX: + /* Make sure the complex number datatypes are both in the same form */ + tmp = (dt1->shared->u.cplx.form > dt2->shared->u.cplx.form) - + (dt1->shared->u.cplx.form < dt2->shared->u.cplx.form); + if (tmp < 0) + HGOTO_DONE(-1); + if (tmp > 0) + HGOTO_DONE(1); + + tmp = H5T_cmp(dt1->shared->parent, dt2->shared->parent, superset); + if (tmp < 0) + HGOTO_DONE(-1); + if (tmp > 0) + HGOTO_DONE(1); + + break; + case H5T_NO_CLASS: case H5T_INTEGER: case H5T_FLOAT: @@ -4942,6 +5445,7 @@ H5T_cmp(const H5T_t *dt1, const H5T_t *dt2, bool superset) case H5T_ENUM: case H5T_VLEN: case H5T_ARRAY: + case H5T_COMPLEX: case H5T_NCLASSES: default: assert("not implemented yet" && 0); @@ -5156,8 +5660,8 @@ H5T__path_find_real(const H5T_t *src, const H5T_t *dst, const char *name, H5T_co old_npaths = H5T_g.npaths; /* Set a few convenience variables */ - new_api_func = (matched_path && conv->is_app && conv->u.app_func); - new_lib_func = (matched_path && !conv->is_app && conv->u.lib_func); + new_api_func = (matched_path && !noop_conv && conv->is_app && conv->u.app_func); + new_lib_func = (matched_path && !noop_conv && !conv->is_app && conv->u.lib_func); /* If we didn't find the path, if the caller is an API function specifying * a new hard conversion function, or if the caller is a private function @@ -5642,6 +6146,7 @@ H5T_path_match_find_type_with_volobj(const H5T_t *datatype, const H5VL_object_t case H5T_OPAQUE: case H5T_REFERENCE: /* Should have been determined by above check */ case H5T_ENUM: + case H5T_COMPLEX: case H5T_NO_CLASS: /* Error value, but simplify logic for a true/false return value */ case H5T_NCLASSES: /* Error value, but simplify logic for a true/false return value */ default: @@ -6023,13 +6528,14 @@ H5T_is_immutable(const H5T_t *dt) { htri_t ret_value = false; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) assert(dt); if (dt->shared->state == H5T_STATE_IMMUTABLE) ret_value = true; +done: FUNC_LEAVE_NOAPI(ret_value) } @@ -6047,7 +6553,7 @@ H5T_is_named(const H5T_t *dt) { htri_t ret_value = false; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) assert(dt); @@ -6056,6 +6562,7 @@ H5T_is_named(const H5T_t *dt) else ret_value = (H5T_STATE_OPEN == dt->shared->state || H5T_STATE_NAMED == dt->shared->state); +done: FUNC_LEAVE_NOAPI(ret_value) } @@ -6131,13 +6638,14 @@ H5T_get_ref_type(const H5T_t *dt) { H5R_type_t ret_value = H5R_BADTYPE; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(H5R_BADTYPE) assert(dt); if (dt->shared->type == H5T_REFERENCE) ret_value = dt->shared->u.atomic.u.r.rtype; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5T_get_ref_type() */ @@ -6158,7 +6666,7 @@ H5T_is_sensible(const H5T_t *dt) { htri_t ret_value = FAIL; /* Return value */ - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) assert(dt); @@ -6189,6 +6697,7 @@ H5T_is_sensible(const H5T_t *dt) case H5T_REFERENCE: case H5T_VLEN: case H5T_ARRAY: + case H5T_COMPLEX: case H5T_NCLASSES: default: /* Assume all other datatype are sensible to store on disk */ @@ -6196,6 +6705,7 @@ H5T_is_sensible(const H5T_t *dt) break; } /* end switch */ +done: FUNC_LEAVE_NOAPI(ret_value) } @@ -6241,7 +6751,7 @@ H5T_set_loc(H5T_t *dt, H5VL_object_t *file, H5T_loc_t loc) /* Recurse if it's VL, compound, enum or array */ /* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */ if (dt->shared->parent->shared->force_conv && - H5T_IS_COMPLEX(dt->shared->parent->shared->type)) { + H5T_IS_COMPOSITE(dt->shared->parent->shared->type)) { /* Keep the old base element size for later */ old_size = dt->shared->parent->shared->size; @@ -6282,7 +6792,7 @@ H5T_set_loc(H5T_t *dt, H5VL_object_t *file, H5T_loc_t loc) /* Recurse if it's VL, compound, enum or array */ /* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */ - if (memb_type->shared->force_conv && H5T_IS_COMPLEX(memb_type->shared->type)) { + if (memb_type->shared->force_conv && H5T_IS_COMPOSITE(memb_type->shared->type)) { /* Keep the old field size for later */ old_size = memb_type->shared->size; @@ -6324,7 +6834,7 @@ H5T_set_loc(H5T_t *dt, H5VL_object_t *file, H5T_loc_t loc) * them as part of the same blob)*/ /* (If the force_conv flag is _not_ set, the type cannot change in size, so don't recurse) */ if (dt->shared->parent->shared->force_conv && - H5T_IS_COMPLEX(dt->shared->parent->shared->type) && + H5T_IS_COMPOSITE(dt->shared->parent->shared->type) && (dt->shared->parent->shared->type != H5T_REFERENCE)) { if ((changed = H5T_set_loc(dt->shared->parent, file, loc)) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, FAIL, "Unable to set VL location"); @@ -6353,6 +6863,7 @@ H5T_set_loc(H5T_t *dt, H5VL_object_t *file, H5T_loc_t loc) case H5T_BITFIELD: case H5T_OPAQUE: case H5T_ENUM: + case H5T_COMPLEX: case H5T_NCLASSES: default: break; @@ -6385,7 +6896,7 @@ H5T_is_relocatable(const H5T_t *dt) { htri_t ret_value = false; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ assert(dt); @@ -6394,6 +6905,7 @@ H5T_is_relocatable(const H5T_t *dt) if (H5T_detect_class(dt, H5T_VLEN, false) || H5T_detect_class(dt, H5T_REFERENCE, false)) ret_value = true; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5T_is_relocatable() */ @@ -6448,6 +6960,7 @@ H5T__detect_vlen_ref(const H5T_t *dt) case H5T_BITFIELD: case H5T_OPAQUE: case H5T_REFERENCE: + case H5T_COMPLEX: case H5T_NCLASSES: default: break; @@ -6478,7 +6991,7 @@ H5T_is_vl_storage(const H5T_t *dt) { htri_t ret_value = false; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ assert(dt); @@ -6491,6 +7004,7 @@ H5T_is_vl_storage(const H5T_t *dt) else ret_value = false; +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5T_is_vl_storage() */ @@ -6532,6 +7046,11 @@ H5T__upgrade_version_cb(H5T_t *dt, void *op_value) dt->shared->version = dt->shared->parent->shared->version; break; + case H5T_COMPLEX: + if (dt->shared->parent->shared->version > dt->shared->version) + dt->shared->version = dt->shared->parent->shared->version; + break; + case H5T_NO_CLASS: case H5T_INTEGER: case H5T_FLOAT: @@ -6570,7 +7089,7 @@ H5T__upgrade_version(H5T_t *dt, unsigned new_version) assert(dt); /* Iterate over entire datatype, upgrading the version of components, if it's useful */ - if (H5T__visit(dt, (H5T_VISIT_SIMPLE | H5T_VISIT_COMPLEX_LAST), H5T__upgrade_version_cb, &new_version) < + if (H5T__visit(dt, (H5T_VISIT_SIMPLE | H5T_VISIT_COMPOSITE_LAST), H5T__upgrade_version_cb, &new_version) < 0) HGOTO_ERROR(H5E_DATATYPE, H5E_BADITER, FAIL, "iteration to upgrade datatype encoding version failed"); @@ -6633,7 +7152,7 @@ H5T_patch_file(H5T_t *dt, H5F_t *f) { herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NOERR + FUNC_ENTER_NOAPI(FAIL) /* Sanity check */ assert(dt); @@ -6644,6 +7163,7 @@ H5T_patch_file(H5T_t *dt, H5F_t *f) dt->sh_loc.file = f; } /* end if */ +done: FUNC_LEAVE_NOAPI(ret_value) } /* end H5T_patch_file() */ diff --git a/src/H5TS.c b/src/H5TS.c index 05d700c4652..2b025724cc4 100644 --- a/src/H5TS.c +++ b/src/H5TS.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSatomic.c b/src/H5TSatomic.c index e765a5f491a..db241b2b868 100644 --- a/src/H5TSatomic.c +++ b/src/H5TSatomic.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSatomic.h b/src/H5TSatomic.h index 478760e8c4d..933bf1a11f7 100644 --- a/src/H5TSatomic.h +++ b/src/H5TSatomic.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSbarrier.c b/src/H5TSbarrier.c index 1dee209dddd..3606f836349 100644 --- a/src/H5TSbarrier.c +++ b/src/H5TSbarrier.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSbarrier.h b/src/H5TSbarrier.h index e27ec08897f..bf085a50e5a 100644 --- a/src/H5TSbarrier.h +++ b/src/H5TSbarrier.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSc11.c b/src/H5TSc11.c index c1de0fe7a5c..016a066c1dd 100644 --- a/src/H5TSc11.c +++ b/src/H5TSc11.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -73,7 +73,7 @@ void H5TS__c11_first_thread_init(void) { - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY /* Initialize H5TS package */ H5TS__init(); diff --git a/src/H5TScond.c b/src/H5TScond.c index 994bd38c7a8..ec38c70a994 100644 --- a/src/H5TScond.c +++ b/src/H5TScond.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TScond.h b/src/H5TScond.h index afc6c305348..3eae21cfca5 100644 --- a/src/H5TScond.h +++ b/src/H5TScond.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSdevelop.h b/src/H5TSdevelop.h index 6700d1047d8..b8140c675d4 100644 --- a/src/H5TSdevelop.h +++ b/src/H5TSdevelop.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSint.c b/src/H5TSint.c index c7600eb1fda..503e21cb1e8 100644 --- a/src/H5TSint.c +++ b/src/H5TSint.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -79,6 +79,9 @@ static H5TS_tinfo_node_t *H5TS__tinfo_create(void); /* Package Variables */ /*********************/ +/* Package initialization variable */ +bool H5_PKG_INIT_VAR = false; + /* Per-thread info */ H5TS_key_t H5TS_thrd_info_key_g; @@ -248,7 +251,7 @@ H5TS__api_mutex_release(unsigned *lock_count) { herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY /* Return the current lock count */ *lock_count = H5TS_api_info_p.lock_count; diff --git a/src/H5TSkey.c b/src/H5TSkey.c index 994898c71f0..991771f951e 100644 --- a/src/H5TSkey.c +++ b/src/H5TSkey.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSkey.h b/src/H5TSkey.h index 3003e114bcd..4442e2b63ce 100644 --- a/src/H5TSkey.h +++ b/src/H5TSkey.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSmodule.h b/src/H5TSmodule.h index 2e8bb1d92a6..71d0de45349 100644 --- a/src/H5TSmodule.h +++ b/src/H5TSmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ * reporting macros. */ #define H5TS_MODULE -#define H5_MY_PKG H5TS -#define H5_MY_PKG_ERR H5E_THREADSAFE +#define H5_MY_PKG H5TS +#define H5_MY_PKG_ERR H5E_THREADSAFE +#define H5_MY_PKG_INIT YES #endif /* H5TSmodule_H */ diff --git a/src/H5TSmutex.c b/src/H5TSmutex.c index 5cc66efff89..63b9f7329a5 100644 --- a/src/H5TSmutex.c +++ b/src/H5TSmutex.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -86,7 +86,7 @@ H5TS_mutex_init(H5TS_mutex_t *mutex, int type) /*------------------------------------------------------------------------- * Function: H5TS_mutex_trylock * - * Purpose: Attempt to lock a H5TS_mutex_t, sets *acquired to TRUE if so + * Purpose: Attempt to lock a H5TS_mutex_t, sets *acquired to true if so * * Return: Non-negative on success / Negative on failure * @@ -157,7 +157,7 @@ H5TS_mutex_init(H5TS_mutex_t *mutex, int H5_ATTR_UNUSED type) /*------------------------------------------------------------------------- * Function: H5TS_mutex_trylock * - * Purpose: Attempt to lock a H5TS_mutex_t, sets *acquired to TRUE if so + * Purpose: Attempt to lock a H5TS_mutex_t, sets *acquired to true if so * * Return: Non-negative on success / Negative on failure * @@ -242,7 +242,7 @@ H5TS_mutex_init(H5TS_mutex_t *mutex, int type) /*------------------------------------------------------------------------- * Function: H5TS_mutex_trylock * - * Purpose: Attempt to lock a H5TS_mutex_t, sets *acquired to TRUE if so + * Purpose: Attempt to lock a H5TS_mutex_t, sets *acquired to true if so * * Return: Non-negative on success / Negative on failure * diff --git a/src/H5TSmutex.h b/src/H5TSmutex.h index 50167ec6bc8..014634eecb7 100644 --- a/src/H5TSmutex.h +++ b/src/H5TSmutex.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -54,7 +54,7 @@ #ifdef H5_HAVE_C11_THREADS -#define H5TS_mutex_lock(mutex) ((H5_UNLIKELY(mtx_lock(mutex) != thrd_success)) ? FAIL : SUCCEED) +#define H5TS_mutex_lock(mutex) (H5_UNLIKELY(mtx_lock(mutex) != thrd_success) ? FAIL : SUCCEED) #define H5TS_mutex_unlock(mutex) (H5_UNLIKELY(mtx_unlock(mutex) != thrd_success) ? FAIL : SUCCEED) #else @@ -94,8 +94,8 @@ H5TS_mutex_unlock(H5TS_mutex_t *mutex) } /* end H5TS_mutex_unlock() */ #else -#define H5TS_mutex_lock(mutex) (H5_UNLIKELY(pthread_mutex_lock(mutex)) ? FAIL : SUCCEED) -#define H5TS_mutex_unlock(mutex) (H5_UNLIKELY(pthread_mutex_unlock(mutex)) ? FAIL : SUCCEED) +#define H5TS_mutex_lock(mutex) (H5_UNLIKELY(0 != pthread_mutex_lock(mutex)) ? FAIL : SUCCEED) +#define H5TS_mutex_unlock(mutex) (H5_UNLIKELY(0 != pthread_mutex_unlock(mutex)) ? FAIL : SUCCEED) #endif #endif diff --git a/src/H5TSonce.c b/src/H5TSonce.c index 492dd1de4c0..71d56884ba0 100644 --- a/src/H5TSonce.c +++ b/src/H5TSonce.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSpkg.h b/src/H5TSpkg.h index b90f4110d6b..47ab8cb7720 100644 --- a/src/H5TSpkg.h +++ b/src/H5TSpkg.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSpool.c b/src/H5TSpool.c index 3099543ba5f..48cfb1446f5 100644 --- a/src/H5TSpool.c +++ b/src/H5TSpool.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSpool.h b/src/H5TSpool.h index 5953097b45d..4d0b0337cc3 100644 --- a/src/H5TSpool.h +++ b/src/H5TSpool.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSprivate.h b/src/H5TSprivate.h index 64fd567a9bb..1e62a4ec9af 100644 --- a/src/H5TSprivate.h +++ b/src/H5TSprivate.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -300,11 +300,13 @@ H5_DLL herr_t H5TS_mutex_destroy(H5TS_mutex_t *mutex); /* R/W locks */ H5_DLL herr_t H5TS_rwlock_init(H5TS_rwlock_t *lock); /* R/W lock & unlock calls are defined in H5TSrwlock.h */ +#if !defined(__cplusplus) static inline herr_t H5TS_rwlock_rdlock(H5TS_rwlock_t *lock); static inline herr_t H5TS_rwlock_rdunlock(H5TS_rwlock_t *lock); static inline herr_t H5TS_rwlock_wrlock(H5TS_rwlock_t *lock); static inline herr_t H5TS_rwlock_wrunlock(H5TS_rwlock_t *lock); -H5_DLL herr_t H5TS_rwlock_destroy(H5TS_rwlock_t *lock); +#endif +H5_DLL herr_t H5TS_rwlock_destroy(H5TS_rwlock_t *lock); /* Condition variable operations */ H5_DLL herr_t H5TS_cond_init(H5TS_cond_t *cond); @@ -325,11 +327,13 @@ H5_DLL void H5TS_thread_yield(void); /* Thread pools */ H5_DLL herr_t H5TS_pool_create(H5TS_pool_t **pool, unsigned num_threads); /* Thread pool add task call is defined in H5TSpool.h */ +#if !defined(__cplusplus) static inline herr_t H5TS_pool_add_task(H5TS_pool_t *pool, H5TS_thread_start_func_t func, void *ctx); -H5_DLL herr_t H5TS_pool_destroy(H5TS_pool_t *pool); +#endif +H5_DLL herr_t H5TS_pool_destroy(H5TS_pool_t *pool); /* Emulated C11 atomics */ -#if !(defined(H5_HAVE_STDATOMIC_H) && !defined(__cplusplus)) +#if !defined(H5_HAVE_STDATOMIC_H) && !defined(__cplusplus) /* atomic_int */ H5_DLL void H5TS_atomic_init_int(H5TS_atomic_int_t *obj, int desired); /* Atomic 'int' load, store, etc. calls are defined in H5TSatomic.h */ @@ -360,26 +364,32 @@ H5_DLL void H5TS_atomic_destroy_voidp(H5TS_atomic_voidp_t *obj); /* Barrier related function declarations */ H5_DLL herr_t H5TS_barrier_init(H5TS_barrier_t *barrier, unsigned count); /* Barrier wait call is defined in H5TSbarrier.h */ +#if !defined(__cplusplus) static inline herr_t H5TS_barrier_wait(H5TS_barrier_t *barrier); -H5_DLL herr_t H5TS_barrier_destroy(H5TS_barrier_t *barrier); +#endif /* H5_HAVE_PTHREAD_BARRIER */ +H5_DLL herr_t H5TS_barrier_destroy(H5TS_barrier_t *barrier); H5_DLL herr_t H5TS_semaphore_init(H5TS_semaphore_t *sem, unsigned initial_count); /* Semaphore signal & wait calls are defined in H5TSsemaphore.h */ +#if !defined(__cplusplus) static inline herr_t H5TS_semaphore_signal(H5TS_semaphore_t *sem); static inline herr_t H5TS_semaphore_wait(H5TS_semaphore_t *sem); -H5_DLL herr_t H5TS_semaphore_destroy(H5TS_semaphore_t *sem); +#endif +H5_DLL herr_t H5TS_semaphore_destroy(H5TS_semaphore_t *sem); /* Headers with inlined routines */ #include "H5TScond.h" #include "H5TSmutex.h" #include "H5TSkey.h" -#if !(defined(H5_HAVE_STDATOMIC_H) && !defined(__cplusplus)) +#if !defined(__cplusplus) +#if !defined(H5_HAVE_STDATOMIC_H) #include "H5TSatomic.h" #endif /* H5_HAVE_STDATOMIC_H */ #include "H5TSbarrier.h" #include "H5TSrwlock.h" #include "H5TSsemaphore.h" #include "H5TSpool.h" +#endif #endif /* H5_HAVE_THREADS */ diff --git a/src/H5TSpthread.c b/src/H5TSpthread.c index e8774b67979..56715654694 100644 --- a/src/H5TSpthread.c +++ b/src/H5TSpthread.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -73,7 +73,7 @@ void H5TS__pthread_first_thread_init(void) { - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY /* Initialize H5TS package */ H5TS__init(); diff --git a/src/H5TSrec_rwlock.c b/src/H5TSrec_rwlock.c index e191aa3a290..6c8f1a76bd9 100644 --- a/src/H5TSrec_rwlock.c +++ b/src/H5TSrec_rwlock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -539,7 +539,7 @@ H5TS__rec_rwlock_wrlock(H5TS_rec_rwlock_t *lock) bool have_mutex = false; herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY if (H5_UNLIKELY(NULL == lock)) HGOTO_DONE(FAIL); @@ -619,7 +619,7 @@ H5TS__rec_rwlock_rdunlock(H5TS_rec_rwlock_t *lock) bool have_mutex = false; herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY if (H5_UNLIKELY(NULL == lock)) HGOTO_DONE(FAIL); @@ -694,7 +694,7 @@ H5TS__rec_rwlock_wrunlock(H5TS_rec_rwlock_t *lock) bool have_mutex = false; herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY if (H5_UNLIKELY(NULL == lock)) HGOTO_DONE(FAIL); diff --git a/src/H5TSrwlock.c b/src/H5TSrwlock.c index d8f772318a5..70b7c27687f 100644 --- a/src/H5TSrwlock.c +++ b/src/H5TSrwlock.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSrwlock.h b/src/H5TSrwlock.h index 16c36d46e5e..951f4569b3d 100644 --- a/src/H5TSrwlock.h +++ b/src/H5TSrwlock.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSsemaphore.c b/src/H5TSsemaphore.c index 231058b5476..e3f64780497 100644 --- a/src/H5TSsemaphore.c +++ b/src/H5TSsemaphore.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSsemaphore.h b/src/H5TSsemaphore.h index 340b1cf9a11..56a52300e90 100644 --- a/src/H5TSsemaphore.h +++ b/src/H5TSsemaphore.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSthread.c b/src/H5TSthread.c index f8bd1aebe0a..3e2f13c5afc 100644 --- a/src/H5TSthread.c +++ b/src/H5TSthread.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5TSwin.c b/src/H5TSwin.c index 913dbff0099..b82f364bdd2 100644 --- a/src/H5TSwin.c +++ b/src/H5TSwin.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -79,7 +79,7 @@ H5TS__win32_process_enter(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex) { BOOL ret_value = TRUE; - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY /* Initialize H5TS package */ if (H5_UNLIKELY(H5TS__init() < 0)) @@ -102,7 +102,7 @@ H5TS__win32_process_enter(PINIT_ONCE InitOnce, PVOID Parameter, PVOID *lpContex) static herr_t H5TS__win32_thread_enter(void) { - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY /* Currently a placeholder function. TLS setup is performed * elsewhere in the library. @@ -129,7 +129,7 @@ H5TS__win32_thread_exit(void) { herr_t ret_value = SUCCEED; - FUNC_ENTER_NOAPI_NAMECHECK_ONLY + FUNC_ENTER_PACKAGE_NAMECHECK_ONLY /* Windows uses a different thread local storage mechanism which does * not support auto-freeing like pthreads' keys. diff --git a/src/H5Tarray.c b/src/H5Tarray.c index 620b4834e60..24d2786d06b 100644 --- a/src/H5Tarray.c +++ b/src/H5Tarray.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tbit.c b/src/H5Tbit.c index c8300b85cde..06fd1a34d0e 100644 --- a/src/H5Tbit.c +++ b/src/H5Tbit.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -231,7 +231,7 @@ H5T__bit_shift(uint8_t *buf, ssize_t shift_dist, size_t offset, size_t size) *------------------------------------------------------------------------- */ uint64_t -H5T__bit_get_d(uint8_t *buf, size_t offset, size_t size) +H5T__bit_get_d(const uint8_t *buf, size_t offset, size_t size) { uint64_t val = 0; size_t i, hs; diff --git a/src/H5Tcommit.c b/src/H5Tcommit.c index d30ddd00bd4..a30985e3058 100644 --- a/src/H5Tcommit.c +++ b/src/H5Tcommit.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tcomplex.c b/src/H5Tcomplex.c new file mode 100644 index 00000000000..c073ddadbf8 --- /dev/null +++ b/src/H5Tcomplex.c @@ -0,0 +1,152 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Module Info: This module contains the functionality for complex number + * datatypes in the H5T interface. + */ + +/****************/ +/* Module Setup */ +/****************/ + +#include "H5Tmodule.h" /* This source code file is part of the H5T module */ + +/***********/ +/* Headers */ +/***********/ +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Tpkg.h" /* Datatypes */ + +/****************/ +/* Local Macros */ +/****************/ + +/******************/ +/* Local Typedefs */ +/******************/ + +/********************/ +/* Package Typedefs */ +/********************/ + +/********************/ +/* Local Prototypes */ +/********************/ + +/*********************/ +/* Public Variables */ +/*********************/ + +/*********************/ +/* Package Variables */ +/*********************/ + +/*****************************/ +/* Library Private Variables */ +/*****************************/ + +/*******************/ +/* Local Variables */ +/*******************/ + +/*------------------------------------------------------------------------- + * Function: H5Tcomplex_create + * + * Purpose: Create a new complex number datatype based on the specified + * base datatype ID. + * + * Return: Success: ID of new complex number datatype + * Failure: H5I_INVALID_HID + * + *------------------------------------------------------------------------- + */ +hid_t +H5Tcomplex_create(hid_t base_type_id) +{ + H5T_t *base = NULL; /* base datatype */ + H5T_t *dt = NULL; /* new datatype */ + hid_t ret_value = H5I_INVALID_HID; /* return value */ + + FUNC_ENTER_API(H5I_INVALID_HID) + + if (NULL == (base = (H5T_t *)H5I_object_verify(base_type_id, H5I_DATATYPE))) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, H5I_INVALID_HID, "invalid base datatype ID"); + + if (NULL == (dt = H5T__complex_create(base))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTINIT, H5I_INVALID_HID, + "can't create complex number datatype from base datatype"); + + if ((ret_value = H5I_register(H5I_DATATYPE, dt, true)) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTREGISTER, H5I_INVALID_HID, "unable to register datatype"); + +done: + FUNC_LEAVE_API(ret_value); +} + +/*------------------------------------------------------------------------- + * Function: H5T__complex_create + * + * Purpose: Create a new complex number datatype based on the specified + * base datatype. + * + * Return: Success: new complex number datatype + * Failure: NULL + * + *------------------------------------------------------------------------- + */ +H5T_t * +H5T__complex_create(const H5T_t *base) +{ + H5T_t *dt = NULL; /* New complex number datatype */ + H5T_t *ret_value = NULL; /* Return value */ + + FUNC_ENTER_PACKAGE + + /* Check args */ + assert(base); + + /* Currently, only floating-point base datatypes are supported. */ + if (base->shared->type != H5T_FLOAT) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, NULL, "base datatype is not a H5T_FLOAT datatype"); + if (base->shared->size == 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, NULL, "invalid base datatype size"); + if (base->shared->size > SIZE_MAX / 2) + HGOTO_ERROR(H5E_DATATYPE, H5E_BADVALUE, NULL, + "base datatype size too large - new datatype size would overflow"); + + /* Build new type */ + if (NULL == (dt = H5T__alloc())) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, NULL, "memory allocation failed"); + dt->shared->type = H5T_COMPLEX; + dt->shared->size = 2 * base->shared->size; + + if (NULL == (dt->shared->parent = H5T_copy(base, H5T_COPY_ALL))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, NULL, "can't copy base datatype"); + + /* Set complex number-specific fields */ + dt->shared->u.cplx.form = H5T_COMPLEX_RECTANGULAR; /* Only rectangular form is currently supported */ + + /* Complex number datatypes use a later version of the datatype object header message */ + dt->shared->version = MAX(base->shared->version, H5O_DTYPE_VERSION_5); + + ret_value = dt; + +done: + if (!ret_value) + if (dt && H5T_close(dt) < 0) + HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, NULL, "can't close datatype"); + + FUNC_LEAVE_NOAPI(ret_value) +} diff --git a/src/H5Tcompound.c b/src/H5Tcompound.c index eb39dd4e98a..4131c61e474 100644 --- a/src/H5Tcompound.c +++ b/src/H5Tcompound.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -503,6 +503,8 @@ H5T__pack(const H5T_t *dt) /* Adjust size of datatype appropriately */ if (dt->shared->type == H5T_ARRAY) dt->shared->size = dt->shared->parent->shared->size * dt->shared->u.array.nelem; + else if (dt->shared->type == H5T_COMPLEX) + dt->shared->size = 2 * dt->shared->parent->shared->size; else if (dt->shared->type != H5T_VLEN) dt->shared->size = dt->shared->parent->shared->size; } /* end if */ diff --git a/src/H5Tconv.c b/src/H5Tconv.c index 0a5e89ee99c..7ca3ca6ca3e 100644 --- a/src/H5Tconv.c +++ b/src/H5Tconv.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -28,21 +28,13 @@ #include "H5private.h" /* Generic Functions */ #include "H5CXprivate.h" /* API Contexts */ #include "H5Eprivate.h" /* Error handling */ +#include "H5Tconv.h" /* Datatype Conversions */ #include "H5Tpkg.h" /* Datatypes */ /****************/ /* Local Macros */ /****************/ -/* Swap two elements (I & J) of an array using a temporary variable */ -#define H5_SWAP_BYTES(ARRAY, I, J) \ - do { \ - uint8_t _tmp; \ - _tmp = ARRAY[I]; \ - ARRAY[I] = ARRAY[J]; \ - ARRAY[J] = _tmp; \ - } while (0) - /******************/ /* Local Typedefs */ /******************/ @@ -185,27 +177,47 @@ H5T_get_force_conv(const H5T_t *dt) *------------------------------------------------------------------------- */ herr_t -H5T__reverse_order(uint8_t *rev, uint8_t *s, size_t size, H5T_order_t order) +H5T__reverse_order(uint8_t *rev, uint8_t *s, const H5T_t *dtype) { - size_t i; + H5T_order_t order; + size_t size; FUNC_ENTER_PACKAGE_NOERR assert(s); - assert(size); + assert(dtype); + assert(H5T_IS_ATOMIC(dtype->shared) || H5T_COMPLEX == dtype->shared->type); + + size = dtype->shared->size; + + if (H5T_IS_ATOMIC(dtype->shared)) + order = dtype->shared->u.atomic.order; + else + order = dtype->shared->parent->shared->u.atomic.order; if (H5T_ORDER_VAX == order) { - for (i = 0; i < size; i += 2) { + for (size_t i = 0; i < size; i += 2) { rev[i] = s[(size - 2) - i]; rev[i + 1] = s[(size - 1) - i]; } } else if (H5T_ORDER_BE == order) { - for (i = 0; i < size; i++) - rev[size - (i + 1)] = s[i]; + if (H5T_IS_ATOMIC(dtype->shared)) { + for (size_t i = 0; i < size; i++) + rev[size - (i + 1)] = s[i]; + } + else { + size_t part_size = size / 2; + for (size_t i = 0; i < part_size; i++) + rev[part_size - (i + 1)] = s[i]; + rev += part_size; + s += part_size; + for (size_t i = 0; i < part_size; i++) + rev[part_size - (i + 1)] = s[i]; + } } else { - for (i = 0; i < size; i++) + for (size_t i = 0; i < size; i++) rev[i] = s[i]; } @@ -255,12 +267,12 @@ H5T__conv_noop(const H5T_t H5_ATTR_UNUSED *src, const H5T_t H5_ATTR_UNUSED *dst, /*------------------------------------------------------------------------- * Function: H5T__conv_order * - * Purpose: Convert one type to another when byte order is the only - * difference. + * Purpose: Convert one type to another when byte order is the only + * difference. * - * Note: This is a soft conversion function. + * Note: This is a soft conversion function. * - * Return: Non-negative on success/Negative on failure + * Return: Non-negative on success/Negative on failure * *------------------------------------------------------------------------- */ @@ -269,10 +281,13 @@ H5T__conv_order(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t H5_ATTR_UNUSED *conv_ctx, size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf, void H5_ATTR_UNUSED *background) { - uint8_t *buf = (uint8_t *)_buf; - size_t i; - size_t j, md; - herr_t ret_value = SUCCEED; /* Return value */ + H5T_order_t src_order, dst_order; + uint8_t *buf = (uint8_t *)_buf; + size_t src_offset, dst_offset; + size_t src_size, dst_size; + size_t i; + size_t j, md; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -281,12 +296,38 @@ H5T__conv_order(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, /* Capability query */ if (NULL == src || NULL == dst) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); - if (src->shared->size != dst->shared->size || 0 != src->shared->u.atomic.offset || - 0 != dst->shared->u.atomic.offset || - !((H5T_ORDER_BE == src->shared->u.atomic.order && - H5T_ORDER_LE == dst->shared->u.atomic.order) || - (H5T_ORDER_LE == src->shared->u.atomic.order && - H5T_ORDER_BE == dst->shared->u.atomic.order))) + + src_size = src->shared->size; + dst_size = dst->shared->size; + if (src_size != dst_size) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + + if (src->shared->parent) { + if (!H5T_IS_ATOMIC(src->shared->parent->shared)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + src_offset = src->shared->parent->shared->u.atomic.offset; + src_order = src->shared->parent->shared->u.atomic.order; + } + else { + src_offset = src->shared->u.atomic.offset; + src_order = src->shared->u.atomic.order; + } + if (dst->shared->parent) { + if (!H5T_IS_ATOMIC(dst->shared->parent->shared)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + dst_offset = dst->shared->parent->shared->u.atomic.offset; + dst_order = dst->shared->parent->shared->u.atomic.order; + } + else { + dst_offset = dst->shared->u.atomic.offset; + dst_order = dst->shared->u.atomic.order; + } + + if (0 != src_offset || 0 != dst_offset) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + + if (!((H5T_ORDER_BE == src_order && H5T_ORDER_LE == dst_order) || + (H5T_ORDER_LE == src_order && H5T_ORDER_BE == dst_order))) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); switch (src->shared->type) { case H5T_INTEGER: @@ -307,6 +348,23 @@ H5T__conv_order(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, } /* end if */ break; + case H5T_COMPLEX: { + const H5T_shared_t *src_base_sh = src->shared->parent->shared; + const H5T_shared_t *dst_base_sh = dst->shared->parent->shared; + + if (src_base_sh->u.atomic.u.f.sign != dst_base_sh->u.atomic.u.f.sign || + src_base_sh->u.atomic.u.f.epos != dst_base_sh->u.atomic.u.f.epos || + src_base_sh->u.atomic.u.f.esize != dst_base_sh->u.atomic.u.f.esize || + src_base_sh->u.atomic.u.f.ebias != dst_base_sh->u.atomic.u.f.ebias || + src_base_sh->u.atomic.u.f.mpos != dst_base_sh->u.atomic.u.f.mpos || + src_base_sh->u.atomic.u.f.msize != dst_base_sh->u.atomic.u.f.msize || + src_base_sh->u.atomic.u.f.norm != dst_base_sh->u.atomic.u.f.norm || + src_base_sh->u.atomic.u.f.pad != dst_base_sh->u.atomic.u.f.pad) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + + break; + } + case H5T_NO_CLASS: case H5T_TIME: case H5T_STRING: @@ -328,11 +386,41 @@ H5T__conv_order(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, if (NULL == src) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); - buf_stride = buf_stride ? buf_stride : src->shared->size; - md = src->shared->size / 2; - for (i = 0; i < nelmts; i++, buf += buf_stride) - for (j = 0; j < md; j++) - H5_SWAP_BYTES(buf, j, src->shared->size - (j + 1)); + src_size = src->shared->size; + buf_stride = buf_stride ? buf_stride : src_size; + md = src_size / 2; + + /* Complex number types are composed of two floating-point + * elements, each of which is half the size of the datatype + * and have to be converted separately. While halving the + * source datatype size and doubling the number elements to + * be converted works in some cases, structure padding can + * cause issues with that approach, so we special-case + * conversions on complex numbers here. + */ + if (H5T_COMPLEX == src->shared->type) { + size_t part_size = src_size / 2; + + md = part_size / 2; + for (i = 0; i < nelmts; i++, buf += buf_stride) { + uint8_t *cur_part = buf; + + /* Convert real part of complex number element */ + for (j = 0; j < md; j++) + H5_SWAP_BYTES(cur_part, j, part_size - (j + 1)); + + /* Convert imaginary part of complex number element */ + cur_part += part_size; + for (j = 0; j < md; j++) + H5_SWAP_BYTES(cur_part, j, part_size - (j + 1)); + } + } + else { + for (i = 0; i < nelmts; i++, buf += buf_stride) + for (j = 0; j < md; j++) + H5_SWAP_BYTES(buf, j, src_size - (j + 1)); + } + break; case H5T_CONV_FREE: @@ -350,13 +438,13 @@ H5T__conv_order(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, /*------------------------------------------------------------------------- * Function: H5T__conv_order_opt * - * Purpose: Convert one type to another when byte order is the only - * difference. This is the optimized version of H5T__conv_order() - * for a handful of different sizes. + * Purpose: Convert one type to another when byte order is the only + * difference. This is the optimized version of + * H5T__conv_order() for a handful of different sizes. * - * Note: This is a soft conversion function. + * Note: This is a soft conversion function. * - * Return: Non-negative on success/Negative on failure + * Return: Non-negative on success/Negative on failure * *------------------------------------------------------------------------- */ @@ -365,9 +453,12 @@ H5T__conv_order_opt(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t H5_ATTR_UNUSED *conv_ctx, size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *_buf, void H5_ATTR_UNUSED *background) { - uint8_t *buf = (uint8_t *)_buf; - size_t i; - herr_t ret_value = SUCCEED; /* Return value */ + H5T_order_t src_order, dst_order; + uint8_t *buf = (uint8_t *)_buf; + size_t src_offset, dst_offset; + size_t src_size, dst_size; + size_t i; + herr_t ret_value = SUCCEED; /* Return value */ FUNC_ENTER_PACKAGE @@ -376,19 +467,43 @@ H5T__conv_order_opt(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, /* Capability query */ if (NULL == src || NULL == dst) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); - if (src->shared->size != dst->shared->size || 0 != src->shared->u.atomic.offset || - 0 != dst->shared->u.atomic.offset) + + src_size = src->shared->size; + dst_size = dst->shared->size; + if (src_size != dst_size) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + + if (src->shared->parent) { + if (!H5T_IS_ATOMIC(src->shared->parent->shared)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + src_offset = src->shared->parent->shared->u.atomic.offset; + src_order = src->shared->parent->shared->u.atomic.order; + } + else { + src_offset = src->shared->u.atomic.offset; + src_order = src->shared->u.atomic.order; + } + if (dst->shared->parent) { + if (!H5T_IS_ATOMIC(dst->shared->parent->shared)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); + dst_offset = dst->shared->parent->shared->u.atomic.offset; + dst_order = dst->shared->parent->shared->u.atomic.order; + } + else { + dst_offset = dst->shared->u.atomic.offset; + dst_order = dst->shared->u.atomic.order; + } + + if (0 != src_offset || 0 != dst_offset) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); if ((src->shared->type == H5T_REFERENCE && dst->shared->type != H5T_REFERENCE) || (dst->shared->type == H5T_REFERENCE && src->shared->type != H5T_REFERENCE)) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); - if (src->shared->type != H5T_REFERENCE && !((H5T_ORDER_BE == src->shared->u.atomic.order && - H5T_ORDER_LE == dst->shared->u.atomic.order) || - (H5T_ORDER_LE == src->shared->u.atomic.order && - H5T_ORDER_BE == dst->shared->u.atomic.order))) + if (src->shared->type != H5T_REFERENCE && + !((H5T_ORDER_BE == src_order && H5T_ORDER_LE == dst_order) || + (H5T_ORDER_LE == src_order && H5T_ORDER_BE == dst_order))) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); - if (src->shared->size != 1 && src->shared->size != 2 && src->shared->size != 4 && - src->shared->size != 8 && src->shared->size != 16) + if (src_size != 1 && src_size != 2 && src_size != 4 && src_size != 8 && src_size != 16) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); switch (src->shared->type) { case H5T_INTEGER: @@ -417,6 +532,10 @@ H5T__conv_order_opt(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, case H5T_ENUM: case H5T_VLEN: case H5T_ARRAY: + /* Complex numbers require some special-case logic for + * proper handling. Defer to H5T__conv_order for these types. + */ + case H5T_COMPLEX: case H5T_NCLASSES: default: HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "conversion not supported"); diff --git a/src/H5Tconv.h b/src/H5Tconv.h index 4dae848269d..fb9ba26e311 100644 --- a/src/H5Tconv.h +++ b/src/H5Tconv.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -25,6 +25,15 @@ /* Length of debugging name buffer */ #define H5T_NAMELEN 32 +/* Swap two elements (I & J) of an array using a temporary variable */ +#define H5_SWAP_BYTES(ARRAY, I, J) \ + do { \ + uint8_t _tmp; \ + _tmp = ARRAY[I]; \ + ARRAY[I] = ARRAY[J]; \ + ARRAY[J] = _tmp; \ + } while (0) + /****************************/ /* Library Private Typedefs */ /****************************/ @@ -184,7 +193,7 @@ H5_DLL herr_t H5T__conv_order_opt(const H5T_t *src, const H5T_t *dst, H5T_cdata_ size_t bkg_stride, void *_buf, void *bkg); /* Utility functions */ -H5_DLL herr_t H5T__reverse_order(uint8_t *rev, uint8_t *s, size_t size, H5T_order_t order); +H5_DLL herr_t H5T__reverse_order(uint8_t *rev, uint8_t *s, const H5T_t *dtype); /* Debugging functions */ H5_DLL herr_t H5T__print_path_stats(H5T_path_t *path, int *nprint /*in,out*/); diff --git a/src/H5Tconv_array.c b/src/H5Tconv_array.c index e192c7267e0..35f63931866 100644 --- a/src/H5Tconv_array.c +++ b/src/H5Tconv_array.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,9 +22,10 @@ /***********/ /* Headers */ /***********/ -#include "H5Eprivate.h" -#include "H5Iprivate.h" -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_array.h" /******************/ diff --git a/src/H5Tconv_array.h b/src/H5Tconv_array.h index be1ba8ff5f1..e2aaec1829b 100644 --- a/src/H5Tconv_array.h +++ b/src/H5Tconv_array.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tconv_bitfield.c b/src/H5Tconv_bitfield.c index 486036ad260..8b46c75c5c5 100644 --- a/src/H5Tconv_bitfield.c +++ b/src/H5Tconv_bitfield.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ /***********/ /* Headers */ /***********/ -#include "H5Eprivate.h" -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_bitfield.h" /*------------------------------------------------------------------------- @@ -105,7 +106,9 @@ H5T__conv_b_b(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ } /* Allocate space for order-reversed source buffer */ - src_rev = (uint8_t *)H5MM_calloc(src->shared->size); + if (conv_ctx->u.conv.cb_struct.func) + if (NULL == (src_rev = H5MM_calloc(src->shared->size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "unable to allocate temporary buffer"); /* The conversion loop */ H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t); @@ -161,8 +164,7 @@ H5T__conv_b_b(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ if (src->shared->u.atomic.prec > dst->shared->u.atomic.prec) { /*overflow*/ if (conv_ctx->u.conv.cb_struct.func) { /*If user's exception handler is present, use it*/ - H5T__reverse_order(src_rev, s, src->shared->size, - src->shared->u.atomic.order); /*reverse order first*/ + H5T__reverse_order(src_rev, s, src); /*reverse order first*/ except_ret = (conv_ctx->u.conv.cb_struct.func)( H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); diff --git a/src/H5Tconv_bitfield.h b/src/H5Tconv_bitfield.h index aece3c38a12..806aff3f23e 100644 --- a/src/H5Tconv_bitfield.h +++ b/src/H5Tconv_bitfield.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tconv_complex.c b/src/H5Tconv_complex.c new file mode 100644 index 00000000000..cdd2402cb0f --- /dev/null +++ b/src/H5Tconv_complex.c @@ -0,0 +1,2315 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Purpose: Datatype conversion functions for complex number datatypes + */ + +/****************/ +/* Module Setup */ +/****************/ +#include "H5Tmodule.h" /* This source code file is part of the H5T module */ + +/***********/ +/* Headers */ +/***********/ +#include "H5Eprivate.h" +#include "H5Tconv.h" +#include "H5Tconv_macros.h" +#include "H5Tconv_complex.h" +#include "H5Tconv_integer.h" +#include "H5Tconv_float.h" + +/******************/ +/* Local Typedefs */ +/******************/ + +/********************/ +/* Local Prototypes */ +/********************/ + +static herr_t H5T__conv_complex_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, void *buf); +static herr_t H5T__conv_complex_part(const H5T_t *src_p, const H5T_t *dst_p, uint8_t *s, uint8_t *d, + const H5T_conv_ctx_t *conv_ctx, uint8_t *src_rev, + bool *exception_handled); + +/*------------------------------------------------------------------------- + * Function: H5T__conv_complex + * + * Purpose: Convert one complex number type to another. This is the + * catch-all function for complex number conversions and is + * probably not particularly fast. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_complex(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_PACKAGE + + switch (cdata->command) { + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (!H5T_IS_ATOMIC(src_p->shared->parent->shared)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid source complex number datatype"); + if (!H5T_IS_ATOMIC(dst_p->shared->parent->shared)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid destination complex number datatype"); + src_atomic = src_p->shared->parent->shared->u.atomic; + dst_atomic = dst_p->shared->parent->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order && + H5T_ORDER_VAX != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for source datatype"); + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order && + H5T_ORDER_VAX != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for destination datatype"); + if (dst_p->shared->size > 2 * TEMP_FLOAT_CONV_BUFFER_SIZE) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination datatype size is too large"); + if (8 * sizeof(int64_t) - 1 < src_atomic.u.f.esize || + 8 * sizeof(int64_t) - 1 < dst_atomic.u.f.esize) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); + cdata->need_bkg = H5T_BKG_NO; + + break; + } + + case H5T_CONV_FREE: + break; + + case H5T_CONV_CONV: + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (NULL == conv_ctx) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); + + if (H5T__conv_complex_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); + + break; + + default: + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_complex() */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_complex_loop + * + * Purpose: Implements the body of the conversion loop when converting + * complex number values to another complex number type. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +static herr_t +H5T__conv_complex_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, + size_t buf_stride, void *buf) +{ + H5T_conv_float_specval_t realval_type; /* floating-point value type (regular, +/-Inf, +/-0, NaN) */ + H5T_conv_float_specval_t imagval_type; /* floating-point value type (regular, +/-Inf, +/-0, NaN) */ + H5T_conv_ret_t except_ret; /* return of conversion exception callback function */ + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + ssize_t src_delta, dst_delta; /* source & destination stride */ + uint8_t *s, *sp, *d, *dp; /* source and dest traversal ptrs */ + uint8_t *src_rev = NULL; /* order-reversed source buffer */ + uint8_t dbuf[2 * TEMP_FLOAT_CONV_BUFFER_SIZE]; /* temp destination buffer */ + size_t src_part_size; /* size of each complex number part */ + size_t dst_part_size; /* size of each complex number part */ + size_t olap; /* num overlapping elements */ + int direction; /* forward or backward traversal */ + herr_t ret_value = SUCCEED; + + assert(src_p); + assert(src_p->shared->type == H5T_COMPLEX); + assert(dst_p); + assert(dst_p->shared->type == H5T_COMPLEX); + assert(conv_ctx); + assert(buf); + + FUNC_ENTER_PACKAGE + + src_atomic = src_p->shared->parent->shared->u.atomic; + dst_atomic = dst_p->shared->parent->shared->u.atomic; + src_part_size = src_p->shared->size / 2; + dst_part_size = dst_p->shared->size / 2; + + /* + * Do we process the values from beginning to end or vice versa? Also, + * how many of the elements have the source and destination areas + * overlapping? + */ + if (src_p->shared->size == dst_p->shared->size || buf_stride) { + sp = dp = (uint8_t *)buf; + direction = 1; + olap = nelmts; + } + else if (src_p->shared->size >= dst_p->shared->size) { + double olap_d = + ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); + olap = (size_t)olap_d; + sp = dp = (uint8_t *)buf; + direction = 1; + } + else { + double olap_d = + ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); + olap = (size_t)olap_d; + sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; + dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; + direction = -1; + } + + /* Direction & size of buffer traversal */ + H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t); + H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t); + H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t); + src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size); + dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size); + + /* Allocate space for order-reversed source buffer */ + if (conv_ctx->u.conv.cb_struct.func) + if (NULL == (src_rev = H5MM_calloc(src_p->shared->size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "couldn't allocate temporary buffer"); + + /* The conversion loop */ + for (size_t elmtno = 0; elmtno < nelmts; elmtno++) { + bool reverse = true; /* if reversed the order of destination */ + bool real_zero = false; /* if real part is +/-0 */ + bool imag_zero = false; /* if imaginary part is +/-0 */ + bool real_except = false; /* if an exception happened for the real part */ + bool imag_except = false; /* if an exception happened for the imaginary part */ + + /* + * If the source and destination buffers overlap then use a + * temporary buffer for the destination. + */ + s = sp; + if (direction > 0) + d = elmtno < olap ? dbuf : dp; + else + d = elmtno + olap >= nelmts ? dbuf : dp; + if (d == dbuf) + memset(dbuf, 0, sizeof(dbuf)); + +#ifndef NDEBUG + if (d == dbuf) { + assert((dp >= sp && dp < sp + src_p->shared->size) || + (sp >= dp && sp < dp + dst_p->shared->size)); + } + else { + assert((dp < sp && dp + dst_p->shared->size <= sp) || + (sp < dp && sp + src_p->shared->size <= dp)); + } +#endif + + /* + * Put the data in little endian order so our loops aren't so + * complicated. We'll do all the conversion stuff assuming + * little endian and then we'll fix the order at the end. + */ + if (H5T_ORDER_BE == src_atomic.order) { + uint8_t *cur_part = s; + /* Swap real part of complex number element */ + for (size_t j = 0; j < src_part_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, src_part_size - (j + 1)); + /* Swap imaginary part of complex number element */ + cur_part += src_part_size; + for (size_t j = 0; j < src_part_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, src_part_size - (j + 1)); + } + else if (H5T_ORDER_VAX == src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + + /* Check for special cases: +0, -0, +Inf, -Inf, NaN */ + realval_type = H5T__conv_float_find_special(s, &src_atomic, NULL); + imagval_type = H5T__conv_float_find_special(s + (src_p->shared->size / 2), &src_atomic, NULL); + + real_zero = (realval_type == H5T_CONV_FLOAT_SPECVAL_POSZERO || + realval_type == H5T_CONV_FLOAT_SPECVAL_NEGZERO); + imag_zero = (imagval_type == H5T_CONV_FLOAT_SPECVAL_POSZERO || + imagval_type == H5T_CONV_FLOAT_SPECVAL_NEGZERO); + real_except = + (realval_type == H5T_CONV_FLOAT_SPECVAL_POSINF || realval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF || + realval_type == H5T_CONV_FLOAT_SPECVAL_NAN); + imag_except = + (imagval_type == H5T_CONV_FLOAT_SPECVAL_POSINF || imagval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF || + imagval_type == H5T_CONV_FLOAT_SPECVAL_NAN); + + /* A complex number is zero if both parts are +/-0 */ + if (real_zero && imag_zero) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_copy(d + dst_part_size, dst_atomic.u.f.sign, s + src_part_size, src_atomic.u.f.sign, + (size_t)1); + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, false); + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.epos, dst_atomic.u.f.esize, false); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + goto padding; + } + else if (real_except || imag_except) { + except_ret = H5T_CONV_UNHANDLED; + + /* If user's exception handler is present, use it */ + if (conv_ctx->u.conv.cb_struct.func) { + H5T_conv_except_t except_type; /* type of conversion exception that occurred */ + + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + /* + * A complex number is infinity if either part is infinity, + * even if the other part is NaN. If a part is infinity, + * since we can only throw one type of conversion exception, + * arbitrarily choose the exception type to throw based + * on the infinity type for the real part (if it's infinity), + * followed by the infinity type for the imaginary part. For + * now, it will be assumed that the conversion exception + * callback will inspect and handle both parts of the complex + * number value. + */ + if (realval_type == H5T_CONV_FLOAT_SPECVAL_POSINF) + except_type = H5T_CONV_EXCEPT_PINF; + else if (realval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) + except_type = H5T_CONV_EXCEPT_NINF; + else if (imagval_type == H5T_CONV_FLOAT_SPECVAL_POSINF) + except_type = H5T_CONV_EXCEPT_PINF; + else if (imagval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) + except_type = H5T_CONV_EXCEPT_NINF; + else { + assert(realval_type == H5T_CONV_FLOAT_SPECVAL_NAN || + imagval_type == H5T_CONV_FLOAT_SPECVAL_NAN); + except_type = H5T_CONV_EXCEPT_NAN; + } + + except_ret = (conv_ctx->u.conv.cb_struct.func)(except_type, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, + conv_ctx->u.conv.cb_struct.user_data); + } + + if (except_ret == H5T_CONV_UNHANDLED) { + if (realval_type == H5T_CONV_FLOAT_SPECVAL_POSINF || + realval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF || + imagval_type == H5T_CONV_FLOAT_SPECVAL_POSINF || + imagval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_copy(d + dst_part_size, dst_atomic.u.f.sign, s + src_part_size, + src_atomic.u.f.sign, (size_t)1); + + if (realval_type == H5T_CONV_FLOAT_SPECVAL_POSINF || + realval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) { + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, true); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + /* If the destination has no implied mantissa bit, we'll need to set + * the 1st bit of mantissa to 1. The Intel-Linux "long double" is + * this case. */ + if (H5T_NORM_NONE == dst_atomic.u.f.norm) + H5T__bit_set(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - 1, (size_t)1, true); + } + if (imagval_type == H5T_CONV_FLOAT_SPECVAL_POSINF || + imagval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) { + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.epos, dst_atomic.u.f.esize, true); + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + /* If the destination has no implied mantissa bit, we'll need to set + * the 1st bit of mantissa to 1. The Intel-Linux "long double" is + * this case. */ + if (H5T_NORM_NONE == dst_atomic.u.f.norm) + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - 1, + (size_t)1, true); + } + } + else { + /* There are many NaN values, so we just set all bits of the significand. */ + if (realval_type == H5T_CONV_FLOAT_SPECVAL_NAN) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, true); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, true); + } + if (imagval_type == H5T_CONV_FLOAT_SPECVAL_NAN) { + H5T__bit_copy(d + dst_part_size, dst_atomic.u.f.sign, s + src_part_size, + src_atomic.u.f.sign, (size_t)1); + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.epos, dst_atomic.u.f.esize, true); + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, true); + } + } + } + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + + goto padding; + } + + if (real_zero) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, false); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + } + else { + bool exception_handled = false; + + if (H5T__conv_complex_part(src_p, dst_p, s, d, conv_ctx, src_rev, &exception_handled) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't convert real part of complex number"); + + /* If an exception was handled, go to the next element */ + if (exception_handled) { + reverse = false; + goto next; + } + } + + if (imag_zero) { + H5T__bit_copy(d + dst_part_size, dst_atomic.u.f.sign, s + src_part_size, src_atomic.u.f.sign, + (size_t)1); + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.epos, dst_atomic.u.f.esize, false); + H5T__bit_set(d + dst_part_size, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + } + else { + bool exception_handled = false; + + if (H5T__conv_complex_part(src_p, dst_p, s + src_part_size, d + dst_part_size, conv_ctx, src_rev, + &exception_handled) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, + "can't convert imaginary part of complex number"); + + /* If an exception was handled, go to the next element */ + if (exception_handled) { + reverse = false; + goto next; + } + } + +padding: + /* + * Set external padding areas + */ + if (dst_atomic.offset > 0) { + assert(H5T_PAD_ZERO == dst_atomic.lsb_pad || H5T_PAD_ONE == dst_atomic.lsb_pad); + H5T__bit_set(d, (size_t)0, dst_atomic.offset, (bool)(H5T_PAD_ONE == dst_atomic.lsb_pad)); + H5T__bit_set(d + dst_part_size, (size_t)0, dst_atomic.offset, + (bool)(H5T_PAD_ONE == dst_atomic.lsb_pad)); + } + { + size_t type_size = dst_p->shared->parent->shared->size; + + if (dst_atomic.offset + dst_atomic.prec != 8 * type_size) { + assert(H5T_PAD_ZERO == dst_atomic.msb_pad || H5T_PAD_ONE == dst_atomic.msb_pad); + H5T__bit_set(d, dst_atomic.offset + dst_atomic.prec, + 8 * type_size - (dst_atomic.offset + dst_atomic.prec), + (bool)(H5T_PAD_ONE == dst_atomic.msb_pad)); + H5T__bit_set(d + dst_part_size, dst_atomic.offset + dst_atomic.prec, + 8 * type_size - (dst_atomic.offset + dst_atomic.prec), + (bool)(H5T_PAD_ONE == dst_atomic.msb_pad)); + } + } + + /* Put the destination in the correct byte order. See note at beginning of loop. */ + if (H5T_ORDER_BE == dst_atomic.order && reverse) { + uint8_t *cur_part = d; + /* Swap real part of complex number element */ + for (size_t j = 0; j < dst_part_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, dst_part_size - (j + 1)); + /* Swap imaginary part of complex number element */ + cur_part += dst_part_size; + for (size_t j = 0; j < dst_part_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, dst_part_size - (j + 1)); + } + else if (H5T_ORDER_VAX == dst_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + +next: + /* + * If we had used a temporary buffer for the destination then we + * should copy the value to the true destination buffer. + */ + if (d == dbuf) + H5MM_memcpy(dp, d, dst_p->shared->size); + + /* Advance source & destination pointers by delta amounts */ + sp += src_delta; + dp += dst_delta; + } /* end conversion loop */ + +done: + H5MM_free(src_rev); + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_complex_loop() */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_complex_part + * + * Purpose: Helper function to convert a single part (real or + * imaginary) of a complex number. + * + * NOTE: The conversion logic in this function is essentially + * identical to the logic in the H5T__conv_f_f_loop function. + * However, conversion has to be performed on both the real + * and imaginary parts of each complex number element. Since + * complex numbers have the same representation as an array + * of two elements of the base floating-point type, this could + * be simulated in some cases with the H5T__conv_f_f_loop + * function by doubling the number of elements to be converted + * and halving the sizes involved. However, overlapping + * elements or a non-zero `buf_stride` value would complicate + * the buffer pointer advancements since each part of the + * complex number value has to be processed before advancing + * the buffer pointer. Conversion exceptions also pose a + * problem since both parts of the complex number have to be + * taken into account when determining if an exception + * occurred. Application conversion exception callbacks would + * also expect to receive an entire complex number rather than + * part of one. Therefore, the H5T__conv_f_f_loop logic is + * mostly duplicated here and fixes to one function should be + * made to the other, if appropriate. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +static herr_t +H5T__conv_complex_part(const H5T_t *src_p, const H5T_t *dst_p, uint8_t *s, uint8_t *d, + const H5T_conv_ctx_t *conv_ctx, uint8_t *src_rev, bool *exception_handled) +{ + H5T_conv_ret_t except_ret = H5T_CONV_UNHANDLED; /* return of conversion exception callback function */ + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + hssize_t expo_max; /* maximum possible dst exponent */ + ssize_t mant_msb = 0; /* most significant bit set in mantissa */ + int64_t expo; /* exponent */ + size_t msize = 0; /* useful size of mantissa in src */ + size_t mpos; /* offset to useful mant in src */ + size_t mrsh; /* amount to right shift mantissa */ + size_t implied; /* destination implied bits */ + bool denormalized = false; /* is either source or destination denormalized? */ + bool carry = false; /* carry after rounding mantissa */ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_PACKAGE + + assert(src_p); + assert(dst_p); + assert(s); + assert(d); + assert(conv_ctx); + assert(exception_handled); + + if (conv_ctx->u.conv.cb_struct.func) + assert(src_rev); + + *exception_handled = false; + + src_atomic = src_p->shared->parent->shared->u.atomic; + dst_atomic = dst_p->shared->parent->shared->u.atomic; + expo_max = ((hssize_t)1 << dst_atomic.u.f.esize) - 1; + + /* + * Get the exponent as an unsigned quantity from the section of + * the source bit field where it's located. Don't worry about + * the exponent bias yet. + */ + expo = (int64_t)H5T__bit_get_d(s, src_atomic.u.f.epos, src_atomic.u.f.esize); + + if (expo == 0) + denormalized = true; + + /* Determine size of mantissa */ + if (0 == expo || H5T_NORM_NONE == src_atomic.u.f.norm) { + if ((mant_msb = H5T__bit_find(s, src_atomic.u.f.mpos, src_atomic.u.f.msize, H5T_BIT_MSB, true)) > 0) + msize = (size_t)mant_msb; + else if (0 == mant_msb) { + msize = 1; + H5T__bit_set(s, src_atomic.u.f.mpos, (size_t)1, false); + } + } + else if (H5T_NORM_IMPLIED == src_atomic.u.f.norm) + msize = src_atomic.u.f.msize; + else + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet"); + + /* + * The sign for the destination is the same as the sign for the + * source in all cases. + */ + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + + /* + * Calculate the true source exponent by adjusting according to + * the source exponent bias. + */ + if (0 == expo || H5T_NORM_NONE == src_atomic.u.f.norm) { + assert(mant_msb >= 0); + expo -= (int64_t)((src_atomic.u.f.ebias - 1) + (src_atomic.u.f.msize - (size_t)mant_msb)); + } + else if (H5T_NORM_IMPLIED == src_atomic.u.f.norm) + expo -= (int64_t)src_atomic.u.f.ebias; + else + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet"); + + /* + * If the destination is not normalized then right shift the + * mantissa by one. + */ + mrsh = 0; + if (H5T_NORM_NONE == dst_atomic.u.f.norm) + mrsh++; + + /* + * Calculate the destination exponent by adding the destination + * bias and clipping by the minimum and maximum possible + * destination exponent values. + */ + expo += (int64_t)dst_atomic.u.f.ebias; + + if (expo < -(hssize_t)(dst_atomic.u.f.msize)) { + /* The exponent is way too small. Result is zero. */ + expo = 0; + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + msize = 0; + } + else if (expo <= 0) { + /* + * The exponent is too small to fit in the exponent field, + * but by shifting the mantissa to the right we can + * accommodate that value. The mantissa of course is no + * longer normalized. + */ + mrsh += (size_t)(1 - expo); + expo = 0; + denormalized = true; + } + else if (expo >= expo_max) { + /* + * The exponent is too large to fit in the available region + * or it results in the maximum possible value. Use positive + * or negative infinity instead unless the application + * specifies something else. Before calling the overflow + * handler make sure the source buffer we hand it is in the + * original byte order. + */ + if (conv_ctx->u.conv.cb_struct.func) { /* If user's exception handler is present, use it */ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, + d, conv_ctx->u.conv.cb_struct.user_data); + } + + if (except_ret == H5T_CONV_UNHANDLED) { + expo = expo_max; + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + msize = 0; + } + else if (except_ret == H5T_CONV_HANDLED) { + *exception_handled = true; + goto done; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + } + + /* + * If the destination mantissa is smaller than the source + * mantissa then round the source mantissa. Rounding may cause a + * carry in which case the exponent has to be re-evaluated for + * overflow. That is, if `carry' is clear then the implied + * mantissa bit is `1', else it is `10' binary. + */ + implied = 1; + mpos = src_atomic.u.f.mpos; + if (msize > 0 && mrsh <= dst_atomic.u.f.msize && mrsh + msize > dst_atomic.u.f.msize) { + mant_msb = (ssize_t)(mrsh + msize - dst_atomic.u.f.msize); + assert(mant_msb >= 0 && (size_t)mant_msb <= msize); + /* If the 1st bit being cut off is set and source isn't denormalized. */ + if (H5T__bit_get_d(s, (mpos + (size_t)mant_msb) - 1, (size_t)1) && !denormalized) { + /* Don't do rounding if exponent is 111...110 and mantissa is 111...11. + * To do rounding and increment exponent in this case will create an infinity value. */ + if ((H5T__bit_find(s, mpos + (size_t)mant_msb, msize - (size_t)mant_msb, H5T_BIT_LSB, false) >= + 0 || + expo < expo_max - 1)) { + carry = H5T__bit_inc(s, mpos + (size_t)mant_msb - 1, 1 + msize - (size_t)mant_msb); + if (carry) + implied = 2; + } + } + else if (H5T__bit_get_d(s, (mpos + (size_t)mant_msb) - 1, (size_t)1) && denormalized) + /* For either source or destination, denormalized value doesn't increment carry. */ + H5T__bit_inc(s, mpos + (size_t)mant_msb - 1, 1 + msize - (size_t)mant_msb); + } + else + carry = false; + + /* Write the mantissa to the destination */ + if (mrsh > dst_atomic.u.f.msize + 1) { + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + } + else if (mrsh == dst_atomic.u.f.msize + 1) { + H5T__bit_set(d, dst_atomic.u.f.mpos + 1, dst_atomic.u.f.msize - 1, false); + H5T__bit_set(d, dst_atomic.u.f.mpos, (size_t)1, true); + } + else if (mrsh == dst_atomic.u.f.msize) { + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + H5T__bit_set_d(d, dst_atomic.u.f.mpos, MIN(2, dst_atomic.u.f.msize), (hsize_t)implied); + } + else { + if (mrsh > 0) { + H5T__bit_set(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - mrsh, mrsh, false); + H5T__bit_set_d(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - mrsh, (size_t)2, (hsize_t)implied); + } + if (mrsh + msize >= dst_atomic.u.f.msize) { + H5T__bit_copy(d, dst_atomic.u.f.mpos, s, (mpos + msize + mrsh - dst_atomic.u.f.msize), + dst_atomic.u.f.msize - mrsh); + } + else { + H5T__bit_copy(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - (mrsh + msize), s, mpos, msize); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize - (mrsh + msize), false); + } + } + + /* Write the exponent */ + if (carry) { + expo++; + if (expo >= expo_max) { + /* + * The exponent is too large to fit in the available + * region or it results in the maximum possible value. + * Use positive or negative infinity instead unless the + * application specifies something else. Before calling + * the overflow handler make sure the source buffer we + * hand it is in the original byte order. + */ + if (conv_ctx->u.conv.cb_struct.func) { /* If user's exception handler is present, use it */ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, + src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + } + + if (except_ret == H5T_CONV_UNHANDLED) { + expo = expo_max; + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + } + else if (except_ret == H5T_CONV_HANDLED) { + *exception_handled = true; + goto done; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + } + } + + H5_CHECK_OVERFLOW(expo, hssize_t, hsize_t); + H5T__bit_set_d(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, (hsize_t)expo); + +done: + FUNC_LEAVE_NOAPI(ret_value) +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_complex_i + * + * Purpose: Convert complex number values to integer values. This is + * the catch-all function for complex number -> integer + * conversions and is probably not particularly fast. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_complex_i(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_PACKAGE + + switch (cdata->command) { + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (!H5T_IS_ATOMIC(src_p->shared->parent->shared)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid complex number datatype"); + src_atomic = src_p->shared->parent->shared->u.atomic; + dst_atomic = dst_p->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order && + H5T_ORDER_VAX != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for source datatype"); + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order && + H5T_ORDER_VAX != dst_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for destination datatype"); + if (dst_p->shared->size > TEMP_INT_CONV_BUFFER_SIZE) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination datatype size is too large"); + if (8 * sizeof(hssize_t) - 1 < src_atomic.u.f.esize) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); + cdata->need_bkg = H5T_BKG_NO; + + break; + } + + case H5T_CONV_FREE: + break; + + case H5T_CONV_CONV: + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (NULL == conv_ctx) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); + + if (H5T__conv_f_i_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); + + break; + + default: + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_complex_i() */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_complex_f + * + * Purpose: Convert complex number values to floating-point values. + * This is the catch-all function for complex number -> float + * conversions and is probably not particularly fast. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_complex_f(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + bool equal_cplx_conv = false; /* if converting between complex and matching float */ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_PACKAGE + + switch (cdata->command) { + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (!H5T_IS_ATOMIC(src_p->shared->parent->shared)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid complex number datatype"); + src_atomic = src_p->shared->parent->shared->u.atomic; + dst_atomic = dst_p->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order && + H5T_ORDER_VAX != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for source datatype"); + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order && + H5T_ORDER_VAX != dst_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for destination datatype"); + if (dst_p->shared->size > TEMP_FLOAT_CONV_BUFFER_SIZE) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination datatype size is too large"); + if (8 * sizeof(int64_t) - 1 < src_atomic.u.f.esize || + 8 * sizeof(int64_t) - 1 < dst_atomic.u.f.esize) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); + cdata->need_bkg = H5T_BKG_NO; + + break; + } + + case H5T_CONV_FREE: + break; + + case H5T_CONV_CONV: + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (NULL == conv_ctx) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); + + /* Are we converting between a floating-point type and a complex number + * type consisting of the same floating-point type? + */ + equal_cplx_conv = (0 == H5T_cmp(src_p->shared->parent, dst_p, false)); + if (!equal_cplx_conv) { + /* If floating-point types differ, use generic f_f loop */ + if (H5T__conv_f_f_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); + } + else { + /* If floating-point types are the same, use specialized loop */ + if (H5T__conv_complex_f_matched(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); + } + + break; + + default: + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); + } + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_complex_f() */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_complex_f_matched + * + * Purpose: Implements the body of the conversion loop when converting + * between a floating-point type and a complex number type + * consisting of the same floating-point type. Encapsulates + * common code that is shared between the H5T__conv_complex_f + * and H5T__conv_f_complex functions. Values can be directly + * converted between the types after checking for conversion + * exceptions. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_complex_f_matched(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, void *buf) +{ + H5T_conv_float_specval_t specval_type; /* floating-point value type (regular, +/-Inf, +/-0, NaN) */ + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + ssize_t src_delta, dst_delta; /* source & destination stride */ + uint8_t *s, *sp, *d, *dp; /* source and dest traversal ptrs */ + uint8_t *src_rev = NULL; /* order-reversed source buffer */ + uint8_t dbuf[TEMP_FLOAT_CONV_BUFFER_SIZE]; /* temp destination buffer */ + size_t olap; /* num overlapping elements */ + int direction; /* forward or backward traversal */ + herr_t ret_value = SUCCEED; + + assert(src_p); + assert(src_p->shared->type == H5T_FLOAT || src_p->shared->type == H5T_COMPLEX); + assert(dst_p); + assert(dst_p->shared->type == H5T_FLOAT || dst_p->shared->type == H5T_COMPLEX); + assert(conv_ctx); + assert(buf); + + FUNC_ENTER_PACKAGE + + if (src_p->shared->type == H5T_COMPLEX) + src_atomic = src_p->shared->parent->shared->u.atomic; + else + src_atomic = src_p->shared->u.atomic; + if (dst_p->shared->type == H5T_COMPLEX) + dst_atomic = dst_p->shared->parent->shared->u.atomic; + else + dst_atomic = dst_p->shared->u.atomic; + +#ifndef NDEBUG + { + /* Make sure the floating-point types match */ + const H5T_t *src_base = (src_p->shared->type == H5T_FLOAT) ? src_p : src_p->shared->parent; + const H5T_t *dst_base = (dst_p->shared->type == H5T_FLOAT) ? dst_p : dst_p->shared->parent; + assert(0 == (H5T_cmp(src_base, dst_base, false))); + } +#endif + + /* + * Do we process the values from beginning to end or vice versa? Also, + * how many of the elements have the source and destination areas + * overlapping? + */ + if (src_p->shared->size == dst_p->shared->size || buf_stride) { + sp = dp = (uint8_t *)buf; + direction = 1; + olap = nelmts; + } + else if (src_p->shared->size >= dst_p->shared->size) { + double olap_d = + ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); + olap = (size_t)olap_d; + sp = dp = (uint8_t *)buf; + direction = 1; + } + else { + double olap_d = + ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); + olap = (size_t)olap_d; + sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; + dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; + direction = -1; + } + + /* Direction & size of buffer traversal */ + H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t); + H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t); + H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t); + src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size); + dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size); + + /* Allocate space for order-reversed source buffer */ + if (conv_ctx->u.conv.cb_struct.func) + if (NULL == (src_rev = H5MM_calloc(src_p->shared->size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "couldn't allocate temporary buffer"); + + /* The conversion loop */ + for (size_t elmtno = 0; elmtno < nelmts; elmtno++) { + H5T_conv_ret_t except_ret = H5T_CONV_UNHANDLED; /* return of conversion exception callback function */ + bool reverse = true; /* if reversed the order of destination */ + + /* + * If the source and destination buffers overlap then use a + * temporary buffer for the destination. + */ + s = sp; + if (direction > 0) + d = elmtno < olap ? dbuf : dp; + else + d = elmtno + olap >= nelmts ? dbuf : dp; + if (d == dbuf) + memset(dbuf, 0, sizeof(dbuf)); + +#ifndef NDEBUG + if (d == dbuf) { + assert((dp >= sp && dp < sp + src_p->shared->size) || + (sp >= dp && sp < dp + dst_p->shared->size)); + } + else { + assert((dp < sp && dp + dst_p->shared->size <= sp) || + (sp < dp && sp + src_p->shared->size <= dp)); + } +#endif + + /* + * Put the data in little endian order so our loops aren't so + * complicated. We'll do all the conversion stuff assuming + * little endian and then we'll fix the order at the end. + */ + if (H5T_ORDER_BE == src_atomic.order) { + size_t half_size = src_p->shared->size / 2; + + if (H5T_FLOAT == src_p->shared->type) { + for (size_t j = 0; j < half_size; j++) + H5_SWAP_BYTES(s, j, src_p->shared->size - (j + 1)); + } + else { + uint8_t *cur_part = s; + /* Swap real part of complex number element */ + for (size_t j = 0; j < half_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, half_size - (j + 1)); + /* Swap imaginary part of complex number element */ + cur_part += half_size; + for (size_t j = 0; j < half_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, half_size - (j + 1)); + } + } + else if (H5T_ORDER_VAX == src_atomic.order) { + if (H5T_FLOAT == src_p->shared->type) { + uint8_t tmp1, tmp2; + size_t tsize = src_p->shared->size; + assert(0 == tsize % 2); + + for (size_t i = 0; i < tsize; i += 4) { + tmp1 = s[i]; + tmp2 = s[i + 1]; + + s[i] = s[(tsize - 2) - i]; + s[i + 1] = s[(tsize - 1) - i]; + + s[(tsize - 2) - i] = tmp1; + s[(tsize - 1) - i] = tmp2; + } + } + else + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + } + + /* Check for special cases: +0, -0, +Inf, -Inf, NaN */ + specval_type = H5T__conv_float_find_special(s, &src_atomic, NULL); + if (specval_type == H5T_CONV_FLOAT_SPECVAL_POSZERO || + specval_type == H5T_CONV_FLOAT_SPECVAL_NEGZERO) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, false); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + goto padding; + } + else if (specval_type != H5T_CONV_FLOAT_SPECVAL_REGULAR) { + /* If user's exception handler is present, use it */ + if (conv_ctx->u.conv.cb_struct.func) { + H5T_conv_except_t except_type; /* type of conversion exception that occurred */ + + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + if (specval_type == H5T_CONV_FLOAT_SPECVAL_POSINF) + except_type = H5T_CONV_EXCEPT_PINF; + else if (specval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) + except_type = H5T_CONV_EXCEPT_NINF; + else + except_type = H5T_CONV_EXCEPT_NAN; + + except_ret = (conv_ctx->u.conv.cb_struct.func)(except_type, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, + conv_ctx->u.conv.cb_struct.user_data); + } + + if (except_ret == H5T_CONV_UNHANDLED) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, true); + if (specval_type == H5T_CONV_FLOAT_SPECVAL_NAN) + /* There are many NaN values, so we just set all bits of the significand. */ + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, true); + else { + /* +/-Inf */ + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + /* If the destination has no implied mantissa bit, we'll need to set + * the 1st bit of mantissa to 1. The Intel-Linux "long double" is + * this case. */ + if (H5T_NORM_NONE == dst_atomic.u.f.norm) + H5T__bit_set(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - 1, (size_t)1, true); + } + } + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + + goto padding; + } + + /* Direct copy between complex number and floating-point type */ + if (H5T_FLOAT == src_p->shared->type) + memcpy(d, s, src_p->shared->size); + else + memcpy(d, s, src_p->shared->size / 2); + +padding: + /* + * Set external padding areas + */ + if (dst_atomic.offset > 0) { + assert(H5T_PAD_ZERO == dst_atomic.lsb_pad || H5T_PAD_ONE == dst_atomic.lsb_pad); + H5T__bit_set(d, (size_t)0, dst_atomic.offset, (bool)(H5T_PAD_ONE == dst_atomic.lsb_pad)); + } + { + size_t type_size; + + if (dst_p->shared->type == H5T_FLOAT) + type_size = dst_p->shared->size; + else + type_size = dst_p->shared->parent->shared->size; + + if (dst_atomic.offset + dst_atomic.prec != 8 * type_size) { + assert(H5T_PAD_ZERO == dst_atomic.msb_pad || H5T_PAD_ONE == dst_atomic.msb_pad); + H5T__bit_set(d, dst_atomic.offset + dst_atomic.prec, + 8 * type_size - (dst_atomic.offset + dst_atomic.prec), + (bool)(H5T_PAD_ONE == dst_atomic.msb_pad)); + } + } + + /* + * Put the destination in the correct byte order. See note at + * beginning of loop. Only the "real" part of a complex number + * element is swapped. By the C standard, the "imaginary" part + * should just be zeroed when converting a real value to a + * complex value. + */ + if (H5T_ORDER_BE == dst_atomic.order && reverse) { + size_t half_size = dst_p->shared->size / 2; + + if (H5T_FLOAT == dst_p->shared->type) { + for (size_t j = 0; j < half_size; j++) + H5_SWAP_BYTES(d, j, dst_p->shared->size - (j + 1)); + } + else { + for (size_t j = 0; j < half_size / 2; j++) + H5_SWAP_BYTES(d, j, half_size - (j + 1)); + } + } + else if (H5T_ORDER_VAX == dst_atomic.order && reverse) { + if (H5T_FLOAT == dst_p->shared->type) { + uint8_t tmp1, tmp2; + size_t tsize = dst_p->shared->size / 2; + assert(0 == tsize % 2); + + for (size_t i = 0; i < tsize; i += 4) { + tmp1 = d[i]; + tmp2 = d[i + 1]; + + d[i] = d[(tsize - 2) - i]; + d[i + 1] = d[(tsize - 1) - i]; + + d[(tsize - 2) - i] = tmp1; + d[(tsize - 1) - i] = tmp2; + } + } + else + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + } + +next: + /* + * If we had used a temporary buffer for the destination then we + * should copy the value to the true destination buffer. + */ + if (d == dbuf) { + if (H5T_FLOAT == dst_p->shared->type) + H5MM_memcpy(dp, d, dst_p->shared->size); + else + H5MM_memcpy(dp, d, dst_p->shared->size / 2); + } + + /* Ensure imaginary part of complex number is zeroed */ + if (H5T_COMPLEX == dst_p->shared->type) + memset(dp + (dst_p->shared->size / 2), 0, dst_p->shared->size / 2); + + /* Advance source & destination pointers by delta amounts */ + sp += src_delta; + dp += dst_delta; + } /* end conversion loop */ + +done: + H5MM_free(src_rev); + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_complex_f_matched() */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_complex_compat + * + * Purpose: Performs a no-op conversion between a complex number type + * and an equivalent datatype. Complex number types are + * considered equivalent to the following: + * + * - An array datatype consisting of two elements where each + * element is of the same floating-point datatype as the + * complex number type's base floating-point datatype + * + * - A compound datatype consisting of two fields where each + * field is of the same floating-point datatype as the + * complex number type's base floating-point datatype. The + * compound datatype must not have any leading or trailing + * structure padding or any padding between its two fields. + * The fields must also have compatible names, must have + * compatible offsets within the datatype and must be in + * the order of "real" part -> "imaginary" part, such that + * the compound datatype matches the following representation: + * + * H5T_COMPOUND { + * "r(e)(a)(l)"; OFFSET 0 + * "i(m)(a)(g)(i)(n)(a)(r)(y)"; OFFSET SIZEOF("r(e)(a)(l)") + * } + * + * where "r(e)(a)(l)" means the field may be named any + * substring of "real", such as "r", or "re" and + * "i(m)(a)(g)(i)(n)(a)(r)(y)" means the field may be named + * any substring of "imaginary", such as "im" or "imag". + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_complex_compat(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t H5_ATTR_UNUSED *conv_ctx, size_t H5_ATTR_UNUSED nelmts, + size_t H5_ATTR_UNUSED buf_stride, size_t H5_ATTR_UNUSED bkg_stride, + void H5_ATTR_UNUSED *_buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_t *compound_copy = NULL; + herr_t ret_value = SUCCEED; + + FUNC_ENTER_PACKAGE + + switch (cdata->command) { + case H5T_CONV_INIT: { + const H5T_t *complex_type; + const H5T_t *other_type; + + if (src->shared->type == H5T_COMPLEX) { + if (dst->shared->type != H5T_ARRAY && dst->shared->type != H5T_COMPOUND) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported destination datatype for conversion"); + complex_type = src; + other_type = dst; + } + else { + if (dst->shared->type != H5T_COMPLEX) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported destination datatype for conversion"); + complex_type = dst; + other_type = src; + } + + if (complex_type->shared->u.cplx.form != H5T_COMPLEX_RECTANGULAR) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported form of complex number datatype for conversion"); + + if (other_type->shared->type == H5T_ARRAY) { + if (other_type->shared->u.array.nelem != 2) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "array datatype doesn't have the correct number of elements for conversion"); + if (H5T_cmp(other_type->shared->parent, complex_type->shared->parent, false)) + HGOTO_ERROR( + H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "array datatype's base datatype doesn't match complex number type's base datatype"); + } + else { + H5T_cmemb_t *fields; + size_t name_len; + + assert(other_type->shared->type == H5T_COMPOUND); + + if (other_type->shared->u.compnd.nmembs != 2) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype doesn't have the correct number of fields for conversion"); + if (!other_type->shared->u.compnd.packed) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype fields aren't packed together"); + if (other_type->shared->u.compnd.memb_size != complex_type->shared->size) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype size doesn't match size of complex number datatype"); + + /* Make sure members are unsorted or sorted according to + * their offsets before checking their names + */ + if (other_type->shared->u.compnd.sorted == H5T_SORT_NONE || + other_type->shared->u.compnd.sorted == H5T_SORT_VALUE) + fields = other_type->shared->u.compnd.memb; + else { + /* Make a copy so the sort order of the original type isn't disturbed */ + if (NULL == (compound_copy = H5T_copy(other_type, H5T_COPY_TRANSIENT))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCOPY, FAIL, "can't copy datatype"); + + H5T__sort_value(compound_copy, NULL); + fields = compound_copy->shared->u.compnd.memb; + } + + /* Check "real" part of compound datatype */ + if (fields[0].offset != 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'real' field is not at offset 0"); + if (fields[0].size != complex_type->shared->parent->shared->size) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'real' field is not the same size as the complex number " + "datatype's base datatype"); + + /* Match up to 5 characters (including the NUL terminator) from the + * field name to a substring of "real". + */ + name_len = strlen(fields[0].name); + if (strncmp(fields[0].name, "real", (name_len < 5) ? name_len : 5)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'real' field name ('%s') didn't match an expected name " + "for conversion", + fields[0].name); + + if (H5T_cmp(fields[0].type, complex_type->shared->parent, false)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'real' field is not the same datatype as the complex " + "number datatype's base datatype"); + + /* Check "imaginary" part of compound datatype */ + if (fields[1].offset != fields[0].size) + HGOTO_ERROR( + H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'imaginary' field is not at offset 'sizeof(real_field)'"); + if (fields[1].size != complex_type->shared->parent->shared->size) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'imaginary' field is not the same size as the complex " + "number datatype's base datatype"); + + /* Match up to 10 characters (including the NUL terminator) from the + * field name to a substring of "imaginary". + */ + name_len = strlen(fields[1].name); + if (strncmp(fields[1].name, "imaginary", (name_len < 10) ? name_len : 10)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'imaginary' field name ('%s') didn't match an expected " + "name for conversion", + fields[1].name); + + if (H5T_cmp(fields[1].type, complex_type->shared->parent, false)) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "compound datatype's 'imaginary' field is not the same datatype as the " + "complex number datatype's base datatype"); + } + + cdata->need_bkg = H5T_BKG_NO; + + break; + } + + case H5T_CONV_FREE: + break; + + case H5T_CONV_CONV: + /* no-op as the types should be equivalent */ + break; + + default: + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); + } + +done: + if (compound_copy && H5T_close(compound_copy) < 0) + HDONE_ERROR(H5E_DATATYPE, H5E_CANTCLOSEOBJ, FAIL, "can't close datatype"); + + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_complex_compat() */ + +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_schar + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `signed char' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_schar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, SCHAR, H5_float_complex, signed char, SCHAR_MIN, SCHAR_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_uchar + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `unsigned char' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_uchar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, UCHAR, H5_float_complex, unsigned char, 0, UCHAR_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_short + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `short' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_short(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, SHORT, H5_float_complex, short, SHRT_MIN, SHRT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_ushort + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `unsigned short' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_ushort(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, USHORT, H5_float_complex, unsigned short, 0, USHRT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_int + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `int' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_int(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, INT, H5_float_complex, int, INT_MIN, INT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_uint + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `unsigned int' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_uint(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, UINT, H5_float_complex, unsigned int, 0, UINT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_long + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_long(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, LONG, H5_float_complex, long, LONG_MIN, LONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_ulong + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `unsigned long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_ulong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, ULONG, H5_float_complex, unsigned long, 0, ULONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_llong + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `long long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_llong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, LLONG, H5_float_complex, long long, LLONG_MIN, LLONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_ullong + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to + * `unsigned long long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_ullong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(FLOAT_COMPLEX, ULLONG, H5_float_complex, unsigned long long, 0, ULLONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +#ifdef H5_HAVE__FLOAT16 +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex__Float16 + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `_Float16' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex__Float16(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + /* Suppress warning about non-standard floating-point literal suffix */ + H5_GCC_CLANG_DIAG_OFF("pedantic") + H5T_CONV_Zf(FLOAT_COMPLEX, FLOAT16, H5_float_complex, H5__Float16, -FLT16_MAX, FLT16_MAX); + H5_GCC_CLANG_DIAG_ON("pedantic") +} +#endif + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_float + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `float' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_float(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zf(FLOAT_COMPLEX, FLOAT, H5_float_complex, float, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_double + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `double' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zF(FLOAT_COMPLEX, DOUBLE, H5_float_complex, double, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_ldouble + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to `long double' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zF(FLOAT_COMPLEX, LDOUBLE, H5_float_complex, long double, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_dcomplex + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to + * `double _Complex' / `_Dcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zZ(FLOAT_COMPLEX, DOUBLE_COMPLEX, H5_float_complex, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_fcomplex_lcomplex + * + * Purpose: Converts `float _Complex' / `_Fcomplex' to + * `long double _Complex' / `_Lcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_fcomplex_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zZ(FLOAT_COMPLEX, LDOUBLE_COMPLEX, H5_float_complex, H5_ldouble_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_schar + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `signed char' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_schar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, SCHAR, H5_double_complex, signed char, SCHAR_MIN, SCHAR_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_uchar + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `unsigned char' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_uchar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, UCHAR, H5_double_complex, unsigned char, 0, UCHAR_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_short + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `short' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_short(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, SHORT, H5_double_complex, short, SHRT_MIN, SHRT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_ushort + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to + * `unsigned short' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_ushort(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, USHORT, H5_double_complex, unsigned short, 0, USHRT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_int + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `int' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_int(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, INT, H5_double_complex, int, INT_MIN, INT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_uint + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `unsigned int' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_uint(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, UINT, H5_double_complex, unsigned int, 0, UINT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_long + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_long(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, LONG, H5_double_complex, long, LONG_MIN, LONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_ulong + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `unsigned long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_ulong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, ULONG, H5_double_complex, unsigned long, 0, ULONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_llong + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `long long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_llong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, LLONG, H5_double_complex, long long, LLONG_MIN, LLONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_ullong + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to + * `unsigned long long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_ullong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(DOUBLE_COMPLEX, ULLONG, H5_double_complex, unsigned long long, 0, ULLONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +#ifdef H5_HAVE__FLOAT16 +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex__Float16 + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `_Float16' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex__Float16(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + /* Suppress warning about non-standard floating-point literal suffix */ + H5_GCC_CLANG_DIAG_OFF("pedantic") + H5T_CONV_Zf(DOUBLE_COMPLEX, FLOAT16, H5_double_complex, H5__Float16, -FLT16_MAX, FLT16_MAX); + H5_GCC_CLANG_DIAG_ON("pedantic") +} +#endif + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_float + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `float' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_float(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Zf(DOUBLE_COMPLEX, FLOAT, H5_double_complex, float, -FLT_MAX, FLT_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_double + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `double' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zf(DOUBLE_COMPLEX, DOUBLE, H5_double_complex, double, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_ldouble + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to `long double' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zF(DOUBLE_COMPLEX, LDOUBLE, H5_double_complex, long double, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_fcomplex + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to + * `float _Complex' / `_Fcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Zz(DOUBLE_COMPLEX, FLOAT_COMPLEX, H5_double_complex, H5_float_complex, -FLT_MAX, FLT_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_dcomplex_lcomplex + * + * Purpose: Converts `double _Complex' / `_Dcomplex' to + * `long double _Complex' / `_Lcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_dcomplex_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zZ(DOUBLE_COMPLEX, LDOUBLE_COMPLEX, H5_double_complex, H5_ldouble_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_schar + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `signed char' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_schar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, SCHAR, H5_ldouble_complex, signed char, SCHAR_MIN, SCHAR_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_uchar + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `unsigned char' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_uchar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, UCHAR, H5_ldouble_complex, unsigned char, 0, UCHAR_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_short + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to `short' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_short(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, SHORT, H5_ldouble_complex, short, SHRT_MIN, SHRT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_ushort + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `unsigned short' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_ushort(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, USHORT, H5_ldouble_complex, unsigned short, 0, USHRT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_int + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to `int' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_int(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, INT, H5_ldouble_complex, int, INT_MIN, INT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_uint + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `unsigned int' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_uint(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, UINT, H5_ldouble_complex, unsigned int, 0, UINT_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_long + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to `long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_long(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, LONG, H5_ldouble_complex, long, LONG_MIN, LONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_ulong + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `unsigned long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_ulong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, ULONG, H5_ldouble_complex, unsigned long, 0, ULONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_llong + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `long long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +#ifdef H5T_CONV_INTERNAL_LDOUBLE_LLONG +herr_t +H5T__conv_lcomplex_llong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, LLONG, H5_ldouble_complex, long long, LLONG_MIN, LLONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} +#endif /* H5T_CONV_INTERNAL_LDOUBLE_LLONG */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_ullong + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `unsigned long long' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +#ifdef H5T_CONV_INTERNAL_LDOUBLE_ULLONG +herr_t +H5T__conv_lcomplex_ullong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5_GCC_CLANG_DIAG_OFF("float-equal") + H5T_CONV_Zx(LDOUBLE_COMPLEX, ULLONG, H5_ldouble_complex, unsigned long long, 0, ULLONG_MAX); + H5_GCC_CLANG_DIAG_ON("float-equal") +} +#endif /* H5T_CONV_INTERNAL_LDOUBLE_ULLONG */ + +#ifdef H5_HAVE__FLOAT16 +#ifdef H5T_CONV_INTERNAL_LDOUBLE_FLOAT16 +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex__Float16 + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to `_Float16' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex__Float16(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + /* Suppress warning about non-standard floating-point literal suffix */ + H5_GCC_CLANG_DIAG_OFF("pedantic") + H5T_CONV_Zf(LDOUBLE_COMPLEX, FLOAT16, H5_ldouble_complex, H5__Float16, -FLT16_MAX, FLT16_MAX); + H5_GCC_CLANG_DIAG_ON("pedantic") +} +#endif +#endif + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_float + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to `float' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_float(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Zf(LDOUBLE_COMPLEX, FLOAT, H5_ldouble_complex, float, -FLT_MAX, FLT_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_double + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to `double' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Zf(LDOUBLE_COMPLEX, DOUBLE, H5_ldouble_complex, double, -DBL_MAX, DBL_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_ldouble + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `long double' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_zf(LDOUBLE_COMPLEX, LDOUBLE, H5_ldouble_complex, long double, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_fcomplex + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `float _Complex' / `_Fcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Zz(LDOUBLE_COMPLEX, FLOAT_COMPLEX, H5_ldouble_complex, H5_float_complex, -FLT_MAX, FLT_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_lcomplex_dcomplex + * + * Purpose: Converts `long double _Complex' / `_Lcomplex' to + * `double _Complex' / `_Dcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_lcomplex_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Zz(LDOUBLE_COMPLEX, DOUBLE_COMPLEX, H5_ldouble_complex, H5_double_complex, -DBL_MAX, DBL_MAX); +} +#endif /* H5_HAVE_COMPLEX_NUMBERS */ diff --git a/src/H5Tconv_complex.h b/src/H5Tconv_complex.h new file mode 100644 index 00000000000..604f04576cc --- /dev/null +++ b/src/H5Tconv_complex.h @@ -0,0 +1,214 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Copyright by The HDF Group. * + * All rights reserved. * + * * + * This file is part of HDF5. The full HDF5 copyright notice, including * + * terms governing use, modification, and redistribution, is contained in * + * the COPYING file, which can be found at the root of the source code * + * distribution tree, or in https://www.hdfgroup.org/licenses. * + * If you do not have access to either file, you may request a copy from * + * help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef H5Tconv_complex_H +#define H5Tconv_complex_H + +/* Private headers needed by this file */ +#include "H5Tpkg.h" + +/***********************/ +/* Function Prototypes */ +/***********************/ + +/* Helper functions shared between conversion modules */ +H5_DLL herr_t H5T__conv_complex_f_matched(const H5T_t *src_p, const H5T_t *dst_p, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + void *buf); + +/****************************************/ +/* Soft (emulated) conversion functions */ +/****************************************/ + +/* Conversion functions between complex number datatypes */ +H5_DLL herr_t H5T__conv_complex(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); + +/* Conversion functions from complex number datatype to another datatype class */ +H5_DLL herr_t H5T__conv_complex_i(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_complex_f(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_complex_compat(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *_buf, void *bkg); + +/*********************************************/ +/* Hard (compiler cast) conversion functions */ +/*********************************************/ + +#ifdef H5_HAVE_COMPLEX_NUMBERS +/* Conversion functions for 'float _Complex' / '_Fcomplex' */ +H5_DLL herr_t H5T__conv_fcomplex_schar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_uchar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_short(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_ushort(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_int(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_uint(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_long(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_ulong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_llong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_ullong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE__FLOAT16 +H5_DLL herr_t H5T__conv_fcomplex__Float16(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif +H5_DLL herr_t H5T__conv_fcomplex_float(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_fcomplex_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); + +/* Conversion functions for 'double _Complex' / '_Dcomplex' */ +H5_DLL herr_t H5T__conv_dcomplex_schar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_uchar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_short(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_ushort(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_int(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_uint(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_long(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_ulong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_llong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_ullong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE__FLOAT16 +H5_DLL herr_t H5T__conv_dcomplex__Float16(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif +H5_DLL herr_t H5T__conv_dcomplex_float(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_dcomplex_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); + +/* Conversion functions for 'long double _Complex' / '_Lcomplex' */ +H5_DLL herr_t H5T__conv_lcomplex_schar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_uchar(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_short(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_ushort(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_int(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_uint(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_long(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_ulong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#ifdef H5T_CONV_INTERNAL_LDOUBLE_LLONG +H5_DLL herr_t H5T__conv_lcomplex_llong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif +#ifdef H5T_CONV_INTERNAL_LDOUBLE_ULLONG +H5_DLL herr_t H5T__conv_lcomplex_ullong(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif +#if defined(H5_HAVE__FLOAT16) && defined(H5T_CONV_INTERNAL_LDOUBLE_FLOAT16) +H5_DLL herr_t H5T__conv_lcomplex__Float16(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif +H5_DLL herr_t H5T__conv_lcomplex_float(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_lcomplex_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* H5_HAVE_COMPLEX_NUMBERS */ + +#endif /* H5Tconv_complex_H */ diff --git a/src/H5Tconv_compound.c b/src/H5Tconv_compound.c index 9495fbc621e..b05fb5e75d5 100644 --- a/src/H5Tconv_compound.c +++ b/src/H5Tconv_compound.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,9 +22,10 @@ /***********/ /* Headers */ /***********/ -#include "H5Eprivate.h" -#include "H5Iprivate.h" -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_compound.h" /******************/ diff --git a/src/H5Tconv_compound.h b/src/H5Tconv_compound.h index 02d3150c4e3..609a66f1112 100644 --- a/src/H5Tconv_compound.h +++ b/src/H5Tconv_compound.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tconv_enum.c b/src/H5Tconv_enum.c index cfa86071987..744f7b9920c 100644 --- a/src/H5Tconv_enum.c +++ b/src/H5Tconv_enum.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ /***********/ /* Headers */ /***********/ -#include "H5Eprivate.h" -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_enum.h" /******************/ diff --git a/src/H5Tconv_enum.h b/src/H5Tconv_enum.h index da836ce707e..5a533c8306c 100644 --- a/src/H5Tconv_enum.h +++ b/src/H5Tconv_enum.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tconv_float.c b/src/H5Tconv_float.c index 806a7261677..b7231657281 100644 --- a/src/H5Tconv_float.c +++ b/src/H5Tconv_float.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,11 @@ /***********/ /* Headers */ /***********/ -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_macros.h" +#include "H5Tconv_complex.h" +#include "H5Tconv_integer.h" #include "H5Tconv_float.h" /*------------------------------------------------------------------------- @@ -42,54 +45,34 @@ H5T__conv_f_f(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, const size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) { - /* Traversal-related variables */ - H5T_atomic_t src; /*atomic source info */ - H5T_atomic_t dst; /*atomic destination info */ - ssize_t src_delta, dst_delta; /*source & destination stride */ - int direction; /*forward or backward traversal */ - size_t elmtno; /*element number */ - size_t half_size; /*half the type size */ - size_t tsize; /*type size for swapping bytes */ - size_t olap; /*num overlapping elements */ - ssize_t bitno = 0; /*bit number */ - uint8_t *s, *sp, *d, *dp; /*source and dest traversal ptrs*/ - uint8_t *src_rev = NULL; /*order-reversed source buffer */ - uint8_t dbuf[64] = {0}; /*temp destination buffer */ - uint8_t tmp1, tmp2; /*temp variables for swapping bytes*/ - - /* Conversion-related variables */ - int64_t expo; /*exponent */ - hssize_t expo_max; /*maximum possible dst exponent */ - size_t msize = 0; /*useful size of mantissa in src*/ - size_t mpos; /*offset to useful mant is src */ - uint64_t sign; /*source sign bit value */ - size_t mrsh; /*amount to right shift mantissa*/ - bool carry = false; /*carry after rounding mantissa */ - size_t i; /*miscellaneous counters */ - size_t implied; /*destination implied bits */ - bool denormalized = false; /*is either source or destination denormalized?*/ - H5T_conv_ret_t except_ret; /*return of callback function */ - bool reverse; /*if reverse the order of destination */ - herr_t ret_value = SUCCEED; /*return value */ + herr_t ret_value = SUCCEED; FUNC_ENTER_PACKAGE switch (cdata->command) { - case H5T_CONV_INIT: + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + if (NULL == src_p || NULL == dst_p) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); - src = src_p->shared->u.atomic; - dst = dst_p->shared->u.atomic; - if (H5T_ORDER_LE != src.order && H5T_ORDER_BE != src.order && H5T_ORDER_VAX != src.order) + src_atomic = src_p->shared->u.atomic; + dst_atomic = dst_p->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order && + H5T_ORDER_VAX != src_atomic.order) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); - if (H5T_ORDER_LE != dst.order && H5T_ORDER_BE != dst.order && H5T_ORDER_VAX != dst.order) + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order && + H5T_ORDER_VAX != dst_atomic.order) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); - if (dst_p->shared->size > sizeof(dbuf)) + if (dst_p->shared->size > TEMP_FLOAT_CONV_BUFFER_SIZE) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large"); - if (8 * sizeof(expo) - 1 < src.u.f.esize || 8 * sizeof(expo) - 1 < dst.u.f.esize) + if (8 * sizeof(int64_t) - 1 < src_atomic.u.f.esize || + 8 * sizeof(int64_t) - 1 < dst_atomic.u.f.esize) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); cdata->need_bkg = H5T_BKG_NO; + break; + } case H5T_CONV_FREE: break; @@ -100,524 +83,629 @@ H5T__conv_f_f(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, const if (NULL == conv_ctx) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); - src = src_p->shared->u.atomic; - dst = dst_p->shared->u.atomic; - expo_max = ((hssize_t)1 << dst.u.f.esize) - 1; - - /* - * Do we process the values from beginning to end or vice versa? Also, - * how many of the elements have the source and destination areas - * overlapping? - */ - if (src_p->shared->size == dst_p->shared->size || buf_stride) { - sp = dp = (uint8_t *)buf; - direction = 1; - olap = nelmts; - } - else if (src_p->shared->size >= dst_p->shared->size) { - double olap_d = - ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); - olap = (size_t)olap_d; - sp = dp = (uint8_t *)buf; - direction = 1; - } - else { - double olap_d = - ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); - olap = (size_t)olap_d; - sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; - dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; - direction = -1; - } + if (H5T__conv_f_f_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); - /* - * Direction & size of buffer traversal. - */ - H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t); - H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t); - H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t); - src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size); - dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size); - - /* Allocate space for order-reversed source buffer */ - src_rev = (uint8_t *)H5MM_calloc(src_p->shared->size); - - /* The conversion loop */ - for (elmtno = 0; elmtno < nelmts; elmtno++) { - /* Set these variables to default */ - except_ret = H5T_CONV_UNHANDLED; - reverse = true; + break; - /* - * If the source and destination buffers overlap then use a - * temporary buffer for the destination. - */ - if (direction > 0) { - s = sp; - d = elmtno < olap ? dbuf : dp; - } - else { - s = sp; - d = elmtno + olap >= nelmts ? dbuf : dp; - } -#ifndef NDEBUG - /* I don't quite trust the overlap calculations yet */ - if (d == dbuf) { - assert((dp >= sp && dp < sp + src_p->shared->size) || - (sp >= dp && sp < dp + dst_p->shared->size)); - } - else { - assert((dp < sp && dp + dst_p->shared->size <= sp) || - (sp < dp && sp + src_p->shared->size <= dp)); - } -#endif + default: + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); + } - /* - * Put the data in little endian order so our loops aren't so - * complicated. We'll do all the conversion stuff assuming - * little endian and then we'll fix the order at the end. - */ - if (H5T_ORDER_BE == src.order) { - half_size = src_p->shared->size / 2; - for (i = 0; i < half_size; i++) { - tmp1 = s[src_p->shared->size - (i + 1)]; - s[src_p->shared->size - (i + 1)] = s[i]; - s[i] = tmp1; - } - } - else if (H5T_ORDER_VAX == src.order) { - tsize = src_p->shared->size; - assert(0 == tsize % 2); +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_f_f() */ - for (i = 0; i < tsize; i += 4) { - tmp1 = s[i]; - tmp2 = s[i + 1]; +/*------------------------------------------------------------------------- + * Function: H5T__conv_f_f_loop + * + * Purpose: Implements the body of the conversion loop when converting + * floating-point values to another floating-point type + * (including complex number types). Encapsulates common + * code that is shared between the H5T__conv_f_f conversion + * function and other functions where the logic is nearly + * identical, such as H5T__conv_f_complex and + * H5T__conv_complex_f. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_f_f_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, + size_t buf_stride, void *buf) +{ + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + hssize_t expo_max; /* maximum possible dst exponent */ + ssize_t src_delta, dst_delta; /* source & destination stride */ + uint8_t *s, *sp, *d, *dp; /* source and dest traversal ptrs */ + uint8_t *src_rev = NULL; /* order-reversed source buffer */ + uint8_t dbuf[TEMP_FLOAT_CONV_BUFFER_SIZE]; /* temp destination buffer */ + size_t olap; /* num overlapping elements */ + int direction; /* forward or backward traversal */ + herr_t ret_value = SUCCEED; - s[i] = s[(tsize - 2) - i]; - s[i + 1] = s[(tsize - 1) - i]; + FUNC_ENTER_PACKAGE - s[(tsize - 2) - i] = tmp1; - s[(tsize - 1) - i] = tmp2; - } - } + assert(src_p); + assert(src_p->shared->type == H5T_FLOAT || src_p->shared->type == H5T_COMPLEX); + assert(dst_p); + assert(dst_p->shared->type == H5T_FLOAT || dst_p->shared->type == H5T_COMPLEX); + assert(conv_ctx); + assert(buf); - /* - * Find the sign bit value of the source. - */ - sign = H5T__bit_get_d(s, src.u.f.sign, (size_t)1); + if (src_p->shared->type == H5T_COMPLEX) + src_atomic = src_p->shared->parent->shared->u.atomic; + else + src_atomic = src_p->shared->u.atomic; + if (dst_p->shared->type == H5T_COMPLEX) + dst_atomic = dst_p->shared->parent->shared->u.atomic; + else + dst_atomic = dst_p->shared->u.atomic; - /* - * Check for special cases: +0, -0, +Inf, -Inf, NaN - */ - if (H5T__bit_find(s, src.u.f.mpos, src.u.f.msize, H5T_BIT_LSB, true) < 0) { - if (H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, true) < 0) { - /* +0 or -0 */ - H5T__bit_copy(d, dst.u.f.sign, s, src.u.f.sign, (size_t)1); - H5T__bit_set(d, dst.u.f.epos, dst.u.f.esize, false); - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); - goto padding; - } - else if (H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, false) < 0) { - /* +Inf or -Inf */ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - if (sign) - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_NINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - else - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_PINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - H5T__bit_copy(d, dst.u.f.sign, s, src.u.f.sign, (size_t)1); - H5T__bit_set(d, dst.u.f.epos, dst.u.f.esize, true); - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); - /*If the destination no implied mantissa bit, we'll need to set - *the 1st bit of mantissa to 1. The Intel-Linux long double is - *this case.*/ - if (H5T_NORM_NONE == dst.u.f.norm) - H5T__bit_set(d, dst.u.f.mpos + dst.u.f.msize - 1, (size_t)1, true); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - - goto padding; - } - } - else if (H5T_NORM_NONE == src.u.f.norm && - H5T__bit_find(s, src.u.f.mpos, src.u.f.msize - 1, H5T_BIT_LSB, true) < 0 && - H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, false) < 0) { - /*This is a special case for the source of no implied mantissa bit. - *If the exponent bits are all 1s and only the 1st bit of mantissa - *is set to 1. It's infinity. The Intel-Linux "long double" is this case.*/ - /* +Inf or -Inf */ - if (conv_ctx->u.conv.cb_struct.func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); - if (sign) - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_NINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - else - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_PINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } + expo_max = ((hssize_t)1 << dst_atomic.u.f.esize) - 1; - if (except_ret == H5T_CONV_UNHANDLED) { - H5T__bit_copy(d, dst.u.f.sign, s, src.u.f.sign, (size_t)1); - H5T__bit_set(d, dst.u.f.epos, dst.u.f.esize, true); - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); - /*If the destination no implied mantissa bit, we'll need to set - *the 1st bit of mantissa to 1. The Intel-Linux long double is - *this case.*/ - if (H5T_NORM_NONE == dst.u.f.norm) - H5T__bit_set(d, dst.u.f.mpos + dst.u.f.msize - 1, (size_t)1, true); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); +#ifndef NDEBUG + /* Are we converting between a floating-point type and a complex number + * type consisting of the same floating-point type? This function is + * only intended for converting between different floating-point types + * and will produce incorrect results otherwise. + */ + if ((src_p->shared->type == H5T_COMPLEX && dst_p->shared->type == H5T_FLOAT) || + (src_p->shared->type == H5T_FLOAT && dst_p->shared->type == H5T_COMPLEX)) { + const H5T_t *src_base = (src_p->shared->type == H5T_FLOAT) ? src_p : src_p->shared->parent; + const H5T_t *dst_base = (dst_p->shared->type == H5T_FLOAT) ? dst_p : dst_p->shared->parent; + assert(0 != (H5T_cmp(src_base, dst_base, false))); + } +#endif - goto padding; - /* Temporary solution to handle VAX special values. - * Note that even though we don't support VAX anymore, we - * still need to handle legacy VAX files so this code must - * remain in place. - */ - } - else if (H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, false) < 0) { - /* NaN */ - if (conv_ctx->u.conv.cb_struct.func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_NAN, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, - src_rev, d, conv_ctx->u.conv.cb_struct.user_data); - } + /* + * Do we process the values from beginning to end or vice versa? Also, + * how many of the elements have the source and destination areas + * overlapping? + */ + if (src_p->shared->size == dst_p->shared->size || buf_stride) { + sp = dp = (uint8_t *)buf; + direction = 1; + olap = nelmts; + } + else if (src_p->shared->size >= dst_p->shared->size) { + double olap_d = + ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); + olap = (size_t)olap_d; + sp = dp = (uint8_t *)buf; + direction = 1; + } + else { + double olap_d = + ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); + olap = (size_t)olap_d; + sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; + dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; + direction = -1; + } + + /* Direction & size of buffer traversal */ + H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t); + H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t); + H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t); + src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size); + dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size); + + /* Allocate space for order-reversed source buffer */ + if (conv_ctx->u.conv.cb_struct.func) + if (NULL == (src_rev = H5MM_calloc(src_p->shared->size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "couldn't allocate temporary buffer"); + + /* The conversion loop */ + for (size_t elmtno = 0; elmtno < nelmts; elmtno++) { + H5T_conv_float_specval_t specval_type; /* floating-point value type (regular, +/-Inf, +/-0, NaN) */ + H5T_conv_ret_t except_ret = H5T_CONV_UNHANDLED; /* return of conversion exception callback function */ + ssize_t bitno = 0; /* bit number */ + int64_t expo; /* exponent */ + size_t implied; /* destination implied bits */ + size_t mpos; /* offset to useful mant in src */ + size_t msize = 0; /* useful size of mantissa in src */ + size_t mrsh; /* amount to right shift mantissa */ + bool reverse = true; /* if reversed the order of destination */ + bool denormalized = false; /* is either source or destination denormalized? */ + bool carry = false; /* carry after rounding mantissa */ + + /* + * If the source and destination buffers overlap then use a + * temporary buffer for the destination. + */ + s = sp; + if (direction > 0) + d = elmtno < olap ? dbuf : dp; + else + d = elmtno + olap >= nelmts ? dbuf : dp; + if (d == dbuf) + memset(dbuf, 0, sizeof(dbuf)); - if (except_ret == H5T_CONV_UNHANDLED) { - /* There are many NaN values, so we just set all bits of - * the significand. */ - H5T__bit_copy(d, dst.u.f.sign, s, src.u.f.sign, (size_t)1); - H5T__bit_set(d, dst.u.f.epos, dst.u.f.esize, true); - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, true); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); +#ifndef NDEBUG + if (d == dbuf) { + assert((dp >= sp && dp < sp + src_p->shared->size) || + (sp >= dp && sp < dp + dst_p->shared->size)); + } + else { + assert((dp < sp && dp + dst_p->shared->size <= sp) || + (sp < dp && sp + src_p->shared->size <= dp)); + } +#endif - goto padding; + /* + * Put the data in little endian order so our loops aren't so + * complicated. We'll do all the conversion stuff assuming + * little endian and then we'll fix the order at the end. + */ + if (H5T_ORDER_BE == src_atomic.order) { + size_t half_size = src_p->shared->size / 2; + + if (H5T_FLOAT == src_p->shared->type) { + for (size_t j = 0; j < half_size; j++) + H5_SWAP_BYTES(s, j, src_p->shared->size - (j + 1)); + } + else { + uint8_t *cur_part = s; + /* Swap real part of complex number element */ + for (size_t j = 0; j < half_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, half_size - (j + 1)); + /* Swap imaginary part of complex number element */ + cur_part += half_size; + for (size_t j = 0; j < half_size / 2; j++) + H5_SWAP_BYTES(cur_part, j, half_size - (j + 1)); + } + } + else if (H5T_ORDER_VAX == src_atomic.order) { + if (H5T_FLOAT == src_p->shared->type) { + uint8_t tmp1, tmp2; + size_t tsize = src_p->shared->size; + assert(0 == tsize % 2); + + for (size_t i = 0; i < tsize; i += 4) { + tmp1 = s[i]; + tmp2 = s[i + 1]; + + s[i] = s[(tsize - 2) - i]; + s[i + 1] = s[(tsize - 1) - i]; + + s[(tsize - 2) - i] = tmp1; + s[(tsize - 1) - i] = tmp2; } + } + else + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + } + + /* Check for special cases: +0, -0, +Inf, -Inf, NaN */ + specval_type = H5T__conv_float_find_special(s, &src_atomic, NULL); + if (specval_type == H5T_CONV_FLOAT_SPECVAL_POSZERO || + specval_type == H5T_CONV_FLOAT_SPECVAL_NEGZERO) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, false); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + goto padding; + } + else if (specval_type != H5T_CONV_FLOAT_SPECVAL_REGULAR) { + /* If user's exception handler is present, use it */ + if (conv_ctx->u.conv.cb_struct.func) { + H5T_conv_except_t except_type; /* type of conversion exception that occurred */ + + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + if (specval_type == H5T_CONV_FLOAT_SPECVAL_POSINF) + except_type = H5T_CONV_EXCEPT_PINF; + else if (specval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) + except_type = H5T_CONV_EXCEPT_NINF; + else + except_type = H5T_CONV_EXCEPT_NAN; - /* - * Get the exponent as an unsigned quantity from the section of - * the source bit field where it's located. Don't worry about - * the exponent bias yet. - */ - expo = (int64_t)H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize); - - if (expo == 0) - denormalized = true; + except_ret = (conv_ctx->u.conv.cb_struct.func)(except_type, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, + conv_ctx->u.conv.cb_struct.user_data); + } - /* - * Set markers for the source mantissa, excluding the leading `1' - * (might be implied). - */ - implied = 1; - mpos = src.u.f.mpos; - mrsh = 0; - if (0 == expo || H5T_NORM_NONE == src.u.f.norm) { - if ((bitno = H5T__bit_find(s, src.u.f.mpos, src.u.f.msize, H5T_BIT_MSB, true)) > 0) { - msize = (size_t)bitno; - } - else if (0 == bitno) { - msize = 1; - H5T__bit_set(s, src.u.f.mpos, (size_t)1, false); - } - } - else if (H5T_NORM_IMPLIED == src.u.f.norm) { - msize = src.u.f.msize; - } + if (except_ret == H5T_CONV_UNHANDLED) { + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + H5T__bit_set(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, true); + if (specval_type == H5T_CONV_FLOAT_SPECVAL_NAN) + /* There are many NaN values, so we just set all bits of the significand. */ + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, true); else { - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "normalization method not implemented yet"); + /* +/-Inf */ + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + /* If the destination has no implied mantissa bit, we'll need to set + * the 1st bit of mantissa to 1. The Intel-Linux "long double" is + * this case. */ + if (H5T_NORM_NONE == dst_atomic.u.f.norm) + H5T__bit_set(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - 1, (size_t)1, true); } + } + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + + goto padding; + /* Temporary solution to handle VAX special values. + * Note that even though we don't support VAX anymore, we + * still need to handle legacy VAX files so this code must + * remain in place. + */ + } + + /* + * Get the exponent as an unsigned quantity from the section of + * the source bit field where it's located. Don't worry about + * the exponent bias yet. + */ + expo = (int64_t)H5T__bit_get_d(s, src_atomic.u.f.epos, src_atomic.u.f.esize); + + if (expo == 0) + denormalized = true; + + /* + * Set markers for the source mantissa, excluding the leading `1' + * (might be implied). + */ + implied = 1; + mpos = src_atomic.u.f.mpos; + mrsh = 0; + if (0 == expo || H5T_NORM_NONE == src_atomic.u.f.norm) { + if ((bitno = H5T__bit_find(s, src_atomic.u.f.mpos, src_atomic.u.f.msize, H5T_BIT_MSB, true)) > + 0) { + msize = (size_t)bitno; + } + else if (0 == bitno) { + msize = 1; + H5T__bit_set(s, src_atomic.u.f.mpos, (size_t)1, false); + } + } + else if (H5T_NORM_IMPLIED == src_atomic.u.f.norm) { + msize = src_atomic.u.f.msize; + } + else { + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet"); + } + + /* + * The sign for the destination is the same as the sign for the + * source in all cases. + */ + H5T__bit_copy(d, dst_atomic.u.f.sign, s, src_atomic.u.f.sign, (size_t)1); + + /* + * Calculate the true source exponent by adjusting according to + * the source exponent bias. + */ + if (0 == expo || H5T_NORM_NONE == src_atomic.u.f.norm) { + assert(bitno >= 0); + expo -= (int64_t)((src_atomic.u.f.ebias - 1) + (src_atomic.u.f.msize - (size_t)bitno)); + } + else if (H5T_NORM_IMPLIED == src_atomic.u.f.norm) { + expo -= (int64_t)src_atomic.u.f.ebias; + } + else { + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet"); + } + + /* + * If the destination is not normalized then right shift the + * mantissa by one. + */ + if (H5T_NORM_NONE == dst_atomic.u.f.norm) + mrsh++; + + /* + * Calculate the destination exponent by adding the destination + * bias and clipping by the minimum and maximum possible + * destination exponent values. + */ + expo += (int64_t)dst_atomic.u.f.ebias; + + if (expo < -(hssize_t)(dst_atomic.u.f.msize)) { + /* The exponent is way too small. Result is zero. */ + expo = 0; + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + msize = 0; + } + else if (expo <= 0) { + /* + * The exponent is too small to fit in the exponent field, + * but by shifting the mantissa to the right we can + * accommodate that value. The mantissa of course is no + * longer normalized. + */ + mrsh += (size_t)(1 - expo); + expo = 0; + denormalized = true; + } + else if (expo >= expo_max) { + /* + * The exponent is too large to fit in the available region + * or it results in the maximum possible value. Use positive + * or negative infinity instead unless the application + * specifies something else. Before calling the overflow + * handler make sure the source buffer we hand it is in the + * original byte order. + */ + if (conv_ctx->u.conv.cb_struct.func) { /* If user's exception handler is present, use it */ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); - /* - * The sign for the destination is the same as the sign for the - * source in all cases. - */ - H5T__bit_copy(d, dst.u.f.sign, s, src.u.f.sign, (size_t)1); + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, + src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + } - /* - * Calculate the true source exponent by adjusting according to - * the source exponent bias. - */ - if (0 == expo || H5T_NORM_NONE == src.u.f.norm) { - assert(bitno >= 0); - expo -= (int64_t)((src.u.f.ebias - 1) + (src.u.f.msize - (size_t)bitno)); - } - else if (H5T_NORM_IMPLIED == src.u.f.norm) { - expo -= (int64_t)src.u.f.ebias; - } - else { - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "normalization method not implemented yet"); + if (except_ret == H5T_CONV_UNHANDLED) { + expo = expo_max; + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + msize = 0; + } + else if (except_ret == H5T_CONV_HANDLED) { + reverse = false; + goto next; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + } + + /* + * If the destination mantissa is smaller than the source + * mantissa then round the source mantissa. Rounding may cause a + * carry in which case the exponent has to be re-evaluated for + * overflow. That is, if `carry' is clear then the implied + * mantissa bit is `1', else it is `10' binary. + */ + if (msize > 0 && mrsh <= dst_atomic.u.f.msize && mrsh + msize > dst_atomic.u.f.msize) { + bitno = (ssize_t)(mrsh + msize - dst_atomic.u.f.msize); + assert(bitno >= 0 && (size_t)bitno <= msize); + /* If the 1st bit being cut off is set and source isn't denormalized. */ + if (H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && !denormalized) { + /* Don't do rounding if exponent is 111...110 and mantissa is 111...11. + * To do rounding and increment exponent in this case will create an infinity value. */ + if ((H5T__bit_find(s, mpos + (size_t)bitno, msize - (size_t)bitno, H5T_BIT_LSB, false) >= 0 || + expo < expo_max - 1)) { + carry = H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno); + if (carry) + implied = 2; } + } + else if (H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && denormalized) + /* For either source or destination, denormalized value doesn't increment carry. */ + H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno); + } + else + carry = false; + + /* + * Write the mantissa to the destination + */ + if (mrsh > dst_atomic.u.f.msize + 1) { + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + } + else if (mrsh == dst_atomic.u.f.msize + 1) { + H5T__bit_set(d, dst_atomic.u.f.mpos + 1, dst_atomic.u.f.msize - 1, false); + H5T__bit_set(d, dst_atomic.u.f.mpos, (size_t)1, true); + } + else if (mrsh == dst_atomic.u.f.msize) { + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); + H5T__bit_set_d(d, dst_atomic.u.f.mpos, MIN(2, dst_atomic.u.f.msize), (hsize_t)implied); + } + else { + if (mrsh > 0) { + H5T__bit_set(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - mrsh, mrsh, false); + H5T__bit_set_d(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - mrsh, (size_t)2, + (hsize_t)implied); + } + if (mrsh + msize >= dst_atomic.u.f.msize) { + H5T__bit_copy(d, dst_atomic.u.f.mpos, s, (mpos + msize + mrsh - dst_atomic.u.f.msize), + dst_atomic.u.f.msize - mrsh); + } + else { + H5T__bit_copy(d, dst_atomic.u.f.mpos + dst_atomic.u.f.msize - (mrsh + msize), s, mpos, msize); + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize - (mrsh + msize), false); + } + } + /* Write the exponent */ + if (carry) { + expo++; + if (expo >= expo_max) { /* - * If the destination is not normalized then right shift the - * mantissa by one. - */ - if (H5T_NORM_NONE == dst.u.f.norm) - mrsh++; - - /* - * Calculate the destination exponent by adding the destination - * bias and clipping by the minimum and maximum possible - * destination exponent values. + * The exponent is too large to fit in the available + * region or it results in the maximum possible value. + * Use positive or negative infinity instead unless the + * application specifies something else. Before calling + * the overflow handler make sure the source buffer we + * hand it is in the original byte order. */ - expo += (int64_t)dst.u.f.ebias; - - if (expo < -(hssize_t)(dst.u.f.msize)) { - /* The exponent is way too small. Result is zero. */ - expo = 0; - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); - msize = 0; - } - else if (expo <= 0) { - /* - * The exponent is too small to fit in the exponent field, - * but by shifting the mantissa to the right we can - * accommodate that value. The mantissa of course is no - * longer normalized. - */ - mrsh += (size_t)(1 - expo); - expo = 0; - denormalized = true; - } - else if (expo >= expo_max) { - /* - * The exponent is too large to fit in the available region - * or it results in the maximum possible value. Use positive - * or negative infinity instead unless the application - * specifies something else. Before calling the overflow - * handler make sure the source buffer we hand it is in the - * original byte order. - */ - if (conv_ctx->u.conv.cb_struct.func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - expo = expo_max; - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); - msize = 0; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - reverse = false; - goto next; - } - } + if (conv_ctx->u.conv.cb_struct.func) { /* If user's exception handler is present, use it */ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); - /* - * If the destination mantissa is smaller than the source - * mantissa then round the source mantissa. Rounding may cause a - * carry in which case the exponent has to be re-evaluated for - * overflow. That is, if `carry' is clear then the implied - * mantissa bit is `1', else it is `10' binary. - */ - if (msize > 0 && mrsh <= dst.u.f.msize && mrsh + msize > dst.u.f.msize) { - bitno = (ssize_t)(mrsh + msize - dst.u.f.msize); - assert(bitno >= 0 && (size_t)bitno <= msize); - /* If the 1st bit being cut off is set and source isn't denormalized.*/ - if (H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && !denormalized) { - /* Don't do rounding if exponent is 111...110 and mantissa is 111...11. - * To do rounding and increment exponent in this case will create an infinity value.*/ - if ((H5T__bit_find(s, mpos + (size_t)bitno, msize - (size_t)bitno, H5T_BIT_LSB, - false) >= 0 || - expo < expo_max - 1)) { - carry = H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno); - if (carry) - implied = 2; - } - } - else if (H5T__bit_get_d(s, (mpos + (size_t)bitno) - 1, (size_t)1) && denormalized) - /* For either source or destination, denormalized value doesn't increment carry.*/ - H5T__bit_inc(s, mpos + (size_t)bitno - 1, 1 + msize - (size_t)bitno); + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, + src_rev, d, conv_ctx->u.conv.cb_struct.user_data); } - else - carry = false; - /* - * Write the mantissa to the destination - */ - if (mrsh > dst.u.f.msize + 1) { - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); + if (except_ret == H5T_CONV_UNHANDLED) { + expo = expo_max; + H5T__bit_set(d, dst_atomic.u.f.mpos, dst_atomic.u.f.msize, false); } - else if (mrsh == dst.u.f.msize + 1) { - H5T__bit_set(d, dst.u.f.mpos + 1, dst.u.f.msize - 1, false); - H5T__bit_set(d, dst.u.f.mpos, (size_t)1, true); - } - else if (mrsh == dst.u.f.msize) { - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); - H5T__bit_set_d(d, dst.u.f.mpos, MIN(2, dst.u.f.msize), (hsize_t)implied); - } - else { - if (mrsh > 0) { - H5T__bit_set(d, dst.u.f.mpos + dst.u.f.msize - mrsh, mrsh, false); - H5T__bit_set_d(d, dst.u.f.mpos + dst.u.f.msize - mrsh, (size_t)2, (hsize_t)implied); - } - if (mrsh + msize >= dst.u.f.msize) { - H5T__bit_copy(d, dst.u.f.mpos, s, (mpos + msize + mrsh - dst.u.f.msize), - dst.u.f.msize - mrsh); - } - else { - H5T__bit_copy(d, dst.u.f.mpos + dst.u.f.msize - (mrsh + msize), s, mpos, msize); - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize - (mrsh + msize), false); - } + else if (except_ret == H5T_CONV_HANDLED) { + reverse = false; + goto next; } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + } + } - /* Write the exponent */ - if (carry) { - expo++; - if (expo >= expo_max) { - /* - * The exponent is too large to fit in the available - * region or it results in the maximum possible value. - * Use positive or negative infinity instead unless the - * application specifies something else. Before - * calling the overflow handler make sure the source - * buffer we hand it is in the original byte order. - */ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - expo = expo_max; - H5T__bit_set(d, dst.u.f.mpos, dst.u.f.msize, false); - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - reverse = false; - goto next; - } - } - } - /*reset CARRY*/ - carry = false; + carry = false; - H5_CHECK_OVERFLOW(expo, hssize_t, hsize_t); - H5T__bit_set_d(d, dst.u.f.epos, dst.u.f.esize, (hsize_t)expo); + H5_CHECK_OVERFLOW(expo, hssize_t, hsize_t); + H5T__bit_set_d(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, (hsize_t)expo); padding: + /* + * Set external padding areas + */ + if (dst_atomic.offset > 0) { + assert(H5T_PAD_ZERO == dst_atomic.lsb_pad || H5T_PAD_ONE == dst_atomic.lsb_pad); + H5T__bit_set(d, (size_t)0, dst_atomic.offset, (bool)(H5T_PAD_ONE == dst_atomic.lsb_pad)); + } + { + size_t type_size; + + if (dst_p->shared->type == H5T_FLOAT) + type_size = dst_p->shared->size; + else + type_size = dst_p->shared->parent->shared->size; - /* - * Set external padding areas - */ - if (dst.offset > 0) { - assert(H5T_PAD_ZERO == dst.lsb_pad || H5T_PAD_ONE == dst.lsb_pad); - H5T__bit_set(d, (size_t)0, dst.offset, (bool)(H5T_PAD_ONE == dst.lsb_pad)); - } - if (dst.offset + dst.prec != 8 * dst_p->shared->size) { - assert(H5T_PAD_ZERO == dst.msb_pad || H5T_PAD_ONE == dst.msb_pad); - H5T__bit_set(d, dst.offset + dst.prec, 8 * dst_p->shared->size - (dst.offset + dst.prec), - (bool)(H5T_PAD_ONE == dst.msb_pad)); - } - - /* - * Put the destination in the correct byte order. See note at - * beginning of loop. - */ - if (H5T_ORDER_BE == dst.order && reverse) { - half_size = dst_p->shared->size / 2; - for (i = 0; i < half_size; i++) { - uint8_t tmp = d[dst_p->shared->size - (i + 1)]; - d[dst_p->shared->size - (i + 1)] = d[i]; - d[i] = tmp; - } - } - else if (H5T_ORDER_VAX == dst.order && reverse) { - tsize = dst_p->shared->size; - assert(0 == tsize % 2); - - for (i = 0; i < tsize; i += 4) { - tmp1 = d[i]; - tmp2 = d[i + 1]; - - d[i] = d[(tsize - 2) - i]; - d[i + 1] = d[(tsize - 1) - i]; - - d[(tsize - 2) - i] = tmp1; - d[(tsize - 1) - i] = tmp2; - } + if (dst_atomic.offset + dst_atomic.prec != 8 * type_size) { + assert(H5T_PAD_ZERO == dst_atomic.msb_pad || H5T_PAD_ONE == dst_atomic.msb_pad); + H5T__bit_set(d, dst_atomic.offset + dst_atomic.prec, + 8 * type_size - (dst_atomic.offset + dst_atomic.prec), + (bool)(H5T_PAD_ONE == dst_atomic.msb_pad)); + } + } + + /* + * Put the destination in the correct byte order. See note at + * beginning of loop. Only the "real" part of a complex number + * element is swapped. By the C standard, the "imaginary" part + * should just be zeroed when converting a real value to a + * complex value. + */ + if (H5T_ORDER_BE == dst_atomic.order && reverse) { + size_t half_size = dst_p->shared->size / 2; + + if (H5T_FLOAT == dst_p->shared->type) { + for (size_t j = 0; j < half_size; j++) + H5_SWAP_BYTES(d, j, dst_p->shared->size - (j + 1)); + } + else { + for (size_t j = 0; j < half_size / 2; j++) + H5_SWAP_BYTES(d, j, half_size - (j + 1)); + } + } + else if (H5T_ORDER_VAX == dst_atomic.order && reverse) { + if (H5T_FLOAT == dst_p->shared->type) { + uint8_t tmp1, tmp2; + size_t tsize = dst_p->shared->size / 2; + assert(0 == tsize % 2); + + for (size_t i = 0; i < tsize; i += 4) { + tmp1 = d[i]; + tmp2 = d[i + 1]; + + d[i] = d[(tsize - 2) - i]; + d[i + 1] = d[(tsize - 1) - i]; + + d[(tsize - 2) - i] = tmp1; + d[(tsize - 1) - i] = tmp2; } + } + else + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + } - /* - * If we had used a temporary buffer for the destination then we - * should copy the value to the true destination buffer. - */ next: - if (d == dbuf) - H5MM_memcpy(dp, d, dst_p->shared->size); + /* + * If we had used a temporary buffer for the destination then we + * should copy the value to the true destination buffer. + */ + if (d == dbuf) { + if (H5T_FLOAT == dst_p->shared->type) + H5MM_memcpy(dp, d, dst_p->shared->size); + else + H5MM_memcpy(dp, d, dst_p->shared->size / 2); + } - /* Advance source & destination pointers by delta amounts */ - sp += src_delta; - dp += dst_delta; - } + /* Ensure imaginary part of complex number is zeroed */ + if (H5T_COMPLEX == dst_p->shared->type) + memset(dp + (dst_p->shared->size / 2), 0, dst_p->shared->size / 2); - break; - - default: - HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); - } /* end switch */ + /* Advance source & destination pointers by delta amounts */ + sp += src_delta; + dp += dst_delta; + } /* end conversion loop */ done: - if (src_rev) - H5MM_free(src_rev); + H5MM_free(src_rev); FUNC_LEAVE_NOAPI(ret_value) -} /* end H5T__conv_f_f() */ +} /* end H5T__conv_f_f_loop() */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_float_find_special + * + * Purpose: Helper function to inspect the bits of a floating-point + * value during data conversions and determine if that value + * is a special value (+/-Inf, +/-0, NaN). + * + * If `sign_out` is non-NULL, it is set to the value of the + * sign bit of the floating-point value. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +H5T_conv_float_specval_t +H5T__conv_float_find_special(const uint8_t *src_buf, const H5T_atomic_t *src_atomic, uint64_t *sign_out) +{ + uint64_t sign; /* sign bit value */ + H5T_conv_float_specval_t ret_value = H5T_CONV_FLOAT_SPECVAL_REGULAR; + + FUNC_ENTER_PACKAGE_NOERR + + assert(src_buf); + assert(src_atomic); + + /* Find the sign bit value of the source. */ + sign = H5T__bit_get_d(src_buf, src_atomic->u.f.sign, (size_t)1); + + /* Is the mantissa all 0 bits? */ + if (H5T__bit_find(src_buf, src_atomic->u.f.mpos, src_atomic->u.f.msize, H5T_BIT_LSB, true) < 0) { + /* Is the exponent all 0 bits? */ + if (H5T__bit_find(src_buf, src_atomic->u.f.epos, src_atomic->u.f.esize, H5T_BIT_LSB, true) < 0) + /* +0 or -0 */ + ret_value = sign ? H5T_CONV_FLOAT_SPECVAL_NEGZERO : H5T_CONV_FLOAT_SPECVAL_POSZERO; + /* Is the exponent all 1 bits? */ + else if (H5T__bit_find(src_buf, src_atomic->u.f.epos, src_atomic->u.f.esize, H5T_BIT_LSB, false) < 0) + /* +Inf or -Inf */ + ret_value = sign ? H5T_CONV_FLOAT_SPECVAL_NEGINF : H5T_CONV_FLOAT_SPECVAL_POSINF; + } + else { + bool exp_all_ones = + (H5T__bit_find(src_buf, src_atomic->u.f.epos, src_atomic->u.f.esize, H5T_BIT_LSB, false) < 0); + + /* For a source value with no implied mantissa bit, if the exponent bits + * are all 1s and only the 1st bit of the mantissa is set to 1, the value + * is infinity. The Intel-Linux "long double" is this case. + */ + if (H5T_NORM_NONE == src_atomic->u.f.norm && exp_all_ones && + H5T__bit_find(src_buf, src_atomic->u.f.mpos, src_atomic->u.f.msize - 1, H5T_BIT_LSB, true) < 0) + ret_value = sign ? H5T_CONV_FLOAT_SPECVAL_NEGINF : H5T_CONV_FLOAT_SPECVAL_POSINF; + else if (exp_all_ones) + ret_value = H5T_CONV_FLOAT_SPECVAL_NAN; + } + + if (sign_out) + *sign_out = sign; + + FUNC_LEAVE_NOAPI(ret_value); +} /* end H5T__conv_float_find_special() */ /*------------------------------------------------------------------------- * Function: H5T__conv_f_i @@ -635,49 +723,33 @@ H5T__conv_f_i(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, const size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) { - /* Traversal-related variables */ - H5T_atomic_t src; /*atomic source info */ - H5T_atomic_t dst; /*atomic destination info */ - int direction; /*forward or backward traversal */ - size_t elmtno; /*element number */ - size_t half_size; /*half the type size */ - size_t tsize; /*type size for swapping bytes */ - size_t olap; /*num overlapping elements */ - uint8_t *s, *sp, *d, *dp; /*source and dest traversal ptrs*/ - uint8_t *src_rev = NULL; /*order-reversed source buffer */ - uint8_t dbuf[64] = {0}; /*temp destination buffer */ - uint8_t tmp1, tmp2; /*temp variables for swapping bytes*/ - - /* Conversion-related variables */ - hssize_t expo; /*source exponent */ - hssize_t sign; /*source sign bit value */ - uint8_t *int_buf = NULL; /*buffer for temporary value */ - size_t buf_size; /*buffer size for temporary value */ - size_t i; /*miscellaneous counters */ - ssize_t msb_pos_s; /*first bit(MSB) in an integer */ - ssize_t new_msb_pos; /*MSB position after shifting mantissa by exponent */ - hssize_t shift_val; /*shift value when shifting mantissa by exponent */ - bool truncated; /*if fraction value is dropped */ - bool reverse; /*if reverse order of destination at the end */ - H5T_conv_ret_t except_ret; /*return of callback function */ - herr_t ret_value = SUCCEED; /* Return value */ + herr_t ret_value = SUCCEED; FUNC_ENTER_PACKAGE switch (cdata->command) { - case H5T_CONV_INIT: + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + if (NULL == src_p || NULL == dst_p) HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); - src = src_p->shared->u.atomic; - dst = dst_p->shared->u.atomic; - if (H5T_ORDER_LE != src.order && H5T_ORDER_BE != src.order && H5T_ORDER_VAX != src.order) + src_atomic = src_p->shared->u.atomic; + dst_atomic = dst_p->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order && + H5T_ORDER_VAX != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order && + H5T_ORDER_VAX != dst_atomic.order) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); - if (dst_p->shared->size > sizeof(dbuf)) + if (dst_p->shared->size > TEMP_INT_CONV_BUFFER_SIZE) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large"); - if (8 * sizeof(expo) - 1 < src.u.f.esize) + if (8 * sizeof(hssize_t) - 1 < src_atomic.u.f.esize) HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); cdata->need_bkg = H5T_BKG_NO; + break; + } case H5T_CONV_FREE: break; @@ -688,602 +760,627 @@ H5T__conv_f_i(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, const if (NULL == conv_ctx) HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); - src = src_p->shared->u.atomic; - dst = dst_p->shared->u.atomic; + if (H5T__conv_f_i_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); - /* - * Do we process the values from beginning to end or vice versa? Also, - * how many of the elements have the source and destination areas - * overlapping? - */ - if (src_p->shared->size == dst_p->shared->size || buf_stride) { - sp = dp = (uint8_t *)buf; - direction = 1; - olap = nelmts; - } - else if (src_p->shared->size >= dst_p->shared->size) { - double olap_d = - ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); - olap = (size_t)olap_d; - sp = dp = (uint8_t *)buf; - direction = 1; + break; + + default: + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); + } /* end switch */ + +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_f_i() */ + +/*------------------------------------------------------------------------- + * Function: H5T__conv_f_i_loop + * + * Purpose: Implements the body of the conversion loop when converting + * floating-point values (including complex number values) to + * integer values. Encapsulates common code that is shared + * between the H5T__conv_f_i conversion function and other + * functions where the logic is nearly identical, such as + * H5T__conv_complex_i. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_f_i_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, + size_t buf_stride, void *buf) +{ + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + ssize_t src_delta, dst_delta; /* source & destination stride */ + uint8_t *s, *sp, *d, *dp; /* source and dest traversal ptrs */ + uint8_t *int_buf = NULL; /* buffer for temporary value */ + uint8_t *src_rev = NULL; /* order-reversed source buffer */ + uint8_t dbuf[TEMP_INT_CONV_BUFFER_SIZE]; /* temp destination buffer */ + size_t int_buf_size; /* buffer size for temporary value */ + size_t src_base_size; /* size of source base datatype */ + size_t olap; /* num overlapping elements */ + int direction; /* forward or backward traversal */ + herr_t ret_value = SUCCEED; + + FUNC_ENTER_PACKAGE + + assert(src_p); + assert(src_p->shared->type == H5T_FLOAT || src_p->shared->type == H5T_COMPLEX); + assert(dst_p); + assert(dst_p->shared->type == H5T_INTEGER); + assert(conv_ctx); + assert(buf); + + if (src_p->shared->type == H5T_COMPLEX) + src_atomic = src_p->shared->parent->shared->u.atomic; + else + src_atomic = src_p->shared->u.atomic; + dst_atomic = dst_p->shared->u.atomic; + + /* + * Do we process the values from beginning to end or vice versa? Also, + * how many of the elements have the source and destination areas + * overlapping? + */ + if (src_p->shared->size == dst_p->shared->size || buf_stride) { + sp = dp = (uint8_t *)buf; + direction = 1; + olap = nelmts; + } + else if (src_p->shared->size >= dst_p->shared->size) { + double olap_d = + ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); + olap = (size_t)olap_d; + sp = dp = (uint8_t *)buf; + direction = 1; + } + else { + double olap_d = + ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); + olap = (size_t)olap_d; + sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; + dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; + direction = -1; + } + + /* Direction & size of buffer traversal */ + H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t); + H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t); + H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t); + src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size); + dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size); + + /* Allocate enough space for the buffer holding temporary converted value */ + src_base_size = + (H5T_FLOAT == src_p->shared->type) ? src_p->shared->size : src_p->shared->parent->shared->size; + if (dst_atomic.prec / 8 > src_base_size) + int_buf_size = (dst_atomic.prec + 7) / 8; + else + int_buf_size = src_base_size; + if (NULL == (int_buf = H5MM_calloc(int_buf_size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "couldn't allocate temporary buffer"); + + /* Allocate space for order-reversed source buffer */ + if (conv_ctx->u.conv.cb_struct.func) + if (NULL == (src_rev = H5MM_calloc(src_p->shared->size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "couldn't allocate temporary buffer"); + + /* The conversion loop */ + for (size_t elmtno = 0; elmtno < nelmts; elmtno++) { + H5T_conv_float_specval_t specval_type; /* floating-point value type (regular, +/-Inf, +/-0, NaN) */ + H5T_conv_ret_t except_ret = H5T_CONV_UNHANDLED; /* return of conversion exception callback function */ + uint64_t sign; /* source sign bit value */ + hssize_t expo; /* source exponent */ + hssize_t shift_val; /* shift value when shifting mantissa by exponent */ + ssize_t msb_pos_s; /* first bit(MSB) in an integer */ + ssize_t new_msb_pos; /* MSB position after shifting mantissa by exponent */ + bool truncated = false; /* if fraction value is dropped */ + bool reverse = true; /* if reversed the order of destination */ + + /* + * If the source and destination buffers overlap then use a + * temporary buffer for the destination. + */ + s = sp; + if (direction > 0) + d = elmtno < olap ? dbuf : dp; + else + d = elmtno + olap >= nelmts ? dbuf : dp; + if (d == dbuf) + memset(dbuf, 0, sizeof(dbuf)); + +#ifndef NDEBUG + if (d == dbuf) { + assert((dp >= sp && dp < sp + src_p->shared->size) || + (sp >= dp && sp < dp + dst_p->shared->size)); + } + else { + assert((dp < sp && dp + dst_p->shared->size <= sp) || + (sp < dp && sp + src_p->shared->size <= dp)); + } +#endif + + /* + * Put the data in little endian order so our loops aren't so + * complicated. We'll do all the conversion stuff assuming + * little endian and then we'll fix the order at the end. + */ + if (H5T_ORDER_BE == src_atomic.order) { + size_t half_size = src_p->shared->size / 2; + + if (H5T_FLOAT == src_p->shared->type) { + for (size_t i = 0; i < half_size; i++) + H5_SWAP_BYTES(s, i, src_p->shared->size - (i + 1)); } else { - double olap_d = - ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); - olap = (size_t)olap_d; - sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; - dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; - direction = -1; + uint8_t *cur_part = s; + /* Swap real part of complex number element */ + for (size_t i = 0; i < half_size / 2; i++) + H5_SWAP_BYTES(cur_part, i, half_size - (i + 1)); + /* Swap imaginary part of complex number element */ + cur_part += half_size; + for (size_t i = 0; i < half_size / 2; i++) + H5_SWAP_BYTES(cur_part, i, half_size - (i + 1)); + } + } + else if (H5T_ORDER_VAX == src_atomic.order) { + if (H5T_FLOAT == src_p->shared->type) { + uint8_t tmp1, tmp2; + size_t tsize = src_p->shared->size; + assert(0 == tsize % 2); + + for (size_t i = 0; i < tsize; i += 4) { + tmp1 = s[i]; + tmp2 = s[i + 1]; + + s[i] = s[(tsize - 2) - i]; + s[i + 1] = s[(tsize - 1) - i]; + + s[(tsize - 2) - i] = tmp1; + s[(tsize - 1) - i] = tmp2; + } } - - /* Allocate enough space for the buffer holding temporary - * converted value - */ - if (dst.prec / 8 > src_p->shared->size) - buf_size = (dst.prec + 7) / 8; else - buf_size = src_p->shared->size; - int_buf = (uint8_t *)H5MM_calloc(buf_size); - - /* Allocate space for order-reversed source buffer */ - src_rev = (uint8_t *)H5MM_calloc(src_p->shared->size); + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + } + + /* zero-set all destination bits */ + H5T__bit_set(d, dst_atomic.offset, dst_atomic.prec, false); + + /* Check for special cases: +0, -0, +Inf, -Inf, NaN */ + specval_type = H5T__conv_float_find_special(s, &src_atomic, &sign); + if (specval_type == H5T_CONV_FLOAT_SPECVAL_POSZERO || + specval_type == H5T_CONV_FLOAT_SPECVAL_NEGZERO) { + /* +0 or -0; Set all bits to zero */ + goto padding; + } + else if (specval_type != H5T_CONV_FLOAT_SPECVAL_REGULAR) { + /* If user's exception handler is present, use it */ + if (conv_ctx->u.conv.cb_struct.func) { + H5T_conv_except_t except_type; /* type of conversion exception that occurred */ + + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + if (specval_type == H5T_CONV_FLOAT_SPECVAL_POSINF) + except_type = H5T_CONV_EXCEPT_PINF; + else if (specval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) + except_type = H5T_CONV_EXCEPT_NINF; + else + except_type = H5T_CONV_EXCEPT_NAN; - /* The conversion loop */ - for (elmtno = 0; elmtno < nelmts; elmtno++) { - /* Set these variables to default */ - except_ret = H5T_CONV_UNHANDLED; - truncated = false; - reverse = true; + except_ret = (conv_ctx->u.conv.cb_struct.func)(except_type, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, + conv_ctx->u.conv.cb_struct.user_data); + } - /* - * If the source and destination buffers overlap then use a - * temporary buffer for the destination. - */ - if (direction > 0) { - s = sp; - d = elmtno < olap ? dbuf : dp; - } - else { - s = sp; - d = elmtno + olap >= nelmts ? dbuf : dp; + if (except_ret == H5T_CONV_UNHANDLED) { + if (specval_type == H5T_CONV_FLOAT_SPECVAL_NAN) + goto padding; /* Just set all bits to zero. */ + else if (specval_type == H5T_CONV_FLOAT_SPECVAL_POSINF) { + if (H5T_SGN_NONE == dst_atomic.u.i.sign) + H5T__bit_set(d, dst_atomic.offset, dst_atomic.prec, true); + else if (H5T_SGN_2 == dst_atomic.u.i.sign) + H5T__bit_set(d, dst_atomic.offset, dst_atomic.prec - 1, true); } -#ifndef NDEBUG - /* I don't quite trust the overlap calculations yet */ - if (d == dbuf) { - assert((dp >= sp && dp < sp + src_p->shared->size) || - (sp >= dp && sp < dp + dst_p->shared->size)); + else if (specval_type == H5T_CONV_FLOAT_SPECVAL_NEGINF) { + if (H5T_SGN_2 == dst_atomic.u.i.sign) + H5T__bit_set(d, dst_atomic.prec - 1, (size_t)1, true); } - else { - assert((dp < sp && dp + dst_p->shared->size <= sp) || - (sp < dp && sp + src_p->shared->size <= dp)); - } -#endif - /* - * Put the data in little endian order so our loops aren't so - * complicated. We'll do all the conversion stuff assuming - * little endian and then we'll fix the order at the end. - */ - if (H5T_ORDER_BE == src.order) { - half_size = src_p->shared->size / 2; - for (i = 0; i < half_size; i++) { - tmp1 = s[src_p->shared->size - (i + 1)]; - s[src_p->shared->size - (i + 1)] = s[i]; - s[i] = tmp1; + } + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + + goto padding; + } + + /* + * Get the exponent as an unsigned quantity from the section of + * the source bit field where it's located. Not expecting + * exponent to be greater than the maximal value of hssize_t. + */ + expo = (hssize_t)H5T__bit_get_d(s, src_atomic.u.f.epos, src_atomic.u.f.esize); + + /* + * Calculate the true source exponent by adjusting according to + * the source exponent bias. + */ + if (0 == expo || H5T_NORM_NONE == src_atomic.u.f.norm) + expo -= (hssize_t)(src_atomic.u.f.ebias - 1); + else if (H5T_NORM_IMPLIED == src_atomic.u.f.norm) + expo -= (hssize_t)src_atomic.u.f.ebias; + else + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet"); + + /* + * Get the mantissa as bit vector from the section of + * the source bit field where it's located. + * Keep the little-endian order in the buffer. + * A sequence 0x01020304 will be like in the buffer, + * 04 03 02 01 + * | | | | + * V V V V + * buf[0] buf[1] buf[2] buf[3] + */ + H5T__bit_copy(int_buf, (size_t)0, s, src_atomic.u.f.mpos, src_atomic.u.f.msize); + + /* + * Restore the implicit bit for mantissa if it's implied. + * Equivalent to mantissa |= (hsize_t)1 << src_atomic.u.f.msize. + */ + if (H5T_NORM_IMPLIED == src_atomic.u.f.norm) + H5T__bit_inc(int_buf, src_atomic.u.f.msize, 8 * int_buf_size - src_atomic.u.f.msize); + + /* + * What is the bit position for the most significant bit(MSB) of S + * which is set? This is checked before shifting and before possibly + * converting to a negative integer. Note that later use of this value + * assumes that H5T__bit_shift will always shift in 0 during a right + * shift. + */ + msb_pos_s = H5T__bit_find(int_buf, (size_t)0, src_atomic.prec, H5T_BIT_MSB, true); + + /* The temporary buffer has no bits set and must therefore be zero; nothing to do. */ + if (msb_pos_s < 0) + goto padding; + + /* + * Shift mantissa part by exponent minus mantissa size(right shift), + * or by mantissa size minus exponent(left shift). Example: Sequence + * 10...010111, expo=20, expo-msize=-3. Right-shift the sequence, we get + * 00010...10. The last three bits were dropped. + */ + shift_val = expo - (ssize_t)src_atomic.u.f.msize; + H5T__bit_shift(int_buf, shift_val, (size_t)0, int_buf_size * 8); + + /* Calculate the new position of the MSB after shifting and + * skip to the padding section if we shifted exactly to 0 + * (MSB position is -1) + */ + new_msb_pos = msb_pos_s + shift_val; + if (new_msb_pos == -1) + goto padding; + + /* + * If expo is less than mantissa size, the fractional value is dropped off + * during conversion. Set exception type to be "truncate" + */ + if ((size_t)expo < src_atomic.u.f.msize && conv_ctx->u.conv.cb_struct.func) + truncated = true; + + if (H5T_SGN_NONE == dst_atomic.u.i.sign) { /* destination is unsigned */ + /* + * Destination is unsigned. Library's default way: If the source value + * is greater than the maximal destination value then it overflows, the + * destination will be set to the maximum possible value. When the + * source is negative, underflow happens. Set the destination to be + * zero (do nothing). If user's exception handler is set, call it and + * let user handle it. + */ + if (sign) { /* source is negative */ + /* If user's exception handler is present, use it */ + if (conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, + src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + + if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); } - else if (H5T_ORDER_VAX == src.order) { - tsize = src_p->shared->size; - assert(0 == tsize % 2); + } + else { /* source is positive */ + if (new_msb_pos >= (ssize_t)dst_atomic.prec) { + /* overflow - if user's exception handler is present, use it */ + if (conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + } - for (i = 0; i < tsize; i += 4) { - tmp1 = s[i]; - tmp2 = s[i + 1]; + if (except_ret == H5T_CONV_UNHANDLED) + H5T__bit_set(d, dst_atomic.offset, dst_atomic.prec, true); + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + } + else { + /* If user's exception handler is present, use it */ + if (truncated && conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); - s[i] = s[(tsize - 2) - i]; - s[i + 1] = s[(tsize - 1) - i]; + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_TRUNCATE, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + } - s[(tsize - 2) - i] = tmp1; - s[(tsize - 1) - i] = tmp2; + if (except_ret == H5T_CONV_UNHANDLED) { + /* copy source value into it if case is ignored by user handler */ + if (new_msb_pos >= 0) + H5T__bit_copy(d, dst_atomic.offset, int_buf, (size_t)0, (size_t)new_msb_pos + 1); + } + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); } + } + } + else if (H5T_SGN_2 == dst_atomic.u.i.sign) { /* Destination is signed */ + if (sign) { /* source is negative */ + if ((new_msb_pos >= 0) && ((size_t)new_msb_pos < dst_atomic.prec - 1)) { + /* If user's exception handler is present, use it */ + if (truncated && conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); - /*zero-set all destination bits*/ - H5T__bit_set(d, dst.offset, dst.prec, false); + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_TRUNCATE, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + } - /* - * Find the sign bit value of the source. - */ - sign = (hssize_t)H5T__bit_get_d(s, src.u.f.sign, (size_t)1); + if (except_ret == H5T_CONV_UNHANDLED) { /* If this case ignored by user handler */ + /* Convert to integer representation. Equivalent to ~(value - 1). */ + H5T__bit_dec(int_buf, (size_t)0, dst_atomic.prec); + H5T__bit_neg(int_buf, (size_t)0, dst_atomic.prec); + + /* copy source value into destination */ + H5T__bit_copy(d, dst_atomic.offset, int_buf, (size_t)0, dst_atomic.prec - 1); + H5T__bit_set(d, (dst_atomic.offset + dst_atomic.prec - 1), (size_t)1, true); + } + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + } + else { + /* if underflows and no callback, do nothing except turn on + * the sign bit because 0x80...00 is the biggest negative value. + * If user's exception handler is present, use it + */ + if (conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); - /* - * Check for special cases: +0, -0, +Inf, -Inf, NaN - */ - if (H5T__bit_find(s, src.u.f.mpos, src.u.f.msize, H5T_BIT_LSB, true) < 0) { - if (H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, true) < 0) { - /* +0 or -0 */ - /* Set all bits to zero */ - goto padding; + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); } - else if (H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, false) < 0) { - /* +Infinity or -Infinity */ - if (sign) { /* -Infinity */ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_NINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - if (H5T_SGN_2 == dst.u.i.sign) - H5T__bit_set(d, dst.prec - 1, (size_t)1, true); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - } - else { /* +Infinity */ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_PINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - if (H5T_SGN_NONE == dst.u.i.sign) - H5T__bit_set(d, dst.offset, dst.prec, true); - else if (H5T_SGN_2 == dst.u.i.sign) - H5T__bit_set(d, dst.offset, dst.prec - 1, true); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - } - goto padding; + + if (except_ret == H5T_CONV_UNHANDLED) + H5T__bit_set(d, (dst_atomic.offset + dst_atomic.prec - 1), (size_t)1, true); + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); } - else if (H5T_NORM_NONE == src.u.f.norm && - H5T__bit_find(s, src.u.f.mpos, src.u.f.msize - 1, H5T_BIT_LSB, true) < 0 && - H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, false) < 0) { - /*This is a special case for the source of no implied mantissa bit. - *If the exponent bits are all 1s and only the 1st bit of mantissa - *is set to 1. It's infinity. The Intel-Linux "long double" is this case.*/ - /* +Infinity or -Infinity */ - if (sign) { /* -Infinity */ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_NINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - if (H5T_SGN_2 == dst.u.i.sign) - H5T__bit_set(d, dst.prec - 1, (size_t)1, true); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); + } + else { /* source is positive */ + if (new_msb_pos >= (ssize_t)dst_atomic.prec - 1) { + /* overflow - if user's exception handler is present, use it */ + if (conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); } - else { /* +Infinity */ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_PINF, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - if (H5T_SGN_NONE == dst.u.i.sign) - H5T__bit_set(d, dst.offset, dst.prec, true); - else if (H5T_SGN_2 == dst.u.i.sign) - H5T__bit_set(d, dst.offset, dst.prec - 1, true); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); + + if (except_ret == H5T_CONV_UNHANDLED) + H5T__bit_set(d, dst_atomic.offset, dst_atomic.prec - 1, true); + else if (except_ret == H5T_CONV_HANDLED) { + /* No need to reverse the order of destination because user handles it */ + reverse = false; + goto next; } - goto padding; + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); } - else if (H5T__bit_find(s, src.u.f.epos, src.u.f.esize, H5T_BIT_LSB, false) < 0) { - /* NaN */ - if (conv_ctx->u.conv.cb_struct.func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, src_p->shared->u.atomic.order); + else if (new_msb_pos < (ssize_t)dst_atomic.prec - 1) { + /* If user's exception handler is present, use it */ + if (truncated && conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_NAN, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, - src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + H5T_CONV_EXCEPT_TRUNCATE, conv_ctx->u.conv.src_type_id, + conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); } if (except_ret == H5T_CONV_UNHANDLED) { - /*Just set all bits to zero.*/ - goto padding; + /* copy source value into it if case is ignored by user handler */ + if (new_msb_pos >= 0) + H5T__bit_copy(d, dst_atomic.offset, int_buf, (size_t)0, (size_t)new_msb_pos + 1); } else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ + /* No need to reverse the order of destination because user handles it */ reverse = false; goto next; } else if (except_ret == H5T_CONV_ABORT) HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); - - goto padding; } + } + } - /* - * Get the exponent as an unsigned quantity from the section of - * the source bit field where it's located. Not expecting - * exponent to be greater than the maximal value of hssize_t. - */ - expo = (hssize_t)H5T__bit_get_d(s, src.u.f.epos, src.u.f.esize); +padding: + /* Set padding areas in destination. */ + if (dst_atomic.offset > 0) { + assert(H5T_PAD_ZERO == dst_atomic.lsb_pad || H5T_PAD_ONE == dst_atomic.lsb_pad); + H5T__bit_set(d, (size_t)0, dst_atomic.offset, (bool)(H5T_PAD_ONE == dst_atomic.lsb_pad)); + } + if (dst_atomic.offset + dst_atomic.prec != 8 * dst_p->shared->size) { + assert(H5T_PAD_ZERO == dst_atomic.msb_pad || H5T_PAD_ONE == dst_atomic.msb_pad); + H5T__bit_set(d, dst_atomic.offset + dst_atomic.prec, + 8 * dst_p->shared->size - (dst_atomic.offset + dst_atomic.prec), + (bool)(H5T_PAD_ONE == dst_atomic.msb_pad)); + } + + /* + * Put the destination in the correct byte order. See note at + * beginning of loop. + */ + if (H5T_ORDER_BE == dst_atomic.order && reverse) + for (size_t i = 0; i < dst_p->shared->size / 2; i++) + H5_SWAP_BYTES(d, i, dst_p->shared->size - (i + 1)); - /* - * Calculate the true source exponent by adjusting according to - * the source exponent bias. - */ - if (0 == expo || H5T_NORM_NONE == src.u.f.norm) { - expo -= (hssize_t)(src.u.f.ebias - 1); - } - else if (H5T_NORM_IMPLIED == src.u.f.norm) { - expo -= (hssize_t)src.u.f.ebias; - } - else { - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "normalization method not implemented yet"); - } +next: + /* + * If we had used a temporary buffer for the destination then we + * should copy the value to the true destination buffer. + */ + if (d == dbuf) + H5MM_memcpy(dp, d, dst_p->shared->size); - /* - * Get the mantissa as bit vector from the section of - * the source bit field where it's located. - * Keep the little-endian order in the buffer. - * A sequence 0x01020304 will be like in the buffer, - * 04 03 02 01 - * | | | | - * V V V V - * buf[0] buf[1] buf[2] buf[3] - */ - H5T__bit_copy(int_buf, (size_t)0, s, src.u.f.mpos, src.u.f.msize); + /* Advance source & destination pointers by delta amounts */ + sp += src_delta; + dp += dst_delta; - /* - * Restore the implicit bit for mantissa if it's implied. - * Equivalent to mantissa |= (hsize_t)1<u.conv.cb_struct.func) - truncated = true; - - if (H5T_SGN_NONE == dst.u.i.sign) { /*destination is unsigned*/ - /* - * Destination is unsigned. Library's default way: If the source value - * is greater than the maximal destination value then it overflows, the - * destination will be set to the maximum possible value. When the - * source is negative, underflow happens. Set the destination to be - * zero(do nothing). If user's exception handler is set, call it and - * let user handle it. - */ - if (sign) { /*source is negative*/ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - } - } - else { /*source is positive*/ - if (new_msb_pos >= (ssize_t)dst.prec) { - /*overflow*/ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) - H5T__bit_set(d, dst.offset, dst.prec, true); - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - } - else { - if (truncated && conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_TRUNCATE, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - /*copy source value into it if case is ignored by user handler*/ - if (new_msb_pos >= 0) - H5T__bit_copy(d, dst.offset, int_buf, (size_t)0, (size_t)new_msb_pos + 1); - } - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - } - } - } - else if (H5T_SGN_2 == dst.u.i.sign) { /*Destination is signed*/ - if (sign) { /*source is negative*/ - if ((new_msb_pos >= 0) && ((size_t)new_msb_pos < dst.prec - 1)) { - if (truncated && conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_TRUNCATE, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { /*If this case ignored by user handler*/ - /*Convert to integer representation. Equivalent to ~(value - 1).*/ - H5T__bit_dec(int_buf, (size_t)0, dst.prec); - H5T__bit_neg(int_buf, (size_t)0, dst.prec); - - /*copy source value into destination*/ - H5T__bit_copy(d, dst.offset, int_buf, (size_t)0, dst.prec - 1); - H5T__bit_set(d, (dst.offset + dst.prec - 1), (size_t)1, true); - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - } - else { - /* if underflows and no callback, do nothing except turn on - * the sign bit because 0x80...00 is the biggest negative value. - */ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) - H5T__bit_set(d, (dst.offset + dst.prec - 1), (size_t)1, true); - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - } - } - else { /*source is positive*/ - if (new_msb_pos >= (ssize_t)dst.prec - 1) { - /*overflow*/ - if (conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) - H5T__bit_set(d, dst.offset, dst.prec - 1, true); - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - } - else if (new_msb_pos < (ssize_t)dst.prec - 1) { - if (truncated && conv_ctx->u.conv.cb_struct - .func) { /*If user's exception handler is present, use it*/ - /*reverse order first*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_TRUNCATE, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, - conv_ctx->u.conv.cb_struct.user_data); - } - - if (except_ret == H5T_CONV_UNHANDLED) { - /*copy source value into it if case is ignored by user handler*/ - if (new_msb_pos >= 0) - H5T__bit_copy(d, dst.offset, int_buf, (size_t)0, (size_t)new_msb_pos + 1); - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - /*No need to reverse the order of destination because user handles it*/ - reverse = false; - goto next; - } - } - } - } + switch (cdata->command) { + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ -padding: - /* - * Set padding areas in destination. - */ - if (dst.offset > 0) { - assert(H5T_PAD_ZERO == dst.lsb_pad || H5T_PAD_ONE == dst.lsb_pad); - H5T__bit_set(d, (size_t)0, dst.offset, (bool)(H5T_PAD_ONE == dst.lsb_pad)); - } - if (dst.offset + dst.prec != 8 * dst_p->shared->size) { - assert(H5T_PAD_ZERO == dst.msb_pad || H5T_PAD_ONE == dst.msb_pad); - H5T__bit_set(d, dst.offset + dst.prec, 8 * dst_p->shared->size - (dst.offset + dst.prec), - (bool)(H5T_PAD_ONE == dst.msb_pad)); - } + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (!H5T_IS_ATOMIC(dst_p->shared->parent->shared)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid complex number datatype"); + src_atomic = src_p->shared->u.atomic; + dst_atomic = dst_p->shared->parent->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order && + H5T_ORDER_VAX != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for source datatype"); + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for destination datatype"); + if (dst_p->shared->size > TEMP_FLOAT_CONV_BUFFER_SIZE) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination datatype size is too large"); + if (8 * sizeof(int64_t) - 1 < src_atomic.u.f.esize || + 8 * sizeof(int64_t) - 1 < dst_atomic.u.f.esize) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); + cdata->need_bkg = H5T_BKG_NO; - /* - * Put the destination in the correct byte order. See note at - * beginning of loop. - */ - if (H5T_ORDER_BE == dst.order && reverse) { - half_size = dst_p->shared->size / 2; - for (i = 0; i < half_size; i++) { - tmp1 = d[dst_p->shared->size - (i + 1)]; - d[dst_p->shared->size - (i + 1)] = d[i]; - d[i] = tmp1; - } - } + break; + } -next: - /* - * If we had used a temporary buffer for the destination then we - * should copy the value to the true destination buffer. - */ - if (d == dbuf) - H5MM_memcpy(dp, d, dst_p->shared->size); - if (buf_stride) { - sp += direction * (ssize_t)buf_stride; - dp += direction * (ssize_t)buf_stride; - } - else { - sp += direction * (ssize_t)src_p->shared->size; - dp += direction * (ssize_t)dst_p->shared->size; - } + case H5T_CONV_FREE: + break; + + case H5T_CONV_CONV: + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (NULL == conv_ctx) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); - memset(int_buf, 0, buf_size); + /* Are we converting between a floating-point type and a complex number + * type consisting of the same floating-point type? + */ + equal_cplx_conv = (0 == H5T_cmp(src_p, dst_p->shared->parent, false)); + if (!equal_cplx_conv) { + /* If floating-point types differ, use generic f_f loop */ + if (H5T__conv_f_f_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); + } + else { + /* If floating-point types are the same, use specialized loop */ + if (H5T__conv_complex_f_matched(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); } break; default: HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); - } /* end switch */ + } done: - if (int_buf) - H5MM_xfree(int_buf); - if (src_rev) - H5MM_free(src_rev); - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5T__conv_f_i() */ +} /* end H5T__conv_f_complex() */ #ifdef H5_HAVE__FLOAT16 /*------------------------------------------------------------------------- @@ -1512,6 +1609,59 @@ H5T__conv__Float16_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, { H5T_CONV_fF(FLOAT16, LDOUBLE, H5__Float16, long double, -, -); } + +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv__Float16_fcomplex + * + * Purpose: Converts `_Float16' to `float _Complex' / `_Fcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv__Float16_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fZ(FLOAT16, FLOAT_COMPLEX, H5__Float16, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv__Float16_dcomplex + * + * Purpose: Converts `_Float16' to `double _Complex' / `_Dcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv__Float16_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fZ(FLOAT16, DOUBLE_COMPLEX, H5__Float16, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv__Float16_lcomplex + * + * Purpose: Converts `_Float16' to `long double _Complex' / `_Lcomplex' + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv__Float16_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fZ(FLOAT16, LDOUBLE_COMPLEX, H5__Float16, H5_ldouble_complex, -, -); +} +#endif #endif /*------------------------------------------------------------------------- @@ -1773,6 +1923,65 @@ H5T__conv_float_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, co H5T_CONV_fF(FLOAT, LDOUBLE, float, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_float_fcomplex + * + * Purpose: Convert native `float' to native + * `float _Complex' / `_Fcomplex' using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_float_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fz(FLOAT, FLOAT_COMPLEX, float, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_float_dcomplex + * + * Purpose: Convert native `float' to native + * `double _Complex' / `_Dcomplex' using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_float_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fZ(FLOAT, DOUBLE_COMPLEX, float, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_float_lcomplex + * + * Purpose: Convert native `float' to native + * `long double _Complex' / `_Lcomplex' using hardware. This + * is a fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_float_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fZ(FLOAT, LDOUBLE_COMPLEX, float, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_double_schar * @@ -2032,6 +2241,65 @@ H5T__conv_double_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, c H5T_CONV_fF(DOUBLE, LDOUBLE, double, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_double_fcomplex + * + * Purpose: Convert native `double' to native + * `float _Complex' / `_Fcomplex' using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_double_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Fz(DOUBLE, FLOAT_COMPLEX, double, H5_float_complex, -FLT_MAX, FLT_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_double_dcomplex + * + * Purpose: Convert native `double' to native + * `double _Complex' / `_Dcomplex' using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_double_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fz(DOUBLE, DOUBLE_COMPLEX, double, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_double_lcomplex + * + * Purpose: Convert native `double' to native + * `long double _Complex' / `_Lcomplex' using hardware. This + * is a fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_double_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fZ(DOUBLE, LDOUBLE_COMPLEX, double, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_ldouble_schar * @@ -2296,3 +2564,62 @@ H5T__conv_ldouble_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, c { H5T_CONV_Ff(LDOUBLE, DOUBLE, long double, double, -DBL_MAX, DBL_MAX); } + +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_ldouble_fcomplex + * + * Purpose: Convert native `long double' to native + * `float _Complex' / `_Fcomplex' using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ldouble_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Fz(LDOUBLE, FLOAT_COMPLEX, long double, H5_float_complex, -FLT_MAX, FLT_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_ldouble_dcomplex + * + * Purpose: Convert native `long double' to native + * `double _Complex' / `_Dcomplex' using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ldouble_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_Fz(LDOUBLE, DOUBLE_COMPLEX, long double, H5_double_complex, -DBL_MAX, DBL_MAX); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_ldouble_lcomplex + * + * Purpose: Convert native `long double' to native + * `long double _Complex' / `_Lcomplex' using hardware. This + * is a fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ldouble_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_fz(LDOUBLE, LDOUBLE_COMPLEX, long double, H5_ldouble_complex, -, -); +} +#endif diff --git a/src/H5Tconv_float.h b/src/H5Tconv_float.h index df349d26874..e5413fc0d22 100644 --- a/src/H5Tconv_float.h +++ b/src/H5Tconv_float.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,10 +16,40 @@ /* Private headers needed by this file */ #include "H5Tpkg.h" +/*************************/ +/* Module private macros */ +/*************************/ + +#define TEMP_FLOAT_CONV_BUFFER_SIZE 64 + +/****************************/ +/* Library Private Typedefs */ +/****************************/ + +/* floating-point value type (regular, +/-0, +/-Inf, NaN) */ +typedef enum { + H5T_CONV_FLOAT_SPECVAL_REGULAR, + H5T_CONV_FLOAT_SPECVAL_POSZERO, + H5T_CONV_FLOAT_SPECVAL_NEGZERO, + H5T_CONV_FLOAT_SPECVAL_POSINF, + H5T_CONV_FLOAT_SPECVAL_NEGINF, + H5T_CONV_FLOAT_SPECVAL_NAN, +} H5T_conv_float_specval_t; + /***********************/ /* Function Prototypes */ /***********************/ +/* Helper functions shared between conversion modules */ +H5_DLL herr_t H5T__conv_f_f_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, void *buf); +H5_DLL herr_t H5T__conv_f_i_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, void *buf); + +H5_DLL H5T_conv_float_specval_t H5T__conv_float_find_special(const uint8_t *src_buf, + const H5T_atomic_t *src_atomic, + uint64_t *sign_out); + /****************************************/ /* Soft (emulated) conversion functions */ /****************************************/ @@ -33,6 +63,9 @@ H5_DLL herr_t H5T__conv_f_f(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cda H5_DLL herr_t H5T__conv_f_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *_buf, void *bkg); +H5_DLL herr_t H5T__conv_f_complex(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); /*********************************************/ /* Hard (compiler cast) conversion functions */ @@ -79,6 +112,17 @@ H5_DLL herr_t H5T__conv__Float16_double(const H5T_t *st, const H5T_t *dt, H5T_cd H5_DLL herr_t H5T__conv__Float16_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv__Float16_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv__Float16_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv__Float16_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif #endif /* Conversion functions for 'float' */ @@ -123,6 +167,17 @@ H5_DLL herr_t H5T__conv_float_double(const H5T_t *src, const H5T_t *dst, H5T_cda H5_DLL herr_t H5T__conv_float_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_float_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_float_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_float_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'double' */ H5_DLL herr_t H5T__conv_double_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -166,6 +221,17 @@ H5_DLL herr_t H5T__conv_double_float(const H5T_t *src, const H5T_t *dst, H5T_cda H5_DLL herr_t H5T__conv_double_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_double_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_double_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_double_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'long double' */ H5_DLL herr_t H5T__conv_ldouble_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -211,5 +277,16 @@ H5_DLL herr_t H5T__conv_ldouble_float(const H5T_t *src, const H5T_t *dst, H5T_cd H5_DLL herr_t H5T__conv_ldouble_double(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_ldouble_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_ldouble_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_ldouble_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif #endif /* H5Tconv_float_H */ diff --git a/src/H5Tconv_integer.c b/src/H5Tconv_integer.c index 9128f777a79..b2af085c064 100644 --- a/src/H5Tconv_integer.c +++ b/src/H5Tconv_integer.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,7 +22,8 @@ /***********/ /* Headers */ /***********/ -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_macros.h" #include "H5Tconv_integer.h" @@ -118,7 +119,9 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst->shared->size); /* Allocate space for order-reversed source buffer */ - src_rev = (uint8_t *)H5MM_calloc(src->shared->size); + if (conv_ctx->u.conv.cb_struct.func) + if (NULL == (src_rev = H5MM_calloc(src->shared->size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "unable to allocate temporary buffer"); /* The conversion loop */ for (elmtno = 0; elmtno < nelmts; elmtno++) { @@ -198,8 +201,8 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ /*overflow*/ if (conv_ctx->u.conv.cb_struct .func) { /*If user's exception handler is present, use it*/ - H5T__reverse_order(src_rev, s, src->shared->size, - src->shared->u.atomic.order); /*reverse order first*/ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src); except_ret = (conv_ctx->u.conv.cb_struct.func)( H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, d, @@ -234,8 +237,8 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ /*overflow - source is negative*/ if (conv_ctx->u.conv.cb_struct .func) { /*If user's exception handler is present, use it*/ - H5T__reverse_order(src_rev, s, src->shared->size, - src->shared->u.atomic.order); /*reverse order first*/ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src); except_ret = (conv_ctx->u.conv.cb_struct.func)( H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, d, @@ -262,8 +265,8 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ /*overflow - source is positive*/ if (conv_ctx->u.conv.cb_struct .func) { /*If user's exception handler is present, use it*/ - H5T__reverse_order(src_rev, s, src->shared->size, - src->shared->u.atomic.order); /*reverse order first*/ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src); except_ret = (conv_ctx->u.conv.cb_struct.func)( H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, d, @@ -295,8 +298,8 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ /*overflow*/ if (conv_ctx->u.conv.cb_struct .func) { /*If user's exception handler is present, use it*/ - H5T__reverse_order(src_rev, s, src->shared->size, - src->shared->u.atomic.order); /*reverse order first*/ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src); except_ret = (conv_ctx->u.conv.cb_struct.func)( H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, d, @@ -343,8 +346,8 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ /*overflow*/ if (conv_ctx->u.conv.cb_struct .func) { /*If user's exception handler is present, use it*/ - H5T__reverse_order(src_rev, s, src->shared->size, - src->shared->u.atomic.order); /*reverse order first*/ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src); except_ret = (conv_ctx->u.conv.cb_struct.func)( H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, d, @@ -386,8 +389,8 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ /*overflow*/ if (conv_ctx->u.conv.cb_struct .func) { /*If user's exception handler is present, use it*/ - H5T__reverse_order(src_rev, s, src->shared->size, - src->shared->u.atomic.order); /*reverse order first*/ + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src); except_ret = (conv_ctx->u.conv.cb_struct.func)( H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, src_rev, d, @@ -475,425 +478,537 @@ H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_ } /* end H5T__conv_i_i() */ /*------------------------------------------------------------------------- - * Function: H5T__conv_i_f + * Function: H5T__conv_i_f_loop * - * Purpose: Convert one integer type to a floating-point type. This is - * the catch-all function for integer-float conversions and - * is probably not particularly fast. + * Purpose: Implements the body of the conversion loop when converting + * integer values to floating-point values (including complex + * number values). Encapsulates common code that is shared + * between the H5T__conv_i_f conversion function and other + * functions where the logic is nearly identical, such as + * H5T__conv_i_complex. * * Return: Non-negative on success/Negative on failure * *------------------------------------------------------------------------- */ herr_t -H5T__conv_i_f(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, - size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, - void H5_ATTR_UNUSED *bkg) +H5T__conv_i_f_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, + size_t buf_stride, void *buf) { - /* Traversal-related variables */ - H5T_atomic_t src; /*atomic source info */ - H5T_atomic_t dst; /*atomic destination info */ - int direction; /*forward or backward traversal */ - size_t elmtno; /*element number */ - size_t half_size; /*half the type size */ - size_t tsize; /*type size for swapping bytes */ - size_t olap; /*num overlapping elements */ - uint8_t *s, *sp, *d, *dp; /*source and dest traversal ptrs*/ - uint8_t *src_rev = NULL; /*order-reversed source buffer */ - uint8_t dbuf[64] = {0}; /*temp destination buffer */ - uint8_t tmp1, tmp2; /*temp variables for swapping bytes*/ - - /* Conversion-related variables */ - hsize_t expo; /*destination exponent */ - hsize_t expo_max; /*maximal possible exponent value */ - size_t sign; /*source sign bit value */ - bool is_max_neg; /*source is maximal negative value*/ - bool do_round; /*whether there is roundup */ - uint8_t *int_buf = NULL; /*buffer for temporary value */ - size_t buf_size; /*buffer size for temporary value */ - size_t i; /*miscellaneous counters */ - size_t first; /*first bit(MSB) in an integer */ - ssize_t sfirst; /*a signed version of `first' */ - H5T_conv_ret_t except_ret; /*return of callback function */ - bool reverse; /*if reverse the order of destination */ - herr_t ret_value = SUCCEED; /* Return value */ + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ + hsize_t expo_max; /* maximal possible exponent value */ + ssize_t src_delta, dst_delta; /* source & destination stride */ + uint8_t *s, *sp, *d, *dp; /* source and dest traversal ptrs */ + uint8_t *int_buf = NULL; /* buffer for temporary value */ + uint8_t *src_rev = NULL; /* order-reversed source buffer */ + size_t int_buf_size; /* buffer size for temporary value */ + size_t olap; /* num overlapping elements */ + int direction; /* forward or backward traversal */ + herr_t ret_value = SUCCEED; FUNC_ENTER_PACKAGE - switch (cdata->command) { - case H5T_CONV_INIT: - if (NULL == src_p || NULL == dst_p) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); - src = src_p->shared->u.atomic; - dst = dst_p->shared->u.atomic; - if (H5T_ORDER_LE != dst.order && H5T_ORDER_BE != dst.order && H5T_ORDER_VAX != dst.order) - HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); - if (dst_p->shared->size > sizeof(dbuf)) - HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large"); - if (8 * sizeof(expo) - 1 < src.u.f.esize) - HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); - cdata->need_bkg = H5T_BKG_NO; - break; - - case H5T_CONV_FREE: - break; - - case H5T_CONV_CONV: - if (NULL == src_p || NULL == dst_p) - HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); - if (NULL == conv_ctx) - HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); - - src = src_p->shared->u.atomic; - dst = dst_p->shared->u.atomic; + assert(src_p); + assert(src_p->shared->type == H5T_INTEGER); + assert(dst_p); + assert(dst_p->shared->type == H5T_FLOAT || dst_p->shared->type == H5T_COMPLEX); + assert(conv_ctx); + assert(buf); + + src_atomic = src_p->shared->u.atomic; + if (dst_p->shared->type == H5T_COMPLEX) + dst_atomic = dst_p->shared->parent->shared->u.atomic; + else + dst_atomic = dst_p->shared->u.atomic; + + /* + * Do we process the values from beginning to end or vice versa? Also, + * how many of the elements have the source and destination areas + * overlapping? + */ + if (src_p->shared->size == dst_p->shared->size || buf_stride) { + sp = dp = (uint8_t *)buf; + direction = 1; + olap = nelmts; + } + else if (src_p->shared->size >= dst_p->shared->size) { + double olap_d = + ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); + olap = (size_t)olap_d; + sp = dp = (uint8_t *)buf; + direction = 1; + } + else { + double olap_d = + ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); + olap = (size_t)olap_d; + sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; + dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; + direction = -1; + } + + /* Direction & size of buffer traversal */ + H5_CHECK_OVERFLOW(buf_stride, size_t, ssize_t); + H5_CHECK_OVERFLOW(src_p->shared->size, size_t, ssize_t); + H5_CHECK_OVERFLOW(dst_p->shared->size, size_t, ssize_t); + src_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : src_p->shared->size); + dst_delta = (ssize_t)direction * (ssize_t)(buf_stride ? buf_stride : dst_p->shared->size); + + /* Allocate enough space for the buffer holding temporary converted value */ + int_buf_size = + ((src_atomic.prec > dst_atomic.u.f.msize ? src_atomic.prec : dst_atomic.u.f.msize) + 7) / 8; + if (NULL == (int_buf = H5MM_calloc(int_buf_size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "couldn't allocate temporary buffer"); + + /* Allocate space for order-reversed source buffer */ + if (conv_ctx->u.conv.cb_struct.func) + if (NULL == (src_rev = H5MM_calloc(src_p->shared->size))) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTALLOC, FAIL, "couldn't allocate temporary buffer"); + + /* The conversion loop */ + for (size_t elmtno = 0; elmtno < nelmts; elmtno++) { + H5T_conv_ret_t except_ret = H5T_CONV_UNHANDLED; /* return of conversion exception callback function */ + hsize_t expo; /* destination exponent */ + uint8_t dbuf[TEMP_INT_CONV_BUFFER_SIZE] = {0}; /* temp destination buffer */ + ssize_t sfirst = 0; /* a signed version of `first' */ + size_t first; /* first bit(MSB) in an integer */ + size_t sign = 0; /* source sign bit value */ + bool reverse = true; /* if reversed the order of destination */ + bool is_max_neg = false; /* source is maximal negative value? */ + bool do_round = false; /* whether there is roundup */ + + /* + * If the source and destination buffers overlap then use a + * temporary buffer for the destination. + */ + if (direction > 0) { + s = sp; + d = elmtno < olap ? dbuf : dp; + } + else { + s = sp; + d = elmtno + olap >= nelmts ? dbuf : dp; + } +#ifndef NDEBUG + if (d == dbuf) { + assert((dp >= sp && dp < sp + src_p->shared->size) || + (sp >= dp && sp < dp + dst_p->shared->size)); + } + else { + assert((dp < sp && dp + dst_p->shared->size <= sp) || + (sp < dp && sp + src_p->shared->size <= dp)); + } +#endif - /* - * Do we process the values from beginning to end or vice versa? Also, - * how many of the elements have the source and destination areas - * overlapping? - */ - if (src_p->shared->size == dst_p->shared->size || buf_stride) { - sp = dp = (uint8_t *)buf; - direction = 1; - olap = nelmts; - } - else if (src_p->shared->size >= dst_p->shared->size) { - double olap_d = - ceil((double)(dst_p->shared->size) / (double)(src_p->shared->size - dst_p->shared->size)); - olap = (size_t)olap_d; - sp = dp = (uint8_t *)buf; - direction = 1; + /* Put the data in little endian order so our loops aren't so + * complicated. We'll do all the conversion stuff assuming + * little endian and then we'll fix the order at the end. + */ + if (H5T_ORDER_BE == src_atomic.order) + for (size_t i = 0; i < src_p->shared->size / 2; i++) + H5_SWAP_BYTES(s, i, src_p->shared->size - (i + 1)); + + /* Zero-set all destination bits */ + H5T__bit_set(d, dst_atomic.offset, dst_atomic.prec, false); + + /* Copy source into a temporary buffer */ + H5T__bit_copy(int_buf, (size_t)0, s, src_atomic.offset, src_atomic.prec); + + /* Find the sign bit value of the source */ + if (H5T_SGN_2 == src_atomic.u.i.sign) + sign = (size_t)H5T__bit_get_d(int_buf, src_atomic.prec - 1, (size_t)1); + + /* What is the bit position(starting from 0 as first one) for the most significant + * bit(MSB) of S which is set? + */ + if (H5T_SGN_2 == src_atomic.u.i.sign) { + sfirst = H5T__bit_find(int_buf, (size_t)0, src_atomic.prec - 1, H5T_BIT_MSB, true); + if (sign && sfirst < 0) + /* The case 0x80...00, which is negative with maximal value */ + is_max_neg = 1; + } + else if (H5T_SGN_NONE == src_atomic.u.i.sign) + sfirst = H5T__bit_find(int_buf, (size_t)0, src_atomic.prec, H5T_BIT_MSB, true); + + /* Handle special cases here. Integer is zero */ + if (!sign && sfirst < 0) + goto padding; + + /* Convert source integer if it's negative */ + if (H5T_SGN_2 == src_atomic.u.i.sign && sign) { + if (!is_max_neg) { + /* Equivalent to ~(i - 1) */ + H5T__bit_dec(int_buf, (size_t)0, int_buf_size * 8); + H5T__bit_neg(int_buf, (size_t)0, int_buf_size * 8); + sfirst = H5T__bit_find(int_buf, (size_t)0, src_atomic.prec - 1, H5T_BIT_MSB, true); } else { - double olap_d = - ceil((double)(src_p->shared->size) / (double)(dst_p->shared->size - src_p->shared->size)); - olap = (size_t)olap_d; - sp = (uint8_t *)buf + (nelmts - 1) * src_p->shared->size; - dp = (uint8_t *)buf + (nelmts - 1) * dst_p->shared->size; - direction = -1; + /* If it's maximal negative number 0x80...000, treat it as if it overflowed + * (create a carry) to help conversion. i.e. a character type number 0x80 + * is treated as 0x100. + */ + sfirst = (ssize_t)(src_atomic.prec - 1); + is_max_neg = 0; } + if (sfirst < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "zero bit not found"); - /* Allocate enough space for the buffer holding temporary - * converted value + /* Sign bit has been negated if bit vector isn't 0x80...00. Set all bits in front of + * sign bit to 0 in the temporary buffer because they're all negated from the previous + * step. */ - buf_size = ((src.prec > dst.u.f.msize ? src.prec : dst.u.f.msize) + 7) / 8; - int_buf = (uint8_t *)H5MM_calloc(buf_size); - - /* Allocate space for order-reversed source buffer */ - src_rev = (uint8_t *)H5MM_calloc(src_p->shared->size); - - /* The conversion loop */ - for (elmtno = 0; elmtno < nelmts; elmtno++) { - /* Set these variables to default */ - except_ret = H5T_CONV_UNHANDLED; - reverse = true; + H5T__bit_set(int_buf, src_atomic.prec, (int_buf_size * 8) - src_atomic.prec, 0); + + /* Set sign bit in destination */ + H5T__bit_set_d(d, dst_atomic.u.f.sign, (size_t)1, (hsize_t)sign); + } + + first = (size_t)sfirst; + + /* Calculate the true destination exponent by adjusting according to + * the destination exponent bias. Implied and non-implied normalization + * should be the same. + */ + if (H5T_NORM_NONE == dst_atomic.u.f.norm || H5T_NORM_IMPLIED == dst_atomic.u.f.norm) + expo = first + dst_atomic.u.f.ebias; + else + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "normalization method not implemented yet"); + + /* Handle mantissa part here */ + if (H5T_NORM_IMPLIED == dst_atomic.u.f.norm) + H5T__bit_set(int_buf, first, (size_t)1, 0); /* Imply first bit */ + else if (H5T_NORM_NONE == dst_atomic.u.f.norm) + first++; + + /* Roundup for mantissa */ + if (first > dst_atomic.u.f.msize) { + /* If the bit sequence is bigger than the mantissa part, there'll be some + * precision loss. Let user's handler deal with the case if it's present + */ + if (conv_ctx->u.conv.cb_struct.func) { + /* reverse source buffer order first */ + H5T__reverse_order(src_rev, s, src_p); + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_PRECISION, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, + src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + } - /* Make sure these variables are reset to 0. */ - sign = 0; /*source sign bit value */ - is_max_neg = 0; /*source is maximal negative value*/ - do_round = 0; /*whether there is roundup */ - sfirst = 0; + if (except_ret == H5T_CONV_HANDLED) { + reverse = false; + goto padding; + } + else if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); - /* - * If the source and destination buffers overlap then use a - * temporary buffer for the destination. - */ - if (direction > 0) { - s = sp; - d = elmtno < olap ? dbuf : dp; - } - else { - s = sp; - d = elmtno + olap >= nelmts ? dbuf : dp; - } -#ifndef NDEBUG - /* I don't quite trust the overlap calculations yet */ - if (d == dbuf) { - assert((dp >= sp && dp < sp + src_p->shared->size) || - (sp >= dp && sp < dp + dst_p->shared->size)); - } - else { - assert((dp < sp && dp + dst_p->shared->size <= sp) || - (sp < dp && sp + src_p->shared->size <= dp)); - } -#endif + /* If user's exception handler does deal with it, we do it by dropping off the + * extra bits at the end and do rounding. If we have .50...0(decimal) after radix + * point, we do roundup when the least significant digit before radix is odd, we do + * rounddown if it's even. + */ - /* Put the data in little endian order so our loops aren't so - * complicated. We'll do all the conversion stuff assuming - * little endian and then we'll fix the order at the end. - */ - if (H5T_ORDER_BE == src.order) { - half_size = src_p->shared->size / 2; - for (i = 0; i < half_size; i++) { - tmp1 = s[src_p->shared->size - (i + 1)]; - s[src_p->shared->size - (i + 1)] = s[i]; - s[i] = tmp1; - } + /* Check 1st dropoff bit, see if it's set. */ + if (H5T__bit_get_d(int_buf, ((first - dst_atomic.u.f.msize) - 1), (size_t)1)) { + /* Check all bits after 1st dropoff bit, see if any of them is set. */ + if (((first - dst_atomic.u.f.msize) - 1) > 0 && + H5T__bit_get_d(int_buf, (size_t)0, ((first - dst_atomic.u.f.msize) - 1))) + do_round = 1; + else { /* The .50...0 case */ + /* Check if the least significant bit is odd. */ + if (H5T__bit_get_d(int_buf, (first - dst_atomic.u.f.msize), (size_t)1)) + do_round = 1; } + } - /* Zero-set all destination bits*/ - H5T__bit_set(d, dst.offset, dst.prec, false); - - /* Copy source into a temporary buffer */ - H5T__bit_copy(int_buf, (size_t)0, s, src.offset, src.prec); + /* Right shift to drop off extra bits */ + H5T__bit_shift(int_buf, (ssize_t)(dst_atomic.u.f.msize - first), (size_t)0, int_buf_size * 8); - /* Find the sign bit value of the source */ - if (H5T_SGN_2 == src.u.i.sign) - sign = (size_t)H5T__bit_get_d(int_buf, src.prec - 1, (size_t)1); + if (do_round) { + H5T__bit_inc(int_buf, (size_t)0, int_buf_size * 8); + do_round = 0; - /* What is the bit position(starting from 0 as first one) for the most significant - * bit(MSB) of S which is set? + /* If integer is like 0x0ff...fff and we need to round up the + * last f, we get 0x100...000. Treat this special case here. */ - if (H5T_SGN_2 == src.u.i.sign) { - sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec - 1, H5T_BIT_MSB, true); - if (sign && sfirst < 0) - /* The case 0x80...00, which is negative with maximal value */ - is_max_neg = 1; - } - else if (H5T_SGN_NONE == src.u.i.sign) - sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec, H5T_BIT_MSB, true); - - /* Handle special cases here. Integer is zero */ - if (!sign && sfirst < 0) - goto padding; - - /* Convert source integer if it's negative */ - if (H5T_SGN_2 == src.u.i.sign && sign) { - if (!is_max_neg) { - /* Equivalent to ~(i - 1) */ - H5T__bit_dec(int_buf, (size_t)0, buf_size * 8); - H5T__bit_neg(int_buf, (size_t)0, buf_size * 8); - sfirst = H5T__bit_find(int_buf, (size_t)0, src.prec - 1, H5T_BIT_MSB, true); + if (H5T__bit_get_d(int_buf, dst_atomic.u.f.msize, (size_t)1)) { + if (H5T_NORM_IMPLIED == dst_atomic.u.f.norm) { + /* The bit at this 1's position was impled already, so this + * number should be 0x200...000. We need to increment the + * exponent in this case. + */ + expo++; } - else { - /* If it's maximal negative number 0x80...000, treat it as if it overflowed - * (create a carry) to help conversion. i.e. a character type number 0x80 - * is treated as 0x100. + else if (H5T_NORM_NONE == dst_atomic.u.f.norm) { + /* Right shift 1 bit to let the carried 1 fit in the mantissa, + * and increment exponent by 1. */ - sfirst = (ssize_t)(src.prec - 1); - is_max_neg = 0; + H5T__bit_shift(int_buf, (ssize_t)-1, (size_t)0, int_buf_size * 8); + expo++; } - if (sfirst < 0) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "zero bit not found"); + } + } + } + else { + /* The bit sequence can fit mantissa part. Left shift to fit in from high-order of + * bit position. */ + H5T__bit_shift(int_buf, (ssize_t)(dst_atomic.u.f.msize - first), (size_t)0, dst_atomic.u.f.msize); + } + + /* Check if the exponent is too big */ + expo_max = (hsize_t)(pow(2.0, (double)dst_atomic.u.f.esize) - 1); + + if (expo > expo_max) { /* overflows */ + if (conv_ctx->u.conv.cb_struct.func) { + /* user's exception handler. Reverse back source order */ + H5T__reverse_order(src_rev, s, src_p); + except_ret = (conv_ctx->u.conv.cb_struct.func)( + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, + src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + + if (except_ret == H5T_CONV_ABORT) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); + else if (except_ret == H5T_CONV_HANDLED) { + reverse = false; + goto padding; + } + } - /* Sign bit has been negated if bit vector isn't 0x80...00. Set all bits in front of - * sign bit to 0 in the temporary buffer because they're all negated from the previous - * step. - */ - H5T__bit_set(int_buf, src.prec, (buf_size * 8) - src.prec, 0); + if (!conv_ctx->u.conv.cb_struct.func || (except_ret == H5T_CONV_UNHANDLED)) { + /* Make destination infinity by setting exponent to maximal number and mantissa to zero. */ + expo = expo_max; + memset(int_buf, 0, int_buf_size); + } + } - /* Set sign bit in destination */ - H5T__bit_set_d(d, dst.u.f.sign, (size_t)1, (hsize_t)sign); - } /* end if */ + if (except_ret == H5T_CONV_UNHANDLED) { + /* Set exponent in destination */ + H5T__bit_set_d(d, dst_atomic.u.f.epos, dst_atomic.u.f.esize, expo); - first = (size_t)sfirst; + /* Copy mantissa into destination */ + H5T__bit_copy(d, dst_atomic.u.f.mpos, int_buf, (size_t)0, + (int_buf_size * 8) > dst_atomic.u.f.msize ? dst_atomic.u.f.msize + : int_buf_size * 8); + } - /* Calculate the true destination exponent by adjusting according to - * the destination exponent bias. Implied and non-implied normalization - * should be the same. - */ - if (H5T_NORM_NONE == dst.u.f.norm || H5T_NORM_IMPLIED == dst.u.f.norm) { - expo = first + dst.u.f.ebias; - } - else { - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "normalization method not implemented yet"); +padding: + /* Set padding areas in destination. */ + if (dst_atomic.offset > 0) { + assert(H5T_PAD_ZERO == dst_atomic.lsb_pad || H5T_PAD_ONE == dst_atomic.lsb_pad); + H5T__bit_set(d, (size_t)0, dst_atomic.offset, (bool)(H5T_PAD_ONE == dst_atomic.lsb_pad)); + } + { + size_t type_size; + + if (dst_p->shared->type == H5T_FLOAT) + type_size = dst_p->shared->size; + else + type_size = dst_p->shared->parent->shared->size; + + if (dst_atomic.offset + dst_atomic.prec != 8 * type_size) { + assert(H5T_PAD_ZERO == dst_atomic.msb_pad || H5T_PAD_ONE == dst_atomic.msb_pad); + H5T__bit_set(d, dst_atomic.offset + dst_atomic.prec, + 8 * type_size - (dst_atomic.offset + dst_atomic.prec), + (bool)(H5T_PAD_ONE == dst_atomic.msb_pad)); + } + } + + /* + * Put the destination in the correct byte order. See note at + * beginning of loop. Only the "real" part of a complex number + * element is swapped. By the C standard, the "imaginary" part + * should just be zeroed when converting a real value to a + * complex value. + */ + if (H5T_ORDER_BE == dst_atomic.order && reverse) { + size_t half_size = dst_p->shared->size / 2; + + if (H5T_FLOAT == dst_p->shared->type) { + for (size_t i = 0; i < half_size; i++) + H5_SWAP_BYTES(d, i, dst_p->shared->size - (i + 1)); + } + else { + for (size_t i = 0; i < half_size / 2; i++) + H5_SWAP_BYTES(d, i, half_size - (i + 1)); + } + } + else if (H5T_ORDER_VAX == dst_atomic.order && reverse) { + if (H5T_FLOAT == dst_p->shared->type) { + uint8_t tmp1, tmp2; + size_t tsize = dst_p->shared->size; + assert(0 == tsize % 2); + + for (size_t i = 0; i < tsize; i += 4) { + tmp1 = d[i]; + tmp2 = d[i + 1]; + + d[i] = d[(tsize - 2) - i]; + d[i + 1] = d[(tsize - 1) - i]; + + d[(tsize - 2) - i] = tmp1; + d[(tsize - 1) - i] = tmp2; } + } + else + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "VAX byte ordering is unsupported for complex number type conversions"); + } + + /* + * If we had used a temporary buffer for the destination then we + * should copy the value to the true destination buffer. + */ + if (d == dbuf) /* For complex number values, assume that dbuf was initialized to 0s */ + H5MM_memcpy(dp, d, dst_p->shared->size); + else if (dst_p->shared->type == H5T_COMPLEX) + /* Ensure imaginary part of complex number is zeroed */ + memset(dp + (dst_p->shared->size / 2), 0, dst_p->shared->size / 2); + + /* Advance source & destination pointers by delta amounts */ + sp += src_delta; + dp += dst_delta; + + memset(int_buf, 0, int_buf_size); + } /* end conversion loop */ - /* Handle mantissa part here */ - if (H5T_NORM_IMPLIED == dst.u.f.norm) { - /* Imply first bit */ - H5T__bit_set(int_buf, first, (size_t)1, 0); - } - else if (H5T_NORM_NONE == dst.u.f.norm) { - first++; - } +done: + H5MM_free(src_rev); + H5MM_free(int_buf); - /* Roundup for mantissa */ - if (first > dst.u.f.msize) { - /* If the bit sequence is bigger than the mantissa part, there'll be some - * precision loss. Let user's handler deal with the case if it's present - */ - if (conv_ctx->u.conv.cb_struct.func) { - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); /*reverse order first*/ - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_PRECISION, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); - } + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_i_f_loop() */ - if (except_ret == H5T_CONV_HANDLED) { - reverse = false; - goto padding; - } - else if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); +/*------------------------------------------------------------------------- + * Function: H5T__conv_i_f + * + * Purpose: Convert one integer type to a floating-point type. This is + * the catch-all function for integer-float conversions and + * is probably not particularly fast. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_i_f(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + herr_t ret_value = SUCCEED; /* Return value */ - /* If user's exception handler does deal with it, we do it by dropping off the - * extra bits at the end and do rounding. If we have .50...0(decimal) after radix - * point, we do roundup when the least significant digit before radix is odd, we do - * rounddown if it's even. - */ + FUNC_ENTER_PACKAGE - /* Check 1st dropoff bit, see if it's set. */ - if (H5T__bit_get_d(int_buf, ((first - dst.u.f.msize) - 1), (size_t)1)) { - /* Check all bits after 1st dropoff bit, see if any of them is set. */ - if (((first - dst.u.f.msize) - 1) > 0 && - H5T__bit_get_d(int_buf, (size_t)0, ((first - dst.u.f.msize) - 1))) - do_round = 1; - else { /* The .50...0 case */ - /* Check if the least significant bit is odd. */ - if (H5T__bit_get_d(int_buf, (first - dst.u.f.msize), (size_t)1)) - do_round = 1; - } - } + switch (cdata->command) { + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ - /* Right shift to drop off extra bits */ - H5T__bit_shift(int_buf, (ssize_t)(dst.u.f.msize - first), (size_t)0, buf_size * 8); + if (NULL == src_p || NULL == dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + src_atomic = src_p->shared->u.atomic; + dst_atomic = dst_p->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order && + H5T_ORDER_VAX != dst_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unsupported byte order"); + if (dst_p->shared->size > TEMP_INT_CONV_BUFFER_SIZE) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination size is too large"); + if (8 * sizeof(hsize_t) - 1 < dst_atomic.u.f.esize) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); + cdata->need_bkg = H5T_BKG_NO; - if (do_round) { - H5T__bit_inc(int_buf, (size_t)0, buf_size * 8); - do_round = 0; + break; + } - /* If integer is like 0x0ff...fff and we need to round up the - * last f, we get 0x100...000. Treat this special case here. - */ - if (H5T__bit_get_d(int_buf, dst.u.f.msize, (size_t)1)) { - if (H5T_NORM_IMPLIED == dst.u.f.norm) { - /* The bit at this 1's position was impled already, so this - * number should be 0x200...000. We need to increment the - * exponent in this case. - */ - expo++; - } - else if (H5T_NORM_NONE == dst.u.f.norm) { - /* Right shift 1 bit to let the carried 1 fit in the mantissa, - * and increment exponent by 1. - */ - H5T__bit_shift(int_buf, (ssize_t)-1, (size_t)0, buf_size * 8); - expo++; - } - } - } - } - else { - /* The bit sequence can fit mantissa part. Left shift to fit in from high-order of - * bit position. */ - H5T__bit_shift(int_buf, (ssize_t)(dst.u.f.msize - first), (size_t)0, dst.u.f.msize); - } + case H5T_CONV_FREE: + break; - /* Check if the exponent is too big */ - expo_max = (hsize_t)(pow(2.0, (double)dst.u.f.esize) - 1); + case H5T_CONV_CONV: + if (NULL == src_p || NULL == dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (NULL == conv_ctx) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); - if (expo > expo_max) { /*overflows*/ - if (conv_ctx->u.conv.cb_struct - .func) { /*user's exception handler. Reverse back source order*/ - H5T__reverse_order(src_rev, s, src_p->shared->size, - src_p->shared->u.atomic.order); /*reverse order first*/ - except_ret = (conv_ctx->u.conv.cb_struct.func)( - H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, - conv_ctx->u.conv.dst_type_id, src_rev, d, conv_ctx->u.conv.cb_struct.user_data); + if (H5T__conv_i_f_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); - if (except_ret == H5T_CONV_ABORT) - HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, - "can't handle conversion exception"); - else if (except_ret == H5T_CONV_HANDLED) { - reverse = false; - goto padding; - } - } + break; - if (!conv_ctx->u.conv.cb_struct.func || (except_ret == H5T_CONV_UNHANDLED)) { - /*make destination infinity by setting exponent to maximal number and - *mantissa to zero.*/ - expo = expo_max; - memset(int_buf, 0, buf_size); - } - } + default: + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); + } - if (except_ret == H5T_CONV_UNHANDLED) { - /* Set exponent in destination */ - H5T__bit_set_d(d, dst.u.f.epos, dst.u.f.esize, expo); +done: + FUNC_LEAVE_NOAPI(ret_value) +} /* end H5T__conv_i_f() */ - /* Copy mantissa into destination */ - H5T__bit_copy(d, dst.u.f.mpos, int_buf, (size_t)0, - (buf_size * 8) > dst.u.f.msize ? dst.u.f.msize : buf_size * 8); - } +/*------------------------------------------------------------------------- + * Function: H5T__conv_i_complex + * + * Purpose: Convert integer values to complex number values. This is + * the catch-all function for integer -> complex number + * conversions and is probably not particularly fast. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_i_complex(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + herr_t ret_value = SUCCEED; -padding: - /* - * Set padding areas in destination. - */ - if (dst.offset > 0) { - assert(H5T_PAD_ZERO == dst.lsb_pad || H5T_PAD_ONE == dst.lsb_pad); - H5T__bit_set(d, (size_t)0, dst.offset, (bool)(H5T_PAD_ONE == dst.lsb_pad)); - } - if (dst.offset + dst.prec != 8 * dst_p->shared->size) { - assert(H5T_PAD_ZERO == dst.msb_pad || H5T_PAD_ONE == dst.msb_pad); - H5T__bit_set(d, dst.offset + dst.prec, 8 * dst_p->shared->size - (dst.offset + dst.prec), - (bool)(H5T_PAD_ONE == dst.msb_pad)); - } + FUNC_ENTER_PACKAGE - /* - * Put the destination in the correct byte order. See note at - * beginning of loop. - */ - if (H5T_ORDER_BE == dst.order && reverse) { - half_size = dst_p->shared->size / 2; - for (i = 0; i < half_size; i++) { - uint8_t tmp = d[dst_p->shared->size - (i + 1)]; - d[dst_p->shared->size - (i + 1)] = d[i]; - d[i] = tmp; - } - } - else if (H5T_ORDER_VAX == dst.order && reverse) { - tsize = dst_p->shared->size; - assert(0 == tsize % 2); + switch (cdata->command) { + case H5T_CONV_INIT: { + H5T_atomic_t src_atomic; /* source datatype atomic info */ + H5T_atomic_t dst_atomic; /* destination datatype atomic info */ - for (i = 0; i < tsize; i += 4) { - tmp1 = d[i]; - tmp2 = d[i + 1]; + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (!H5T_IS_ATOMIC(dst_p->shared->parent->shared)) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "invalid complex number datatype"); + src_atomic = src_p->shared->u.atomic; + dst_atomic = dst_p->shared->parent->shared->u.atomic; + if (H5T_ORDER_LE != src_atomic.order && H5T_ORDER_BE != src_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for source datatype"); + if (H5T_ORDER_LE != dst_atomic.order && H5T_ORDER_BE != dst_atomic.order) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, + "unsupported byte order for destination datatype"); + if (dst_p->shared->size > TEMP_INT_CONV_BUFFER_SIZE) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "destination datatype size is too large"); + if (8 * sizeof(hsize_t) - 1 < dst_atomic.u.f.esize) + HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "exponent field is too large"); + cdata->need_bkg = H5T_BKG_NO; - d[i] = d[(tsize - 2) - i]; - d[i + 1] = d[(tsize - 1) - i]; + break; + } - d[(tsize - 2) - i] = tmp1; - d[(tsize - 1) - i] = tmp2; - } - } + case H5T_CONV_FREE: + break; - /* - * If we had used a temporary buffer for the destination then we - * should copy the value to the true destination buffer. - */ - if (d == dbuf) - H5MM_memcpy(dp, d, dst_p->shared->size); - if (buf_stride) { - sp += direction * (ssize_t)buf_stride; - dp += direction * (ssize_t)buf_stride; - } - else { - sp += direction * (ssize_t)src_p->shared->size; - dp += direction * (ssize_t)dst_p->shared->size; - } + case H5T_CONV_CONV: + if (!src_p || !dst_p) + HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "not a datatype"); + if (NULL == conv_ctx) + HGOTO_ERROR(H5E_ARGS, H5E_BADVALUE, FAIL, "invalid datatype conversion context pointer"); - memset(int_buf, 0, buf_size); - } + if (H5T__conv_i_f_loop(src_p, dst_p, conv_ctx, nelmts, buf_stride, buf) < 0) + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "unable to convert data values"); break; default: HGOTO_ERROR(H5E_DATATYPE, H5E_UNSUPPORTED, FAIL, "unknown conversion command"); - } /* end switch */ + } done: - if (int_buf) - H5MM_xfree(int_buf); - if (src_rev) - H5MM_free(src_rev); - FUNC_LEAVE_NOAPI(ret_value) -} /* end H5T__conv_i_f() */ +} /* end H5T__conv_i_complex() */ /*------------------------------------------------------------------------- * Function: H5T__conv_schar_uchar @@ -1121,6 +1236,65 @@ H5T__conv_schar_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, co H5T_CONV_xF(SCHAR, LDOUBLE, signed char, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_schar_fcomplex + * + * Purpose: Convert native signed char to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_schar_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(SCHAR, FLOAT_COMPLEX, signed char, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_schar_dcomplex + * + * Purpose: Convert native signed char to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_schar_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(SCHAR, DOUBLE_COMPLEX, signed char, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_schar_lcomplex + * + * Purpose: Convert native signed char to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_schar_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(SCHAR, LDOUBLE_COMPLEX, signed char, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_uchar_schar * @@ -1347,6 +1521,65 @@ H5T__conv_uchar_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, co H5T_CONV_xF(UCHAR, LDOUBLE, unsigned char, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_uchar_fcomplex + * + * Purpose: Convert native unsigned char to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_uchar_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(UCHAR, FLOAT_COMPLEX, unsigned char, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_uchar_dcomplex + * + * Purpose: Convert native unsigned char to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_uchar_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(UCHAR, DOUBLE_COMPLEX, unsigned char, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_uchar_lcomplex + * + * Purpose: Convert native unsigned char to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_uchar_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(UCHAR, LDOUBLE_COMPLEX, unsigned char, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_short_schar * @@ -1573,6 +1806,65 @@ H5T__conv_short_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, co H5T_CONV_xF(SHORT, LDOUBLE, short, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_short_fcomplex + * + * Purpose: Convert native short to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_short_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(SHORT, FLOAT_COMPLEX, short, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_short_dcomplex + * + * Purpose: Convert native short to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_short_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(SHORT, DOUBLE_COMPLEX, short, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_short_lcomplex + * + * Purpose: Convert native short to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_short_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(SHORT, LDOUBLE_COMPLEX, short, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_ushort_schar * @@ -1781,26 +2073,85 @@ H5T__conv_ushort_double(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, co size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) { - H5T_CONV_xF(USHORT, DOUBLE, unsigned short, double, -, -); + H5T_CONV_xF(USHORT, DOUBLE, unsigned short, double, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_ushort_ldouble + * + * Purpose: Convert native unsigned short to native long double using + * hardware. This is a fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ushort_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xF(USHORT, LDOUBLE, unsigned short, long double, -, -); +} + +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_ushort_fcomplex + * + * Purpose: Convert native unsigned short to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ushort_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(USHORT, FLOAT_COMPLEX, unsigned short, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_ushort_dcomplex + * + * Purpose: Convert native unsigned short to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ushort_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(USHORT, DOUBLE_COMPLEX, unsigned short, H5_double_complex, -, -); } /*------------------------------------------------------------------------- - * Function: H5T__conv_ushort_ldouble + * Function: H5T__conv_ushort_lcomplex * - * Purpose: Convert native unsigned short to native long double using - * hardware. This is a fast special case. + * Purpose: Convert native unsigned short to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. * * Return: Non-negative on success/Negative on failure * *------------------------------------------------------------------------- */ herr_t -H5T__conv_ushort_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, - size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, - void H5_ATTR_UNUSED *bkg) +H5T__conv_ushort_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) { - H5T_CONV_xF(USHORT, LDOUBLE, unsigned short, long double, -, -); + H5T_CONV_xZ(USHORT, LDOUBLE_COMPLEX, unsigned short, H5_ldouble_complex, -, -); } +#endif /*------------------------------------------------------------------------- * Function: H5T__conv_int_schar @@ -2031,6 +2382,65 @@ H5T__conv_int_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, cons H5T_CONV_xF(INT, LDOUBLE, int, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_int_fcomplex + * + * Purpose: Convert native integer to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_int_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(INT, FLOAT_COMPLEX, int, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_int_dcomplex + * + * Purpose: Convert native integer to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_int_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(INT, DOUBLE_COMPLEX, int, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_int_lcomplex + * + * Purpose: Convert native integer to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_int_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(INT, LDOUBLE_COMPLEX, int, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_uint_schar * @@ -2260,6 +2670,65 @@ H5T__conv_uint_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, con H5T_CONV_xF(UINT, LDOUBLE, unsigned int, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_uint_fcomplex + * + * Purpose: Convert native unsigned integer to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_uint_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(UINT, FLOAT_COMPLEX, unsigned int, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_uint_dcomplex + * + * Purpose: Convert native unsigned integer to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_uint_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(UINT, DOUBLE_COMPLEX, unsigned int, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_uint_lcomplex + * + * Purpose: Convert native unsigned integer to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_uint_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(UINT, LDOUBLE_COMPLEX, unsigned int, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_long_schar * @@ -2489,6 +2958,65 @@ H5T__conv_long_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, con H5T_CONV_xF(LONG, LDOUBLE, long, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_long_fcomplex + * + * Purpose: Convert native long to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_long_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(LONG, FLOAT_COMPLEX, long, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_long_dcomplex + * + * Purpose: Convert native long to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_long_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(LONG, DOUBLE_COMPLEX, long, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_long_lcomplex + * + * Purpose: Convert native long to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_long_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(LONG, LDOUBLE_COMPLEX, long, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_ulong_schar * @@ -2718,6 +3246,65 @@ H5T__conv_ulong_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, co H5T_CONV_xF(ULONG, LDOUBLE, unsigned long, long double, -, -); } +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_ulong_fcomplex + * + * Purpose: Convert native unsigned long to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ulong_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(ULONG, FLOAT_COMPLEX, unsigned long, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_ulong_dcomplex + * + * Purpose: Convert native unsigned long to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ulong_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(ULONG, DOUBLE_COMPLEX, unsigned long, H5_double_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_ulong_lcomplex + * + * Purpose: Convert native unsigned long to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ulong_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(ULONG, LDOUBLE_COMPLEX, unsigned long, H5_ldouble_complex, -, -); +} +#endif + /*------------------------------------------------------------------------- * Function: H5T__conv_llong_schar * @@ -2949,6 +3536,67 @@ H5T__conv_llong_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, co } #endif /* H5T_CONV_INTERNAL_LLONG_LDOUBLE */ +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_llong_fcomplex + * + * Purpose: Convert native long long to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_llong_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(LLONG, FLOAT_COMPLEX, long long, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_llong_dcomplex + * + * Purpose: Convert native long long to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_llong_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(LLONG, DOUBLE_COMPLEX, long long, H5_double_complex, -, -); +} + +#ifdef H5T_CONV_INTERNAL_LLONG_LDOUBLE +/*------------------------------------------------------------------------- + * Function: H5T__conv_llong_lcomplex + * + * Purpose: Convert native long long to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_llong_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, size_t H5_ATTR_UNUSED bkg_stride, void *buf, + void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(LLONG, LDOUBLE_COMPLEX, long long, H5_ldouble_complex, -, -); +} +#endif /* H5T_CONV_INTERNAL_LLONG_LDOUBLE */ +#endif /* H5_HAVE_COMPLEX_NUMBERS */ + /*------------------------------------------------------------------------- * Function: H5T__conv_ullong_schar * @@ -3179,3 +3827,64 @@ H5T__conv_ullong_ldouble(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, c H5T_CONV_xF(ULLONG, LDOUBLE, unsigned long long, long double, -, -); } #endif /*H5T_CONV_INTERNAL_ULLONG_LDOUBLE*/ + +#ifdef H5_HAVE_COMPLEX_NUMBERS +/*------------------------------------------------------------------------- + * Function: H5T__conv_ullong_fcomplex + * + * Purpose: Convert native unsigned long long to native + * float _Complex / _Fcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ullong_fcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(ULLONG, FLOAT_COMPLEX, unsigned long long, H5_float_complex, -, -); +} + +/*------------------------------------------------------------------------- + * Function: H5T__conv_ullong_dcomplex + * + * Purpose: Convert native unsigned long long to native + * double _Complex / _Dcomplex using hardware. This is a fast + * special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ullong_dcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(ULLONG, DOUBLE_COMPLEX, unsigned long long, H5_double_complex, -, -); +} + +#ifdef H5T_CONV_INTERNAL_ULLONG_LDOUBLE +/*------------------------------------------------------------------------- + * Function: H5T__conv_ullong_lcomplex + * + * Purpose: Convert native unsigned long long to native + * long double _Complex / _Lcomplex using hardware. This is a + * fast special case. + * + * Return: Non-negative on success/Negative on failure + * + *------------------------------------------------------------------------- + */ +herr_t +H5T__conv_ullong_lcomplex(const H5T_t *st, const H5T_t *dt, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t H5_ATTR_UNUSED bkg_stride, void *buf, void H5_ATTR_UNUSED *bkg) +{ + H5T_CONV_xZ(ULLONG, LDOUBLE_COMPLEX, unsigned long long, H5_ldouble_complex, -, -); +} +#endif /* H5T_CONV_INTERNAL_ULLONG_LDOUBLE */ +#endif /* H5_HAVE_COMPLEX_NUMBERS */ diff --git a/src/H5Tconv_integer.h b/src/H5Tconv_integer.h index c8eff45a285..22dee8c5979 100644 --- a/src/H5Tconv_integer.h +++ b/src/H5Tconv_integer.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -16,10 +16,20 @@ /* Private headers needed by this file */ #include "H5Tpkg.h" +/*************************/ +/* Module private macros */ +/*************************/ + +#define TEMP_INT_CONV_BUFFER_SIZE 64 + /***********************/ /* Function Prototypes */ /***********************/ +/* Helper functions shared between conversion modules */ +H5_DLL herr_t H5T__conv_i_f_loop(const H5T_t *src_p, const H5T_t *dst_p, const H5T_conv_ctx_t *conv_ctx, + size_t nelmts, size_t buf_stride, void *buf); + /****************************************/ /* Soft (emulated) conversion functions */ /****************************************/ @@ -33,6 +43,9 @@ H5_DLL herr_t H5T__conv_i_i(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cda H5_DLL herr_t H5T__conv_i_f(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *_buf, void *bkg); +H5_DLL herr_t H5T__conv_i_complex(const H5T_t *src_p, const H5T_t *dst_p, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); /*********************************************/ /* Hard (compiler cast) conversion functions */ @@ -80,6 +93,17 @@ H5_DLL herr_t H5T__conv_schar_double(const H5T_t *src, const H5T_t *dst, H5T_cda H5_DLL herr_t H5T__conv_schar_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_schar_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_schar_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_schar_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'unsigned char' */ H5_DLL herr_t H5T__conv_uchar_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -123,6 +147,17 @@ H5_DLL herr_t H5T__conv_uchar_double(const H5T_t *src, const H5T_t *dst, H5T_cda H5_DLL herr_t H5T__conv_uchar_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_uchar_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_uchar_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_uchar_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'signed short' */ H5_DLL herr_t H5T__conv_short_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -166,6 +201,17 @@ H5_DLL herr_t H5T__conv_short_double(const H5T_t *src, const H5T_t *dst, H5T_cda H5_DLL herr_t H5T__conv_short_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_short_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_short_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_short_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'unsigned short' */ H5_DLL herr_t H5T__conv_ushort_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -209,6 +255,17 @@ H5_DLL herr_t H5T__conv_ushort_double(const H5T_t *src, const H5T_t *dst, H5T_cd H5_DLL herr_t H5T__conv_ushort_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_ushort_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_ushort_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_ushort_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'signed int' */ H5_DLL herr_t H5T__conv_int_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -252,6 +309,17 @@ H5_DLL herr_t H5T__conv_int_double(const H5T_t *src, const H5T_t *dst, H5T_cdata H5_DLL herr_t H5T__conv_int_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_int_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_int_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_int_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'unsigned int' */ H5_DLL herr_t H5T__conv_uint_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -295,6 +363,17 @@ H5_DLL herr_t H5T__conv_uint_double(const H5T_t *src, const H5T_t *dst, H5T_cdat H5_DLL herr_t H5T__conv_uint_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_uint_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_uint_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_uint_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'signed long' */ H5_DLL herr_t H5T__conv_long_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -338,6 +417,17 @@ H5_DLL herr_t H5T__conv_long_double(const H5T_t *src, const H5T_t *dst, H5T_cdat H5_DLL herr_t H5T__conv_long_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_long_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_long_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_long_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'unsigned long' */ H5_DLL herr_t H5T__conv_ulong_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -381,6 +471,17 @@ H5_DLL herr_t H5T__conv_ulong_double(const H5T_t *src, const H5T_t *dst, H5T_cda H5_DLL herr_t H5T__conv_ulong_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_ulong_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_ulong_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_ulong_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif /* Conversion functions for 'signed long long' */ H5_DLL herr_t H5T__conv_llong_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -424,6 +525,19 @@ H5_DLL herr_t H5T__conv_llong_double(const H5T_t *src, const H5T_t *dst, H5T_cda H5_DLL herr_t H5T__conv_llong_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_llong_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_llong_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#ifdef H5T_CONV_INTERNAL_LLONG_LDOUBLE +H5_DLL herr_t H5T__conv_llong_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif +#endif /* Conversion functions for 'unsigned long long' */ H5_DLL herr_t H5T__conv_ullong_schar(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, @@ -467,5 +581,18 @@ H5_DLL herr_t H5T__conv_ullong_double(const H5T_t *src, const H5T_t *dst, H5T_cd H5_DLL herr_t H5T__conv_ullong_ldouble(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, void *bkg); +#ifdef H5_HAVE_COMPLEX_NUMBERS +H5_DLL herr_t H5T__conv_ullong_fcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +H5_DLL herr_t H5T__conv_ullong_dcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#ifdef H5T_CONV_INTERNAL_ULLONG_LDOUBLE +H5_DLL herr_t H5T__conv_ullong_lcomplex(const H5T_t *src, const H5T_t *dst, H5T_cdata_t *cdata, + const H5T_conv_ctx_t *conv_ctx, size_t nelmts, size_t buf_stride, + size_t bkg_stride, void *buf, void *bkg); +#endif +#endif #endif /* H5Tconv_integer_H */ diff --git a/src/H5Tconv_macros.h b/src/H5Tconv_macros.h index c2876670f5e..843255e51cc 100644 --- a/src/H5Tconv_macros.h +++ b/src/H5Tconv_macros.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -99,8 +99,8 @@ typedef struct H5T_conv_hw_t { * destination is at least as wide as the source. This case * cannot generate overflows. * - * Ff: Floating-point values to floating-point values the source is at - * least as large as the destination. Overflows can occur when + * Ff: Floating-point values to floating-point values where the source is + * at least as large as the destination. Overflows can occur when * the destination is narrower than the source. * * xF: Integers to float-point(float or double) values where the destination @@ -118,6 +118,55 @@ typedef struct H5T_conv_hw_t { * wide as the destination. Overflows can occur when the destination is * narrower than the source. * + * zZ: Complex number values to complex number values where the + * destination is at least as wide as the source. This case + * cannot generate overflows. + * + * Zz: Complex number values to complex number values where the + * source is at least as large as the destination. Overflows can + * occur when the destination is narrower than the source. + * + * zF: Complex number values to floating-point values where the + * destination is at least as wide as the real part of the source + * complex number value. This case cannot generate overflows. + * + * Zf: Complex number values to floating-point values where the real + * part of the source complex number value is at least as large + * as the destination. Overflows can occur when the destination + * is narrower then the source. + * + * fZ: Floating-point values to complex number values where the + * destination is at least as wide as the source. This case + * cannot generate overflows. + * + * Fz: Floating-point values to complex number values where the source is + * at least as large as the destination. Overflows can occur when + * the destination is narrower than the source. + * + * zf: Complex number values to floating-point values where the real + * part of the source complex number value is the same size as + * the destination. This case cannot generate overflows. + * + * fz: Floating-point values to complex number values where the source + * is the same size as the real part of the destination. This case + * cannot generate overflows. + * + * xZ: Integers to complex number values where the destination is at + * least as wide as the source. This case cannot generate overflows. + * + * Zx: Complex number values to integers where the real part of the + * source complex number value is at least as wide as the destination. + * Overflow can occur when the source magnitude is too large for + * the destination. + * + * zX: Complex number values to integers where the destination is at + * least as wide as the real part of the source complex number + * value. This case cannot generate overflows. + * + * Xz: Integers to complex number values where the source is at least as + * wide as the destination. Overflows can occur when the destination + * is narrower than the source. + * * * The macros take a subset of these arguments in the order listed here: * @@ -804,6 +853,564 @@ typedef struct H5T_conv_hw_t { H5T_CONV(H5T_CONV_Xf, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, Y) \ } while (0) +#ifdef H5_HAVE_COMPLEX_NUMBERS +/* + * NOTE: while it would be very nice to be able to use type-generic macros for + * the complex number functions used below to reduce macro duplication between + * the float, double and long double _Complex cases, support for the tgmath.h + * header appears to be problematic and not particularly portable pre-C11. This + * should be revisited if the minimum required C standard version is moved to + * C11 or later. + */ +#define H5T_CONV_FLOAT_COMPLEX_REALVAL(S) float sr_val = crealf(*(S)); +#define H5T_CONV_DOUBLE_COMPLEX_REALVAL(S) double sr_val = creal(*(S)); +#define H5T_CONV_LDOUBLE_COMPLEX_REALVAL(S) long double sr_val = creall(*(S)); +#define H5T_CONV_FLOAT_COMPLEX_IMAGVAL(S) float si_val = cimagf(*(S)); +#define H5T_CONV_DOUBLE_COMPLEX_IMAGVAL(S) double si_val = cimag(*(S)); +#define H5T_CONV_LDOUBLE_COMPLEX_IMAGVAL(S) long double si_val = cimagl(*(S)); + +/* + * Since MSVC defines complex numbers as structure types, they can't be cast + * directly to other types, so we have to simulate the behavior of the standard + * types here. When casting to a complex number type, a new complex number + * value is constructed from the given real and imaginary parts. When casting + * from a complex number type, the real and imaginary parts are extracted as + * needed and used as appropriate. With other platforms/compilers, the + * H5T_CONV_CAST_Z macro just maps this to direct casts. + */ +#ifndef H5_HAVE_C99_COMPLEX_NUMBERS +#define H5T_CONV_CAST_TO_FLOAT_COMPLEX(S_REAL, S_IMAG, D, DT) \ + { \ + *(D) = H5_CMPLXF(S_REAL, S_IMAG); \ + } +#define H5T_CONV_CAST_TO_DOUBLE_COMPLEX(S_REAL, S_IMAG, D, DT) \ + { \ + *(D) = H5_CMPLX(S_REAL, S_IMAG); \ + } +#define H5T_CONV_CAST_TO_LDOUBLE_COMPLEX(S_REAL, S_IMAG, D, DT) \ + { \ + *(D) = H5_CMPLXL(S_REAL, S_IMAG); \ + } + +#define H5T_CONV_CAST_zZ(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + H5T_CONV_##STYPE##_IMAGVAL(S); /* Extract "imaginary" part of complex number */ \ + H5T_CONV_CAST_TO_##DTYPE(sr_val, si_val, D, DT) \ + } +#define H5T_CONV_CAST_Zz(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_CAST_TO_##DTYPE(S_REAL, S_IMAG, D, DT) \ + } +#define H5T_CONV_CAST_zF(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + *(D) = (DT)(sr_val); \ + } +#define H5T_CONV_CAST_zf(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + *(D) = (DT)(sr_val); \ + } +#define H5T_CONV_CAST_zX(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + *(D) = (DT)(sr_val); \ + } +#define H5T_CONV_CAST_fZ(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_CAST_TO_##DTYPE(*(S), (ST)0.0, D, DT) \ + } +#define H5T_CONV_CAST_Fz(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_CAST_TO_##DTYPE(*(S), (ST)0.0, D, DT) \ + } +#define H5T_CONV_CAST_fz(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_CAST_TO_##DTYPE(*(S), (ST)0.0, D, DT) \ + } +#define H5T_CONV_CAST_xZ(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + { \ + H5T_CONV_CAST_TO_##DTYPE(*(S), (ST)0.0, D, DT) \ + } + +#define H5T_CONV_CAST_Z(SYMBOLS, STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + do { \ + H5T_CONV_CAST_##SYMBOLS(STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + } while (0) + +#else + +/* Map all complex number casts to direct casts */ +#define H5T_CONV_CAST_Z(SYMBOLS, STYPE, DTYPE, S, S_REAL, S_IMAG, D, ST, DT) \ + do { \ + *(D) = (DT)(*(S)); \ + } while (0) + +#endif + +#define H5T_CONV_zZ_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + H5T_CONV_CAST_Z(zZ, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_zZ_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_zZ_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) + +/* Identical logic to H5T_CONV_fF, but special implementation is needed + * here to deal with MSVC's complex number structure types. + */ +#define H5T_CONV_zZ(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + HDcompile_assert(sizeof(ST) <= sizeof(DT)); \ + H5T_CONV(H5T_CONV_zZ, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_Zz_CORE_IMP(STYPE, DTYPE, DBTYPE, S, D, ST, DT, SBT, DBT, D_MIN, D_MAX) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + H5T_CONV_##STYPE##_IMAGVAL(S); /* Extract "imaginary" part of complex number */ \ + bool sr_over = (sr_val) > (SBT)(D_MAX); \ + bool sr_under = (sr_val) < (SBT)(D_MIN); \ + bool si_over = (si_val) > (SBT)(D_MAX); \ + bool si_under = (si_val) < (SBT)(D_MIN); \ + if (!sr_over && !sr_under && !si_over && !si_under) \ + H5T_CONV_CAST_Z(Zz, STYPE, DTYPE, S, sr_val, si_val, D, ST, DT); \ + else { \ + H5T_conv_ret_t except_ret = H5T_CONV_UNHANDLED; \ + \ + /* Since there's just one chance to raise a conversion exception here and either \ + * or both of the real and imaginary parts of a complex number could raise an \ + * exception, arbitrarily raise an exception in the order of: "overflow for either \ + * part" -> "underflow for either part". There are other orderings that may make \ + * more sense, such as "overflow for real part" -> "underflow for real part" -> \ + * "underflow..." -> "underflow...". For now, this will assume that the user's \ + * conversion exception function will inspect and handle both parts of the complex \ + * number. \ + */ \ + if (sr_over || si_over) { \ + except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, \ + D, conv_ctx->u.conv.cb_struct.user_data); \ + } \ + else if (sr_under || si_under) { \ + except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, \ + S, D, conv_ctx->u.conv.cb_struct.user_data); \ + } \ + \ + /* If user conversion exception function handled the exception, do nothing. \ + * Otherwise, if explicitly left unhandled, create a complex number value \ + * to return based on the exception type. \ + */ \ + if (except_ret == H5T_CONV_UNHANDLED) { \ + DBT tmp_val[2]; /* [ real, imaginary ] */ \ + \ + if (sr_over) \ + tmp_val[0] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _POS_INF_g); \ + else if (sr_under) \ + tmp_val[0] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _NEG_INF_g); \ + else \ + tmp_val[0] = (DBT)(sr_val); \ + if (si_over) \ + tmp_val[1] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _POS_INF_g); \ + else if (si_under) \ + tmp_val[1] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _NEG_INF_g); \ + else \ + tmp_val[1] = (DBT)(si_val); \ + \ + H5T_CONV_CAST_Z(Zz, STYPE, DTYPE, (DT *)tmp_val, tmp_val[0], tmp_val[1], D, ST, DT); \ + } \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + } \ + } +#define H5T_CONV_Zz_DOUBLE_COMPLEX_FLOAT_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_CORE_IMP(STYPE, DTYPE, FLOAT, S, D, ST, DT, double, float, D_MIN, D_MAX) +#define H5T_CONV_Zz_DOUBLE_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_DOUBLE_COMPLEX_##DTYPE##_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) +#define H5T_CONV_Zz_LDOUBLE_COMPLEX_FLOAT_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_CORE_IMP(STYPE, DTYPE, FLOAT, S, D, ST, DT, long double, float, D_MIN, D_MAX) +#define H5T_CONV_Zz_LDOUBLE_COMPLEX_DOUBLE_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_CORE_IMP(STYPE, DTYPE, DOUBLE, S, D, ST, DT, long double, double, D_MIN, D_MAX) +#define H5T_CONV_Zz_LDOUBLE_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_LDOUBLE_COMPLEX_##DTYPE##_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) +#define H5T_CONV_Zz_NOEX_CORE_IMP(STYPE, DTYPE, DBTYPE, S, D, ST, DT, SBT, DBT, D_MIN, D_MAX) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + H5T_CONV_##STYPE##_IMAGVAL(S); /* Extract "imaginary" part of complex number */ \ + bool sr_over = (sr_val) > (SBT)(D_MAX); \ + bool sr_under = (sr_val) < (SBT)(D_MIN); \ + bool si_over = (si_val) > (SBT)(D_MAX); \ + bool si_under = (si_val) < (SBT)(D_MIN); \ + if (!sr_over && !sr_under && !si_over && !si_under) \ + H5T_CONV_CAST_Z(Zz, STYPE, DTYPE, S, sr_val, si_val, D, ST, DT); \ + else { \ + DBT tmp_val[2]; /* [ real, imaginary ] */ \ + \ + if (sr_over) \ + tmp_val[0] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _POS_INF_g); \ + else if (sr_under) \ + tmp_val[0] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _NEG_INF_g); \ + else \ + tmp_val[0] = (DBT)(sr_val); \ + if (si_over) \ + tmp_val[1] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _POS_INF_g); \ + else if (si_under) \ + tmp_val[1] = H5_GLUE3(H5T_NATIVE_, DBTYPE, _NEG_INF_g); \ + else \ + tmp_val[1] = (DBT)(si_val); \ + \ + H5T_CONV_CAST_Z(Zz, STYPE, DTYPE, (DT *)tmp_val, tmp_val[0], tmp_val[1], D, ST, DT); \ + } \ + } +#define H5T_CONV_Zz_DOUBLE_COMPLEX_FLOAT_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_NOEX_CORE_IMP(STYPE, DTYPE, FLOAT, S, D, ST, DT, double, float, D_MIN, D_MAX) +#define H5T_CONV_Zz_DOUBLE_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_DOUBLE_COMPLEX_##DTYPE##_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) +#define H5T_CONV_Zz_LDOUBLE_COMPLEX_FLOAT_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_NOEX_CORE_IMP(STYPE, DTYPE, FLOAT, S, D, ST, DT, long double, float, D_MIN, D_MAX) +#define H5T_CONV_Zz_LDOUBLE_COMPLEX_DOUBLE_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_NOEX_CORE_IMP(STYPE, DTYPE, DOUBLE, S, D, ST, DT, long double, double, D_MIN, D_MAX) +#define H5T_CONV_Zz_LDOUBLE_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zz_LDOUBLE_COMPLEX_##DTYPE##_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) + +/* + * Similar logic to H5T_CONV_Ff. The "real" and "imaginary" parts of the complex + * number value are retrieved using one of the creal() and cimag() variants + * (according to the source complex number type) and then are used for comparisons + * when checking for overflow and underflow. + * + * To efficiently convert between complex number types, the macros need to be aware + * of the base floating-point type for both the source and destination complex number + * types. Since there are currently only three cases where H5T_CONV_Zz applies + * (DOUBLE_COMPLEX -> FLOAT_COMPLEX, LDOUBLE_COMPLEX -> FLOAT_COMPLEX and + * LDOUBLE_COMPLEX -> DOUBLE_COMPLEX), use some specialized macros above for this + * for now. H5T_CONV_Zz directs the H5T_CONV macro to H5T_CONV_Zz__(NOEX_)CORE + * (depending on whether conversion exceptions are handled), which then redirects to + * H5T_CONV_Zz___(NOEX_)CORE, ending at H5T_CONV_Zz_(NOEX_)CORE_IMP + * after replacing values related to the source and destination datatypes that are + * passed. While a bit difficult to reason through, alternative approaches proved to + * be much more awkward. + */ +#define H5T_CONV_Zz(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + HDcompile_assert(sizeof(ST) >= sizeof(DT)); \ + H5T_CONV(H5T_CONV_Zz_##STYPE, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_zF_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + H5T_CONV_CAST_Z(zF, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_zF_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_zF_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) + +/* Identical logic to H5T_CONV_fF, but special implementation is needed + * here to deal with MSVC's complex number structure types. + */ +#define H5T_CONV_zF(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + H5T_CONV(H5T_CONV_zF, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_Zf_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, SBT, D_MIN, D_MAX) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); \ + if ((sr_val) > (SBT)(D_MAX)) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, D, \ + conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _POS_INF_g); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else if ((sr_val) < (SBT)(D_MIN)) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, D, \ + conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _NEG_INF_g); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else \ + *(D) = (DT)((sr_val)); \ + } +#define H5T_CONV_Zf_FLOAT_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zf_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, float, D_MIN, D_MAX) +#define H5T_CONV_Zf_DOUBLE_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zf_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, double, D_MIN, D_MAX) +#define H5T_CONV_Zf_LDOUBLE_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zf_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, long double, D_MIN, D_MAX) +#define H5T_CONV_Zf_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, SBT, D_MIN, D_MAX) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + if ((sr_val) > (SBT)(D_MAX)) \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _POS_INF_g); \ + else if ((sr_val) < (SBT)(D_MIN)) \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _NEG_INF_g); \ + else \ + *(D) = (DT)((sr_val)); \ + } +#define H5T_CONV_Zf_FLOAT_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zf_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, float, D_MIN, D_MAX) +#define H5T_CONV_Zf_DOUBLE_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zf_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, double, D_MIN, D_MAX) +#define H5T_CONV_Zf_LDOUBLE_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zf_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, long double, D_MIN, D_MAX) + +/* Similar logic to H5T_CONV_Ff. The "real" part of the complex number is + * retrieved using one of the creal() variants (according to the source + * complex number type) and then is used for comparisons when checking for + * overflow and underflow. Uses specialized macros above to also pass the + * base floating-point C type of the complex number type for use in casts + * during those comparisons. + */ +#define H5T_CONV_Zf(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + HDcompile_assert(sizeof(ST) >= sizeof(DT)); \ + H5T_CONV(H5T_CONV_Zf_##STYPE, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_fZ_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + H5T_CONV_CAST_Z(fZ, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_fZ_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_fZ_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) + +/* Identical logic to H5T_CONV_fF, but special implementation is needed + * here to deal with MSVC's complex number structure types. + */ +#define H5T_CONV_fZ(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + HDcompile_assert(sizeof(ST) <= sizeof(DT)); \ + H5T_CONV(H5T_CONV_fZ, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_Fz_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + if (*(S) > (ST)(D_MAX)) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, D, \ + conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _POS_INF_g); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else if (*(S) < (ST)(D_MIN)) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, D, \ + conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _NEG_INF_g); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else \ + H5T_CONV_CAST_Z(Fz, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_Fz_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + if (*(S) > (ST)(D_MAX)) \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _POS_INF_g); \ + else if (*(S) < (ST)(D_MIN)) \ + *(D) = H5_GLUE3(H5T_NATIVE_, DTYPE, _NEG_INF_g); \ + else \ + H5T_CONV_CAST_Z(Fz, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } + +/* Similar logic to H5T_CONV_Ff. In the case of overflow or underflow, the + * floating-point value is converted to a complex number value where the + * "real" part of the value is set to positive or negative infinity and + * the "imaginary" part of the value is set to 0. + */ +#define H5T_CONV_Fz(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + H5T_CONV(H5T_CONV_Fz, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_zf_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + H5T_CONV_CAST_Z(zf, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_zf_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_zf_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) + +/* Convert a complex number value to the matching base floating-point type. Simple + * direct cast where the imaginary part of the complex number value is discarded. + * Special implementation is needed here to deal with MSVC's complex number + * structure types. + */ +#define H5T_CONV_zf(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + HDcompile_assert(sizeof(ST) == (2 * sizeof(DT))); \ + H5T_CONV(H5T_CONV_zf, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_fz_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + H5T_CONV_CAST_Z(fz, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_fz_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_fz_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) + +/* Convert a floating-point value to the matching complex number type. Simple direct + * cast where the imaginary part should be a zero (positive or unsigned). Special + * implementation is needed here to deal with MSVC's complex number structure types. + */ +#define H5T_CONV_fz(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + HDcompile_assert((2 * sizeof(ST)) == sizeof(DT)); \ + H5T_CONV(H5T_CONV_fz, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +#define H5T_CONV_xZ_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + if (sprec > dprec) { \ + unsigned low_bit_pos, high_bit_pos; \ + \ + /* Detect high & low bits set in source */ \ + H5T_HI_LO_BIT_SET(ST, *(S), low_bit_pos, high_bit_pos) \ + \ + /* Check for more bits of precision in src than available in dst */ \ + if ((high_bit_pos - low_bit_pos) >= dprec) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_PRECISION, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, \ + S, D, conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + H5T_CONV_CAST_Z(xZ, STYPE, DTYPE, S, -, -, D, ST, DT); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else \ + H5T_CONV_CAST_Z(xZ, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } \ + else \ + H5T_CONV_CAST_Z(xZ, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_xZ_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + H5T_CONV_CAST_Z(xZ, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } + +/* Identical logic to H5T_CONV_xF */ +#define H5T_CONV_xZ(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + H5T_CONV(H5T_CONV_xZ, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, Y) \ + } while (0) + +#define H5T_CONV_Zx_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, SBT, D_MIN, D_MAX) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + if ((sr_val) > (SBT)(D_MAX) || (sprec < dprec && (sr_val) == (SBT)(D_MAX))) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_HI, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, D, \ + conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + *(D) = (DT)(D_MAX); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else if ((sr_val) < (SBT)(D_MIN)) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_RANGE_LOW, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, D, \ + conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + *(D) = (DT)(D_MIN); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else if ((sr_val) != (SBT)((DT)((sr_val)))) { \ + H5T_conv_ret_t except_ret = (conv_ctx->u.conv.cb_struct.func)( \ + H5T_CONV_EXCEPT_TRUNCATE, conv_ctx->u.conv.src_type_id, conv_ctx->u.conv.dst_type_id, S, D, \ + conv_ctx->u.conv.cb_struct.user_data); \ + if (except_ret == H5T_CONV_UNHANDLED) \ + /* Let compiler convert if case is ignored by user handler*/ \ + *(D) = (DT)((sr_val)); \ + else if (except_ret == H5T_CONV_ABORT) \ + HGOTO_ERROR(H5E_DATATYPE, H5E_CANTCONVERT, FAIL, "can't handle conversion exception"); \ + /* if(except_ret==H5T_CONV_HANDLED): Fall through, user handled it */ \ + } \ + else \ + *(D) = (DT)((sr_val)); \ + } +#define H5T_CONV_Zx_FLOAT_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zx_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, float, D_MIN, D_MAX) +#define H5T_CONV_Zx_DOUBLE_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zx_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, double, D_MIN, D_MAX) +#define H5T_CONV_Zx_LDOUBLE_COMPLEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zx_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, long double, D_MIN, D_MAX) +#define H5T_CONV_Zx_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, SBT, D_MIN, D_MAX) \ + { \ + H5T_CONV_##STYPE##_REALVAL(S); /* Extract "real" part of complex number */ \ + if ((sr_val) > (SBT)(D_MAX)) \ + *(D) = (DT)(D_MAX); \ + else if ((sr_val) < (SBT)(D_MIN)) \ + *(D) = (DT)(D_MIN); \ + else \ + *(D) = (DT)((sr_val)); \ + } +#define H5T_CONV_Zx_FLOAT_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zx_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, float, D_MIN, D_MAX) +#define H5T_CONV_Zx_DOUBLE_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zx_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, double, D_MIN, D_MAX) +#define H5T_CONV_Zx_LDOUBLE_COMPLEX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_Zx_NOEX_CORE_IMP(STYPE, DTYPE, S, D, ST, DT, long double, D_MIN, D_MAX) + +/* Similar logic to H5T_CONV_Fx. The "real" part of the complex number is + * retrieved using one of the creal() variants (according to the source + * complex number type) and then is used for comparisons when checking for + * overflow and underflow. Uses specialized macros above to also pass the + * base floating-point C type of the complex number type for use in casts + * during those comparisons. + */ +#define H5T_CONV_Zx(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + H5T_CONV(H5T_CONV_Zx_##STYPE, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, Y) \ + } while (0) + +#define H5T_CONV_zX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + { \ + H5T_CONV_CAST_Z(zX, STYPE, DTYPE, S, -, -, D, ST, DT); \ + } +#define H5T_CONV_zX_NOEX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) \ + H5T_CONV_zX_CORE(STYPE, DTYPE, S, D, ST, DT, D_MIN, D_MAX) + +/* Identical logic to H5T_CONV_fX, but special implementation is needed + * here to deal with MSVC's complex number structure types. + */ +#define H5T_CONV_zX(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) \ + do { \ + HDcompile_assert(sizeof(ST) <= sizeof(DT)); \ + H5T_CONV(H5T_CONV_zX, STYPE, DTYPE, ST, DT, D_MIN, D_MAX, N) \ + } while (0) + +/* H5T_CONV_Xz is currently unused (as there is no standard _Complex type for + * smaller floats than "float", though some compilers will allow this). When + * implemented, the logic should be nearly identical to H5T_CONV_Xf, with the + * comparisons being made against the "real" part of the complex number, as + * extracted with the creal() variants (similar to H5T_CONV_Zx, foH5T_CONV_zX(r guidance). + */ +/* #define H5T_CONV_Xz(STYPE, DTYPE, ST, DT, D_MIN, D_MAX) */ +#endif + /* Since all "no exception" cores do the same thing (assign the value in the * source location to the destination location, using casting), use one "core" * to do them all. @@ -831,17 +1438,21 @@ typedef struct H5T_conv_hw_t { #define H5T_CONV_SET_PREC_Y \ /* Get source & destination precisions into a variable */ \ tclass = st->shared->type; \ - assert(tclass == H5T_INTEGER || tclass == H5T_FLOAT); \ + assert(tclass == H5T_INTEGER || tclass == H5T_FLOAT || tclass == H5T_COMPLEX); \ if (tclass == H5T_INTEGER) \ sprec = st->shared->u.atomic.prec; \ - else \ + else if (tclass == H5T_FLOAT) \ sprec = 1 + st->shared->u.atomic.u.f.msize; \ + else \ + sprec = 1 + st->shared->parent->shared->u.atomic.u.f.msize; \ tclass = dt->shared->type; \ - assert(tclass == H5T_INTEGER || tclass == H5T_FLOAT); \ + assert(tclass == H5T_INTEGER || tclass == H5T_FLOAT || tclass == H5T_COMPLEX); \ if (tclass == H5T_INTEGER) \ dprec = dt->shared->u.atomic.prec; \ + else if (tclass == H5T_FLOAT) \ + dprec = 1 + dt->shared->u.atomic.u.f.msize; \ else \ - dprec = 1 + dt->shared->u.atomic.u.f.msize; + dprec = 1 + dt->shared->parent->shared->u.atomic.u.f.msize; #define H5T_CONV_SET_PREC_N /*don't init precision variables */ diff --git a/src/H5Tconv_reference.c b/src/H5Tconv_reference.c index 62ad0b574c0..1404127e152 100644 --- a/src/H5Tconv_reference.c +++ b/src/H5Tconv_reference.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -23,10 +23,11 @@ /***********/ /* Headers */ /***********/ -#include "H5Eprivate.h" -#include "H5FLprivate.h" -#include "H5Rpkg.h" -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5FLprivate.h" /* Free Lists */ +#include "H5Rpkg.h" /* References */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_reference.h" /*******************/ diff --git a/src/H5Tconv_reference.h b/src/H5Tconv_reference.h index 346dc947e94..984ad280d40 100644 --- a/src/H5Tconv_reference.h +++ b/src/H5Tconv_reference.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tconv_string.c b/src/H5Tconv_string.c index 520d43e24c7..727021af959 100644 --- a/src/H5Tconv_string.c +++ b/src/H5Tconv_string.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ /***********/ /* Headers */ /***********/ -#include "H5Eprivate.h" -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_string.h" /*------------------------------------------------------------------------- diff --git a/src/H5Tconv_string.h b/src/H5Tconv_string.h index 5a8a6354539..91718fea3e9 100644 --- a/src/H5Tconv_string.h +++ b/src/H5Tconv_string.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tconv_vlen.c b/src/H5Tconv_vlen.c index ab6f5fc2d59..8c5af35ef1e 100644 --- a/src/H5Tconv_vlen.c +++ b/src/H5Tconv_vlen.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,10 +22,11 @@ /***********/ /* Headers */ /***********/ -#include "H5CXprivate.h" -#include "H5Eprivate.h" -#include "H5Iprivate.h" -#include "H5Tconv.h" +#include "H5private.h" /* Generic Functions */ +#include "H5CXprivate.h" /* API Contexts */ +#include "H5Eprivate.h" /* Error handling */ +#include "H5Iprivate.h" /* IDs */ +#include "H5Tconv.h" /* Datatype conversions */ #include "H5Tconv_vlen.h" /****************/ @@ -56,7 +57,7 @@ H5FL_BLK_DEFINE_STATIC(vlen_seq); * Function: H5T__conv_vlen_nested_free * * Purpose: Recursively locates and frees any nested VLEN components of - * complex data types (including COMPOUND). + * composite data types (including COMPOUND). * * Return: Non-negative on success/Negative on failure. * @@ -100,6 +101,7 @@ H5T__conv_vlen_nested_free(uint8_t *buf, H5T_t *dt) case H5T_OPAQUE: case H5T_REFERENCE: case H5T_ENUM: + case H5T_COMPLEX: /* These types cannot contain vl data */ break; diff --git a/src/H5Tconv_vlen.h b/src/H5Tconv_vlen.h index a6a38d82ef1..e03961d2c9a 100644 --- a/src/H5Tconv_vlen.h +++ b/src/H5Tconv_vlen.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tcset.c b/src/H5Tcset.c index 28cfe63f9a6..8ccb8d826df 100644 --- a/src/H5Tcset.c +++ b/src/H5Tcset.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tdbg.c b/src/H5Tdbg.c index b1de7708b8f..7308279b35b 100644 --- a/src/H5Tdbg.c +++ b/src/H5Tdbg.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -182,6 +182,31 @@ H5T_debug(const H5T_t *dt, FILE *stream) s1 = "struct"; break; + case H5T_REFERENCE: + switch (dt->shared->u.atomic.u.r.rtype) { + case H5R_OBJECT1: + s1 = "object reference (old)"; + break; + case H5R_OBJECT2: + s1 = "object reference (new)"; + break; + case H5R_DATASET_REGION1: + s1 = "region reference (old)"; + break; + case H5R_DATASET_REGION2: + s1 = "region reference (new)"; + break; + case H5R_ATTR: + s1 = "attribute reference"; + break; + case H5R_BADTYPE: + case H5R_MAXTYPE: + default: + s1 = "invalid reference"; + break; + } + break; + case H5T_ENUM: s1 = "enum"; break; @@ -193,8 +218,14 @@ H5T_debug(const H5T_t *dt, FILE *stream) s1 = "vlen"; break; - case H5T_REFERENCE: case H5T_ARRAY: + s1 = "array"; + break; + + case H5T_COMPLEX: + s1 = "complex number"; + break; + case H5T_NCLASSES: default: s1 = ""; @@ -342,6 +373,7 @@ H5T_debug(const H5T_t *dt, FILE *stream) case H5T_ENUM: case H5T_VLEN: case H5T_ARRAY: + case H5T_COMPLEX: case H5T_NCLASSES: default: /* No additional info */ @@ -407,6 +439,23 @@ H5T_debug(const H5T_t *dt, FILE *stream) else if (H5T_OPAQUE == dt->shared->type) { fprintf(stream, ", tag=\"%s\"", dt->shared->u.opaque.tag); } + else if (H5T_COMPLEX == dt->shared->type) { + fprintf(stream, ", homogeneous"); + switch (dt->shared->u.cplx.form) { + case H5T_COMPLEX_RECTANGULAR: + fprintf(stream, ", rectangular form"); + break; + case H5T_COMPLEX_POLAR: + fprintf(stream, ", polar form"); + break; + case H5T_COMPLEX_EXPONENTIAL: + fprintf(stream, ", exponential form"); + break; + default: + fprintf(stream, ", invalid form"); + break; + } + } else { /* Unknown */ fprintf(stream, "unknown class %d\n", (int)(dt->shared->type)); diff --git a/src/H5Tdeprec.c b/src/H5Tdeprec.c index 2545858f760..8350cbb8af8 100644 --- a/src/H5Tdeprec.c +++ b/src/H5Tdeprec.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tdevelop.h b/src/H5Tdevelop.h index e571741ec2e..bb2d4aee0a0 100644 --- a/src/H5Tdevelop.h +++ b/src/H5Tdevelop.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tenum.c b/src/H5Tenum.c index 53a6ab36e46..0693f4e2605 100644 --- a/src/H5Tenum.c +++ b/src/H5Tenum.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tfields.c b/src/H5Tfields.c index 86c9e1eb51b..87d1a9068b8 100644 --- a/src/H5Tfields.c +++ b/src/H5Tfields.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -106,7 +106,7 @@ H5T_get_nmembers(const H5T_t *dt) * *------------------------------------------------------------------------- */ -char * +H5_ATTR_MALLOC char * H5Tget_member_name(hid_t type_id, unsigned membno) { H5T_t *dt = NULL; @@ -172,6 +172,7 @@ H5T__get_member_name(H5T_t const *dt, unsigned membno) case H5T_REFERENCE: case H5T_VLEN: case H5T_ARRAY: + case H5T_COMPLEX: case H5T_NCLASSES: default: HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, NULL, "operation not supported for type class"); @@ -231,6 +232,7 @@ H5Tget_member_index(hid_t type_id, const char *name) case H5T_REFERENCE: case H5T_VLEN: case H5T_ARRAY: + case H5T_COMPLEX: case H5T_NCLASSES: default: HGOTO_ERROR(H5E_ARGS, H5E_BADTYPE, FAIL, "operation not supported for this type"); diff --git a/src/H5Tfixed.c b/src/H5Tfixed.c index 178a0271fb4..2a7c9030145 100644 --- a/src/H5Tfixed.c +++ b/src/H5Tfixed.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -23,13 +23,12 @@ #include "H5Tpkg.h" /*data-type functions */ /*------------------------------------------------------------------------- - * Function: H5Tget_sign + * Function: H5Tget_sign * - * Purpose: Retrieves the sign type for an integer type. + * Purpose: Retrieves the sign type for an integer type. * - * Return: Success: The sign type. - * - * Failure: H5T_SGN_ERROR (Negative) + * Return: Success: The sign type. + * Failure: H5T_SGN_ERROR (Negative) * *------------------------------------------------------------------------- */ @@ -52,14 +51,13 @@ H5Tget_sign(hid_t type_id) } /*------------------------------------------------------------------------- - * Function: H5T_get_sign + * Function: H5T_get_sign * - * Purpose: Private function for H5Tget_sign. Retrieves the sign type + * Purpose: Private function for H5Tget_sign. Retrieves the sign type * for an integer type. * - * Return: Success: The sign type. - * - * Failure: H5T_SGN_ERROR (Negative) + * Return: Success: The sign type. + * Failure: H5T_SGN_ERROR (Negative) * *------------------------------------------------------------------------- */ @@ -88,11 +86,11 @@ H5T_get_sign(H5T_t const *dt) } /*------------------------------------------------------------------------- - * Function: H5Tset_sign + * Function: H5Tset_sign * - * Purpose: Sets the sign property for an integer. + * Purpose: Sets the sign property for an integer. * - * Return: Non-negative on success/Negative on failure + * Return: Non-negative on success/Negative on failure * *------------------------------------------------------------------------- */ diff --git a/src/H5Tfloat.c b/src/H5Tfloat.c index 0eefd730b73..d1e404a57e4 100644 --- a/src/H5Tfloat.c +++ b/src/H5Tfloat.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * diff --git a/src/H5Tinit_float.c b/src/H5Tinit_float.c index de959b49735..ca89207ce90 100644 --- a/src/H5Tinit_float.c +++ b/src/H5Tinit_float.c @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -608,9 +608,13 @@ H5T__init_native_float_types(void) #endif done: - /* Clear any FE_INVALID exceptions from NaN handling */ + /* Clear any FE_INVALID exceptions from NaN handling. FE_INVALID is C99/C11, + * but may not be present on all systems. + */ +#ifdef FE_INVALID if (feclearexcept(FE_INVALID) != 0) HSYS_GOTO_ERROR(H5E_DATATYPE, H5E_CANTSET, FAIL, "can't clear floating-point exceptions"); +#endif /* Restore the original environment */ if (feupdateenv(&saved_fenv) != 0) diff --git a/src/H5Tmodule.h b/src/H5Tmodule.h index 3e121469108..44aba1cb7fa 100644 --- a/src/H5Tmodule.h +++ b/src/H5Tmodule.h @@ -4,7 +4,7 @@ * * * This file is part of HDF5. The full HDF5 copyright notice, including * * terms governing use, modification, and redistribution, is contained in * - * the COPYING file, which can be found at the root of the source code * + * the LICENSE file, which can be found at the root of the source code * * distribution tree, or in https://www.hdfgroup.org/licenses. * * If you do not have access to either file, you may request a copy from * * help@hdfgroup.org. * @@ -22,8 +22,9 @@ * reporting macros. */ #define H5T_MODULE -#define H5_MY_PKG H5T -#define H5_MY_PKG_ERR H5E_DATATYPE +#define H5_MY_PKG H5T +#define H5_MY_PKG_ERR H5E_DATATYPE +#define H5_MY_PKG_INIT YES /** \page H5T_UG HDF5 Datatypes * @@ -70,7 +71,7 @@ * An HDF5 datatype describes one specific layout of bits. A dataset has a single datatype which * applies to every data element. When a dataset is created, the storage datatype is defined. After * the dataset or attribute is created, the datatype cannot be changed. - * \li The datatype describes the storage layout of a singledata element + * \li The datatype describes the storage layout of a single data element * \li All elements of the dataset must have the same type * \li The datatype of a dataset is immutable * @@ -167,6 +168,8 @@ * \li Compound datatypes: structured records * \li Array: a multidimensional array of a datatype * \li Variable-length: a one-dimensional array of a datatype + * \li Enumeration: a set of (name, value) pairs, similar to the C/C++ enum type + * \li Complex: an aggregate of two similar floating-point datatypes * * * @@ -198,7 +201,7 @@ * - * * + * + * + * + * + * + * *
    * Description * + * * Properties * @@ -350,6 +353,20 @@ * * *
    + * Complex + * + * Data elements of two floating point numbers + * + * Base floating point datatype + * + * Other properties inherited from base floating point datatype + *
    * * \subsubsection subsubsec_datatype_model_predefine Predefined Datatypes @@ -744,6 +761,30 @@ * * * + * #H5T_NATIVE_FLOAT_COMPLEX + * + * + * float _Complex (MSVC _Fcomplex) + * + * + * + * + * #H5T_NATIVE_DOUBLE_COMPLEX + * + * + * double _Complex (MSVC _Dcomplex) + * + * + * + * + * #H5T_NATIVE_LDOUBLE_COMPLEX + * + * + * long double _Complex (MSVC _Lcomplex) + * + * + * + * * #H5T_NATIVE_HSIZE * * @@ -1004,12 +1045,51 @@ * \ref hid_t \ref H5Tcreate (\ref H5T_class_t class, size_t size) * * - * Create a new datatype object of datatype class . The following datatype classes care supported - * with this function: + * Create a new datatype object of the specified datatype class with the specified size. This + * function is only used with the following datatype classes: * \li #H5T_COMPOUND * \li #H5T_OPAQUE * \li #H5T_ENUM - * \li Other datatypes are created with \ref H5Tcopy(). + * \li #H5T_STRING + * \li Other datatypes are created with a specialized datatype creation function such as + * \ref H5Tarray_create2 or are copied from an existing predefined datatype with \ref H5Tcopy(). + * + * + * + * + * \ref hid_t \ref H5Tarray_create2 (\ref hid_t base_id, unsigned ndims, const \ref hsize_t dim[]); + * + * + * Create a new array datatype object. \p base_id is the datatype of every element of the array, i.e., + * of the number at each position in the array. \p ndims is the number of dimensions and the size of + * each dimension is specified in the array \p dim. + * + * + * + * + * \ref hid_t \ref H5Tvlen_create (\ref hid_t base_id); + * + * + * Create a new one-dimensional variable-length array datatype object. \p base_id is the datatype of + * every element of the array. + * + * + * + * + * \ref hid_t \ref H5Tenum_create (\ref hid_t base_id); + * + * + * Create a new enumeration datatype object. \p base_id is the datatype of every element of the + * enumeration datatype. + * + * + * + * + * \ref hid_t \ref H5Tcomplex_create (\ref hid_t base_type_id); + * + * + * Create a new complex number datatype object. \p base_type_id is the datatype of both parts + * of the complex number datatype and must be a floating point datatype. * * * @@ -1043,7 +1123,8 @@ * * * Releases resources associated with a datatype obtained from \ref H5Tcopy, \ref H5Topen, or - * \ref H5Tcreate. It is illegal to close an immutable transient datatype (for example, predefined types). + * \ref H5Tcreate / \ref H5Tarray_create2 / etc. It is illegal to close an immutable transient + * datatype (for example, predefined types). * * * @@ -1074,12 +1155,12 @@ * * * - * In order to use a datatype, the object must be created (\ref H5Tcreate), or a reference obtained by - * cloning from an existing type (\ref H5Tcopy), or opened (\ref H5Topen). In addition, a reference to the - * datatype of a dataset or attribute can be obtained with \ref H5Dget_type or \ref H5Aget_type. For - * composite datatypes a reference to the datatype for members or base types can be obtained - * (\ref H5Tget_member_type, \ref H5Tget_super). When the datatype object is no longer needed, the - * reference is discarded with \ref H5Tclose. + * In order to use a datatype, the object must be created (\ref H5Tcreate / \ref H5Tarray_create2 / etc.), + * or a reference obtained by cloning from an existing type (\ref H5Tcopy), or opened (\ref H5Topen). + * In addition, a reference to the datatype of a dataset or attribute can be obtained with + * \ref H5Dget_type or \ref H5Aget_type. For composite datatypes a reference to the datatype for + * members or base types can be obtained (\ref H5Tget_member_type, \ref H5Tget_super). When the datatype + * object is no longer needed, the reference is discarded with \ref H5Tclose. * * Two datatype objects can be tested to see if they are the same with \ref H5Tequal. This function * returns true if the two datatype references refer to the same datatype object. However, if two @@ -1087,7 +1168,7 @@ * they will not be considered ‘equal’. * * A datatype can be written to the file as a first class object (\ref H5Tcommit). This is a committed - * datatype and can be used in thesame way as any other datatype. + * datatype and can be used in the same way as any other datatype. * * \subsubsection subsubsec_datatype_program_discover Discovery of Datatype Properties * Any HDF5 datatype object can be queried to discover all of its datatype properties. For each @@ -1114,7 +1195,7 @@ * * * The datatype class: #H5T_INTEGER, #H5T_FLOAT, #H5T_STRING, #H5T_BITFIELD, #H5T_OPAQUE, #H5T_COMPOUND, - * #H5T_REFERENCE, #H5T_ENUM, #H5T_VLEN, #H5T_ARRAY + * #H5T_REFERENCE, #H5T_ENUM, #H5T_VLEN, #H5T_ARRAY, #H5T_COMPLEX * * * @@ -1472,6 +1553,14 @@ * #H5Tvlen_create * * + * + * + * COMPLEX + * + * + * #H5Tcomplex_create + * + * * * * Once the datatype is created and the datatype properties set, the datatype object can be used. @@ -2407,7 +2496,8 @@ filled according to the value of this property. The padding can be: *
  • #H5T_REFERENCE
  • *
  • #H5T_ENUM
  • *
  • #H5T_VLEN
  • - *
  • #H5T_ARRAY
  • + *
  • #H5T_ARRAY
  • + *
  • #H5T_COMPLEX
  • * *
  • If class is #H5T_COMPOUND, then go to step 2 and repeat all steps under step 3. If * class is not #H5T_COMPOUND, then a member is of an atomic class and can be read @@ -2690,7 +2780,7 @@ filled according to the value of this property. The padding can be: * * * - * An array datatype may be multi-dimensional with 1 to #H5S_MAX_RANK(the maximum rank + * An array datatype may be multi-dimensional with 1 to #H5S_MAX_RANK (the maximum rank * of a dataset is currently 32) dimensions. The dimensions can be any size greater than 0, but * unlimited dimensions are not supported (although the datatype can be a variable-length datatype). * @@ -2726,7 +2816,7 @@ filled according to the value of this property. The padding can be: * * A variable-length (VL) datatype is a one-dimensional sequence of a datatype which are not fixed * in length from one dataset location to another. In other words, each data element may have a - * different number of members. Variable-length datatypes cannot be divided;the entire data + * different number of members. Variable-length datatypes cannot be divided; the entire data * element must be transferred. * * VL datatypes are useful to the scientific community in many different ways, possibly including: @@ -2779,14 +2869,14 @@ filled according to the value of this property. The padding can be: * data is laid out in memory. * * An analogous procedure must be used to read the data. See the second example below. An - * appropriate array of vl_t must be allocated, and the data read. It is then traversed one data - * element at a time. The #H5Dvlen_reclaim call frees the data buffer for the buffer. With each + * appropriate array of hvl_t must be allocated, and the data read. It is then traversed one data + * element at a time. The #H5Treclaim call frees the data buffer for the buffer. With each * element possibly being of different sequence lengths for a dataset with a VL datatype, the * memory for the VL datatype must be dynamically allocated. Currently there are two methods of * managing the memory for VL datatypes: the standard C malloc/free memory allocation routines * or a method of calling user-defined memory management routines to allocate or free memory * (set with #H5Pset_vlen_mem_manager). Since the memory allocated when reading (or writing) - * may be complicated to release, the #H5Dvlen_reclaim function is provided to traverse a memory + * may be complicated to release, the #H5Treclaim function is provided to traverse a memory * buffer and free the VL datatype information without leaking memory. * * Write VL data @@ -2814,7 +2904,7 @@ filled according to the value of this property. The padding can be: * printf(“ value: %u\n”,((unsigned int *)rdata[i].p)[j]); * } * } - * ret = H5Dvlen_reclaim(tid1, sid1, xfer_pid, rdata); + * ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); * \endcode * * @@ -2826,10 +2916,10 @@ filled according to the value of this property. The padding can be: *
    * * The user program must carefully manage these relatively complex data structures. The - * #H5Dvlen_reclaim function performs a standard traversal, freeing all the data. This function + * #H5Treclaim function performs a standard traversal, freeing all the data. This function * analyzes the datatype and dataspace objects, and visits each VL data element, recursing through - * nested types. By default, the system free is called for the pointer in each vl_t. Obviously, this - * call assumes that all of this memory was allocated with the system malloc. + * nested types. By default, the system free is called for the pointer in each hvl_t. Obviously, + * this call assumes that all of this memory was allocated with the system malloc. * * The user program may specify custom memory manager routines, one for allocating and one for * freeing. These may be set with the #H5Pset_vlen_mem_manager, and must have the following @@ -2852,6 +2942,44 @@ filled according to the value of this property. The padding can be: * destination storage (memory). The size value is adjusted for data conversion and alignment in the * destination. * + *

    Complex

    + * + * A complex number datatype represents complex number data elements which consist of two floating + * point parts. Complex number datatypes cannot be divided for I/O; the entire data element must be + * transferred. + * + * A complex number datatype is created by calling #H5Tcomplex_create with a specified base floating + * point datatype. The example below shows code that creates a complex number datatype of 16-bit + * floating point values. + * + * Create a complex number datatype of 2 IEEE little-endian 16-bit floating point values + * \code + * tid1 = H5Tcomplex_create (H5T_IEEE_F16LE); + * + * dataset = H5Dcreate(fid1, “Dataset1”, tid1, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + * \endcode + * + * Data element storage of a complex number datatype + * + * Each part of a data element with a complex number datatype is stored contiguously. Complex number + * datatypes have the same storage representation as an array datatype of 2 elements of a floating + * point datatype or a compound datatype with 2 fields and no structure padding, where each field + * is of the same floating point datatype. Thus, the following representations are equivalent: + * + * \code + * float _Complex data; + * \endcode + * \code + * float data[2]; + * \endcode + * \code + * struct + * { + * float real; + * float imaginary; + * } data; + * \endcode + * * \subsection subsec_datatype_other Other Non-numeric Datatypes * Several datatype classes define special types of objects. * @@ -2916,13 +3044,13 @@ filled according to the value of this property. The padding can be: * is fast to access, but can waste storage space if the length of the Strings varies. * * A third alternative is to use a variable-length datatype. See item c in the figure above. This can - * be done using the standard mechanisms described above. The program would use vl_t structures + * be done using the standard mechanisms described above. The program would use hvl_t structures * to write and read the data. * * A fourth alternative is to use a special feature of the string datatype class to set the size of the * datatype to #H5T_VARIABLE. See item c in the figure above. The example below shows a * declaration of a datatype of type #H5T_C_S1 which is set to #H5T_VARIABLE. The HDF5 - * Library automatically translates between this and the vl_t structure. Note: the #H5T_VARIABLE + * Library automatically translates between this and the hvl_t structure. Note: the #H5T_VARIABLE * size can only be used with string datatypes. * * Set the string datatype size to H5T_VARIABLE @@ -2944,7 +3072,7 @@ filled according to the value of this property. The padding can be: * printf(“%d: len: %d, str is: %s\n”, i, strlen(rdata[i]), rdata[i]); * } * - * ret = H5Dvlen_reclaim(tid1, sid1, xfer_pid, rdata); + * ret = H5Treclaim(tid1, sid1, xfer_pid, rdata); * \endcode * * \subsubsection subsubsec_datatype_other_refs Reference @@ -3803,12 +3931,13 @@ filled according to the value of this property. The padding can be: * datatypes. * * The currently supported text format used by #H5LTtext_to_dtype and #H5LTdtype_to_text is the - * data description language (DDL) and conforms to the \ref DDLBNF114. The portion of the - * \ref DDLBNF114 that defines HDF5 datatypes appears below. + * data description language (DDL) and conforms to the \ref DDLBNF200. The portion of the + * \ref DDLBNF200 that defines HDF5 datatypes appears below. * * The definition of HDF5 datatypes from the HDF5 DDL * \code - * ::= | | | + * ::= | | | | + * * * ::= | |