diff --git a/README.md b/README.md index d33ea47b53c7a7e5c7ce323e9cf19f6d204f5680..df917966856946003f16bcc5ce3ce88d224eb31d 100644 --- a/README.md +++ b/README.md @@ -1 +1,3 @@ -SiB-Auto +This repository contains SiB4 scripts, preprocessing pipelines and templates for reading into Python for easy modification. + +Use in combination with the preprocessing pipeline in CTDAS/CTDAS.git diff --git a/mpi/SiB4D b/mpi/SiB4D new file mode 100755 index 0000000000000000000000000000000000000000..624ff663e8ce223fd3c3a89926fcd64017dc49dc Binary files /dev/null and b/mpi/SiB4D differ diff --git a/mpi/chmod_144 b/mpi/chmod_144 new file mode 100755 index 0000000000000000000000000000000000000000..5db58ca7353c228982ee724b158820f6a18e5ab3 --- /dev/null +++ b/mpi/chmod_144 @@ -0,0 +1,8 @@ +chmod +x rename_namel_144 +chmod +x dir_make_144 +chmod +x dir_remove_144 +chmod +x ex_time_144 +chmod +x make_ex_dir_144 +chmod +x script_qsub.csh_144 +chmod +x sibcasa_script_144 +chmod +x script_cp_to_JET_ex_144 diff --git a/mpi/dir_files.py b/mpi/dir_files.py new file mode 100644 index 0000000000000000000000000000000000000000..ec0f518237ab01985b5691d508dffa44527579ab --- /dev/null +++ b/mpi/dir_files.py @@ -0,0 +1,17 @@ +''' +show files in directory +''' +# Load libraries +import glob + +import os +import shutil +import numpy as np + +dir = '/scratch/shared/kooij032/NRT/output_sib4_NRT_final/' + +# Load all files in directory +flist = sorted(glob.glob(dir+'/*')) + +# Show file list +print(flist) diff --git a/mpi/dir_make_144 b/mpi/dir_make_144 new file mode 100755 index 0000000000000000000000000000000000000000..bb744f7e30acd7fbc4503d4d9419cb6bb8e93449 --- /dev/null +++ b/mpi/dir_make_144 @@ -0,0 +1,147 @@ +rm -r /scratch/p274780/output_global_final2/global_* +mkdir /scratch/p274780/output_global_final2/ +cd /scratch/p274780/output_global_final2/ +mkdir global_001 +mkdir global_002 +mkdir global_003 +mkdir global_004 +mkdir global_005 +mkdir global_006 +mkdir global_007 +mkdir global_008 +mkdir global_009 +mkdir global_010 +mkdir global_011 +mkdir global_012 +mkdir global_013 +mkdir global_014 +mkdir global_015 +mkdir global_016 +mkdir global_017 +mkdir global_018 +mkdir global_019 +mkdir global_020 +mkdir global_021 +mkdir global_022 +mkdir global_023 +mkdir global_024 +mkdir global_025 +mkdir global_026 +mkdir global_027 +mkdir global_028 +mkdir global_029 +mkdir global_030 +mkdir global_031 +mkdir global_032 +mkdir global_033 +mkdir global_034 +mkdir global_035 +mkdir global_036 +mkdir global_037 +mkdir global_038 +mkdir global_039 +mkdir global_040 +mkdir global_041 +mkdir global_042 +mkdir global_043 +mkdir global_044 +mkdir global_045 +mkdir global_046 +mkdir global_047 +mkdir global_048 +mkdir global_049 +mkdir global_050 +mkdir global_051 +mkdir global_052 +mkdir global_053 +mkdir global_054 +mkdir global_055 +mkdir global_056 +mkdir global_057 +mkdir global_058 +mkdir global_059 +mkdir global_060 +mkdir global_061 +mkdir global_062 +mkdir global_063 +mkdir global_064 +mkdir global_065 +mkdir global_066 +mkdir global_067 +mkdir global_068 +mkdir global_069 +mkdir global_070 +mkdir global_071 +mkdir global_072 +mkdir global_073 +mkdir global_074 +mkdir global_075 +mkdir global_076 +mkdir global_077 +mkdir global_078 +mkdir global_079 +mkdir global_080 +mkdir global_081 +mkdir global_082 +mkdir global_083 +mkdir global_084 +mkdir global_085 +mkdir global_086 +mkdir global_087 +mkdir global_088 +mkdir global_089 +mkdir global_090 +mkdir global_091 +mkdir global_092 +mkdir global_093 +mkdir global_094 +mkdir global_095 +mkdir global_096 +mkdir global_097 +mkdir global_098 +mkdir global_099 +mkdir global_100 +mkdir global_101 +mkdir global_102 +mkdir global_103 +mkdir global_104 +mkdir global_105 +mkdir global_106 +mkdir global_107 +mkdir global_108 +mkdir global_109 +mkdir global_110 +mkdir global_111 +mkdir global_112 +mkdir global_113 +mkdir global_114 +mkdir global_115 +mkdir global_116 +mkdir global_117 +mkdir global_118 +mkdir global_119 +mkdir global_120 +mkdir global_121 +mkdir global_122 +mkdir global_123 +mkdir global_124 +mkdir global_125 +mkdir global_126 +mkdir global_127 +mkdir global_128 +mkdir global_129 +mkdir global_130 +mkdir global_131 +mkdir global_132 +mkdir global_133 +mkdir global_134 +mkdir global_135 +mkdir global_136 +mkdir global_137 +mkdir global_138 +mkdir global_139 +mkdir global_140 +mkdir global_141 +mkdir global_142 +mkdir global_143 +mkdir global_144 diff --git a/mpi/dir_remove_144 b/mpi/dir_remove_144 new file mode 100755 index 0000000000000000000000000000000000000000..55cb662ebe24d663b892d98ff8e5485223ecdd0f --- /dev/null +++ b/mpi/dir_remove_144 @@ -0,0 +1,144 @@ +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_001 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_002 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_003 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_004 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_005 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_006 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_007 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_008 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_009 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_010 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_011 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_012 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_013 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_014 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_015 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_016 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_017 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_018 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_019 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_020 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_021 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_022 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_023 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_024 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_025 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_026 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_027 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_028 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_029 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_030 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_031 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_032 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_033 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_034 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_035 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_036 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_037 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_038 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_039 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_040 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_041 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_042 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_043 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_044 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_045 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_046 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_047 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_048 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_049 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_050 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_051 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_052 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_053 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_054 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_055 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_056 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_057 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_058 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_059 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_060 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_061 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_062 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_063 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_064 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_065 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_066 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_067 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_068 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_069 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_070 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_071 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_072 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_073 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_074 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_075 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_076 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_077 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_078 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_079 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_080 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_081 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_082 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_083 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_084 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_085 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_086 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_087 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_088 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_089 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_090 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_091 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_092 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_093 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_094 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_095 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_096 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_097 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_098 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_099 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_100 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_101 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_102 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_103 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_104 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_105 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_106 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_107 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_108 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_109 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_110 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_111 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_112 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_113 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_114 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_115 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_116 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_117 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_118 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_119 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_120 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_121 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_122 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_123 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_124 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_125 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_126 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_127 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_128 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_129 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_130 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_131 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_132 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_133 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_134 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_135 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_136 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_137 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_138 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_139 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_140 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_141 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_142 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_143 +rm -r /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_144 diff --git a/mpi/ex_time_144 b/mpi/ex_time_144 new file mode 100755 index 0000000000000000000000000000000000000000..0a4a9fb677423ac55fb9aead925caff83a35fb41 --- /dev/null +++ b/mpi/ex_time_144 @@ -0,0 +1,576 @@ +echo 001 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_001 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 002 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_002 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 003 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_003 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 004 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_004 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 005 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_005 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 006 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_006 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 007 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_007 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 008 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_008 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 009 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_009 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 010 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_010 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 011 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_011 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 012 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_012 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 013 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_013 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 014 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_014 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 015 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_015 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 016 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_016 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 017 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_017 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 018 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_018 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 019 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_019 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 020 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_020 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 021 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_021 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 022 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_022 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 023 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_023 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 024 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_024 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 025 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_025 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 026 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_026 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 027 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_027 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 028 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_028 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 029 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_029 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 030 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_030 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 031 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_031 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 032 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_032 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 033 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_033 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 034 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_034 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 035 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_035 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 036 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_036 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 037 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_037 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 038 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_038 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 039 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_039 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 040 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_040 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 041 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_041 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 042 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_042 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 043 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_043 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 044 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_044 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 045 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_045 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 046 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_046 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 047 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_047 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 048 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_048 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 049 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_049 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 050 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_050 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 051 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_051 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 052 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_052 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 053 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_053 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 054 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_054 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 055 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_055 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 056 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_056 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 057 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_057 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 058 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_058 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 059 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_059 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 060 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_060 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 061 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_061 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 062 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_062 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 063 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_063 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 064 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_064 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 065 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_065 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 066 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_066 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 067 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_067 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 068 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_068 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 069 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_069 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 070 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_070 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 071 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_071 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 072 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_072 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 073 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_073 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 074 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_074 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 075 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_075 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 076 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_076 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 077 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_077 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 078 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_078 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 079 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_079 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 080 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_080 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 081 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_081 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 082 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_082 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 083 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_083 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 084 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_084 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 085 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_085 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 086 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_086 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 087 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_087 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 088 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_088 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 089 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_089 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 090 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_090 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 091 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_091 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 092 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_092 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 093 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_093 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 094 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_094 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 095 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_095 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 096 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_096 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 097 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_097 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 098 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_098 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 099 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_099 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 100 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_100 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 101 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_101 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 102 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_102 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 103 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_103 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 104 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_104 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 105 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_105 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 106 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_106 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 107 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_107 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 108 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_108 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 109 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_109 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 110 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_110 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 111 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_111 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 112 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_112 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 113 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_113 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 114 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_114 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 115 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_115 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 116 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_116 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 117 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_117 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 118 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_118 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 119 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_119 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 120 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_120 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 121 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_121 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 122 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_122 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 123 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_123 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 124 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_124 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 125 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_125 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 126 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_126 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 127 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_127 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 128 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_128 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 129 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_129 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 130 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_130 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 131 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_131 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 132 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_132 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 133 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_133 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 134 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_134 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 135 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_135 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 136 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_136 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 137 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_137 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 138 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_138 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 139 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_139 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 140 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_140 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 141 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_141 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 142 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_142 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 143 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_143 +ls -al sib_r200012.nc +ls -al sib_requib.nc +echo 144 +cd /lfs0/projects/co2/ivar/MPI_run/RunOutput/global_144 +ls -al sib_r200012.nc +ls -al sib_requib.nc diff --git a/mpi/extract_equi.py b/mpi/extract_equi.py new file mode 100644 index 0000000000000000000000000000000000000000..c0e025ad0e8ec85b7fbfa16ee003a3411e569a3d --- /dev/null +++ b/mpi/extract_equi.py @@ -0,0 +1,60 @@ +##### Extract Equi ######## +''' +Extract equilibrium files and copy them +to new directory. This circumvents the problem +that some cores achieve equilibrium earlier than +other, and therefore the filesnames can be +different. +''' + +# Experiment name (without _spin or _final) +exp_name = 'sib4_NRT' +dir_name = '/scratch/shared/kooij032/NRT/' +n_cores = 288 +n_iter = 10 + +# Load libraries +import glob +import os +import shutil +import numpy as np + +# Move equip folder +equip_dir = dir_name+'output_'+exp_name+'_spin_1850' +shutil.move(equip_dir, equip_dir+ '_MOVE/') + +# Create new equip folder +if not os.path.exists(equip_dir): + os.mkdir(equip_dir) + +# Load file list +flist = sorted(glob.glob(equip_dir+'_MOVE/*')) + +# Initialize loop variables +flist_id = 1 +eq_list = np.zeros(288, dtype=int) + +# Loop over all files and determine last equip file per core +#print(len(flist)) + +for i in range(len(flist)): + if flist[i][-9:-6] != "%03d" % (flist_id,): + eq_list[flist_id-1] = i-1 + flist_id += 1 + +# Make sure the last core is considered +eq_list[flist_id-1] = len(flist) -1 + + +#print(len(flist) -1) +#print(flist_id) +#print(eq_list) + +# Copy last equip file to spin folder +n_iter_str = 's' + "%02d" % (n_iter,) + '.nc' +for i in range(288): + print(flist[eq_list[i]]) + shutil.copyfile(flist[eq_list[i]], equip_dir+'/sib_requibp'+"%03d" % (i+1,)+n_iter_str) + print('FILE COPIED') + print('old: '+flist[eq_list[i]]) + print('new: '+equip_dir+'/sib_requibp'+"%03d" % (i+1,)+n_iter_str) diff --git a/mpi/io_namel.py b/mpi/io_namel.py new file mode 100755 index 0000000000000000000000000000000000000000..544cdd2aa69e3c9c4fc2e3c2f32f08a08a72fd0a --- /dev/null +++ b/mpi/io_namel.py @@ -0,0 +1,129 @@ +#!/usr/bin/env python +# namel_io.py + +""" +Author : Erik +Original Author: Ivar +Revision History: +File created on 06 Oct 2010. +Recoded to support SiB4 - Erik +""" +import shutil +from numpy import * + +import os +import glob + +num_outputdirs = 288 +path_ouput = '/scratch/shared/awoude/' +sim_name = 'sib4_NRT' + +startyear = 1997 +endyear = 2020 + +spin = False +n_spin = 10 + +minlon = -15 +maxlon = 35 +minlat = 33 +maxlat = 72 + +dtsibout = -1 + +if spin == True: + outputname = 'output_'+sim_name+'_spin_1850' + execname = 'ex_dir_'+sim_name+'_spin_1850' +else: + outputname = 'output_'+sim_name+'_sim' + execname = 'ex_dir_'+sim_name+'_sim' + #spinoutput = 'output_'+sim_name+'_spin_1850' + +targdir = os.path.join(path_ouput,outputname) + +# Create output folder +if not os.path.exists(targdir): + os.makedirs(targdir) + +path_exec = '/scratch/shared/awoude/' + +targdir = os.path.join(path_exec,execname) + +# Create folders to store executables +if not os.path.exists(targdir): + os.makedirs(targdir) + for i in range(num_outputdirs): + targdir2= os.path.join(targdir,'case_%s'%(i+1)) + if not os.path.exists(targdir2): + os.makedirs(targdir2) + +path ='/projects/0/ctdas/NRT/data/SiB/mpi' + +oldline = [''] * 12 +newline = [''] * 12 + +orig_namelist = '/projects/0/ctdas/NRT/data/SiB/mpi/namel_sibdrv' + +# Create namelists for each thread +for j in range(12): + for i in range(num_outputdirs): + i=i+1 + if j==0: + shutil.copyfile(orig_namelist, '%s/namel_%s'%(path,i)) + file = os.path.join(path,'namel_%s'%i) + + oldline[1] =" out_path = '/scratch/shared/awoude/" + newline[1] =" out_path= '/scratch/shared/awoude/%s/" %(outputname) + + if spin == False: + oldline[2] =" ic_file = '/projects/0/ctdas/sib4_input/requib/sib_requib2.nc" + newline[2] =" ic_file = '/projects/0/ctdas/NRT/data/SiB/restart/sib_r199601p%s.nc" %(str(i).zfill(3)) + #newline[2] =" ic_file = '/scratch/shared/kooij032/NRT/%s/sib_requibp%ss%s.nc" %(spinoutput,str(i).zfill(3),str(n_spin).zfill(2)) + + oldline[3] =" startyear = 1998," + newline[3] =" startyear = %s,"%(str(startyear)) + oldline[4] =" endyear = 2010," + newline[4] =" endyear = %s,"%(str(endyear)) + oldline[5] =" spinup = .false.," + newline[5] =" spinup = .%s.,"%(str(spin).lower()) + oldline[6] =" spinup_maxiter = 5," + newline[6] =" spinup_maxiter = %s,"%(str(n_spin)) + oldline[7] =" minlon = -180," + newline[7] =" minlon = %s,"%(str(minlon)) + oldline[8] =" maxlon = 180," + newline[8] =" maxlon = %s,"%(str(maxlon)) + oldline[9] =" minlat = -90," + newline[9] =" minlat = %s,"%(str(minlat)) + oldline[10] =" maxlat = 90," + newline[10] =" maxlat = %s,"%(str(maxlat)) + oldline[11] =" dtsibqp = -1," + newline[11] =" dtsibqp = %s,"%(str(dtsibout)) + + # Read - write namelists + f = open(file, "r") + text = f.read() + f.close() + f = open(file, "w") + f.write(text.replace(oldline[j], newline[j])) + f.close() + +sib4_script_path = '/projects/0/ctdas/NRT/data/SiB/mpi/sib4_script' + +oldline = 'cd /scratch/shared/kooij032/NRT/ex_dir_global/case_${rank}' +newline = 'cd /scratch/shared/awoude/'+execname+'/case_${rank}' + +# Change sib4_script +f = open(sib4_script_path+'.template' , "r") +text = f.read() +f.close() +f = open(sib4_script_path, "w") +f.write(text.replace(oldline, newline)) +f.close() + +# Change sib4 permissions for mpi +#os.chmod('/projects/0/ctdas/NRT/data/SiB/mpi/sib4_script', 0o777) + +print("All went well, the modifications are done") + +if __name__ == "__main__": + pass diff --git a/mpi/make_ex_dir_144 b/mpi/make_ex_dir_144 new file mode 100755 index 0000000000000000000000000000000000000000..543f56cb505d5d0fb14822e59820dacb74247d52 --- /dev/null +++ b/mpi/make_ex_dir_144 @@ -0,0 +1,147 @@ +rm -r ex_dir/ +mkdir /scratch/p274780/ex_dir +cd /scratch/p274780/ex_dir +mkdir case_1 +mkdir case_2 +mkdir case_3 +mkdir case_4 +mkdir case_5 +mkdir case_6 +mkdir case_7 +mkdir case_8 +mkdir case_9 +mkdir case_10 +mkdir case_11 +mkdir case_12 +mkdir case_13 +mkdir case_14 +mkdir case_15 +mkdir case_16 +mkdir case_17 +mkdir case_18 +mkdir case_19 +mkdir case_20 +mkdir case_21 +mkdir case_22 +mkdir case_23 +mkdir case_24 +mkdir case_25 +mkdir case_26 +mkdir case_27 +mkdir case_28 +mkdir case_29 +mkdir case_30 +mkdir case_31 +mkdir case_32 +mkdir case_33 +mkdir case_34 +mkdir case_35 +mkdir case_36 +mkdir case_37 +mkdir case_38 +mkdir case_39 +mkdir case_40 +mkdir case_41 +mkdir case_42 +mkdir case_43 +mkdir case_44 +mkdir case_45 +mkdir case_46 +mkdir case_47 +mkdir case_48 +mkdir case_49 +mkdir case_50 +mkdir case_51 +mkdir case_52 +mkdir case_53 +mkdir case_54 +mkdir case_55 +mkdir case_56 +mkdir case_57 +mkdir case_58 +mkdir case_59 +mkdir case_60 +mkdir case_61 +mkdir case_62 +mkdir case_63 +mkdir case_64 +mkdir case_65 +mkdir case_66 +mkdir case_67 +mkdir case_68 +mkdir case_69 +mkdir case_70 +mkdir case_71 +mkdir case_72 +mkdir case_73 +mkdir case_74 +mkdir case_75 +mkdir case_76 +mkdir case_77 +mkdir case_78 +mkdir case_79 +mkdir case_80 +mkdir case_81 +mkdir case_82 +mkdir case_83 +mkdir case_84 +mkdir case_85 +mkdir case_86 +mkdir case_87 +mkdir case_88 +mkdir case_89 +mkdir case_90 +mkdir case_91 +mkdir case_92 +mkdir case_93 +mkdir case_94 +mkdir case_95 +mkdir case_96 +mkdir case_97 +mkdir case_98 +mkdir case_99 +mkdir case_100 +mkdir case_101 +mkdir case_102 +mkdir case_103 +mkdir case_104 +mkdir case_105 +mkdir case_106 +mkdir case_107 +mkdir case_108 +mkdir case_109 +mkdir case_110 +mkdir case_111 +mkdir case_112 +mkdir case_113 +mkdir case_114 +mkdir case_115 +mkdir case_116 +mkdir case_117 +mkdir case_118 +mkdir case_119 +mkdir case_120 +mkdir case_121 +mkdir case_122 +mkdir case_123 +mkdir case_124 +mkdir case_125 +mkdir case_126 +mkdir case_127 +mkdir case_128 +mkdir case_129 +mkdir case_130 +mkdir case_131 +mkdir case_132 +mkdir case_133 +mkdir case_134 +mkdir case_135 +mkdir case_136 +mkdir case_137 +mkdir case_138 +mkdir case_139 +mkdir case_140 +mkdir case_141 +mkdir case_142 +mkdir case_143 +mkdir case_144 diff --git a/mpi/namel_sibdrv b/mpi/namel_sibdrv new file mode 100644 index 0000000000000000000000000000000000000000..71e35e5a620faf46f1134cdcdeba0dabc6324987 --- /dev/null +++ b/mpi/namel_sibdrv @@ -0,0 +1,216 @@ + +$CONTROL_LIST_SIBDRV + nsib = 62521, + starttime = 1, + startyear = 2018, + endtime = 31, + endyear = 2018, + dtsib = 600, + restart_dtsib = -12, + qp_dtsib = 3600, + pbp_dtsib = 0, + hr_dtsib = 0, +/ + +$IO_LIST_SIBDRV + pft_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/info_pft.dat' + pool_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/info_pool.dat' + aero_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_aero.nc' + pgdd_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/phen_gdd.dat' + pstg_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/phen_stg_EurDrought.dat' + phys_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_phys_EurDrought.dat' + pool_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_pool.dat' + vs_file = '/projects/0/ctdas/sib4_input/vs/sib_vs_0.5deg.nc' + ic_file = '/projects/0/ctdas/NRT/data/SiB//restart/sib_r199601p025.nc' + dr_path = '/projects/0/ctdas/awoude/NRT/input/merra2_0.5deg_' + tm5_path = '/projects/0/ctdas/linda/sib4_input/TM5MR/' + fr_path = '../../sib4_driver/global/gfed4/gfed4_0.5deg_' + out_path = '/scratch/shared/awoude//output_sib4_NRT_sim/' + out_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/sib_outopts_NRT' + out_rinfo= '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/sibr_outopts' +/ + +$SPINUP_LIST_SIBDRV + spinup = .false., + spinup_default = .true., + spinup_numyrs = 1, + spinup_maxiter = 10, + spinup_threshold = 0.01, + spinup_writediag = .false., + spinup_writetxtf = .false., +/ + +$SUBGRID_SIBDRV + minlon = -15, + maxlon = 35, + minlat = 33, + maxlat = 72, +/ + +$PBP_LIST_SIBDRV + npbp = 0 +/ +-lon-, -lat-, +/ + +$BALAN_LIST_SIBDRV + badtc_print = .false., + badtc_stop = .false., + bnum_allow = 10, + canb_print = .false., + canb_stop = .false., + canb_thresh = 1.E-6, + carbonb_print = .true., + carbonb_stop = .false., + carbonb_thresh = 1.E-6, + fireb_print = .false., + fireb_stop = .false., + fireb_thresh = 1.E-6, + snocmbn_print = .false., + snocmbn_stop = .false., + snocmbn_thresh = 1.E-6, + energyb_print = .false., + energyb_stop = .true., + energyb_thresh = 0.01, + waterb_print = .false., + waterb_stop = .true., + waterb_thresh = 0.5, +/ + +$PRINT_LIST_SIBDRV + print_avec = .false., + print_driver = .false., + print_fire = .false., + print_harvest = .false., + print_pftinfo = .false., + print_pooll = .false., + print_soil = .false., + print_sscol = .false., + print_veg = .false., + print_stop = .false., +/ + +$SWITCH_LIST_SIBDRV + cornsoy_switch = .false., + fire_switch = .false., + grazing_switch = .true., + green_switch = .true., + eqclear_switch = .true., + leapyr_switch = .false., + updatelst_switch = .true., + tm5mr_switch = .false., + soilogee_switch = .false., +/ + +------------------------------------------------------------------------------ + nsib : number of points in simulation + starttime : day of year to start simulation + startyear : year to start simulation + endtime : day of year to stop simulation + endyear : year to stop simulation + dtsib : prognostic time step, in seconds + dtsibrestart : greater than zero implies units of seconds - restart output interval + less than zero implies units of months - restart output interval + dtsibqp : greater than zero implies units of seconds - QP output interval + less than zero implies units of months - QP output interval + dtsibpbp : greater than zero implies units of seconds - PBP output interval + less than zero implies units of months - PBP output interval + dtsibhr : greater than zero implies units of seconds - HR output interval + less than zero implies units of months - HR output interval + + pft_info : File containing PFT information + pool_info : File containing pool information + aero_file : File containing aerodynamical parameters + pgdd_file : File containing GDD-based phenological parameters + pstg_file : File containing stage-based phenological parameters + pnvg_file : File containing non-vegetation parameters + phys_file : File containing physiological parameters + pool_file : File containing pool respiration/transfer parameters + vs_file : File containing vegetation structure + ic_file : File containing initial condition/restart values + dr_path : Directory containing driver data + fr_path : Directory containing fire emissions + out_path : Directory for model output + out_info : File containing output specification/information + out_rinfo : File containing restart specification/information + + spinup : Flag to perform a spinup simulation + ->simulation continues until either: + -- pools are within threshold equilibrium values + -- max number of iterations is met + spinup_default : Flag to use default initial conditions for spin-up run + -- all pools zero except minimal froot + -- soil moisture starts at saturation + spinup_numyrs : Number of years in spinup run to run before calculating equilibrium pools + spinup_maxiter : Number of interations in a spinup simulation + spinup_threshold: Input/output ratio threshold for 'spun-up' + spinup_writediag: Flag to follow output choices in spin-up run + (false will only save equilibrium files) + spinup_writetxtf: Flag to write equilibrium pools to a text file + + minlon : Minimum longitude for setting a subgrid + maxlon : Maximum longitude for setting a subgrid + minlat : Minimum latitude for setting a subgrid + maxlat : Maximum latitude for setting a subgrid + + npbp : Number of PBP's to be saved + --corresponding lon/lat pairs (in degrees) are listed below npbp + --value of -1 will save all points + + badtc_print : print canopy temperatures? + badtc_stop : stop for bad canopy temperatures? + bnum_allow : number of allowable balance offenses (i4) + canb_print : print canopy balance values? + canb_stop : stop if canopy balance fails? + canb_thresh : canopy balance threshold (r4) + carbonb_print : print carbon balance information? + carbonb_stop : stop if carbon balance fails? + carbonb_thres : carbon balance threshold (r4) + fireb_print : print fire balance information? + fireb_stop : stop if fire balance fails? + fireb_thres : fire balance threshold (r4) + snocmbn_print : print snow combine information? + snocmbn_stop : stop if snow combine water balance fails? + snocmbn_thresh : snow combine balance threshold (r4) + energyb_print : print energy balance values? + energyb_stop : stop if energy balance fails? + energyb_thresh : energy balance threshold (r4) + waterb_print : print water balance values? + waterb_stop : stop if water balance fails? + waterb_thresh : water balance threshold (r4) + + print_avec : print avec/bvec values? + print_driver : print driver data? + print_fire : print fire emissions? + print_harvest : print harvest information? + print_pftinfo : print PFT information? + print_pooll : print live pool values? + print_soil ; print soil properties? + print_sscol : print soil/snow layer info? + print_veg : print vegetation values? + print_stop : stop after printing information? + + cornsoy_switch : Flag to annually alternate corn/soybeans + fire_switch : Flag for fire emissions + grazing_switch : Flag for grazing + green_switch : Flag to use greenness fraction + eqclear_switch : Flag to clear equilibrium variables + at start of simulation + leapyr_switch : Flag for using leap years (.F. == constant 365 days) + updatelst_switch: Flag to update carbon pools at 0 LST (rather than 0 GMT) + +============================= +Julian Days (not leap year ) + January 1 = 1 + February 1 = 32 + March 1 = 60 + April 1 = 91 + May 1 = 121 + June 1 = 152 + July 1 = 182 + August 1 = 213 + September 1 = 244 + October 1 = 274 + November 1 = 305 + December 1 = 335 +============================= diff --git a/mpi/namel_sibdrv.copy b/mpi/namel_sibdrv.copy new file mode 100644 index 0000000000000000000000000000000000000000..6cd4d53417c2232c9a31c8e8064e0d4b836fabe6 --- /dev/null +++ b/mpi/namel_sibdrv.copy @@ -0,0 +1,216 @@ + +$CONTROL_LIST_SIBDRV + nsib = 62521, + starttime = 1, + startyear = 1998, + endtime = 365, + endyear = 2010, + dtsib = 600, + restart_dtsib = -12, + qp_dtsib = 10800, + pbp_dtsib = 0, + hr_dtsib = 0, +/ + +$IO_LIST_SIBDRV + pft_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/info_pft.dat' + pool_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/info_pool.dat' + aero_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_aero.nc' + pgdd_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/phen_gdd.dat' + pstg_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/phen_stg_EurDrought.dat' + phys_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_phys_EurDrought.dat' + pool_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_pool.dat' + vs_file = '/projects/0/ctdas/sib4_input/vs/sib_vs_0.5deg.nc' + ic_file = '/projects/0/ctdas/sib4_input/requib/sib_requib2.nc' + dr_path = '/projects/0/ctdas/sib4_input/meteo/merra/merra2_0.5deg_' + tm5_path = '/projects/0/ctdas/linda/sib4_input/TM5MR/' + fr_path = '../../sib4_driver/global/gfed4/gfed4_0.5deg_' + out_path = '/scratch/shared/rdkok/NRT/' + out_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/sib_outopts_NRT' + out_rinfo= '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/sibr_outopts' +/ + +$SPINUP_LIST_SIBDRV + spinup = .false., + spinup_default = .true., + spinup_numyrs = 1, + spinup_maxiter = 10, + spinup_threshold = 0.01, + spinup_writediag = .false., + spinup_writetxtf = .false., +/ + +$SUBGRID_SIBDRV + minlon = -180, + maxlon = 180, + minlat = -90, + maxlat = 90, +/ + +$PBP_LIST_SIBDRV + npbp = 0 +/ +-lon-, -lat-, +/ + +$BALAN_LIST_SIBDRV + badtc_print = .false., + badtc_stop = .false., + bnum_allow = 10, + canb_print = .false., + canb_stop = .false., + canb_thresh = 1.E-6, + carbonb_print = .false., + carbonb_stop = .false., + carbonb_thresh = 1.E-6, + fireb_print = .false., + fireb_stop = .false., + fireb_thresh = 1.E-6, + snocmbn_print = .false., + snocmbn_stop = .false., + snocmbn_thresh = 1.E-6, + energyb_print = .false., + energyb_stop = .true., + energyb_thresh = 0.01, + waterb_print = .false., + waterb_stop = .true., + waterb_thresh = 0.5, +/ + +$PRINT_LIST_SIBDRV + print_avec = .false., + print_driver = .false., + print_fire = .false., + print_harvest = .false., + print_pftinfo = .false., + print_pooll = .false., + print_soil = .false., + print_sscol = .false., + print_veg = .false., + print_stop = .false., +/ + +$SWITCH_LIST_SIBDRV + cornsoy_switch = .false., + fire_switch = .false., + grazing_switch = .true., + green_switch = .true., + eqclear_switch = .true., + leapyr_switch = .false., + updatelst_switch = .true., + tm5mr_switch = .false., + soilogee_switch = .false., +/ + +------------------------------------------------------------------------------ + nsib : number of points in simulation + starttime : day of year to start simulation + startyear : year to start simulation + endtime : day of year to stop simulation + endyear : year to stop simulation + dtsib : prognostic time step, in seconds + dtsibrestart : greater than zero implies units of seconds - restart output interval + less than zero implies units of months - restart output interval + dtsibqp : greater than zero implies units of seconds - QP output interval + less than zero implies units of months - QP output interval + dtsibpbp : greater than zero implies units of seconds - PBP output interval + less than zero implies units of months - PBP output interval + dtsibhr : greater than zero implies units of seconds - HR output interval + less than zero implies units of months - HR output interval + + pft_info : File containing PFT information + pool_info : File containing pool information + aero_file : File containing aerodynamical parameters + pgdd_file : File containing GDD-based phenological parameters + pstg_file : File containing stage-based phenological parameters + pnvg_file : File containing non-vegetation parameters + phys_file : File containing physiological parameters + pool_file : File containing pool respiration/transfer parameters + vs_file : File containing vegetation structure + ic_file : File containing initial condition/restart values + dr_path : Directory containing driver data + fr_path : Directory containing fire emissions + out_path : Directory for model output + out_info : File containing output specification/information + out_rinfo : File containing restart specification/information + + spinup : Flag to perform a spinup simulation + ->simulation continues until either: + -- pools are within threshold equilibrium values + -- max number of iterations is met + spinup_default : Flag to use default initial conditions for spin-up run + -- all pools zero except minimal froot + -- soil moisture starts at saturation + spinup_numyrs : Number of years in spinup run to run before calculating equilibrium pools + spinup_maxiter : Number of interations in a spinup simulation + spinup_threshold: Input/output ratio threshold for 'spun-up' + spinup_writediag: Flag to follow output choices in spin-up run + (false will only save equilibrium files) + spinup_writetxtf: Flag to write equilibrium pools to a text file + + minlon : Minimum longitude for setting a subgrid + maxlon : Maximum longitude for setting a subgrid + minlat : Minimum latitude for setting a subgrid + maxlat : Maximum latitude for setting a subgrid + + npbp : Number of PBP's to be saved + --corresponding lon/lat pairs (in degrees) are listed below npbp + --value of -1 will save all points + + badtc_print : print canopy temperatures? + badtc_stop : stop for bad canopy temperatures? + bnum_allow : number of allowable balance offenses (i4) + canb_print : print canopy balance values? + canb_stop : stop if canopy balance fails? + canb_thresh : canopy balance threshold (r4) + carbonb_print : print carbon balance information? + carbonb_stop : stop if carbon balance fails? + carbonb_thres : carbon balance threshold (r4) + fireb_print : print fire balance information? + fireb_stop : stop if fire balance fails? + fireb_thres : fire balance threshold (r4) + snocmbn_print : print snow combine information? + snocmbn_stop : stop if snow combine water balance fails? + snocmbn_thresh : snow combine balance threshold (r4) + energyb_print : print energy balance values? + energyb_stop : stop if energy balance fails? + energyb_thresh : energy balance threshold (r4) + waterb_print : print water balance values? + waterb_stop : stop if water balance fails? + waterb_thresh : water balance threshold (r4) + + print_avec : print avec/bvec values? + print_driver : print driver data? + print_fire : print fire emissions? + print_harvest : print harvest information? + print_pftinfo : print PFT information? + print_pooll : print live pool values? + print_soil ; print soil properties? + print_sscol : print soil/snow layer info? + print_veg : print vegetation values? + print_stop : stop after printing information? + + cornsoy_switch : Flag to annually alternate corn/soybeans + fire_switch : Flag for fire emissions + grazing_switch : Flag for grazing + green_switch : Flag to use greenness fraction + eqclear_switch : Flag to clear equilibrium variables + at start of simulation + leapyr_switch : Flag for using leap years (.F. == constant 365 days) + updatelst_switch: Flag to update carbon pools at 0 LST (rather than 0 GMT) + +============================= +Julian Days (not leap year ) + January 1 = 1 + February 1 = 32 + March 1 = 60 + April 1 = 91 + May 1 = 121 + June 1 = 152 + July 1 = 182 + August 1 = 213 + September 1 = 244 + October 1 = 274 + November 1 = 305 + December 1 = 335 +============================= diff --git a/mpi/namel_sibdrv.template b/mpi/namel_sibdrv.template new file mode 100644 index 0000000000000000000000000000000000000000..376a7e3dcefe8d28ec4ccb1908a34d1104318f90 --- /dev/null +++ b/mpi/namel_sibdrv.template @@ -0,0 +1,216 @@ + +$CONTROL_LIST_SIBDRV + nsib = 62521, + starttime = {start_doy}, + startyear = {startyear}, + endtime = {end_doy}, + endyear = {endyear}, + dtsib = 600, + restart_dtsib = -12, + qp_dtsib = 3600, + pbp_dtsib = 0, + hr_dtsib = 0, +/ + +$IO_LIST_SIBDRV + pft_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/info_pft.dat' + pool_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/info_pool.dat' + aero_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_aero.nc' + pgdd_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/phen_gdd.dat' + pstg_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/phen_stg_EurDrought.dat' + phys_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_phys_EurDrought.dat' + pool_file = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/params/sib_pool.dat' + vs_file = '/projects/0/ctdas/sib4_input/vs/sib_vs_0.5deg.nc' + ic_file = '/projects/0/ctdas/NRT/data/SiB//restart/sib_r199601p{rank}.nc' + dr_path = '{merrapath}/merra2_0.5deg_' + tm5_path = '/projects/0/ctdas/linda/sib4_input/TM5MR/' + fr_path = '../../sib4_driver/global/gfed4/gfed4_0.5deg_' + out_path = '{outputpath}/output_sib4_NRT_sim/' + out_info = '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/sib_outopts_NRT' + out_rinfo= '/projects/0/ctdas/NRT/data/SiB/sib4v2/input/sibr_outopts' +/ + +$SPINUP_LIST_SIBDRV + spinup = .false., + spinup_default = .true., + spinup_numyrs = 1, + spinup_maxiter = 10, + spinup_threshold = 0.01, + spinup_writediag = .false., + spinup_writetxtf = .false., +/ + +$SUBGRID_SIBDRV + minlon = -15, + maxlon = 35, + minlat = 33, + maxlat = 72, +/ + +$PBP_LIST_SIBDRV + npbp = 0 +/ +-lon-, -lat-, +/ + +$BALAN_LIST_SIBDRV + badtc_print = .false., + badtc_stop = .false., + bnum_allow = 10, + canb_print = .false., + canb_stop = .false., + canb_thresh = 1.E-6, + carbonb_print = .true., + carbonb_stop = .false., + carbonb_thresh = 1.E-6, + fireb_print = .false., + fireb_stop = .false., + fireb_thresh = 1.E-6, + snocmbn_print = .false., + snocmbn_stop = .false., + snocmbn_thresh = 1.E-6, + energyb_print = .false., + energyb_stop = .true., + energyb_thresh = 0.01, + waterb_print = .false., + waterb_stop = .true., + waterb_thresh = 0.5, +/ + +$PRINT_LIST_SIBDRV + print_avec = .false., + print_driver = .false., + print_fire = .false., + print_harvest = .false., + print_pftinfo = .false., + print_pooll = .false., + print_soil = .false., + print_sscol = .false., + print_veg = .false., + print_stop = .false., +/ + +$SWITCH_LIST_SIBDRV + cornsoy_switch = .false., + fire_switch = .false., + grazing_switch = .true., + green_switch = .true., + eqclear_switch = .true., + leapyr_switch = .false., + updatelst_switch = .true., + tm5mr_switch = .false., + soilogee_switch = .false., +/ + +------------------------------------------------------------------------------ + nsib : number of points in simulation + starttime : day of year to start simulation + startyear : year to start simulation + endtime : day of year to stop simulation + endyear : year to stop simulation + dtsib : prognostic time step, in seconds + dtsibrestart : greater than zero implies units of seconds - restart output interval + less than zero implies units of months - restart output interval + dtsibqp : greater than zero implies units of seconds - QP output interval + less than zero implies units of months - QP output interval + dtsibpbp : greater than zero implies units of seconds - PBP output interval + less than zero implies units of months - PBP output interval + dtsibhr : greater than zero implies units of seconds - HR output interval + less than zero implies units of months - HR output interval + + pft_info : File containing PFT information + pool_info : File containing pool information + aero_file : File containing aerodynamical parameters + pgdd_file : File containing GDD-based phenological parameters + pstg_file : File containing stage-based phenological parameters + pnvg_file : File containing non-vegetation parameters + phys_file : File containing physiological parameters + pool_file : File containing pool respiration/transfer parameters + vs_file : File containing vegetation structure + ic_file : File containing initial condition/restart values + dr_path : Directory containing driver data + fr_path : Directory containing fire emissions + out_path : Directory for model output + out_info : File containing output specification/information + out_rinfo : File containing restart specification/information + + spinup : Flag to perform a spinup simulation + ->simulation continues until either: + -- pools are within threshold equilibrium values + -- max number of iterations is met + spinup_default : Flag to use default initial conditions for spin-up run + -- all pools zero except minimal froot + -- soil moisture starts at saturation + spinup_numyrs : Number of years in spinup run to run before calculating equilibrium pools + spinup_maxiter : Number of interations in a spinup simulation + spinup_threshold: Input/output ratio threshold for 'spun-up' + spinup_writediag: Flag to follow output choices in spin-up run + (false will only save equilibrium files) + spinup_writetxtf: Flag to write equilibrium pools to a text file + + minlon : Minimum longitude for setting a subgrid + maxlon : Maximum longitude for setting a subgrid + minlat : Minimum latitude for setting a subgrid + maxlat : Maximum latitude for setting a subgrid + + npbp : Number of PBP's to be saved + --corresponding lon/lat pairs (in degrees) are listed below npbp + --value of -1 will save all points + + badtc_print : print canopy temperatures? + badtc_stop : stop for bad canopy temperatures? + bnum_allow : number of allowable balance offenses (i4) + canb_print : print canopy balance values? + canb_stop : stop if canopy balance fails? + canb_thresh : canopy balance threshold (r4) + carbonb_print : print carbon balance information? + carbonb_stop : stop if carbon balance fails? + carbonb_thres : carbon balance threshold (r4) + fireb_print : print fire balance information? + fireb_stop : stop if fire balance fails? + fireb_thres : fire balance threshold (r4) + snocmbn_print : print snow combine information? + snocmbn_stop : stop if snow combine water balance fails? + snocmbn_thresh : snow combine balance threshold (r4) + energyb_print : print energy balance values? + energyb_stop : stop if energy balance fails? + energyb_thresh : energy balance threshold (r4) + waterb_print : print water balance values? + waterb_stop : stop if water balance fails? + waterb_thresh : water balance threshold (r4) + + print_avec : print avec/bvec values? + print_driver : print driver data? + print_fire : print fire emissions? + print_harvest : print harvest information? + print_pftinfo : print PFT information? + print_pooll : print live pool values? + print_soil ; print soil properties? + print_sscol : print soil/snow layer info? + print_veg : print vegetation values? + print_stop : stop after printing information? + + cornsoy_switch : Flag to annually alternate corn/soybeans + fire_switch : Flag for fire emissions + grazing_switch : Flag for grazing + green_switch : Flag to use greenness fraction + eqclear_switch : Flag to clear equilibrium variables + at start of simulation + leapyr_switch : Flag for using leap years (.F. == constant 365 days) + updatelst_switch: Flag to update carbon pools at 0 LST (rather than 0 GMT) + +============================= +Julian Days (not leap year ) + January 1 = 1 + February 1 = 32 + March 1 = 60 + April 1 = 91 + May 1 = 121 + June 1 = 152 + July 1 = 182 + August 1 = 213 + September 1 = 244 + October 1 = 274 + November 1 = 305 + December 1 = 335 +============================= diff --git a/mpi/namel_sibdrv_v1 b/mpi/namel_sibdrv_v1 new file mode 100644 index 0000000000000000000000000000000000000000..1986f65abfc8971efd784cef54a0857d811ad979 --- /dev/null +++ b/mpi/namel_sibdrv_v1 @@ -0,0 +1,208 @@ + +$CONTROL_LIST_SIBDRV + nsib = 62521, + starttime = 1, + startyear = 1998, + endtime = 365, + endyear = 2010, + dtsib = 600, + dtsibrestart = -12, + dtsibqp = -1, + dtsibpbp = 0, + dtsibhr = 0, +/ + +$IO_LIST_SIBDRV +pft_info = '/home/kooij032/models/sib4_KH/input/params/info_pft.dat' +pool_info = '/home/kooij032/models/sib4_KH/input/params/info_pool.dat' +aero_file = '/home/kooij032/models/sib4_KH/input/params/sib_aero.nc' +pgdd_file = '/home/kooij032/models/sib4_KH/input/params/phen_gdd.dat' +pstg_file = '/home/kooij032/models/sib4_KH/input/params/phen_stg.dat' +phys_file = '/home/kooij032/models/sib4_KH/input/params/sib_phys.dat' +pool_file = '/home/kooij032/models/sib4_KH/input/params/sib_pool.dat' + vs_file = '/projects/0/ctdas/sib4_input/vs/sib_vs_0.5deg.nc' + ic_file = '/projects/0/ctdas/sib4_input/requib/sib_requib2.nc' + dr_path = '/projects/0/ctdas/sib4_input/meteo/merra/merra2_0.5deg_' + drvr_type = 'merra' + out_path = '/scratch/shared/kooij032/' + out_info = '/home/kooij032/models/sib4_KH/input/sib_outopts' + out_rinfo= '/home/kooij032/models/sib4_KH/input/sibr_outopts' +/ + +$SPINUP_LIST_SIBDRV + spinup = .false., + spinup_default = .true., + spinup_output = .false., + spinup_numyrs = 1, + spinup_maxiter = 5, + spinup_threshold = 0.05, +/ + +$SUBGRID_SIBDRV + minlon = -180, + maxlon = 180, + minlat = -90, + maxlat = 90, +/ + +$PBP_LIST_SIBDRV + npbp = 0 +/ +-lon-, -lat-, +/ + +$BALAN_LIST_SIBDRV + badtc_print = .true., + badtc_stop = .false., + bnum_allow = 10, + canb_print = .false., + canb_stop = .false., + canb_thresh = 1.E-6, + snocmbn_print = .false., + snocmbn_stop = .false., + snocmbn_thresh = 1.E-6 + energyb_print = .false., + energyb_stop = .true., + energyb_thresh = 0.01, + waterb_print = .false., + waterb_stop = .true., + waterb_thresh = 0.50, +/ + +$EQPOOL_LIST_SIBDRV + eqjump_limit = .false., + eqjump_thresh = 0.5, + eq_printf = .false., + eq_pfmol = .false., + eq_prints = 10, + eq_psmol = .false., +/ + +$PRINT_LIST_SIBDRV + print_avec = .false., + print_driver = .false., + print_harvest = .false., + print_pftinfo = .false., + print_pooll = .false., + print_soil = .false., + print_sscol = .false., + print_veg = .false., + print_stop = .true., +/ + +$SWITCH_LIST_SIBDRV + cornsoy_switch = .F., + grazing_switch = .T., + green_switch = .T., + equibclear_switch = .T., + leapyear_switch = .F., + updatelst_switch = .T., +/ + +------------------------------------------------------------------------------ + nsib : number of points in simulation + starttime : day of year to start simulation + startyear : year to start simulation + endtime : day of year to stop simulation + endyear : year to stop simulation + dtsib : prognostic time step, in seconds + dtsibrestart : greater than zero implies units of seconds - restart output interval + less than zero implies units of months - restart output interval + dtsibqp : greater than zero implies units of seconds - QP output interval + less than zero implies units of months - QP output interval + dtsibpbp : greater than zero implies units of seconds - PBP output interval + less than zero implies units of months - PBP output interval + dtsibhr : greater than zero implies units of seconds - HR output interval + less than zero implies units of months - HR output interval + + pft_info : File containing PFT information + pool_info : File containing pool information + aero_file : File containing aerodynamical parameters + phys_file : File containing physiological parameters + phen_file : File containing phenological parameters + pool_file : File containing pool transfer parameters + vs_file : File containing vegetation structure + ic_file : File containing initial condition/restart values + dr_path : Directory containing driver data + drvr_type : Driver data type, choosen from: + -> ncep, nceps, + merra, merras, tower, towerhr, towerlba + out_path : Directory for model output + out_info : File containing output specification/information + out_rinfo: File containing restart specification/information + + spinup : Flag to perform a spinup simulation + ->simulation continues until either: + -- pools are within threshold equilibrium values + -- max number of iterations is met + spinup_default : Flag to use default initial conditions for spin-up run + -- all pools zero except minimal froot + -- soil moisture starts at saturation + spinup_output : Flag to follow output choices in spin-up run + (false will only save equilibrium files) + spinup_numyrs : Number of years in spinup run to run before calculating equilibrium pools + spinup_maxiter : Number of interations in a spinup simulation + spinup_threshold: Threshold of the input/output ratio for pools to be considered 'spun-up' + + minlon : Minimum longitude for setting a subgrid + maxlon : Maximum longitude for setting a subgrid + minlat : Minimum latitude for setting a subgrid + maxlat : Maximum latitude for setting a subgrid + + npbp : Number of PBP's to be saved + --corresponding lon/lat pairs (in degrees) are listed below npbp + --value of -1 will save all points + + badtc_print : print canopy temperatures? + badtc_stop : stop for bad canopy temperatures? + bnum_allow : number of allowable balance offenses (i4) + canb_print : print canopy balance values? + canb_stop : stop if canopy balance fails? + canb_thresh : canopy balance threshold (r4) + energyb_print : print energy balance values? + energyb_stop : stop if energy balance fails? + energyb_thresh : energy balance threshold (r4) + waterb_print : print water balance values? + waterb_stop : stop if water balance fails? + waterb_thresh : water balance threshold (r4) + + eqjump_limit : limit jump of equilibrium values? + eqjump_thresh : jump fraction of eq pool values (r4) + eq_printf : print equilibrium pools to a file? + eq_pfmol : print file eq pools in moles C? (vs Mg C) + eq_prints : number of eq pools to print to screen (i4) + eq_psmol : print screen eq pools in moles C? (vs Mg C) + + print_avec : print avec/bvec values? + print_driver : print driver data? + print_harvest : print harvest information? + print_pftinfo : print PFT information? + print_pooll : print live pool values? + print_soil ; print soil properties? + print_sscol : print soil/snow layer info? + print_veg : print vegetation values? + print_stop : stop after printing info? + + cornsoy_switch : Flag to annually alternate corn/soybeans + grazing_switch : Flag for grazing + green_switch : Flag to use greenness fraction + equibclear_switch : Flag to clear equilibrium calculation variables + at start of simulation + leapyear_switch : Flag for using leap years (.F. == constant 365 days) + updatelst_switch : Flag to update carbon pools at 0 LST (rather than 0 GMT) + +============================= +Julian Days (not leap year ) + January 1 = 1 + February 1 = 32 + March 1 = 60 + April 1 = 91 + May 1 = 121 + June 1 = 152 + July 1 = 182 + August 1 = 213 + September 1 = 244 + October 1 = 274 + November 1 = 305 + December 1 = 335 +============================= diff --git a/mpi/script_cp_to_JET_ex_144 b/mpi/script_cp_to_JET_ex_144 new file mode 100755 index 0000000000000000000000000000000000000000..1e22932d6f53155bfd2bcff7ca89b9ba0e370141 --- /dev/null +++ b/mpi/script_cp_to_JET_ex_144 @@ -0,0 +1,3 @@ +cd /home/schaefer/JET_ex/ +cp /lfs0/projects/co2/ivar/MPI_run/ECMWF_1x1_ivar/script_qsub.csh_144 sibcasa_qsub.csh +cp /lfs0/projects/co2/ivar/MPI_run/ECMWF_1x1_ivar/sibcasa_script_144 sibcasa_script diff --git a/mpi/sib4_mpi_wrapper b/mpi/sib4_mpi_wrapper new file mode 100755 index 0000000000000000000000000000000000000000..d895f785c8caeca88046224ce2b0c3916fde0b1e Binary files /dev/null and b/mpi/sib4_mpi_wrapper differ diff --git a/mpi/sib4_script b/mpi/sib4_script new file mode 100755 index 0000000000000000000000000000000000000000..77e32f76108bb76fa91cba14ed8275c0fe11c7e1 --- /dev/null +++ b/mpi/sib4_script @@ -0,0 +1,17 @@ +#!/bin/csh -f + +if ( ${#argv} != 1 ) then + echo "[sib_script] Was expecting 1 argument, got ${#argv} instead." + exit -1 +endif +set rank = ${1} +@ rank=$rank + 1 +set now = `date` +echo "[sib_script] rank ${rank} starting at ${now}" + +cd /scratch/shared/awoude/ex_dir_sib4_NRT_sim/case_${rank} +cp /projects/0/ctdas/NRT/data/SiB//sib4v2/code/SiB4D . +cp /projects/0/ctdas/NRT/data/SiB//mpi/namel_${rank} namel_sibdrv + +./SiB4D namel_sibdrv ${rank} 288 >df_${rank} + diff --git a/mpi/sib4_script.template b/mpi/sib4_script.template new file mode 100755 index 0000000000000000000000000000000000000000..1094adb3c5295ef5b4738037accaaadd7644ca59 --- /dev/null +++ b/mpi/sib4_script.template @@ -0,0 +1,17 @@ +#!/bin/csh -f + +if ( ${{#argv}} != 1 ) then + echo "[sib_script] Was expecting 1 argument, got ${{#argv}} instead." + exit -1 +endif +set rank = ${{1}} +@ rank=$rank + 1 +set now = `date` +echo "[sib_script] rank ${{rank}} starting at ${{now}}" + +cd {outdir}/case_${{rank}} +cp {sibdir}/sib4v2/code/SiB4D . +cp {sibdir}/mpi/namel_${{rank}} namel_sibdrv + +./SiB4D namel_sibdrv ${{rank}} 288 >df_${{rank}} + diff --git a/mpi/sibcasa_mpi_wrapper.c b/mpi/sibcasa_mpi_wrapper.c new file mode 100644 index 0000000000000000000000000000000000000000..da66e1b0520e3a2374e5ec8459d635034f60b46b --- /dev/null +++ b/mpi/sibcasa_mpi_wrapper.c @@ -0,0 +1,56 @@ +#include <stdio.h> +#include <errno.h> +#include <mpi.h> + +#define CMDLENGTH 200 + +int safe_system (const char *command); + +int main(int argc, char *argv[]) { + + int ierr; + int myrank; + char cmd[CMDLENGTH]; + + ierr = MPI_Init(&argc, &argv); + if (argc != 2) { + fprintf(stderr, "[sibcasa_mpi_wrapper] Expecting 1 argument, got %d.\n",argc); + exit(-1); + } + MPI_Comm_rank(MPI_COMM_WORLD, &myrank); + snprintf(cmd,CMDLENGTH,"%s %d",argv[1],myrank); + printf( "MPI rank %d about to execute command \"%s\".\n",myrank,cmd ); + safe_system(cmd); + ierr = MPI_Finalize( ); + exit(ierr); +} + + + + + +int safe_system (const char *command) { + int pid, status; + + if (command == 0) + return 1; + pid = fork(); + if (pid == -1) // fork failed + return -1; + if (pid == 0) { // then this is the child + char *argv[4]; + argv[0] = "sh"; + argv[1] = "-c"; + argv[2] = (char*)command; + argv[3] = 0; + execv("/bin/sh", argv); + _exit(127); + } + do { + if (waitpid(pid, &status, 0) == -1) { + if (errno != EINTR) + return -1; + } else + return status; + } while(1); +} diff --git a/mpi/sibcasa_mpi_wrapper.o b/mpi/sibcasa_mpi_wrapper.o new file mode 100644 index 0000000000000000000000000000000000000000..7cb88650ad387b2385c63fa7f8be301270e93837 Binary files /dev/null and b/mpi/sibcasa_mpi_wrapper.o differ diff --git a/mpi/sibcasa_script_144 b/mpi/sibcasa_script_144 new file mode 100755 index 0000000000000000000000000000000000000000..62557bf1b5d4ec6dd012d34ad2e9ce86d25e02fd --- /dev/null +++ b/mpi/sibcasa_script_144 @@ -0,0 +1,15 @@ +#!/bin/csh -f + +if ( ${#argv} != 1 ) then + echo "[sibcasa_script] Was expecting 1 argument, got ${#argv} instead." + exit -1 +endif +set rank = ${1} +set now = `date` +echo "[sibcasa_script] rank ${rank} starting at ${now}" + +cd /scratch/shared/erikvs/SiBCASA/mpi_scripts/ex_dir/case_${rank} +cp /home/erikvs/Modeling/SiBCASA/SiBD3 . +cp /scratch/shared/erikvs/SiBCASA/mpi_scripts/namel_${rank} namel_sibdrv +#module switch intel pgi +./SiBD3>df_${rank} diff --git a/mpi/submit_sib4 b/mpi/submit_sib4 new file mode 100755 index 0000000000000000000000000000000000000000..44d25ce4f4cc18415578036c0d489c2598db3af0 --- /dev/null +++ b/mpi/submit_sib4 @@ -0,0 +1,12 @@ +#!/bin/bash +# +#SBATCH --nodes=12 +#SBATCH --ntasks-per-node=24 +#SBATCH --time=01:00:00 +#SBATCH -p short + +export I_MPI_USE_DYNAMIC_CONNECTIONS=0 + +srun -n 288 /projects/0/ctdas/NRT/data/SiB/mpi/sib4_mpi_wrapper /projects/0/ctdas/NRT/data/SiB/mpi/sib4_script +#srun -n 100 /home/erikvs/Modeling/mpi_sib4/sib4_mpi_wrapper /home/p274780/Modeling/mpi_sib4/sib4_script + diff --git a/preprocess/Makefile b/preprocess/Makefile new file mode 100644 index 0000000000000000000000000000000000000000..8d7777918145ab43f9a28bb00ca25c64bfacbc7d --- /dev/null +++ b/preprocess/Makefile @@ -0,0 +1,153 @@ +# Makefile for SiB4 MERRA Processing Tools +# +# You will need GNU's version of Make, +# which is the default on Linux, OS X +# but not necessarily other Unixes. +# +# Prior to changing options, +# make sure to remove all object files +# user@host: make clean +# +# Values for COMPILER: gcc +ifndef COMPILER + COMPILER = gcc +endif +# Currently only uses gfortran. +# +# Values for OPT: debug, opt* +ifndef OPT + OPT = opt +endif +# Optimized is the default, +# but to change to debug, specify: +# user@host:make OPT=debug +# +#Values for NC: nc3, nc4 +ifndef NC + NC = 4 +endif +# netcdf 4 is the default, +# but to change to netcdf 3, specify: +# user@host:make NC=3 +# +# You can tell the Makefile where to find NetCDF libraries +# by setting the NETCDF_ROOT environment variables as well: +# user@host:~$ export NETCDF_ROOT=/usr/local +#-------------------------------------------------------------- +# Directory containing netcdf's include/ and lib/ directories. +ifndef NETCDF_ROOT + ifeq ($(NC),3) + NCROOT = /usr/local/netcdf3-$(COMPILER) + LIBS = -L$(NCROOT)/lib -lnetcdf + else + NCROOT = /projects/0/ctdas/NRT/data/SiB/privatemodules/nc4 + H5ROOT = /projects/0/ctdas/NRT/data/SiB/privatemodules/nc4 + LIBS = -L$(NCROOT)/lib -L$(H5ROOT)/lib -lhdf5_hl -lhdf5 -lnetcdff -lnetcdf + endif + + DIREXIST = $(shell if test -d $(NCROOT); then echo yes; else echo no; fi) + ifeq ($(DIREXIST),no) + NCROOT = /projects/0/ctdas/NRT/data/SiB/privatemodules/nc4 + H5ROOT = /projects/0/ctdas/NRT/data/SiB/privatemodules/nc4 + endif + +else + NCROOT = $(NETCDF_ROOT) +endif +INCLUDES = -I$(NCROOT)/include + +##To check NCROOT and INCLUDES: +#$(info $$NCROOT is [${NCROOT}]) +#$(info $$INCLUDES is [${INCLUDES}]) + +ifeq ($(COMPILER),gcc) + F90 = gfortran +# F90 = ifort + ifeq ($(OPT),opt) + F90FLAGS = -O2 + else + F90FLAGS = -g -Wall -Wuninitialized -fbounds-check \ + -ffpe-trap=invalid,zero,overflow -fbacktrace -finit-real=nan + endif + + ifeq ($(PROC),powerpc) + F90FLAGS += -fconvert=little-endian + endif + + F90FLAGS += -fimplicit-none -Wsurprising $(INCLUDES) + LFLAGS = $(LIBS) +endif +##To check F90FLAGS: +#$(info $$F90FLAGS is [${F90FLAGS}]) + +#-------------------------------------------------------- + +PROC_OBJS = \ + gpcp_tdown.o \ + gpcp_tup.o + +DRV_OBJS = \ + gpcp_regrid.o \ + merra_pullsib_auto.o \ + merra_pullvar_auto.o \ + scale_merra_gpcp_auto.o + +#-------------------------------------------------------- +%.o: %.f90 + $(F90) $(F90FLAGS) -c $< -o $@ + +all: $(PROC_OBJS) $(DRV_OBJS) + @echo "" + $(F90) gpcp_regrid.o gpcp_tdown.o gpcp_tup.o -o gpcp_regrid $(LFLAGS) + @echo Finished making == gpcp_regrid + @echo "" + $(F90) merra_pullsib_auto.o -o merra_pullsib_auto $(LFLAGS) + @echo Finished making == merra_pullsib_auto + @echo "" + $(F90) merra_pullvar_auto.o -o merra_pullvar_auto $(LFLAGS) + @echo Finished making == merra_pullvar_auto + @echo "" + $(F90) scale_merra_gpcp_auto.o -o scale_merra_auto $(LFLAGS) + @echo Finished making == scale_merra_auto + @echo "" + +gpcp_regrid: gpcp_regrid.o gpcp_tdown.o gpcp_tup.o + $(F90) $^ -o gpcp_regrid $(LFLAGS) + @echo "" + @date + @echo Finished making == gpcp_regrid + @echo "" + +merra_pullvar_auto: merra_pullvar_auto.o + $(F90) $^ -o merra_pullvar_auto $(LFLAGS) + @echo "" + @date + @echo Finished making == merra_pullvar_auto + @echo "" + +merra_pullsib_auto: merra_pullsib_auto.o + $(F90) $^ -o merra_pullsib_auto $(LFLAGS) + @echo "" + @date + @echo Finished making == merra_pullsib_auto + @echo "" + +scale_merra_auto: scale_merra_gpcp_auto.o + $(F90) $^ -o scale_merra_auto $(LFLAGS) + @echo "" + @date + @echo Finished making == scale_merra_auto + @echo "" + +scale_merra_gpcp_auto: scale_merra_gpcp_auto.o + $(F90) $^ -o scale_merra_gpcp_auto $(LFLAGS) + @echo "" + @date + @echo Finished making == scale_merra_gpcp_auto + @echo "" + +clean: + rm -f *.mod *~ *.o + +cleane: + rm -f gpcp_regrid merra_pullsib merra_pullvar_auto scale_merra diff --git a/preprocess/README_merra b/preprocess/README_merra new file mode 100644 index 0000000000000000000000000000000000000000..b61f3a373ca622f0b8dfd6f3ae7eb976f8760968 --- /dev/null +++ b/preprocess/README_merra @@ -0,0 +1,71 @@ +********************************************************************** +*******************STEPS TO PROCESS MERRA2 DATA*********************** + +--2/3-degree longitude by 1/2-degree latitude +--hourly resolution +--https://gmao.gsfc.nasa.gov/reanalysis/MERRA-2/ +--Gelero, R., McCarty, W., Suarez, M.J., Todling, R., Molod, A., + Takacs, L., ..., Zhao, B. (2017). The Modern-Era Restrospective + Analysis for Research and Applications, Version 2 (MERRA-2). + J. Climate, 30, 5419-5454, https://doi:10.1175/JCLI-D-16-0758.1. + +1) Download the data + --Use the script "getmerra" + --Edit script "getmerra" to specify: + > Output directory + > Year to download + > Month(s) to download + --Run "getmerra" + +2) Pull out the variables required + --Use the fortran program merra_pullvar.f90 + --Edit the program to specify: + > Starting and stopping years and months + > Directory of original MERRA data + > Directory and prefix for files of selected MERRA data + --Compile (make merra_pullvar) + --Run merra_pullvar executable + +3) Scale the MERRA-2 precipitation to GPCP + --Prepare the GPCP data + > Needs to be same spatial resolution as MERRA + and monthly total precipitation. + > To convert from 2.5-degrees and + to calculate monthly totals from average daily rates, + use the fortran program gpcp_regrid.f90. + + --Use the fortran program scale_merra_gpcp.f90 + --Edit the program to specify: + > Starting and stopping years + > Starting and stopping months + > GPCP Precipitation File (Version 2.3) + ---Assumes GPCP data are in global, gridded files + (same spatial resolution; month total precip (mm)) + > Directory and prefix for the MERRA files + --Compile (make scale_merra) + --Run scale_merra executable + +4) Pull out the SiB points + --Use the fortran program merra_pullsib.f90 + --Edit the program to specify: + > Starting and stopping years + > Starting and stopping months + > Directory and prefix for the global MERRA files + (gridded at 2/3-degree by 1/2-degree) + > Directory and prefix for the SiB4 MERRA files + (vector of nsib points at 1/2-degree by 1/2-degree) + > Filename specifying the SiB4 gridpoints + --Compile (make merra_pullsib) + --Run merra_pullsib executable + +5) Check the results + --Use sib4plot + --Press the Driver Data button and either select a + single file or specify a time range. + --Once the file opens, select which variable to plot + + +********************************************************************* +Questions? Contact Kathy Haynes, kdhaynes@atmos.colostate.edu +Last Modified: January, 2018 +********************************************************************* diff --git a/preprocess/archiv/SiB4_PreProcessing_CarbonTracker.ipynb b/preprocess/archiv/SiB4_PreProcessing_CarbonTracker.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..3b3a5be47a112d1fdd6ff0582bfc140d77524948 --- /dev/null +++ b/preprocess/archiv/SiB4_PreProcessing_CarbonTracker.ipynb @@ -0,0 +1,205 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Load libraries\n", + "#import numpy as np\n", + "#import pandas as pd\n", + "#import matplotlib.pyplot as plt\n", + "#import seaborn as sns\n", + "\n", + "import netCDF4 as nc\n", + "import sys\n", + "import glob\n", + "import os\n", + "\n", + "#import warnings\n", + "\n", + "#sns.set_style('white')\n", + "#%matplotlib inline\n", + "\n", + "outputdir = '/Users/lindakooijmans/Mounts/Scratch/SiB4v2_Biosphere_Fluxes/'\n", + "\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "sys.path.append('/Users/lindakooijmans/Documents/Python/Funcs/')\n", + "import sib4maptools as sibtools" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Check if files exist\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "for yy in range(2010, 2020):\n", + " for mm in range(1, 13):\n", + " print(str(yy)+\"{:02}\".format(mm))\n", + " filedir = '/Users/lindakooijmans/Mounts/Scratch/SiB4v2_Biosphere_Fluxes_GCP_v206/SiB4v2_BioFluxes_'+str(yy)+\"{:02}\".format(mm)+'.nc'\n", + " if os.path.isfile(filedir):\n", + " print(filedir)\n", + " #files = glob.glob(filedir)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Convert lat-lon to 2d map and save as nc file" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "\n", + "for yy in range(2010, 2020): \n", + " for mm in range(1, 13):\n", + " \n", + " ########################\n", + " ###### Load Data #######\n", + " ########################\n", + " \n", + " filedir = '/Users/lindakooijmans/Mounts/Scratch/output_merged/qsib_'+str(yy)+'{:02}'.format(mm)+'.g.qp2.nc'\n", + " \n", + " files = glob.glob(filedir)\n", + " \n", + " with nc.Dataset(files[0]) as d:\n", + " time_orig = d['time'][:]\n", + " lonsib_orig = d['lonsib'][:]\n", + " latsib_orig = d['latsib'][:]\n", + "\n", + " gpp_orig = d['gpp'][:,:]\n", + " nee_orig = d['nee'][:,:]\n", + " reco_orig = d['reco'][:,:]\n", + "\n", + " print(filedir+\" loaded\")\n", + " \n", + " ##############################\n", + " ###### Create new file #######\n", + " ##############################\n", + " \n", + " newfiledir = outputdir+'SiB4v2_BioFluxes_'+str(yy)+'{:02}'.format(mm)+'.nc'\n", + "\n", + " x = nc.Dataset(newfiledir,'w',format='NETCDF4')\n", + "\n", + " # -- Create dimension\n", + "\n", + " x.createDimension('latitude', 360)\n", + " x.createDimension('longitude', 720)\n", + " x.createDimension('time', len(time_orig))\n", + "\n", + " # -- Create variables: Dataset.createVariable(<var_id>, <type>, <dimensions>)\n", + " latsib = x.createVariable('latitude','f',('latitude'))\n", + " lonsib = x.createVariable('longitude','f',('longitude'))\n", + " time = x.createVariable('time','f',('time'))\n", + " gpp = x.createVariable('gpp','f',('time','latitude', 'longitude'))\n", + " reco = x.createVariable('reco','f',('time','latitude', 'longitude'))\n", + " nee = x.createVariable('nee','f',('time','latitude', 'longitude'))\n", + "\n", + " # -- Write array to file\n", + " latsib[:] = np.arange(-89.75, 90.25, 0.5)\n", + " lonsib[:] = np.arange(-179.75, 180.25, 0.5)\n", + " time[:] = time_orig[:]\n", + " gpp[:,:,:] = sibtools.convert_2d(gpp_orig, latsib_orig, lonsib_orig)\n", + " reco[:,:,:] = sibtools.convert_2d(reco_orig, latsib_orig, lonsib_orig)\n", + " nee[:,:,:] = sibtools.convert_2d(nee_orig, latsib_orig, lonsib_orig)\n", + "\n", + " # -- Set attributes of variables\n", + " latsib.setncattr('long_name','Latitude')\n", + " lonsib.setncattr('long_name','Longitude')\n", + " time.setncattr('unit','3-hourly time step')\n", + " time.setncattr('long_name','time')\n", + " gpp.setncattr('unit','micromol m-2 s-1')\n", + " gpp.setncattr('long_name','Gross Primary Productivity')\n", + " gpp.setncattr('comment','Positive values are a flux from the atmosphere to the biosphere')\n", + " nee.setncattr('unit','micromol m-2 s-1')\n", + " nee.setncattr('long_name','Net Ecosystem Exchange')\n", + " nee.setncattr('comment','Positive values are a flux from the biosphere to the atmosphere')\n", + " reco.setncattr('unit','micromol m-2 s-1')\n", + " reco.setncattr('long_name','Total Ecosystem Respiration')\n", + " reco.setncattr('comment','Positive values are a flux from the biosphere to the atmosphere')\n", + "\n", + " # -- Set metadata\n", + " # x.setncattr('creation_date',datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S'))\n", + " x.setncattr('release_note','File created by Linda Kooijmans (Wageningen University)')\n", + " x.setncattr('created','September, 2020')\n", + "\n", + " # -- Close file\n", + " x.close()\n", + "\n", + " print(newfiledir+\" created\")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.6.8" + }, + "varInspector": { + "cols": { + "lenName": 16, + "lenType": 16, + "lenVar": 40 + }, + "kernels_config": { + "python": { + "delete_cmd_postfix": "", + "delete_cmd_prefix": "del ", + "library": "var_list.py", + "varRefreshCmd": "print(var_dic_list())" + }, + "r": { + "delete_cmd_postfix": ") ", + "delete_cmd_prefix": "rm(", + "library": "var_list.r", + "varRefreshCmd": "cat(var_dic_list()) " + } + }, + "types_to_exclude": [ + "module", + "function", + "builtin_function_or_method", + "instance", + "_Feature" + ], + "window_display": false + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/preprocess/archiv/getmerra b/preprocess/archiv/getmerra new file mode 100755 index 0000000000000000000000000000000000000000..50cbae9c3db1a476b5bb86880a02ecffbef445e6 --- /dev/null +++ b/preprocess/archiv/getmerra @@ -0,0 +1,24 @@ +#!/bin/bash + +##User Information +MDIR=/scratch/shared/nsmith/merra_orig/ +YR=2019 +MON=("08") +## + +cd $MDIR + +for i in ${MON[*]}; do + mkdir ./$YR${i} + cd ./$YR${i} + echo $i +# wget -r -A.nc4 --cut-dirs=5 --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies http://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2/M2T1NXFLX.5.12.4/$YR/${i} + +# wget -r -A.nc4 --cut-dirs=5 --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies http://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2/M2T1NXSLV.5.12.4/$YR/${i} + +# wget -r -A.nc4 --cut-dirs=5 --load-cookies ~/.urs-cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies http://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2/M2T1NXRAD.5.12.4/$YR/${i} + wget -r -A.nc4 --auth-no-challenge=on http://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2/M2T1NXRAD.5.12.4/$YR/$i/ + rm *.gif *.txt *.nc4.xml + cd .. +done + diff --git a/preprocess/archiv/getmerra_auto b/preprocess/archiv/getmerra_auto new file mode 100755 index 0000000000000000000000000000000000000000..6167ffda2d6a4a63c18aeaac46463dec159b6e3a --- /dev/null +++ b/preprocess/archiv/getmerra_auto @@ -0,0 +1,27 @@ +#!/bin/bash + +##User Information +MDIR=$4 +YR=$1 +MON=($2 $3) +## + +echo $MDIR +echo $YR +echo $MON +cd $MDIR + +for i in ${MON[@]}; do + mkdir ./$YR${i} + cd ./$YR${i} + echo 'Current month: '$i + #wget -r -A.nc4 --cut-dirs=5 --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies http://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2/M2T1NXFLX.5.12.4/$YR/${i} + + #wget -r -A.nc4 --cut-dirs=5 --load-cookies ~/.urs_cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies http://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2/M2T1NXSLV.5.12.4/$YR/${i} + + wget -r -A.nc4 --cut-dirs=5 --load-cookies ~/.urs-cookies --save-cookies ~/.urs_cookies --auth-no-challenge=on --keep-session-cookies http://goldsmr4.gesdisc.eosdis.nasa.gov/data/MERRA2/M2T1NXRAD.5.12.4/$YR/${i}/ + + rm *.gif *.txt *.nc4.xml + cd .. +done + diff --git a/preprocess/archiv/io_namel.py b/preprocess/archiv/io_namel.py new file mode 100755 index 0000000000000000000000000000000000000000..2cd1d79032f403cedd967e4a7a8eb324a69bcebb --- /dev/null +++ b/preprocess/archiv/io_namel.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python +# namel_io.py + +""" +Author : Erik +Original Author: Ivar +Revision History: +File created on 06 Oct 2010. +Recoded to support SiB4 - Erik +""" +import shutil +from numpy import * + +import os +import glob + +num_outputdirs = 288 +path_output = '/scratch/shared/awoude/' +sibdir = '/projects/0/ctdas/NRT/data/SiB/' +path_exec = sibdir + 'mpi/' +sim_name = 'sib4_NRT' + +startyear = 2018 +endyear = 2018 + +spin = False +n_spin = 10 + +minlon = -15 +maxlon = 35 +minlat = 33 +maxlat = 72 + +dtsibout = -1 + +if spin == True: + outputname = 'output_'+sim_name+'_spin_1850' + execname = 'ex_dir_'+sim_name+'_spin_1850' +else: + outputname = 'output_'+sim_name+'_sim' + execname = 'ex_dir_'+sim_name+'_sim' + #spinoutput = 'output_'+sim_name+'_spin_1850' + +targdir = os.path.join(path_output, outputname) +# Create output folder +if not os.path.exists(targdir): + os.makedirs(targdir) + + +targdir = os.path.join(path_output ,execname) +# Create folders to store executables +if not os.path.exists(targdir): + os.makedirs(targdir) + for i in range(num_outputdirs): + targdir2= os.path.join(targdir,'case_%s'%(i+1)) + if not os.path.exists(targdir2): + os.makedirs(targdir2) + +path = path_exec + +oldline = [''] * 12 +newline = [''] * 12 + +orig_namelist = path_exec + 'namel_sibdrv' + +# Create namelists for each thread +for j in range(12): + for i in range(1, num_outputdirs+1): + if j==0: + shutil.copyfile(orig_namelist, '%s/namel_%s'%(path,i)) + file = os.path.join(path,'namel_%s'%i) + + oldline[1] =" out_path = '/scratch/shared/nsmith/NRT/" + newline[1] =" out_path = %s/%s/"%(path_output, outputname) + + if spin == False: + oldline[2] =" ic_file = '/projects/0/ctdas/NRT/data/SiB//restart/sib_r199601p025.nc'" + newline[2] =" ic_file = '%s/restart/sib_r199601p%s.nc'" %(sibdir, str(i).zfill(3)) + #newline[2] =" ic_file = '/scratch/shared/nsmith/NRT/%s/sib_requibp%ss%s.nc" %(spinoutput,str(i).zfill(3),str(n_spin).zfill(2)) + + oldline[3] =" startyear = 1998," + newline[3] =" startyear = %s,"%(str(startyear)) + oldline[4] =" endyear = 2010," + newline[4] =" endyear = %s,"%(str(endyear)) + oldline[5] =" spinup = .false.," + newline[5] =" spinup = .%s.,"%(str(spin).lower()) + oldline[6] =" spinup_maxiter = 5," + newline[6] =" spinup_maxiter = %s,"%(str(n_spin)) + oldline[7] =" minlon = -180," + newline[7] =" minlon = %s,"%(str(minlon)) + oldline[8] =" maxlon = 180," + newline[8] =" maxlon = %s,"%(str(maxlon)) + oldline[9] =" minlat = -90," + newline[9] =" minlat = %s,"%(str(minlat)) + oldline[10] =" maxlat = 90," + newline[10] =" maxlat = %s,"%(str(maxlat)) + oldline[11] =" dtsibqp = -1," + newline[11] =" dtsibqp = %s,"%(str(dtsibout)) + + # Read - write namelists + f = open(file, "r") + text = f.read() + f.close() + f = open(file, "w") + f.write(text.replace(oldline[j], newline[j])) + f.close() + +sib4_script_path = path_exec + '/sib4_script' + +oldline = 'cd /scratch/shared/kooij032/NRT/ex_dir_global/case_${rank}' +newline = 'cd ' + path_output + execname + '/case_${rank}' + +# Change sib4_script +f = open(sib4_script_path+'.template' , "r") +text = f.read() +f.close() +f = open(sib4_script_path, "w") +f.write(text.replace(oldline, newline)) +f.close() + +# Change sib4 permissions for mpi ---gives permission error for me (RdK) +#os.chmod(sib4_script_path, 0o777) + +print("All went well, the modifications are done") + +if __name__ == "__main__": + pass diff --git a/preprocess/archiv/io_namel_nrt.py b/preprocess/archiv/io_namel_nrt.py new file mode 100755 index 0000000000000000000000000000000000000000..8ea8211e701d7a164821b0fd9e7aa969ecdca788 --- /dev/null +++ b/preprocess/archiv/io_namel_nrt.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python +# namel_io.py + +""" +Author : Erik +Original Author: Ivar +Revision History: +File created on 06 Oct 2010. +Recoded to support SiB4 - Erik +""" +import shutil +from numpy import * + +import os +import glob + +num_outputdirs = 288 +path_output = '{outputdir}' +sibdir = '{sibdir}' +path_exec = sibdir + 'mpi/' +sim_name = 'sib4_NRT' + +startyear = {startyear} +endyear = {endyear} + +spin = False +n_spin = 10 + +minlon = -15 +maxlon = 35 +minlat = 33 +maxlat = 72 + +dtsibout = -1 + +if spin == True: + outputname = 'output_'+sim_name+'_spin_1850' + execname = 'ex_dir_'+sim_name+'_spin_1850' +else: + outputname = 'output_'+sim_name+'_sim' + execname = 'ex_dir_'+sim_name+'_sim' + #spinoutput = 'output_'+sim_name+'_spin_1850' + +targdir = os.path.join(path_output, outputname) +# Create output folder +if not os.path.exists(targdir): + os.makedirs(targdir) + + +targdir = os.path.join(path_output ,execname) +# Create folders to store executables +if not os.path.exists(targdir): + os.makedirs(targdir) + for i in range(num_outputdirs): + targdir2= os.path.join(targdir,'case_%s'%(i+1)) + if not os.path.exists(targdir2): + os.makedirs(targdir2) + +path = path_exec + +oldline = [''] * 12 +newline = [''] * 12 + +orig_namelist = path_exec + 'namel_sibdrv' + +# Create namelists for each thread +for j in range(12): + for i in range(1, num_outputdirs+1): + if j==0: + shutil.copyfile(orig_namelist, '%s/namel_%s'%(path,i)) + file = os.path.join(path,'namel_%s'%i) + + oldline[1] =" out_path = '/scratch/shared/nsmith/NRT/" + newline[1] =" out_path = %s/%s/"%(path_output, outputname) + + if spin == False: + oldline[2] =" ic_file = '/projects/0/ctdas/NRT/data/SiB//restart/sib_r199601p025.nc'" + newline[2] =" ic_file = '%s/restart/sib_r199601p%s.nc'" %(sibdir, str(i).zfill(3)) + #newline[2] =" ic_file = '/scratch/shared/nsmith/NRT/%s/sib_requibp%ss%s.nc" %(spinoutput,str(i).zfill(3),str(n_spin).zfill(2)) + + oldline[3] =" startyear = 1998," + newline[3] =" startyear = %s,"%(str(startyear)) + oldline[4] =" endyear = 2010," + newline[4] =" endyear = %s,"%(str(endyear)) + oldline[5] =" spinup = .false.," + newline[5] =" spinup = .%s.,"%(str(spin).lower()) + oldline[6] =" spinup_maxiter = 5," + newline[6] =" spinup_maxiter = %s,"%(str(n_spin)) + oldline[7] =" minlon = -180," + newline[7] =" minlon = %s,"%(str(minlon)) + oldline[8] =" maxlon = 180," + newline[8] =" maxlon = %s,"%(str(maxlon)) + oldline[9] =" minlat = -90," + newline[9] =" minlat = %s,"%(str(minlat)) + oldline[10] =" maxlat = 90," + newline[10] =" maxlat = %s,"%(str(maxlat)) + oldline[11] =" dtsibqp = -1," + newline[11] =" dtsibqp = %s,"%(str(dtsibout)) + + # Read - write namelists + f = open(file, "r") + text = f.read() + f.close() + f = open(file, "w") + f.write(text.replace(oldline[j], newline[j])) + f.close() + +sib4_script_path = path_exec + '/sib4_script' + +oldline = 'cd /scratch/shared/kooij032/NRT/ex_dir_global/case_${{rank}}' +newline = 'cd ' + path_output + execname + '/case_${{rank}}' + +# Change sib4_script +f = open(sib4_script_path+'.template' , "r") +text = f.read() +f.close() +f = open(sib4_script_path, "w") +f.write(text.replace(oldline, newline)) +f.close() + +# Change sib4 permissions for mpi ---gives permission error for me (RdK) +#os.chmod(sib4_script_path, 0o777) + +print("All went well, the modifications are done") + +if __name__ == "__main__": + pass diff --git a/preprocess/archiv/sib4_preprocessing_carbontracker.py b/preprocess/archiv/sib4_preprocessing_carbontracker.py new file mode 100644 index 0000000000000000000000000000000000000000..6a24b3037fca6e7416dfea7056250395e17af60c --- /dev/null +++ b/preprocess/archiv/sib4_preprocessing_carbontracker.py @@ -0,0 +1,86 @@ +import netCDF4 as nc +import sys +import glob +import os + +sys.path.append('/Users/lindakooijmans/Documents/Python/Funcs/') +import sib4maptools as sibtools + +outputdir = '/scratch/shared/nsmith/test_near_real_time/sib4_out_test' + +for yy in range(2010, 2020): + for mm in range(1, 13): + + ######################## + ###### Load Data ####### + ######################## + + filedir = '/scratch/shared/nsmith/NRT/output_sib4_NRT_sim/qsib_'+str(yy)+'{:02}'.format(mm)+'.g.qp2.nc' + + files = glob.glob(filedir) + + with nc.Dataset(files[0]) as d: + time_orig = d['time'][:] + lonsib_orig = d['lonsib'][:] + latsib_orig = d['latsib'][:] + + gpp_orig = d['gpp'][:,:] + nee_orig = d['nee'][:,:] + reco_orig = d['reco'][:,:] + + print(filedir+" loaded") + + ############################## + ###### Create new file ####### + ############################## + + newfiledir = outputdir+'SiB4v2_BioFluxes_'+str(yy)+'{:02}'.format(mm)+'.nc' + + x = nc.Dataset(newfiledir,'w',format='NETCDF4') + + # -- Create dimension + + x.createDimension('latitude', 360) + x.createDimension('longitude', 720) + x.createDimension('time', len(time_orig)) + + # -- Create variables: Dataset.createVariable(<var_id>, <type>, <dimensions>) + latsib = x.createVariable('latitude','f',('latitude')) + lonsib = x.createVariable('longitude','f',('longitude')) + time = x.createVariable('time','f',('time')) + gpp = x.createVariable('gpp','f',('time','latitude', 'longitude')) + reco = x.createVariable('reco','f',('time','latitude', 'longitude')) + nee = x.createVariable('nee','f',('time','latitude', 'longitude')) + + # -- Write array to file + latsib[:] = np.arange(-89.75, 90.25, 0.5) + lonsib[:] = np.arange(-179.75, 180.25, 0.5) + time[:] = time_orig[:] + gpp[:,:,:] = sibtools.convert_2d(gpp_orig, latsib_orig, lonsib_orig) + reco[:,:,:] = sibtools.convert_2d(reco_orig, latsib_orig, lonsib_orig) + nee[:,:,:] = sibtools.convert_2d(nee_orig, latsib_orig, lonsib_orig) + + # -- Set attributes of variables + latsib.setncattr('long_name','Latitude') + lonsib.setncattr('long_name','Longitude') + time.setncattr('unit','3-hourly time step') + time.setncattr('long_name','time') + gpp.setncattr('unit','micromol m-2 s-1') + gpp.setncattr('long_name','Gross Primary Productivity') + gpp.setncattr('comment','Positive values are a flux from the atmosphere to the biosphere') + nee.setncattr('unit','micromol m-2 s-1') + nee.setncattr('long_name','Net Ecosystem Exchange') + nee.setncattr('comment','Positive values are a flux from the biosphere to the atmosphere') + reco.setncattr('unit','micromol m-2 s-1') + reco.setncattr('long_name','Total Ecosystem Respiration') + reco.setncattr('comment','Positive values are a flux from the biosphere to the atmosphere') + + # -- Set metadata + # x.setncattr('creation_date',datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')) + x.setncattr('release_note','File created by Linda Kooijmans (Wageningen University)') + x.setncattr('created','September, 2020') + + # -- Close file + x.close() + + print(newfiledir+" created") diff --git a/preprocess/gpcp_regrid.f90 b/preprocess/gpcp_regrid.f90 new file mode 100644 index 0000000000000000000000000000000000000000..89902c0254a3297e933d1f6b2e392b249baaeba6 --- /dev/null +++ b/preprocess/gpcp_regrid.f90 @@ -0,0 +1,291 @@ +!Program to redo longitudes of GPCP +! to go from -180 to 180, and +! to create monthly totals rather than month means, and +! to regrid GPCP to weather data resolution. +! +!Use the makefile in this directory +!>make gpcp_regrid (NC=3 for netcdf3) +! +!kdhaynes, 01/2018 +! +program gpcp_regrid + +use netcdf +implicit none + +character*180, parameter :: & !initial GPCP file + infile='/scratch/shared/erikvs/precip.mon.mean.nc' +character*180, parameter :: & !regridded GPCP file + outfile='/scratch/shared/erikvs/gpcp/gpcp_0.625dx0.5d_tot.nc' +character*180, parameter :: & !regrid file + regridfile='/scratch/shared/erikvs/merra_2018_proc/merra_201908.nc' + +integer, parameter :: gpcpyrstart=1979 +real, parameter :: badval = -9999. +integer, parameter :: maxng=4 + +!!!Netcdf variables +integer :: status +integer :: ncid,ncid2,dimid,varid +integer :: nlatdid, nlondid, ntimedid +integer :: latid, lonid, timeid +integer :: precipid +character*20 :: dimname + +!!!GPCP variables +integer :: nlong, nlatg, ntime +real, dimension(:), allocatable :: longpcpin, longpcp, latgpcp +real, dimension(:,:,:), allocatable :: gpcpin, gpcpall, gpcpout +real*8, dimension(:,:), allocatable :: areagg + +!!!Regrid variables +integer :: nlon, nlat +real, dimension(:), allocatable :: lon, lat +real*8, dimension(:,:), allocatable :: areag + +!!!Areal variables +integer, dimension(:,:), allocatable :: ngmin +integer, dimension(:,:,:), allocatable :: refiin,refjin +real*8, dimension(:), allocatable :: arlonin, arlatin +real*8, dimension(:), allocatable :: arlonout, arlatout +real*8, dimension(:,:,:), allocatable :: contribin +logical :: regridup + +!!!Time variables +real, dimension(:), allocatable :: time + +!!!Local variables +integer :: i,j,ii,jj +integer :: yrref, monref +integer :: startref, lonref +integer :: numatts, att +character(len=30) :: attname + +integer :: dayspermon(12) +real :: radius +real*8 :: pi + +!------------------ +!Set local variables +data dayspermon/31,28,31,30,31,30,31,31,30,31,30,31/ +pi = acos(-1.0) +radius = 6371000. + +!------------------ +!Get the GPCP data +print*,'' +print('(a)'),'GPCP File Information: ' +print('(a,a)'), ' ',trim(infile) +status = nf90_open( trim(infile), nf90_nowrite, ncid ) + +status = nf90_inq_dimid(ncid, 'lon', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlong) +status = nf90_inq_dimid(ncid, 'lat', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlatg) +status = nf90_inq_dimid(ncid, 'time', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, ntime) + +allocate(longpcpin(nlong)) +allocate(longpcp(nlong), latgpcp(nlatg)) +status = nf90_inq_varid(ncid, 'lon', varid ) +status = nf90_get_var(ncid, varid, longpcpin ) +status = nf90_inq_varid(ncid, 'lat', varid ) +status = nf90_get_var(ncid, varid, latgpcp ) + +allocate(gpcpin(nlong,nlatg,ntime)) +allocate(gpcpall(nlong,nlatg,ntime)) +status = nf90_inq_varid(ncid, 'precip', varid ) +status = nf90_get_var(ncid, varid, gpcpin ) +status = nf90_close(ncid) +where(gpcpin .lt. 0.) gpcpin=0. + +!....fix GPCP longitude +IF (maxval(longpcpin) .GT. 180.) THEN + startref=0 + do i=1,nlong + if ((longpcpin(i) .gt. 180.) .and. & + (startref .eq. 0)) then + startref = i + endif + enddo + + lonref = startref + do i=1,nlong + longpcp(i) = longpcpin(lonref) + if (longpcp(i) .gt. 180.) then + longpcp(i) = longpcp(i) - 360. + endif + gpcpall(i,:,:) = gpcpin(lonref,:,:) + lonref = lonref + 1 + if (lonref .gt. nlong) lonref=1 + enddo + + print*,' Reversed Lon (min/max): ',minval(longpcp),maxval(longpcp) + print*,' Precip (min/max in mm/day): ',minval(gpcpall),maxval(gpcpall) +ELSE + longpcp=longpcpin + gpcpall=gpcpin +ENDIF +IF (maxval(longpcp) .GT. 180.) THEN + print('(a)'),'ERROR CONVERTING LON TO -180 TO 180' + RETURN +ENDIF + +!....get GPCP time +allocate(time(ntime)) +monref=1 +yrref=gpcpyrstart +do i=1,ntime + time(i) = yrref + (monref-0.5)/12. + gpcpall(:,:,i) = gpcpall(:,:,i)*dayspermon(monref) + + monref=monref+1 + if (monref .eq. 13) then + monref = 1 + yrref=yrref+1 + endif +enddo + +!----------------------- +!Get regrid information +print*,'' +print('(a)'),'Regrid File Information: ' +print('(a,a)'), ' ',trim(regridfile) +status = nf90_open( trim(regridfile), nf90_nowrite, ncid ) +if (status .ne. nf90_noerr) then + print*,'Error Opening File. Stopping.' + stop +endif + +status = nf90_inq_dimid(ncid, 'lon', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlon) +status = nf90_inq_dimid(ncid, 'lat', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlat) + +allocate(lon(nlon),lat(nlat)) +status = nf90_inq_varid(ncid, 'longitude', varid ) +status = nf90_get_var(ncid, varid, lon ) +status = nf90_inq_varid(ncid, 'latitude', varid ) +status = nf90_get_var(ncid, varid, lat ) +status = nf90_close(ncid) + +regridup = .true. +IF (nlon .GT. nlong) regridup = .false. + +!-------------------------------- +!Allocate the areal arrays +allocate(arlonin(nlong),arlatin(nlatg)) +allocate(arlonout(nlon),arlatout(nlat)) +allocate(areagg(nlong,nlatg)) +allocate(areag(nlon,nlat)) + +allocate(gpcpout(nlon,nlat,ntime)) +gpcpout = 0. + +!------------------------------- +!Regrid the precip data +IF (regridup) THEN + allocate(ngmin(nlong,nlatg)) + allocate(refiin(nlong,nlatg,maxng), & + refjin(nlong,nlatg,maxng)) + allocate(contribin(nlong,nlatg,maxng)) + + call regrid_upinfo( & + nlong, nlatg, & + nlon, nlat, maxng, & + longpcp, latgpcp, lon, lat, & + ngmin, refiin, refjin, & + arlonin, arlatin, arlonout, arlatout, & + contribin, areagg, areag) + + call regrid_varup( & + gpcpyrstart, & + nlong, nlatg, & + nlon,nlat, & + ntime, maxng, & + lon, lat, & + ngmin, refiin, refjin, & + arlonin, arlatin, arlonout, arlatout, & + contribin, areag, & + gpcpall, gpcpout) + +ELSE + allocate(ngmin(nlon,nlat)) + allocate(refiin(nlon,nlat,maxng), & + refjin(nlon,nlat,maxng)) + allocate(contribin(nlon,nlat,maxng)) + + call regrid_downinfo( & + nlong, nlatg, & + nlon, nlat, maxng, & + longpcp, latgpcp, lon, lat, & + ngmin, refiin, refjin, & + arlonin, arlatin, arlonout, arlatout, & + contribin, areagg, areag) + + call regrid_vardown( & + gpcpyrstart, & + nlong, nlatg, ntime, & + nlon, nlat, maxng, & + ngmin, refiin, refjin, & + arlonin, arlatin, arlonout, arlatout, & + contribin, gpcpall, gpcpout) + +ENDIF + + + +!!!Write out file +print('(a)') +print('(a)'), 'Writing file: ' +print('(2a)'),' ', trim(outfile) +status = nf90_create( trim(outfile), nf90_clobber, ncid) + +!...copy global attributes.... +status = nf90_open( trim(infile), nf90_nowrite, ncid2 ) +status = nf90_inquire(ncid2, nAttributes=numatts) +do att=1,numatts + status = nf90_inq_attname(ncid2,nf90_global,att,attname) + status = nf90_copy_att(ncid2,nf90_global,trim(attname),ncid,nf90_global) +enddo +status = nf90_close(ncid2) + +!...dimensions... +status = nf90_def_dim( ncid, 'lon', nlon, nlondid ) +status = nf90_def_dim( ncid, 'lat', nlat, nlatdid ) +status = nf90_def_dim( ncid, 'time', ntime, ntimedid ) + +!...variables... +status = nf90_def_var( ncid,'lon',nf90_float,(/nlondid/), lonid ) +status = nf90_put_att( ncid, lonid, 'units','degrees_north') + +status = nf90_def_var( ncid,'lat',nf90_float,(/nlatdid/), latid ) +status = nf90_put_att( ncid, latid, 'units','degrees_east') + +status = nf90_def_var( ncid,'time',nf90_float,(/ntimedid/), timeid ) +status = nf90_put_att( ncid, timeid, 'units','years since 0000-00-00') + +status = nf90_def_var( ncid,'precip',nf90_float,(/nlondid,nlatdid,ntimedid/), precipid ) +status = nf90_put_att( ncid, precipid, 'long_name', & + 'Total Month Precipitation' ) +status = nf90_put_att( ncid, precipid, 'units', 'mm/month') +status = nf90_put_att( ncid, precipid, 'dataset', & + 'GPCP Version 2.3 Combined Precipitation Dataset') + +!...take file out of define mode, into data mode +status = nf90_enddef( ncid ) + +!...load the variables... +status = nf90_put_var( ncid, lonid, lon ) +status = nf90_put_var( ncid, latid, lat ) +status = nf90_put_var( ncid, timeid, time ) +status = nf90_put_var( ncid, precipid, gpcpout) + +!...close the file +status = nf90_close( ncid ) + +print*,'' +print('(a)'),'Finished Processing.' +print*,'' + +end program gpcp_regrid diff --git a/preprocess/gpcp_tdown.f90 b/preprocess/gpcp_tdown.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8b9de546094317fdaa23d35a4ce1f9ac349a76d3 --- /dev/null +++ b/preprocess/gpcp_tdown.f90 @@ -0,0 +1,378 @@ +!=================================== +! Subroutine to get areal information +! for regridding to a smaller grid. +! (Downscaling...) +! +! kdhaynes, 06/16 + +subroutine regrid_downinfo( & + nlonin, nlatin, & + nlonout, nlatout, maxng, & + lonin, latin, lonout, latout, & + ngmin, refiin, refjin, & + arlonin, arlatin, & + arlonout, arlatout, & + contribin, areagin, areagout) + +implicit none + +!...parameters +logical, parameter :: print_area=.true. +real, parameter :: radius=6371000 +real :: pi + +!...input variables +integer, intent(in) :: nlonin, nlatin +integer, intent(in) :: nlonout, nlatout +integer, intent(in) :: maxng +real, dimension(nlonin), intent(in) :: lonin +real, dimension(nlatin), intent(in) :: latin +real, dimension(nlonout), intent(in) :: lonout +real, dimension(nlatout), intent(in) :: latout +integer, dimension(nlonout,nlatout), intent(inout) :: ngmin +integer, dimension(nlonout,nlatout,maxng), intent(inout) :: refiin, refjin +real*8, dimension(nlonin), intent(inout) :: arlonin +real*8, dimension(nlatin), intent(inout) :: arlatin +real*8, dimension(nlonout), intent(inout) :: arlonout +real*8, dimension(nlatout), intent(inout) :: arlatout +real*8, dimension(nlonout,nlatout,maxng), intent(inout) :: contribin +real*8, dimension(nlonin,nlatin), intent(inout) :: areagin +real*8, dimension(nlonout,nlatout), intent(inout) :: areagout + +!...local variables +real :: deltalonin, deltalatin +real*8 :: areatotin +real :: loninWt, loninEt +real, dimension(nlonin) :: loninloc, loninE, loninW +real, dimension(nlatin) :: latinN, latinS + +real :: deltalonout, deltalatout +real, dimension(nlonout) :: lonoutE, lonoutW +real, dimension(nlatout) :: latoutN, latoutS + +real*8 :: latsr, latnr, lonwr, loner +real*8 :: londiff,sinlatdiff + +!...misc variables +integer :: i,j,ii,jj +integer :: irefin, jrefin +real*8 :: temparea + +!---------------------------------------- +pi = acos(-1.0) +ngmin(:,:) = 0 +refiin(:,:,:) = 0 +refjin(:,:,:) = 0 + +!Calculate areal variables for original grid +deltalonin=(lonin(3)-lonin(2))/2. +deltalatin=(latin(3)-latin(2))/2. + +do i=1,nlonin + if (lonin(i) .gt. 180.) then + loninloc(i) = lonin(i) - 360. + else + loninloc(i) = lonin(i) + endif + loninE(i)=loninloc(i)+deltalonin + loninW(i)=loninloc(i)-deltalonin + arlonin(i)=(loninE(i)-loninW(i))/360. +enddo +arlonin = arlonin*2*pi*radius*radius + +do j=1,nlatin + if (j .eq. 1) then + latinS(j) = -90. + latinN(j) = (latin(j+1) + latin(j))*0.5 + elseif (j .eq. 2) then + latinS(j) = (latin(j-1) + latin(j))*0.5 + latinN(j) = latin(j) + deltalatin + elseif (j .eq. nlatin-1) then + latinS(j) = latin(j) - deltalatin + latinN(j) = (latin(j) + latin(j+1))*0.5 + elseif (j .eq. nlatin) then + latinS(j) = (latin(j-1) + latin(j))*0.5 + latinN(j) = 90. + else + latinS(j) = latin(j) - deltalatin + latinN(j) = latin(j) + deltalatin + endif + + arlatin(j) = -sin(pi*latinS(j)/180.) + & + sin(pi*latinN(j)/180.) +enddo + +areatotin=0. +do ii=1,nlonin + do jj=1,nlatin + latsr=latinS(jj)*pi/180. + latnr=latinN(jj)*pi/180. + lonwr=loninW(ii)*pi/180. + loner=loninE(ii)*pi/180. + londiff=loner-lonwr + sinlatdiff=sin(latnr)-sin(latsr) + areagin(ii,jj) = radius*radius*londiff*sinlatdiff + areatotin = areatotin + areagin(ii,jj) + enddo !jj +enddo !ii + +!Calculate areal variables for new grid +deltalonout=(lonout(3)-lonout(2))/2. +deltalatout=(latout(3)-latout(2))/2. + +do i=1,nlonout + lonoutE(i)=lonout(i)+deltalonout + lonoutW(i)=lonout(i)-deltalonout + arlonout(i)=(lonoutE(i)-lonoutW(i))/360. +enddo +arlonout = arlonout*2*pi*radius*radius + +do j=1,nlatout + latoutS(j) = latout(j) - deltalatout + latoutN(j) = latout(j) + deltalatout + + IF (latoutS(j) .lt. -90.) THEN + latoutS(j) = -90. + ENDIF + + IF (latoutN(j) .gt. 90.) THEN + latoutN(j) = 90. + ENDIF + + arlatout(j) = -sin(pi*latoutS(j)/180.) + & + sin(pi*latoutN(j)/180.) +enddo + +do ii=1,nlonout + do jj=1,nlatout + latsr=latoutS(jj)*pi/180. + latnr=latoutN(jj)*pi/180. + lonwr=lonoutW(ii)*pi/180. + loner=lonoutE(ii)*pi/180. + londiff=loner-lonwr + sinlatdiff=sin(latnr)-sin(latsr) + + areagout(ii,jj) = radius*radius*londiff*sinlatdiff + enddo !jj +enddo !ii + +!Area calculations +ngmin(:,:)=0 +do ii=1,nlonout + do jj=1,nlatout + + do i=1,nlonin + loninWt = loninW(i) + loninEt = loninE(i) + if ((loninW(i) .le. 180.) .and. (loninE(i) .ge. 180.)) then + if (lonout(ii) .lt. 0.) then + loninWt = loninW(i) - 360. + loninEt = loninE(i) - 360. + endif + endif + do j=1,nlatin + IF ((lonoutE(ii) .GT. loninWt) .AND. & + (lonoutW(ii) .LT. loninEt) .AND. & + (latoutN(jj) .GT. latinS(j)) .AND. & + (latoutS(jj) .LT. latinN(j))) THEN + latsr=MAX(latoutS(jj)*pi/180.,latinS(j)*pi/180.) + latnr=MIN(latoutN(jj)*pi/180.,latinN(j)*pi/180.) + lonwr=MAX(lonoutW(ii)*pi/180.,loninWt*pi/180.) + loner=MIN(lonoutE(ii)*pi/180.,loninEt*pi/180.) + londiff=loner-lonwr + sinlatdiff=sin(latnr)-sin(latsr) + temparea = radius*radius*londiff*sinlatdiff + IF (temparea .LT. 0.) THEN + print*,'Negative Area: ',temparea + print*,' (loninE,lonoutE,loninW,lonoutW): ', & + loninEt,lonoutE(ii),loninWt,lonoutW(ii),londiff + print*,' (latinS,latoutS,latinN,latoutN): ', & + latinS(j),latoutS(jj),latinN(j),latoutN(jj),sinlatdiff + ENDIF + + ngmin(ii,jj) = ngmin(ii,jj) + 1 + !print*,'Lon In: ',loninWt,loninEt + !print*,'Lon Out: ',lonoutW(ii),lonoutE(ii) + !print*,'Lat In: ',latinS(j),latinN(j) + !print*,'Lat Out: ',latoutS(jj),latoutN(jj) + !print*,'Grid Contributions: ',ngmin(ii,jj) + + IF (ngmin(ii,jj) .GT. maxng) THEN + print('(a,3i6)'),'Too many grid cell contributors: ', & + ngmin(ii,jj),ii,jj + print*,'Longitudes: ',lonout(ii),lonoutW(ii),lonoutE(ii) + print*,'Latitudes: ',latout(jj),latoutS(jj),latoutN(jj) + stop + ENDIF + irefin = i + jrefin = j + + refiin(ii,jj,ngmin(ii,jj)) = irefin + refjin(ii,jj,ngmin(ii,jj)) = jrefin + contribin(ii,jj,ngmin(ii,jj)) = temparea/areagout(ii,jj) + ENDIF + ENDDO !jj + ENDDO !ii + + ENDDO !j +ENDDO !i + +!ratio=areatotin/sum(areagout) +!areagout=areagout*ratio +!ratio=areatotin/sum(contribin) +!contribin=contribin*ratio + +!Check areas +if (print_area) then + print('(a)'), ' Area should be: 0.51E+15 m2' + print('(a)'), ' Area used for calculation:' + print('(2(a,E15.8))'), ' Orig = ', & + sum(areagin),' ',sum(arlonin)*sum(arlatin) + print('(2(a,E15.8))'), ' New = ', & + sum(areagout),' ',sum(arlonout)*sum(arlatout) +endif + +!Check to make sure all new grid points +! have a contributor +do ii=1,nlonout + do jj=1,nlatout + if ((sum(contribin(ii,jj,:)) .le. 0.99) .or. & + (sum(contribin(ii,jj,:)) .gt. 1.01)) then + print*,'Bad Original Contribution: ',ii,jj,sum(contribin(ii,jj,:)) + STOP + endif + enddo +enddo + +end subroutine regrid_downinfo + + + +!=================================== +! Subroutine to output regrid a variable. +! +! kdhaynes, 06/16 + +subroutine regrid_vardown( gpcpyrstart, & + nlonin, nlatin, ntime, & + nlonout, nlatout, maxng, & + ngmin, refiin, refjin, & + arlonin, arlatin, arlonout, arlatout, & + contribin, varin, varout) + +implicit none + +!parameters +real, parameter :: earth_sfc_area = 5.1E14 +logical, parameter :: print_sums=.true. +character(len=3), dimension(12), parameter :: & + monname = ['Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'] + +!input variables +integer, intent(in) :: gpcpyrstart +integer, intent(in) :: nlonin, nlatin, ntime +integer, intent(in) :: nlonout, nlatout, maxng + +integer, dimension(nlonout,nlatout), intent(in) :: ngmin +integer, dimension(nlonout,nlatout,maxng), intent(in) :: refiin, refjin + +real*8, dimension(nlonin), intent(in) :: arlonin +real*8, dimension(nlatin), intent(in) :: arlatin +real*8, dimension(nlonout), intent(in) :: arlonout +real*8, dimension(nlatout), intent(in) :: arlatout +real*8, dimension(nlonout,nlatout,maxng), intent(in) :: contribin + +real, dimension(nlonin,nlatin,ntime), intent(in) :: varin +real, dimension(nlonout,nlatout,ntime), intent(inout) :: varout + +!data variables +real, dimension(nlonin,nlatin,ntime) :: varinloc + +!processing area variables +real*8 :: ratio +real*8 :: sumvarin, sumvarout1, sumvarout2 + +!local variables +integer :: i,j,k,l,t +integer :: irefin, jrefin +integer :: monref, yrref + +!------------------------- +!regrid +monref = 1 +yrref = gpcpyrstart +varout = 0.0 + +do t=1,ntime + do i=1,nlonout + do j=1,nlatout + do l=1,ngmin(i,j) + irefin=refiin(i,j,l) + jrefin=refjin(i,j,l) + + varout(i,j,t) = varout(i,j,t) + & + varin(irefin,jrefin,t) * & + real(contribin(i,j,l)) + enddo !l=1,ngmin + enddo !j=1,nlatin + enddo !i=1,nlonin + + !calculate global totals + sumvarin=0.0 + do i=1,nlonin + do j=1,nlatin + sumvarin = sumvarin + & + varin(i,j,t)*arlonin(i)*arlatin(j) + enddo !j=1,nlatin + enddo !i=1,nlonin + + sumvarout1=0.0 + do i=1,nlonout + do j=1,nlatout + sumvarout1 = sumvarout1 + & + varout(i,j,t)*arlonout(i)*arlatout(j) + enddo !j=1,nlatout + enddo !i=1,nlonout + + !rescale + if (sumvarout1 .ne. 0.) then + ratio=sumvarin/sumvarout1 + else + ratio=1. + endif + varout(:,:,t)=varout(:,:,t)*real(ratio) + + !recheck + sumvarout2=0.0 + do i=1,nlonout + do j=1,nlatout + sumvarout2 = sumvarout2 + & + (varout(i,j,t))*arlonout(i)*arlatout(j) + enddo !j=1,nlatout + enddo !i=1,nlonout + + if (print_sums) then + print*,'' + print('(a,a,i5)'), & + 'Precipitation for ',monname(monref),yrref + + print*,' Orig Max/Min Precip (mm/mon) : ', & + maxval(varin(:,:,t)), & + minval(varin(:,:,t)) + print*,' Regrid Max/Min Precip (mm/mon): ', & + maxval(varout(:,:,t)), & + minval(varout(:,:,t)) + print*,' Totals (global mean in mm/mon)' + print('(a,f15.8)'),' In : ',sumvarin/earth_sfc_area + print('(a,f15.8)'),' Out: ',sumvarout2/earth_sfc_area + endif + + monref = monref + 1 + if (monref .eq. 13) then + monref = 1 + yrref = yrref + 1 + endif +enddo !t=1,ntime + +end subroutine regrid_vardown diff --git a/preprocess/gpcp_tup.f90 b/preprocess/gpcp_tup.f90 new file mode 100644 index 0000000000000000000000000000000000000000..fd83c98c73e7e2c73e65b539725ad42ec7e2e39f --- /dev/null +++ b/preprocess/gpcp_tup.f90 @@ -0,0 +1,352 @@ +!=================================== +! Subroutine to get areal information +! for regridding to a coarser grid. +! (Upscaling...) +! +! kdhaynes, 10/17 + +subroutine regrid_upinfo( & + nlonin, nlatin, & + nlonout, nlatout, maxng, & + lonin, latin, lonout, latout, & + ngmin, refiin, refjin, & + arlonin, arlatin, arlonout, arlatout, & + contribin, areagin, areagout) + +implicit none + +!...parameters +logical, parameter :: print_area=.false. +real, parameter :: radius=6371000 +real :: pi + +!...input variables +integer, intent(in) :: nlonin, nlatin +integer, intent(in) :: nlonout, nlatout +integer, intent(in) :: maxng +real, dimension(nlonin), intent(in) :: lonin +real, dimension(nlatin), intent(in) :: latin +real, dimension(nlonout), intent(in) :: lonout +real, dimension(nlatout), intent(in) :: latout + +integer, dimension(nlonin,nlatin), intent(inout) :: ngmin +integer, dimension(nlonin,nlatin,maxng), intent(inout) :: refiin, refjin +real*8, dimension(nlonin), intent(inout) :: arlonin +real*8, dimension(nlatin), intent(inout) :: arlatin +real*8, dimension(nlonout), intent(inout) :: arlonout +real*8, dimension(nlatout), intent(inout) :: arlatout +real*8, dimension(nlonin,nlatin,maxng), intent(inout) :: contribin +real*8, dimension(nlonin,nlatin), intent(inout) :: areagin +real*8, dimension(nlonout,nlatout), intent(inout) :: areagout + +!...local variables +real :: deltalonin, deltalatin +real*8 :: areatotin +real, dimension(nlonin) :: loninE, loninW +real, dimension(nlatin) :: latinN, latinS + +real :: deltalonout, deltalatout +real, dimension(nlonout+1) :: lonoutEe, lonoutWe +real, dimension(nlatout) :: latoutN, latoutS + +real*8 :: latsr, latnr, lonwr, loner +real*8 :: londiff,sinlatdiff + +!...misc variables +integer :: i,j,ii,jj +integer :: irefout, jrefout +real*8 :: ratio, temparea + +!---------------------------------------- +pi = acos(-1.0) +ngmin(:,:) = 0 +refiin(:,:,:) = 0 +refjin(:,:,:) = 0 + +!Calculate areal variables for original grid +deltalonin=(lonin(3)-lonin(2))/2. +deltalatin=(latin(3)-latin(2))/2. + +do i=1,nlonin + loninE(i)=lonin(i)+deltalonin + loninW(i)=lonin(i)-deltalonin + arlonin(i)=(loninE(i)-loninW(i))/360. +enddo +arlonin = arlonin*2*pi*radius*radius/1.e15 + +do j=1,nlatin + latinS(j) = latin(j) - deltalatin + latinN(j) = latin(j) + deltalatin + + IF (latinS(j) .lt. -90.) THEN + latinS(j) = -90. + ENDIF + + IF (latinN(j) .gt. 90.) THEN + latinN(j) = 90. + ENDIF + + arlatin(j) = -sin(pi*latinS(j)/180.) + & + sin(pi*latinN(j)/180.) +enddo + +areatotin=0. +do ii=1,nlonin + do jj=1,nlatin + latsr=latinS(jj)*pi/180. + latnr=latinN(jj)*pi/180. + lonwr=loninW(ii)*pi/180. + loner=loninE(ii)*pi/180. + londiff=loner-lonwr + sinlatdiff=sin(latnr)-sin(latsr) + areagin(ii,jj) = radius*radius*londiff*sinlatdiff + areatotin = areatotin + areagin(ii,jj) + enddo !jj +enddo !ii + +!Calculate areal variables for new grid +deltalonout=(lonout(3)-lonout(2))/2. +deltalatout=(latout(3)-latout(2))/2. + +do i=1,nlonout + lonoutEe(i)=lonout(i)+deltalonout + lonoutWe(i)=lonout(i)-deltalonout + arlonout(i)=(lonoutEe(i)-lonoutWe(i))/360. +enddo +lonoutEe(nlonout+1)=lonout(nlonout)+3*deltalonout +lonoutWe(nlonout+1)=lonout(nlonout)+2*deltalonout +arlonout = arlonout*2*pi*radius*radius/1.e15 + +do j=1,nlatout + latoutS(j) = latout(j) - deltalatout + latoutN(j) = latout(j) + deltalatout + + IF (latoutS(j) .lt. -90.) THEN + latoutS(j) = -90. + ENDIF + + IF (latoutN(j) .gt. 90.) THEN + latoutN(j) = 90. + ENDIF + + arlatout(j) = -sin(pi*latoutS(j)/180.) + & + sin(pi*latoutN(j)/180.) +enddo + +do ii=1,nlonout+1 + do jj=1,nlatout + latsr=latoutS(jj)*pi/180. + latnr=latoutN(jj)*pi/180. + lonwr=lonoutWe(ii)*pi/180. + loner=lonoutEe(ii)*pi/180. + londiff=loner-lonwr + sinlatdiff=sin(latnr)-sin(latsr) + + IF (ii .LT. nlonout+1) THEN + areagout(ii,jj) = radius*radius*londiff*sinlatdiff + ENDIF + enddo !jj +enddo !ii + +!Area calculations +ngmin(:,:)=0 +do i=1,nlonin + do j=1,nlatin + + do ii=1,nlonout+1 + do jj=1,nlatout + IF ((loninE(i) .GT. lonoutWe(ii)) .AND. & + (loninW(i) .LT. lonoutEe(ii)) .AND. & + (latinN(j) .GT. latoutS(jj)) .AND. & + (latinS(j) .LT. latoutN(jj))) THEN + latsr=MAX(latoutS(jj)*pi/180.,latinS(j)*pi/180.) + latnr=MIN(latoutN(jj)*pi/180.,latinN(j)*pi/180.) + lonwr=MAX(lonoutWe(ii)*pi/180.,loninW(i)*pi/180.) + loner=MIN(lonoutEe(ii)*pi/180.,loninE(i)*pi/180.) + londiff=loner-lonwr + sinlatdiff=sin(latnr)-sin(latsr) + temparea = radius*radius*londiff*sinlatdiff + IF (temparea .LT. 0.) THEN + print*,'Negative Area: ',temparea + print*,' (loninE,lonoutE,loninW,lonoutW): ', & + loninE(i),lonoutEe(ii),loninW(i),lonoutWe(ii),londiff + print*,' (latinS,latoutS,latinN,latoutN): ', & + latinS(j),latoutS(jj),latinN(j),latoutN(jj),sinlatdiff + ENDIF + + ngmin(i,j) = ngmin(i,j) + 1 + IF (ngmin(i,j) .GT. maxng) THEN + print*,'Too many original grid cell contributors: ', & + ngmin(i,j),i,j,lonin(i),latin(i) + stop + ENDIF + IF (ii .EQ. nlonout+1) THEN + irefout = 1 + ELSE + irefout = ii + ENDIF + jrefout = jj + + refiin(i,j,ngmin(i,j)) = irefout + refjin(i,j,ngmin(i,j)) = jrefout + contribin(i,j,ngmin(i,j)) = temparea + + ENDIF + ENDDO !jj + ENDDO !ii + + ENDDO !j +ENDDO !i + +!Rescale areas +ratio=areatotin/sum(areagout) +areagout=areagout*ratio +ratio=areatotin/sum(contribin) +contribin=contribin*ratio + +!Check areas +if (print_area) then + print('(a)'), ' Area should be: 0.50990436E+15 m2' + print('(a)'), ' Area used for calculation:' + print('(a,E15.8)'), ' Orig = ',sum(areagin) + print('(a,E15.8)'), ' New = ',sum(areagout) +endif + + +end subroutine regrid_upinfo + + +!=================================== +! Subroutine to output regridded data. +! +! kdhaynes, 01/2018 + +subroutine regrid_varup( gpcpyrstart, & + nlonin, nlatin, & + nlonout, nlatout, & + ntime, maxng, & + lonout, latout, & + ngmin, refiin, refjin, & + arlonin, arlatin, arlonout, arlatout, & + contribin, areagout, & + datain, dataout) + +use netcdf +implicit none + +!input variables +integer, intent(in) :: gpcpyrstart +integer, intent(in) :: nlonin, nlatin +integer, intent(in) :: nlonout, nlatout +integer, intent(in) :: maxng, ntime +real, dimension(nlonout), intent(in) :: lonout +real, dimension(nlatout), intent(in) :: latout + +integer, dimension(nlonin,nlatin), intent(in) :: ngmin +integer, dimension(nlonin,nlatin,maxng), intent(in) :: refiin, refjin +real*8, dimension(nlonin), intent(in) :: arlonin +real*8, dimension(nlatin), intent(in) :: arlatin +real*8, dimension(nlonout), intent(in) :: arlonout +real*8, dimension(nlatout), intent(in) :: arlatout +real*8, dimension(nlonin,nlatin,maxng), intent(in) :: contribin +real*8, dimension(nlonout,nlatout), intent(in) :: areagout + +real, dimension(nlonin,nlatin,ntime), intent(in) :: datain +real, dimension(nlonout,nlatout,ntime), intent(inout) :: dataout + +!data variables +real*8 :: ratio +real*8 :: sumvarin, sumvarout1, sumvarout2 + +!local variables +integer :: i,j,l,t +integer :: irefout, jrefout +integer :: monref, yrref + +!parameters +real, parameter :: earth_sfc_area = 5.1E14 +logical, parameter :: print_sums=.true. +character(len=3), dimension(12), parameter :: & + monname = ['Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'] + +!------------------------------------- +!Process the data +monref = 1 +yrref = gpcpyrstart + +do t=1,ntime + do j=1,nlatin + do i=1,nlonin + do l=1,ngmin(i,j) + irefout=refiin(i,j,l) + jrefout=refjin(i,j,l) + + dataout(irefout,jrefout,t) = & + dataout(irefout,jrefout,t) + & + datain(i,j,t) * & + real(contribin(i,j,l)/areagout(irefout,jrefout)) + enddo !l=1,ngmin + enddo !i=1,nlonin + enddo !j=1,nlatin + + !calculate global totals + sumvarin=0.0 + do j=1,nlatin + do i=1,nlonin + sumvarin = sumvarin + & + datain(i,j,t)*arlonin(i)*arlatin(j) + enddo !j=1,nlatin + enddo !i=1,nlonin + + sumvarout1=0.0 + do j=1,nlatout + do i=1,nlonout + sumvarout1 = sumvarout1 + & + dataout(i,j,t)*arlonout(i)*arlatout(j) + enddo !i=1,nlonout + enddo !j=1,nlatout + + !rescale + if (sumvarout1 .ne. 0.) then + ratio=sumvarin/sumvarout1 + else + ratio=1. + endif + dataout(:,:,t) = dataout(:,:,t)*real(ratio) + + !recheck + sumvarout2=0.0 + do j=1,nlatout + do i=1,nlonout + sumvarout2 = sumvarout2 + & + (dataout(i,j,t))*arlonout(i)*arlatout(j) + enddo !i=1,nlonout + enddo !j=1,nlatout + + if (print_sums) then + print*,'' + print('(a,a,i5)'), & + 'Precipitation for ',monname(monref),yrref + + print*,' Orig Max/Min Precip (mm/mon) : ', & + maxval(datain(:,:,t)), & + minval(datain(:,:,t)) + print*,' Regrid Max/Min Precip (mm/mon): ', & + maxval(dataout(:,:,t)), & + minval(dataout(:,:,t)) + print*,' Totals (global mean in mm/mon)' + print('(a,f15.8)'),' In : ',sumvarin/earth_sfc_area + print('(a,f15.8)'),' Out: ',sumvarout2/earth_sfc_area + endif + + monref = monref + 1 + if (monref .eq. 13) then + monref = 1 + yrref = yrref + 1 + endif +enddo !t=1,ntime + + +end subroutine regrid_varup + diff --git a/preprocess/merra_pullsib.f90 b/preprocess/merra_pullsib.f90 new file mode 100644 index 0000000000000000000000000000000000000000..8bdb01b0c96d69c37c68d6fbc7f18bda52e4eeaa --- /dev/null +++ b/preprocess/merra_pullsib.f90 @@ -0,0 +1,308 @@ +!Program to read in gridded MERRA monthly files (lonxlat), +!and write out monthly SiB driver files (nsib). +! +!To compile, use: +!>pgf90 merra_pullsib.f90 -L/usr/local/netcdf3-pgi/lib -lnetcdf -I/usr/local/netcdf3-pgi/include -o merra_pullsib +! +!-or- (if defined) +!>f90nc merra_pullsib.f90 +!>f90nco merra_pullsib.f90 merra_pullsib +! +!>-or- +!>make merra_pullsib +! +!kdhaynes, 01/2018 +! +program merra_pullsib + +use netcdf + +implicit none + +!!!!! user defined variables +integer, parameter :: startYr=2019, stopYr=2019 +integer, parameter :: startmon=8, stopmon=12 + +character(len=100), parameter :: inputdir= & + '/scratch/shared/erikvs/merra_2018_proc/' +character(len=6), parameter :: inprefix='merra_' + +character(len=100), parameter :: outputdir= & + '/scratch/shared/erikvs/merra_2018_proc/' +character(len=24), parameter :: outprefix='merra2_0.5deg_' + +character(len=100), parameter :: sibfile= & + '/projects/0/ctdas/sib4_input/vs/sib_vs_0.5deg.nc' + +!!!!! MERRA-specific parameters +integer, parameter :: nvar = 10 +character(len=12), parameter, dimension(nvar) :: & + varname = ['tm ','sh ','ps ', & + 'spdm ','swd ','lwd ', & + 'lspr ','cupr ','lspr_scaled ', & + 'cupr_scaled '] +character(len=3), parameter, dimension(12) :: & + monname = ['Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'] + +!input variables +integer :: nlon, nlat, ntime +real, dimension(:), allocatable :: longitude, latitude +real*8, dimension(:), allocatable :: time +integer, dimension(:), allocatable :: year, month, doy, day +real, dimension(:), allocatable :: hour +real, dimension(:,:,:), allocatable :: values_temp +real, dimension(:,:,:,:), allocatable :: values + +!output variables +integer :: nsib +real, dimension(:), allocatable :: lonsib, latsib +real, dimension(:,:), allocatable :: valuessib_temp +real, dimension(:,:,:), allocatable :: valuessib + +!comparison variables +real :: minlon, minlat +real, dimension(:), allocatable :: londiff, latdiff +integer, dimension(:), allocatable :: lonref, latref + +!netcdf variables +integer ncid, dimid, varid, varidin(nvar) +integer ncidsib, varidsib(nvar) +integer status +integer timedid, landid +integer timeid, latid, lonid +integer yrid, monid, doyid, dayid, hrid +integer valuesid(nvar) +character(len=30) :: monunit, dayunit + +!misc variables +integer j,k,v +integer mon, yr +integer mystartmon, mystopmon +character(len=120) :: filename +character(len=20) :: varname_temp + +!--------------------------------------------------- +!Read in the SiB lat/lon information for land points +call check ( nf90_open( trim(sibfile), nf90_nowrite, ncid ) ) +print*,'' +print('(a)'),'Getting SiB Information: ' +print('(a,a)'),' ',trim(sibfile) +print*,'' + +call check ( nf90_inq_dimid( ncid, 'nsib', dimid ) ) +call check ( nf90_inquire_dimension( ncid, dimid, len=nsib ) ) + +allocate(lonsib(nsib), latsib(nsib)) +call check ( nf90_inq_varid( ncid, 'lonsib', varid ) ) +call check ( nf90_get_var( ncid, varid, lonsib ) ) + +call check ( nf90_inq_varid( ncid, 'latsib', varid ) ) +call check ( nf90_get_var( ncid, varid, latsib ) ) + +call check ( nf90_close(ncid) ) + +!Process the files: +DO yr=startyr, stopyr + mystartmon=1 + mystopmon=12 + if (yr .eq. startyr) mystartmon=startmon + if (yr .eq. stopyr) mystopmon=stopmon + + DO mon=mystartmon, mystopmon + + print('(a,a,a,i4)'), 'Processing ',monname(mon),' ',yr + + !Read in MERRA lat/lon + write(filename,'(a,a,i4.4,i2.2,a3)') & + trim(inputdir), trim(inprefix), yr, mon, '.nc' + print('(a)'),' Opening MERRA file: ' + print('(a,a)'),' ',trim(filename) + + call check ( nf90_open( trim(filename), nf90_nowrite, ncid ) ) + + IF ((yr .EQ. startyr) .AND. (mon .EQ. startmon)) THEN + call check ( nf90_inq_dimid( ncid, 'lon', dimid ) ) + call check ( nf90_inquire_dimension( ncid, dimid, len=nlon)) + call check ( nf90_inq_dimid( ncid, 'lat', dimid ) ) + call check ( nf90_inquire_dimension( ncid, dimid, len=nlat)) + + allocate(longitude(nlon),latitude(nlat)) + call check ( nf90_inq_varid( ncid, 'longitude', varid ) ) + call check ( nf90_get_var( ncid, varid, longitude ) ) + call check ( nf90_inq_varid( ncid, 'latitude', varid ) ) + call check ( nf90_get_var( ncid, varid, latitude ) ) + ENDIF + + call check ( nf90_inq_dimid( ncid, 'time', dimid ) ) + call check ( nf90_inquire_dimension( ncid, dimid, len=ntime ) ) + allocate(time(ntime)) + allocate(year(ntime), month(ntime), doy(ntime), & + day(ntime), hour(ntime)) + call check ( nf90_inq_varid( ncid, 'time', varid ) ) + call check ( nf90_get_var( ncid, varid, time ) ) + call check ( nf90_inq_varid( ncid, 'year', varid ) ) + call check ( nf90_get_var( ncid, varid, year ) ) + call check ( nf90_inq_varid( ncid, 'month', varid ) ) + call check ( nf90_get_var( ncid, varid, month ) ) + call check ( nf90_inq_varid( ncid, 'doy', varid ) ) + call check ( nf90_get_var( ncid, varid, doy)) + call check ( nf90_inq_varid( ncid, 'day', varid ) ) + call check ( nf90_get_var( ncid, varid, day ) ) + call check ( nf90_inq_varid( ncid, 'hour', varid ) ) + call check ( nf90_get_var( ncid, varid, hour ) ) + + allocate(values_temp(nlon,nlat,ntime)) + allocate(values(nvar,nlon,nlat,ntime)) + DO v=1,nvar + varname_temp = varname(v) + call check ( nf90_inq_varid( ncid, varname_temp, varidin(v) ) ) + call check ( nf90_get_var( ncid, varidin(v), values_temp) ) + values(v,:,:,:) = values_temp(:,:,:) + ENDDO + + !Calculate SiB4 points and references + IF ((yr .EQ. startyr) .AND. (mon .EQ. startmon)) THEN + allocate(lonref(nsib),latref(nsib)) + allocate(londiff(nlon),latdiff(nlat)) + + minlon=0. + minlat=0. + do j=1,nsib + londiff = abs(longitude-lonsib(j)) + latdiff = abs(latitude-latsib(j)) + minlon=minval(londiff) + minlat=minval(latdiff) + + do k=1,nlon + if (londiff(k) .eq. minlon) lonref(j)=k + enddo + do k=1,nlat + if (latdiff(k) .eq. minlat) latref(j)=k + enddo + enddo !nsib + ENDIF + + !Save the data on SiB gridpoints + allocate(valuessib_temp(nsib,ntime)) + allocate(valuessib(nvar,nsib,ntime)) + DO j=1,nsib + valuessib(:,j,:) = values(:,lonref(j),latref(j),:) + ENDDO !nsib + + !Write out data to netcdf file + write(filename,'(a,a,I4.4,I2.2,a3)') & + trim(outputdir), trim(outprefix), yr, mon, '.nc' + print('(a)'),' Writing output file: ' + print('(a,a)'),' ',trim(filename) + + call check ( nf90_create(trim(filename), nf90_64bit_offset, ncidsib) ) + call check ( nf90_def_dim(ncidsib, 'nsib', nsib, landid ) ) + call check ( nf90_def_dim(ncidsib, 'time', ntime, timedid) ) + + call check ( nf90_def_var(ncidsib, 'lonsib', nf90_float, & + (/landid/), lonid) ) + call check ( nf90_put_att(ncidsib,lonid,'long_name','Vector Longitude')) + call check ( nf90_put_att(ncidsib,lonid,'units','degrees_east')) + + call check ( nf90_def_var(ncidsib, 'latsib', nf90_float, & + (/landid/), latid) ) + call check ( nf90_put_att(ncidsib,latid,'long_name','Vector Latitude')) + call check ( nf90_put_att(ncidsib,latid,'units','degrees_north')) + + call check ( nf90_def_var(ncidsib, 'time', nf90_double, & + (/timedid/), timeid) ) + call check ( nf90_put_att(ncidsib,timeid,'long_name','Time')) + call check ( nf90_put_att(ncidsib,timeid,'units','years since 0000-00-00')) + + call check ( nf90_def_var(ncidsib, 'year', nf90_int, & + (/timedid/), yrid) ) + call check ( nf90_put_att(ncidsib,yrid,'long_name','Year')) + call check ( nf90_put_att(ncidsib,yrid,'units','year since 0000-00-00')) + + call check ( nf90_def_var(ncidsib, 'month', nf90_int, & + (/timedid/), monid) ) + write(monunit,'(a,i4,a)') & + 'month since ', yr, '-00-00' + call check ( nf90_put_att(ncidsib,monid,'long_name','Month')) + call check ( nf90_put_att(ncidsib,monid,'units',monunit) ) + + call check ( nf90_def_var(ncidsib, 'doy', nf90_int, & + (/timedid/), doyid) ) + write(dayunit,'(a,i4.4,a)') & + 'days since ', yr, '-00-00' + call check ( nf90_put_att(ncidsib,doyid,'long_name','Day Of Year')) + call check ( nf90_put_att(ncidsib,doyid,'units',dayunit)) + + call check ( nf90_def_var(ncidsib, 'day', nf90_int, & + (/timedid/), dayid) ) + write(dayunit,'(a,i4.4,a,i2.2,a)') & + 'days since ', yr, '-', mon, '-00' + call check ( nf90_put_att(ncidsib,dayid,'long_name','Day Of Month')) + call check ( nf90_put_att(ncidsib,dayid,'units',dayunit)) + + call check ( nf90_def_var(ncidsib, 'hour', nf90_float, & + (/timedid/), hrid) ) + call check ( nf90_put_att(ncidsib,hrid,'long_name','Hour')) + call check ( nf90_put_att(ncidsib,hrid,'units','hour of day (GMT)')) + + do j=1, nvar + varname_temp = varname(j) + call check ( nf90_def_var(ncidsib, trim(varname_temp), & + nf90_float, (/landid,timedid/), varidsib(j)) ) + call check ( nf90_copy_att(ncid, varidin(j), & + 'long_name', ncidsib, varidsib(j))) + call check ( nf90_copy_att(ncid, varidin(j), & + 'units', ncidsib, varidsib(j))) + status = nf90_copy_att(ncid, varidin(j), & + 'title', ncidsib, varidsib(j)) + enddo + + status = nf90_enddef(ncidsib) + + call check ( nf90_put_var(ncidsib, timeid, time) ) + call check ( nf90_put_var(ncidsib, lonid, lonsib) ) + call check ( nf90_put_var(ncidsib, latid, latsib) ) + call check ( nf90_put_var(ncidsib, yrid, year) ) + call check ( nf90_put_var(ncidsib, monid, month) ) + call check ( nf90_put_var(ncidsib, doyid, doy) ) + call check ( nf90_put_var(ncidsib, dayid, day) ) + call check ( nf90_put_var(ncidsib, hrid, hour) ) + + do j=1, nvar + valuessib_temp(:,:) = valuessib(j,:,:) + call check ( nf90_put_var(ncidsib, varidsib(j), valuessib_temp) ) + enddo + + call check ( nf90_close(ncid) ) + call check ( nf90_close(ncidsib) ) + + deallocate(time,year,month,doy,day,hour) + deallocate(values, values_temp) + deallocate(valuessib, valuessib_temp) + + enddo !mon +enddo !yr + +print('(a)'), 'Finished processing.' +print*,'' + +end program merra_pullsib + +!*********************************************************************** +!*********************************************************************** + +subroutine check(status) + +use netcdf +use typeSizes + +implicit none + +integer, intent(in) :: status + + if (status /= nf90_noerr) then + stop "Error with netcdf. Stopped." + endif + +end subroutine check diff --git a/preprocess/merra_pullsib_auto b/preprocess/merra_pullsib_auto new file mode 100755 index 0000000000000000000000000000000000000000..4c3e9965c9cad53ad2a83f9e7ad724afa1e08466 Binary files /dev/null and b/preprocess/merra_pullsib_auto differ diff --git a/preprocess/merra_pullsib_auto.f90 b/preprocess/merra_pullsib_auto.f90 new file mode 100644 index 0000000000000000000000000000000000000000..a58ee9553afb7b76253d5e99a7f22604468f7bf0 --- /dev/null +++ b/preprocess/merra_pullsib_auto.f90 @@ -0,0 +1,306 @@ +!Program to read in gridded MERRA monthly files (lonxlat), +!and write out monthly SiB driver files (nsib). +! +!To compile, use: +!>pgf90 merra_pullsib.f90 -L/usr/local/netcdf3-pgi/lib -lnetcdf -I/usr/local/netcdf3-pgi/include -o merra_pullsib +! +!-or- (if defined) +!>f90nc merra_pullsib.f90 +!>f90nco merra_pullsib.f90 merra_pullsib +! +!>-or- +!>make merra_pullsib +! +!kdhaynes, 01/2018 +! +program merra_pullsib + +use netcdf + +implicit none + +!!!!! user defined variables +integer, parameter :: startYr=2018, stopYr=2018 +integer, parameter :: startmon=1, stopmon=1 + +character(len=100), parameter :: inputdir='/projects/0/ctdas/awoude/NRT/input/' +character(len=6), parameter :: inprefix='merra_' + +character(len=100), parameter :: outputdir='/projects/0/ctdas/awoude/NRT/input/' +character(len=24), parameter :: outprefix='merra2_0.5deg_' + +character(len=100), parameter :: sibfile= & + '/projects/0/ctdas/sib4_input/vs/sib_vs_0.5deg.nc' + +!!!!! MERRA-specific parameters +integer, parameter :: nvar = 10 +character(len=12), parameter, dimension(nvar) :: & + varname = ['tm ','sh ','ps ', & + 'spdm ','swd ','lwd ', & + 'lspr ','cupr ','lspr_scaled ', & + 'cupr_scaled '] +character(len=3), parameter, dimension(12) :: & + monname = ['Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'] + +!input variables +integer :: nlon, nlat, ntime +real, dimension(:), allocatable :: longitude, latitude +real*8, dimension(:), allocatable :: time +integer, dimension(:), allocatable :: year, month, doy, day +real, dimension(:), allocatable :: hour +real, dimension(:,:,:), allocatable :: values_temp +real, dimension(:,:,:,:), allocatable :: values + +!output variables +integer :: nsib +real, dimension(:), allocatable :: lonsib, latsib +real, dimension(:,:), allocatable :: valuessib_temp +real, dimension(:,:,:), allocatable :: valuessib + +!comparison variables +real :: minlon, minlat +real, dimension(:), allocatable :: londiff, latdiff +integer, dimension(:), allocatable :: lonref, latref + +!netcdf variables +integer ncid, dimid, varid, varidin(nvar) +integer ncidsib, varidsib(nvar) +integer status +integer timedid, landid +integer timeid, latid, lonid +integer yrid, monid, doyid, dayid, hrid +integer valuesid(nvar) +character(len=30) :: monunit, dayunit + +!misc variables +integer j,k,v +integer mon, yr +integer mystartmon, mystopmon +character(len=120) :: filename +character(len=20) :: varname_temp + +!--------------------------------------------------- +!Read in the SiB lat/lon information for land points +call check ( nf90_open( trim(sibfile), nf90_nowrite, ncid ) ) +print*,'' +print('(a)'),'Getting SiB Information: ' +print('(a,a)'),' ',trim(sibfile) +print*,'' + +call check ( nf90_inq_dimid( ncid, 'nsib', dimid ) ) +call check ( nf90_inquire_dimension( ncid, dimid, len=nsib ) ) + +allocate(lonsib(nsib), latsib(nsib)) +call check ( nf90_inq_varid( ncid, 'lonsib', varid ) ) +call check ( nf90_get_var( ncid, varid, lonsib ) ) + +call check ( nf90_inq_varid( ncid, 'latsib', varid ) ) +call check ( nf90_get_var( ncid, varid, latsib ) ) + +call check ( nf90_close(ncid) ) + +!Process the files: +DO yr=startyr, stopyr + mystartmon=1 + mystopmon=1 + if (yr .eq. startyr) mystartmon=1 + if (yr .eq. stopyr) mystopmon=1 + + DO mon=mystartmon, mystopmon + + print('(a,a,a,i4)'), 'Processing ',monname(mon),' ',yr + + !Read in MERRA lat/lon + write(filename,'(a,a,i4.4,i2.2,a3)') & + trim(inputdir), trim(inprefix), yr, mon, '.nc' + print('(a)'),' Opening MERRA file: ' + print('(a,a)'),' ',trim(filename) + + call check ( nf90_open( trim(filename), nf90_nowrite, ncid ) ) + + IF ((yr .EQ. startyr) .AND. (mon .EQ. startmon)) THEN + call check ( nf90_inq_dimid( ncid, 'lon', dimid ) ) + call check ( nf90_inquire_dimension( ncid, dimid, len=nlon)) + call check ( nf90_inq_dimid( ncid, 'lat', dimid ) ) + call check ( nf90_inquire_dimension( ncid, dimid, len=nlat)) + + allocate(longitude(nlon),latitude(nlat)) + call check ( nf90_inq_varid( ncid, 'longitude', varid ) ) + call check ( nf90_get_var( ncid, varid, longitude ) ) + call check ( nf90_inq_varid( ncid, 'latitude', varid ) ) + call check ( nf90_get_var( ncid, varid, latitude ) ) + ENDIF + + call check ( nf90_inq_dimid( ncid, 'time', dimid ) ) + call check ( nf90_inquire_dimension( ncid, dimid, len=ntime ) ) + allocate(time(ntime)) + allocate(year(ntime), month(ntime), doy(ntime), & + day(ntime), hour(ntime)) + call check ( nf90_inq_varid( ncid, 'time', varid ) ) + call check ( nf90_get_var( ncid, varid, time ) ) + call check ( nf90_inq_varid( ncid, 'year', varid ) ) + call check ( nf90_get_var( ncid, varid, year ) ) + call check ( nf90_inq_varid( ncid, 'month', varid ) ) + call check ( nf90_get_var( ncid, varid, month ) ) + call check ( nf90_inq_varid( ncid, 'doy', varid ) ) + call check ( nf90_get_var( ncid, varid, doy)) + call check ( nf90_inq_varid( ncid, 'day', varid ) ) + call check ( nf90_get_var( ncid, varid, day ) ) + call check ( nf90_inq_varid( ncid, 'hour', varid ) ) + call check ( nf90_get_var( ncid, varid, hour ) ) + + allocate(values_temp(nlon,nlat,ntime)) + allocate(values(nvar,nlon,nlat,ntime)) + DO v=1,nvar + varname_temp = varname(v) + call check ( nf90_inq_varid( ncid, varname_temp, varidin(v) ) ) + call check ( nf90_get_var( ncid, varidin(v), values_temp) ) + values(v,:,:,:) = values_temp(:,:,:) + ENDDO + + !Calculate SiB4 points and references + IF ((yr .EQ. startyr) .AND. (mon .EQ. startmon)) THEN + allocate(lonref(nsib),latref(nsib)) + allocate(londiff(nlon),latdiff(nlat)) + + minlon=0. + minlat=0. + do j=1,nsib + londiff = abs(longitude-lonsib(j)) + latdiff = abs(latitude-latsib(j)) + minlon=minval(londiff) + minlat=minval(latdiff) + + do k=1,nlon + if (londiff(k) .eq. minlon) lonref(j)=k + enddo + do k=1,nlat + if (latdiff(k) .eq. minlat) latref(j)=k + enddo + enddo !nsib + ENDIF + + !Save the data on SiB gridpoints + allocate(valuessib_temp(nsib,ntime)) + allocate(valuessib(nvar,nsib,ntime)) + DO j=1,nsib + valuessib(:,j,:) = values(:,lonref(j),latref(j),:) + ENDDO !nsib + + !Write out data to netcdf file + write(filename,'(a,a,I4.4,I2.2,a3)') & + trim(outputdir), trim(outprefix), yr, mon, '.nc' + print('(a)'),' Writing output file: ' + print('(a,a)'),' ',trim(filename) + + call check ( nf90_create(trim(filename), nf90_64bit_offset, ncidsib) ) + call check ( nf90_def_dim(ncidsib, 'nsib', nsib, landid ) ) + call check ( nf90_def_dim(ncidsib, 'time', ntime, timedid) ) + + call check ( nf90_def_var(ncidsib, 'lonsib', nf90_float, & + (/landid/), lonid) ) + call check ( nf90_put_att(ncidsib,lonid,'long_name','Vector Longitude')) + call check ( nf90_put_att(ncidsib,lonid,'units','degrees_east')) + + call check ( nf90_def_var(ncidsib, 'latsib', nf90_float, & + (/landid/), latid) ) + call check ( nf90_put_att(ncidsib,latid,'long_name','Vector Latitude')) + call check ( nf90_put_att(ncidsib,latid,'units','degrees_north')) + + call check ( nf90_def_var(ncidsib, 'time', nf90_double, & + (/timedid/), timeid) ) + call check ( nf90_put_att(ncidsib,timeid,'long_name','Time')) + call check ( nf90_put_att(ncidsib,timeid,'units','years since 0000-00-00')) + + call check ( nf90_def_var(ncidsib, 'year', nf90_int, & + (/timedid/), yrid) ) + call check ( nf90_put_att(ncidsib,yrid,'long_name','Year')) + call check ( nf90_put_att(ncidsib,yrid,'units','year since 0000-00-00')) + + call check ( nf90_def_var(ncidsib, 'month', nf90_int, & + (/timedid/), monid) ) + write(monunit,'(a,i4,a)') & + 'month since ', yr, '-00-00' + call check ( nf90_put_att(ncidsib,monid,'long_name','Month')) + call check ( nf90_put_att(ncidsib,monid,'units',monunit) ) + + call check ( nf90_def_var(ncidsib, 'doy', nf90_int, & + (/timedid/), doyid) ) + write(dayunit,'(a,i4.4,a)') & + 'days since ', yr, '-00-00' + call check ( nf90_put_att(ncidsib,doyid,'long_name','Day Of Year')) + call check ( nf90_put_att(ncidsib,doyid,'units',dayunit)) + + call check ( nf90_def_var(ncidsib, 'day', nf90_int, & + (/timedid/), dayid) ) + write(dayunit,'(a,i4.4,a,i2.2,a)') & + 'days since ', yr, '-', mon, '-00' + call check ( nf90_put_att(ncidsib,dayid,'long_name','Day Of Month')) + call check ( nf90_put_att(ncidsib,dayid,'units',dayunit)) + + call check ( nf90_def_var(ncidsib, 'hour', nf90_float, & + (/timedid/), hrid) ) + call check ( nf90_put_att(ncidsib,hrid,'long_name','Hour')) + call check ( nf90_put_att(ncidsib,hrid,'units','hour of day (GMT)')) + + do j=1, nvar + varname_temp = varname(j) + call check ( nf90_def_var(ncidsib, trim(varname_temp), & + nf90_float, (/landid,timedid/), varidsib(j)) ) + call check ( nf90_copy_att(ncid, varidin(j), & + 'long_name', ncidsib, varidsib(j))) + call check ( nf90_copy_att(ncid, varidin(j), & + 'units', ncidsib, varidsib(j))) + status = nf90_copy_att(ncid, varidin(j), & + 'title', ncidsib, varidsib(j)) + enddo + + status = nf90_enddef(ncidsib) + + call check ( nf90_put_var(ncidsib, timeid, time) ) + call check ( nf90_put_var(ncidsib, lonid, lonsib) ) + call check ( nf90_put_var(ncidsib, latid, latsib) ) + call check ( nf90_put_var(ncidsib, yrid, year) ) + call check ( nf90_put_var(ncidsib, monid, month) ) + call check ( nf90_put_var(ncidsib, doyid, doy) ) + call check ( nf90_put_var(ncidsib, dayid, day) ) + call check ( nf90_put_var(ncidsib, hrid, hour) ) + + do j=1, nvar + valuessib_temp(:,:) = valuessib(j,:,:) + call check ( nf90_put_var(ncidsib, varidsib(j), valuessib_temp) ) + enddo + + call check ( nf90_close(ncid) ) + call check ( nf90_close(ncidsib) ) + + deallocate(time,year,month,doy,day,hour) + deallocate(values, values_temp) + deallocate(valuessib, valuessib_temp) + + enddo !mon +enddo !yr + +print('(a)'), 'Finished processing.' +print*,'' + +end program merra_pullsib + +!*********************************************************************** +!*********************************************************************** + +subroutine check(status) + +use netcdf +use typeSizes + +implicit none + +integer, intent(in) :: status + + if (status /= nf90_noerr) then + stop "Error with netcdf. Stopped." + endif + +end subroutine check diff --git a/preprocess/merra_pullsib_auto.o b/preprocess/merra_pullsib_auto.o new file mode 100644 index 0000000000000000000000000000000000000000..5c5c669b2214ea999bb58f9791a0d06f68b0979f Binary files /dev/null and b/preprocess/merra_pullsib_auto.o differ diff --git a/preprocess/merra_pullvar b/preprocess/merra_pullvar new file mode 100755 index 0000000000000000000000000000000000000000..26cbb58c8970407c756dcfacea5d4063ab07ec27 Binary files /dev/null and b/preprocess/merra_pullvar differ diff --git a/preprocess/merra_pullvar.f90 b/preprocess/merra_pullvar.f90 new file mode 100644 index 0000000000000000000000000000000000000000..81769821cd6502b3ff978c6e138a6a95027b09c1 --- /dev/null +++ b/preprocess/merra_pullvar.f90 @@ -0,0 +1,419 @@ +!Program to read in daily MERRA files in netcdf4, +!and to write out gridded driver files in netcdf4, +!including only the variables necessary for SiB. +! +!To compile, use: +!>f90nc4 merra_pullvar.f90 merra_pullvar +! +!kdhaynes, 11/16 +program merra_pullvar + +use netcdf +implicit none + +!!!!! user defined variables +integer, parameter :: startYr=2019, stopYr=2019 +integer, parameter :: startMon=8, stopMon=9 +character*100, parameter :: filedir='/scratch/shared/nsmith/merra_in/' +character*100, parameter :: outdir='/scratch/shared/nsmith/merra_proc/' +character*20, parameter :: outprefix='merra_' + +!!!!! MERRA defined variables for 2/3-degree by 1/2-degree hourly data +integer, parameter :: numtimesteps = 24 +integer, parameter :: lat = 361 +integer, parameter :: lon = 576 +integer, parameter :: startDay=1 +real, parameter :: startHr = 0.5 + +real, parameter :: initLon = -180.0 +real, parameter :: initLat = -90.0 + +character*30, parameter :: fname_flx = 'MERRA2_400.tavg1_2d_flx_Nx.' +character*30, parameter :: fname_rad = 'MERRA2_400.tavg1_2d_rad_Nx.' +character*30, parameter :: fname_slv = 'MERRA2_400.tavg1_2d_slv_Nx.' +character*4, parameter :: suffix = '.nc4' + +integer, parameter :: nvar_flx = 4 +integer, parameter :: nvar_rad = 3 +integer, parameter :: nvar_slv = 5 +integer, parameter :: nvar_out = 8 + +! file variables +character(len=100) filename +character(len=20), dimension(nvar_flx) :: varname_flx, units_flx +character(len=300), dimension(nvar_flx) :: description_flx +character(len=20), dimension(nvar_rad) :: varname_rad, units_rad +character(len=300), dimension(nvar_rad) :: description_rad +character(len=20), dimension(nvar_slv) :: varname_slv, units_slv +character(len=300), dimension(nvar_slv) :: description_slv +character(len=20), dimension(nvar_out) :: varname_out, units_out +character(len=300), dimension(nvar_out) :: description_out + +real*8, dimension(lon) :: longitudein +real*8, dimension(lat) :: latitudein +real*4, dimension(lon) :: longitude +real*4, dimension(lat) :: latitude +real, dimension(lon,lat,numtimesteps) :: valuesday +real, dimension(:,:,:,:), allocatable :: & + valuesmon_flx, valuesmon_rad, valuesmon_slv + +!output variables +real, dimension(:,:,:), allocatable :: valuesout_temp +real, dimension(:,:,:,:), allocatable :: valuesout + +!netcdf variables +integer ncid, dimid, varid +integer timedid, latdid, londid +integer timeid, latid, lonid +integer yrid, monid, doyid, dayid, hrid +integer varid_out(nvar_out) +integer status, dims(3) + + +!time variables +integer :: ntime +real timeinc,dayfrac +real*8, dimension(:), allocatable :: time +integer, dimension(:), allocatable :: & + timeyr, timemon, timeday, timedoy +real, dimension(:), allocatable :: timehr +integer, dimension(12) :: dayspermon, numdays +character*13, dimension(12) :: monnames + +!misc variables +integer j,k +integer yr, mon, day, var +integer count, countstart, countstop + +!!!!!data values +DATA varname_flx /'PRECLSC','PRECANV','PRECCON','PRECSNO'/ +DATA varname_rad /'ALBEDO','SWGDN','LWGAB'/ +DATA varname_slv /'T2M','QV2M','PS','U10M','V10M'/ + +DATA varname_out /'tm','sh','ps','spdm','lspr','cupr','swd','lwd'/ +DATA dayspermon /31,28,31,30,31,30,31,31,30,31,30,31/ +DATA monnames /'Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'/ +!!!!! + +!Set misc values +timeinc = numtimesteps/24. + +!Read in MERRA lat/lon +write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !startYr,'/', & + trim(fname_rad), startYr, startMon, startDay, suffix +!print*,'Opening MERRA file: ',trim(filename) + +status = nf90_open(trim(filename), nf90_nowrite, ncid) +if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,'File Name: ' + print*,' ',trim(filename) + print*,'Status: ',status + stop +endif +status = nf90_inq_varid(ncid,'lon',varid) +status = nf90_get_var(ncid,varid,longitudein) +status = nf90_inq_varid(ncid,'lat',varid) +status = nf90_get_var(ncid,varid,latitudein) +status = nf90_close(ncid) + + +!Process all specified years +valuesday=0. +print*,'' +do yr = startYr,stopYr + + numdays = dayspermon + if (mod(yr,4) == 0) numdays(2) = numdays(2) + 1 + + do mon = startMon, stopMon + + print('(a,a3,a,i4)'),'Processing ',monnames(mon),' ',yr + ntime = numtimesteps*numdays(mon) + allocate(valuesmon_flx(nvar_flx,lon,lat,ntime)) + allocate(valuesmon_rad(nvar_rad,lon,lat,ntime)) + allocate(valuesmon_slv(nvar_slv,lon,lat,ntime)) + + valuesmon_flx = 0. + valuesmon_rad = 0. + valuesmon_slv = 0. + + allocate(time(ntime),timeyr(ntime),timemon(ntime)) + allocate(timedoy(ntime),timeday(ntime),timehr(ntime)) + + time = 0. + timeyr = 0. + timemon = 0. + timedoy = 0. + timeday = 0. + timehr = 0. + + count=1 + do day = 1, numdays(mon) + + !Set time variables + countstart=count + do j=1, numtimesteps + timehr(countstart) = startHr + (j-1)*timeinc + timeyr(countstart) = yr + timemon(countstart) = mon + timeday(countstart) = day + if (mon .eq. 1) then + timedoy(countstart) = day + else + timedoy(countstart) = day + sum(dayspermon(1:mon-1)) + endif + dayfrac = timedoy(countstart) + timehr(countstart)/24. + timedoy(countstart) = dayfrac + time(countstart) = yr + dayfrac/(sum(numdays)) + + countstart = countstart+1 + enddo + countstart=count + countstop=count+numtimesteps-1 + + !Open flx file + write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !yr, '/', & + trim(fname_flx), yr, mon, day, suffix + !print*, 'READING: ', trim(filename) + + status = nf90_open(trim(filename),nf90_nowrite,ncid) + if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,' ',trim(filename) + print*,'Status: ',status + stop + endif + do var=1,nvar_flx + status = nf90_inq_varid(ncid, trim(varname_flx(var)), varid) + !get variable description and units only once + if (day .eq. 1) then + status = nf90_get_att(ncid,varid,'long_name',description_flx(var)) + status = nf90_get_att(ncid,varid,'units',units_flx(var)) + endif + status = nf90_get_var(ncid,varid,valuesday) + if (status < 0) then + print*,'Error reading flx data, status =', status + print*,var,trim(varname_flx(var)) + stop + endif + + valuesmon_flx(var,:,:,countstart:countstop) = & + valuesday(:,:,1:numtimesteps) + + enddo !var + status = nf90_close(ncid) + + !Open rad file + write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !yr, '/', & + trim(fname_rad), yr, mon, day, suffix + !print*,'READING: ',trim(filename) + + status = nf90_open(trim(filename), nf90_nowrite, ncid) + if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,' ',trim(filename) + print*,'Status: ',status + endif + do var=1,nvar_rad + status = nf90_inq_varid(ncid,trim(varname_rad(var)),varid) + + !get variable description and units only once + if (mon .eq. 1 .and. day .eq. 1) then + status = nf90_get_att(ncid,varid,'long_name',description_rad(var)) + status = nf90_get_att(ncid,varid,'units',units_rad(var)) + endif + status = nf90_get_var(ncid,varid,valuesday) + if (status < 0) then + print*,'Error reading rad data, status=',status + print*,var,trim(varname_rad(var)) + stop + endif + + valuesmon_rad(var,:,:,countstart:countstop) = & + valuesday(:,:,1:numtimesteps) + + enddo !var + status = nf90_close(ncid) + + !Open slv file + write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !yr, '/', & + trim(fname_slv), yr, mon, day, suffix + !print*,'READING: ', trim(filename) + + status = nf90_open(trim(filename),nf90_nowrite,ncid) + if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,' ',trim(filename) + print*,'Status: ',status + endif + do var=1,nvar_slv + status = nf90_inq_varid(ncid,trim(varname_slv(var)),varid) + + !get variable description and units only once + if (mon .eq. 1 .and. day .eq. 1) then + status = nf90_get_att(ncid,varid,'long_name',description_slv(var)) + status = nf90_get_att(ncid,varid,'units',units_slv(var)) + endif + status = nf90_get_var(ncid,varid,valuesday) + if (status < 0) then + print*,'Error reading slv data, status =',status + print*, var, trim(varname_slv(var)) + stop + endif + valuesmon_slv(var,:,:,countstart:countstop) = & + valuesday(:,:,1:numtimesteps) + + enddo !var + status = nf90_close(ncid) + + count = count + numtimesteps + enddo !day + + !Save the gridded data + allocate(valuesout_temp(lon,lat,ntime)) + allocate(valuesout(nvar_out,lon,lat,ntime)) + + units_out(1) = 'K' + description_out(1) = description_slv(1) + units_out(2) = 'kg/kg' + description_out(2) = description_slv(2) + units_out(3) = 'mb' + description_out(3) = description_slv(3) + units_out(4) = 'm/s' + description_out(4) = 'Wind Speed at 10 m' + units_out(5) = 'mm/s' + description_out(5) = 'Large Scale Precipitation (with snow)' + units_out(6) = 'mm/s' + description_out(6) = 'Convective Precipitation' + units_out(7) = 'W/m2' + description_out(7) = 'Surface solar radiation downwards' + units_out(8) = 'W/m2' + description_out(8) = 'Surface thermal radiation downwards' + + valuesout(1,:,:,:) = valuesmon_slv(1,:,:,:) + valuesout(2,:,:,:) = valuesmon_slv(2,:,:,:) + !convert pressure from Pa to mb + valuesout(3,:,:,:) = valuesmon_slv(3,:,:,:)/100. + !calculate wind from components + valuesout(4,:,:,:) = SQRT( & + valuesmon_slv(4,:,:,:)*valuesmon_slv(4,:,:,:) + & + valuesmon_slv(5,:,:,:)*valuesmon_slv(5,:,:,:)) + !combine large scale and snow precipitation + valuesout(5,:,:,:) = valuesmon_flx(1,:,:,:) + & + valuesmon_flx(4,:,:,:) + !combine convective and anvil precipitation + valuesout(6,:,:,:) = valuesmon_flx(2,:,:,:) + & + valuesmon_flx(3,:,:,:) + valuesout(7,:,:,:) = valuesmon_rad(2,:,:,:) + !...if necessary, calculate net downward shortwave radiation + !...by dividing by (1.-albedo) + !valuesout(7,j,:) = valuesmon_rad(2,lonref(j),latref(j),:) / & + ! (1-valuesmon_rad(1,lonref(j),latref(j),:)) + valuesout(8,:,:,:) = valuesmon_rad(3,:,:,:) + + !Write out data to netcdf file + write(filename,'(a,a,I4.4,I2.2,a3)') & + trim(outdir), trim(outprefix), yr, mon, '.nc' + print*,'Writing output file: ',trim(filename) + + call check ( nf90_create(trim(filename), & + nf90_64bit_offset, ncid) ) + + call check ( nf90_def_dim(ncid,'lon',lon,londid)) + call check ( nf90_def_dim(ncid,'lat',lat,latdid)) + call check ( nf90_def_dim(ncid, 'time', ntime, timedid) ) + + call check ( nf90_def_var(ncid, 'longitude', nf90_float, & + (/londid/), lonid) ) + call check ( nf90_def_var(ncid, 'latitude', nf90_float, & + (/latdid/), latid) ) + call check ( nf90_def_var(ncid, 'time', nf90_double, & + (/timedid/), timeid)) + + call check ( nf90_def_var(ncid, 'year', nf90_int, & + (/timedid/), yrid) ) + call check ( nf90_def_var(ncid, 'month', nf90_int, & + (/timedid/), monid) ) + call check ( nf90_def_var(ncid, 'doy', nf90_int, & + (/timedid/), doyid) ) + + call check ( nf90_def_var(ncid, 'day', nf90_int, & + (/timedid/), dayid) ) + call check ( nf90_def_var(ncid, 'hour', nf90_float, & + (/timedid/), hrid) ) + + dims(1) = londid + dims(2) = latdid + dims(3) = timedid + + do j=1, nvar_out + call check ( nf90_def_var(ncid, trim(varname_out(j)), & + nf90_float, dims, varid_out(j)) ) + call check ( nf90_put_att(ncid, varid_out(j), & + 'long_name', trim(description_out(j))) ) + call check ( nf90_put_att(ncid, varid_out(j), & + 'units',trim(units_out(j))) ) + call check ( nf90_put_att(ncid, varid_out(j), & + 'missing_value', 1.e15) ) + call check ( nf90_put_att(ncid, varid_out(j), & + '_FillValue', 1.e15) ) + enddo + + call check ( nf90_enddef(ncid) ) + + longitude=longitudein + call check ( nf90_put_var(ncid, lonid, longitude) ) + + latitude=latitudein + call check ( nf90_put_var(ncid, latid, latitude) ) + + call check ( nf90_put_var(ncid, timeid, time)) + call check ( nf90_put_var(ncid, yrid, timeyr) ) + call check ( nf90_put_var(ncid, monid, timemon) ) + call check ( nf90_put_var(ncid, doyid, timedoy) ) + call check ( nf90_put_var(ncid, dayid, timeday) ) + call check ( nf90_put_var(ncid, hrid, timehr) ) + + do j=1, nvar_out + valuesout_temp(:,:,:) = valuesout(j,:,:,:) + call check ( nf90_put_var(ncid, varid_out(j), valuesout_temp) ) + enddo + + call check ( nf90_close(ncid) ) + + deallocate(valuesmon_flx, valuesmon_rad, valuesmon_slv) + deallocate(time,timeyr,timemon,timedoy,timeday,timehr) + deallocate(valuesout,valuesout_temp) + + enddo !mon +enddo !yr + +print*,'Finished Processing' +print*,'' + +end program merra_pullvar + +!*********************************************************************** +!*********************************************************************** + +subroutine check(status) + +use netcdf +use typeSizes + +implicit none + +integer, intent(in) :: status + + if (status /= nf90_noerr) then + stop "Error with netcdf. Stopped." + endif + +end subroutine check + diff --git a/preprocess/merra_pullvar_auto b/preprocess/merra_pullvar_auto new file mode 100755 index 0000000000000000000000000000000000000000..07e0f0712447bc5abcf1eda76234def4e1d20a4f Binary files /dev/null and b/preprocess/merra_pullvar_auto differ diff --git a/preprocess/merra_pullvar_auto.f90 b/preprocess/merra_pullvar_auto.f90 new file mode 100644 index 0000000000000000000000000000000000000000..49e3805e5cef717ea9bc1c543670e611ace098a1 --- /dev/null +++ b/preprocess/merra_pullvar_auto.f90 @@ -0,0 +1,419 @@ +!Program to read in daily MERRA files in netcdf4, +!and to write out gridded driver files in netcdf4, +!including only the variables necessary for SiB. +! +!To compile, use: +!>f90nc4 merra_pullvar.f90 merra_pullvar +! +!kdhaynes, 11/16 +program merra_pullvar + +use netcdf +implicit none + +!!!!! user defined variables +integer, parameter :: startYr=2018, stopYr=2018 +integer, parameter :: startMon=1, stopMon=1 +character*100, parameter :: filedir='/scratch/shared/awoude//MERRA/' +character*100, parameter :: outdir='/projects/0/ctdas/awoude/NRT/input/' +character*20, parameter :: outprefix='merra_' + +!!!!! MERRA defined variables for 2/3-degree by 1/2-degree hourly data +integer, parameter :: numtimesteps = 24 +integer, parameter :: lat = 361 +integer, parameter :: lon = 576 +integer, parameter :: startDay=1 +real, parameter :: startHr = 0.5 + +real, parameter :: initLon = -180.0 +real, parameter :: initLat = -90.0 + +character*30, parameter :: fname_flx = 'MERRA2_400.tavg1_2d_flx_Nx.' +character*30, parameter :: fname_rad = 'MERRA2_400.tavg1_2d_rad_Nx.' +character*30, parameter :: fname_slv = 'MERRA2_400.tavg1_2d_slv_Nx.' +character*4, parameter :: suffix = '.nc4' + +integer, parameter :: nvar_flx = 4 +integer, parameter :: nvar_rad = 3 +integer, parameter :: nvar_slv = 5 +integer, parameter :: nvar_out = 8 + +! file variables +character(len=100) filename +character(len=20), dimension(nvar_flx) :: varname_flx, units_flx +character(len=300), dimension(nvar_flx) :: description_flx +character(len=20), dimension(nvar_rad) :: varname_rad, units_rad +character(len=300), dimension(nvar_rad) :: description_rad +character(len=20), dimension(nvar_slv) :: varname_slv, units_slv +character(len=300), dimension(nvar_slv) :: description_slv +character(len=20), dimension(nvar_out) :: varname_out, units_out +character(len=300), dimension(nvar_out) :: description_out + +real*8, dimension(lon) :: longitudein +real*8, dimension(lat) :: latitudein +real*4, dimension(lon) :: longitude +real*4, dimension(lat) :: latitude +real, dimension(lon,lat,numtimesteps) :: valuesday +real, dimension(:,:,:,:), allocatable :: & + valuesmon_flx, valuesmon_rad, valuesmon_slv + +!output variables +real, dimension(:,:,:), allocatable :: valuesout_temp +real, dimension(:,:,:,:), allocatable :: valuesout + +!netcdf variables +integer ncid, dimid, varid +integer timedid, latdid, londid +integer timeid, latid, lonid +integer yrid, monid, doyid, dayid, hrid +integer varid_out(nvar_out) +integer status, dims(3) + + +!time variables +integer :: ntime +real timeinc,dayfrac +real*8, dimension(:), allocatable :: time +integer, dimension(:), allocatable :: & + timeyr, timemon, timeday, timedoy +real, dimension(:), allocatable :: timehr +integer, dimension(12) :: dayspermon, numdays +character*13, dimension(12) :: monnames + +!misc variables +integer j,k +integer yr, mon, day, var +integer count, countstart, countstop + +!!!!!data values +DATA varname_flx /'PRECLSC','PRECANV','PRECCON','PRECSNO'/ +DATA varname_rad /'ALBEDO','SWGDN','LWGAB'/ +DATA varname_slv /'T2M','QV2M','PS','U10M','V10M'/ + +DATA varname_out /'tm','sh','ps','spdm','lspr','cupr','swd','lwd'/ +DATA dayspermon /31,28,31,30,31,30,31,31,30,31,30,31/ +DATA monnames /'Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'/ +!!!!! + +!Set misc values +timeinc = numtimesteps/24. + +!Read in MERRA lat/lon +write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !startYr,'/', & + trim(fname_rad), startYr, startMon, startDay, suffix +!print*,'Opening MERRA file: ',trim(filename) + +status = nf90_open(trim(filename), nf90_nowrite, ncid) +if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,'File Name: ' + print*,' ',trim(filename) + print*,'Status: ',status + stop +endif +status = nf90_inq_varid(ncid,'lon',varid) +status = nf90_get_var(ncid,varid,longitudein) +status = nf90_inq_varid(ncid,'lat',varid) +status = nf90_get_var(ncid,varid,latitudein) +status = nf90_close(ncid) + + +!Process all specified years +valuesday=0. +print*,'' +do yr = startYr,stopYr + + numdays = dayspermon + if (mod(yr,4) == 0) numdays(2) = numdays(2) + 1 + + do mon = startMon, stopMon + + print('(a,a3,a,i4)'),'Processing ',monnames(mon),' ',yr + ntime = numtimesteps*numdays(mon) + allocate(valuesmon_flx(nvar_flx,lon,lat,ntime)) + allocate(valuesmon_rad(nvar_rad,lon,lat,ntime)) + allocate(valuesmon_slv(nvar_slv,lon,lat,ntime)) + + valuesmon_flx = 0. + valuesmon_rad = 0. + valuesmon_slv = 0. + + allocate(time(ntime),timeyr(ntime),timemon(ntime)) + allocate(timedoy(ntime),timeday(ntime),timehr(ntime)) + + time = 0. + timeyr = 0. + timemon = 0. + timedoy = 0. + timeday = 0. + timehr = 0. + + count=1 + do day = 1, numdays(mon) + + !Set time variables + countstart=count + do j=1, numtimesteps + timehr(countstart) = startHr + (j-1)*timeinc + timeyr(countstart) = yr + timemon(countstart) = mon + timeday(countstart) = day + if (mon .eq. 1) then + timedoy(countstart) = day + else + timedoy(countstart) = day + sum(dayspermon(1:mon-1)) + endif + dayfrac = timedoy(countstart) + timehr(countstart)/24. + timedoy(countstart) = dayfrac + time(countstart) = yr + dayfrac/(sum(numdays)) + + countstart = countstart+1 + enddo + countstart=count + countstop=count+numtimesteps-1 + + !Open flx file + write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !yr, '/', & + trim(fname_flx), yr, mon, day, suffix + !print*, 'READING: ', trim(filename) + + status = nf90_open(trim(filename),nf90_nowrite,ncid) + if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,' ',trim(filename) + print*,'Status: ',status + stop + endif + do var=1,nvar_flx + status = nf90_inq_varid(ncid, trim(varname_flx(var)), varid) + !get variable description and units only once + if (day .eq. 1) then + status = nf90_get_att(ncid,varid,'long_name',description_flx(var)) + status = nf90_get_att(ncid,varid,'units',units_flx(var)) + endif + status = nf90_get_var(ncid,varid,valuesday) + if (status < 0) then + print*,'Error reading flx data, status =', status + print*,var,trim(varname_flx(var)) + stop + endif + + valuesmon_flx(var,:,:,countstart:countstop) = & + valuesday(:,:,1:numtimesteps) + + enddo !var + status = nf90_close(ncid) + + !Open rad file + write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !yr, '/', & + trim(fname_rad), yr, mon, day, suffix + !print*,'READING: ',trim(filename) + + status = nf90_open(trim(filename), nf90_nowrite, ncid) + if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,' ',trim(filename) + print*,'Status: ',status + endif + do var=1,nvar_rad + status = nf90_inq_varid(ncid,trim(varname_rad(var)),varid) + + !get variable description and units only once + if (mon .eq. 1 .and. day .eq. 1) then + status = nf90_get_att(ncid,varid,'long_name',description_rad(var)) + status = nf90_get_att(ncid,varid,'units',units_rad(var)) + endif + status = nf90_get_var(ncid,varid,valuesday) + if (status < 0) then + print*,'Error reading rad data, status=',status + print*,var,trim(varname_rad(var)) + stop + endif + + valuesmon_rad(var,:,:,countstart:countstop) = & + valuesday(:,:,1:numtimesteps) + + enddo !var + status = nf90_close(ncid) + + !Open slv file + write(filename,'(a,a,i4.4,2i2.2,a)') & + trim(filedir), & !yr, '/', & + trim(fname_slv), yr, mon, day, suffix + !print*,'READING: ', trim(filename) + + status = nf90_open(trim(filename),nf90_nowrite,ncid) + if (status .ne. nf90_noerr) then + print*,'Error Opening File.' + print*,' ',trim(filename) + print*,'Status: ',status + endif + do var=1,nvar_slv + status = nf90_inq_varid(ncid,trim(varname_slv(var)),varid) + + !get variable description and units only once + if (mon .eq. 1 .and. day .eq. 1) then + status = nf90_get_att(ncid,varid,'long_name',description_slv(var)) + status = nf90_get_att(ncid,varid,'units',units_slv(var)) + endif + status = nf90_get_var(ncid,varid,valuesday) + if (status < 0) then + print*,'Error reading slv data, status =',status + print*, var, trim(varname_slv(var)) + stop + endif + valuesmon_slv(var,:,:,countstart:countstop) = & + valuesday(:,:,1:numtimesteps) + + enddo !var + status = nf90_close(ncid) + + count = count + numtimesteps + enddo !day + + !Save the gridded data + allocate(valuesout_temp(lon,lat,ntime)) + allocate(valuesout(nvar_out,lon,lat,ntime)) + + units_out(1) = 'K' + description_out(1) = description_slv(1) + units_out(2) = 'kg/kg' + description_out(2) = description_slv(2) + units_out(3) = 'mb' + description_out(3) = description_slv(3) + units_out(4) = 'm/s' + description_out(4) = 'Wind Speed at 10 m' + units_out(5) = 'mm/s' + description_out(5) = 'Large Scale Precipitation (with snow)' + units_out(6) = 'mm/s' + description_out(6) = 'Convective Precipitation' + units_out(7) = 'W/m2' + description_out(7) = 'Surface solar radiation downwards' + units_out(8) = 'W/m2' + description_out(8) = 'Surface thermal radiation downwards' + + valuesout(1,:,:,:) = valuesmon_slv(1,:,:,:) + valuesout(2,:,:,:) = valuesmon_slv(2,:,:,:) + !convert pressure from Pa to mb + valuesout(3,:,:,:) = valuesmon_slv(3,:,:,:)/100. + !calculate wind from components + valuesout(4,:,:,:) = SQRT( & + valuesmon_slv(4,:,:,:)*valuesmon_slv(4,:,:,:) + & + valuesmon_slv(5,:,:,:)*valuesmon_slv(5,:,:,:)) + !combine large scale and snow precipitation + valuesout(5,:,:,:) = valuesmon_flx(1,:,:,:) + & + valuesmon_flx(4,:,:,:) + !combine convective and anvil precipitation + valuesout(6,:,:,:) = valuesmon_flx(2,:,:,:) + & + valuesmon_flx(3,:,:,:) + valuesout(7,:,:,:) = valuesmon_rad(2,:,:,:) + !...if necessary, calculate net downward shortwave radiation + !...by dividing by (1.-albedo) + !valuesout(7,j,:) = valuesmon_rad(2,lonref(j),latref(j),:) / & + ! (1-valuesmon_rad(1,lonref(j),latref(j),:)) + valuesout(8,:,:,:) = valuesmon_rad(3,:,:,:) + + !Write out data to netcdf file + write(filename,'(a,a,I4.4,I2.2,a3)') & + trim(outdir), trim(outprefix), yr, mon, '.nc' + print*,'Writing output file: ',trim(filename) + + call check ( nf90_create(trim(filename), & + nf90_64bit_offset, ncid) ) + + call check ( nf90_def_dim(ncid,'lon',lon,londid)) + call check ( nf90_def_dim(ncid,'lat',lat,latdid)) + call check ( nf90_def_dim(ncid, 'time', ntime, timedid) ) + + call check ( nf90_def_var(ncid, 'longitude', nf90_float, & + (/londid/), lonid) ) + call check ( nf90_def_var(ncid, 'latitude', nf90_float, & + (/latdid/), latid) ) + call check ( nf90_def_var(ncid, 'time', nf90_double, & + (/timedid/), timeid)) + + call check ( nf90_def_var(ncid, 'year', nf90_int, & + (/timedid/), yrid) ) + call check ( nf90_def_var(ncid, 'month', nf90_int, & + (/timedid/), monid) ) + call check ( nf90_def_var(ncid, 'doy', nf90_int, & + (/timedid/), doyid) ) + + call check ( nf90_def_var(ncid, 'day', nf90_int, & + (/timedid/), dayid) ) + call check ( nf90_def_var(ncid, 'hour', nf90_float, & + (/timedid/), hrid) ) + + dims(1) = londid + dims(2) = latdid + dims(3) = timedid + + do j=1, nvar_out + call check ( nf90_def_var(ncid, trim(varname_out(j)), & + nf90_float, dims, varid_out(j)) ) + call check ( nf90_put_att(ncid, varid_out(j), & + 'long_name', trim(description_out(j))) ) + call check ( nf90_put_att(ncid, varid_out(j), & + 'units',trim(units_out(j))) ) + call check ( nf90_put_att(ncid, varid_out(j), & + 'missing_value', 1.e15) ) + call check ( nf90_put_att(ncid, varid_out(j), & + '_FillValue', 1.e15) ) + enddo + + call check ( nf90_enddef(ncid) ) + + longitude=longitudein + call check ( nf90_put_var(ncid, lonid, longitude) ) + + latitude=latitudein + call check ( nf90_put_var(ncid, latid, latitude) ) + + call check ( nf90_put_var(ncid, timeid, time)) + call check ( nf90_put_var(ncid, yrid, timeyr) ) + call check ( nf90_put_var(ncid, monid, timemon) ) + call check ( nf90_put_var(ncid, doyid, timedoy) ) + call check ( nf90_put_var(ncid, dayid, timeday) ) + call check ( nf90_put_var(ncid, hrid, timehr) ) + + do j=1, nvar_out + valuesout_temp(:,:,:) = valuesout(j,:,:,:) + call check ( nf90_put_var(ncid, varid_out(j), valuesout_temp) ) + enddo + + call check ( nf90_close(ncid) ) + + deallocate(valuesmon_flx, valuesmon_rad, valuesmon_slv) + deallocate(time,timeyr,timemon,timedoy,timeday,timehr) + deallocate(valuesout,valuesout_temp) + + enddo !mon +enddo !yr + +print*,'Finished Processing' +print*,'' + +end program merra_pullvar + +!*********************************************************************** +!*********************************************************************** + +subroutine check(status) + +use netcdf +use typeSizes + +implicit none + +integer, intent(in) :: status + + if (status /= nf90_noerr) then + stop "Error with netcdf. Stopped." + endif + +end subroutine check + diff --git a/preprocess/merra_pullvar_auto.o b/preprocess/merra_pullvar_auto.o new file mode 100644 index 0000000000000000000000000000000000000000..77c6c477814a2ececfb95bee519a8b2c6e90a646 Binary files /dev/null and b/preprocess/merra_pullvar_auto.o differ diff --git a/preprocess/proc_merra2_ges_disc.sh b/preprocess/proc_merra2_ges_disc.sh new file mode 100755 index 0000000000000000000000000000000000000000..1bb0441784a6516b551ba18f57b7b6f140f509d0 --- /dev/null +++ b/preprocess/proc_merra2_ges_disc.sh @@ -0,0 +1,180 @@ +#!/bin/sh +#------------------------------------------------------------------------------ +# NASA/GSFC, Computational and Information Science and Technology Office, +# Code 606 +#------------------------------------------------------------------------------ +# +# SCRIPT: proc_merra2_ges_disc.sh +# +# AUTHOR: +# Eric Kemp, NASA CISTO/SSAI +# +# DESCRIPTION: +# Script for fetching MERRA2 data from NASA GES DISC web site for use by +# MERRA2WRF. Requires wget utility and Get_dates_daily.py script. Based on +# Jossy Jacob's Run_MERRA2.csh script. +# +# REVISION HISTORY: +# 18 Sep 2015 - First version. +# +#------------------------------------------------------------------------------ + +# Process command line arguments. +if [ "$#" -ne 4 ] ; then + echo 'Usage: proc_merra2_ges_disc.sh STARTDATE ENDDATE RUNDIR NUWRFDIR' + echo 'Example: ./proc_merra2_ges_disc.sh 19890101 19890104 MERRA_data /path/to/nuwrf' + exit 1 +fi +STARTDATE=$1 +ENDDATE=$2 +RUNDIR=$3 +NUWRFDIR=$4 + +# Set WORKDIR and ensure it is an absolute path. Create directory and +# subdirectories as needed. +WORKDIR="$RUNDIR" +if [ ! -e $WORKDIR ] ; then + mkdir $WORKDIR || exit 1 +fi +cd $WORKDIR +WORKDIR=`pwd` # Absolute path. +if [ ! -e $WORKDIR/m2wIn ] ; then + mkdir $WORKDIR/m2wIn || exit 1 +fi +if [ ! -e $WORKDIR/m2wOut ] ; then + mkdir $WORKDIR/m2wOut || exit 1 +fi + +# Link executables from NUWRFDIR +#ln -fs $NUWRFDIR/utils/geos2wrf_2/merra2wrf $WORKDIR/merra2wrf || exit 1 +ln -fs $NUWRFDIR/merra2wrf $WORKDIR/merra2wrf || exit 1 +if [ ! -e $WORKDIR/merra2wrf ] ; then + echo Line 52 + echo "ERROR, $WORKDIR/merra2wrf does not exist!" + exit 1 +fi +ln -fs $NUWRFDIR/RUN_MERRA2/Get_dates_daily.py \ + $WORKDIR/Get_dates_daily.py || exit 1 +if [ ! -e $WORKDIR/Get_dates_daily.py ] ; then + echo "ERROR, $WORKDIR/Get_dates_daily.py does not exist!" + exit 1 +fi + +# Construct list of dates. +cd $WORKDIR || exit 1 +DT=1 # Day +$WORKDIR/Get_dates_daily.py $STARTDATE $ENDDATE $DT || exit 1 +if [ ! -e "$WORKDIR/Datetime.dat" ] ; then + echo "ERROR, Datetime.dat not generated!" + exit 1 +fi + +# Get const_2d_asm_Nx file. This is used for all dates. +cd $WORKDIR/m2wIn || exit 1 +# Updated 21 March 2016 +#file1=MERRA2_100.const_2d_asm_Nx.00000000.nc4 +file1=MERRA2_101.const_2d_asm_Nx.00000000.nc4 +if [ ! -e "$file1" ] ; then + WEBSITE=http://goldsmr4.gesdisc.eosdis.nasa.gov/ + path=data/s4pa/MERRA2_MONTHLY/M2C0NXASM.5.12.4/1980/$file1 + wget $WEBSITE/$path || exit 1 +fi + +# Loop through the dates, fetch date specific files, and run MERRA2WRF. +for date in $(cat $WORKDIR/Datetime.dat) ; do + + YEAR=`echo $date | cut -c1-4` + MONTH=`echo $date | cut -c5-6` + DAY=`echo $date | cut -c7-8` + + # File prefix depends on MERRA2 "data stream" which depends on year. + if [ "$YEAR" -lt 1992 ] ; then + MERRANAME="MERRA2_100" + elif [ "$YEAR" -lt 2001 ] ; then + MERRANAME="MERRA2_200" + elif [ "$YEAR" -lt 2011 ] ; then + MERRANAME="MERRA2_300" + else + MERRANAME="MERRA2_400" + fi + + # Get inst6_3d_ana_Nv file. + echo Get inst6_3d_ana_Nv file.\n + file2=$MERRANAME.inst6_3d_ana_Nv.$YEAR$MONTH$DAY.nc4 + if [ ! -e "$file2" ] ; then + WEBSITE=http://goldsmr5.gesdisc.eosdis.nasa.gov/ + path=data/MERRA2/M2I6NVANA.5.12.4/$YEAR/$MONTH/$file2 + wget $WEBSITE/$path || exit 1 + fi + + # Get inst6_3d_ana_Np file. + echo Get inst6_3d_ana_Np file.\n + file3=$MERRANAME.inst6_3d_ana_Np.$YEAR$MONTH$DAY.nc4 + if [ ! -e "$file3" ] ; then + WEBSITE=http://goldsmr5.gesdisc.eosdis.nasa.gov/ + path=data/MERRA2/M2I6NPANA.5.12.4/$YEAR/$MONTH/$file3 + wget $WEBSITE/$path || exit 1 + fi + + # Get tavg1_2d_slv_Nx file. + echo Get tavg1_2d_slv_Nx file.\n + file4=$MERRANAME.tavg1_2d_slv_Nx.$YEAR$MONTH$DAY.nc4 + if [ ! -e "$file4" ] ; then + WEBSITE=http://goldsmr4.gesdisc.eosdis.nasa.gov/ + path=data/MERRA2/M2T1NXSLV.5.12.4/$YEAR/$MONTH/$file4 + wget $WEBSITE/$path || exit 1 + fi + + # Get tavg1_2d_ocn_Nx file. + echo Get tavg1_2d_ocn_Nx file.\n + file5=$MERRANAME.tavg1_2d_ocn_Nx.$YEAR$MONTH$DAY.nc4 + if [ ! -e "$file5" ] ; then + WEBSITE=http://goldsmr4.gesdisc.eosdis.nasa.gov + path=data/MERRA2/M2T1NXOCN.5.12.4/$YEAR/$MONTH/$file5 + wget $WEBSITE/$path || exit 1 + fi + + MERRADATE="$YEAR-$MONTH-$DAY" + MERRADATE2="$YEAR$MONTH$DAY" + + # Now run MERRA2WRF for the collected data. + cd $WORKDIR || exit 1 + cat > namelist.merra2wrf_daily <<EOF +&input + outputDirectory = '$WORKDIR/m2wOut', + merraDirectory = '$WORKDIR/m2wIn', + merraFormat_const_2d_asm_Nx = 2, + merraFile_const_2d_asm_Nx = '$file1', + numberOfDays=1, + merraDates(1)="$MERRADATE", + merraFormat_inst6_3d_ana_Nv = 2, + merraFiles_inst6_3d_ana_Nv(1) = '$file2', + merraFormat_inst6_3d_ana_Np = 2, + merraFiles_inst6_3d_ana_Np(1) = '$file3', + merraFormat_tavg1_2d_slv_Nx = 2, + merraFiles_tavg1_2d_slv_Nx(1) = '$file4', + merraFormat_tavg1_2d_ocn_Nx = 2, + merraFiles_tavg1_2d_ocn_Nx(1) = '$file5', +/ +EOF + $WORKDIR/merra2wrf namelist.merra2wrf_daily || exit 1 + + # Daily file cleanup. + rm $WORKDIR/m2wIn/$file2 + rm $WORKDIR/m2wIn/$file3 + rm $WORKDIR/m2wIn/$file4 + rm $WORKDIR/m2wIn/$file5 + + cd $WORKDIR/m2wIn || exit 1 + +done + +# Final file cleanup. +rm $WORKDIR/m2wIn/$file1 + +# The End. +echo "MERRA2WRF output files are in $WORKDIR/m2wOut" +echo "Completed MERRA2 processing" +exit 0 + + diff --git a/preprocess/scale_merra b/preprocess/scale_merra new file mode 100755 index 0000000000000000000000000000000000000000..2d1e7c0a2b8d01c7afd60a2cba05dc26d0043b25 Binary files /dev/null and b/preprocess/scale_merra differ diff --git a/preprocess/scale_merra_gpcp.f90 b/preprocess/scale_merra_gpcp.f90 new file mode 100644 index 0000000000000000000000000000000000000000..421343e6cdc20e76be3db50013ab765b5b37d3d6 --- /dev/null +++ b/preprocess/scale_merra_gpcp.f90 @@ -0,0 +1,388 @@ +!Program to change the precipitation values for the SiB driver files +!and scale them to GPCP precipitation. +! +!Program finds the ratio between the MERRA and GPCP precipitation +!and multiplies by this ratio to 'scale' the precip. +! +!MERRA precip units assumed to be mm/s, with hourly data +!GPCP precip units assumed to be mm/month, with monthly data +! --Expects GPCP to be regridded to MERRA resolution!! +! +!Program will not change the timing nor 'create' precip in MERRA. +! +!NOTE: This will actually change the netcdf file! +! +!To compile, use: +!>pgf90 scale_merra_gpcp.f90 -L/usr/local/netcdf3-pgi/lib -lnetcdf -I/usr/local/netcdf3-pgi/include -o scale_merra_gpcp +! +!-or- (if defined) +!>f90nc scale_merra_gpcp.f90 +!>f90nco scale_merra_gpcp.f90 scale_merra_gpcp +! +!-or- +!>make scale_merra_gpcp +! +!kdhaynes, 01/2018 + +program scale_merra_gpcp + +use netcdf +implicit none + +!!!user defined variables +integer, parameter :: startYr=2019, stopYr=2019 +integer, parameter :: startMon=8, stopMon=12 + +!.....GPCP v2.3 +!.....(2.5-degree, monthly, units of mm/day) +character*180, parameter :: & + gpcpfile='/projects/0/ctdas/sib4_input/meteo/gpcp/gpcp_0.625dx0.5d_tot.nc' + +!....MERRA-2 +character*100, parameter :: & + merradir='/scratch/shared/nsmith/merra_proc/' +character*20, parameter :: & + merraprefix='merra_' + +!!!other MERRA parameters +!!!assuming 2/3-degree lon by 1/2-degree lat, hourly data +real*4, parameter :: timeconvert=3600. + +!space variables +integer nlon, nlat +real, dimension(:), allocatable :: lon, lat + +!time variables +character*3 :: monname(12) +character*100 :: monlabel + +!merra variables +integer nlonm, nlatm, ntimem +integer :: merrauaf, merraba + +real, dimension(:,:,:), allocatable :: lsprin, cuprin +real, dimension(:,:,:), allocatable :: lsprout, cuprout +real, dimension(:,:), allocatable :: merraprecipin, merraprecipout +real, dimension(:,:), allocatable :: ratio + +!gpcp variables +integer :: ntimeg, gpcpref +real :: myyrstart, myyrnext +real, dimension(:), allocatable :: timeg +real, dimension(:,:,:), allocatable :: gpcpin +real, dimension(:,:), allocatable :: gpcpprecip + +!areal variables +real :: deltalon, deltalat +real, dimension(:), allocatable :: lonE, lonW, arlon +real, dimension(:), allocatable :: latN, latS, arlat + +!comparison variables +integer :: ratioa1, ratiob1, ratio1 +real*8 :: preciptotg, preciptotmin, preciptotmout + +!netcdf variables +integer ncid,dimid,varid,status +integer nlondid, nlatdid, ntimedid +integer lsprid, cuprid +character*20 :: dimname +character*120 :: merraname + +!misc variables +integer :: i,j, yr, mon +integer :: mystartmon, mystopmon + +!local variables +real :: radius +real*8 :: pi + +!Define/set variables +data monname/'Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'/ +pi = acos(-1.0) +radius = 6371000. + +!Get the GPCP data +print*,'' +print('(a)'),'GPCP File Information: ' +print('(a,a)'), ' ',trim(gpcpfile) +status = nf90_open( trim(gpcpfile), nf90_nowrite, ncid ) +IF (status .ne. nf90_noerr) THEN + print*,'Error Finding GPCP File. Stopping.' + STOP +ENDIF + +status = nf90_inq_dimid(ncid, 'lon', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlon) +status = nf90_inq_dimid(ncid, 'lat', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlat) +status = nf90_inq_dimid(ncid, 'time', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, ntimeg) + +allocate(lon(nlon),lat(nlat),timeg(ntimeg)) +status = nf90_inq_varid(ncid, 'lon', varid ) +status = nf90_get_var(ncid, varid, lon ) + +status = nf90_inq_varid(ncid, 'lat', varid ) +status = nf90_get_var(ncid, varid, lat ) + +status = nf90_inq_varid(ncid, 'time', varid ) +status = nf90_get_var(ncid, varid, timeg) + +allocate(gpcpin(nlon,nlat,ntimeg)) +allocate(gpcpprecip(nlon,nlat)) +status = nf90_inq_varid(ncid, 'precip', varid ) +status = nf90_get_var(ncid, varid, gpcpin ) +status = nf90_close(ncid) + +!....get GPCP time reference start +IF (startyr .LT. floor(timeg(1))) THEN + print*,'Requesting GPCP Data Prior To Available.' + print*,'Stopping.' +ELSEIF (startyr .GT. ceiling(timeg(ntimeg))) THEN + print*,'Requesting GPCP Data After Available.' + print*,'Stopping.' +ELSE + myyrstart = startyr + real(startMon-0.5)/12. + gpcpref = -999 + DO i=1,ntimeg + myyrnext = timeg(i) + 0.5/12. + IF ((myyrstart .GE. timeg(i)) .AND. & + (myyrstart .LT. myyrnext)) THEN + gpcpref = i + ENDIF + ENDDO + IF (gpcpref .lt. 1) THEN + print*,'Invalid GPCP Time Requested.' + print*,'Stopping.' + ENDIF +ENDIF +print('(a,i6,f10.2)'),' GPCP Start Ref and Time: ', & + gpcpref, timeg(gpcpref) + + +!...get areal variables for precipitation totals +deltalon=(lon(3)-lon(2))/2. +deltalat=(lat(3)-lat(2))/2. + +allocate(lonE(nlon),lonW(nlon),arlon(nlon)) +do i=1,nlon + lonE(i)=lon(i)+deltalon + lonW(i)=lon(i)-deltalon + arlon(i)=(lonE(i)-lonW(i))/360. +enddo +arlon = arlon*2*pi*radius*radius/1.e15 + +allocate(latS(nlat),latN(nlat),arlat(nlat)) +do j=1,nlat + if (j .eq. 1) then + latS(j) = -90. + latN(j) = (lat(j+1) + lat(j))*0.5 + elseif (j .eq. 2) then + latS(j) = (lat(j-1) + lat(j))*0.5 + latN(j) = lat(j) + deltalat + elseif (j .eq. nlat-1) then + latS(j) = lat(j) - deltalat + latN(j) = (lat(j) + lat(j+1))*0.5 + elseif (j .eq. nlat) then + latS(j) = (lat(j-1) + lat(j))*0.5 + latN(j) = 90. + else + latS(j) = lat(j) - deltalat + latN(j) = lat(j) + deltalat + endif + arlat(j) = -sin(pi*latS(j)/180.) + & + sin(pi*latN(j)/180.) +enddo + +!Loop over years/months +do yr=startYr,stopYr + mystartmon=1 + mystopmon=12 + IF (yr .eq. startyr) mystartmon=startMon + IF (yr .eq. stopyr) mystopmon=stopMon + + do mon=mystartmon,mystopmon + + !Get the GPCP data + IF ((gpcpref .GE. 1) .and. (gpcpref .LE. ntimeg)) THEN + gpcpprecip(:,:) = gpcpin(:,:,gpcpref) + gpcpref = gpcpref + 1 + ELSE + print*,'Requested GPCP Data After Available.' + print*,'Stopping.' + STOP + ENDIF + + !Open the MERRA file to modify + write(merraname,'(a,a,i4.4,i2.2,a)') & + trim(merradir), trim(merraprefix), yr, mon, '.nc' + call check ( nf90_open( trim(merraname), nf90_write, ncid ) ) + + call check ( nf90_inq_dimid(ncid, 'time', ntimedid ) ) + call check ( nf90_inquire_dimension(ncid, ntimedid, dimname, ntimem) ) + + !check lon/lat info for MERRA only if first time through loop + if (mon .eq. startMon .and. yr .eq. startYr) then + call check ( nf90_inq_dimid(ncid, 'lon', nlondid ) ) + call check ( nf90_inquire_dimension(ncid, nlondid, len=nlonm) ) + call check ( nf90_inq_dimid(ncid, 'lat', nlatdid ) ) + call check ( nf90_inquire_dimension(ncid, nlatdid, len=nlatm) ) + + IF ((nlonm .NE. nlon) .OR. (nlatm .NE. nlat)) THEN + print*,'Mismatching GPCP/MERRA Dimensions' + print*,' GPCP Lon/Lat: ',nlon,nlat + print*,' MERRA Lon/Lat: ',nlonm,nlatm + print*,'Stopping.' + STOP + ELSE + print('(a,2I6,2F10.4)'), & + ' Dimensions (nlon/nlat/dlon/dlat): ', & + nlonm,nlatm,(lon(3)-lon(2)),lat(3)-lat(2) + ENDIF + + allocate(merraprecipin(nlonm,nlatm)) + allocate(merraprecipout(nlonm,nlatm)) + allocate(ratio(nlonm,nlatm)) + ENDIF !yr==startyr, mon==startmon + + print*,'' + write(monlabel,'(a,a,a,i4.4)') 'Processing ',monname(mon), ' ', yr + print('(a)'),trim(monlabel) + print('(a)'),' Modifying MERRA File: ' + print('(a,a)'),' ',trim(merraname) + + allocate(lsprin(nlonm,nlatm,ntimem),cuprin(nlonm,nlatm,ntimem)) + allocate(lsprout(nlonm,nlatm,ntimem),cuprout(nlonm,nlatm,ntimem)) + call check ( nf90_inq_varid(ncid, 'lspr', varid ) ) + call check ( nf90_get_var(ncid, varid, lsprin ) ) + call check ( nf90_inq_varid(ncid, 'cupr', varid ) ) + call check ( nf90_get_var(ncid, varid, cuprin ) ) + lsprout=lsprin + cuprout=cuprin + + !Compare the precipitation + ratioa1 = 0 + ratiob1 = 0 + ratio1 = 0 + DO i=1,nlon + DO j=1,nlat + merraprecipin(i,j) = (sum(cuprin(i,j,:)) + sum(lsprin(i,j,:))) & + *timeconvert + IF (merraprecipin(i,j) .GT. 0.) THEN + ratio(i,j) = gpcpprecip(i,j) / merraprecipin(i,j) + ELSE + ratio(i,j) = 0. + ENDIF + + IF (ratio(i,j) .GT. 1.001) THEN + ratioa1 = ratioa1 + 1 + ELSEIF (ratio(i,j) .LT. 0.999) THEN + ratiob1 = ratiob1 + 1 + ELSE + ratio1 = ratio1 + 1 + ENDIF + + cuprout(i,j,:) = cuprout(i,j,:)*ratio(i,j) + lsprout(i,j,:) = lsprout(i,j,:)*ratio(i,j) + merraprecipout(i,j) = (sum(cuprout(i,j,:)) + sum(lsprout(i,j,:))) & + *timeconvert + ENDDO !j + ENDDO !i + + !Check total precipitations + preciptotmin=0.0 + preciptotmout=0.0 + preciptotg=0.0 + DO i=1,nlon + DO j=1,nlat + preciptotmin = preciptotmin + & + merraprecipin(i,j)*arlon(i)*arlat(j) + preciptotmout = preciptotmout + & + merraprecipout(i,j)*arlon(i)*arlat(j) + preciptotg = preciptotg + & + gpcpprecip(i,j)*arlon(i)*arlat(j) + ENDDO + ENDDO + + !Print out stats + print*,'' + print('(a)'),' Monthly Precipitation Totals (kg)' + print('(a,E14.5)'),' MERRA Original: ',preciptotmin + print('(a,E14.5)'),' MERRA Scaled: ',preciptotmout + print('(a,E14.5)'),' GPCP: ',preciptotg + + print*,'' + print('(a)'),' Ratio Information: ' + print('(a,2E14.5)'),' Ratio Min/Max: ',minval(ratio), maxval(ratio) + print('(a,I8)'), ' # > 1.0: ', ratioa1 + print('(a,I8)'), ' # < 1.0: ', ratiob1 + print('(a,I8)'), ' # = 1.0: ', ratio1 + print('(a,I8)'), ' TOTAL: ', ratioa1+ratiob1+ratio1 + + !Write out the new scaled data + status = nf90_inq_varid(ncid, 'lspr_scaled', lsprid ) + if (status .ne. 0) then + call check ( nf90_redef(ncid) ) + call check ( nf90_def_var( ncid, 'lspr_scaled', nf90_float, & + (/nlondid,nlatdid,ntimedid/), lsprid ) ) + call check ( nf90_put_att(ncid, lsprid, & + 'long_name','Scaled Large Scale Precip')) + call check ( nf90_put_att(ncid, lsprid, & + 'title', 'LSPR Scaled To GPCP v2.3')) + call check ( nf90_put_att(ncid, lsprid, & + 'units', 'mm/s')) + call check ( nf90_enddef( ncid ) ) + endif + + status = nf90_inq_varid(ncid, 'cupr_scaled', cuprid ) + if (status .ne. 0) then + call check ( nf90_redef(ncid) ) + call check ( nf90_def_var( ncid, 'cupr_scaled', nf90_float, & + (/nlondid,nlatdid,ntimedid/), cuprid ) ) + call check ( nf90_put_att( ncid, cuprid, & + 'long_name','Scaled Convective Precip')) + call check ( nf90_put_att( ncid, cuprid, & + 'title', 'CUPR Scaled to GPCP v2.3')) + call check ( nf90_put_att( ncid, cuprid, & + 'units', 'mm/s')) + call check ( nf90_enddef( ncid ) ) + endif + + !!!Setting all precip to large-scale!!! + !lsprout = lsprout + cuprout + !cuprout = 0. + + call check ( nf90_put_var( ncid, lsprid, lsprout) ) + call check ( nf90_put_var( ncid, cuprid, cuprout) ) + call check ( nf90_close(ncid) ) + + deallocate(lsprin,cuprin,lsprout,cuprout) + + enddo !mon=startMon,stopMon +enddo !yr=startYr,stopYr + +print*,'' +print*,'Finished Processing' +print*,'' + +end + + +!********************************************************** +!********************************************************** + +subroutine check(status) + +use netcdf +use typeSizes + +implicit none + +integer, intent(in) :: status + + if (status /= nf90_noerr) then + stop "Error with netcdf. Stopping." + endif + +end subroutine check diff --git a/preprocess/scale_merra_gpcp_auto b/preprocess/scale_merra_gpcp_auto new file mode 100755 index 0000000000000000000000000000000000000000..8e67c6ebd7af9fd470faee5346d8cf217d04d001 Binary files /dev/null and b/preprocess/scale_merra_gpcp_auto differ diff --git a/preprocess/scale_merra_gpcp_auto.f90 b/preprocess/scale_merra_gpcp_auto.f90 new file mode 100644 index 0000000000000000000000000000000000000000..6ec8bade6b312bfd1f95133d0ec2cd2bf96df742 --- /dev/null +++ b/preprocess/scale_merra_gpcp_auto.f90 @@ -0,0 +1,388 @@ +!Program to change the precipitation values for the SiB driver files +!and scale them to GPCP precipitation. +! +!Program finds the ratio between the MERRA and GPCP precipitation +!and multiplies by this ratio to 'scale' the precip. +! +!MERRA precip units assumed to be mm/s, with hourly data +!GPCP precip units assumed to be mm/month, with monthly data +! --Expects GPCP to be regridded to MERRA resolution!! +! +!Program will not change the timing nor 'create' precip in MERRA. +! +!NOTE: This will actually change the netcdf file! +! +!To compile, use: +!>pgf90 scale_merra_gpcp.f90 -L/usr/local/netcdf3-pgi/lib -lnetcdf -I/usr/local/netcdf3-pgi/include -o scale_merra_gpcp +! +!-or- (if defined) +!>f90nc scale_merra_gpcp.f90 +!>f90nco scale_merra_gpcp.f90 scale_merra_gpcp +! +!-or- +!>make scale_merra_gpcp +! +!kdhaynes, 01/2018 + +program scale_merra_gpcp + +use netcdf +implicit none + +!!!user defined variables +integer, parameter :: startYr=2018, stopYr=2018 +integer, parameter :: startMon=1, stopMon=1 + +!.....GPCP v2.3 +!.....(2.5-degree, monthly, units of mm/day) +character*180, parameter :: & + gpcpfile='/projects/0/ctdas/sib4_input/meteo/gpcp/gpcp_0.625dx0.5d_tot.nc' + +!....MERRA-2 +character*100, parameter :: & + merradir='/projects/0/ctdas/awoude/NRT/input/' +character*20, parameter :: & + merraprefix='merra_' + +!!!other MERRA parameters +!!!assuming 2/3-degree lon by 1/2-degree lat, hourly data +real*4, parameter :: timeconvert=3600. + +!space variables +integer nlon, nlat +real, dimension(:), allocatable :: lon, lat + +!time variables +character*3 :: monname(12) +character*100 :: monlabel + +!merra variables +integer nlonm, nlatm, ntimem +integer :: merrauaf, merraba + +real, dimension(:,:,:), allocatable :: lsprin, cuprin +real, dimension(:,:,:), allocatable :: lsprout, cuprout +real, dimension(:,:), allocatable :: merraprecipin, merraprecipout +real, dimension(:,:), allocatable :: ratio + +!gpcp variables +integer :: ntimeg, gpcpref +real :: myyrstart, myyrnext +real, dimension(:), allocatable :: timeg +real, dimension(:,:,:), allocatable :: gpcpin +real, dimension(:,:), allocatable :: gpcpprecip + +!areal variables +real :: deltalon, deltalat +real, dimension(:), allocatable :: lonE, lonW, arlon +real, dimension(:), allocatable :: latN, latS, arlat + +!comparison variables +integer :: ratioa1, ratiob1, ratio1 +real*8 :: preciptotg, preciptotmin, preciptotmout + +!netcdf variables +integer ncid,dimid,varid,status +integer nlondid, nlatdid, ntimedid +integer lsprid, cuprid +character*20 :: dimname +character*120 :: merraname + +!misc variables +integer :: i,j, yr, mon +integer :: mystartmon, mystopmon + +!local variables +real :: radius +real*8 :: pi + +!Define/set variables +data monname/'Jan','Feb','Mar','Apr','May','Jun', & + 'Jul','Aug','Sep','Oct','Nov','Dec'/ +pi = acos(-1.0) +radius = 6371000. + +!Get the GPCP data +print*,'' +print('(a)'),'GPCP File Information: ' +print('(a,a)'), ' ',trim(gpcpfile) +status = nf90_open( trim(gpcpfile), nf90_nowrite, ncid ) +IF (status .ne. nf90_noerr) THEN + print*,'Error Finding GPCP File. Stopping.' + STOP +ENDIF + +status = nf90_inq_dimid(ncid, 'lon', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlon) +status = nf90_inq_dimid(ncid, 'lat', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, nlat) +status = nf90_inq_dimid(ncid, 'time', dimid ) +status = nf90_inquire_dimension(ncid, dimid, dimname, ntimeg) + +allocate(lon(nlon),lat(nlat),timeg(ntimeg)) +status = nf90_inq_varid(ncid, 'lon', varid ) +status = nf90_get_var(ncid, varid, lon ) + +status = nf90_inq_varid(ncid, 'lat', varid ) +status = nf90_get_var(ncid, varid, lat ) + +status = nf90_inq_varid(ncid, 'time', varid ) +status = nf90_get_var(ncid, varid, timeg) + +allocate(gpcpin(nlon,nlat,ntimeg)) +allocate(gpcpprecip(nlon,nlat)) +status = nf90_inq_varid(ncid, 'precip', varid ) +status = nf90_get_var(ncid, varid, gpcpin ) +status = nf90_close(ncid) + +!....get GPCP time reference start +IF (startyr .LT. floor(timeg(1))) THEN + print*,'Requesting GPCP Data Prior To Available.' + print*,'Stopping.' +ELSEIF (startyr .GT. ceiling(timeg(ntimeg))) THEN + print*,'Requesting GPCP Data After Available.' + print*,'Stopping.' +ELSE + myyrstart = startyr + real(startMon-0.5)/12. + gpcpref = -999 + DO i=1,ntimeg + myyrnext = timeg(i) + 0.5/12. + IF ((myyrstart .GE. timeg(i)) .AND. & + (myyrstart .LT. myyrnext)) THEN + gpcpref = i + ENDIF + ENDDO + IF (gpcpref .lt. 1) THEN + print*,'Invalid GPCP Time Requested.' + print*,'Stopping.' + ENDIF +ENDIF +print('(a,i6,f10.2)'),' GPCP Start Ref and Time: ', & + gpcpref, timeg(gpcpref) + + +!...get areal variables for precipitation totals +deltalon=(lon(3)-lon(2))/2. +deltalat=(lat(3)-lat(2))/2. + +allocate(lonE(nlon),lonW(nlon),arlon(nlon)) +do i=1,nlon + lonE(i)=lon(i)+deltalon + lonW(i)=lon(i)-deltalon + arlon(i)=(lonE(i)-lonW(i))/360. +enddo +arlon = arlon*2*pi*radius*radius/1.e15 + +allocate(latS(nlat),latN(nlat),arlat(nlat)) +do j=1,nlat + if (j .eq. 1) then + latS(j) = -90. + latN(j) = (lat(j+1) + lat(j))*0.5 + elseif (j .eq. 2) then + latS(j) = (lat(j-1) + lat(j))*0.5 + latN(j) = lat(j) + deltalat + elseif (j .eq. nlat-1) then + latS(j) = lat(j) - deltalat + latN(j) = (lat(j) + lat(j+1))*0.5 + elseif (j .eq. nlat) then + latS(j) = (lat(j-1) + lat(j))*0.5 + latN(j) = 90. + else + latS(j) = lat(j) - deltalat + latN(j) = lat(j) + deltalat + endif + arlat(j) = -sin(pi*latS(j)/180.) + & + sin(pi*latN(j)/180.) +enddo + +!Loop over years/months +do yr=startYr,stopYr + mystartmon=1 + mystopmon=12 + IF (yr .eq. startyr) mystartmon=startMon + IF (yr .eq. stopyr) mystopmon=stopMon + + do mon=mystartmon,mystopmon + + !Get the GPCP data + IF ((gpcpref .GE. 1) .and. (gpcpref .LE. ntimeg)) THEN + gpcpprecip(:,:) = gpcpin(:,:,gpcpref) + gpcpref = gpcpref + 1 + ELSE + print*,'Requested GPCP Data After Available.' + print*,'Stopping.' + STOP + ENDIF + + !Open the MERRA file to modify + write(merraname,'(a,a,i4.4,i2.2,a)') & + trim(merradir), trim(merraprefix), yr, mon, '.nc' + call check ( nf90_open( trim(merraname), nf90_write, ncid ) ) + + call check ( nf90_inq_dimid(ncid, 'time', ntimedid ) ) + call check ( nf90_inquire_dimension(ncid, ntimedid, dimname, ntimem) ) + + !check lon/lat info for MERRA only if first time through loop + if (mon .eq. startMon .and. yr .eq. startYr) then + call check ( nf90_inq_dimid(ncid, 'lon', nlondid ) ) + call check ( nf90_inquire_dimension(ncid, nlondid, len=nlonm) ) + call check ( nf90_inq_dimid(ncid, 'lat', nlatdid ) ) + call check ( nf90_inquire_dimension(ncid, nlatdid, len=nlatm) ) + + IF ((nlonm .NE. nlon) .OR. (nlatm .NE. nlat)) THEN + print*,'Mismatching GPCP/MERRA Dimensions' + print*,' GPCP Lon/Lat: ',nlon,nlat + print*,' MERRA Lon/Lat: ',nlonm,nlatm + print*,'Stopping.' + STOP + ELSE + print('(a,2I6,2F10.4)'), & + ' Dimensions (nlon/nlat/dlon/dlat): ', & + nlonm,nlatm,(lon(3)-lon(2)),lat(3)-lat(2) + ENDIF + + allocate(merraprecipin(nlonm,nlatm)) + allocate(merraprecipout(nlonm,nlatm)) + allocate(ratio(nlonm,nlatm)) + ENDIF !yr==startyr, mon==startmon + + print*,'' + write(monlabel,'(a,a,a,i4.4)') 'Processing ',monname(mon), ' ', yr + print('(a)'),trim(monlabel) + print('(a)'),' Modifying MERRA File: ' + print('(a,a)'),' ',trim(merraname) + + allocate(lsprin(nlonm,nlatm,ntimem),cuprin(nlonm,nlatm,ntimem)) + allocate(lsprout(nlonm,nlatm,ntimem),cuprout(nlonm,nlatm,ntimem)) + call check ( nf90_inq_varid(ncid, 'lspr', varid ) ) + call check ( nf90_get_var(ncid, varid, lsprin ) ) + call check ( nf90_inq_varid(ncid, 'cupr', varid ) ) + call check ( nf90_get_var(ncid, varid, cuprin ) ) + lsprout=lsprin + cuprout=cuprin + + !Compare the precipitation + ratioa1 = 0 + ratiob1 = 0 + ratio1 = 0 + DO i=1,nlon + DO j=1,nlat + merraprecipin(i,j) = (sum(cuprin(i,j,:)) + sum(lsprin(i,j,:))) & + *timeconvert + IF (merraprecipin(i,j) .GT. 0.) THEN + ratio(i,j) = gpcpprecip(i,j) / merraprecipin(i,j) + ELSE + ratio(i,j) = 0. + ENDIF + + IF (ratio(i,j) .GT. 1.001) THEN + ratioa1 = ratioa1 + 1 + ELSEIF (ratio(i,j) .LT. 0.999) THEN + ratiob1 = ratiob1 + 1 + ELSE + ratio1 = ratio1 + 1 + ENDIF + + cuprout(i,j,:) = cuprout(i,j,:)*ratio(i,j) + lsprout(i,j,:) = lsprout(i,j,:)*ratio(i,j) + merraprecipout(i,j) = (sum(cuprout(i,j,:)) + sum(lsprout(i,j,:))) & + *timeconvert + ENDDO !j + ENDDO !i + + !Check total precipitations + preciptotmin=0.0 + preciptotmout=0.0 + preciptotg=0.0 + DO i=1,nlon + DO j=1,nlat + preciptotmin = preciptotmin + & + merraprecipin(i,j)*arlon(i)*arlat(j) + preciptotmout = preciptotmout + & + merraprecipout(i,j)*arlon(i)*arlat(j) + preciptotg = preciptotg + & + gpcpprecip(i,j)*arlon(i)*arlat(j) + ENDDO + ENDDO + + !Print out stats + print*,'' + print('(a)'),' Monthly Precipitation Totals (kg)' + print('(a,E14.5)'),' MERRA Original: ',preciptotmin + print('(a,E14.5)'),' MERRA Scaled: ',preciptotmout + print('(a,E14.5)'),' GPCP: ',preciptotg + + print*,'' + print('(a)'),' Ratio Information: ' + print('(a,2E14.5)'),' Ratio Min/Max: ',minval(ratio), maxval(ratio) + print('(a,I8)'), ' # > 1.0: ', ratioa1 + print('(a,I8)'), ' # < 1.0: ', ratiob1 + print('(a,I8)'), ' # = 1.0: ', ratio1 + print('(a,I8)'), ' TOTAL: ', ratioa1+ratiob1+ratio1 + + !Write out the new scaled data + status = nf90_inq_varid(ncid, 'lspr_scaled', lsprid ) + if (status .ne. 0) then + call check ( nf90_redef(ncid) ) + call check ( nf90_def_var( ncid, 'lspr_scaled', nf90_float, & + (/nlondid,nlatdid,ntimedid/), lsprid ) ) + call check ( nf90_put_att(ncid, lsprid, & + 'long_name','Scaled Large Scale Precip')) + call check ( nf90_put_att(ncid, lsprid, & + 'title', 'LSPR Scaled To GPCP v2.3')) + call check ( nf90_put_att(ncid, lsprid, & + 'units', 'mm/s')) + call check ( nf90_enddef( ncid ) ) + endif + + status = nf90_inq_varid(ncid, 'cupr_scaled', cuprid ) + if (status .ne. 0) then + call check ( nf90_redef(ncid) ) + call check ( nf90_def_var( ncid, 'cupr_scaled', nf90_float, & + (/nlondid,nlatdid,ntimedid/), cuprid ) ) + call check ( nf90_put_att( ncid, cuprid, & + 'long_name','Scaled Convective Precip')) + call check ( nf90_put_att( ncid, cuprid, & + 'title', 'CUPR Scaled to GPCP v2.3')) + call check ( nf90_put_att( ncid, cuprid, & + 'units', 'mm/s')) + call check ( nf90_enddef( ncid ) ) + endif + + !!!Setting all precip to large-scale!!! + !lsprout = lsprout + cuprout + !cuprout = 0. + + call check ( nf90_put_var( ncid, lsprid, lsprout) ) + call check ( nf90_put_var( ncid, cuprid, cuprout) ) + call check ( nf90_close(ncid) ) + + deallocate(lsprin,cuprin,lsprout,cuprout) + + enddo !mon=startMon,stopMon +enddo !yr=startYr,stopYr + +print*,'' +print*,'Finished Processing' +print*,'' + +end + + +!********************************************************** +!********************************************************** + +subroutine check(status) + +use netcdf +use typeSizes + +implicit none + +integer, intent(in) :: status + + if (status /= nf90_noerr) then + stop "Error with netcdf. Stopping." + endif + +end subroutine check diff --git a/preprocess/scale_merra_gpcp_auto.o b/preprocess/scale_merra_gpcp_auto.o new file mode 100644 index 0000000000000000000000000000000000000000..12129859306659a5c2c2bb33d8f6bed52f7e27c8 Binary files /dev/null and b/preprocess/scale_merra_gpcp_auto.o differ diff --git a/preprocess/sib4_prior.sh b/preprocess/sib4_prior.sh new file mode 100644 index 0000000000000000000000000000000000000000..5dbb77e748553dee97bef14e9c7066d83e41f3cc --- /dev/null +++ b/preprocess/sib4_prior.sh @@ -0,0 +1,40 @@ +#!/bin/bash + +YEAR_START=2018 +YEAR_STOP=2018 +MONTH_START=1 +MONTH_STOP=1 + +ORIG_DIR="/scratch/shared/awoude//MERRA/" +PROC_DIR="/projects/0/ctdas/awoude/NRT/input/" + +#bash getmerra_auto $YEAR_START $MONTH_START $MONTH_END $ORIG_DIR + +sed -i "s/startYr=[^,]*/startYr=$YEAR_START/g" merra_pullvar_auto.f90 +sed -i "s/stopYr=[^,]*/stopYr=$YEAR_STOP/g" merra_pullvar_auto.f90 +sed -i "s/startMon=[^,]*/startMon=$MONTH_START/g" merra_pullvar_auto.f90 +sed -i "s/stopMon=[^,]*/stopMon=$MONTH_STOP/g" merra_pullvar_auto.f90 +sed -i "s|filedir=[^,]*|filedir=\'$ORIG_DIR\'|g" merra_pullvar_auto.f90 +sed -i "s|outdir=[^,]*|outdir=\'$PROC_DIR\'|g" merra_pullvar_auto.f90 +# +make merra_pullvar_auto +./merra_pullvar_auto +# +sed -i "s|merradir=[^,]*|merradir=\'$PROC_DIR\'|g" scale_merra_gpcp_auto.f90 +sed -i "s/startYr=[^,]*/startYr=$YEAR_START/g" scale_merra_gpcp_auto.f90 +sed -i "s/stopYr=[^,]*/stopYr=$YEAR_STOP/g" scale_merra_gpcp_auto.f90 +sed -i "s/startMon=[^,]*/startMon=$MONTH_START/g" scale_merra_gpcp_auto.f90 +sed -i "s/stopMon=[^,]*/stopMon=$MONTH_STOP/g" scale_merra_gpcp_auto.f90 +# +make scale_merra_gpcp_auto +./scale_merra_gpcp_auto +# +sed -i "s|inputdir=[^,]*|inputdir=\'$PROC_DIR\'|g" merra_pullsib_auto.f90 +sed -i "s|outputdir=[^,]*|outputdir=\'$PROC_DIR\'|g" merra_pullsib_auto.f90 +sed -i "s/startYr=[^,]*/startYr=$YEAR_START/g" merra_pullsib_auto.f90 +sed -i "s/stopYr=[^,]*/stopYr=$YEAR_STOP/g" merra_pullsib_auto.f90 +sed -i "s/startmon=[^,]*/startmon=$MONTH_START/g" merra_pullsib_auto.f90 +sed -i "s/stopmon=[^,]*/stopmon=$MONTH_STOP/g" merra_pullsib_auto.f90 +# +make merra_pullsib_auto +./merra_pullsib_auto diff --git a/privatemodules/.DS_Store b/privatemodules/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..6dae352bdb88d8014d9d49df9a19c7bdce6975e1 Binary files /dev/null and b/privatemodules/.DS_Store differ diff --git a/privatemodules/.bashrc b/privatemodules/.bashrc new file mode 100644 index 0000000000000000000000000000000000000000..3bc80bb08f839582027c5b4c3ebbc8b4b784cd7d --- /dev/null +++ b/privatemodules/.bashrc @@ -0,0 +1,180 @@ +# .bashrc + +# Source global definitions +if [ -f /etc/bashrc ]; then + . /etc/bashrc +fi + +module load pre2019 +module load python/2.7.9 +#module load fortran/intel lapack/netlib/intel blas/netlib/intel + +#module load hdf5/serial/intel/1.8.10-patch1 +#module load netcdf + +#module load hdf4/intel/4.2.9 +#module load hdf5/impi/intel/1.8.9 +#module load netcdf/impi/intel/4.1.3 +#module load szip/intel/2.1 + +#module load mkl +module load nco +module load cdo + +# SiBCASA +#module load fortran/intel lapack/netlib/intel blas/netlib/intel +#module load hdf4/intel/4.2.9 +#module load hdf5/serial/intel/1.8.10-patch1 +#module load netcdf/serial/intel + +# SiB4 +module load atlas +module load gcc/5.2.0 +export LD_LIBRARY_PATH=/home/kooij032/privatemodules/nc4/lib/ + +# TM5 +#module load use.own +#export UDUNITS_PATH=/home/ivdvelde/local/udunits/etc/udunits.dat +#export PATH=$PATH:/home/ivdvelde/local:/usr/bin +#export SVN_EDITOR=vim + +# Load aliases +alias sq="squeue -u kooij032" +alias ncdump='/home/kooij032/privatemodules/nc4/bin/ncdump' + + +# User specific aliases and functions +# Step 3. + +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples + +# If not running interactively, don't do anything +[ -z "$PS1" ] && return + +# don't put duplicate lines in the history. See bash(1) for more options +# ... or force ignoredups and ignorespace +HISTCONTROL=ignoredups:ignorespace + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# make less more friendly for non-text input files, see lesspipe(1) +[ -x /usr/bin/lesspipe ] && eval "$(SHELL=/bin/sh lesspipe)" + +# set variable identifying the chroot you work in (used in the prompt below) +if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then + debian_chroot=$(cat /etc/debian_chroot) +fi + +# load Solarized palette automaticly +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" +fi + +# set a fancy prompt (non-color, unless we know we "want" color) +case "$TERM" in + xterm-color) color_prompt=yes;; +esac + +# uncomment for a colored prompt, if the terminal has the capability; turned +# off by default to not distract the user: the focus in a terminal window +# should be on the output of commands, not on the prompt +#force_color_prompt=yes + +if [ -n "$force_color_prompt" ]; then + if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then + # We have color support; assume it's compliant with Ecma-48 + # (ISO/IEC-6429). (Lack of such support is extremely rare, and such + # a case would tend to support setf rather than setaf.) + color_prompt=yes + else + color_prompt= + fi +fi + +if [ "$color_prompt" = yes ]; then + PS1='${debian_chroot:+($debian_chroot)}\u\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ ' +else + PS1='${debian_chroot:+($debian_chroot)}\u@\h:\W\$ ' +fi +unset color_prompt force_color_prompt + +# If this is an xterm set the title to user@host:dir +case "$TERM" in +xterm*|rxvt*) + PS1="\[\e]0;${debian_chroot:+($debian_chroot)}\u@\h: \w\a\]$PS1" + ;; +*) + ;; +esac + +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls --color=auto' + #alias dir='dir --color=auto' + #alias vdir='vdir --color=auto' + + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' +fi + +# some more ls aliases +alias ll='ls -halF' +alias la='ls -A' +alias l='ls -CF' + +# Add an "alert" alias for long running commands. Use like so: +# sleep 10; alert +alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"' + +# Alias definitions. +# You may want to put all your additions into a separate file like +# ~/.bash_aliases, instead of adding them here directly. +# See /usr/share/doc/bash-doc/examples in the bash-doc package. + +if [ -f ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# enable programmable completion features (you don't need to enable +# this, if it's already enabled in /etc/bash.bashrc and /etc/profile +# sources /etc/bash.bashrc). +if [ -f /etc/bash_completion ] && ! shopt -oq posix; then + . /etc/bash_completion +fi + +# Parse git for clean dir +function parse_git_dirty { + [[ "$(git status 2> /dev/null | tail -n1)" != "nothing to commit (working directory clean)" ]] && echo "*" +} + +# To display git branch +function parse_git_branch { + git branch --no-color 2> /dev/null | sed -e '/^[^*]/d' -e "s/* \(.*\)/[\1$(parse_git_dirty)]/" +} + +if [[ ${EUID} == 0 ]] ; then + PS1='\[\033[01;31m\]\u@\h \[\033[01;34m\]\w\[\033[01;35m\]$(parse_git_branch)\[\033[01;34m\] \$ \[\033[00m\]' +else + PS1='\[\033[01;00m\]\u:\w\[\033[00;33m\]$(parse_git_branch)\[\033[00m\] \$ ' +fi + +# Change the window title of X terminals +PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/$HOME/~}\007"' + +# End of Git branch config + +export PATH=$PATH:~/privatemodules/nc4/bin + diff --git a/privatemodules/nc4/bin/gif2h5 b/privatemodules/nc4/bin/gif2h5 new file mode 100755 index 0000000000000000000000000000000000000000..d4212e21fbb9dae04e5970bd794351a54a221a55 Binary files /dev/null and b/privatemodules/nc4/bin/gif2h5 differ diff --git a/privatemodules/nc4/bin/h52gif b/privatemodules/nc4/bin/h52gif new file mode 100755 index 0000000000000000000000000000000000000000..0ac8947454c471ae45ae63d694ceaa6c3ea38b55 Binary files /dev/null and b/privatemodules/nc4/bin/h52gif differ diff --git a/privatemodules/nc4/bin/h5cc b/privatemodules/nc4/bin/h5cc new file mode 100755 index 0000000000000000000000000000000000000000..ec1b2a3dcf421ed6826b99d42ac8cefeaca1c037 --- /dev/null +++ b/privatemodules/nc4/bin/h5cc @@ -0,0 +1,401 @@ +#! /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 files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have +# access to either file, you may request a copy from help@hdfgroup.org. +## + +# This tool is adapted from the mpicc command of the MPICH Software. + +############################################################################ +## ## +## Things You May Have to Modify: ## +## ## +## If the following paths don't point to the place were HDF5 is installed ## +## on your system (i.e., you received a binary distribution or moved the ## +## files from the originally installed directory to another directory) ## +## then modify them accordingly to represent the new paths. ## +## ## +############################################################################ +prefix="/home/erikvs/privatemodules/nc4" +exec_prefix="${prefix}" +libdir="${exec_prefix}/lib" +includedir="${prefix}/include" +HL="hl" + +############################################################################ +## ## +## Things You Can Modify to Override HDF5 Library Build Components: ## +## ## +## (Advanced usage - know what you're doing - you're on your own here.) ## +## The four variables below can be used to insert paths and flags in ## +## CPPFLAGS, CFLAGS, LDFLAGS, or LIBS in the h5cc compile line: ## +## $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $LDFLAGS ## +## $LIBS $clibpath $link_objs $link_args $shared_link ## +## ## +## These settings can be overriden by setting HDF5_CFLAGS, ## +## HDF5_CPPFLAGS, HDF5_LDFLAGS, or HDF5_LIBS in the environment. ## +## ## +############################################################################ +CFLAGSBASE="" +CPPFLAGSBASE="" +LDFLAGSBASE="" +LIBSBASE="" + +############################################################################ +## ## +## You shouldn't have to modify anything below this line. ## +## ## +############################################################################ + +# Constants definitions +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +host_os="linux-gnu" + +prog_name="`basename $0`" + +allargs="" +compile_args="" +libraries="" +link_args="" +link_objs="" +clibpath="" + +do_link="yes" +do_compile="no" +dash_o="no" +dash_c="no" +get_output_file="no" + +SHOW="eval" +CCBASE="gcc" +CLINKERBASE="gcc" + +# CFLAGS, CPPFLAGS and LDFLAGS are reserved for use by the script user. +# FLAGS brought from the hdf5 build are put in H5BLD_*FLAGS. + +# User's CPPFLAGS and CFLAGS come after their H5BLD counterparts. User's +# LDFLAGS come just before clibpath, user's LIBS come after $link_objs and +# before the hdf5 libraries in $link_args, followed by any external library +# paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in +# from the hdf5 build. The order of the flags is intended to give precedence +# to the user's flags. +H5BLD_CFLAGS=" -fPIC" +H5BLD_CPPFLAGS="-I/home/erikvs/privatemodules/nc4/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_BSD_SOURCE " +H5BLD_LDFLAGS=" -L/home/erikvs/privatemodules/nc4/lib " +H5BLD_LIBS=" -lz -ldl -lm " + +CC="${HDF5_CC:-$CCBASE}" +CLINKER="${HDF5_CLINKER:-$CLINKERBASE}" +CFLAGS="${HDF5_CFLAGS:-$CFLAGSBASE}" +CPPFLAGS="${HDF5_CPPFLAGS:-$CPPFLAGSBASE}" +LDFLAGS="${HDF5_LDFLAGS:-$LDFLAGSBASE}" +LIBS="${HDF5_LIBS:-$LIBSBASE}" + +# If a static library is available, the default will be to use it. If the only +# available library is shared, it will be used by default. The user can +# override either default, although choosing an unavailable library will result +# in link errors. +STATIC_AVAILABLE="yes" +if test "${STATIC_AVAILABLE}" = "yes"; then + USE_SHARED_LIB="${HDF5_USE_SHLIB:-no}" +else + USE_SHARED_LIB="${HDF5_USE_SHLIB:-yes}" +fi + + +usage() { + # A wonderfully informative "usage" message. + echo "usage: $prog_name [OPTIONS] <compile line>" + echo " OPTIONS:" + echo " -help This help message." + echo " -echo Show all the shell commands executed" + echo " -prefix=DIR Prefix directory to find HDF5 lib/ and include/" + echo " subdirectories [default: $prefix]" + # A wonderfully informative "usage" message. + echo "usage: $prog_name [OPTIONS] <compile line>" + echo " OPTIONS:" + echo " -help This help message." + echo " -echo Show all the shell commands executed" + echo " -prefix=DIR Prefix directory to find HDF5 lib/ and include/" + echo " subdirectories [default: $prefix]" + echo " -show Show the commands without executing them" + echo " -showconfig Show the HDF5 library configuration summary" + echo " -shlib Compile with shared HDF5 libraries [default for hdf5 built" + echo " without static libraries]" + echo " -noshlib Compile with static HDF5 libraries [default for hdf5 built" + echo " with static libraries]" + echo " " + echo " <compile line> - the normal compile line options for your compiler." + echo " $prog_name uses the same compiler you used to compile" + echo " HDF5. Check with your compiler's man pages for more" + echo " information on which options are needed." + echo " " + echo " You can override the compiler, linker, and whether or not to use static" + echo " or shared libraries to compile your program by setting the following" + echo " environment variables accordingly:" + echo " " + echo " HDF5_CC - use a different C compiler" + echo " HDF5_CLINKER - use a different linker" + echo " HDF5_USE_SHLIB=[yes|no] - use shared or static version of the HDF5 library" + echo " [default: no except when built with only" + echo " shared libraries]" + echo " " + echo " You can also add or change paths and flags to the compile line using" + echo " the following environment varibles or by assigning them to their counterparts" + echo " in the 'Things You Can Modify to Override...'" section of $prog_name + echo " " + echo " Variable Current value to be replaced" + echo " HDF5_CPPFLAGS \"$CPPFLAGSBASE\"" + echo " HDF5_CFLAGS \"$CFLAGSBASE\"" + echo " HDF5_LDFLAGS \"$LDFLAGSBASE\"" + echo " HDF5_LIBS \"$LIBSBASE\"" + echo " " + echo " Note that adding library paths to HDF5_LDFLAGS where another hdf5 version" + echo " is located may link your program with that other hdf5 library version." + echo " " + exit $EXIT_FAILURE +} + +# Show the configuration summary of the library recorded in the +# libhdf5.settings file reside in the lib directory. +showconfigure() +{ + cat ${libdir}/libhdf5.settings + status=$? +} + +# Main +status=$EXIT_SUCCESS + +if test "$#" = "0"; then + # No parameters specified, issue usage statement and exit. + usage +fi + +case "$CC" in + gcc) + kind="gcc" + ;; + mpicc|mpcc|mpicc_r) + # Is this gcc masquarading as an MPI compiler? + if test "`${CC} -v 2>&1 | sed -n 2p | cut -c1-3`" = "gcc"; then + kind="gcc" + else + # Nope + kind="$host_os" + fi + ;; + *) + kind="$host_os" + ;; +esac + +for arg in $@ ; do + if test "x$get_output_file" = "xyes"; then + link_args="$link_args $arg" + output_file="$arg" + get_output_file="no" + continue + fi + + case "$arg" in + -c) + allargs="$allargs $arg" + compile_args="$compile_args $arg" + + if test "x$do_link" = "xyes" -a -n "$output_file"; then + compile_args="$compile_args -o $outputfile" + fi + + do_link="no" + dash_c="yes" + ;; + -o) + allargs="$allargs $arg" + dash_o="yes" + + if test "x$dash_c" = "xyes"; then + compile_args="$compile_args $arg" + else + link_args="$link_args $arg" + do_link="yes" + get_output_file="yes" + fi + ;; + -E|-M|-MT) + allargs="$allargs $arg" + compile_args="$compile_args $arg" + dash_c="yes" + do_link="no" + ;; + -l*) + libraries=" $libraries $arg " + allargs="$allargs $arg" + ;; + -prefix=*) + prefix="`expr "$arg" : '-prefix=\(.*\)'`" + ;; + -echo) + set -x + ;; + -show) + SHOW="echo" + ;; + -showconfig) + showconfigure + exit $status + ;; + -shlib) + USE_SHARED_LIB="yes" + ;; + -noshlib) + USE_SHARED_LIB="no" + ;; + -help) + usage + ;; + *\"*) + qarg="'"$arg"'" + allargs="$allargs $qarg" + ;; + *\'*) + qarg='\"'"$arg"'\"' + allargs="$allargs $qarg" + ;; + *) + allargs="$allargs $qarg" + + if test -s "$arg"; then + ext=`expr "$arg" : '.*\(\..*\)'` + + if test "x$ext" = "x.c"; then + do_compile="yes" + compile_args="$compile_args $arg" + fname=`basename $arg .c` + link_objs="$link_objs $fname.o" + elif test "x$ext" = "x.o"; then + if test "x$dash_c" = "xyes"; then + compile_args="$compile_args $arg" + else + do_link="yes" + link_objs="$link_objs $arg" + fi + elif test "x$ext" = "x.a"; then + # This is an archive that we're linking in + libraries=" $libraries $arg " + else + compile_args="$compile_args $arg" + link_args="$link_args $arg" + fi + else + compile_args="$compile_args $arg" + link_args="$link_args $arg" + fi + ;; + esac +done + +if test "$dash_c" = "yes" -a "$do_compile" = no -a "$do_link" = no ; then + # -c was specified. Force do_compile on. + do_compile=yes +fi + +if test "x$do_compile" = "xyes"; then + if test "x$dash_c" != "xyes"; then + compile_args="-c $compile_args" + fi + + $SHOW $CC -I$includedir $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $compile_args + status=$? + + if test "$status" != "0"; then + exit $status + fi +fi + +if test "x$do_link" = "xyes"; then + shared_link="" +# conditionnaly link with the hl library + if test "X$HL" = "Xhl"; then + libraries=" $libraries -lhdf5_hl -lhdf5 " + else + libraries=" $libraries -lhdf5 " + fi + link_args="$link_args -L${libdir}" + + case "$kind" in + gcc|linux*) + # MacOS X doesn't support the "-Wl,-rpath -Wl," style of linker flags. + # It appears to want none of them specified. + case "$host_os" in + darwin*) flag="" ;; + *) flag="-Wl,-rpath -Wl," ;; + esac + ;; + hpux*) flag="-Wl,+b -Wl," ;; + freebsd*|solaris*) flag="-R" ;; + rs6000*|aix*) flag="-L" ;; + irix*|sgi) flag="-rpath " ;; + *) flag="" ;; + esac + + if test -n "$flag"; then + shared_link="${flag}${libdir}" + fi + + if test "x$USE_SHARED_LIB" != "xyes"; then + # The "-lhdf5" & "-lhdf5_hl" flags are in here already...This is a static + # compile though, so change it to the static version (.a) of the library. + new_libraries="" + for lib in $libraries; do + case "$lib" in + -lhdf5) + new_libraries="$new_libraries ${libdir}/libhdf5.a" + ;; + -lhdf5_hl) + new_libraries="$new_libraries ${libdir}/libhdf5_hl.a" + ;; + *) + new_libraries="$new_libraries $lib" + ;; + esac + done + libraries="$new_libraries" + fi + + for lib in $libraries; do + if echo $link_args | grep " $lib " > /dev/null || + echo $link_args | grep " $lib$" > /dev/null; then + : + else + link_args="$link_args $lib " + fi + done + + # The LIBS are just a bunch of -l* libraries necessary for the HDF5 + # module. It's okay if they're included twice in the compile line. + link_args="$link_args $H5BLD_LDFLAGS $H5BLD_LIBS" + + # User's CPPFLAGS and CFLAGS come after their H5BLD counterparts. User's + # LDFLAGS come just before clibpath, user's LIBS come after $link_objs and + # before the hdf5 libraries in $link_args, followed by any external library + # paths and libraries from AM_LDFLAGS, LDFLAGS, AM_LIBS or LIBS carried in + # from the hdf5 build. The order of the flags is intended to give precedence + # to the user's flags. + $SHOW $CLINKER $H5BLD_CPPFLAGS $CPPFLAGS $H5BLD_CFLAGS $CFLAGS $LDFLAGS $clibpath $link_objs $LIBS $link_args $shared_link + status=$? +fi + +exit $status diff --git a/privatemodules/nc4/bin/h5copy b/privatemodules/nc4/bin/h5copy new file mode 100755 index 0000000000000000000000000000000000000000..e22eba5a1d9ee352c13ddcc531a39d4e60835125 Binary files /dev/null and b/privatemodules/nc4/bin/h5copy differ diff --git a/privatemodules/nc4/bin/h5debug b/privatemodules/nc4/bin/h5debug new file mode 100755 index 0000000000000000000000000000000000000000..8c0ac0075b766528d6bfe719df289a602c3a45b6 Binary files /dev/null and b/privatemodules/nc4/bin/h5debug differ diff --git a/privatemodules/nc4/bin/h5diff b/privatemodules/nc4/bin/h5diff new file mode 100755 index 0000000000000000000000000000000000000000..f90bcd31abdac14507101f25192ad48d0b4734f2 Binary files /dev/null and b/privatemodules/nc4/bin/h5diff differ diff --git a/privatemodules/nc4/bin/h5dump b/privatemodules/nc4/bin/h5dump new file mode 100755 index 0000000000000000000000000000000000000000..623e25e53b031eb0cff7e8a74cce486033eb3d1a Binary files /dev/null and b/privatemodules/nc4/bin/h5dump differ diff --git a/privatemodules/nc4/bin/h5import b/privatemodules/nc4/bin/h5import new file mode 100755 index 0000000000000000000000000000000000000000..3925beeb8d196421ba96f7a9ef299fbc103cd662 Binary files /dev/null and b/privatemodules/nc4/bin/h5import differ diff --git a/privatemodules/nc4/bin/h5jam b/privatemodules/nc4/bin/h5jam new file mode 100755 index 0000000000000000000000000000000000000000..5ef81a55102784659880eb6616560b1b290f6b42 Binary files /dev/null and b/privatemodules/nc4/bin/h5jam differ diff --git a/privatemodules/nc4/bin/h5ls b/privatemodules/nc4/bin/h5ls new file mode 100755 index 0000000000000000000000000000000000000000..da3b5130c0c0d6ea5f5cbfe73edbc7be4fa379d4 Binary files /dev/null and b/privatemodules/nc4/bin/h5ls differ diff --git a/privatemodules/nc4/bin/h5mkgrp b/privatemodules/nc4/bin/h5mkgrp new file mode 100755 index 0000000000000000000000000000000000000000..3242e0107b7defae320678ff51e51ec629e3f9a4 Binary files /dev/null and b/privatemodules/nc4/bin/h5mkgrp differ diff --git a/privatemodules/nc4/bin/h5perf_serial b/privatemodules/nc4/bin/h5perf_serial new file mode 100755 index 0000000000000000000000000000000000000000..728d8596702e8847e334b8f6473bd68884fada34 Binary files /dev/null and b/privatemodules/nc4/bin/h5perf_serial differ diff --git a/privatemodules/nc4/bin/h5redeploy b/privatemodules/nc4/bin/h5redeploy new file mode 100755 index 0000000000000000000000000000000000000000..6b6ef87db477e3d3edae79284eb8b75379a53c7f --- /dev/null +++ b/privatemodules/nc4/bin/h5redeploy @@ -0,0 +1,218 @@ +#! /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 files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have +# access to either file, you may request a copy from help@hdfgroup.org. +# + +## Update HDF5 compiler tools after the HDF5 software has been installed ## +## in a new location. ## +## For help page, use "h5redeploy -help" ## +## ## + +# Constants definitions +EXIT_SUCCESS=0 +EXIT_FAILURE=1 + +# Function definitions + +# show help page +usage() { + # A wonderfully informative "usage" message. + echo "usage: $prog_name [OPTIONS]" + echo " OPTIONS:" + echo " -help|help This help message" + echo " -echo Show all the shell commands executed" + echo " -force No prompt, just do it" + echo " -prefix=DIR New directory to find HDF5 lib/ and include/" + echo " subdirectories [default: current directory]" + echo " -exec-prefix=DIR New directory to find HDF5 lib/" + echo " subdirectory [default: <prefix>]" + echo " -libdir=DIR New directory for the HDF5 lib directory" + echo " [default: <exec-prefix>/lib]" + echo " -includedir=DIR New directory for the HDF5 header files" + echo " [default: <prefix>/include]" + echo " -tool=TOOL Tool to update. TOOL must be in the current" + echo " directory and writable. [default: $h5tools]" + echo " -show Show the commands without executing them" + echo " " + exit $EXIT_FAILURE +} + +# display variable values +dump_vars(){ + echo "====Showing all variable values=====" + echo prefix=$prefix + echo h5tools=$h5tools + echo "====End Showing=====" +} + +# show actions to be taken +show_action() +{ + echo "Update the following tools because they are now installed at a new directory" + for t in $foundtools; do + echo "${t}:" + echo " current setting=`sed -e '/^prefix=/s/prefix=//p' -e d $t`" + echo " new setting="\""$prefix"\" + done +} + + +# Report Error message +ERROR() +{ + echo "***ERROR***" + echo "$1" +} + +# Main +# +############################################################################ +## Installation directories: ## +## prefix architecture-independent files. ## +## exec_prefix architecture-dependent files, default is <prefix>. ## +## libdir libraries, default is <exec_prefix>/lib. ## +## includedir header files, default is <prefix/include>. ## +## Not used here: ## +## bindir executables, <exec_prefix/bin>. ## +############################################################################ +# Initialization +h5tools="h5cc h5pcc h5fc h5pfc h5c++" # possible hdf5 tools +foundtools= # tools found and will be modified +fmode= # force mode, default is off +prefix= +exec_prefix= +libdir= +includedir= + +# Parse options +for arg in $@ ; do + case "$arg" in + -prefix=*) + prefix="`echo $arg | cut -f2 -d=`" + ;; + -exec-prefix=*) + exec_prefix="`echo $arg | cut -f2 -d=`" + ;; + -libdir=*) + libdir="`echo $arg | cut -f2 -d=`" + ;; + -includedir=*) + includedir="`echo $arg | cut -f2 -d=`" + ;; + -echo) + set -x + ;; + -show) + SHOW="echo" + ;; + -tool=*) + h5tools="`echo $arg | cut -f2 -d=`" + ;; + -help|help) + usage + ;; + -force) + fmode=yes + ;; + *) + ERROR "Unknown Option($arg)" + usage + exit $EXIT_FAILURE + ;; + esac +done + +# Set to default value, one above where i am, if not given by user +if [ -z "$prefix" ]; then + prefix=`(cd ..;pwd)` +fi +if [ -z "$exec_prefix" ]; then + exec_prefix='${prefix}' # use single quotes to prevent expansion of $ +fi +if [ -z "$libdir" ]; then + libdir='${exec_prefix}'/lib # use single quotes to prevent expansion of $ +fi +if [ -z "$includedir" ]; then + includedir='${prefix}'/include # use single quotes to prevent expansion of $ +fi + +for x in $h5tools; do + if [ -f $x ]; then + foundtools="$foundtools $x" + if [ ! -w $x ]; then + ERROR "h5tool($x) is not writable" + exit $EXIT_FAILURE + fi + fi +done + +if [ -z "$foundtools" ]; then + ERROR "found no tools to modify" + exit $EXIT_FAILURE +fi + +# Show actions to be taken and get consent +show_action +# Ask confirmation unless fmode is on +if [ x-$fmode = x- ]; then + echo "Continue? (yes/no)" + read ansx + ans=`echo $ansx | tr "[A-Z]" "[a-z]"` + if [ x-$ans != x-yes ]; then + echo ABORT. No tools changed. + exit $EXIT_FAILURE + fi +fi + + +# Create the update commands +CMDFILE=/tmp/h5redeploy.$$ +touch $CMDFILE +chmod 0600 $CMDFILE +echo "/^prefix=/c" >> $CMDFILE +echo prefix=\""$prefix"\" >> $CMDFILE +echo . >> $CMDFILE +echo "/^exec_prefix=/c" >> $CMDFILE +echo exec_prefix=\""$exec_prefix"\" >> $CMDFILE +echo . >> $CMDFILE +echo "/^libdir=/c" >> $CMDFILE +echo libdir=\""$libdir"\" >> $CMDFILE +echo . >> $CMDFILE +echo "/^includedir=/c" >> $CMDFILE +echo includedir=\""$includedir"\" >> $CMDFILE +echo . >> $CMDFILE +(echo w; echo q) >> $CMDFILE + + +# Update them +if [ "$SHOW" = "echo" ]; then + echo "===Update commands are:====" + cat $CMDFILE + echo "===End Update commands=====" +fi + +for t in $foundtools; do + echo Update $t ... + COMMAND="ed - $t" + if [ "$SHOW" = "echo" ]; then + echo $COMMAND + else + $COMMAND < $CMDFILE + fi +done + + +# Cleanup +rm -f $CMDFILE +exit $EXIT_SUCCESS diff --git a/privatemodules/nc4/bin/h5repack b/privatemodules/nc4/bin/h5repack new file mode 100755 index 0000000000000000000000000000000000000000..c1d1947ad4c06ffc954c02091ef580f1d5c5de34 Binary files /dev/null and b/privatemodules/nc4/bin/h5repack differ diff --git a/privatemodules/nc4/bin/h5repart b/privatemodules/nc4/bin/h5repart new file mode 100755 index 0000000000000000000000000000000000000000..fefabdc4f31b89108a6c2a189f349a910f0922ca Binary files /dev/null and b/privatemodules/nc4/bin/h5repart differ diff --git a/privatemodules/nc4/bin/h5stat b/privatemodules/nc4/bin/h5stat new file mode 100755 index 0000000000000000000000000000000000000000..b5a2baccb31f7357ebd1b98399795fe3d33f2fba Binary files /dev/null and b/privatemodules/nc4/bin/h5stat differ diff --git a/privatemodules/nc4/bin/h5unjam b/privatemodules/nc4/bin/h5unjam new file mode 100755 index 0000000000000000000000000000000000000000..3662bb1f2d074ad79e721f3d49e1bf5e0805e0ec Binary files /dev/null and b/privatemodules/nc4/bin/h5unjam differ diff --git a/privatemodules/nc4/bin/nc-config b/privatemodules/nc4/bin/nc-config new file mode 100755 index 0000000000000000000000000000000000000000..26511b48af4f06040c161a0b67904fd8c1274578 --- /dev/null +++ b/privatemodules/nc4/bin/nc-config @@ -0,0 +1,305 @@ +#! /bin/sh +# +# This forms the basis for the nc-config utility, which tells you +# various things about the netCDF installation. This code was +# contributed by netCDF user Arlindo DaSilva. Thanks Arlindo! + +prefix=/home/erikvs/privatemodules/nc4 +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +cc="gcc" +cflags="-I${includedir} -I/home/erikvs/privatemodules/nc4/include" +libs="-L${libdir} -lnetcdf" + +has_dap="yes" +has_nc2="yes" +has_nc4="yes" +has_hdf4="no" +has_pnetcdf="no" +has_hdf5="yes" +has_logging="no" +version="netCDF 4.4.1.1" + +has_fortran="no" +has_f90="no" +has_f03="no" + +nfconf=$(which nf-config 2>/dev/null) + +if [ -f "$nfconf" ]; then + has_fortran="yes" + fc=`nf-config --fc` + fflags=`nf-config --fflags` + flibs=`nf-config --flibs` + has_f90=`nf-config --has-f90` + has_f03=`nf-config --has-f03` +fi + +has_cxx="no" +has_cxx4="no" +if type -p ncxx4-config > /dev/null 2>&1; then + cxx4=`ncxx4-config --cxx` + cxx4flags=`ncxx4-config --cflags` + cxx4libs=`ncxx4-config --libs` + has_cxx4="yes" +elif type -p ncxx-config > /dev/null 2>&1; then + cxx=`ncxx-config --cxx` + cxxflags=`ncxx-config --cflags` + cxxlibs=`ncxx-config --libs` + has_cxx="yes" +fi + +usage() +{ + cat <<EOF +Usage: nc-config [OPTION] + +Available values for OPTION include: + + --help display this help message and exit + --all display all options + --cc C compiler + --cflags pre-processor and compiler flags + --has-c++ whether C++ API is installed + --has-c++4 whether netCDF-4 C++ API is installed + --has-fortran whether Fortran API is installed + --has-dap whether OPeNDAP is enabled in this build + --has-nc2 whether NetCDF-2 API is enabled + --has-nc4 whether NetCDF-4/HDF-5 is enabled in this build + --has-hdf5 whether HDF5 is used in build (always the same as --has-nc4) + --has-hdf4 whether HDF4 was used in build + --has-logging whether logging is enabled with --enable-logging. + --has-pnetcdf whether parallel-netcdf (a.k.a. pnetcdf) was used in build + --has-szlib whether szlib is included in build + --libs library linking information for netcdf + --prefix Install prefix + --includedir Include directory + --libdir Library directory + --version Library version + +EOF +if type -p ncxx4-config > /dev/null 2>&1; then + cat <<EOF + --cxx4 C++ compiler for netCDF-4 C++ library + --cxx4flags flags needed to compile a C++ program + --cxx4libs libraries needed to link a C++ program +EOF +elif type -p ncxx-config > /dev/null 2>&1; then + cat <<EOF + --cxx C++ compiler + --cxxflags flags needed to compile a C++ program + --cxxlibs libraries needed to link a C++ program +EOF +fi +if [ -f "$nfconf" ]; then + cat <<EOF + --fc Fortran compiler + --fflags flags needed to compile a Fortran program + --flibs libraries needed to link a Fortran program + --has-f90 whether Fortran 90 API is installed + --has-f03 whether Fortran 03 API is installed (implies F90). +EOF +fi + exit $1 +} + +all() +{ + echo + echo "This $version has been built with the following features: " + echo + echo " --cc -> $cc" + echo " --cflags -> $cflags" + echo " --libs -> $libs" + echo + echo " --has-c++ -> $has_cxx" + echo " --cxx -> $cxx" + +if type -p ncxx-config > /dev/null 2>&1; then + echo " --cxxflags -> $cxxflags" + echo " --cxxlibs -> $cxxlibs" +fi + echo + echo " --has-c++4 -> $has_cxx4" + echo " --cxx4 -> $cxx4" +if type -p ncxx4-config > /dev/null 2>&1; then + echo " --cxx4flags -> $cxx4flags" + echo " --cxx4libs -> $cxx4libs" +fi + echo + + echo " --has-fortran-> $has_fortran" +if [ -f "$nfconf" ]; then + echo " --fc -> $fc" + echo " --fflags -> $fflags" + echo " --flibs -> $flibs" + echo " --has-f90 -> $has_f90" + echo " --has-f03 -> $has_f03" + echo +fi + echo " --has-dap -> $has_dap" + echo " --has-nc2 -> $has_nc2" + echo " --has-nc4 -> $has_nc4" + echo " --has-hdf5 -> $has_hdf5" + echo " --has-hdf4 -> $has_hdf4" + echo " --has-logging-> $has_logging" + echo " --has-pnetcdf-> $has_pnetcdf" + echo " --has-szlib -> $has_szlib" + echo + echo " --prefix -> $prefix" + echo " --includedir-> $includedir" + echo " --libdir -> $libdir" + echo " --version -> $version" + echo +} + +if test $# -eq 0; then + usage 1 +fi + +while test $# -gt 0; do + case "$1" in + # this deals with options in the style + # --option=value and extracts the value part + # [not currently used] + -*=*) value=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) value= ;; + esac + + case "$1" in + + --help) + usage 0 + ;; + + --all) + all + ;; + + --cc) + echo $cc + ;; + + --cflags) + echo $cflags + ;; + + --has-dap) + echo $has_dap + ;; + + --has-nc2) + echo $has_nc2 + ;; + + --has-nc4) + echo $has_nc4 + ;; + + --has-hdf5) + echo $has_hdf5 + ;; + + --has-hdf4) + echo $has_hdf4 + ;; + + --has-logging) + echo $has_logging + ;; + + --has-pnetcdf) + echo $has_pnetcdf + ;; + + --has-szlib) + echo $has_szlib + ;; + + --libs) + echo $libs + ;; + + --prefix) + echo "${prefix}" + ;; + + --includedir) + echo "${includedir}" + ;; + + --libdir) + echo "${libdir}" + ;; + + --version) + echo $version + ;; + + --has-c++) + echo $has_cxx + ;; + + --cxx) + echo $cxx + ;; + + --cxxflags) + echo $cxxflags + ;; + + --cxxlibs) + echo $cxxlibs + ;; + + --has-c++4) + echo $has_cxx4 + ;; + + --cxx4) + echo $cxx4 + ;; + + --cxx4flags) + echo $cxx4flags + ;; + + --cxx4libs) + echo $cxx4libs + ;; + + --has-fortran) + echo $has_fortran + ;; + + --fc) + echo $fc + ;; + + --fflags) + echo $fflags + ;; + + --flibs) + echo $flibs + ;; + + --has-f90) + echo $has_f90 + ;; + + --has-f03) + echo $has_f03 + ;; + + *) + echo "unknown option: $1" + usage 1 + ;; + esac + shift +done + +exit 0 diff --git a/privatemodules/nc4/bin/nccopy b/privatemodules/nc4/bin/nccopy new file mode 100755 index 0000000000000000000000000000000000000000..2587bb1ae07cadb2ffd4afff5ecc1363fa1894b9 Binary files /dev/null and b/privatemodules/nc4/bin/nccopy differ diff --git a/privatemodules/nc4/bin/ncdump b/privatemodules/nc4/bin/ncdump new file mode 100755 index 0000000000000000000000000000000000000000..b61f2f51688ac0088b566b23672a21f942a64f80 Binary files /dev/null and b/privatemodules/nc4/bin/ncdump differ diff --git a/privatemodules/nc4/bin/ncgen b/privatemodules/nc4/bin/ncgen new file mode 100755 index 0000000000000000000000000000000000000000..144d9e1ee76b97acffaa7e0adb268fd9ffa4da32 Binary files /dev/null and b/privatemodules/nc4/bin/ncgen differ diff --git a/privatemodules/nc4/bin/ncgen3 b/privatemodules/nc4/bin/ncgen3 new file mode 100755 index 0000000000000000000000000000000000000000..c8c1fec6fe74344ce442b777012430a257d7ee53 Binary files /dev/null and b/privatemodules/nc4/bin/ncgen3 differ diff --git a/privatemodules/nc4/bin/nf-config b/privatemodules/nc4/bin/nf-config new file mode 100755 index 0000000000000000000000000000000000000000..b0a2c56e8a1064393e4ae5fad066e78f800fcee3 --- /dev/null +++ b/privatemodules/nc4/bin/nf-config @@ -0,0 +1,158 @@ +#! /bin/sh +# +# This forms the basis for the nf-config utility, which tells you +# various things about the netCDF fortran installation. + +prefix=/home/erikvs/privatemodules/nc4 +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include + +cc="gcc" +fc="gfortran" +cflags=" -I${includedir} -I/home/erikvs/privatemodules/nc4/include" +fflags="-I${includedir}" +has_dap="yes" +has_nc2="yes" +has_nc4="yes" +has_f90="no" +has_f03="yes" +flibs="-L${libdir} -lnetcdff -L/home/erikvs/privatemodules/nc4/lib -lnetcdf -lnetcdf " +version="netCDF-Fortran 4.4.4" + +usage() +{ + cat <<EOF +Usage: nf-config [OPTION] + +Available values for OPTION include: + + --help display this help message and exit + --all display all options + --cc C compiler + --fc Fortran compiler + --cflags pre-processor and compiler flags + --fflags flags needed to compile a Fortran program + --has-dap whether OPeNDAP is enabled in this build + --has-nc2 whether NetCDF-2 API is enabled + --has-nc4 whether NetCDF-4/HDF-5 is enabled in this build + --has-f90 whether Fortran 90 API is enabled in this build + --has-f03 whether Fortran 2003 API is enabled in this build + --flibs libraries needed to link a Fortran program + --prefix Install prefix + --includedir Include directory + --version Library version + +EOF + + exit $1 +} + +all() +{ + echo + echo "This $version has been built with the following features: " + echo + echo " --cc -> $cc" + echo " --cflags -> $cflags" + echo + echo " --fc -> $fc" + echo " --fflags -> $fflags" + echo " --flibs -> $flibs" + echo " --has-f90 -> $has_f90" + echo " --has-f03 -> $has_f03" + echo + echo " --has-nc2 -> $has_nc2" + echo " --has-nc4 -> $has_nc4" + echo + echo " --prefix -> $prefix" + echo " --includedir-> $includedir" + echo " --version -> $version" + echo +} + +if test $# -eq 0; then + usage 1 +fi + +while test $# -gt 0; do + case "$1" in + # this deals with options in the style + # --option=value and extracts the value part + # [not currently used] + -*=*) value=`echo "$1" | sed 's/[-_a-zA-Z0-9]*=//'` ;; + *) value= ;; + esac + + case "$1" in + + --help) + usage 0 + ;; + + --all) + all + ;; + + --cc) + echo $cc + ;; + + --fc) + echo $fc + ;; + + --cflags) + echo $cflags + ;; + + --fflags) + echo $fflags + ;; + + --has-dap) + echo $has_dap + ;; + + --has-nc2) + echo $has_nc2 + ;; + + --has-nc4) + echo $has_nc4 + ;; + + --has-f90) + echo $has_f90 + ;; + + --has-f03) + echo $has_f03 + ;; + + --flibs) + echo $flibs + ;; + + --prefix) + echo "${prefix}" + ;; + + --includedir) + echo "${includedir}" + ;; + + --version) + echo $version + ;; + + *) + echo "unknown option: $1" + usage + exit 1 + ;; + esac + shift +done + +exit 0 diff --git a/privatemodules/nc4/include/H5ACpublic.h b/privatemodules/nc4/include/H5ACpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..639179ce3b2bcc253739764d7f5f1b4b648c9024 --- /dev/null +++ b/privatemodules/nc4/include/H5ACpublic.h @@ -0,0 +1,508 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5ACpublic.h + * Jul 10 1997 + * Robb Matzke <matzke@llnl.gov> + * + * Purpose: Public include file for cache functions. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +#ifndef _H5ACpublic_H +#define _H5ACpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Cpublic.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/**************************************************************************** + * + * structure H5AC_cache_config_t + * + * H5AC_cache_config_t is a public structure intended for use in public APIs. + * At least in its initial incarnation, it is basicaly a copy of struct + * H5C_auto_size_ctl_t, minus the report_fcn field, and plus the + * dirty_bytes_threshold field. + * + * The report_fcn field is omitted, as including it would require us to + * make H5C_t structure public. + * + * The dirty_bytes_threshold field does not appear in H5C_auto_size_ctl_t, + * as synchronization between caches on different processes is handled at + * the H5AC level, not at the level of H5C. Note however that there is + * considerable interaction between this value and the other fields in this + * structure. + * + * Similarly, the open_trace_file, close_trace_file, and trace_file_name + * fields do not appear in H5C_auto_size_ctl_t, as most trace file + * issues are handled at the H5AC level. The one exception is storage of + * the pointer to the trace file, which is handled by H5C. + * + * The structure is in H5ACpublic.h as we may wish to allow different + * configuration options for metadata and raw data caches. + * + * The fields of the structure are discussed individually below: + * + * version: Integer field containing the version number of this version + * of the H5AC_cache_config_t structure. Any instance of + * H5AC_cache_config_t passed to the cache must have a known + * version number, or an error will be flagged. + * + * rpt_fcn_enabled: Boolean field used to enable and disable the default + * reporting function. This function is invoked every time the + * automatic cache resize code is run, and reports on its activities. + * + * This is a debugging function, and should normally be turned off. + * + * open_trace_file: Boolean field indicating whether the trace_file_name + * field should be used to open a trace file for the cache. + * + * The trace file is a debuging feature that allow the capture of + * top level metadata cache requests for purposes of debugging and/or + * optimization. This field should normally be set to FALSE, as + * trace file collection imposes considerable overhead. + * + * This field should only be set to TRUE when the trace_file_name + * contains the full path of the desired trace file, and either + * there is no open trace file on the cache, or the close_trace_file + * field is also TRUE. + * + * close_trace_file: Boolean field indicating whether the current trace + * file (if any) should be closed. + * + * See the above comments on the open_trace_file field. This field + * should be set to FALSE unless there is an open trace file on the + * cache that you wish to close. + * + * trace_file_name: Full path of the trace file to be opened if the + * open_trace_file field is TRUE. + * + * In the parallel case, an ascii representation of the mpi rank of + * the process will be appended to the file name to yield a unique + * trace file name for each process. + * + * The length of the path must not exceed H5AC__MAX_TRACE_FILE_NAME_LEN + * characters. + * + * evictions_enabled: Boolean field used to either report the current + * evictions enabled status of the cache, or to set the cache's + * evictions enabled status. + * + * In general, the metadata cache should always be allowed to + * evict entries. However, in some cases it is advantageous to + * disable evictions briefly, and thereby postpone metadata + * writes. However, this must be done with care, as the cache + * can grow quickly. If you do this, re-enable evictions as + * soon as possible and monitor cache size. + * + * At present, evictions can only be disabled if automatic + * cache resizing is also disabled (that is, ( incr_mode == + * H5C_incr__off ) && ( decr_mode == H5C_decr__off )). There + * is no logical reason why this should be so, but it simplifies + * implementation and testing, and I can't think of any reason + * why it would be desireable. If you can think of one, I'll + * revisit the issue. + * + * set_initial_size: Boolean flag indicating whether the size of the + * initial size of the cache is to be set to the value given in + * the initial_size field. If set_initial_size is FALSE, the + * initial_size field is ignored. + * + * initial_size: If enabled, this field contain the size the cache is + * to be set to upon receipt of this structure. Needless to say, + * initial_size must lie in the closed interval [min_size, max_size]. + * + * min_clean_fraction: double in the range 0 to 1 indicating the fraction + * of the cache that is to be kept clean. This field is only used + * in parallel mode. Typical values are 0.1 to 0.5. + * + * max_size: Maximum size to which the cache can be adjusted. The + * supplied value must fall in the closed interval + * [MIN_MAX_CACHE_SIZE, MAX_MAX_CACHE_SIZE]. Also, max_size must + * be greater than or equal to min_size. + * + * min_size: Minimum size to which the cache can be adjusted. The + * supplied value must fall in the closed interval + * [H5C__MIN_MAX_CACHE_SIZE, H5C__MAX_MAX_CACHE_SIZE]. Also, min_size + * must be less than or equal to max_size. + * + * epoch_length: Number of accesses on the cache over which to collect + * hit rate stats before running the automatic cache resize code, + * if it is enabled. + * + * At the end of an epoch, we discard prior hit rate data and start + * collecting afresh. The epoch_length must lie in the closed + * interval [H5C__MIN_AR_EPOCH_LENGTH, H5C__MAX_AR_EPOCH_LENGTH]. + * + * + * Cache size increase control fields: + * + * incr_mode: Instance of the H5C_cache_incr_mode enumerated type whose + * value indicates how we determine whether the cache size should be + * increased. At present there are two possible values: + * + * H5C_incr__off: Don't attempt to increase the size of the cache + * automatically. + * + * When this increment mode is selected, the remaining fields + * in the cache size increase section ar ignored. + * + * H5C_incr__threshold: Attempt to increase the size of the cache + * whenever the average hit rate over the last epoch drops + * below the value supplied in the lower_hr_threshold + * field. + * + * Note that this attempt will fail if the cache is already + * at its maximum size, or if the cache is not already using + * all available space. + * + * Note that you must set decr_mode to H5C_incr__off if you + * disable metadata cache entry evictions. + * + * lower_hr_threshold: Lower hit rate threshold. If the increment mode + * (incr_mode) is H5C_incr__threshold and the hit rate drops below the + * value supplied in this field in an epoch, increment the cache size by + * size_increment. Note that cache size may not be incremented above + * max_size, and that the increment may be further restricted by the + * max_increment field if it is enabled. + * + * When enabled, this field must contain a value in the range [0.0, 1.0]. + * Depending on the incr_mode selected, it may also have to be less than + * upper_hr_threshold. + * + * increment: Double containing the multiplier used to derive the new + * cache size from the old if a cache size increment is triggered. + * The increment must be greater than 1.0, and should not exceed 2.0. + * + * The new cache size is obtained my multiplying the current max cache + * size by the increment, and then clamping to max_size and to stay + * within the max_increment as necessary. + * + * apply_max_increment: Boolean flag indicating whether the max_increment + * field should be used to limit the maximum cache size increment. + * + * max_increment: If enabled by the apply_max_increment field described + * above, this field contains the maximum number of bytes by which the + * cache size can be increased in a single re-size. + * + * flash_incr_mode: Instance of the H5C_cache_flash_incr_mode enumerated + * type whose value indicates whether and by which algorithm we should + * make flash increases in the size of the cache to accomodate insertion + * of large entries and large increases in the size of a single entry. + * + * The addition of the flash increment mode was occasioned by performance + * problems that appear when a local heap is increased to a size in excess + * of the current cache size. While the existing re-size code dealt with + * this eventually, performance was very bad for the remainder of the + * epoch. + * + * At present, there are two possible values for the flash_incr_mode: + * + * H5C_flash_incr__off: Don't perform flash increases in the size of + * the cache. + * + * H5C_flash_incr__add_space: Let x be either the size of a newly + * newly inserted entry, or the number of bytes by which the + * size of an existing entry has been increased. + * + * If + * x > flash_threshold * current max cache size, + * + * increase the current maximum cache size by x * flash_multiple + * less any free space in the cache, and star a new epoch. For + * now at least, pay no attention to the maximum increment. + * + * In both of the above cases, the flash increment pays no attention to + * the maximum increment (at least in this first incarnation), but DOES + * stay within max_size. + * + * With a little thought, it should be obvious that the above flash + * cache size increase algorithm is not sufficient for all circumstances + * -- for example, suppose the user round robins through + * (1/flash_threshold) +1 groups, adding one data set to each on each + * pass. Then all will increase in size at about the same time, requiring + * the max cache size to at least double to maintain acceptable + * performance, however the above flash increment algorithm will not be + * triggered. + * + * Hopefully, the add space algorithms detailed above will be sufficient + * for the performance problems encountered to date. However, we should + * expect to revisit the issue. + * + * flash_multiple: Double containing the multiple described above in the + * H5C_flash_incr__add_space section of the discussion of the + * flash_incr_mode section. This field is ignored unless flash_incr_mode + * is H5C_flash_incr__add_space. + * + * flash_threshold: Double containing the factor by which current max cache + * size is multiplied to obtain the size threshold for the add_space flash + * increment algorithm. The field is ignored unless flash_incr_mode is + * H5C_flash_incr__add_space. + * + * + * Cache size decrease control fields: + * + * decr_mode: Instance of the H5C_cache_decr_mode enumerated type whose + * value indicates how we determine whether the cache size should be + * decreased. At present there are four possibilities. + * + * H5C_decr__off: Don't attempt to decrease the size of the cache + * automatically. + * + * When this increment mode is selected, the remaining fields + * in the cache size decrease section are ignored. + * + * H5C_decr__threshold: Attempt to decrease the size of the cache + * whenever the average hit rate over the last epoch rises + * above the value supplied in the upper_hr_threshold + * field. + * + * H5C_decr__age_out: At the end of each epoch, search the cache for + * entries that have not been accessed for at least the number + * of epochs specified in the epochs_before_eviction field, and + * evict these entries. Conceptually, the maximum cache size + * is then decreased to match the new actual cache size. However, + * this reduction may be modified by the min_size, the + * max_decrement, and/or the empty_reserve. + * + * H5C_decr__age_out_with_threshold: Same as age_out, but we only + * attempt to reduce the cache size when the hit rate observed + * over the last epoch exceeds the value provided in the + * upper_hr_threshold field. + * + * Note that you must set decr_mode to H5C_decr__off if you + * disable metadata cache entry evictions. + * + * upper_hr_threshold: Upper hit rate threshold. The use of this field + * varies according to the current decr_mode: + * + * H5C_decr__off or H5C_decr__age_out: The value of this field is + * ignored. + * + * H5C_decr__threshold: If the hit rate exceeds this threshold in any + * epoch, attempt to decrement the cache size by size_decrement. + * + * Note that cache size may not be decremented below min_size. + * + * Note also that if the upper_threshold is 1.0, the cache size + * will never be reduced. + * + * H5C_decr__age_out_with_threshold: If the hit rate exceeds this + * threshold in any epoch, attempt to reduce the cache size + * by evicting entries that have not been accessed for more + * than the specified number of epochs. + * + * decrement: This field is only used when the decr_mode is + * H5C_decr__threshold. + * + * The field is a double containing the multiplier used to derive the + * new cache size from the old if a cache size decrement is triggered. + * The decrement must be in the range 0.0 (in which case the cache will + * try to contract to its minimum size) to 1.0 (in which case the + * cache will never shrink). + * + * apply_max_decrement: Boolean flag used to determine whether decrements + * in cache size are to be limited by the max_decrement field. + * + * max_decrement: Maximum number of bytes by which the cache size can be + * decreased in a single re-size. Note that decrements may also be + * restricted by the min_size of the cache, and (in age out modes) by + * the empty_reserve field. + * + * epochs_before_eviction: Integer field used in H5C_decr__age_out and + * H5C_decr__age_out_with_threshold decrement modes. + * + * This field contains the number of epochs an entry must remain + * unaccessed before it is evicted in an attempt to reduce the + * cache size. If applicable, this field must lie in the range + * [1, H5C__MAX_EPOCH_MARKERS]. + * + * apply_empty_reserve: Boolean field controlling whether the empty_reserve + * field is to be used in computing the new cache size when the + * decr_mode is H5C_decr__age_out or H5C_decr__age_out_with_threshold. + * + * empty_reserve: To avoid a constant racheting down of cache size by small + * amounts in the H5C_decr__age_out and H5C_decr__age_out_with_threshold + * modes, this field allows one to require that any cache size + * reductions leave the specified fraction of unused space in the cache. + * + * The value of this field must be in the range [0.0, 1.0]. I would + * expect typical values to be in the range of 0.01 to 0.1. + * + * + * Parallel Configuration Fields: + * + * In PHDF5, all operations that modify metadata must be executed collectively. + * + * We used to think that this was enough to ensure consistency across the + * metadata caches, but since we allow processes to read metadata individually, + * the order of dirty entries in the LRU list can vary across processes, + * which can result in inconsistencies between the caches. + * + * PHDF5 uses several strategies to prevent such inconsistencies in metadata, + * all of which use the fact that the same stream of dirty metadata is seen + * by all processes for purposes of synchronization. This is done by + * having each process count the number of bytes of dirty metadata generated, + * and then running a "sync point" whenever this count exceeds a user + * specified threshold (see dirty_bytes_threshold below). + * + * The current metadata write strategy is indicated by the + * metadata_write_strategy field. The possible values of this field, along + * with the associated metadata write strategies are discussed below. + * + * dirty_bytes_threshold: Threshold of dirty byte creation used to + * synchronize updates between caches. (See above for outline and + * motivation.) + * + * This value MUST be consistant across all processes accessing the + * file. This field is ignored unless HDF5 has been compiled for + * parallel. + * + * metadata_write_strategy: Integer field containing a code indicating the + * desired metadata write strategy. The valid values of this field + * are enumerated and discussed below: + * + * + * H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY: + * + * When metadata_write_strategy is set to this value, only process + * zero is allowed to write dirty metadata to disk. All other + * processes must retain dirty metadata until they are informed at + * a sync point that the dirty metadata in question has been written + * to disk. + * + * When the sync point is reached (or when there is a user generated + * flush), process zero flushes sufficient entries to bring it into + * complience with its min clean size (or flushes all dirty entries in + * the case of a user generated flush), broad casts the list of + * entries just cleaned to all the other processes, and then exits + * the sync point. + * + * Upon receipt of the broadcast, the other processes mark the indicated + * entries as clean, and leave the sync point as well. + * + * + * H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED: + * + * In the distributed metadata write strategy, process zero still makes + * the decisions as to what entries should be flushed, but the actual + * flushes are distributed across the processes in the computation to + * the extent possible. + * + * In this strategy, when a sync point is triggered (either by dirty + * metadata creation or manual flush), all processes enter a barrier. + * + * On the other side of the barrier, process 0 constructs an ordered + * list of the entries to be flushed, and then broadcasts this list + * to the caches in all the processes. + * + * All processes then scan the list of entries to be flushed, flushing + * some, and marking the rest as clean. The algorithm for this purpose + * ensures that each entry in the list is flushed exactly once, and + * all are marked clean in each cache. + * + * Note that in the case of a flush of the cache, no message passing + * is necessary, as all processes have the same list of dirty entries, + * and all of these entries must be flushed. Thus in this case it is + * sufficient for each process to sort its list of dirty entries after + * leaving the initial barrier, and use this list as if it had been + * received from process zero. + * + * To avoid possible messages from the past/future, all caches must + * wait until all caches are done before leaving the sync point. + * + ****************************************************************************/ + +#define H5AC__CURR_CACHE_CONFIG_VERSION 1 +#define H5AC__MAX_TRACE_FILE_NAME_LEN 1024 + +#define H5AC_METADATA_WRITE_STRATEGY__PROCESS_0_ONLY 0 +#define H5AC_METADATA_WRITE_STRATEGY__DISTRIBUTED 1 + +typedef struct H5AC_cache_config_t +{ + /* general configuration fields: */ + int version; + + hbool_t rpt_fcn_enabled; + + hbool_t open_trace_file; + hbool_t close_trace_file; + char trace_file_name[H5AC__MAX_TRACE_FILE_NAME_LEN + 1]; + + hbool_t evictions_enabled; + + hbool_t set_initial_size; + size_t initial_size; + + double min_clean_fraction; + + size_t max_size; + size_t min_size; + + long int epoch_length; + + + /* size increase control fields: */ + enum H5C_cache_incr_mode incr_mode; + + double lower_hr_threshold; + + double increment; + + hbool_t apply_max_increment; + size_t max_increment; + + enum H5C_cache_flash_incr_mode flash_incr_mode; + double flash_multiple; + double flash_threshold; + + + /* size decrease control fields: */ + enum H5C_cache_decr_mode decr_mode; + + double upper_hr_threshold; + + double decrement; + + hbool_t apply_max_decrement; + size_t max_decrement; + + int epochs_before_eviction; + + hbool_t apply_empty_reserve; + double empty_reserve; + + + /* parallel configuration fields: */ + int dirty_bytes_threshold; + int metadata_write_strategy; + +} H5AC_cache_config_t; + + +#ifdef __cplusplus +} +#endif +#endif diff --git a/privatemodules/nc4/include/H5Apublic.h b/privatemodules/nc4/include/H5Apublic.h new file mode 100644 index 0000000000000000000000000000000000000000..99ca90e114a779e464ad138f57e5b045baf30a13 --- /dev/null +++ b/privatemodules/nc4/include/H5Apublic.h @@ -0,0 +1,120 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5A module. + */ +#ifndef _H5Apublic_H +#define _H5Apublic_H + +/* Public headers needed by this file */ +#include "H5Ipublic.h" /* IDs */ +#include "H5Opublic.h" /* Object Headers */ +#include "H5Tpublic.h" /* Datatypes */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Information struct for attribute (for H5Aget_info/H5Aget_info_by_idx) */ +typedef struct { + hbool_t corder_valid; /* Indicate if creation order is valid */ + H5O_msg_crt_idx_t corder; /* Creation order */ + H5T_cset_t cset; /* Character set of attribute name */ + hsize_t data_size; /* Size of raw data */ +} H5A_info_t; + +/* Typedef for H5Aiterate2() callbacks */ +typedef herr_t (*H5A_operator2_t)(hid_t location_id/*in*/, + const char *attr_name/*in*/, const H5A_info_t *ainfo/*in*/, void *op_data/*in,out*/); + +/* Public function prototypes */ +H5_DLL hid_t H5Acreate2(hid_t loc_id, const char *attr_name, hid_t type_id, + hid_t space_id, hid_t acpl_id, hid_t aapl_id); +H5_DLL hid_t H5Acreate_by_name(hid_t loc_id, const char *obj_name, const char *attr_name, + hid_t type_id, hid_t space_id, hid_t acpl_id, hid_t aapl_id, hid_t lapl_id); +H5_DLL hid_t H5Aopen(hid_t obj_id, const char *attr_name, hid_t aapl_id); +H5_DLL hid_t H5Aopen_by_name(hid_t loc_id, const char *obj_name, + const char *attr_name, hid_t aapl_id, hid_t lapl_id); +H5_DLL hid_t H5Aopen_by_idx(hid_t loc_id, const char *obj_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t aapl_id, + hid_t lapl_id); +H5_DLL herr_t H5Awrite(hid_t attr_id, hid_t type_id, const void *buf); +H5_DLL herr_t H5Aread(hid_t attr_id, hid_t type_id, void *buf); +H5_DLL herr_t H5Aclose(hid_t attr_id); +H5_DLL hid_t H5Aget_space(hid_t attr_id); +H5_DLL hid_t H5Aget_type(hid_t attr_id); +H5_DLL hid_t H5Aget_create_plist(hid_t attr_id); +H5_DLL ssize_t H5Aget_name(hid_t attr_id, size_t buf_size, char *buf); +H5_DLL ssize_t H5Aget_name_by_idx(hid_t loc_id, const char *obj_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, + char *name /*out*/, size_t size, hid_t lapl_id); +H5_DLL hsize_t H5Aget_storage_size(hid_t attr_id); +H5_DLL herr_t H5Aget_info(hid_t attr_id, H5A_info_t *ainfo /*out*/); +H5_DLL herr_t H5Aget_info_by_name(hid_t loc_id, const char *obj_name, + const char *attr_name, H5A_info_t *ainfo /*out*/, hid_t lapl_id); +H5_DLL herr_t H5Aget_info_by_idx(hid_t loc_id, const char *obj_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, + H5A_info_t *ainfo /*out*/, hid_t lapl_id); +H5_DLL herr_t H5Arename(hid_t loc_id, const char *old_name, const char *new_name); +H5_DLL herr_t H5Arename_by_name(hid_t loc_id, const char *obj_name, + const char *old_attr_name, const char *new_attr_name, hid_t lapl_id); +H5_DLL herr_t H5Aiterate2(hid_t loc_id, H5_index_t idx_type, + H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op, void *op_data); +H5_DLL herr_t H5Aiterate_by_name(hid_t loc_id, const char *obj_name, H5_index_t idx_type, + H5_iter_order_t order, hsize_t *idx, H5A_operator2_t op, void *op_data, + hid_t lapd_id); +H5_DLL herr_t H5Adelete(hid_t loc_id, const char *name); +H5_DLL herr_t H5Adelete_by_name(hid_t loc_id, const char *obj_name, + const char *attr_name, hid_t lapl_id); +H5_DLL herr_t H5Adelete_by_idx(hid_t loc_id, const char *obj_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id); +H5_DLL htri_t H5Aexists(hid_t obj_id, const char *attr_name); +H5_DLL htri_t H5Aexists_by_name(hid_t obj_id, const char *obj_name, + const char *attr_name, hid_t lapl_id); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Macros */ + + +/* Typedefs */ + +/* Typedef for H5Aiterate1() callbacks */ +typedef herr_t (*H5A_operator1_t)(hid_t location_id/*in*/, + const char *attr_name/*in*/, void *operator_data/*in,out*/); + + +/* Function prototypes */ +H5_DLL hid_t H5Acreate1(hid_t loc_id, const char *name, hid_t type_id, + hid_t space_id, hid_t acpl_id); +H5_DLL hid_t H5Aopen_name(hid_t loc_id, const char *name); +H5_DLL hid_t H5Aopen_idx(hid_t loc_id, unsigned idx); +H5_DLL int H5Aget_num_attrs(hid_t loc_id); +H5_DLL herr_t H5Aiterate1(hid_t loc_id, unsigned *attr_num, H5A_operator1_t op, + void *op_data); + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif + +#endif /* _H5Apublic_H */ + diff --git a/privatemodules/nc4/include/H5Cpublic.h b/privatemodules/nc4/include/H5Cpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..39ebbe3760a183d8fdbb3f9d260fe8af851cf64a --- /dev/null +++ b/privatemodules/nc4/include/H5Cpublic.h @@ -0,0 +1,61 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Cpublic.h + * June 4, 2005 + * John Mainzer + * + * Purpose: Public include file for cache functions. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +#ifndef _H5Cpublic_H +#define _H5Cpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" + +#ifdef __cplusplus +extern "C" { +#endif + +enum H5C_cache_incr_mode +{ + H5C_incr__off, + H5C_incr__threshold +}; + +enum H5C_cache_flash_incr_mode +{ + H5C_flash_incr__off, + H5C_flash_incr__add_space +}; + +enum H5C_cache_decr_mode +{ + H5C_decr__off, + H5C_decr__threshold, + H5C_decr__age_out, + H5C_decr__age_out_with_threshold +}; + +#ifdef __cplusplus +} +#endif +#endif diff --git a/privatemodules/nc4/include/H5DOpublic.h b/privatemodules/nc4/include/H5DOpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..774709eb87ab1bcbc001f92d5f61a5d797d9b781 --- /dev/null +++ b/privatemodules/nc4/include/H5DOpublic.h @@ -0,0 +1,42 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef _H5DOpublic_H +#define _H5DOpublic_H + +#ifdef __cplusplus +extern "C" { +#endif + +/*------------------------------------------------------------------------- + * + * Direct chunk write function + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5DOwrite_chunk(hid_t dset_id, + hid_t dxpl_id, + uint32_t filters, + const hsize_t *offset, + size_t data_size, + const void *buf); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/privatemodules/nc4/include/H5DSpublic.h b/privatemodules/nc4/include/H5DSpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..85923f8cc2b17a06bafdbc1534a08c96c56c2493 --- /dev/null +++ b/privatemodules/nc4/include/H5DSpublic.h @@ -0,0 +1,79 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef _H5DSpublic_H +#define _H5DSpublic_H + + + +#define DIMENSION_SCALE_CLASS "DIMENSION_SCALE" +#define DIMENSION_LIST "DIMENSION_LIST" +#define REFERENCE_LIST "REFERENCE_LIST" +#define DIMENSION_LABELS "DIMENSION_LABELS" + + +typedef herr_t (*H5DS_iterate_t)(hid_t dset, unsigned dim, hid_t scale, void *visitor_data); + + +#ifdef __cplusplus +extern "C" { +#endif + +H5_HLDLL herr_t H5DSattach_scale( hid_t did, + hid_t dsid, + unsigned int idx); + +H5_HLDLL herr_t H5DSdetach_scale( hid_t did, + hid_t dsid, + unsigned int idx); + +H5_HLDLL herr_t H5DSset_scale( hid_t dsid, + const char *dimname); + +H5_HLDLL int H5DSget_num_scales( hid_t did, + unsigned int dim); + +H5_HLDLL herr_t H5DSset_label( hid_t did, + unsigned int idx, + const char *label); + +H5_HLDLL ssize_t H5DSget_label( hid_t did, + unsigned int idx, + char *label, + size_t size); + +H5_HLDLL ssize_t H5DSget_scale_name( hid_t did, + char *name, + size_t size); + +H5_HLDLL htri_t H5DSis_scale( hid_t did); + +H5_HLDLL herr_t H5DSiterate_scales( hid_t did, + unsigned int dim, + int *idx, + H5DS_iterate_t visitor, + void *visitor_data); + +H5_HLDLL htri_t H5DSis_attached( hid_t did, + hid_t dsid, + unsigned int idx); + + + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/privatemodules/nc4/include/H5Dpublic.h b/privatemodules/nc4/include/H5Dpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..4309d6409c38800eeb64b92f39eb969d6ee61e6e --- /dev/null +++ b/privatemodules/nc4/include/H5Dpublic.h @@ -0,0 +1,173 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5D module. + */ +#ifndef _H5Dpublic_H +#define _H5Dpublic_H + +/* System headers needed by this file */ + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Ipublic.h" + +/*****************/ +/* Public Macros */ +/*****************/ + +/* Macros used to "unset" chunk cache configuration parameters */ +#define H5D_CHUNK_CACHE_NSLOTS_DEFAULT ((size_t) -1) +#define H5D_CHUNK_CACHE_NBYTES_DEFAULT ((size_t) -1) +#define H5D_CHUNK_CACHE_W0_DEFAULT -1. + +/* Property names for H5LTDdirect_chunk_write */ +#define H5D_XFER_DIRECT_CHUNK_WRITE_FLAG_NAME "direct_chunk_flag" +#define H5D_XFER_DIRECT_CHUNK_WRITE_FILTERS_NAME "direct_chunk_filters" +#define H5D_XFER_DIRECT_CHUNK_WRITE_OFFSET_NAME "direct_chunk_offset" +#define H5D_XFER_DIRECT_CHUNK_WRITE_DATASIZE_NAME "direct_chunk_datasize" + +/*******************/ +/* Public Typedefs */ +/*******************/ + +/* Values for the H5D_LAYOUT property */ +typedef enum H5D_layout_t { + H5D_LAYOUT_ERROR = -1, + + H5D_COMPACT = 0, /*raw data is very small */ + H5D_CONTIGUOUS = 1, /*the default */ + H5D_CHUNKED = 2, /*slow and fancy */ + H5D_NLAYOUTS = 3 /*this one must be last! */ +} H5D_layout_t; + +/* Types of chunk index data structures */ +typedef enum H5D_chunk_index_t { + H5D_CHUNK_BTREE = 0 /* v1 B-tree index */ +} H5D_chunk_index_t; + +/* Values for the space allocation time property */ +typedef enum H5D_alloc_time_t { + H5D_ALLOC_TIME_ERROR = -1, + H5D_ALLOC_TIME_DEFAULT = 0, + H5D_ALLOC_TIME_EARLY = 1, + H5D_ALLOC_TIME_LATE = 2, + H5D_ALLOC_TIME_INCR = 3 +} H5D_alloc_time_t; + +/* Values for the status of space allocation */ +typedef enum H5D_space_status_t { + H5D_SPACE_STATUS_ERROR = -1, + H5D_SPACE_STATUS_NOT_ALLOCATED = 0, + H5D_SPACE_STATUS_PART_ALLOCATED = 1, + H5D_SPACE_STATUS_ALLOCATED = 2 +} H5D_space_status_t; + +/* Values for time of writing fill value property */ +typedef enum H5D_fill_time_t { + H5D_FILL_TIME_ERROR = -1, + H5D_FILL_TIME_ALLOC = 0, + H5D_FILL_TIME_NEVER = 1, + H5D_FILL_TIME_IFSET = 2 +} H5D_fill_time_t; + +/* Values for fill value status */ +typedef enum H5D_fill_value_t { + H5D_FILL_VALUE_ERROR =-1, + H5D_FILL_VALUE_UNDEFINED =0, + H5D_FILL_VALUE_DEFAULT =1, + H5D_FILL_VALUE_USER_DEFINED =2 +} H5D_fill_value_t; + +/********************/ +/* Public Variables */ +/********************/ + +/*********************/ +/* Public Prototypes */ +/*********************/ +#ifdef __cplusplus +extern "C" { +#endif + +/* Define the operator function pointer for H5Diterate() */ +typedef herr_t (*H5D_operator_t)(void *elem, hid_t type_id, unsigned ndim, + const hsize_t *point, void *operator_data); + +/* Define the operator function pointer for H5Dscatter() */ +typedef herr_t (*H5D_scatter_func_t)(const void **src_buf/*out*/, + size_t *src_buf_bytes_used/*out*/, + void *op_data); + +/* Define the operator function pointer for H5Dgather() */ +typedef herr_t (*H5D_gather_func_t)(const void *dst_buf, + size_t dst_buf_bytes_used, void *op_data); + +H5_DLL hid_t H5Dcreate2(hid_t loc_id, const char *name, hid_t type_id, + hid_t space_id, hid_t lcpl_id, hid_t dcpl_id, hid_t dapl_id); +H5_DLL hid_t H5Dcreate_anon(hid_t file_id, hid_t type_id, hid_t space_id, + hid_t plist_id, hid_t dapl_id); +H5_DLL hid_t H5Dopen2(hid_t file_id, const char *name, hid_t dapl_id); +H5_DLL herr_t H5Dclose(hid_t dset_id); +H5_DLL hid_t H5Dget_space(hid_t dset_id); +H5_DLL herr_t H5Dget_space_status(hid_t dset_id, H5D_space_status_t *allocation); +H5_DLL hid_t H5Dget_type(hid_t dset_id); +H5_DLL hid_t H5Dget_create_plist(hid_t dset_id); +H5_DLL hid_t H5Dget_access_plist(hid_t dset_id); +H5_DLL hsize_t H5Dget_storage_size(hid_t dset_id); +H5_DLL haddr_t H5Dget_offset(hid_t dset_id); +H5_DLL herr_t H5Dread(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id, + hid_t file_space_id, hid_t plist_id, void *buf/*out*/); +H5_DLL herr_t H5Dwrite(hid_t dset_id, hid_t mem_type_id, hid_t mem_space_id, + hid_t file_space_id, hid_t plist_id, const void *buf); +H5_DLL herr_t H5Diterate(void *buf, hid_t type_id, hid_t space_id, + H5D_operator_t op, void *operator_data); +H5_DLL herr_t H5Dvlen_reclaim(hid_t type_id, hid_t space_id, hid_t plist_id, void *buf); +H5_DLL herr_t H5Dvlen_get_buf_size(hid_t dataset_id, hid_t type_id, hid_t space_id, hsize_t *size); +H5_DLL herr_t H5Dfill(const void *fill, hid_t fill_type, void *buf, + hid_t buf_type, hid_t space); +H5_DLL herr_t H5Dset_extent(hid_t dset_id, const hsize_t size[]); +H5_DLL herr_t H5Dscatter(H5D_scatter_func_t op, void *op_data, hid_t type_id, + hid_t dst_space_id, void *dst_buf); +H5_DLL herr_t H5Dgather(hid_t src_space_id, const void *src_buf, hid_t type_id, + size_t dst_buf_size, void *dst_buf, H5D_gather_func_t op, void *op_data); +H5_DLL herr_t H5Ddebug(hid_t dset_id); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Macros */ + + +/* Typedefs */ + + +/* Function prototypes */ +H5_DLL hid_t H5Dcreate1(hid_t file_id, const char *name, hid_t type_id, + hid_t space_id, hid_t dcpl_id); +H5_DLL hid_t H5Dopen1(hid_t file_id, const char *name); +H5_DLL herr_t H5Dextend(hid_t dset_id, const hsize_t size[]); + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif +#endif /* _H5Dpublic_H */ + diff --git a/privatemodules/nc4/include/H5Epubgen.h b/privatemodules/nc4/include/H5Epubgen.h new file mode 100644 index 0000000000000000000000000000000000000000..75eca0b99f0149acc9ca5369426cd6c324f1decf --- /dev/null +++ b/privatemodules/nc4/include/H5Epubgen.h @@ -0,0 +1,368 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. 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 + +/*********************/ +/* Major error codes */ +/*********************/ + +#define H5E_DATASET (H5OPEN H5E_DATASET_g) +#define H5E_FUNC (H5OPEN H5E_FUNC_g) +#define H5E_STORAGE (H5OPEN H5E_STORAGE_g) +#define H5E_FILE (H5OPEN H5E_FILE_g) +#define H5E_SOHM (H5OPEN H5E_SOHM_g) +#define H5E_SYM (H5OPEN H5E_SYM_g) +#define H5E_PLUGIN (H5OPEN H5E_PLUGIN_g) +#define H5E_VFL (H5OPEN H5E_VFL_g) +#define H5E_INTERNAL (H5OPEN H5E_INTERNAL_g) +#define H5E_BTREE (H5OPEN H5E_BTREE_g) +#define H5E_REFERENCE (H5OPEN H5E_REFERENCE_g) +#define H5E_DATASPACE (H5OPEN H5E_DATASPACE_g) +#define H5E_RESOURCE (H5OPEN H5E_RESOURCE_g) +#define H5E_PLIST (H5OPEN H5E_PLIST_g) +#define H5E_LINK (H5OPEN H5E_LINK_g) +#define H5E_DATATYPE (H5OPEN H5E_DATATYPE_g) +#define H5E_RS (H5OPEN H5E_RS_g) +#define H5E_HEAP (H5OPEN H5E_HEAP_g) +#define H5E_OHDR (H5OPEN H5E_OHDR_g) +#define H5E_ATOM (H5OPEN H5E_ATOM_g) +#define H5E_ATTR (H5OPEN H5E_ATTR_g) +#define H5E_NONE_MAJOR (H5OPEN H5E_NONE_MAJOR_g) +#define H5E_IO (H5OPEN H5E_IO_g) +#define H5E_SLIST (H5OPEN H5E_SLIST_g) +#define H5E_EFL (H5OPEN H5E_EFL_g) +#define H5E_TST (H5OPEN H5E_TST_g) +#define H5E_ARGS (H5OPEN H5E_ARGS_g) +#define H5E_ERROR (H5OPEN H5E_ERROR_g) +#define H5E_PLINE (H5OPEN H5E_PLINE_g) +#define H5E_FSPACE (H5OPEN H5E_FSPACE_g) +#define H5E_CACHE (H5OPEN H5E_CACHE_g) +H5_DLLVAR hid_t H5E_DATASET_g; /* Dataset */ +H5_DLLVAR hid_t H5E_FUNC_g; /* Function entry/exit */ +H5_DLLVAR hid_t H5E_STORAGE_g; /* Data storage */ +H5_DLLVAR hid_t H5E_FILE_g; /* File accessibilty */ +H5_DLLVAR hid_t H5E_SOHM_g; /* Shared Object Header Messages */ +H5_DLLVAR hid_t H5E_SYM_g; /* Symbol table */ +H5_DLLVAR hid_t H5E_PLUGIN_g; /* Plugin for dynamically loaded library */ +H5_DLLVAR hid_t H5E_VFL_g; /* Virtual File Layer */ +H5_DLLVAR hid_t H5E_INTERNAL_g; /* Internal error (too specific to document in detail) */ +H5_DLLVAR hid_t H5E_BTREE_g; /* B-Tree node */ +H5_DLLVAR hid_t H5E_REFERENCE_g; /* References */ +H5_DLLVAR hid_t H5E_DATASPACE_g; /* Dataspace */ +H5_DLLVAR hid_t H5E_RESOURCE_g; /* Resource unavailable */ +H5_DLLVAR hid_t H5E_PLIST_g; /* Property lists */ +H5_DLLVAR hid_t H5E_LINK_g; /* Links */ +H5_DLLVAR hid_t H5E_DATATYPE_g; /* Datatype */ +H5_DLLVAR hid_t H5E_RS_g; /* Reference Counted Strings */ +H5_DLLVAR hid_t H5E_HEAP_g; /* Heap */ +H5_DLLVAR hid_t H5E_OHDR_g; /* Object header */ +H5_DLLVAR hid_t H5E_ATOM_g; /* Object atom */ +H5_DLLVAR hid_t H5E_ATTR_g; /* Attribute */ +H5_DLLVAR hid_t H5E_NONE_MAJOR_g; /* No error */ +H5_DLLVAR hid_t H5E_IO_g; /* Low-level I/O */ +H5_DLLVAR hid_t H5E_SLIST_g; /* Skip Lists */ +H5_DLLVAR hid_t H5E_EFL_g; /* External file list */ +H5_DLLVAR hid_t H5E_TST_g; /* Ternary Search Trees */ +H5_DLLVAR hid_t H5E_ARGS_g; /* Invalid arguments to routine */ +H5_DLLVAR hid_t H5E_ERROR_g; /* Error API */ +H5_DLLVAR hid_t H5E_PLINE_g; /* Data filters */ +H5_DLLVAR hid_t H5E_FSPACE_g; /* Free Space Manager */ +H5_DLLVAR hid_t H5E_CACHE_g; /* Object cache */ + +/*********************/ +/* Minor error codes */ +/*********************/ + +/* Generic low-level file I/O errors */ +#define H5E_SEEKERROR (H5OPEN H5E_SEEKERROR_g) +#define H5E_READERROR (H5OPEN H5E_READERROR_g) +#define H5E_WRITEERROR (H5OPEN H5E_WRITEERROR_g) +#define H5E_CLOSEERROR (H5OPEN H5E_CLOSEERROR_g) +#define H5E_OVERFLOW (H5OPEN H5E_OVERFLOW_g) +#define H5E_FCNTL (H5OPEN H5E_FCNTL_g) +H5_DLLVAR hid_t H5E_SEEKERROR_g; /* Seek failed */ +H5_DLLVAR hid_t H5E_READERROR_g; /* Read failed */ +H5_DLLVAR hid_t H5E_WRITEERROR_g; /* Write failed */ +H5_DLLVAR hid_t H5E_CLOSEERROR_g; /* Close failed */ +H5_DLLVAR hid_t H5E_OVERFLOW_g; /* Address overflowed */ +H5_DLLVAR hid_t H5E_FCNTL_g; /* File control (fcntl) failed */ + +/* Resource errors */ +#define H5E_NOSPACE (H5OPEN H5E_NOSPACE_g) +#define H5E_CANTALLOC (H5OPEN H5E_CANTALLOC_g) +#define H5E_CANTCOPY (H5OPEN H5E_CANTCOPY_g) +#define H5E_CANTFREE (H5OPEN H5E_CANTFREE_g) +#define H5E_ALREADYEXISTS (H5OPEN H5E_ALREADYEXISTS_g) +#define H5E_CANTLOCK (H5OPEN H5E_CANTLOCK_g) +#define H5E_CANTUNLOCK (H5OPEN H5E_CANTUNLOCK_g) +#define H5E_CANTGC (H5OPEN H5E_CANTGC_g) +#define H5E_CANTGETSIZE (H5OPEN H5E_CANTGETSIZE_g) +#define H5E_OBJOPEN (H5OPEN H5E_OBJOPEN_g) +H5_DLLVAR hid_t H5E_NOSPACE_g; /* No space available for allocation */ +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_ALREADYEXISTS_g; /* Object already exists */ +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_CANTGC_g; /* Unable to garbage collect */ +H5_DLLVAR hid_t H5E_CANTGETSIZE_g; /* Unable to compute size */ +H5_DLLVAR hid_t H5E_OBJOPEN_g; /* Object is already open */ + +/* Heap errors */ +#define H5E_CANTRESTORE (H5OPEN H5E_CANTRESTORE_g) +#define H5E_CANTCOMPUTE (H5OPEN H5E_CANTCOMPUTE_g) +#define H5E_CANTEXTEND (H5OPEN H5E_CANTEXTEND_g) +#define H5E_CANTATTACH (H5OPEN H5E_CANTATTACH_g) +#define H5E_CANTUPDATE (H5OPEN H5E_CANTUPDATE_g) +#define H5E_CANTOPERATE (H5OPEN H5E_CANTOPERATE_g) +H5_DLLVAR hid_t H5E_CANTRESTORE_g; /* Can't restore condition */ +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_CANTATTACH_g; /* Can't attach object */ +H5_DLLVAR hid_t H5E_CANTUPDATE_g; /* Can't update object */ +H5_DLLVAR hid_t H5E_CANTOPERATE_g; /* Can't operate on object */ + +/* Function entry/exit interface errors */ +#define H5E_CANTINIT (H5OPEN H5E_CANTINIT_g) +#define H5E_ALREADYINIT (H5OPEN H5E_ALREADYINIT_g) +#define H5E_CANTRELEASE (H5OPEN H5E_CANTRELEASE_g) +H5_DLLVAR hid_t H5E_CANTINIT_g; /* Unable to initialize object */ +H5_DLLVAR hid_t H5E_ALREADYINIT_g; /* Object already initialized */ +H5_DLLVAR hid_t H5E_CANTRELEASE_g; /* Unable to release object */ + +/* 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 */ + +/* 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 */ + +/* Object header related errors */ +#define H5E_LINKCOUNT (H5OPEN H5E_LINKCOUNT_g) +#define H5E_VERSION (H5OPEN H5E_VERSION_g) +#define H5E_ALIGNMENT (H5OPEN H5E_ALIGNMENT_g) +#define H5E_BADMESG (H5OPEN H5E_BADMESG_g) +#define H5E_CANTDELETE (H5OPEN H5E_CANTDELETE_g) +#define H5E_BADITER (H5OPEN H5E_BADITER_g) +#define H5E_CANTPACK (H5OPEN H5E_CANTPACK_g) +#define H5E_CANTRESET (H5OPEN H5E_CANTRESET_g) +#define H5E_CANTRENAME (H5OPEN H5E_CANTRENAME_g) +H5_DLLVAR hid_t H5E_LINKCOUNT_g; /* Bad object header link count */ +H5_DLLVAR hid_t H5E_VERSION_g; /* Wrong version number */ +H5_DLLVAR hid_t H5E_ALIGNMENT_g; /* Alignment error */ +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_BADITER_g; /* Iteration failed */ +H5_DLLVAR hid_t H5E_CANTPACK_g; /* Can't pack messages */ +H5_DLLVAR hid_t H5E_CANTRESET_g; /* Can't reset object */ +H5_DLLVAR hid_t H5E_CANTRENAME_g; /* Unable to rename object */ + +/* System level errors */ +#define H5E_SYSERRSTR (H5OPEN H5E_SYSERRSTR_g) +H5_DLLVAR hid_t H5E_SYSERRSTR_g; /* System error message */ + +/* I/O pipeline errors */ +#define H5E_NOFILTER (H5OPEN H5E_NOFILTER_g) +#define H5E_CALLBACK (H5OPEN H5E_CALLBACK_g) +#define H5E_CANAPPLY (H5OPEN H5E_CANAPPLY_g) +#define H5E_SETLOCAL (H5OPEN H5E_SETLOCAL_g) +#define H5E_NOENCODER (H5OPEN H5E_NOENCODER_g) +#define H5E_CANTFILTER (H5OPEN H5E_CANTFILTER_g) +H5_DLLVAR hid_t H5E_NOFILTER_g; /* Requested filter is not available */ +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_SETLOCAL_g; /* Error from filter 'set local' callback */ +H5_DLLVAR hid_t H5E_NOENCODER_g; /* Filter present but encoding disabled */ +H5_DLLVAR hid_t H5E_CANTFILTER_g; /* Filter operation failed */ + +/* Group related errors */ +#define H5E_CANTOPENOBJ (H5OPEN H5E_CANTOPENOBJ_g) +#define H5E_CANTCLOSEOBJ (H5OPEN H5E_CANTCLOSEOBJ_g) +#define H5E_COMPLEN (H5OPEN H5E_COMPLEN_g) +#define H5E_PATH (H5OPEN H5E_PATH_g) +H5_DLLVAR hid_t H5E_CANTOPENOBJ_g; /* Can't open object */ +H5_DLLVAR hid_t H5E_CANTCLOSEOBJ_g; /* Can't close 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 */ + +/* No error */ +#define H5E_NONE_MINOR (H5OPEN H5E_NONE_MINOR_g) +H5_DLLVAR hid_t H5E_NONE_MINOR_g; /* No error */ + +/* Plugin errors */ +#define H5E_OPENERROR (H5OPEN H5E_OPENERROR_g) +H5_DLLVAR hid_t H5E_OPENERROR_g; /* Can't open directory or file */ + +/* File accessibilty errors */ +#define H5E_FILEEXISTS (H5OPEN H5E_FILEEXISTS_g) +#define H5E_FILEOPEN (H5OPEN H5E_FILEOPEN_g) +#define H5E_CANTCREATE (H5OPEN H5E_CANTCREATE_g) +#define H5E_CANTOPENFILE (H5OPEN H5E_CANTOPENFILE_g) +#define H5E_CANTCLOSEFILE (H5OPEN H5E_CANTCLOSEFILE_g) +#define H5E_NOTHDF5 (H5OPEN H5E_NOTHDF5_g) +#define H5E_BADFILE (H5OPEN H5E_BADFILE_g) +#define H5E_TRUNCATED (H5OPEN H5E_TRUNCATED_g) +#define H5E_MOUNT (H5OPEN H5E_MOUNT_g) +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_CANTCREATE_g; /* Unable to create file */ +H5_DLLVAR hid_t H5E_CANTOPENFILE_g; /* Unable to open file */ +H5_DLLVAR hid_t H5E_CANTCLOSEFILE_g; /* Unable to close file */ +H5_DLLVAR hid_t H5E_NOTHDF5_g; /* Not an HDF5 file */ +H5_DLLVAR hid_t H5E_BADFILE_g; /* Bad file ID accessed */ +H5_DLLVAR hid_t H5E_TRUNCATED_g; /* File has been truncated */ +H5_DLLVAR hid_t H5E_MOUNT_g; /* File mount error */ + +/* Object atom related errors */ +#define H5E_BADATOM (H5OPEN H5E_BADATOM_g) +#define H5E_BADGROUP (H5OPEN H5E_BADGROUP_g) +#define H5E_CANTREGISTER (H5OPEN H5E_CANTREGISTER_g) +#define H5E_CANTINC (H5OPEN H5E_CANTINC_g) +#define H5E_CANTDEC (H5OPEN H5E_CANTDEC_g) +#define H5E_NOIDS (H5OPEN H5E_NOIDS_g) +H5_DLLVAR hid_t H5E_BADATOM_g; /* Unable to find atom information (already closed?) */ +H5_DLLVAR hid_t H5E_BADGROUP_g; /* Unable to find ID group information */ +H5_DLLVAR hid_t H5E_CANTREGISTER_g; /* Unable to register new atom */ +H5_DLLVAR hid_t H5E_CANTINC_g; /* Unable to increment reference count */ +H5_DLLVAR hid_t H5E_CANTDEC_g; /* Unable to decrement reference count */ +H5_DLLVAR hid_t H5E_NOIDS_g; /* Out of IDs for group */ + +/* Cache related errors */ +#define H5E_CANTFLUSH (H5OPEN H5E_CANTFLUSH_g) +#define H5E_CANTSERIALIZE (H5OPEN H5E_CANTSERIALIZE_g) +#define H5E_CANTLOAD (H5OPEN H5E_CANTLOAD_g) +#define H5E_PROTECT (H5OPEN H5E_PROTECT_g) +#define H5E_NOTCACHED (H5OPEN H5E_NOTCACHED_g) +#define H5E_SYSTEM (H5OPEN H5E_SYSTEM_g) +#define H5E_CANTINS (H5OPEN H5E_CANTINS_g) +#define H5E_CANTPROTECT (H5OPEN H5E_CANTPROTECT_g) +#define H5E_CANTUNPROTECT (H5OPEN H5E_CANTUNPROTECT_g) +#define H5E_CANTPIN (H5OPEN H5E_CANTPIN_g) +#define H5E_CANTUNPIN (H5OPEN H5E_CANTUNPIN_g) +#define H5E_CANTMARKDIRTY (H5OPEN H5E_CANTMARKDIRTY_g) +#define H5E_CANTDIRTY (H5OPEN H5E_CANTDIRTY_g) +#define H5E_CANTEXPUNGE (H5OPEN H5E_CANTEXPUNGE_g) +#define H5E_CANTRESIZE (H5OPEN H5E_CANTRESIZE_g) +H5_DLLVAR hid_t H5E_CANTFLUSH_g; /* Unable to flush data from cache */ +H5_DLLVAR hid_t H5E_CANTSERIALIZE_g; /* Unable to serialize data from cache */ +H5_DLLVAR hid_t H5E_CANTLOAD_g; /* Unable to load metadata into cache */ +H5_DLLVAR hid_t H5E_PROTECT_g; /* Protected metadata error */ +H5_DLLVAR hid_t H5E_NOTCACHED_g; /* Metadata not currently cached */ +H5_DLLVAR hid_t H5E_SYSTEM_g; /* Internal error detected */ +H5_DLLVAR hid_t H5E_CANTINS_g; /* Unable to insert metadata into cache */ +H5_DLLVAR hid_t H5E_CANTPROTECT_g; /* Unable to protect metadata */ +H5_DLLVAR hid_t H5E_CANTUNPROTECT_g; /* Unable to unprotect metadata */ +H5_DLLVAR hid_t H5E_CANTPIN_g; /* Unable to pin cache entry */ +H5_DLLVAR hid_t H5E_CANTUNPIN_g; /* Unable to un-pin cache entry */ +H5_DLLVAR hid_t H5E_CANTMARKDIRTY_g; /* Unable to mark a pinned entry as dirty */ +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_CANTRESIZE_g; /* Unable to resize a metadata cache entry */ + +/* Link related errors */ +#define H5E_TRAVERSE (H5OPEN H5E_TRAVERSE_g) +#define H5E_NLINKS (H5OPEN H5E_NLINKS_g) +#define H5E_NOTREGISTERED (H5OPEN H5E_NOTREGISTERED_g) +#define H5E_CANTMOVE (H5OPEN H5E_CANTMOVE_g) +#define H5E_CANTSORT (H5OPEN H5E_CANTSORT_g) +H5_DLLVAR hid_t H5E_TRAVERSE_g; /* Link traversal failure */ +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_CANTMOVE_g; /* Can't move object */ +H5_DLLVAR hid_t H5E_CANTSORT_g; /* Can't sort objects */ + +/* Parallel MPI errors */ +#define H5E_MPI (H5OPEN H5E_MPI_g) +#define H5E_MPIERRSTR (H5OPEN H5E_MPIERRSTR_g) +#define H5E_CANTRECV (H5OPEN H5E_CANTRECV_g) +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_CANTRECV_g; /* Can't receive data */ + +/* Dataspace errors */ +#define H5E_CANTCLIP (H5OPEN H5E_CANTCLIP_g) +#define H5E_CANTCOUNT (H5OPEN H5E_CANTCOUNT_g) +#define H5E_CANTSELECT (H5OPEN H5E_CANTSELECT_g) +#define H5E_CANTNEXT (H5OPEN H5E_CANTNEXT_g) +#define H5E_BADSELECT (H5OPEN H5E_BADSELECT_g) +#define H5E_CANTCOMPARE (H5OPEN H5E_CANTCOMPARE_g) +H5_DLLVAR hid_t H5E_CANTCLIP_g; /* Can't clip hyperslab region */ +H5_DLLVAR hid_t H5E_CANTCOUNT_g; /* Can't count elements */ +H5_DLLVAR hid_t H5E_CANTSELECT_g; /* Can't select hyperslab */ +H5_DLLVAR hid_t H5E_CANTNEXT_g; /* Can't move to next iterator location */ +H5_DLLVAR hid_t H5E_BADSELECT_g; /* Invalid selection */ +H5_DLLVAR hid_t H5E_CANTCOMPARE_g; /* Can't compare objects */ + +/* Argument errors */ +#define H5E_UNINITIALIZED (H5OPEN H5E_UNINITIALIZED_g) +#define H5E_UNSUPPORTED (H5OPEN H5E_UNSUPPORTED_g) +#define H5E_BADTYPE (H5OPEN H5E_BADTYPE_g) +#define H5E_BADRANGE (H5OPEN H5E_BADRANGE_g) +#define H5E_BADVALUE (H5OPEN H5E_BADVALUE_g) +H5_DLLVAR hid_t H5E_UNINITIALIZED_g; /* Information is uinitialized */ +H5_DLLVAR hid_t H5E_UNSUPPORTED_g; /* Feature is unsupported */ +H5_DLLVAR hid_t H5E_BADTYPE_g; /* Inappropriate type */ +H5_DLLVAR hid_t H5E_BADRANGE_g; /* Out of range */ +H5_DLLVAR hid_t H5E_BADVALUE_g; /* Bad value */ + +/* B-tree related errors */ +#define H5E_NOTFOUND (H5OPEN H5E_NOTFOUND_g) +#define H5E_EXISTS (H5OPEN H5E_EXISTS_g) +#define H5E_CANTENCODE (H5OPEN H5E_CANTENCODE_g) +#define H5E_CANTDECODE (H5OPEN H5E_CANTDECODE_g) +#define H5E_CANTSPLIT (H5OPEN H5E_CANTSPLIT_g) +#define H5E_CANTREDISTRIBUTE (H5OPEN H5E_CANTREDISTRIBUTE_g) +#define H5E_CANTSWAP (H5OPEN H5E_CANTSWAP_g) +#define H5E_CANTINSERT (H5OPEN H5E_CANTINSERT_g) +#define H5E_CANTLIST (H5OPEN H5E_CANTLIST_g) +#define H5E_CANTMODIFY (H5OPEN H5E_CANTMODIFY_g) +#define H5E_CANTREMOVE (H5OPEN H5E_CANTREMOVE_g) +H5_DLLVAR hid_t H5E_NOTFOUND_g; /* Object not found */ +H5_DLLVAR hid_t H5E_EXISTS_g; /* Object already exists */ +H5_DLLVAR hid_t H5E_CANTENCODE_g; /* Unable to encode value */ +H5_DLLVAR hid_t H5E_CANTDECODE_g; /* Unable to decode value */ +H5_DLLVAR hid_t H5E_CANTSPLIT_g; /* Unable to split node */ +H5_DLLVAR hid_t H5E_CANTREDISTRIBUTE_g; /* Unable to redistribute records */ +H5_DLLVAR hid_t H5E_CANTSWAP_g; /* Unable to swap records */ +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_CANTREMOVE_g; /* Unable to remove object */ + +/* Datatype conversion errors */ +#define H5E_CANTCONVERT (H5OPEN H5E_CANTCONVERT_g) +#define H5E_BADSIZE (H5OPEN H5E_BADSIZE_g) +H5_DLLVAR hid_t H5E_CANTCONVERT_g; /* Can't convert datatypes */ +H5_DLLVAR hid_t H5E_BADSIZE_g; /* Bad size for object */ + +#endif /* H5Epubgen_H */ diff --git a/privatemodules/nc4/include/H5Epublic.h b/privatemodules/nc4/include/H5Epublic.h new file mode 100644 index 0000000000000000000000000000000000000000..932b8574b7e473e43fd4111ddcc3086b03234bd5 --- /dev/null +++ b/privatemodules/nc4/include/H5Epublic.h @@ -0,0 +1,228 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5E module. + */ +#ifndef _H5Epublic_H +#define _H5Epublic_H + +#include <stdio.h> /*FILE arg of H5Eprint() */ + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Ipublic.h" + +/* Value for the default error stack */ +#define H5E_DEFAULT 0 + +/* Different kinds of error information */ +typedef enum H5E_type_t { + H5E_MAJOR, + H5E_MINOR +} H5E_type_t; + +/* Information about an error; element of error stack */ +typedef struct H5E_error2_t { + hid_t cls_id; /*class ID */ + hid_t maj_num; /*major error ID */ + hid_t min_num; /*minor error number */ + unsigned line; /*line in file where error occurs */ + const char *func_name; /*function in which error occurred */ + const char *file_name; /*file in which error occurred */ + const char *desc; /*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 */ +#define H5E_ERR_CLS (H5OPEN H5E_ERR_CLS_g) +H5_DLLVAR hid_t H5E_ERR_CLS_g; + +/* Include the automatically generated public header information */ +/* (This includes the list of major and minor error codes for the library) */ +#include "H5Epubgen.h" + +/* + * One often needs to temporarily disable automatic error reporting when + * trying something that's likely or expected to fail. The code to try can + * be nested between calls to H5Eget_auto() and H5Eset_auto(), but it's + * easier just to use this macro like: + * H5E_BEGIN_TRY { + * ...stuff here that's likely to fail... + * } H5E_END_TRY; + * + * Warning: don't break, return, or longjmp() from the body of the loop or + * the error reporting won't be properly restored! + * + * These two macros still use the old API functions for backward compatibility + * purpose. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS +#define H5E_BEGIN_TRY { \ + unsigned H5E_saved_is_v2; \ + union { \ + H5E_auto1_t efunc1; \ + H5E_auto2_t efunc2; \ + } H5E_saved; \ + void *H5E_saved_edata; \ + \ + (void)H5Eauto_is_v2(H5E_DEFAULT, &H5E_saved_is_v2); \ + if(H5E_saved_is_v2) { \ + (void)H5Eget_auto2(H5E_DEFAULT, &H5E_saved.efunc2, &H5E_saved_edata); \ + (void)H5Eset_auto2(H5E_DEFAULT, NULL, NULL); \ + } else { \ + (void)H5Eget_auto1(&H5E_saved.efunc1, &H5E_saved_edata); \ + (void)H5Eset_auto1(NULL, NULL); \ + } + +#define H5E_END_TRY \ + if(H5E_saved_is_v2) \ + (void)H5Eset_auto2(H5E_DEFAULT, H5E_saved.efunc2, H5E_saved_edata); \ + else \ + (void)H5Eset_auto1(H5E_saved.efunc1, H5E_saved_edata); \ +} +#else /* H5_NO_DEPRECATED_SYMBOLS */ +#define H5E_BEGIN_TRY { \ + H5E_auto_t saved_efunc; \ + void *H5E_saved_edata; \ + \ + (void)H5Eget_auto(H5E_DEFAULT, &saved_efunc, &H5E_saved_edata); \ + (void)H5Eset_auto(H5E_DEFAULT, NULL, NULL); + +#define H5E_END_TRY \ + (void)H5Eset_auto(H5E_DEFAULT, saved_efunc, H5E_saved_edata); \ +} +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +/* + * Public API Convenience Macros for Error reporting - Documented + */ +/* Use the Standard C __FILE__ & __LINE__ macros instead of typing them in */ +#define H5Epush_sim(func, cls, maj, min, str) H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, cls, maj, min, str) + +/* + * Public API Convenience Macros for Error reporting - Undocumented + */ +/* Use the Standard C __FILE__ & __LINE__ macros instead of typing them in */ +/* And return after pushing error onto stack */ +#define H5Epush_ret(func, cls, maj, min, str, ret) { \ + H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, cls, maj, min, str); \ + return(ret); \ +} + +/* Use the Standard C __FILE__ & __LINE__ macros instead of typing them in + * And goto a label after pushing error onto stack. + */ +#define H5Epush_goto(func, cls, maj, min, str, label) { \ + H5Epush2(H5E_DEFAULT, __FILE__, func, __LINE__, cls, maj, min, str); \ + goto label; \ +} + +/* Error stack traversal direction */ +typedef enum H5E_direction_t { + H5E_WALK_UPWARD = 0, /*begin deep, end at API function */ + H5E_WALK_DOWNWARD = 1 /*begin at API function, end deep */ +} H5E_direction_t; + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Error stack traversal callback function pointers */ +typedef herr_t (*H5E_walk2_t)(unsigned n, const H5E_error2_t *err_desc, + void *client_data); +typedef herr_t (*H5E_auto2_t)(hid_t estack, void *client_data); + +/* Public API functions */ +H5_DLL hid_t H5Eregister_class(const char *cls_name, const char *lib_name, + const char *version); +H5_DLL herr_t H5Eunregister_class(hid_t class_id); +H5_DLL herr_t H5Eclose_msg(hid_t err_id); +H5_DLL hid_t H5Ecreate_msg(hid_t cls, H5E_type_t msg_type, const char *msg); +H5_DLL hid_t H5Ecreate_stack(void); +H5_DLL hid_t H5Eget_current_stack(void); +H5_DLL herr_t H5Eclose_stack(hid_t stack_id); +H5_DLL ssize_t H5Eget_class_name(hid_t class_id, char *name, size_t size); +H5_DLL herr_t H5Eset_current_stack(hid_t err_stack_id); +H5_DLL herr_t H5Epush2(hid_t err_stack, const char *file, const char *func, unsigned line, + hid_t cls_id, hid_t maj_id, hid_t min_id, const char *msg, ...); +H5_DLL herr_t H5Epop(hid_t err_stack, size_t count); +H5_DLL herr_t H5Eprint2(hid_t err_stack, FILE *stream); +H5_DLL herr_t H5Ewalk2(hid_t err_stack, H5E_direction_t direction, H5E_walk2_t func, + void *client_data); +H5_DLL herr_t H5Eget_auto2(hid_t estack_id, H5E_auto2_t *func, void **client_data); +H5_DLL herr_t H5Eset_auto2(hid_t estack_id, H5E_auto2_t func, void *client_data); +H5_DLL herr_t H5Eclear2(hid_t err_stack); +H5_DLL herr_t H5Eauto_is_v2(hid_t err_stack, unsigned *is_stack); +H5_DLL ssize_t H5Eget_msg(hid_t msg_id, H5E_type_t *type, char *msg, + size_t size); +H5_DLL ssize_t H5Eget_num(hid_t error_stack_id); + + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Typedefs */ + +/* Alias major & minor error types to hid_t's, for compatibility with new + * error API in v1.8 + */ +typedef hid_t H5E_major_t; +typedef hid_t H5E_minor_t; + +/* Information about an error element of error stack. */ +typedef struct H5E_error1_t { + H5E_major_t maj_num; /*major error number */ + H5E_minor_t min_num; /*minor error number */ + const char *func_name; /*function in which error occurred */ + const char *file_name; /*file in which error occurred */ + unsigned line; /*line in file where error occurs */ + const char *desc; /*optional supplied description */ +} H5E_error1_t; + +/* Error stack traversal callback function pointers */ +typedef herr_t (*H5E_walk1_t)(int n, H5E_error1_t *err_desc, void *client_data); +typedef herr_t (*H5E_auto1_t)(void *client_data); + +/* Function prototypes */ +H5_DLL herr_t H5Eclear1(void); +H5_DLL herr_t H5Eget_auto1(H5E_auto1_t *func, void **client_data); +H5_DLL herr_t H5Epush1(const char *file, const char *func, unsigned line, + H5E_major_t maj, H5E_minor_t min, const char *str); +H5_DLL herr_t H5Eprint1(FILE *stream); +H5_DLL herr_t H5Eset_auto1(H5E_auto1_t func, void *client_data); +H5_DLL herr_t H5Ewalk1(H5E_direction_t direction, H5E_walk1_t func, + void *client_data); +H5_DLL char *H5Eget_major(H5E_major_t maj); +H5_DLL char *H5Eget_minor(H5E_minor_t min); +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif + +#endif /* end _H5Epublic_H */ + diff --git a/privatemodules/nc4/include/H5FDcore.h b/privatemodules/nc4/include/H5FDcore.h new file mode 100644 index 0000000000000000000000000000000000000000..dca110ea20826e9a7c23f286d1153a4aed69b26b --- /dev/null +++ b/privatemodules/nc4/include/H5FDcore.h @@ -0,0 +1,42 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Robb Matzke <matzke@llnl.gov> + * Monday, August 2, 1999 + * + * Purpose: The public header file for the sec2 driver. + */ +#ifndef H5FDcore_H +#define H5FDcore_H + +#include "H5Ipublic.h" + +#define H5FD_CORE (H5FD_core_init()) + +#ifdef __cplusplus +extern "C" { +#endif +H5_DLL hid_t H5FD_core_init(void); +H5_DLL void H5FD_core_term(void); +H5_DLL herr_t H5Pset_fapl_core(hid_t fapl_id, size_t increment, + hbool_t backing_store); +H5_DLL herr_t H5Pget_fapl_core(hid_t fapl_id, size_t *increment/*out*/, + hbool_t *backing_store/*out*/); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/privatemodules/nc4/include/H5FDdirect.h b/privatemodules/nc4/include/H5FDdirect.h new file mode 100644 index 0000000000000000000000000000000000000000..26c70f30fa09a5077c4dffcb78faf500e30a3dc6 --- /dev/null +++ b/privatemodules/nc4/include/H5FDdirect.h @@ -0,0 +1,57 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Raymond Lu <slu@hdfgroup.uiuc.edu> + * Wednesday, 20 September 2006 + * + * Purpose: The public header file for the direct driver. + */ +#ifndef H5FDdirect_H +#define H5FDdirect_H + +#include "H5Ipublic.h" + +#ifdef H5_HAVE_DIRECT +# define H5FD_DIRECT (H5FD_direct_init()) +#else +# define H5FD_DIRECT (-1) +#endif /* H5_HAVE_DIRECT */ + +#ifdef H5_HAVE_DIRECT +#ifdef __cplusplus +extern "C" { +#endif + +/* Default values for memory boundary, file block size, and maximal copy buffer size. + * Application can set these values through the function H5Pset_fapl_direct. */ +#define MBOUNDARY_DEF 4096 +#define FBSIZE_DEF 4096 +#define CBSIZE_DEF 16*1024*1024 + +H5_DLL hid_t H5FD_direct_init(void); +H5_DLL void H5FD_direct_term(void); +H5_DLL herr_t H5Pset_fapl_direct(hid_t fapl_id, size_t alignment, size_t block_size, + size_t cbuf_size); +H5_DLL herr_t H5Pget_fapl_direct(hid_t fapl_id, size_t *boundary/*out*/, + size_t *block_size/*out*/, size_t *cbuf_size/*out*/); + +#ifdef __cplusplus +} +#endif + +#endif /* H5_HAVE_DIRECT */ + +#endif diff --git a/privatemodules/nc4/include/H5FDfamily.h b/privatemodules/nc4/include/H5FDfamily.h new file mode 100644 index 0000000000000000000000000000000000000000..dcb63e647e16d7083e4645f316d16479aad3d923 --- /dev/null +++ b/privatemodules/nc4/include/H5FDfamily.h @@ -0,0 +1,44 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Robb Matzke <matzke@llnl.gov> + * Monday, August 4, 1999 + * + * Purpose: The public header file for the family driver. + */ +#ifndef H5FDfamily_H +#define H5FDfamily_H + +#include "H5Ipublic.h" + +#define H5FD_FAMILY (H5FD_family_init()) + +#ifdef __cplusplus +extern "C" { +#endif + +H5_DLL hid_t H5FD_family_init(void); +H5_DLL void H5FD_family_term(void); +H5_DLL herr_t H5Pset_fapl_family(hid_t fapl_id, hsize_t memb_size, + hid_t memb_fapl_id); +H5_DLL herr_t H5Pget_fapl_family(hid_t fapl_id, hsize_t *memb_size/*out*/, + hid_t *memb_fapl_id/*out*/); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/privatemodules/nc4/include/H5FDlog.h b/privatemodules/nc4/include/H5FDlog.h new file mode 100644 index 0000000000000000000000000000000000000000..ffc4df1a56ce0a55fadd5b94f36995a291dc0a23 --- /dev/null +++ b/privatemodules/nc4/include/H5FDlog.h @@ -0,0 +1,72 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Quincey Koziol <koziol@ncsa.uiuc.edu> + * Monday, April 17, 2000 + * + * Purpose: The public header file for the log driver. + */ +#ifndef H5FDlog_H +#define H5FDlog_H + +#include "H5Ipublic.h" + +#define H5FD_LOG (H5FD_log_init()) + +/* Flags for H5Pset_fapl_log() */ +/* Flags for tracking where reads/writes/seeks occur */ +#define H5FD_LOG_LOC_READ 0x00000001 +#define H5FD_LOG_LOC_WRITE 0x00000002 +#define H5FD_LOG_LOC_SEEK 0x00000004 +#define H5FD_LOG_LOC_IO (H5FD_LOG_LOC_READ|H5FD_LOG_LOC_WRITE|H5FD_LOG_LOC_SEEK) +/* Flags for tracking number of times each byte is read/written */ +#define H5FD_LOG_FILE_READ 0x00000008 +#define H5FD_LOG_FILE_WRITE 0x00000010 +#define H5FD_LOG_FILE_IO (H5FD_LOG_FILE_READ|H5FD_LOG_FILE_WRITE) +/* Flag for tracking "flavor" (type) of information stored at each byte */ +#define H5FD_LOG_FLAVOR 0x00000020 +/* Flags for tracking total number of reads/writes/seeks/truncates */ +#define H5FD_LOG_NUM_READ 0x00000040 +#define H5FD_LOG_NUM_WRITE 0x00000080 +#define H5FD_LOG_NUM_SEEK 0x00000100 +#define H5FD_LOG_NUM_TRUNCATE 0x00000200 +#define H5FD_LOG_NUM_IO (H5FD_LOG_NUM_READ|H5FD_LOG_NUM_WRITE|H5FD_LOG_NUM_SEEK|H5FD_LOG_NUM_TRUNCATE) +/* Flags for tracking time spent in open/stat/read/write/seek/close */ +#define H5FD_LOG_TIME_OPEN 0x00000400 +#define H5FD_LOG_TIME_STAT 0x00000800 +#define H5FD_LOG_TIME_READ 0x00001000 +#define H5FD_LOG_TIME_WRITE 0x00002000 +#define H5FD_LOG_TIME_SEEK 0x00004000 +#define H5FD_LOG_TIME_CLOSE 0x00008000 +#define H5FD_LOG_TIME_IO (H5FD_LOG_TIME_OPEN|H5FD_LOG_TIME_STAT|H5FD_LOG_TIME_READ|H5FD_LOG_TIME_WRITE|H5FD_LOG_TIME_SEEK|H5FD_LOG_TIME_CLOSE) +/* Flag for tracking allocation of space in file */ +#define H5FD_LOG_ALLOC 0x00010000 +#define H5FD_LOG_ALL (H5FD_LOG_ALLOC|H5FD_LOG_TIME_IO|H5FD_LOG_NUM_IO|H5FD_LOG_FLAVOR|H5FD_LOG_FILE_IO|H5FD_LOG_LOC_IO) + +#ifdef __cplusplus +extern "C" { +#endif + +H5_DLL hid_t H5FD_log_init(void); +H5_DLL void H5FD_log_term(void); +H5_DLL herr_t H5Pset_fapl_log(hid_t fapl_id, const char *logfile, unsigned long long flags, size_t buf_size); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/privatemodules/nc4/include/H5FDmpi.h b/privatemodules/nc4/include/H5FDmpi.h new file mode 100644 index 0000000000000000000000000000000000000000..784fe70c0568c2ec8e662a327f6299a6727c96c0 --- /dev/null +++ b/privatemodules/nc4/include/H5FDmpi.h @@ -0,0 +1,62 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Quincey Koziol <koziol@ncsa.uiuc.edu> + * Friday, January 30, 2004 + * + * Purpose: The public header file for common items for all MPI VFL drivers + */ +#ifndef H5FDmpi_H +#define H5FDmpi_H + +/***** Macros for One linked collective IO case. *****/ +/* The default value to do one linked collective IO for all chunks. + If the average number of chunks per process is greater than this value, + the library will create an MPI derived datatype to link all chunks to do collective IO. + The user can set this value through an API. */ + +#define H5D_ONE_LINK_CHUNK_IO_THRESHOLD 0 +/***** Macros for multi-chunk collective IO case. *****/ +/* The default value of the threshold to do collective IO for this chunk. + If the average percentage of processes per chunk is greater than the default value, + collective IO is done for this chunk. +*/ + +#define H5D_MULTI_CHUNK_IO_COL_THRESHOLD 60 +/* Type of I/O for data transfer properties */ +typedef enum H5FD_mpio_xfer_t { + H5FD_MPIO_INDEPENDENT = 0, /*zero is the default*/ + H5FD_MPIO_COLLECTIVE +} H5FD_mpio_xfer_t; + +/* Type of chunked dataset I/O */ +typedef enum H5FD_mpio_chunk_opt_t { + H5FD_MPIO_CHUNK_DEFAULT = 0, + H5FD_MPIO_CHUNK_ONE_IO, /*zero is the default*/ + H5FD_MPIO_CHUNK_MULTI_IO +} H5FD_mpio_chunk_opt_t; + +/* Type of collective I/O */ +typedef enum H5FD_mpio_collective_opt_t { + H5FD_MPIO_COLLECTIVE_IO = 0, + H5FD_MPIO_INDIVIDUAL_IO /*zero is the default*/ +} H5FD_mpio_collective_opt_t; + +/* Include all the MPI VFL headers */ +#include "H5FDmpio.h" /* MPI I/O file driver */ + +#endif /* H5FDmpi_H */ + diff --git a/privatemodules/nc4/include/H5FDmpio.h b/privatemodules/nc4/include/H5FDmpio.h new file mode 100644 index 0000000000000000000000000000000000000000..1d91cc32cb45bde9abc4c4248724f92617aa218c --- /dev/null +++ b/privatemodules/nc4/include/H5FDmpio.h @@ -0,0 +1,66 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Robb Matzke <matzke@llnl.gov> + * Monday, August 2, 1999 + * + * Purpose: The public header file for the mpio driver. + */ +#ifndef H5FDmpio_H +#define H5FDmpio_H + +/* Macros */ + +#ifdef H5_HAVE_PARALLEL +# define H5FD_MPIO (H5FD_mpio_init()) +#else +# define H5FD_MPIO (-1) +#endif /* H5_HAVE_PARALLEL */ + +#ifdef H5_HAVE_PARALLEL +/*Turn on H5FDmpio_debug if H5F_DEBUG is on */ +#ifdef H5F_DEBUG +#ifndef H5FDmpio_DEBUG +#define H5FDmpio_DEBUG +#endif +#endif + +/* Global var whose value comes from environment variable */ +/* (Defined in H5FDmpio.c) */ +H5_DLLVAR hbool_t H5FD_mpi_opt_types_g; + +/* Function prototypes */ +#ifdef __cplusplus +extern "C" { +#endif +H5_DLL hid_t H5FD_mpio_init(void); +H5_DLL void H5FD_mpio_term(void); +H5_DLL herr_t H5Pset_fapl_mpio(hid_t fapl_id, MPI_Comm comm, MPI_Info info); +H5_DLL herr_t H5Pget_fapl_mpio(hid_t fapl_id, MPI_Comm *comm/*out*/, + MPI_Info *info/*out*/); +H5_DLL herr_t H5Pset_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t xfer_mode); +H5_DLL herr_t H5Pget_dxpl_mpio(hid_t dxpl_id, H5FD_mpio_xfer_t *xfer_mode/*out*/); +H5_DLL herr_t H5Pset_dxpl_mpio_collective_opt(hid_t dxpl_id, H5FD_mpio_collective_opt_t opt_mode); +H5_DLL herr_t H5Pset_dxpl_mpio_chunk_opt(hid_t dxpl_id, H5FD_mpio_chunk_opt_t opt_mode); +H5_DLL herr_t H5Pset_dxpl_mpio_chunk_opt_num(hid_t dxpl_id, unsigned num_chunk_per_proc); +H5_DLL herr_t H5Pset_dxpl_mpio_chunk_opt_ratio(hid_t dxpl_id, unsigned percent_num_proc_per_chunk); +#ifdef __cplusplus +} +#endif + +#endif /* H5_HAVE_PARALLEL */ + +#endif diff --git a/privatemodules/nc4/include/H5FDmulti.h b/privatemodules/nc4/include/H5FDmulti.h new file mode 100644 index 0000000000000000000000000000000000000000..b45a02957004a98a13c5133e022aa859ba2863e3 --- /dev/null +++ b/privatemodules/nc4/include/H5FDmulti.h @@ -0,0 +1,49 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Robb Matzke <matzke@llnl.gov> + * Monday, August 2, 1999 + * + * Purpose: The public header file for the "multi" driver. + */ +#ifndef H5FDmulti_H +#define H5FDmulti_H + +#include "H5Ipublic.h" +#include "H5Ppublic.h" /* Property lists */ +#include "H5Fpublic.h" + +#define H5FD_MULTI (H5FD_multi_init()) + +#ifdef __cplusplus +extern "C" { +#endif +H5_DLL hid_t H5FD_multi_init(void); +H5_DLL void H5FD_multi_term(void); +H5_DLL 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); +H5_DLL herr_t H5Pget_fapl_multi(hid_t fapl_id, H5FD_mem_t *memb_map/*out*/, + hid_t *memb_fapl/*out*/, char **memb_name/*out*/, + haddr_t *memb_addr/*out*/, hbool_t *relax/*out*/); +H5_DLL 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); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/privatemodules/nc4/include/H5FDpublic.h b/privatemodules/nc4/include/H5FDpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..f1b3920fb6a324db00aa51fced31a50e84553af6 --- /dev/null +++ b/privatemodules/nc4/include/H5FDpublic.h @@ -0,0 +1,318 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Robb Matzke <matzke@llnl.gov> + * Monday, July 26, 1999 + */ +#ifndef _H5FDpublic_H +#define _H5FDpublic_H + +#include "H5public.h" +#include "H5Fpublic.h" /*for H5F_close_degree_t */ + +#define H5_HAVE_VFL 1 /*define a convenient app feature test*/ +#define H5FD_VFD_DEFAULT 0 /* Default VFL driver value */ + +/* Types of allocation requests: see H5Fpublic.h */ +typedef enum H5F_mem_t H5FD_mem_t; + +/* Map "fractal heap" header blocks to 'ohdr' type file memory, since its + * a fair amount of work to add a new kind of file memory and they are similar + * enough to object headers and probably too minor to deserve their own type. + * + * Map "fractal heap" indirect blocks to 'ohdr' type file memory, since they + * are similar to fractal heap header blocks. + * + * Map "fractal heap" direct blocks to 'lheap' type file memory, since they + * will be replacing local heaps. + * + * Map "fractal heap" 'huge' objects to 'draw' type file memory, since they + * represent large objects that are directly stored in the file. + * + * -QAK + */ +#define H5FD_MEM_FHEAP_HDR H5FD_MEM_OHDR +#define H5FD_MEM_FHEAP_IBLOCK H5FD_MEM_OHDR +#define H5FD_MEM_FHEAP_DBLOCK H5FD_MEM_LHEAP +#define H5FD_MEM_FHEAP_HUGE_OBJ H5FD_MEM_DRAW + +/* Map "free space" header blocks to 'ohdr' type file memory, since its + * a fair amount of work to add a new kind of file memory and they are similar + * enough to object headers and probably too minor to deserve their own type. + * + * Map "free space" serialized sections to 'lheap' type file memory, since they + * are similar enough to local heap info. + * + * -QAK + */ +#define H5FD_MEM_FSPACE_HDR H5FD_MEM_OHDR +#define H5FD_MEM_FSPACE_SINFO H5FD_MEM_LHEAP + +/* Map "shared object header message" master table to 'ohdr' type file memory, + * since its a fair amount of work to add a new kind of file memory and they are + * similar enough to object headers and probably too minor to deserve their own + * type. + * + * Map "shared object header message" indices to 'btree' type file memory, + * since they are similar enough to B-tree nodes. + * + * -QAK + */ +#define H5FD_MEM_SOHM_TABLE H5FD_MEM_OHDR +#define H5FD_MEM_SOHM_INDEX H5FD_MEM_BTREE + +/* + * A free-list map which maps all types of allocation requests to a single + * free list. This is useful for drivers that don't really care about + * keeping different requests segregated in the underlying file and which + * want to make most efficient reuse of freed memory. The use of the + * H5FD_MEM_SUPER free list is arbitrary. + */ +#define H5FD_FLMAP_SINGLE { \ + H5FD_MEM_SUPER, /*default*/ \ + H5FD_MEM_SUPER, /*super*/ \ + H5FD_MEM_SUPER, /*btree*/ \ + H5FD_MEM_SUPER, /*draw*/ \ + H5FD_MEM_SUPER, /*gheap*/ \ + H5FD_MEM_SUPER, /*lheap*/ \ + H5FD_MEM_SUPER /*ohdr*/ \ +} + +/* + * A free-list map which segregates requests into `raw' or `meta' data + * pools. + */ +#define H5FD_FLMAP_DICHOTOMY { \ + H5FD_MEM_SUPER, /*default*/ \ + H5FD_MEM_SUPER, /*super*/ \ + H5FD_MEM_SUPER, /*btree*/ \ + H5FD_MEM_DRAW, /*draw*/ \ + H5FD_MEM_DRAW, /*gheap*/ \ + H5FD_MEM_SUPER, /*lheap*/ \ + H5FD_MEM_SUPER /*ohdr*/ \ +} + +/* + * The default free list map which causes each request type to use it's own + * free-list. + */ +#define H5FD_FLMAP_DEFAULT { \ + H5FD_MEM_DEFAULT, /*default*/ \ + H5FD_MEM_DEFAULT, /*super*/ \ + H5FD_MEM_DEFAULT, /*btree*/ \ + H5FD_MEM_DEFAULT, /*draw*/ \ + H5FD_MEM_DEFAULT, /*gheap*/ \ + H5FD_MEM_DEFAULT, /*lheap*/ \ + H5FD_MEM_DEFAULT /*ohdr*/ \ +} + + +/* Define VFL driver features that can be enabled on a per-driver basis */ +/* These are returned with the 'query' function pointer in H5FD_class_t */ + /* + * 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. + */ +#define H5FD_FEAT_AGGREGATE_METADATA 0x00000001 + /* + * 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. + * + * Distinguish between updating the metadata accumulator on writes and + * reads. This is particularly (perhaps only, even) important for MPI-I/O + * where we guarantee that writes are collective, but reads may not be. + * If we were to allow the metadata accumulator to be written during a + * read operation, the application would hang. + */ +#define H5FD_FEAT_ACCUMULATE_METADATA_WRITE 0x00000002 +#define H5FD_FEAT_ACCUMULATE_METADATA_READ 0x00000004 +#define H5FD_FEAT_ACCUMULATE_METADATA (H5FD_FEAT_ACCUMULATE_METADATA_WRITE|H5FD_FEAT_ACCUMULATE_METADATA_READ) + /* + * 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 seive" 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 + */ +#define H5FD_FEAT_DATA_SIEVE 0x00000008 + /* + * Defining the H5FD_FEAT_AGGREGATE_SMALLDATA for a VFL driver means that + * the library will attempt to allocate a larger block for "small" raw data + * and then sub-allocate "small" raw data requests from that larger block. + */ +#define H5FD_FEAT_AGGREGATE_SMALLDATA 0x00000010 + /* + * Defining the H5FD_FEAT_IGNORE_DRVRINFO for a VFL driver means that + * the library will ignore the driver info that is encoded in the file + * for the VFL driver. (This will cause the driver info to be eliminated + * from the file when it is flushed/closed, if the file is opened R/W). + */ +#define H5FD_FEAT_IGNORE_DRVRINFO 0x00000020 + /* + * Defining the H5FD_FEAT_DIRTY_SBLK_LOAD for a VFL driver means that + * the library will mark the superblock dirty when the file is opened + * R/W. This will cause the driver info to be re-encoded when the file + * is flushed/closed. + */ +#define H5FD_FEAT_DIRTY_SBLK_LOAD 0x00000040 + /* + * Defining the H5FD_FEAT_POSIX_COMPAT_HANDLE for a VFL driver means that + * the handle for the VFD (returned with the 'get_handle' callback) is + * of type 'int' and is compatible with POSIX I/O calls. + */ +#define H5FD_FEAT_POSIX_COMPAT_HANDLE 0x00000080 + /* + * Defining the H5FD_FEAT_ALLOW_FILE_IMAGE for a VFL driver means that + * the driver is able to use a file image in the fapl as the initial + * contents of a file. + */ +#define H5FD_FEAT_ALLOW_FILE_IMAGE 0x00000400 + /* + * Defining the H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS for a VFL driver + * means that the driver is able to use callbacks to make a copy of the + * image to store in memory. + */ +#define H5FD_FEAT_CAN_USE_FILE_IMAGE_CALLBACKS 0x00000800 + + +/* Forward declaration */ +typedef struct H5FD_t H5FD_t; + +/* Class information for each file driver */ +typedef struct H5FD_class_t { + const char *name; + haddr_t maxaddr; + H5F_close_degree_t fc_degree; + hsize_t (*sb_size)(H5FD_t *file); + herr_t (*sb_encode)(H5FD_t *file, char *name/*out*/, + unsigned char *p/*out*/); + herr_t (*sb_decode)(H5FD_t *f, const char *name, const unsigned char *p); + size_t fapl_size; + void * (*fapl_get)(H5FD_t *file); + void * (*fapl_copy)(const void *fapl); + herr_t (*fapl_free)(void *fapl); + size_t dxpl_size; + void * (*dxpl_copy)(const void *dxpl); + herr_t (*dxpl_free)(void *dxpl); + H5FD_t *(*open)(const char *name, unsigned flags, hid_t fapl, + haddr_t maxaddr); + herr_t (*close)(H5FD_t *file); + int (*cmp)(const H5FD_t *f1, const H5FD_t *f2); + herr_t (*query)(const H5FD_t *f1, unsigned long *flags); + herr_t (*get_type_map)(const H5FD_t *file, H5FD_mem_t *type_map); + haddr_t (*alloc)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size); + herr_t (*free)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, + haddr_t addr, hsize_t size); + haddr_t (*get_eoa)(const H5FD_t *file, H5FD_mem_t type); + herr_t (*set_eoa)(H5FD_t *file, H5FD_mem_t type, haddr_t addr); + haddr_t (*get_eof)(const H5FD_t *file); + herr_t (*get_handle)(H5FD_t *file, hid_t fapl, void**file_handle); + herr_t (*read)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, + haddr_t addr, size_t size, void *buffer); + herr_t (*write)(H5FD_t *file, H5FD_mem_t type, hid_t dxpl, + haddr_t addr, size_t size, const void *buffer); + herr_t (*flush)(H5FD_t *file, hid_t dxpl_id, unsigned closing); + herr_t (*truncate)(H5FD_t *file, hid_t dxpl_id, hbool_t closing); + herr_t (*lock)(H5FD_t *file, unsigned char *oid, unsigned lock_type, hbool_t last); + herr_t (*unlock)(H5FD_t *file, unsigned char *oid, hbool_t last); + H5FD_mem_t fl_map[H5FD_MEM_NTYPES]; +} H5FD_class_t; + +/* A free list is a singly-linked list of address/size pairs. */ +typedef struct H5FD_free_t { + haddr_t addr; + hsize_t size; + struct H5FD_free_t *next; +} H5FD_free_t; + +/* + * The main datatype for each driver. Public fields common to all drivers + * are declared here and the driver appends private fields in memory. + */ +struct H5FD_t { + hid_t driver_id; /*driver ID for this file */ + const H5FD_class_t *cls; /*constant class info */ + unsigned long fileno; /* File 'serial' number */ + unsigned long feature_flags; /* VFL Driver feature Flags */ + haddr_t maxaddr; /* For this file, overrides class */ + haddr_t base_addr; /* Base address for HDF5 data w/in file */ + + /* Space allocation management fields */ + hsize_t threshold; /* Threshold for alignment */ + hsize_t alignment; /* Allocation alignment */ +}; + +/* Define enum for the source of file image callbacks */ +typedef enum { + H5FD_FILE_IMAGE_OP_NO_OP, + 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; + +/* Define structure to hold file image callbacks */ +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; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Function prototypes */ +H5_DLL hid_t H5FDregister(const H5FD_class_t *cls); +H5_DLL herr_t H5FDunregister(hid_t driver_id); +H5_DLL H5FD_t *H5FDopen(const char *name, unsigned flags, hid_t fapl_id, + haddr_t maxaddr); +H5_DLL herr_t H5FDclose(H5FD_t *file); +H5_DLL int H5FDcmp(const H5FD_t *f1, const H5FD_t *f2); +H5_DLL int H5FDquery(const H5FD_t *f, unsigned long *flags); +H5_DLL haddr_t H5FDalloc(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, hsize_t size); +H5_DLL herr_t H5FDfree(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, + haddr_t addr, hsize_t size); +H5_DLL haddr_t H5FDget_eoa(H5FD_t *file, H5FD_mem_t type); +H5_DLL herr_t H5FDset_eoa(H5FD_t *file, H5FD_mem_t type, haddr_t eoa); +H5_DLL haddr_t H5FDget_eof(H5FD_t *file); +H5_DLL herr_t H5FDget_vfd_handle(H5FD_t *file, hid_t fapl, void**file_handle); +H5_DLL herr_t H5FDread(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, + haddr_t addr, size_t size, void *buf/*out*/); +H5_DLL herr_t H5FDwrite(H5FD_t *file, H5FD_mem_t type, hid_t dxpl_id, + haddr_t addr, size_t size, const void *buf); +H5_DLL herr_t H5FDflush(H5FD_t *file, hid_t dxpl_id, unsigned closing); +H5_DLL herr_t H5FDtruncate(H5FD_t *file, hid_t dxpl_id, hbool_t closing); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/privatemodules/nc4/include/H5FDsec2.h b/privatemodules/nc4/include/H5FDsec2.h new file mode 100644 index 0000000000000000000000000000000000000000..b7db0d5ea998e779c8ea2f47ef42789ebaa5b39d --- /dev/null +++ b/privatemodules/nc4/include/H5FDsec2.h @@ -0,0 +1,42 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Robb Matzke <matzke@llnl.gov> + * Monday, August 2, 1999 + * + * Purpose: The public header file for the sec2 driver. + */ +#ifndef H5FDsec2_H +#define H5FDsec2_H + +#include "H5Ipublic.h" + +#define H5FD_SEC2 (H5FD_sec2_init()) + +#ifdef __cplusplus +extern "C" { +#endif + +H5_DLL hid_t H5FD_sec2_init(void); +H5_DLL void H5FD_sec2_term(void); +H5_DLL herr_t H5Pset_fapl_sec2(hid_t fapl_id); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/privatemodules/nc4/include/H5FDstdio.h b/privatemodules/nc4/include/H5FDstdio.h new file mode 100644 index 0000000000000000000000000000000000000000..80443d890165a4588df6b01e594309fc39bfe16c --- /dev/null +++ b/privatemodules/nc4/include/H5FDstdio.h @@ -0,0 +1,41 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Robb Matzke <matzke@llnl.gov> + * Monday, August 2, 1999 + * + * Purpose: The public header file for the sec2 driver. + */ +#ifndef H5FDstdio_H +#define H5FDstdio_H + +#include "H5Ipublic.h" + +#define H5FD_STDIO (H5FD_stdio_init()) + +#ifdef __cplusplus +extern "C" { +#endif + +H5_DLL hid_t H5FD_stdio_init(void); +H5_DLL void H5FD_stdio_term(void); +H5_DLL herr_t H5Pset_fapl_stdio(hid_t fapl_id); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/privatemodules/nc4/include/H5Fpublic.h b/privatemodules/nc4/include/H5Fpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..8466a26aa6c28d9c309c70a4d0129b0af533254d --- /dev/null +++ b/privatemodules/nc4/include/H5Fpublic.h @@ -0,0 +1,196 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5F module. + */ +#ifndef _H5Fpublic_H +#define _H5Fpublic_H + +/* Public header files needed by this file */ +#include "H5public.h" +#include "H5ACpublic.h" +#include "H5Ipublic.h" + +/* 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 */ + +/* + * 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 0x0000u) /*absence of rdwr => rd-only */ +#define H5F_ACC_RDWR (H5CHECK 0x0001u) /*open for read and write */ +#define H5F_ACC_TRUNC (H5CHECK 0x0002u) /*overwrite existing files */ +#define H5F_ACC_EXCL (H5CHECK 0x0004u) /*fail if file already exists*/ +#define H5F_ACC_DEBUG (H5CHECK 0x0008u) /*print debug info */ +#define H5F_ACC_CREAT (H5CHECK 0x0010u) /*create non-existing files */ + +/* Value passed to H5Pset_elink_acc_flags to cause flags to be taken from the + * parent file. */ +#define H5F_ACC_DEFAULT (H5CHECK 0xffffu) /*ignore setting on lapl */ + +/* Flags for H5Fget_obj_count() & H5Fget_obj_ids() calls */ +#define H5F_OBJ_FILE (0x0001u) /* File objects */ +#define H5F_OBJ_DATASET (0x0002u) /* Dataset objects */ +#define H5F_OBJ_GROUP (0x0004u) /* Group objects */ +#define H5F_OBJ_DATATYPE (0x0008u) /* Named datatype objects */ +#define H5F_OBJ_ATTR (0x0010u) /* Attribute objects */ +#define H5F_OBJ_ALL (H5F_OBJ_FILE|H5F_OBJ_DATASET|H5F_OBJ_GROUP|H5F_OBJ_DATATYPE|H5F_OBJ_ATTR) +#define H5F_OBJ_LOCAL (0x0020u) /* Restrict search to objects opened through current file ID */ + /* (as opposed to objects opened through any file ID accessing this file) */ + +#define H5F_FAMILY_DEFAULT (hsize_t)0 + +#ifdef H5_HAVE_PARALLEL +/* + * Use this constant string as the MPI_Info key to set H5Fmpio debug flags. + * To turn on H5Fmpio debug flags, set the MPI_Info value with this key to + * have the value of a string consisting of the characters that turn on the + * desired flags. + */ +#define H5F_MPIO_DEBUG_KEY "H5F_mpio_debug_key" +#endif /* H5_HAVE_PARALLEL */ + +/* The difference between a single file and a set of mounted files */ +typedef enum H5F_scope_t { + H5F_SCOPE_LOCAL = 0, /*specified file handle only */ + H5F_SCOPE_GLOBAL = 1 /*entire virtual file */ +} H5F_scope_t; + +/* Unlimited file size for H5Pset_external() */ +#define H5F_UNLIMITED ((hsize_t)(-1L)) + +/* How does file close behave? + * H5F_CLOSE_DEFAULT - Use the degree pre-defined by underlining VFL + * H5F_CLOSE_WEAK - file closes only after all opened objects are closed + * H5F_CLOSE_SEMI - if no opened objects, file is close; otherwise, file + close fails + * H5F_CLOSE_STRONG - if there are opened objects, close them first, then + close file + */ +typedef enum H5F_close_degree_t { + H5F_CLOSE_DEFAULT = 0, + H5F_CLOSE_WEAK = 1, + H5F_CLOSE_SEMI = 2, + H5F_CLOSE_STRONG = 3 +} H5F_close_degree_t; + +/* Current "global" information about file */ +/* (just size info currently) */ +typedef struct H5F_info_t { + hsize_t super_ext_size; /* Superblock extension size */ + struct { + hsize_t hdr_size; /* Shared object header message header size */ + H5_ih_info_t msgs_info; /* Shared object header message index & heap size */ + } sohm; +} H5F_info_t; + +/* + * Types of allocation requests. The values larger than H5FD_MEM_DEFAULT + * should not change other than adding new types to the end. These numbers + * might appear in files. + * + * Note: please change the log VFD flavors array if you change this + * enumeration. + */ +typedef enum H5F_mem_t { + H5FD_MEM_NOLIST = -1, /* Data should not appear in the free list. + * Must be negative. + */ + H5FD_MEM_DEFAULT = 0, /* Value not yet set. Can also be the + * datatype set in a larger allocation + * that will be suballocated by the library. + * Must be zero. + */ + H5FD_MEM_SUPER = 1, /* Superblock data */ + H5FD_MEM_BTREE = 2, /* B-tree data */ + H5FD_MEM_DRAW = 3, /* Raw data (content of datasets, etc.) */ + H5FD_MEM_GHEAP = 4, /* Global heap data */ + H5FD_MEM_LHEAP = 5, /* Local heap data */ + H5FD_MEM_OHDR = 6, /* Object header data */ + + H5FD_MEM_NTYPES /* Sentinel value - must be last */ +} H5F_mem_t; + +/* Library's file format versions */ +typedef enum H5F_libver_t { + H5F_LIBVER_EARLIEST, /* Use the earliest possible format for storing objects */ + H5F_LIBVER_LATEST /* Use the latest possible format available for storing objects*/ +} H5F_libver_t; + +/* Define file format version for 1.8 to prepare for 1.10 release. + * (Not used anywhere now)*/ +#define H5F_LIBVER_18 H5F_LIBVER_LATEST + +#ifdef __cplusplus +extern "C" { +#endif + +/* Functions in H5F.c */ +H5_DLL htri_t H5Fis_hdf5(const char *filename); +H5_DLL hid_t H5Fcreate(const char *filename, unsigned flags, + hid_t create_plist, hid_t access_plist); +H5_DLL hid_t H5Fopen(const char *filename, unsigned flags, + hid_t access_plist); +H5_DLL hid_t H5Freopen(hid_t file_id); +H5_DLL herr_t H5Fflush(hid_t object_id, H5F_scope_t scope); +H5_DLL herr_t H5Fclose(hid_t file_id); +H5_DLL hid_t H5Fget_create_plist(hid_t file_id); +H5_DLL hid_t H5Fget_access_plist(hid_t file_id); +H5_DLL herr_t H5Fget_intent(hid_t file_id, unsigned * intent); +H5_DLL ssize_t H5Fget_obj_count(hid_t file_id, unsigned types); +H5_DLL ssize_t H5Fget_obj_ids(hid_t file_id, unsigned types, size_t max_objs, hid_t *obj_id_list); +H5_DLL herr_t H5Fget_vfd_handle(hid_t file_id, hid_t fapl, void **file_handle); +H5_DLL herr_t H5Fmount(hid_t loc, const char *name, hid_t child, hid_t plist); +H5_DLL herr_t H5Funmount(hid_t loc, const char *name); +H5_DLL hssize_t H5Fget_freespace(hid_t file_id); +H5_DLL herr_t H5Fget_filesize(hid_t file_id, hsize_t *size); +H5_DLL ssize_t H5Fget_file_image(hid_t file_id, void * buf_ptr, size_t buf_len); +H5_DLL herr_t H5Fget_mdc_config(hid_t file_id, + H5AC_cache_config_t * config_ptr); +H5_DLL herr_t H5Fset_mdc_config(hid_t file_id, + H5AC_cache_config_t * config_ptr); +H5_DLL herr_t H5Fget_mdc_hit_rate(hid_t file_id, double * hit_rate_ptr); +H5_DLL herr_t H5Fget_mdc_size(hid_t file_id, + size_t * max_size_ptr, + size_t * min_clean_size_ptr, + size_t * cur_size_ptr, + int * cur_num_entries_ptr); +H5_DLL herr_t H5Freset_mdc_hit_rate_stats(hid_t file_id); +H5_DLL ssize_t H5Fget_name(hid_t obj_id, char *name, size_t size); +H5_DLL herr_t H5Fget_info(hid_t obj_id, H5F_info_t *bh_info); +H5_DLL herr_t H5Fclear_elink_file_cache(hid_t file_id); +#ifdef H5_HAVE_PARALLEL +H5_DLL herr_t H5Fset_mpi_atomicity(hid_t file_id, hbool_t flag); +H5_DLL herr_t H5Fget_mpi_atomicity(hid_t file_id, hbool_t *flag); +#endif /* H5_HAVE_PARALLEL */ + +#ifdef __cplusplus +} +#endif +#endif /* _H5Fpublic_H */ + diff --git a/privatemodules/nc4/include/H5Gpublic.h b/privatemodules/nc4/include/H5Gpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..5b8b05478a5bdf36df8efbf507ec55b6b03fc589 --- /dev/null +++ b/privatemodules/nc4/include/H5Gpublic.h @@ -0,0 +1,178 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Gpublic.h + * Jul 11 1997 + * Robb Matzke <matzke@llnl.gov> + * + * Purpose: Public declarations for the H5G package + * + *------------------------------------------------------------------------- + */ +#ifndef _H5Gpublic_H +#define _H5Gpublic_H + +/* System headers needed by this file */ +#include <sys/types.h> + +/* Public headers needed by this file */ +#include "H5public.h" /* Generic Functions */ +#include "H5Lpublic.h" /* Links */ +#include "H5Opublic.h" /* Object headers */ +#include "H5Tpublic.h" /* Datatypes */ + +/*****************/ +/* Public Macros */ +/*****************/ + +#ifdef __cplusplus +extern "C" { +#endif + +/*******************/ +/* Public Typedefs */ +/*******************/ + +/* Types of link storage for groups */ +typedef enum H5G_storage_type_t { + H5G_STORAGE_TYPE_UNKNOWN = -1, /* Unknown link storage type */ + H5G_STORAGE_TYPE_SYMBOL_TABLE, /* Links in group are stored with a "symbol table" */ + /* (this is sometimes called "old-style" groups) */ + H5G_STORAGE_TYPE_COMPACT, /* Links are stored in object header */ + H5G_STORAGE_TYPE_DENSE /* Links are stored in fractal heap & indexed with v2 B-tree */ +} H5G_storage_type_t; + +/* Information struct for group (for H5Gget_info/H5Gget_info_by_name/H5Gget_info_by_idx) */ +typedef struct H5G_info_t { + H5G_storage_type_t storage_type; /* Type of storage for links in group */ + hsize_t nlinks; /* Number of links in group */ + int64_t max_corder; /* Current max. creation order value for group */ + hbool_t mounted; /* Whether group has a file mounted on it */ +} H5G_info_t; + +/********************/ +/* Public Variables */ +/********************/ + + +/*********************/ +/* Public Prototypes */ +/*********************/ +H5_DLL hid_t H5Gcreate2(hid_t loc_id, const char *name, hid_t lcpl_id, + hid_t gcpl_id, hid_t gapl_id); +H5_DLL hid_t H5Gcreate_anon(hid_t loc_id, hid_t gcpl_id, hid_t gapl_id); +H5_DLL hid_t H5Gopen2(hid_t loc_id, const char *name, hid_t gapl_id); +H5_DLL hid_t H5Gget_create_plist(hid_t group_id); +H5_DLL herr_t H5Gget_info(hid_t loc_id, H5G_info_t *ginfo); +H5_DLL herr_t H5Gget_info_by_name(hid_t loc_id, const char *name, H5G_info_t *ginfo, + hid_t lapl_id); +H5_DLL herr_t H5Gget_info_by_idx(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5G_info_t *ginfo, + hid_t lapl_id); +H5_DLL herr_t H5Gclose(hid_t group_id); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Macros */ + +/* Link definitions */ +#define H5G_SAME_LOC H5L_SAME_LOC +#define H5G_LINK_ERROR H5L_TYPE_ERROR +#define H5G_LINK_HARD H5L_TYPE_HARD +#define H5G_LINK_SOFT H5L_TYPE_SOFT +#define H5G_link_t H5L_type_t + +/* Macros for types of objects in a group (see H5G_obj_t definition) */ +#define H5G_NTYPES 256 /* Max possible number of types */ +#define H5G_NLIBTYPES 8 /* Number of internal types */ +#define H5G_NUSERTYPES (H5G_NTYPES - H5G_NLIBTYPES) +#define H5G_USERTYPE(X) (8 + (X)) /* User defined types */ + + +/* Typedefs */ + +/* + * An object has a certain type. The first few numbers are reserved for use + * internally by HDF5. Users may add their own types with higher values. The + * values are never stored in the file -- they only exist while an + * application is running. An object may satisfy the `isa' function for more + * than one type. + */ +typedef enum H5G_obj_t { + H5G_UNKNOWN = -1, /* Unknown object type */ + H5G_GROUP, /* Object is a group */ + H5G_DATASET, /* Object is a dataset */ + H5G_TYPE, /* Object is a named data type */ + H5G_LINK, /* Object is a symbolic link */ + H5G_UDLINK, /* Object is a user-defined link */ + H5G_RESERVED_5, /* Reserved for future use */ + H5G_RESERVED_6, /* Reserved for future use */ + H5G_RESERVED_7 /* Reserved for future use */ +} H5G_obj_t; + +/* Prototype for H5Giterate() operator */ +typedef herr_t (*H5G_iterate_t)(hid_t group, const char *name, void *op_data); + +/* Information about an object */ +typedef struct H5G_stat_t { + unsigned long fileno[2]; /*file number */ + unsigned long objno[2]; /*object number */ + unsigned nlink; /*number of hard links to object*/ + H5G_obj_t type; /*basic object type */ + time_t mtime; /*modification time */ + size_t linklen; /*symbolic link value length */ + H5O_stat_t ohdr; /* Object header information */ +} H5G_stat_t; + + +/* Function prototypes */ +H5_DLL hid_t H5Gcreate1(hid_t loc_id, const char *name, size_t size_hint); +H5_DLL hid_t H5Gopen1(hid_t loc_id, const char *name); +H5_DLL herr_t H5Glink(hid_t cur_loc_id, H5G_link_t type, const char *cur_name, + const char *new_name); +H5_DLL herr_t H5Glink2(hid_t cur_loc_id, const char *cur_name, H5G_link_t type, + hid_t new_loc_id, const char *new_name); +H5_DLL herr_t H5Gmove(hid_t src_loc_id, const char *src_name, + const char *dst_name); +H5_DLL herr_t H5Gmove2(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, + const char *dst_name); +H5_DLL herr_t H5Gunlink(hid_t loc_id, const char *name); +H5_DLL herr_t H5Gget_linkval(hid_t loc_id, const char *name, size_t size, + char *buf/*out*/); +H5_DLL herr_t H5Gset_comment(hid_t loc_id, const char *name, const char *comment); +H5_DLL int H5Gget_comment(hid_t loc_id, const char *name, size_t bufsize, + char *buf); +H5_DLL herr_t H5Giterate(hid_t loc_id, const char *name, int *idx, + H5G_iterate_t op, void *op_data); +H5_DLL herr_t H5Gget_num_objs(hid_t loc_id, hsize_t *num_objs); +H5_DLL herr_t H5Gget_objinfo(hid_t loc_id, const char *name, + hbool_t follow_link, H5G_stat_t *statbuf/*out*/); +H5_DLL ssize_t H5Gget_objname_by_idx(hid_t loc_id, hsize_t idx, char* name, + size_t size); +H5_DLL H5G_obj_t H5Gget_objtype_by_idx(hid_t loc_id, hsize_t idx); + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif +#endif /* _H5Gpublic_H */ + diff --git a/privatemodules/nc4/include/H5IMpublic.h b/privatemodules/nc4/include/H5IMpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..6833f02d6e437e1de15d0f1cfc846039974ba8a8 --- /dev/null +++ b/privatemodules/nc4/include/H5IMpublic.h @@ -0,0 +1,87 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef _H5IMpublic_H +#define _H5IMpublic_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +H5_HLDLL herr_t H5IMmake_image_8bit( hid_t loc_id, + const char *dset_name, + hsize_t width, + hsize_t height, + const unsigned char *buffer ); + +H5_HLDLL herr_t H5IMmake_image_24bit( hid_t loc_id, + const char *dset_name, + hsize_t width, + hsize_t height, + const char *interlace, + const unsigned char *buffer ); + +H5_HLDLL herr_t H5IMget_image_info( hid_t loc_id, + const char *dset_name, + hsize_t *width, + hsize_t *height, + hsize_t *planes, + char *interlace, + hssize_t *npals ); + +H5_HLDLL herr_t H5IMread_image( hid_t loc_id, + const char *dset_name, + unsigned char *buffer ); + +H5_HLDLL herr_t H5IMmake_palette( hid_t loc_id, + const char *pal_name, + const hsize_t *pal_dims, + const unsigned char *pal_data ); + +H5_HLDLL herr_t H5IMlink_palette( hid_t loc_id, + const char *image_name, + const char *pal_name ); + +H5_HLDLL herr_t H5IMunlink_palette( hid_t loc_id, + const char *image_name, + const char *pal_name ); + +H5_HLDLL herr_t H5IMget_npalettes( hid_t loc_id, + const char *image_name, + hssize_t *npals ); + +H5_HLDLL herr_t H5IMget_palette_info( hid_t loc_id, + const char *image_name, + int pal_number, + hsize_t *pal_dims ); + +H5_HLDLL herr_t H5IMget_palette( hid_t loc_id, + const char *image_name, + int pal_number, + unsigned char *pal_data ); + +H5_HLDLL herr_t H5IMis_image( hid_t loc_id, + const char *dset_name ); + +H5_HLDLL herr_t H5IMis_palette( hid_t loc_id, + const char *dset_name ); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/privatemodules/nc4/include/H5Ipublic.h b/privatemodules/nc4/include/H5Ipublic.h new file mode 100644 index 0000000000000000000000000000000000000000..d6305564544b500bad7a510b717f16f1f322aad7 --- /dev/null +++ b/privatemodules/nc4/include/H5Ipublic.h @@ -0,0 +1,104 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains function prototypes for each exported function in + * the H5I module. + */ +#ifndef _H5Ipublic_H +#define _H5Ipublic_H + +/* Public headers needed by this file */ +#include "H5public.h" + +/* + * Library type values. Start with `1' instead of `0' because it makes the + * tracing output look better when hid_t values are large numbers. Change the + * TYPE_BITS in H5I.c if the MAXID gets larger than 32 (an assertion will + * fail otherwise). + * + * When adding types here, add a section to the 'misc19' test in test/tmisc.c + * to verify that the H5I{inc|dec|get}_ref() routines work correctly with in. + * + */ +typedef enum H5I_type_t { + H5I_UNINIT = (-2), /*uninitialized type */ + H5I_BADID = (-1), /*invalid Type */ + H5I_FILE = 1, /*type ID for File objects */ + H5I_GROUP, /*type ID for Group objects */ + H5I_DATATYPE, /*type ID for Datatype objects */ + H5I_DATASPACE, /*type ID for Dataspace objects */ + H5I_DATASET, /*type ID for Dataset objects */ + H5I_ATTR, /*type ID for Attribute objects */ + H5I_REFERENCE, /*type ID for Reference objects */ + H5I_VFL, /*type ID for virtual file layer */ + H5I_GENPROP_CLS, /*type ID for generic property list classes */ + H5I_GENPROP_LST, /*type ID for generic property lists */ + H5I_ERROR_CLASS, /*type ID for error classes */ + H5I_ERROR_MSG, /*type ID for error messages */ + H5I_ERROR_STACK, /*type ID for error stacks */ + H5I_NTYPES /*number of library types, MUST BE LAST! */ +} H5I_type_t; + +/* Type of atoms to return to users */ +typedef int hid_t; +#define H5_SIZEOF_HID_T H5_SIZEOF_INT + +/* An invalid object ID. This is also negative for error return. */ +#define H5I_INVALID_HID (-1) + +/* + * Function for freeing objects. This function will be called with an object + * ID type number and a pointer to the object. The function should free the + * object and return non-negative to indicate that the object + * can be removed from the ID type. If the function returns negative + * (failure) then the object will remain in the ID type. + */ +typedef herr_t (*H5I_free_t)(void*); + +/* Type of the function to compare objects & keys */ +typedef int (*H5I_search_func_t)(void *obj, hid_t id, void *key); + +#ifdef __cplusplus +extern "C" { +#endif + +/* Public API functions */ + +H5_DLL hid_t H5Iregister(H5I_type_t type, const void *object); +H5_DLL void *H5Iobject_verify(hid_t id, H5I_type_t id_type); +H5_DLL void *H5Iremove_verify(hid_t id, H5I_type_t id_type); +H5_DLL H5I_type_t H5Iget_type(hid_t id); +H5_DLL hid_t H5Iget_file_id(hid_t id); +H5_DLL ssize_t H5Iget_name(hid_t id, char *name/*out*/, size_t size); +H5_DLL int H5Iinc_ref(hid_t id); +H5_DLL int H5Idec_ref(hid_t id); +H5_DLL int H5Iget_ref(hid_t id); +H5_DLL H5I_type_t H5Iregister_type(size_t hash_size, unsigned reserved, H5I_free_t free_func); +H5_DLL herr_t H5Iclear_type(H5I_type_t type, hbool_t force); +H5_DLL herr_t H5Idestroy_type(H5I_type_t type); +H5_DLL int H5Iinc_type_ref(H5I_type_t type); +H5_DLL int H5Idec_type_ref(H5I_type_t type); +H5_DLL int H5Iget_type_ref(H5I_type_t type); +H5_DLL void *H5Isearch(H5I_type_t type, H5I_search_func_t func, void *key); +H5_DLL herr_t H5Inmembers(H5I_type_t type, hsize_t *num_members); +H5_DLL htri_t H5Itype_exists(H5I_type_t type); +H5_DLL htri_t H5Iis_valid(hid_t id); + +#ifdef __cplusplus +} +#endif +#endif /* _H5Ipublic_H */ + diff --git a/privatemodules/nc4/include/H5LTpublic.h b/privatemodules/nc4/include/H5LTpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..929c6bdde4a4ed7ea3d3379546b2c6d1187cf548 --- /dev/null +++ b/privatemodules/nc4/include/H5LTpublic.h @@ -0,0 +1,370 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef _H5LTpublic_H +#define _H5LTpublic_H + +/* Flag definitions for H5LTopen_file_image() */ +#define H5LT_FILE_IMAGE_OPEN_RW 0x0001 /* Open image for read-write */ +#define H5LT_FILE_IMAGE_DONT_COPY 0x0002 /* The HDF5 lib won't copy */ +/* user supplied image buffer. The same image is open with the core driver. */ +#define H5LT_FILE_IMAGE_DONT_RELEASE 0x0004 /* The HDF5 lib won't */ +/* deallocate user supplied image buffer. The user application is reponsible */ +/* for doing so. */ +#define H5LT_FILE_IMAGE_ALL 0x0007 + +typedef enum H5LT_lang_t { + H5LT_LANG_ERR = -1, /*this is the first*/ + H5LT_DDL = 0, /*for DDL*/ + H5LT_C = 1, /*for C*/ + H5LT_FORTRAN = 2, /*for Fortran*/ + H5LT_NO_LANG = 3 /*this is the last*/ +} H5LT_lang_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/*------------------------------------------------------------------------- + * + * Make dataset functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5LTmake_dataset( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + hid_t type_id, + const void *buffer ); + +H5_HLDLL herr_t H5LTmake_dataset_char( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + const char *buffer ); + +H5_HLDLL herr_t H5LTmake_dataset_short( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + const short *buffer ); + +H5_HLDLL herr_t H5LTmake_dataset_int( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + const int *buffer ); + +H5_HLDLL herr_t H5LTmake_dataset_long( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + const long *buffer ); + +H5_HLDLL herr_t H5LTmake_dataset_float( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + const float *buffer ); + +H5_HLDLL herr_t H5LTmake_dataset_double( hid_t loc_id, + const char *dset_name, + int rank, + const hsize_t *dims, + const double *buffer ); + +H5_HLDLL herr_t H5LTmake_dataset_string( hid_t loc_id, + const char *dset_name, + const char *buf ); + + +/*------------------------------------------------------------------------- + * + * Read dataset functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5LTread_dataset( hid_t loc_id, + const char *dset_name, + hid_t type_id, + void *buffer ); + +H5_HLDLL herr_t H5LTread_dataset_char( hid_t loc_id, + const char *dset_name, + char *buffer ); + +H5_HLDLL herr_t H5LTread_dataset_short( hid_t loc_id, + const char *dset_name, + short *buffer ); + +H5_HLDLL herr_t H5LTread_dataset_int( hid_t loc_id, + const char *dset_name, + int *buffer ); + +H5_HLDLL herr_t H5LTread_dataset_long( hid_t loc_id, + const char *dset_name, + long *buffer ); + +H5_HLDLL herr_t H5LTread_dataset_float( hid_t loc_id, + const char *dset_name, + float *buffer ); + +H5_HLDLL herr_t H5LTread_dataset_double( hid_t loc_id, + const char *dset_name, + double *buffer ); + +H5_HLDLL herr_t H5LTread_dataset_string( hid_t loc_id, + const char *dset_name, + char *buf ); + +/*------------------------------------------------------------------------- + * + * Query dataset functions + * + *------------------------------------------------------------------------- + */ + + +H5_HLDLL herr_t H5LTget_dataset_ndims( hid_t loc_id, + const char *dset_name, + int *rank ); + +H5_HLDLL herr_t H5LTget_dataset_info( hid_t loc_id, + const char *dset_name, + hsize_t *dims, + H5T_class_t *type_class, + size_t *type_size ); + +H5_HLDLL herr_t H5LTfind_dataset( hid_t loc_id, const char *name ); + + + +/*------------------------------------------------------------------------- + * + * Set attribute functions + * + *------------------------------------------------------------------------- + */ + + +H5_HLDLL herr_t H5LTset_attribute_string( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const char *attr_data ); + +H5_HLDLL herr_t H5LTset_attribute_char( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const char *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_uchar( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const unsigned char *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_short( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const short *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_ushort( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const unsigned short *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_int( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const int *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_uint( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const unsigned int *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const long *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_long_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const long long *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_ulong( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const unsigned long *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_float( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const float *buffer, + size_t size ); + +H5_HLDLL herr_t H5LTset_attribute_double( hid_t loc_id, + const char *obj_name, + const char *attr_name, + const double *buffer, + size_t size ); + +/*------------------------------------------------------------------------- + * + * Get attribute functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5LTget_attribute( hid_t loc_id, + const char *obj_name, + const char *attr_name, + hid_t mem_type_id, + void *data ); + +H5_HLDLL herr_t H5LTget_attribute_string( hid_t loc_id, + const char *obj_name, + const char *attr_name, + char *data ); + +H5_HLDLL herr_t H5LTget_attribute_char( hid_t loc_id, + const char *obj_name, + const char *attr_name, + char *data ); + +H5_HLDLL herr_t H5LTget_attribute_uchar( hid_t loc_id, + const char *obj_name, + const char *attr_name, + unsigned char *data ); + +H5_HLDLL herr_t H5LTget_attribute_short( hid_t loc_id, + const char *obj_name, + const char *attr_name, + short *data ); + +H5_HLDLL herr_t H5LTget_attribute_ushort( hid_t loc_id, + const char *obj_name, + const char *attr_name, + unsigned short *data ); + +H5_HLDLL herr_t H5LTget_attribute_int( hid_t loc_id, + const char *obj_name, + const char *attr_name, + int *data ); + +H5_HLDLL herr_t H5LTget_attribute_uint( hid_t loc_id, + const char *obj_name, + const char *attr_name, + unsigned int *data ); + +H5_HLDLL herr_t H5LTget_attribute_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + long *data ); + +H5_HLDLL herr_t H5LTget_attribute_long_long( hid_t loc_id, + const char *obj_name, + const char *attr_name, + long long *data ); + +H5_HLDLL herr_t H5LTget_attribute_ulong( hid_t loc_id, + const char *obj_name, + const char *attr_name, + unsigned long *data ); + +H5_HLDLL herr_t H5LTget_attribute_float( hid_t loc_id, + const char *obj_name, + const char *attr_name, + float *data ); + +H5_HLDLL herr_t H5LTget_attribute_double( hid_t loc_id, + const char *obj_name, + const char *attr_name, + double *data ); + + +/*------------------------------------------------------------------------- + * + * Query attribute functions + * + *------------------------------------------------------------------------- + */ + + +H5_HLDLL herr_t H5LTget_attribute_ndims( hid_t loc_id, + const char *obj_name, + const char *attr_name, + int *rank ); + +H5_HLDLL herr_t H5LTget_attribute_info( hid_t loc_id, + const char *obj_name, + const char *attr_name, + hsize_t *dims, + H5T_class_t *type_class, + size_t *type_size ); + + + + + +/*------------------------------------------------------------------------- + * + * General functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL hid_t H5LTtext_to_dtype(const char *text, H5LT_lang_t lang_type); +H5_HLDLL herr_t H5LTdtype_to_text(hid_t dtype, char *str, H5LT_lang_t lang_type, size_t *len); + + +/*------------------------------------------------------------------------- + * + * Utility functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5LTfind_attribute( hid_t loc_id, const char *name ); + +H5_HLDLL htri_t H5LTpath_valid(hid_t loc_id, const char *path, hbool_t check_object_valid); + +/*------------------------------------------------------------------------- + * + * File image operations functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL hid_t H5LTopen_file_image(void *buf_ptr, size_t buf_size, unsigned flags); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/privatemodules/nc4/include/H5Lpublic.h b/privatemodules/nc4/include/H5Lpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..620d2e9b00cd40ee07a09c729eaf3b379ee00929 --- /dev/null +++ b/privatemodules/nc4/include/H5Lpublic.h @@ -0,0 +1,202 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Lpublic.h + * Dec 1 2005 + * James Laird + * + * Purpose: Public declarations for the H5L package (links) + * + *------------------------------------------------------------------------- + */ +#ifndef _H5Lpublic_H +#define _H5Lpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" /* Generic Functions */ +#include "H5Ipublic.h" /* IDs */ +#include "H5Tpublic.h" /* Datatypes */ + +/*****************/ +/* Public Macros */ +/*****************/ + +/* Maximum length of a link's name */ +/* (encoded in a 32-bit unsigned integer) */ +#define H5L_MAX_LINK_NAME_LEN ((uint32_t)(-1)) /* (4GB - 1) */ + +/* Macro to indicate operation occurs on same location */ +#define H5L_SAME_LOC 0 + +/* Current version of the H5L_class_t struct */ +#define H5L_LINK_CLASS_T_VERS 0 + +#ifdef __cplusplus +extern "C" { +#endif + +/*******************/ +/* Public Typedefs */ +/*******************/ + +/* Link class types. + * Values less than 64 are reserved for the HDF5 library's internal use. + * Values 64 to 255 are for "user-defined" link class types; these types are + * defined by HDF5 but their behavior can be overridden by users. + * Users who want to create new classes of links should contact the HDF5 + * development team at hdfhelp@ncsa.uiuc.edu . + * These values can never change because they appear in HDF5 files. + */ +typedef enum { + H5L_TYPE_ERROR = (-1), /* Invalid link type id */ + H5L_TYPE_HARD = 0, /* Hard link id */ + H5L_TYPE_SOFT = 1, /* Soft link id */ + H5L_TYPE_EXTERNAL = 64, /* External link id */ + H5L_TYPE_MAX = 255 /* Maximum link type id */ +} H5L_type_t; +#define H5L_TYPE_BUILTIN_MAX H5L_TYPE_SOFT /* Maximum value link value for "built-in" link types */ +#define H5L_TYPE_UD_MIN H5L_TYPE_EXTERNAL /* Link ids at or above this value are "user-defined" link types. */ + +/* Information struct for link (for H5Lget_info/H5Lget_info_by_idx) */ +typedef struct { + H5L_type_t type; /* Type of link */ + hbool_t corder_valid; /* Indicate if creation order is valid */ + int64_t corder; /* Creation order */ + H5T_cset_t cset; /* Character set of link name */ + union { + haddr_t address; /* Address hard link points to */ + size_t val_size; /* Size of a soft link or UD link value */ + } u; +} H5L_info_t; + +/* The H5L_class_t struct can be used to override the behavior of a + * "user-defined" link class. Users should populate the struct with callback + * functions defined below. + */ +/* Callback prototypes for user-defined links */ +/* Link creation callback */ +typedef herr_t (*H5L_create_func_t)(const char *link_name, hid_t loc_group, + const void *lnkdata, size_t lnkdata_size, hid_t lcpl_id); + +/* Callback for when the link is moved */ +typedef herr_t (*H5L_move_func_t)(const char *new_name, hid_t new_loc, + const void *lnkdata, size_t lnkdata_size); + +/* Callback for when the link is copied */ +typedef herr_t (*H5L_copy_func_t)(const char *new_name, hid_t new_loc, + const void *lnkdata, size_t lnkdata_size); + +/* Callback during link traversal */ +typedef herr_t (*H5L_traverse_func_t)(const char *link_name, hid_t cur_group, + const void *lnkdata, size_t lnkdata_size, hid_t lapl_id); + +/* Callback for when the link is deleted */ +typedef herr_t (*H5L_delete_func_t)(const char *link_name, hid_t file, + const void *lnkdata, size_t lnkdata_size); + +/* Callback for querying the link */ +/* Returns the size of the buffer needed */ +typedef ssize_t (*H5L_query_func_t)(const char *link_name, const void *lnkdata, + size_t lnkdata_size, void *buf /*out*/, size_t buf_size); + +/* User-defined link types */ +typedef struct { + int version; /* Version number of this struct */ + H5L_type_t id; /* Link type ID */ + const char *comment; /* Comment for debugging */ + H5L_create_func_t create_func; /* Callback during link creation */ + H5L_move_func_t move_func; /* Callback after moving link */ + H5L_copy_func_t copy_func; /* Callback after copying link */ + H5L_traverse_func_t trav_func; /* Callback during link traversal */ + H5L_delete_func_t del_func; /* Callback for link deletion */ + H5L_query_func_t query_func; /* Callback for queries */ +} H5L_class_t; + +/* Prototype for H5Literate/H5Literate_by_name() operator */ +typedef herr_t (*H5L_iterate_t)(hid_t group, const char *name, const H5L_info_t *info, + void *op_data); + +/* Callback for external link traversal */ +typedef herr_t (*H5L_elink_traverse_t)(const char *parent_file_name, + const char *parent_group_name, const char *child_file_name, + const char *child_object_name, unsigned *acc_flags, hid_t fapl_id, + void *op_data); + + +/********************/ +/* Public Variables */ +/********************/ + + +/*********************/ +/* Public Prototypes */ +/*********************/ +H5_DLL herr_t H5Lmove(hid_t src_loc, const char *src_name, hid_t dst_loc, + const char *dst_name, hid_t lcpl_id, hid_t lapl_id); +H5_DLL herr_t H5Lcopy(hid_t src_loc, const char *src_name, hid_t dst_loc, + const char *dst_name, hid_t lcpl_id, hid_t lapl_id); +H5_DLL herr_t H5Lcreate_hard(hid_t cur_loc, const char *cur_name, + hid_t dst_loc, const char *dst_name, hid_t lcpl_id, hid_t lapl_id); +H5_DLL herr_t H5Lcreate_soft(const char *link_target, hid_t link_loc_id, + const char *link_name, hid_t lcpl_id, hid_t lapl_id); +H5_DLL herr_t H5Ldelete(hid_t loc_id, const char *name, hid_t lapl_id); +H5_DLL herr_t H5Ldelete_by_idx(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id); +H5_DLL herr_t H5Lget_val(hid_t loc_id, const char *name, void *buf/*out*/, + size_t size, hid_t lapl_id); +H5_DLL herr_t H5Lget_val_by_idx(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, + void *buf/*out*/, size_t size, hid_t lapl_id); +H5_DLL htri_t H5Lexists(hid_t loc_id, const char *name, hid_t lapl_id); +H5_DLL herr_t H5Lget_info(hid_t loc_id, const char *name, + H5L_info_t *linfo /*out*/, hid_t lapl_id); +H5_DLL herr_t H5Lget_info_by_idx(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, + H5L_info_t *linfo /*out*/, hid_t lapl_id); +H5_DLL ssize_t H5Lget_name_by_idx(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, + char *name /*out*/, size_t size, hid_t lapl_id); +H5_DLL herr_t H5Literate(hid_t grp_id, H5_index_t idx_type, + H5_iter_order_t order, hsize_t *idx, H5L_iterate_t op, void *op_data); +H5_DLL herr_t H5Literate_by_name(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t *idx, + H5L_iterate_t op, void *op_data, hid_t lapl_id); +H5_DLL herr_t H5Lvisit(hid_t grp_id, H5_index_t idx_type, H5_iter_order_t order, + H5L_iterate_t op, void *op_data); +H5_DLL herr_t H5Lvisit_by_name(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, H5L_iterate_t op, + void *op_data, hid_t lapl_id); + +/* UD link functions */ +H5_DLL herr_t H5Lcreate_ud(hid_t link_loc_id, const char *link_name, + H5L_type_t link_type, const void *udata, size_t udata_size, hid_t lcpl_id, + hid_t lapl_id); +H5_DLL herr_t H5Lregister(const H5L_class_t *cls); +H5_DLL herr_t H5Lunregister(H5L_type_t id); +H5_DLL htri_t H5Lis_registered(H5L_type_t id); + +/* External link functions */ +H5_DLL herr_t H5Lunpack_elink_val(const void *ext_linkval/*in*/, size_t link_size, + unsigned *flags, const char **filename/*out*/, const char **obj_path /*out*/); +H5_DLL herr_t H5Lcreate_external(const char *file_name, const char *obj_name, + hid_t link_loc_id, const char *link_name, hid_t lcpl_id, hid_t lapl_id); + +#ifdef __cplusplus +} +#endif +#endif /* _H5Lpublic_H */ + diff --git a/privatemodules/nc4/include/H5MMpublic.h b/privatemodules/nc4/include/H5MMpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..bfcb8073bbc0755b7e9dd557bd76b35bc5d0cf24 --- /dev/null +++ b/privatemodules/nc4/include/H5MMpublic.h @@ -0,0 +1,47 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5MMproto.h + * Jul 10 1997 + * Robb Matzke <matzke@llnl.gov> + * + * Purpose: Public declarations for the H5MM (memory management) + * package. + * + * Modifications: + * + *------------------------------------------------------------------------- + */ +#ifndef _H5MMpublic_H +#define _H5MMpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" + +/* These typedefs are currently used for VL datatype allocation/freeing */ +typedef void *(*H5MM_allocate_t)(size_t size, void *alloc_info); +typedef void (*H5MM_free_t)(void *mem, void *free_info); + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef __cplusplus +} +#endif +#endif /* _H5MMpublic_H */ + diff --git a/privatemodules/nc4/include/H5Opublic.h b/privatemodules/nc4/include/H5Opublic.h new file mode 100644 index 0000000000000000000000000000000000000000..32945e845ae81d3b7dae8fee424c250b1980ce7c --- /dev/null +++ b/privatemodules/nc4/include/H5Opublic.h @@ -0,0 +1,212 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/*------------------------------------------------------------------------- + * + * Created: H5Opublic.h + * Aug 5 1997 + * Robb Matzke <matzke@llnl.gov> + * + * Purpose: Public declarations for the H5O (object header) + * package. + * + *------------------------------------------------------------------------- + */ +#ifndef _H5Opublic_H +#define _H5Opublic_H + +/* Public headers needed by this file */ +#include "H5public.h" /* Generic Functions */ +#include "H5Ipublic.h" /* IDs */ +#include "H5Lpublic.h" /* Links */ + +/*****************/ +/* Public Macros */ +/*****************/ + +/* Flags for object copy (H5Ocopy) */ +#define H5O_COPY_SHALLOW_HIERARCHY_FLAG (0x0001u) /* Copy only immediate members */ +#define H5O_COPY_EXPAND_SOFT_LINK_FLAG (0x0002u) /* Expand soft links into new objects */ +#define H5O_COPY_EXPAND_EXT_LINK_FLAG (0x0004u) /* Expand external links into new objects */ +#define H5O_COPY_EXPAND_REFERENCE_FLAG (0x0008u) /* Copy objects that are pointed by references */ +#define H5O_COPY_WITHOUT_ATTR_FLAG (0x0010u) /* Copy object without copying attributes */ +#define H5O_COPY_PRESERVE_NULL_FLAG (0x0020u) /* Copy NULL messages (empty space) */ +#define H5O_COPY_MERGE_COMMITTED_DTYPE_FLAG (0x0040u) /* Merge committed datatypes in dest file */ +#define H5O_COPY_ALL (0x007Fu) /* All object copying flags (for internal checking) */ + +/* Flags for shared message indexes. + * Pass these flags in using the mesg_type_flags parameter in + * H5P_set_shared_mesg_index. + * (Developers: These flags correspond to object header message type IDs, + * but we need to assign each kind of message to a different bit so that + * one index can hold multiple types.) + */ +#define H5O_SHMESG_NONE_FLAG 0x0000 /* No shared messages */ +#define H5O_SHMESG_SDSPACE_FLAG ((unsigned)1 << 0x0001) /* Simple Dataspace Message. */ +#define H5O_SHMESG_DTYPE_FLAG ((unsigned)1 << 0x0003) /* Datatype Message. */ +#define H5O_SHMESG_FILL_FLAG ((unsigned)1 << 0x0005) /* Fill Value Message. */ +#define H5O_SHMESG_PLINE_FLAG ((unsigned)1 << 0x000b) /* Filter pipeline message. */ +#define H5O_SHMESG_ATTR_FLAG ((unsigned)1 << 0x000c) /* Attribute Message. */ +#define H5O_SHMESG_ALL_FLAG (H5O_SHMESG_SDSPACE_FLAG | H5O_SHMESG_DTYPE_FLAG | H5O_SHMESG_FILL_FLAG | H5O_SHMESG_PLINE_FLAG | H5O_SHMESG_ATTR_FLAG) + +/* Object header status flag definitions */ +#define H5O_HDR_CHUNK0_SIZE 0x03 /* 2-bit field indicating # of bytes to store the size of chunk 0's data */ +#define H5O_HDR_ATTR_CRT_ORDER_TRACKED 0x04 /* Attribute creation order is tracked */ +#define H5O_HDR_ATTR_CRT_ORDER_INDEXED 0x08 /* Attribute creation order has index */ +#define H5O_HDR_ATTR_STORE_PHASE_CHANGE 0x10 /* Non-default attribute storage phase change values stored */ +#define H5O_HDR_STORE_TIMES 0x20 /* Store access, modification, change & birth times for object */ +#define H5O_HDR_ALL_FLAGS (H5O_HDR_CHUNK0_SIZE | H5O_HDR_ATTR_CRT_ORDER_TRACKED | H5O_HDR_ATTR_CRT_ORDER_INDEXED | H5O_HDR_ATTR_STORE_PHASE_CHANGE | H5O_HDR_STORE_TIMES) + +/* Maximum shared message values. Number of indexes is 8 to allow room to add + * new types of messages. + */ +#define H5O_SHMESG_MAX_NINDEXES 8 +#define H5O_SHMESG_MAX_LIST_SIZE 5000 + +/*******************/ +/* Public Typedefs */ +/*******************/ + +/* Types of objects in file */ +typedef enum H5O_type_t { + H5O_TYPE_UNKNOWN = -1, /* Unknown object type */ + H5O_TYPE_GROUP, /* Object is a group */ + H5O_TYPE_DATASET, /* Object is a dataset */ + H5O_TYPE_NAMED_DATATYPE, /* Object is a named data type */ + H5O_TYPE_NTYPES /* Number of different object types (must be last!) */ +} H5O_type_t; + +/* Information struct for object header metadata (for H5Oget_info/H5Oget_info_by_name/H5Oget_info_by_idx) */ +typedef struct H5O_hdr_info_t { + unsigned version; /* Version number of header format in file */ + unsigned nmesgs; /* Number of object header messages */ + unsigned nchunks; /* Number of object header chunks */ + unsigned flags; /* Object header status flags */ + struct { + hsize_t total; /* Total space for storing object header in file */ + hsize_t meta; /* Space within header for object header metadata information */ + hsize_t mesg; /* Space within header for actual message information */ + hsize_t free; /* Free space within object header */ + } space; + struct { + uint64_t present; /* Flags to indicate presence of message type in header */ + uint64_t shared; /* Flags to indicate message type is shared in header */ + } mesg; +} H5O_hdr_info_t; + +/* Information struct for object (for H5Oget_info/H5Oget_info_by_name/H5Oget_info_by_idx) */ +typedef struct H5O_info_t { + unsigned long fileno; /* File number that object is located in */ + haddr_t addr; /* Object address in file */ + H5O_type_t type; /* Basic object type (group, dataset, etc.) */ + unsigned rc; /* Reference count of object */ + time_t atime; /* Access time */ + time_t mtime; /* Modification time */ + time_t ctime; /* Change time */ + time_t btime; /* Birth time */ + hsize_t num_attrs; /* # of attributes attached to object */ + H5O_hdr_info_t hdr; /* Object header information */ + /* Extra metadata storage for obj & attributes */ + struct { + H5_ih_info_t obj; /* v1/v2 B-tree & local/fractal heap for groups, B-tree for chunked datasets */ + H5_ih_info_t attr; /* v2 B-tree & heap for attributes */ + } meta_size; +} H5O_info_t; + +/* Typedef for message creation indexes */ +typedef uint32_t H5O_msg_crt_idx_t; + +/* Prototype for H5Ovisit/H5Ovisit_by_name() operator */ +typedef herr_t (*H5O_iterate_t)(hid_t obj, const char *name, const H5O_info_t *info, + void *op_data); + +typedef enum H5O_mcdt_search_ret_t { + H5O_MCDT_SEARCH_ERROR = -1, /* Abort H5Ocopy */ + H5O_MCDT_SEARCH_CONT, /* Continue the global search of all committed datatypes in the destination file */ + H5O_MCDT_SEARCH_STOP /* Stop the search, but continue copying. The committed datatype will be copied but not merged. */ +} H5O_mcdt_search_ret_t; + +/* Callback to invoke when completing the search for a matching committed datatype from the committed dtype list */ +typedef H5O_mcdt_search_ret_t (*H5O_mcdt_search_cb_t)(void *op_data); + +/********************/ +/* Public Variables */ +/********************/ + + +#ifdef __cplusplus +extern "C" { +#endif + +/*********************/ +/* Public Prototypes */ +/*********************/ +H5_DLL hid_t H5Oopen(hid_t loc_id, const char *name, hid_t lapl_id); +H5_DLL hid_t H5Oopen_by_addr(hid_t loc_id, haddr_t addr); +H5_DLL hid_t H5Oopen_by_idx(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, hid_t lapl_id); +H5_DLL htri_t H5Oexists_by_name(hid_t loc_id, const char *name, hid_t lapl_id); +H5_DLL herr_t H5Oget_info(hid_t loc_id, H5O_info_t *oinfo); +H5_DLL herr_t H5Oget_info_by_name(hid_t loc_id, const char *name, H5O_info_t *oinfo, + hid_t lapl_id); +H5_DLL herr_t H5Oget_info_by_idx(hid_t loc_id, const char *group_name, + H5_index_t idx_type, H5_iter_order_t order, hsize_t n, H5O_info_t *oinfo, + hid_t lapl_id); +H5_DLL herr_t H5Olink(hid_t obj_id, hid_t new_loc_id, const char *new_name, + hid_t lcpl_id, hid_t lapl_id); +H5_DLL herr_t H5Oincr_refcount(hid_t object_id); +H5_DLL herr_t H5Odecr_refcount(hid_t object_id); +H5_DLL herr_t H5Ocopy(hid_t src_loc_id, const char *src_name, hid_t dst_loc_id, + const char *dst_name, hid_t ocpypl_id, hid_t lcpl_id); +H5_DLL herr_t H5Oset_comment(hid_t obj_id, const char *comment); +H5_DLL herr_t H5Oset_comment_by_name(hid_t loc_id, const char *name, + const char *comment, hid_t lapl_id); +H5_DLL ssize_t H5Oget_comment(hid_t obj_id, char *comment, size_t bufsize); +H5_DLL ssize_t H5Oget_comment_by_name(hid_t loc_id, const char *name, + char *comment, size_t bufsize, hid_t lapl_id); +H5_DLL herr_t H5Ovisit(hid_t obj_id, H5_index_t idx_type, H5_iter_order_t order, + H5O_iterate_t op, void *op_data); +H5_DLL herr_t H5Ovisit_by_name(hid_t loc_id, const char *obj_name, + H5_index_t idx_type, H5_iter_order_t order, H5O_iterate_t op, + void *op_data, hid_t lapl_id); +H5_DLL herr_t H5Oclose(hid_t object_id); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Macros */ + +/* Typedefs */ + +/* A struct that's part of the H5G_stat_t routine (deprecated) */ +typedef struct H5O_stat_t { + hsize_t size; /* Total size of object header in file */ + hsize_t free; /* Free space within object header */ + unsigned nmesgs; /* Number of object header messages */ + unsigned nchunks; /* Number of object header chunks */ +} H5O_stat_t; + +/* Function prototypes */ + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif +#endif /* _H5Opublic_H */ + diff --git a/privatemodules/nc4/include/H5PLextern.h b/privatemodules/nc4/include/H5PLextern.h new file mode 100644 index 0000000000000000000000000000000000000000..f94101d818a1cda5e73635651f6c5c98f5ccaff8 --- /dev/null +++ b/privatemodules/nc4/include/H5PLextern.h @@ -0,0 +1,87 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic document set and is * + * linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have access * + * to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Programmer: Raymond Lu <songyulu@hdfgroup.org> + * 13 February 2013 + */ +#ifndef _H5PLextern_H +#define _H5PLextern_H + +/* Include HDF5 header */ +#include "hdf5.h" + +#ifndef H5_VMS + +/*******************/ +/* Public Typedefs */ +/*******************/ + +/* Plugin type */ +typedef enum H5PL_type_t { + H5PL_TYPE_ERROR = -1, /*error */ + H5PL_TYPE_FILTER = 0, /*filter */ + H5PL_TYPE_NONE = 1 /*this must be last! */ +} H5PL_type_t; + + +#ifdef H5_BUILT_AS_DYNAMIC_LIB + + #if defined (hdf5_EXPORTS) + /* hdf5 library imports from plugin */ + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5PLUGIN_DLL __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5PLUGIN_DLL __attribute__ ((visibility("default"))) + #endif + #else + /* plugins always export */ + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5PLUGIN_DLL __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5PLUGIN_DLL __attribute__ ((visibility("default"))) + #endif + #endif + +#elif defined(H5_BUILT_AS_STATIC_LIB) + #define H5PLUGIN_DLL +#else + + #if defined(H5_HAVE_WIN32_API) + #if defined(_HDF5DLL_) + #pragma warning(disable: 4273) /* Disable the dll linkage warnings */ + #define H5PLUGIN_DLL __declspec(dllimport) + #elif defined(_HDF5USEDLL_) + #define H5PLUGIN_DLL __declspec(dllexport) + #endif /* _HDF5DLL_ */ + #else /*H5_HAVE_WIN32_API*/ + #define H5PLUGIN_DLL + #endif /*H5_HAVE_WIN32_API*/ + +#endif /* H5_BUILT_AS_xxx_LIB */ + +#ifdef __cplusplus +extern "C" { +#endif + +H5PLUGIN_DLL H5PL_type_t H5PLget_plugin_type(void); +H5PLUGIN_DLL const void *H5PLget_plugin_info(void); + +#ifdef __cplusplus +} +#endif +#endif /*H5_VMS*/ + +#endif /* _H5PLextern_H */ + diff --git a/privatemodules/nc4/include/H5PTpublic.h b/privatemodules/nc4/include/H5PTpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..f919010591917cb356bf08c99381368bc848d444 --- /dev/null +++ b/privatemodules/nc4/include/H5PTpublic.h @@ -0,0 +1,127 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef _H5PTpublic_H +#define _H5PTpublic_H + + +#ifdef __cplusplus +extern "C" { +#endif + +/*------------------------------------------------------------------------- + * + * Create/Open/Close functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL hid_t H5PTcreate_fl ( hid_t loc_id, + const char *dset_name, + hid_t dtype_id, + hsize_t chunk_size, + int compression ); + +#ifdef VLPT_REMOVED +H5_HLDLL hid_t H5PTcreate_vl ( hid_t loc_id, + const char *dset_name, + hsize_t chunk_size ); +#endif /* VLPT_REMOVED */ + +H5_HLDLL hid_t H5PTopen( hid_t loc_id, + const char *dset_name ); + +H5_HLDLL herr_t H5PTclose( hid_t table_id ); + + +/*------------------------------------------------------------------------- + * + * Write functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5PTappend( hid_t table_id, + size_t nrecords, + const void * data ); + +/*------------------------------------------------------------------------- + * + * Read functions + * + *------------------------------------------------------------------------- + */ + + +H5_HLDLL herr_t H5PTget_next( hid_t table_id, + size_t nrecords, + void * data ); + +H5_HLDLL herr_t H5PTread_packets( hid_t table_id, + hsize_t start, + size_t nrecords, + void *data ); + +/*------------------------------------------------------------------------- + * + * Inquiry functions + * + *------------------------------------------------------------------------- + */ + + +H5_HLDLL herr_t H5PTget_num_packets( hid_t table_id, + hsize_t *nrecords ); + +H5_HLDLL herr_t H5PTis_valid( hid_t table_id ); + +#ifdef VLPT_REMOVED +H5_HLDLL herr_t H5PTis_varlen( hid_t table_id ); +#endif /* VLPT_REMOVED */ + +/*------------------------------------------------------------------------- + * + * Packet Table "current index" functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5PTcreate_index( hid_t table_id ); + +H5_HLDLL herr_t H5PTset_index( hid_t table_id, + hsize_t pt_index ); + +H5_HLDLL herr_t H5PTget_index( hid_t table_id, + hsize_t *pt_index ); + +/*------------------------------------------------------------------------- + * + * Memory Management functions + * + *------------------------------------------------------------------------- + */ + +#ifdef VLPT_REMOVED +H5_HLDLL herr_t H5PTfree_vlen_readbuff( hid_t table_id, + size_t bufflen, + void * buff ); +#endif /* VLPT_REMOVED */ + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/privatemodules/nc4/include/H5Ppublic.h b/privatemodules/nc4/include/H5Ppublic.h new file mode 100644 index 0000000000000000000000000000000000000000..1d8ced44c023d4c8b5ee6ddc1aa5af9e91b03667 --- /dev/null +++ b/privatemodules/nc4/include/H5Ppublic.h @@ -0,0 +1,495 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains function prototypes for each exported function in the + * H5P module. + */ +#ifndef _H5Ppublic_H +#define _H5Ppublic_H + +/* System headers needed by this file */ + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5ACpublic.h" +#include "H5Dpublic.h" +#include "H5Fpublic.h" +#include "H5FDpublic.h" +#include "H5Ipublic.h" +#include "H5Lpublic.h" +#include "H5Opublic.h" +#include "H5MMpublic.h" +#include "H5Tpublic.h" +#include "H5Zpublic.h" + + +/*****************/ +/* 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 + */ + +#define H5P_ROOT (H5OPEN H5P_CLS_ROOT_g) +#define H5P_OBJECT_CREATE (H5OPEN H5P_CLS_OBJECT_CREATE_g) +#define H5P_FILE_CREATE (H5OPEN H5P_CLS_FILE_CREATE_g) +#define H5P_FILE_ACCESS (H5OPEN H5P_CLS_FILE_ACCESS_g) +#define H5P_DATASET_CREATE (H5OPEN H5P_CLS_DATASET_CREATE_g) +#define H5P_DATASET_ACCESS (H5OPEN H5P_CLS_DATASET_ACCESS_g) +#define H5P_DATASET_XFER (H5OPEN H5P_CLS_DATASET_XFER_g) +#define H5P_FILE_MOUNT (H5OPEN H5P_CLS_FILE_MOUNT_g) +#define H5P_GROUP_CREATE (H5OPEN H5P_CLS_GROUP_CREATE_g) +#define H5P_GROUP_ACCESS (H5OPEN H5P_CLS_GROUP_ACCESS_g) +#define H5P_DATATYPE_CREATE (H5OPEN H5P_CLS_DATATYPE_CREATE_g) +#define H5P_DATATYPE_ACCESS (H5OPEN H5P_CLS_DATATYPE_ACCESS_g) +#define H5P_STRING_CREATE (H5OPEN H5P_CLS_STRING_CREATE_g) +#define H5P_ATTRIBUTE_CREATE (H5OPEN H5P_CLS_ATTRIBUTE_CREATE_g) +#define H5P_OBJECT_COPY (H5OPEN H5P_CLS_OBJECT_COPY_g) +#define H5P_LINK_CREATE (H5OPEN H5P_CLS_LINK_CREATE_g) +#define H5P_LINK_ACCESS (H5OPEN H5P_CLS_LINK_ACCESS_g) + +/* + * The library's default property lists + */ +#define H5P_FILE_CREATE_DEFAULT (H5OPEN H5P_LST_FILE_CREATE_g) +#define H5P_FILE_ACCESS_DEFAULT (H5OPEN H5P_LST_FILE_ACCESS_g) +#define H5P_DATASET_CREATE_DEFAULT (H5OPEN H5P_LST_DATASET_CREATE_g) +#define H5P_DATASET_ACCESS_DEFAULT (H5OPEN H5P_LST_DATASET_ACCESS_g) +#define H5P_DATASET_XFER_DEFAULT (H5OPEN H5P_LST_DATASET_XFER_g) +#define H5P_FILE_MOUNT_DEFAULT (H5OPEN H5P_LST_FILE_MOUNT_g) +#define H5P_GROUP_CREATE_DEFAULT (H5OPEN H5P_LST_GROUP_CREATE_g) +#define H5P_GROUP_ACCESS_DEFAULT (H5OPEN H5P_LST_GROUP_ACCESS_g) +#define H5P_DATATYPE_CREATE_DEFAULT (H5OPEN H5P_LST_DATATYPE_CREATE_g) +#define H5P_DATATYPE_ACCESS_DEFAULT (H5OPEN H5P_LST_DATATYPE_ACCESS_g) +#define H5P_ATTRIBUTE_CREATE_DEFAULT (H5OPEN H5P_LST_ATTRIBUTE_CREATE_g) +#define H5P_OBJECT_COPY_DEFAULT (H5OPEN H5P_LST_OBJECT_COPY_g) +#define H5P_LINK_CREATE_DEFAULT (H5OPEN H5P_LST_LINK_CREATE_g) +#define H5P_LINK_ACCESS_DEFAULT (H5OPEN H5P_LST_LINK_ACCESS_g) + +/* Common creation order flags (for links in groups and attributes on objects) */ +#define H5P_CRT_ORDER_TRACKED 0x0001 +#define H5P_CRT_ORDER_INDEXED 0x0002 + +#ifdef __cplusplus +extern "C" { +#endif + +/*******************/ +/* Public Typedefs */ +/*******************/ + + +/* Define property list class callback function pointer types */ +typedef herr_t (*H5P_cls_create_func_t)(hid_t prop_id, void *create_data); +typedef herr_t (*H5P_cls_copy_func_t)(hid_t new_prop_id, hid_t old_prop_id, + void *copy_data); +typedef herr_t (*H5P_cls_close_func_t)(hid_t prop_id, void *close_data); + +/* Define property list callback function pointer types */ +typedef herr_t (*H5P_prp_cb1_t)(const char *name, size_t size, void *value); +typedef herr_t (*H5P_prp_cb2_t)(hid_t prop_id, const char *name, size_t size, void *value); +typedef H5P_prp_cb1_t H5P_prp_create_func_t; +typedef H5P_prp_cb2_t H5P_prp_set_func_t; +typedef H5P_prp_cb2_t H5P_prp_get_func_t; +typedef H5P_prp_cb2_t H5P_prp_delete_func_t; +typedef H5P_prp_cb1_t H5P_prp_copy_func_t; +typedef int (*H5P_prp_compare_func_t)(const void *value1, const void *value2, size_t size); +typedef H5P_prp_cb1_t H5P_prp_close_func_t; + +/* Define property list iteration function type */ +typedef herr_t (*H5P_iterate_t)(hid_t id, const char *name, void *iter_data); + +/* Actual IO mode property */ +typedef enum H5D_mpio_actual_chunk_opt_mode_t { + /* The default value, H5D_MPIO_NO_CHUNK_OPTIMIZATION, is used for all I/O + * operations that do not use chunk optimizations, including non-collective + * I/O and contiguous collective I/O. + */ + H5D_MPIO_NO_CHUNK_OPTIMIZATION = 0, + H5D_MPIO_LINK_CHUNK, + H5D_MPIO_MULTI_CHUNK +} H5D_mpio_actual_chunk_opt_mode_t; + +typedef enum H5D_mpio_actual_io_mode_t { + /* The following four values are conveniently defined as a bit field so that + * we can switch from the default to indpendent or collective and then to + * mixed without having to check the original value. + * + * NO_COLLECTIVE means that either collective I/O wasn't requested or that + * no I/O took place. + * + * CHUNK_INDEPENDENT means that collective I/O was requested, but the + * chunk optimization scheme chose independent I/O for each chunk. + */ + H5D_MPIO_NO_COLLECTIVE = 0x0, + H5D_MPIO_CHUNK_INDEPENDENT = 0x1, + H5D_MPIO_CHUNK_COLLECTIVE = 0x2, + H5D_MPIO_CHUNK_MIXED = 0x1 | 0x2, + + /* The contiguous case is separate from the bit field. */ + H5D_MPIO_CONTIGUOUS_COLLECTIVE = 0x4 +} H5D_mpio_actual_io_mode_t; + +/* Broken collective IO property */ +typedef enum H5D_mpio_no_collective_cause_t { + H5D_MPIO_COLLECTIVE = 0x00, + H5D_MPIO_SET_INDEPENDENT = 0x01, + H5D_MPIO_DATATYPE_CONVERSION = 0x02, + H5D_MPIO_DATA_TRANSFORMS = 0x04, + H5D_MPIO_MPI_OPT_TYPES_ENV_VAR_DISABLED = 0x08, + H5D_MPIO_NOT_SIMPLE_OR_SCALAR_DATASPACES = 0x10, + H5D_MPIO_NOT_CONTIGUOUS_OR_CHUNKED_DATASET = 0x20, + H5D_MPIO_FILTERS = 0x40 +} H5D_mpio_no_collective_cause_t; + +/********************/ +/* Public Variables */ +/********************/ + +/* Property list class IDs */ +/* (Internal to library, do not use! Use macros above) */ +H5_DLLVAR hid_t H5P_CLS_ROOT_g; +H5_DLLVAR hid_t H5P_CLS_OBJECT_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_FILE_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_FILE_ACCESS_g; +H5_DLLVAR hid_t H5P_CLS_DATASET_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_DATASET_ACCESS_g; +H5_DLLVAR hid_t H5P_CLS_DATASET_XFER_g; +H5_DLLVAR hid_t H5P_CLS_FILE_MOUNT_g; +H5_DLLVAR hid_t H5P_CLS_GROUP_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_GROUP_ACCESS_g; +H5_DLLVAR hid_t H5P_CLS_DATATYPE_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_DATATYPE_ACCESS_g; +H5_DLLVAR hid_t H5P_CLS_STRING_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_ATTRIBUTE_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_OBJECT_COPY_g; +H5_DLLVAR hid_t H5P_CLS_LINK_CREATE_g; +H5_DLLVAR hid_t H5P_CLS_LINK_ACCESS_g; + +/* Default roperty list IDs */ +/* (Internal to library, do not use! Use macros above) */ +H5_DLLVAR hid_t H5P_LST_FILE_CREATE_g; +H5_DLLVAR hid_t H5P_LST_FILE_ACCESS_g; +H5_DLLVAR hid_t H5P_LST_DATASET_CREATE_g; +H5_DLLVAR hid_t H5P_LST_DATASET_ACCESS_g; +H5_DLLVAR hid_t H5P_LST_DATASET_XFER_g; +H5_DLLVAR hid_t H5P_LST_FILE_MOUNT_g; +H5_DLLVAR hid_t H5P_LST_GROUP_CREATE_g; +H5_DLLVAR hid_t H5P_LST_GROUP_ACCESS_g; +H5_DLLVAR hid_t H5P_LST_DATATYPE_CREATE_g; +H5_DLLVAR hid_t H5P_LST_DATATYPE_ACCESS_g; +H5_DLLVAR hid_t H5P_LST_ATTRIBUTE_CREATE_g; +H5_DLLVAR hid_t H5P_LST_OBJECT_COPY_g; +H5_DLLVAR hid_t H5P_LST_LINK_CREATE_g; +H5_DLLVAR hid_t H5P_LST_LINK_ACCESS_g; + +/*********************/ +/* Public Prototypes */ +/*********************/ + +/* Generic property list routines */ +H5_DLL hid_t H5Pcreate_class(hid_t parent, const char *name, + H5P_cls_create_func_t cls_create, void *create_data, + H5P_cls_copy_func_t cls_copy, void *copy_data, + H5P_cls_close_func_t cls_close, void *close_data); +H5_DLL char *H5Pget_class_name(hid_t pclass_id); +H5_DLL hid_t H5Pcreate(hid_t cls_id); +H5_DLL herr_t H5Pregister2(hid_t cls_id, const char *name, size_t size, + void *def_value, H5P_prp_create_func_t prp_create, + H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get, + H5P_prp_delete_func_t prp_del, H5P_prp_copy_func_t prp_copy, + H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close); +H5_DLL herr_t H5Pinsert2(hid_t plist_id, const char *name, size_t size, + void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get, + H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy, + H5P_prp_compare_func_t prp_cmp, H5P_prp_close_func_t prp_close); +H5_DLL herr_t H5Pset(hid_t plist_id, const char *name, void *value); +H5_DLL htri_t H5Pexist(hid_t plist_id, const char *name); +H5_DLL herr_t H5Pget_size(hid_t id, const char *name, size_t *size); +H5_DLL herr_t H5Pget_nprops(hid_t id, size_t *nprops); +H5_DLL hid_t H5Pget_class(hid_t plist_id); +H5_DLL hid_t H5Pget_class_parent(hid_t pclass_id); +H5_DLL herr_t H5Pget(hid_t plist_id, const char *name, void * value); +H5_DLL htri_t H5Pequal(hid_t id1, hid_t id2); +H5_DLL htri_t H5Pisa_class(hid_t plist_id, hid_t pclass_id); +H5_DLL int H5Piterate(hid_t id, int *idx, H5P_iterate_t iter_func, + void *iter_data); +H5_DLL herr_t H5Pcopy_prop(hid_t dst_id, hid_t src_id, const char *name); +H5_DLL herr_t H5Premove(hid_t plist_id, const char *name); +H5_DLL herr_t H5Punregister(hid_t pclass_id, const char *name); +H5_DLL herr_t H5Pclose_class(hid_t plist_id); +H5_DLL herr_t H5Pclose(hid_t plist_id); +H5_DLL hid_t H5Pcopy(hid_t plist_id); + +/* Object creation property list (OCPL) routines */ +H5_DLL herr_t H5Pset_attr_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense); +H5_DLL herr_t H5Pget_attr_phase_change(hid_t plist_id, unsigned *max_compact, unsigned *min_dense); +H5_DLL herr_t H5Pset_attr_creation_order(hid_t plist_id, unsigned crt_order_flags); +H5_DLL herr_t H5Pget_attr_creation_order(hid_t plist_id, unsigned *crt_order_flags); +H5_DLL herr_t H5Pset_obj_track_times(hid_t plist_id, hbool_t track_times); +H5_DLL herr_t H5Pget_obj_track_times(hid_t plist_id, hbool_t *track_times); +H5_DLL herr_t H5Pmodify_filter(hid_t plist_id, H5Z_filter_t filter, + unsigned int flags, size_t cd_nelmts, + const unsigned int cd_values[/*cd_nelmts*/]); +H5_DLL herr_t H5Pset_filter(hid_t plist_id, H5Z_filter_t filter, + unsigned int flags, size_t cd_nelmts, + const unsigned int c_values[]); +H5_DLL int H5Pget_nfilters(hid_t plist_id); +H5_DLL H5Z_filter_t H5Pget_filter2(hid_t plist_id, unsigned filter, + unsigned int *flags/*out*/, + size_t *cd_nelmts/*out*/, + unsigned cd_values[]/*out*/, + size_t namelen, char name[], + unsigned *filter_config /*out*/); +H5_DLL herr_t H5Pget_filter_by_id2(hid_t plist_id, H5Z_filter_t id, + unsigned int *flags/*out*/, size_t *cd_nelmts/*out*/, + unsigned cd_values[]/*out*/, size_t namelen, char name[]/*out*/, + unsigned *filter_config/*out*/); +H5_DLL htri_t H5Pall_filters_avail(hid_t plist_id); +H5_DLL herr_t H5Premove_filter(hid_t plist_id, H5Z_filter_t filter); +H5_DLL herr_t H5Pset_deflate(hid_t plist_id, unsigned aggression); +H5_DLL herr_t H5Pset_fletcher32(hid_t plist_id); + +/* File creation property list (FCPL) routines */ +H5_DLL herr_t H5Pget_version(hid_t plist_id, unsigned *boot/*out*/, + unsigned *freelist/*out*/, unsigned *stab/*out*/, + unsigned *shhdr/*out*/); +H5_DLL herr_t H5Pset_userblock(hid_t plist_id, hsize_t size); +H5_DLL herr_t H5Pget_userblock(hid_t plist_id, hsize_t *size); +H5_DLL herr_t H5Pset_sizes(hid_t plist_id, size_t sizeof_addr, + size_t sizeof_size); +H5_DLL herr_t H5Pget_sizes(hid_t plist_id, size_t *sizeof_addr/*out*/, + size_t *sizeof_size/*out*/); +H5_DLL herr_t H5Pset_sym_k(hid_t plist_id, unsigned ik, unsigned lk); +H5_DLL herr_t H5Pget_sym_k(hid_t plist_id, unsigned *ik/*out*/, unsigned *lk/*out*/); +H5_DLL herr_t H5Pset_istore_k(hid_t plist_id, unsigned ik); +H5_DLL herr_t H5Pget_istore_k(hid_t plist_id, unsigned *ik/*out*/); +H5_DLL herr_t H5Pset_shared_mesg_nindexes(hid_t plist_id, unsigned nindexes); +H5_DLL herr_t H5Pget_shared_mesg_nindexes(hid_t plist_id, unsigned *nindexes); +H5_DLL herr_t H5Pset_shared_mesg_index(hid_t plist_id, unsigned index_num, unsigned mesg_type_flags, unsigned min_mesg_size); +H5_DLL herr_t H5Pget_shared_mesg_index(hid_t plist_id, unsigned index_num, unsigned *mesg_type_flags, unsigned *min_mesg_size); +H5_DLL herr_t H5Pset_shared_mesg_phase_change(hid_t plist_id, unsigned max_list, unsigned min_btree); +H5_DLL herr_t H5Pget_shared_mesg_phase_change(hid_t plist_id, unsigned *max_list, unsigned *min_btree); + +/* File access property list (FAPL) routines */ +H5_DLL herr_t H5Pset_alignment(hid_t fapl_id, hsize_t threshold, + hsize_t alignment); +H5_DLL herr_t H5Pget_alignment(hid_t fapl_id, hsize_t *threshold/*out*/, + hsize_t *alignment/*out*/); +H5_DLL herr_t H5Pset_driver(hid_t plist_id, hid_t driver_id, + const void *driver_info); +H5_DLL hid_t H5Pget_driver(hid_t plist_id); +H5_DLL void *H5Pget_driver_info(hid_t plist_id); +H5_DLL herr_t H5Pset_family_offset(hid_t fapl_id, hsize_t offset); +H5_DLL herr_t H5Pget_family_offset(hid_t fapl_id, hsize_t *offset); +H5_DLL herr_t H5Pset_multi_type(hid_t fapl_id, H5FD_mem_t type); +H5_DLL herr_t H5Pget_multi_type(hid_t fapl_id, H5FD_mem_t *type); +H5_DLL herr_t H5Pset_cache(hid_t plist_id, int mdc_nelmts, + size_t rdcc_nslots, size_t rdcc_nbytes, + double rdcc_w0); +H5_DLL herr_t H5Pget_cache(hid_t plist_id, + int *mdc_nelmts, /* out */ + size_t *rdcc_nslots/*out*/, + size_t *rdcc_nbytes/*out*/, double *rdcc_w0); +H5_DLL herr_t H5Pset_mdc_config(hid_t plist_id, + H5AC_cache_config_t * config_ptr); +H5_DLL herr_t H5Pget_mdc_config(hid_t plist_id, + H5AC_cache_config_t * config_ptr); /* out */ +H5_DLL herr_t H5Pset_gc_references(hid_t fapl_id, unsigned gc_ref); +H5_DLL herr_t H5Pget_gc_references(hid_t fapl_id, unsigned *gc_ref/*out*/); +H5_DLL herr_t H5Pset_fclose_degree(hid_t fapl_id, H5F_close_degree_t degree); +H5_DLL herr_t H5Pget_fclose_degree(hid_t fapl_id, H5F_close_degree_t *degree); +H5_DLL herr_t H5Pset_meta_block_size(hid_t fapl_id, hsize_t size); +H5_DLL herr_t H5Pget_meta_block_size(hid_t fapl_id, hsize_t *size/*out*/); +H5_DLL herr_t H5Pset_sieve_buf_size(hid_t fapl_id, size_t size); +H5_DLL herr_t H5Pget_sieve_buf_size(hid_t fapl_id, size_t *size/*out*/); +H5_DLL herr_t H5Pset_small_data_block_size(hid_t fapl_id, hsize_t size); +H5_DLL herr_t H5Pget_small_data_block_size(hid_t fapl_id, hsize_t *size/*out*/); +H5_DLL herr_t H5Pset_libver_bounds(hid_t plist_id, H5F_libver_t low, + H5F_libver_t high); +H5_DLL herr_t H5Pget_libver_bounds(hid_t plist_id, H5F_libver_t *low, + H5F_libver_t *high); +H5_DLL herr_t H5Pset_elink_file_cache_size(hid_t plist_id, unsigned efc_size); +H5_DLL herr_t H5Pget_elink_file_cache_size(hid_t plist_id, unsigned *efc_size); +H5_DLL herr_t H5Pset_file_image(hid_t fapl_id, void *buf_ptr, size_t buf_len); +H5_DLL herr_t H5Pget_file_image(hid_t fapl_id, void **buf_ptr_ptr, size_t *buf_len_ptr); +H5_DLL herr_t H5Pset_file_image_callbacks(hid_t fapl_id, + H5FD_file_image_callbacks_t *callbacks_ptr); +H5_DLL herr_t H5Pget_file_image_callbacks(hid_t fapl_id, + H5FD_file_image_callbacks_t *callbacks_ptr); + +H5_DLL herr_t H5Pset_core_write_tracking(hid_t fapl_id, hbool_t is_enabled, size_t page_size); +H5_DLL herr_t H5Pget_core_write_tracking(hid_t fapl_id, hbool_t *is_enabled, size_t *page_size); + +/* Dataset creation property list (DCPL) routines */ +H5_DLL herr_t H5Pset_layout(hid_t plist_id, H5D_layout_t layout); +H5_DLL H5D_layout_t H5Pget_layout(hid_t plist_id); +H5_DLL herr_t H5Pset_chunk(hid_t plist_id, int ndims, const hsize_t dim[/*ndims*/]); +H5_DLL int H5Pget_chunk(hid_t plist_id, int max_ndims, hsize_t dim[]/*out*/); +H5_DLL herr_t H5Pset_external(hid_t plist_id, const char *name, off_t offset, + hsize_t size); +H5_DLL int H5Pget_external_count(hid_t plist_id); +H5_DLL herr_t H5Pget_external(hid_t plist_id, unsigned idx, size_t name_size, + char *name/*out*/, off_t *offset/*out*/, + hsize_t *size/*out*/); +H5_DLL herr_t H5Pset_szip(hid_t plist_id, unsigned options_mask, unsigned pixels_per_block); +H5_DLL herr_t H5Pset_shuffle(hid_t plist_id); +H5_DLL herr_t H5Pset_nbit(hid_t plist_id); +H5_DLL herr_t H5Pset_scaleoffset(hid_t plist_id, H5Z_SO_scale_type_t scale_type, int scale_factor); +H5_DLL herr_t H5Pset_fill_value(hid_t plist_id, hid_t type_id, + const void *value); +H5_DLL herr_t H5Pget_fill_value(hid_t plist_id, hid_t type_id, + void *value/*out*/); +H5_DLL herr_t H5Pfill_value_defined(hid_t plist, H5D_fill_value_t *status); +H5_DLL herr_t H5Pset_alloc_time(hid_t plist_id, H5D_alloc_time_t + alloc_time); +H5_DLL herr_t H5Pget_alloc_time(hid_t plist_id, H5D_alloc_time_t + *alloc_time/*out*/); +H5_DLL herr_t H5Pset_fill_time(hid_t plist_id, H5D_fill_time_t fill_time); +H5_DLL herr_t H5Pget_fill_time(hid_t plist_id, H5D_fill_time_t + *fill_time/*out*/); + +/* Dataset access property list (DAPL) routines */ +H5_DLL herr_t H5Pset_chunk_cache(hid_t dapl_id, size_t rdcc_nslots, + size_t rdcc_nbytes, double rdcc_w0); +H5_DLL herr_t H5Pget_chunk_cache(hid_t dapl_id, + size_t *rdcc_nslots/*out*/, + size_t *rdcc_nbytes/*out*/, + double *rdcc_w0/*out*/); + +/* Dataset xfer property list (DXPL) routines */ +H5_DLL herr_t H5Pset_data_transform(hid_t plist_id, const char* expression); +H5_DLL ssize_t H5Pget_data_transform(hid_t plist_id, char* expression /*out*/, size_t size); +H5_DLL herr_t H5Pset_buffer(hid_t plist_id, size_t size, void *tconv, + void *bkg); +H5_DLL size_t H5Pget_buffer(hid_t plist_id, void **tconv/*out*/, + void **bkg/*out*/); +H5_DLL herr_t H5Pset_preserve(hid_t plist_id, hbool_t status); +H5_DLL int H5Pget_preserve(hid_t plist_id); +H5_DLL herr_t H5Pset_edc_check(hid_t plist_id, H5Z_EDC_t check); +H5_DLL H5Z_EDC_t H5Pget_edc_check(hid_t plist_id); +H5_DLL herr_t H5Pset_filter_callback(hid_t plist_id, H5Z_filter_func_t func, + void* op_data); +H5_DLL herr_t H5Pset_btree_ratios(hid_t plist_id, double left, double middle, + double right); +H5_DLL herr_t H5Pget_btree_ratios(hid_t plist_id, double *left/*out*/, + double *middle/*out*/, + double *right/*out*/); +H5_DLL herr_t H5Pset_vlen_mem_manager(hid_t plist_id, + H5MM_allocate_t alloc_func, + void *alloc_info, H5MM_free_t free_func, + void *free_info); +H5_DLL herr_t H5Pget_vlen_mem_manager(hid_t plist_id, + H5MM_allocate_t *alloc_func, + void **alloc_info, + H5MM_free_t *free_func, + void **free_info); +H5_DLL herr_t H5Pset_hyper_vector_size(hid_t fapl_id, size_t size); +H5_DLL herr_t H5Pget_hyper_vector_size(hid_t fapl_id, size_t *size/*out*/); +H5_DLL herr_t H5Pset_type_conv_cb(hid_t dxpl_id, H5T_conv_except_func_t op, void* operate_data); +H5_DLL herr_t H5Pget_type_conv_cb(hid_t dxpl_id, H5T_conv_except_func_t *op, void** operate_data); +#ifdef H5_HAVE_PARALLEL +H5_DLL herr_t H5Pget_mpio_actual_chunk_opt_mode(hid_t plist_id, H5D_mpio_actual_chunk_opt_mode_t *actual_chunk_opt_mode); +H5_DLL herr_t H5Pget_mpio_actual_io_mode(hid_t plist_id, H5D_mpio_actual_io_mode_t *actual_io_mode); +H5_DLL herr_t H5Pget_mpio_no_collective_cause(hid_t plist_id, uint32_t *local_no_collective_cause, uint32_t *global_no_collective_cause); +#endif /* H5_HAVE_PARALLEL */ + +/* Link creation property list (LCPL) routines */ +H5_DLL herr_t H5Pset_create_intermediate_group(hid_t plist_id, unsigned crt_intmd); +H5_DLL herr_t H5Pget_create_intermediate_group(hid_t plist_id, unsigned *crt_intmd /*out*/); + +/* Group creation property list (GCPL) routines */ +H5_DLL herr_t H5Pset_local_heap_size_hint(hid_t plist_id, size_t size_hint); +H5_DLL herr_t H5Pget_local_heap_size_hint(hid_t plist_id, size_t *size_hint /*out*/); +H5_DLL herr_t H5Pset_link_phase_change(hid_t plist_id, unsigned max_compact, unsigned min_dense); +H5_DLL herr_t H5Pget_link_phase_change(hid_t plist_id, unsigned *max_compact /*out*/, unsigned *min_dense /*out*/); +H5_DLL herr_t H5Pset_est_link_info(hid_t plist_id, unsigned est_num_entries, unsigned est_name_len); +H5_DLL herr_t H5Pget_est_link_info(hid_t plist_id, unsigned *est_num_entries /* out */, unsigned *est_name_len /* out */); +H5_DLL herr_t H5Pset_link_creation_order(hid_t plist_id, unsigned crt_order_flags); +H5_DLL herr_t H5Pget_link_creation_order(hid_t plist_id, unsigned *crt_order_flags /* out */); + +/* String creation property list (STRCPL) routines */ +H5_DLL herr_t H5Pset_char_encoding(hid_t plist_id, H5T_cset_t encoding); +H5_DLL herr_t H5Pget_char_encoding(hid_t plist_id, H5T_cset_t *encoding /*out*/); + +/* Link access property list (LAPL) routines */ +H5_DLL herr_t H5Pset_nlinks(hid_t plist_id, size_t nlinks); +H5_DLL herr_t H5Pget_nlinks(hid_t plist_id, size_t *nlinks); +H5_DLL herr_t H5Pset_elink_prefix(hid_t plist_id, const char *prefix); +H5_DLL ssize_t H5Pget_elink_prefix(hid_t plist_id, char *prefix, size_t size); +H5_DLL hid_t H5Pget_elink_fapl(hid_t lapl_id); +H5_DLL herr_t H5Pset_elink_fapl(hid_t lapl_id, hid_t fapl_id); +H5_DLL herr_t H5Pset_elink_acc_flags(hid_t lapl_id, unsigned flags); +H5_DLL herr_t H5Pget_elink_acc_flags(hid_t lapl_id, unsigned *flags); +H5_DLL herr_t H5Pset_elink_cb(hid_t lapl_id, H5L_elink_traverse_t func, void *op_data); +H5_DLL herr_t H5Pget_elink_cb(hid_t lapl_id, H5L_elink_traverse_t *func, void **op_data); + +/* Object copy property list (OCPYPL) routines */ +H5_DLL herr_t H5Pset_copy_object(hid_t plist_id, unsigned crt_intmd); +H5_DLL herr_t H5Pget_copy_object(hid_t plist_id, unsigned *crt_intmd /*out*/); +H5_DLL herr_t H5Padd_merge_committed_dtype_path(hid_t plist_id, const char *path); +H5_DLL herr_t H5Pfree_merge_committed_dtype_paths(hid_t plist_id); +H5_DLL herr_t H5Pset_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t func, void *op_data); +H5_DLL herr_t H5Pget_mcdt_search_cb(hid_t plist_id, H5O_mcdt_search_cb_t *func, void **op_data); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Macros */ + +/* We renamed the "root" of the property list class hierarchy */ +#define H5P_NO_CLASS H5P_ROOT + + +/* Typedefs */ + + +/* Function prototypes */ +H5_DLL herr_t H5Pregister1(hid_t cls_id, const char *name, size_t size, + void *def_value, H5P_prp_create_func_t prp_create, + H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get, + H5P_prp_delete_func_t prp_del, H5P_prp_copy_func_t prp_copy, + H5P_prp_close_func_t prp_close); +H5_DLL herr_t H5Pinsert1(hid_t plist_id, const char *name, size_t size, + void *value, H5P_prp_set_func_t prp_set, H5P_prp_get_func_t prp_get, + H5P_prp_delete_func_t prp_delete, H5P_prp_copy_func_t prp_copy, + H5P_prp_close_func_t prp_close); +H5_DLL H5Z_filter_t H5Pget_filter1(hid_t plist_id, unsigned filter, + unsigned int *flags/*out*/, size_t *cd_nelmts/*out*/, + unsigned cd_values[]/*out*/, size_t namelen, char name[]); +H5_DLL herr_t H5Pget_filter_by_id1(hid_t plist_id, H5Z_filter_t id, + unsigned int *flags/*out*/, size_t *cd_nelmts/*out*/, + unsigned cd_values[]/*out*/, size_t namelen, char name[]/*out*/); + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif +#endif /* _H5Ppublic_H */ + diff --git a/privatemodules/nc4/include/H5Rpublic.h b/privatemodules/nc4/include/H5Rpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..04d319bebbbe7a5d5cc644d081c95d867063a886 --- /dev/null +++ b/privatemodules/nc4/include/H5Rpublic.h @@ -0,0 +1,92 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5S module. + */ +#ifndef _H5Rpublic_H +#define _H5Rpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Gpublic.h" +#include "H5Ipublic.h" + +/* + * Reference types allowed. + */ +typedef enum { + H5R_BADTYPE = (-1), /*invalid Reference Type */ + H5R_OBJECT, /*Object reference */ + H5R_DATASET_REGION, /*Dataset Region Reference */ + H5R_MAXTYPE /*highest type (Invalid as true type) */ +} H5R_type_t; + +/* Note! Be careful with the sizes of the references because they should really + * depend on the run-time values in the file. Unfortunately, the arrays need + * to be defined at compile-time, so we have to go with the worst case sizes for + * them. -QAK + */ +#define H5R_OBJ_REF_BUF_SIZE sizeof(haddr_t) +/* Object reference structure for user's code */ +typedef haddr_t hobj_ref_t; /* Needs to be large enough to store largest haddr_t in a worst case machine (ie. 8 bytes currently) */ + +#define H5R_DSET_REG_REF_BUF_SIZE (sizeof(haddr_t)+4) +/* 4 is used instead of sizeof(int) to permit portability between + the Crays and other machines (the heap ID is always encoded as an int32 anyway) +*/ +/* Dataset Region reference structure for user's code */ +typedef unsigned char hdset_reg_ref_t[H5R_DSET_REG_REF_BUF_SIZE];/* Buffer to store heap ID and index */ +/* Needs to be large enough to store largest haddr_t in a worst case machine (ie. 8 bytes currently) plus an int */ + +/* Publicly visible data structures */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* Functions in H5R.c */ +H5_DLL herr_t H5Rcreate(void *ref, hid_t loc_id, const char *name, + H5R_type_t ref_type, hid_t space_id); +H5_DLL hid_t H5Rdereference(hid_t dataset, H5R_type_t ref_type, const void *ref); +H5_DLL hid_t H5Rget_region(hid_t dataset, H5R_type_t ref_type, const void *ref); +H5_DLL herr_t H5Rget_obj_type2(hid_t id, H5R_type_t ref_type, const void *_ref, + H5O_type_t *obj_type); +H5_DLL ssize_t H5Rget_name(hid_t loc_id, H5R_type_t ref_type, const void *ref, + char *name/*out*/, size_t size); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Macros */ + + +/* Typedefs */ + + +/* Function prototypes */ +H5_DLL H5G_obj_t H5Rget_obj_type1(hid_t id, H5R_type_t ref_type, const void *_ref); + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif + +#endif /* _H5Rpublic_H */ + diff --git a/privatemodules/nc4/include/H5Spublic.h b/privatemodules/nc4/include/H5Spublic.h new file mode 100644 index 0000000000000000000000000000000000000000..c62a7b7648332f90700ffd56ab81a0187a441817 --- /dev/null +++ b/privatemodules/nc4/include/H5Spublic.h @@ -0,0 +1,152 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5S module. + */ +#ifndef _H5Spublic_H +#define _H5Spublic_H + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Ipublic.h" + +/* Define atomic datatypes */ +#define H5S_ALL 0 +#define H5S_UNLIMITED ((hsize_t)(hssize_t)(-1)) + +/* Define user-level maximum number of dimensions */ +#define H5S_MAX_RANK 32 + +/* Different types of dataspaces */ +typedef enum H5S_class_t { + H5S_NO_CLASS = -1, /*error */ + H5S_SCALAR = 0, /*scalar variable */ + H5S_SIMPLE = 1, /*simple data space */ + H5S_NULL = 2 /*null data space */ +} H5S_class_t; + +/* Different ways of combining selections */ +typedef enum H5S_seloper_t { + H5S_SELECT_NOOP = -1, /* error */ + H5S_SELECT_SET = 0, /* Select "set" operation */ + H5S_SELECT_OR, /* Binary "or" operation for hyperslabs + * (add new selection to existing selection) + * Original region: AAAAAAAAAA + * New region: BBBBBBBBBB + * A or B: CCCCCCCCCCCCCCCC + */ + H5S_SELECT_AND, /* Binary "and" operation for hyperslabs + * (only leave overlapped regions in selection) + * Original region: AAAAAAAAAA + * New region: BBBBBBBBBB + * A and B: CCCC + */ + H5S_SELECT_XOR, /* Binary "xor" operation for hyperslabs + * (only leave non-overlapped regions in selection) + * Original region: AAAAAAAAAA + * New region: BBBBBBBBBB + * A xor B: CCCCCC CCCCCC + */ + H5S_SELECT_NOTB, /* Binary "not" operation for hyperslabs + * (only leave non-overlapped regions in original selection) + * Original region: AAAAAAAAAA + * New region: BBBBBBBBBB + * A not B: CCCCCC + */ + H5S_SELECT_NOTA, /* Binary "not" operation for hyperslabs + * (only leave non-overlapped regions in new selection) + * Original region: AAAAAAAAAA + * New region: BBBBBBBBBB + * B not A: CCCCCC + */ + H5S_SELECT_APPEND, /* Append elements to end of point selection */ + H5S_SELECT_PREPEND, /* Prepend elements to beginning of point selection */ + H5S_SELECT_INVALID /* Invalid upper bound on selection operations */ +} H5S_seloper_t; + +/* Enumerated type for the type of selection */ +typedef enum { + H5S_SEL_ERROR = -1, /* Error */ + H5S_SEL_NONE = 0, /* Nothing selected */ + H5S_SEL_POINTS = 1, /* Sequence of points selected */ + H5S_SEL_HYPERSLABS = 2, /* "New-style" hyperslab selection defined */ + H5S_SEL_ALL = 3, /* Entire extent selected */ + H5S_SEL_N /*THIS MUST BE LAST */ +}H5S_sel_type; + +#ifdef __cplusplus +extern "C" { +#endif + +/* Functions in H5S.c */ +H5_DLL hid_t H5Screate(H5S_class_t type); +H5_DLL hid_t H5Screate_simple(int rank, const hsize_t dims[], + const hsize_t maxdims[]); +H5_DLL herr_t H5Sset_extent_simple(hid_t space_id, int rank, + const hsize_t dims[], + const hsize_t max[]); +H5_DLL hid_t H5Scopy(hid_t space_id); +H5_DLL herr_t H5Sclose(hid_t space_id); +H5_DLL herr_t H5Sencode(hid_t obj_id, void *buf, size_t *nalloc); +H5_DLL hid_t H5Sdecode(const void *buf); +H5_DLL hssize_t H5Sget_simple_extent_npoints(hid_t space_id); +H5_DLL int H5Sget_simple_extent_ndims(hid_t space_id); +H5_DLL int H5Sget_simple_extent_dims(hid_t space_id, hsize_t dims[], + hsize_t maxdims[]); +H5_DLL htri_t H5Sis_simple(hid_t space_id); +H5_DLL hssize_t H5Sget_select_npoints(hid_t spaceid); +H5_DLL herr_t H5Sselect_hyperslab(hid_t space_id, H5S_seloper_t op, + const hsize_t start[], + const hsize_t _stride[], + const hsize_t count[], + const hsize_t _block[]); +/* #define NEW_HYPERSLAB_API */ +#ifdef NEW_HYPERSLAB_API +H5_DLL hid_t H5Scombine_hyperslab(hid_t space_id, H5S_seloper_t op, + const hsize_t start[], + const hsize_t _stride[], + const hsize_t count[], + const hsize_t _block[]); +H5_DLL herr_t H5Sselect_select(hid_t space1_id, H5S_seloper_t op, + hid_t space2_id); +H5_DLL hid_t H5Scombine_select(hid_t space1_id, H5S_seloper_t op, + hid_t space2_id); +#endif /* NEW_HYPERSLAB_API */ +H5_DLL herr_t H5Sselect_elements(hid_t space_id, H5S_seloper_t op, + size_t num_elem, const hsize_t *coord); +H5_DLL H5S_class_t H5Sget_simple_extent_type(hid_t space_id); +H5_DLL herr_t H5Sset_extent_none(hid_t space_id); +H5_DLL herr_t H5Sextent_copy(hid_t dst_id,hid_t src_id); +H5_DLL htri_t H5Sextent_equal(hid_t sid1, hid_t sid2); +H5_DLL herr_t H5Sselect_all(hid_t spaceid); +H5_DLL herr_t H5Sselect_none(hid_t spaceid); +H5_DLL herr_t H5Soffset_simple(hid_t space_id, const hssize_t *offset); +H5_DLL htri_t H5Sselect_valid(hid_t spaceid); +H5_DLL hssize_t H5Sget_select_hyper_nblocks(hid_t spaceid); +H5_DLL hssize_t H5Sget_select_elem_npoints(hid_t spaceid); +H5_DLL herr_t H5Sget_select_hyper_blocklist(hid_t spaceid, hsize_t startblock, + hsize_t numblocks, hsize_t buf[/*numblocks*/]); +H5_DLL herr_t H5Sget_select_elem_pointlist(hid_t spaceid, hsize_t startpoint, + hsize_t numpoints, hsize_t buf[/*numpoints*/]); +H5_DLL herr_t H5Sget_select_bounds(hid_t spaceid, hsize_t start[], + hsize_t end[]); +H5_DLL H5S_sel_type H5Sget_select_type(hid_t spaceid); + +#ifdef __cplusplus +} +#endif +#endif /* _H5Spublic_H */ + diff --git a/privatemodules/nc4/include/H5TBpublic.h b/privatemodules/nc4/include/H5TBpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..874ef2077c9521b8a4f4493a0c6157cec4c9f300 --- /dev/null +++ b/privatemodules/nc4/include/H5TBpublic.h @@ -0,0 +1,233 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#ifndef _H5TBpublic_H +#define _H5TBpublic_H + + +#ifdef __cplusplus +extern "C" { +#endif + + +/*------------------------------------------------------------------------- + * + * Create functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5TBmake_table( const char *table_title, + hid_t loc_id, + const char *dset_name, + hsize_t nfields, + hsize_t nrecords, + size_t type_size, + const char *field_names[], + const size_t *field_offset, + const hid_t *field_types, + hsize_t chunk_size, + void *fill_data, + int compress, + const void *buf ); + + +/*------------------------------------------------------------------------- + * + * Write functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5TBappend_records( hid_t loc_id, + const char *dset_name, + hsize_t nrecords, + size_t type_size, + const size_t *field_offset, + const size_t *dst_sizes, + const void *buf ); + +H5_HLDLL herr_t H5TBwrite_records( hid_t loc_id, + const char *dset_name, + hsize_t start, + hsize_t nrecords, + size_t type_size, + const size_t *field_offset, + const size_t *dst_sizes, + const void *buf ); + + +H5_HLDLL herr_t H5TBwrite_fields_name( hid_t loc_id, + const char *dset_name, + const char *field_names, + hsize_t start, + hsize_t nrecords, + size_t type_size, + const size_t *field_offset, + const size_t *dst_sizes, + const void *buf ); + +H5_HLDLL herr_t H5TBwrite_fields_index( hid_t loc_id, + const char *dset_name, + hsize_t nfields, + const int *field_index, + hsize_t start, + hsize_t nrecords, + size_t type_size, + const size_t *field_offset, + const size_t *dst_sizes, + const void *buf ); + + +/*------------------------------------------------------------------------- + * + * Read functions + * + *------------------------------------------------------------------------- + */ + + + +H5_HLDLL herr_t H5TBread_table( hid_t loc_id, + const char *dset_name, + size_t dst_size, + const size_t *dst_offset, + const size_t *dst_sizes, + void *dst_buf ); + + +H5_HLDLL herr_t H5TBread_fields_name( hid_t loc_id, + const char *dset_name, + const char *field_names, + hsize_t start, + hsize_t nrecords, + size_t type_size, + const size_t *field_offset, + const size_t *dst_sizes, + void *buf ); + +H5_HLDLL herr_t H5TBread_fields_index( hid_t loc_id, + const char *dset_name, + hsize_t nfields, + const int *field_index, + hsize_t start, + hsize_t nrecords, + size_t type_size, + const size_t *field_offset, + const size_t *dst_sizes, + void *buf ); + + +H5_HLDLL herr_t H5TBread_records( hid_t loc_id, + const char *dset_name, + hsize_t start, + hsize_t nrecords, + size_t type_size, + const size_t *dst_offset, + const size_t *dst_sizes, + void *buf ); + +/*------------------------------------------------------------------------- + * + * Inquiry functions + * + *------------------------------------------------------------------------- + */ + + +H5_HLDLL herr_t H5TBget_table_info ( hid_t loc_id, + const char *dset_name, + hsize_t *nfields, + hsize_t *nrecords ); + +H5_HLDLL herr_t H5TBget_field_info( hid_t loc_id, + const char *dset_name, + char *field_names[], + size_t *field_sizes, + size_t *field_offsets, + size_t *type_size ); + + +/*------------------------------------------------------------------------- + * + * Manipulation functions + * + *------------------------------------------------------------------------- + */ + + +H5_HLDLL herr_t H5TBdelete_record( hid_t loc_id, + const char *dset_name, + hsize_t start, + hsize_t nrecords ); + + +H5_HLDLL herr_t H5TBinsert_record( hid_t loc_id, + const char *dset_name, + hsize_t start, + hsize_t nrecords, + size_t dst_size, + const size_t *dst_offset, + const size_t *dst_sizes, + void *buf ); + +H5_HLDLL herr_t H5TBadd_records_from( hid_t loc_id, + const char *dset_name1, + hsize_t start1, + hsize_t nrecords, + const char *dset_name2, + hsize_t start2 ); + +H5_HLDLL herr_t H5TBcombine_tables( hid_t loc_id1, + const char *dset_name1, + hid_t loc_id2, + const char *dset_name2, + const char *dset_name3 ); + +H5_HLDLL herr_t H5TBinsert_field( hid_t loc_id, + const char *dset_name, + const char *field_name, + hid_t field_type, + hsize_t position, + const void *fill_data, + const void *buf ); + +H5_HLDLL herr_t H5TBdelete_field( hid_t loc_id, + const char *dset_name, + const char *field_name ); + + +/*------------------------------------------------------------------------- + * + * Table attribute functions + * + *------------------------------------------------------------------------- + */ + +H5_HLDLL herr_t H5TBAget_title( hid_t loc_id, + char *table_title ); + +H5_HLDLL htri_t H5TBAget_fill(hid_t loc_id, + const char *dset_name, + hid_t dset_id, + unsigned char *dst_buf); + +#ifdef __cplusplus +} +#endif + + +#endif + diff --git a/privatemodules/nc4/include/H5Tpublic.h b/privatemodules/nc4/include/H5Tpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..d646ef1e887e048fdf6a5de709e2bd6db4f45519 --- /dev/null +++ b/privatemodules/nc4/include/H5Tpublic.h @@ -0,0 +1,621 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the H5T module. + */ +#ifndef _H5Tpublic_H +#define _H5Tpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" +#include "H5Ipublic.h" + +#define HOFFSET(S,M) (offsetof(S,M)) + +/* These are the various classes of datatypes */ +/* If this goes over 16 types (0-15), the file format will need to change) */ +typedef enum H5T_class_t { + H5T_NO_CLASS = -1, /*error */ + H5T_INTEGER = 0, /*integer types */ + H5T_FLOAT = 1, /*floating-point types */ + H5T_TIME = 2, /*date and time types */ + H5T_STRING = 3, /*character string types */ + H5T_BITFIELD = 4, /*bit field types */ + H5T_OPAQUE = 5, /*opaque types */ + H5T_COMPOUND = 6, /*compound types */ + H5T_REFERENCE = 7, /*reference types */ + H5T_ENUM = 8, /*enumeration types */ + H5T_VLEN = 9, /*Variable-Length types */ + H5T_ARRAY = 10, /*Array types */ + + H5T_NCLASSES /*this must be last */ +} H5T_class_t; + +/* Byte orders */ +typedef enum H5T_order_t { + H5T_ORDER_ERROR = -1, /*error */ + H5T_ORDER_LE = 0, /*little endian */ + H5T_ORDER_BE = 1, /*bit endian */ + H5T_ORDER_VAX = 2, /*VAX mixed endian */ + H5T_ORDER_MIXED = 3, /*Compound type with mixed member orders */ + H5T_ORDER_NONE = 4 /*no particular order (strings, bits,..) */ + /*H5T_ORDER_NONE must be last */ +} H5T_order_t; + +/* Types of integer sign schemes */ +typedef enum H5T_sign_t { + H5T_SGN_ERROR = -1, /*error */ + H5T_SGN_NONE = 0, /*this is an unsigned type */ + H5T_SGN_2 = 1, /*two's complement */ + + H5T_NSGN = 2 /*this must be last! */ +} H5T_sign_t; + +/* Floating-point normalization schemes */ +typedef enum H5T_norm_t { + H5T_NORM_ERROR = -1, /*error */ + H5T_NORM_IMPLIED = 0, /*msb of mantissa isn't stored, always 1 */ + H5T_NORM_MSBSET = 1, /*msb of mantissa is always 1 */ + H5T_NORM_NONE = 2 /*not normalized */ + /*H5T_NORM_NONE must be last */ +} H5T_norm_t; + +/* + * Character set to use for text strings. Do not change these values since + * they appear in HDF5 files! + */ +typedef enum H5T_cset_t { + H5T_CSET_ERROR = -1, /*error */ + H5T_CSET_ASCII = 0, /*US ASCII */ + H5T_CSET_UTF8 = 1, /*UTF-8 Unicode encoding */ + H5T_CSET_RESERVED_2 = 2, /*reserved for later use */ + H5T_CSET_RESERVED_3 = 3, /*reserved for later use */ + H5T_CSET_RESERVED_4 = 4, /*reserved for later use */ + H5T_CSET_RESERVED_5 = 5, /*reserved for later use */ + H5T_CSET_RESERVED_6 = 6, /*reserved for later use */ + H5T_CSET_RESERVED_7 = 7, /*reserved for later use */ + H5T_CSET_RESERVED_8 = 8, /*reserved for later use */ + H5T_CSET_RESERVED_9 = 9, /*reserved for later use */ + H5T_CSET_RESERVED_10 = 10, /*reserved for later use */ + H5T_CSET_RESERVED_11 = 11, /*reserved for later use */ + H5T_CSET_RESERVED_12 = 12, /*reserved for later use */ + H5T_CSET_RESERVED_13 = 13, /*reserved for later use */ + H5T_CSET_RESERVED_14 = 14, /*reserved for later use */ + H5T_CSET_RESERVED_15 = 15 /*reserved for later use */ +} H5T_cset_t; +#define H5T_NCSET H5T_CSET_RESERVED_2 /*Number of character sets actually defined */ + +/* + * Type of padding to use in character strings. Do not change these values + * since they appear in HDF5 files! + */ +typedef enum H5T_str_t { + H5T_STR_ERROR = -1, /*error */ + H5T_STR_NULLTERM = 0, /*null terminate like in C */ + H5T_STR_NULLPAD = 1, /*pad with nulls */ + H5T_STR_SPACEPAD = 2, /*pad with spaces like in Fortran */ + H5T_STR_RESERVED_3 = 3, /*reserved for later use */ + H5T_STR_RESERVED_4 = 4, /*reserved for later use */ + H5T_STR_RESERVED_5 = 5, /*reserved for later use */ + H5T_STR_RESERVED_6 = 6, /*reserved for later use */ + H5T_STR_RESERVED_7 = 7, /*reserved for later use */ + H5T_STR_RESERVED_8 = 8, /*reserved for later use */ + H5T_STR_RESERVED_9 = 9, /*reserved for later use */ + H5T_STR_RESERVED_10 = 10, /*reserved for later use */ + H5T_STR_RESERVED_11 = 11, /*reserved for later use */ + H5T_STR_RESERVED_12 = 12, /*reserved for later use */ + H5T_STR_RESERVED_13 = 13, /*reserved for later use */ + H5T_STR_RESERVED_14 = 14, /*reserved for later use */ + H5T_STR_RESERVED_15 = 15 /*reserved for later use */ +} H5T_str_t; +#define H5T_NSTR H5T_STR_RESERVED_3 /*num H5T_str_t types actually defined */ + +/* Type of padding to use in other atomic types */ +typedef enum H5T_pad_t { + H5T_PAD_ERROR = -1, /*error */ + H5T_PAD_ZERO = 0, /*always set to zero */ + H5T_PAD_ONE = 1, /*always set to one */ + H5T_PAD_BACKGROUND = 2, /*set to background value */ + + H5T_NPAD = 3 /*THIS MUST BE LAST */ +} H5T_pad_t; + +/* Commands sent to conversion functions */ +typedef enum H5T_cmd_t { + H5T_CONV_INIT = 0, /*query and/or initialize private data */ + H5T_CONV_CONV = 1, /*convert data from source to dest datatype */ + H5T_CONV_FREE = 2 /*function is being removed from path */ +} H5T_cmd_t; + +/* How is the `bkg' buffer used by the conversion function? */ +typedef enum H5T_bkg_t { + H5T_BKG_NO = 0, /*background buffer is not needed, send NULL */ + H5T_BKG_TEMP = 1, /*bkg buffer used as temp storage only */ + H5T_BKG_YES = 2 /*init bkg buf with data before conversion */ +} H5T_bkg_t; + +/* Type conversion client data */ +typedef struct H5T_cdata_t { + H5T_cmd_t command;/*what should the conversion function do? */ + H5T_bkg_t need_bkg;/*is the background buffer needed? */ + hbool_t recalc; /*recalculate private data */ + void *priv; /*private data */ +} H5T_cdata_t; + +/* Conversion function persistence */ +typedef enum H5T_pers_t { + H5T_PERS_DONTCARE = -1, /*wild card */ + H5T_PERS_HARD = 0, /*hard conversion function */ + H5T_PERS_SOFT = 1 /*soft conversion function */ +} H5T_pers_t; + +/* The order to retrieve atomic native datatype */ +typedef enum H5T_direction_t { + H5T_DIR_DEFAULT = 0, /*default direction is inscendent */ + H5T_DIR_ASCEND = 1, /*in inscendent order */ + H5T_DIR_DESCEND = 2 /*in descendent order */ +} H5T_direction_t; + +/* The exception type passed into the conversion callback function */ +typedef enum H5T_conv_except_t { + H5T_CONV_EXCEPT_RANGE_HI = 0, /*source value is greater than destination's range */ + H5T_CONV_EXCEPT_RANGE_LOW = 1, /*source value is less than destination's range */ + H5T_CONV_EXCEPT_PRECISION = 2, /*source value loses precision in destination */ + H5T_CONV_EXCEPT_TRUNCATE = 3, /*source value is truncated in destination */ + H5T_CONV_EXCEPT_PINF = 4, /*source value is positive infinity(floating number) */ + H5T_CONV_EXCEPT_NINF = 5, /*source value is negative infinity(floating number) */ + H5T_CONV_EXCEPT_NAN = 6 /*source value is NaN(floating number) */ +} H5T_conv_except_t; + +/* The return value from conversion callback function H5T_conv_except_func_t */ +typedef enum H5T_conv_ret_t { + H5T_CONV_ABORT = -1, /*abort conversion */ + H5T_CONV_UNHANDLED = 0, /*callback function failed to handle the exception */ + H5T_CONV_HANDLED = 1 /*callback function handled the exception successfully */ +} H5T_conv_ret_t; + +/* Variable Length Datatype struct in memory */ +/* (This is only used for VL sequences, not VL strings, which are stored in char *'s) */ +typedef struct { + size_t len; /* Length of VL data (in base type units) */ + void *p; /* Pointer to VL data */ +} hvl_t; + +/* Variable Length String information */ +#define H5T_VARIABLE ((size_t)(-1)) /* Indicate that a string is variable length (null-terminated in C, instead of fixed length) */ + +/* Opaque information */ +#define H5T_OPAQUE_TAG_MAX 256 /* Maximum length of an opaque tag */ + /* This could be raised without too much difficulty */ + +#ifdef __cplusplus +extern "C" { +#endif + +/* All datatype conversion functions are... */ +typedef herr_t (*H5T_conv_t) (hid_t src_id, hid_t dst_id, H5T_cdata_t *cdata, + size_t nelmts, size_t buf_stride, size_t bkg_stride, void *buf, + void *bkg, hid_t dset_xfer_plist); + +/* Exception handler. If an exception like overflow happenes during conversion, + * this function is called if it's registered through H5Pset_type_conv_cb. + */ +typedef H5T_conv_ret_t (*H5T_conv_except_func_t)(H5T_conv_except_t except_type, + hid_t src_id, hid_t dst_id, void *src_buf, void *dst_buf, void *user_data); + +/* 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 */ + +/* + * The IEEE floating point types in various byte orders. + */ +#define H5T_IEEE_F32BE (H5OPEN H5T_IEEE_F32BE_g) +#define H5T_IEEE_F32LE (H5OPEN H5T_IEEE_F32LE_g) +#define H5T_IEEE_F64BE (H5OPEN H5T_IEEE_F64BE_g) +#define H5T_IEEE_F64LE (H5OPEN H5T_IEEE_F64LE_g) +H5_DLLVAR hid_t H5T_IEEE_F32BE_g; +H5_DLLVAR hid_t H5T_IEEE_F32LE_g; +H5_DLLVAR hid_t H5T_IEEE_F64BE_g; +H5_DLLVAR hid_t H5T_IEEE_F64LE_g; + +/* + * These are "standard" types. For instance, signed (2's complement) and + * unsigned integers of various sizes and byte orders. + */ +#define H5T_STD_I8BE (H5OPEN H5T_STD_I8BE_g) +#define H5T_STD_I8LE (H5OPEN H5T_STD_I8LE_g) +#define H5T_STD_I16BE (H5OPEN H5T_STD_I16BE_g) +#define H5T_STD_I16LE (H5OPEN H5T_STD_I16LE_g) +#define H5T_STD_I32BE (H5OPEN H5T_STD_I32BE_g) +#define H5T_STD_I32LE (H5OPEN H5T_STD_I32LE_g) +#define H5T_STD_I64BE (H5OPEN H5T_STD_I64BE_g) +#define H5T_STD_I64LE (H5OPEN H5T_STD_I64LE_g) +#define H5T_STD_U8BE (H5OPEN H5T_STD_U8BE_g) +#define H5T_STD_U8LE (H5OPEN H5T_STD_U8LE_g) +#define H5T_STD_U16BE (H5OPEN H5T_STD_U16BE_g) +#define H5T_STD_U16LE (H5OPEN H5T_STD_U16LE_g) +#define H5T_STD_U32BE (H5OPEN H5T_STD_U32BE_g) +#define H5T_STD_U32LE (H5OPEN H5T_STD_U32LE_g) +#define H5T_STD_U64BE (H5OPEN H5T_STD_U64BE_g) +#define H5T_STD_U64LE (H5OPEN H5T_STD_U64LE_g) +#define H5T_STD_B8BE (H5OPEN H5T_STD_B8BE_g) +#define H5T_STD_B8LE (H5OPEN H5T_STD_B8LE_g) +#define H5T_STD_B16BE (H5OPEN H5T_STD_B16BE_g) +#define H5T_STD_B16LE (H5OPEN H5T_STD_B16LE_g) +#define H5T_STD_B32BE (H5OPEN H5T_STD_B32BE_g) +#define H5T_STD_B32LE (H5OPEN H5T_STD_B32LE_g) +#define H5T_STD_B64BE (H5OPEN H5T_STD_B64BE_g) +#define H5T_STD_B64LE (H5OPEN H5T_STD_B64LE_g) +#define H5T_STD_REF_OBJ (H5OPEN H5T_STD_REF_OBJ_g) +#define H5T_STD_REF_DSETREG (H5OPEN H5T_STD_REF_DSETREG_g) +H5_DLLVAR hid_t H5T_STD_I8BE_g; +H5_DLLVAR hid_t H5T_STD_I8LE_g; +H5_DLLVAR hid_t H5T_STD_I16BE_g; +H5_DLLVAR hid_t H5T_STD_I16LE_g; +H5_DLLVAR hid_t H5T_STD_I32BE_g; +H5_DLLVAR hid_t H5T_STD_I32LE_g; +H5_DLLVAR hid_t H5T_STD_I64BE_g; +H5_DLLVAR hid_t H5T_STD_I64LE_g; +H5_DLLVAR hid_t H5T_STD_U8BE_g; +H5_DLLVAR hid_t H5T_STD_U8LE_g; +H5_DLLVAR hid_t H5T_STD_U16BE_g; +H5_DLLVAR hid_t H5T_STD_U16LE_g; +H5_DLLVAR hid_t H5T_STD_U32BE_g; +H5_DLLVAR hid_t H5T_STD_U32LE_g; +H5_DLLVAR hid_t H5T_STD_U64BE_g; +H5_DLLVAR hid_t H5T_STD_U64LE_g; +H5_DLLVAR hid_t H5T_STD_B8BE_g; +H5_DLLVAR hid_t H5T_STD_B8LE_g; +H5_DLLVAR hid_t H5T_STD_B16BE_g; +H5_DLLVAR hid_t H5T_STD_B16LE_g; +H5_DLLVAR hid_t H5T_STD_B32BE_g; +H5_DLLVAR hid_t H5T_STD_B32LE_g; +H5_DLLVAR hid_t H5T_STD_B64BE_g; +H5_DLLVAR hid_t H5T_STD_B64LE_g; +H5_DLLVAR hid_t H5T_STD_REF_OBJ_g; +H5_DLLVAR hid_t H5T_STD_REF_DSETREG_g; + +/* + * Types which are particular to Unix. + */ +#define H5T_UNIX_D32BE (H5OPEN H5T_UNIX_D32BE_g) +#define H5T_UNIX_D32LE (H5OPEN H5T_UNIX_D32LE_g) +#define H5T_UNIX_D64BE (H5OPEN H5T_UNIX_D64BE_g) +#define H5T_UNIX_D64LE (H5OPEN H5T_UNIX_D64LE_g) +H5_DLLVAR hid_t H5T_UNIX_D32BE_g; +H5_DLLVAR hid_t H5T_UNIX_D32LE_g; +H5_DLLVAR hid_t H5T_UNIX_D64BE_g; +H5_DLLVAR hid_t H5T_UNIX_D64LE_g; + +/* + * Types particular to the C language. String types use `bytes' instead + * of `bits' as their size. + */ +#define H5T_C_S1 (H5OPEN H5T_C_S1_g) +H5_DLLVAR hid_t H5T_C_S1_g; + +/* + * Types particular to Fortran. + */ +#define H5T_FORTRAN_S1 (H5OPEN H5T_FORTRAN_S1_g) +H5_DLLVAR hid_t H5T_FORTRAN_S1_g; + +/* + * These types are for Intel CPU's. They are little endian with IEEE + * floating point. + */ +#define H5T_INTEL_I8 H5T_STD_I8LE +#define H5T_INTEL_I16 H5T_STD_I16LE +#define H5T_INTEL_I32 H5T_STD_I32LE +#define H5T_INTEL_I64 H5T_STD_I64LE +#define H5T_INTEL_U8 H5T_STD_U8LE +#define H5T_INTEL_U16 H5T_STD_U16LE +#define H5T_INTEL_U32 H5T_STD_U32LE +#define H5T_INTEL_U64 H5T_STD_U64LE +#define H5T_INTEL_B8 H5T_STD_B8LE +#define H5T_INTEL_B16 H5T_STD_B16LE +#define H5T_INTEL_B32 H5T_STD_B32LE +#define H5T_INTEL_B64 H5T_STD_B64LE +#define H5T_INTEL_F32 H5T_IEEE_F32LE +#define H5T_INTEL_F64 H5T_IEEE_F64LE + +/* + * These types are for DEC Alpha CPU's. They are little endian with IEEE + * floating point. + */ +#define H5T_ALPHA_I8 H5T_STD_I8LE +#define H5T_ALPHA_I16 H5T_STD_I16LE +#define H5T_ALPHA_I32 H5T_STD_I32LE +#define H5T_ALPHA_I64 H5T_STD_I64LE +#define H5T_ALPHA_U8 H5T_STD_U8LE +#define H5T_ALPHA_U16 H5T_STD_U16LE +#define H5T_ALPHA_U32 H5T_STD_U32LE +#define H5T_ALPHA_U64 H5T_STD_U64LE +#define H5T_ALPHA_B8 H5T_STD_B8LE +#define H5T_ALPHA_B16 H5T_STD_B16LE +#define H5T_ALPHA_B32 H5T_STD_B32LE +#define H5T_ALPHA_B64 H5T_STD_B64LE +#define H5T_ALPHA_F32 H5T_IEEE_F32LE +#define H5T_ALPHA_F64 H5T_IEEE_F64LE + +/* + * These types are for MIPS cpu's commonly used in SGI systems. They are big + * endian with IEEE floating point. + */ +#define H5T_MIPS_I8 H5T_STD_I8BE +#define H5T_MIPS_I16 H5T_STD_I16BE +#define H5T_MIPS_I32 H5T_STD_I32BE +#define H5T_MIPS_I64 H5T_STD_I64BE +#define H5T_MIPS_U8 H5T_STD_U8BE +#define H5T_MIPS_U16 H5T_STD_U16BE +#define H5T_MIPS_U32 H5T_STD_U32BE +#define H5T_MIPS_U64 H5T_STD_U64BE +#define H5T_MIPS_B8 H5T_STD_B8BE +#define H5T_MIPS_B16 H5T_STD_B16BE +#define H5T_MIPS_B32 H5T_STD_B32BE +#define H5T_MIPS_B64 H5T_STD_B64BE +#define H5T_MIPS_F32 H5T_IEEE_F32BE +#define H5T_MIPS_F64 H5T_IEEE_F64BE + +/* + * The VAX floating point types (i.e. in VAX byte order) + */ +#define H5T_VAX_F32 (H5OPEN H5T_VAX_F32_g) +#define H5T_VAX_F64 (H5OPEN H5T_VAX_F64_g) +H5_DLLVAR hid_t H5T_VAX_F32_g; +H5_DLLVAR hid_t H5T_VAX_F64_g; + +/* + * The predefined native types. These are the types detected by H5detect and + * they violate the naming scheme a little. Instead of a class name, + * precision and byte order as the last component, they have a C-like type + * name. If the type begins with `U' then it is the unsigned version of the + * integer type; other integer types are signed. The type LLONG corresponds + * to C's `long long' and LDOUBLE is `long double' (these types might be the + * same as `LONG' and `DOUBLE' respectively). + */ +#define H5T_NATIVE_CHAR (CHAR_MIN?H5T_NATIVE_SCHAR:H5T_NATIVE_UCHAR) +#define H5T_NATIVE_SCHAR (H5OPEN H5T_NATIVE_SCHAR_g) +#define H5T_NATIVE_UCHAR (H5OPEN H5T_NATIVE_UCHAR_g) +#define H5T_NATIVE_SHORT (H5OPEN H5T_NATIVE_SHORT_g) +#define H5T_NATIVE_USHORT (H5OPEN H5T_NATIVE_USHORT_g) +#define H5T_NATIVE_INT (H5OPEN H5T_NATIVE_INT_g) +#define H5T_NATIVE_UINT (H5OPEN H5T_NATIVE_UINT_g) +#define H5T_NATIVE_LONG (H5OPEN H5T_NATIVE_LONG_g) +#define H5T_NATIVE_ULONG (H5OPEN H5T_NATIVE_ULONG_g) +#define H5T_NATIVE_LLONG (H5OPEN H5T_NATIVE_LLONG_g) +#define H5T_NATIVE_ULLONG (H5OPEN H5T_NATIVE_ULLONG_g) +#define H5T_NATIVE_FLOAT (H5OPEN H5T_NATIVE_FLOAT_g) +#define H5T_NATIVE_DOUBLE (H5OPEN H5T_NATIVE_DOUBLE_g) +#if H5_SIZEOF_LONG_DOUBLE !=0 +#define H5T_NATIVE_LDOUBLE (H5OPEN H5T_NATIVE_LDOUBLE_g) +#endif +#define H5T_NATIVE_B8 (H5OPEN H5T_NATIVE_B8_g) +#define H5T_NATIVE_B16 (H5OPEN H5T_NATIVE_B16_g) +#define H5T_NATIVE_B32 (H5OPEN H5T_NATIVE_B32_g) +#define H5T_NATIVE_B64 (H5OPEN H5T_NATIVE_B64_g) +#define H5T_NATIVE_OPAQUE (H5OPEN H5T_NATIVE_OPAQUE_g) +#define H5T_NATIVE_HADDR (H5OPEN H5T_NATIVE_HADDR_g) +#define H5T_NATIVE_HSIZE (H5OPEN H5T_NATIVE_HSIZE_g) +#define H5T_NATIVE_HSSIZE (H5OPEN H5T_NATIVE_HSSIZE_g) +#define H5T_NATIVE_HERR (H5OPEN H5T_NATIVE_HERR_g) +#define H5T_NATIVE_HBOOL (H5OPEN H5T_NATIVE_HBOOL_g) +H5_DLLVAR hid_t H5T_NATIVE_SCHAR_g; +H5_DLLVAR hid_t H5T_NATIVE_UCHAR_g; +H5_DLLVAR hid_t H5T_NATIVE_SHORT_g; +H5_DLLVAR hid_t H5T_NATIVE_USHORT_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_g; +H5_DLLVAR hid_t H5T_NATIVE_LONG_g; +H5_DLLVAR hid_t H5T_NATIVE_ULONG_g; +H5_DLLVAR hid_t H5T_NATIVE_LLONG_g; +H5_DLLVAR hid_t H5T_NATIVE_ULLONG_g; +H5_DLLVAR hid_t H5T_NATIVE_FLOAT_g; +H5_DLLVAR hid_t H5T_NATIVE_DOUBLE_g; +#if H5_SIZEOF_LONG_DOUBLE !=0 +H5_DLLVAR hid_t H5T_NATIVE_LDOUBLE_g; +#endif +H5_DLLVAR hid_t H5T_NATIVE_B8_g; +H5_DLLVAR hid_t H5T_NATIVE_B16_g; +H5_DLLVAR hid_t H5T_NATIVE_B32_g; +H5_DLLVAR hid_t H5T_NATIVE_B64_g; +H5_DLLVAR hid_t H5T_NATIVE_OPAQUE_g; +H5_DLLVAR hid_t H5T_NATIVE_HADDR_g; +H5_DLLVAR hid_t H5T_NATIVE_HSIZE_g; +H5_DLLVAR hid_t H5T_NATIVE_HSSIZE_g; +H5_DLLVAR hid_t H5T_NATIVE_HERR_g; +H5_DLLVAR hid_t H5T_NATIVE_HBOOL_g; + +/* C9x integer types */ +#define H5T_NATIVE_INT8 (H5OPEN H5T_NATIVE_INT8_g) +#define H5T_NATIVE_UINT8 (H5OPEN H5T_NATIVE_UINT8_g) +#define H5T_NATIVE_INT_LEAST8 (H5OPEN H5T_NATIVE_INT_LEAST8_g) +#define H5T_NATIVE_UINT_LEAST8 (H5OPEN H5T_NATIVE_UINT_LEAST8_g) +#define H5T_NATIVE_INT_FAST8 (H5OPEN H5T_NATIVE_INT_FAST8_g) +#define H5T_NATIVE_UINT_FAST8 (H5OPEN H5T_NATIVE_UINT_FAST8_g) +H5_DLLVAR hid_t H5T_NATIVE_INT8_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT8_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST8_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST8_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_FAST8_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST8_g; + +#define H5T_NATIVE_INT16 (H5OPEN H5T_NATIVE_INT16_g) +#define H5T_NATIVE_UINT16 (H5OPEN H5T_NATIVE_UINT16_g) +#define H5T_NATIVE_INT_LEAST16 (H5OPEN H5T_NATIVE_INT_LEAST16_g) +#define H5T_NATIVE_UINT_LEAST16 (H5OPEN H5T_NATIVE_UINT_LEAST16_g) +#define H5T_NATIVE_INT_FAST16 (H5OPEN H5T_NATIVE_INT_FAST16_g) +#define H5T_NATIVE_UINT_FAST16 (H5OPEN H5T_NATIVE_UINT_FAST16_g) +H5_DLLVAR hid_t H5T_NATIVE_INT16_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT16_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST16_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST16_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_FAST16_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST16_g; + +#define H5T_NATIVE_INT32 (H5OPEN H5T_NATIVE_INT32_g) +#define H5T_NATIVE_UINT32 (H5OPEN H5T_NATIVE_UINT32_g) +#define H5T_NATIVE_INT_LEAST32 (H5OPEN H5T_NATIVE_INT_LEAST32_g) +#define H5T_NATIVE_UINT_LEAST32 (H5OPEN H5T_NATIVE_UINT_LEAST32_g) +#define H5T_NATIVE_INT_FAST32 (H5OPEN H5T_NATIVE_INT_FAST32_g) +#define H5T_NATIVE_UINT_FAST32 (H5OPEN H5T_NATIVE_UINT_FAST32_g) +H5_DLLVAR hid_t H5T_NATIVE_INT32_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT32_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST32_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST32_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_FAST32_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST32_g; + +#define H5T_NATIVE_INT64 (H5OPEN H5T_NATIVE_INT64_g) +#define H5T_NATIVE_UINT64 (H5OPEN H5T_NATIVE_UINT64_g) +#define H5T_NATIVE_INT_LEAST64 (H5OPEN H5T_NATIVE_INT_LEAST64_g) +#define H5T_NATIVE_UINT_LEAST64 (H5OPEN H5T_NATIVE_UINT_LEAST64_g) +#define H5T_NATIVE_INT_FAST64 (H5OPEN H5T_NATIVE_INT_FAST64_g) +#define H5T_NATIVE_UINT_FAST64 (H5OPEN H5T_NATIVE_UINT_FAST64_g) +H5_DLLVAR hid_t H5T_NATIVE_INT64_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT64_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_LEAST64_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_LEAST64_g; +H5_DLLVAR hid_t H5T_NATIVE_INT_FAST64_g; +H5_DLLVAR hid_t H5T_NATIVE_UINT_FAST64_g; + +/* Operations defined on all datatypes */ +H5_DLL hid_t H5Tcreate(H5T_class_t type, size_t size); +H5_DLL hid_t H5Tcopy(hid_t type_id); +H5_DLL herr_t H5Tclose(hid_t type_id); +H5_DLL htri_t H5Tequal(hid_t type1_id, hid_t type2_id); +H5_DLL herr_t H5Tlock(hid_t type_id); +H5_DLL herr_t H5Tcommit2(hid_t loc_id, const char *name, hid_t type_id, + hid_t lcpl_id, hid_t tcpl_id, hid_t tapl_id); +H5_DLL hid_t H5Topen2(hid_t loc_id, const char *name, hid_t tapl_id); +H5_DLL herr_t H5Tcommit_anon(hid_t loc_id, hid_t type_id, hid_t tcpl_id, hid_t tapl_id); +H5_DLL hid_t H5Tget_create_plist(hid_t type_id); +H5_DLL htri_t H5Tcommitted(hid_t type_id); +H5_DLL herr_t H5Tencode(hid_t obj_id, void *buf, size_t *nalloc); +H5_DLL hid_t H5Tdecode(const void *buf); + +/* Operations defined on compound datatypes */ +H5_DLL herr_t H5Tinsert(hid_t parent_id, const char *name, size_t offset, + hid_t member_id); +H5_DLL herr_t H5Tpack(hid_t type_id); + +/* Operations defined on enumeration datatypes */ +H5_DLL hid_t H5Tenum_create(hid_t base_id); +H5_DLL herr_t H5Tenum_insert(hid_t type, const char *name, const void *value); +H5_DLL herr_t H5Tenum_nameof(hid_t type, const void *value, char *name/*out*/, + size_t size); +H5_DLL herr_t H5Tenum_valueof(hid_t type, const char *name, + void *value/*out*/); + +/* Operations defined on variable-length datatypes */ +H5_DLL hid_t H5Tvlen_create(hid_t base_id); + +/* Operations defined on array datatypes */ +H5_DLL hid_t H5Tarray_create2(hid_t base_id, unsigned ndims, + const hsize_t dim[/* ndims */]); +H5_DLL int H5Tget_array_ndims(hid_t type_id); +H5_DLL int H5Tget_array_dims2(hid_t type_id, hsize_t dims[]); + +/* Operations defined on opaque datatypes */ +H5_DLL herr_t H5Tset_tag(hid_t type, const char *tag); +H5_DLL char *H5Tget_tag(hid_t type); + +/* Querying property values */ +H5_DLL hid_t H5Tget_super(hid_t type); +H5_DLL H5T_class_t H5Tget_class(hid_t type_id); +H5_DLL htri_t H5Tdetect_class(hid_t type_id, H5T_class_t cls); +H5_DLL size_t H5Tget_size(hid_t type_id); +H5_DLL H5T_order_t H5Tget_order(hid_t type_id); +H5_DLL size_t H5Tget_precision(hid_t type_id); +H5_DLL int H5Tget_offset(hid_t type_id); +H5_DLL herr_t H5Tget_pad(hid_t type_id, H5T_pad_t *lsb/*out*/, + H5T_pad_t *msb/*out*/); +H5_DLL H5T_sign_t H5Tget_sign(hid_t type_id); +H5_DLL herr_t H5Tget_fields(hid_t type_id, size_t *spos/*out*/, + size_t *epos/*out*/, size_t *esize/*out*/, + size_t *mpos/*out*/, size_t *msize/*out*/); +H5_DLL size_t H5Tget_ebias(hid_t type_id); +H5_DLL H5T_norm_t H5Tget_norm(hid_t type_id); +H5_DLL H5T_pad_t H5Tget_inpad(hid_t type_id); +H5_DLL H5T_str_t H5Tget_strpad(hid_t type_id); +H5_DLL int H5Tget_nmembers(hid_t type_id); +H5_DLL char *H5Tget_member_name(hid_t type_id, unsigned membno); +H5_DLL int H5Tget_member_index(hid_t type_id, const char *name); +H5_DLL size_t H5Tget_member_offset(hid_t type_id, unsigned membno); +H5_DLL H5T_class_t H5Tget_member_class(hid_t type_id, unsigned membno); +H5_DLL hid_t H5Tget_member_type(hid_t type_id, unsigned membno); +H5_DLL herr_t H5Tget_member_value(hid_t type_id, unsigned membno, void *value/*out*/); +H5_DLL H5T_cset_t H5Tget_cset(hid_t type_id); +H5_DLL htri_t H5Tis_variable_str(hid_t type_id); +H5_DLL hid_t H5Tget_native_type(hid_t type_id, H5T_direction_t direction); + +/* Setting property values */ +H5_DLL herr_t H5Tset_size(hid_t type_id, size_t size); +H5_DLL herr_t H5Tset_order(hid_t type_id, H5T_order_t order); +H5_DLL herr_t H5Tset_precision(hid_t type_id, size_t prec); +H5_DLL herr_t H5Tset_offset(hid_t type_id, size_t offset); +H5_DLL herr_t H5Tset_pad(hid_t type_id, H5T_pad_t lsb, H5T_pad_t msb); +H5_DLL herr_t H5Tset_sign(hid_t type_id, H5T_sign_t sign); +H5_DLL herr_t H5Tset_fields(hid_t type_id, size_t spos, size_t epos, + size_t esize, size_t mpos, size_t msize); +H5_DLL herr_t H5Tset_ebias(hid_t type_id, size_t ebias); +H5_DLL herr_t H5Tset_norm(hid_t type_id, H5T_norm_t norm); +H5_DLL herr_t H5Tset_inpad(hid_t type_id, H5T_pad_t pad); +H5_DLL herr_t H5Tset_cset(hid_t type_id, H5T_cset_t cset); +H5_DLL herr_t H5Tset_strpad(hid_t type_id, H5T_str_t strpad); + +/* Type conversion database */ +H5_DLL herr_t H5Tregister(H5T_pers_t pers, const char *name, hid_t src_id, + hid_t dst_id, H5T_conv_t func); +H5_DLL herr_t H5Tunregister(H5T_pers_t pers, const char *name, hid_t src_id, + hid_t dst_id, H5T_conv_t func); +H5_DLL H5T_conv_t H5Tfind(hid_t src_id, hid_t dst_id, H5T_cdata_t **pcdata); +H5_DLL htri_t H5Tcompiler_conv(hid_t src_id, hid_t dst_id); +H5_DLL herr_t H5Tconvert(hid_t src_id, hid_t dst_id, size_t nelmts, + void *buf, void *background, hid_t plist_id); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* Macros */ + + +/* Typedefs */ + + +/* Function prototypes */ +H5_DLL herr_t H5Tcommit1(hid_t loc_id, const char *name, hid_t type_id); +H5_DLL hid_t H5Topen1(hid_t loc_id, const char *name); +H5_DLL hid_t H5Tarray_create1(hid_t base_id, int ndims, + const hsize_t dim[/* ndims */], + const int perm[/* ndims */]); +H5_DLL int H5Tget_array_dims1(hid_t type_id, hsize_t dims[], int perm[]); + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif +#endif /* _H5Tpublic_H */ + diff --git a/privatemodules/nc4/include/H5Zpublic.h b/privatemodules/nc4/include/H5Zpublic.h new file mode 100644 index 0000000000000000000000000000000000000000..8daa5f490d32fb8af75f11fbb07d9e08008f16ea --- /dev/null +++ b/privatemodules/nc4/include/H5Zpublic.h @@ -0,0 +1,250 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Programmer: Robb Matzke <matzke@llnl.gov> + * Thursday, April 16, 1998 + */ + +#ifndef _H5Zpublic_H +#define _H5Zpublic_H + +/* Public headers needed by this file */ +#include "H5public.h" + +/* + * Filter identifiers. Values 0 through 255 are for filters defined by the + * HDF5 library. Values 256 through 511 are available for testing new + * filters. Subsequent values should be obtained from the HDF5 development + * team at hdf5dev@ncsa.uiuc.edu. These values will never change because they + * appear in the HDF5 files. + */ +typedef int H5Z_filter_t; + +/* Filter IDs */ +#define H5Z_FILTER_ERROR (-1) /*no filter */ +#define H5Z_FILTER_NONE 0 /*reserved indefinitely */ +#define H5Z_FILTER_DEFLATE 1 /*deflation like gzip */ +#define H5Z_FILTER_SHUFFLE 2 /*shuffle the data */ +#define H5Z_FILTER_FLETCHER32 3 /*fletcher32 checksum of EDC */ +#define H5Z_FILTER_SZIP 4 /*szip compression */ +#define H5Z_FILTER_NBIT 5 /*nbit compression */ +#define H5Z_FILTER_SCALEOFFSET 6 /*scale+offset compression */ +#define H5Z_FILTER_RESERVED 256 /*filter ids below this value are reserved for library use */ + +#define H5Z_FILTER_MAX 65535 /*maximum filter id */ + +/* General macros */ +#define H5Z_FILTER_ALL 0 /* Symbol to remove all filters in H5Premove_filter */ +#define H5Z_MAX_NFILTERS 32 /* Maximum number of filters allowed in a pipeline */ + /* (should probably be allowed to be an + * unlimited amount, but currently each + * filter uses a bit in a 32-bit field, + * so the format would have to be + * changed to accomodate that) + */ + +/* Flags for filter definition (stored) */ +#define H5Z_FLAG_DEFMASK 0x00ff /*definition flag mask */ +#define H5Z_FLAG_MANDATORY 0x0000 /*filter is mandatory */ +#define H5Z_FLAG_OPTIONAL 0x0001 /*filter is optional */ + +/* Additional flags for filter invocation (not stored) */ +#define H5Z_FLAG_INVMASK 0xff00 /*invocation flag mask */ +#define H5Z_FLAG_REVERSE 0x0100 /*reverse direction; read */ +#define H5Z_FLAG_SKIP_EDC 0x0200 /*skip EDC filters for read */ + +/* Special parameters for szip compression */ +/* [These are aliases for the similar definitions in szlib.h, which we can't + * include directly due to the duplication of various symbols with the zlib.h + * header file] */ +#define H5_SZIP_ALLOW_K13_OPTION_MASK 1 +#define H5_SZIP_CHIP_OPTION_MASK 2 +#define H5_SZIP_EC_OPTION_MASK 4 +#define H5_SZIP_NN_OPTION_MASK 32 +#define H5_SZIP_MAX_PIXELS_PER_BLOCK 32 + +/* Macros for the shuffle filter */ +#define H5Z_SHUFFLE_USER_NPARMS 0 /* Number of parameters that users can set */ +#define H5Z_SHUFFLE_TOTAL_NPARMS 1 /* Total number of parameters for filter */ + +/* Macros for the szip filter */ +#define H5Z_SZIP_USER_NPARMS 2 /* Number of parameters that users can set */ +#define H5Z_SZIP_TOTAL_NPARMS 4 /* Total number of parameters for filter */ +#define H5Z_SZIP_PARM_MASK 0 /* "User" parameter for option mask */ +#define H5Z_SZIP_PARM_PPB 1 /* "User" parameter for pixels-per-block */ +#define H5Z_SZIP_PARM_BPP 2 /* "Local" parameter for bits-per-pixel */ +#define H5Z_SZIP_PARM_PPS 3 /* "Local" parameter for pixels-per-scanline */ + +/* Macros for the nbit filter */ +#define H5Z_NBIT_USER_NPARMS 0 /* Number of parameters that users can set */ + +/* Macros for the scale offset filter */ +#define H5Z_SCALEOFFSET_USER_NPARMS 2 /* Number of parameters that users can set */ + + +/* Special parameters for ScaleOffset filter*/ +#define H5Z_SO_INT_MINBITS_DEFAULT 0 +typedef enum H5Z_SO_scale_type_t { + H5Z_SO_FLOAT_DSCALE = 0, + H5Z_SO_FLOAT_ESCALE = 1, + H5Z_SO_INT = 2 +} H5Z_SO_scale_type_t; + +/* Current version of the H5Z_class_t struct */ +#define H5Z_CLASS_T_VERS (1) + +/* Values to decide if EDC is enabled for reading data */ +typedef enum H5Z_EDC_t { + H5Z_ERROR_EDC = -1, /* error value */ + H5Z_DISABLE_EDC = 0, + H5Z_ENABLE_EDC = 1, + H5Z_NO_EDC = 2 /* must be the last */ +} H5Z_EDC_t; + +/* Bit flags for H5Zget_filter_info */ +#define H5Z_FILTER_CONFIG_ENCODE_ENABLED (0x0001) +#define H5Z_FILTER_CONFIG_DECODE_ENABLED (0x0002) + +/* Return values for filter callback function */ +typedef enum H5Z_cb_return_t { + H5Z_CB_ERROR = -1, + H5Z_CB_FAIL = 0, /* I/O should fail if filter fails. */ + H5Z_CB_CONT = 1, /* I/O continues if filter fails. */ + H5Z_CB_NO = 2 +} H5Z_cb_return_t; + +/* Filter callback function definition */ +typedef H5Z_cb_return_t (*H5Z_filter_func_t)(H5Z_filter_t filter, void* buf, + size_t buf_size, void* op_data); + +/* Structure for filter callback property */ +typedef struct H5Z_cb_t { + H5Z_filter_func_t func; + void* op_data; +} H5Z_cb_t; + +#ifdef __cplusplus +extern "C" { +#endif + +/* + * Before a dataset gets created, the "can_apply" callbacks for any filters used + * in the dataset creation property list are called + * with the dataset's dataset creation property list, the dataset's datatype and + * a dataspace describing a chunk (for chunked dataset storage). + * + * The "can_apply" callback must determine if the combination of the dataset + * creation property list setting, the datatype and the dataspace represent a + * valid combination to apply this filter to. For example, some cases of + * invalid combinations may involve the filter not operating correctly on + * certain datatypes (or certain datatype sizes), or certain sizes of the chunk + * dataspace. + * + * The "can_apply" callback can be the NULL pointer, in which case, the library + * will assume that it can apply to any combination of dataset creation + * property list values, datatypes and dataspaces. + * + * The "can_apply" callback returns positive a valid combination, zero for an + * invalid combination and negative for an error. + */ +typedef htri_t (*H5Z_can_apply_func_t)(hid_t dcpl_id, hid_t type_id, hid_t space_id); + +/* + * After the "can_apply" callbacks are checked for new datasets, the "set_local" + * callbacks for any filters used in the dataset creation property list are + * called. These callbacks receive the dataset's private copy of the dataset + * creation property list passed in to H5Dcreate (i.e. not the actual property + * list passed in to H5Dcreate) and the datatype ID passed in to H5Dcreate + * (which is not copied and should not be modified) and a dataspace describing + * the chunk (for chunked dataset storage) (which should also not be modified). + * + * The "set_local" callback must set any parameters that are specific to this + * dataset, based on the combination of the dataset creation property list + * values, the datatype and the dataspace. For example, some filters perform + * different actions based on different datatypes (or datatype sizes) or + * different number of dimensions or dataspace sizes. + * + * The "set_local" callback can be the NULL pointer, in which case, the library + * will assume that there are no dataset-specific settings for this filter. + * + * The "set_local" callback must return non-negative on success and negative + * for an error. + */ +typedef herr_t (*H5Z_set_local_func_t)(hid_t dcpl_id, hid_t type_id, hid_t space_id); + +/* + * A filter gets definition flags and invocation flags (defined above), the + * client data array and size defined when the filter was added to the + * pipeline, the size in bytes of the data on which to operate, and pointers + * to a buffer and its allocated size. + * + * The filter should store the result in the supplied buffer if possible, + * otherwise it can allocate a new buffer, freeing the original. The + * allocated size of the new buffer should be returned through the BUF_SIZE + * pointer and the new buffer through the BUF pointer. + * + * The return value from the filter is the number of bytes in the output + * buffer. If an error occurs then the function should return zero and leave + * all pointer arguments unchanged. + */ +typedef size_t (*H5Z_func_t)(unsigned int flags, size_t cd_nelmts, + const unsigned int cd_values[], size_t nbytes, + size_t *buf_size, void **buf); + +/* + * The filter table maps filter identification numbers to structs that + * contain a pointers to the filter function and timing statistics. + */ +typedef struct H5Z_class2_t { + int version; /* Version number of the H5Z_class_t struct */ + H5Z_filter_t id; /* Filter ID number */ + unsigned encoder_present; /* Does this filter have an encoder? */ + unsigned decoder_present; /* Does this filter have a decoder? */ + const char *name; /* Comment for debugging */ + H5Z_can_apply_func_t can_apply; /* The "can apply" callback for a filter */ + H5Z_set_local_func_t set_local; /* The "set local" callback for a filter */ + H5Z_func_t filter; /* The actual filter function */ +} H5Z_class2_t; + +H5_DLL herr_t H5Zregister(const void *cls); +H5_DLL herr_t H5Zunregister(H5Z_filter_t id); +H5_DLL htri_t H5Zfilter_avail(H5Z_filter_t id); +H5_DLL herr_t H5Zget_filter_info(H5Z_filter_t filter, unsigned int *filter_config_flags); + +/* Symbols defined for compatibility with previous versions of the HDF5 API. + * + * Use of these symbols is deprecated. + */ +#ifndef H5_NO_DEPRECATED_SYMBOLS + +/* + * The filter table maps filter identification numbers to structs that + * contain a pointers to the filter function and timing statistics. + */ +typedef struct H5Z_class1_t { + H5Z_filter_t id; /* Filter ID number */ + const char *name; /* Comment for debugging */ + H5Z_can_apply_func_t can_apply; /* The "can apply" callback for a filter */ + H5Z_set_local_func_t set_local; /* The "set local" callback for a filter */ + H5Z_func_t filter; /* The actual filter function */ +} H5Z_class1_t; + +#endif /* H5_NO_DEPRECATED_SYMBOLS */ + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/privatemodules/nc4/include/H5api_adpt.h b/privatemodules/nc4/include/H5api_adpt.h new file mode 100644 index 0000000000000000000000000000000000000000..845a9a0c9753f1451afb45018bc18d21e66dfebc --- /dev/null +++ b/privatemodules/nc4/include/H5api_adpt.h @@ -0,0 +1,424 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * H5api_adpt.h + * Used for the HDF5 dll project + * Created by Patrick Lu on 1/12/99 + */ +#ifndef H5API_ADPT_H +#define H5API_ADPT_H + +/* This will only be defined if HDF5 was built with CMake */ +#ifdef H5_BUILT_AS_DYNAMIC_LIB + +#if defined (hdf5_EXPORTS) + #define _HDF5DLL_ +#else + #define _HDF5USEDLL_ +#endif + +#if defined (hdf5_test_EXPORTS) + #define _HDF5TESTDLL_ +#else + #define _HDF5TESTUSEDLL_ +#endif + +#if defined (hdf5_tools_EXPORTS) + #define _HDF5TOOLSDLL_ +#else + #define _HDF5TOOLSUSEDLL_ +#endif + +#if defined (hdf5_cpp_EXPORTS) + #define HDF5_CPPDLL_EXPORTS +#else + #define HDF5CPP_USEDLL +#endif + +#if defined (hdf5_hl_EXPORTS) + #define _HDF5_HLDLL_EXPORTS_ +#else + #define _HDF5USEHLDLL_ +#endif + +#if defined (hdf5_hl_cpp_EXPORTS) + #define HDF5_HL_CPPDLL_EXPORTS +#else + #define HDF5USE_HLCPPDLL +#endif + +#if defined (hdf5_f90cstub_EXPORTS) + #define HDF5FORT_CSTUB_DLL_EXPORTS +#else + #define HDF5FORT_CSTUB_USEDLL +#endif + +#if defined (hdf5_test_f90cstub_EXPORTS) + #define HDF5FORTTEST_CSTUB_DLL_EXPORTS +#endif + +#if defined (hdf5_hl_f90cstub_EXPORTS) + #define HDF5_HL_F90CSTUBDLL_EXPORTS +#endif + +#if defined(hdf5_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_DLL __declspec(dllexport) + #define H5_DLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_DLL __attribute__ ((visibility("default"))) + #define H5_DLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_DLL __declspec(dllimport) + #define H5_DLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_DLL __attribute__ ((visibility("default"))) + #define H5_DLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5_DLL + #define H5_DLL + #define H5_DLLVAR extern +#endif /* _HDF5DLL_ */ + +#if defined(hdf5_test_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5TEST_DLL __declspec(dllexport) + #define H5TEST_DLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5TEST_DLL __attribute__ ((visibility("default"))) + #define H5TEST_DLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5TEST_DLL __declspec(dllimport) + #define H5TEST_DLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5TEST_DLL __attribute__ ((visibility("default"))) + #define H5TEST_DLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5TEST_DLL + #define H5TEST_DLL + #define H5TEST_DLLVAR extern +#endif /* H5TEST_DLL */ + +#if defined(hdf5_tools_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5TOOLS_DLL __declspec(dllexport) + #define H5TOOLS_DLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5TOOLS_DLL __attribute__ ((visibility("default"))) + #define H5TOOLS_DLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5TOOLS_DLL __declspec(dllimport) + #define H5TOOLS_DLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5TOOLS_DLL __attribute__ ((visibility("default"))) + #define H5TOOLS_DLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5TOOLS_DLL + #define H5TOOLS_DLL + #define H5TOOLS_DLLVAR extern +#endif /* H5TOOLS_DLL */ + +#if defined(hdf5_cpp_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_DLLCPP __declspec(dllexport) + #define H5_DLLCPPVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_DLLCPP __attribute__ ((visibility("default"))) + #define H5_DLLCPPVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_DLLCPP __declspec(dllimport) + #define H5_DLLCPPVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_DLLCPP __attribute__ ((visibility("default"))) + #define H5_DLLCPPVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5_DLLCPP + #define H5_DLLCPP + #define H5_DLLCPPVAR extern +#endif /* H5_DLLCPP */ + +#if defined(hdf5_hl_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_HLDLL __declspec(dllexport) + #define H5_HLDLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_HLDLL __attribute__ ((visibility("default"))) + #define H5_HLDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_HLDLL __declspec(dllimport) + #define H5_HLDLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_HLDLL __attribute__ ((visibility("default"))) + #define H5_HLDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5_HLDLL + #define H5_HLDLL + #define H5_HLDLLVAR extern +#endif /* H5_HLDLL */ + +#if defined(hdf5_hl_cpp_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_HLCPPDLL __declspec(dllexport) + #define H5_HLCPPDLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_HLCPPDLL __attribute__ ((visibility("default"))) + #define H5_HLCPPDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_HLCPPDLL __declspec(dllimport) + #define H5_HLCPPDLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_HLCPPDLL __attribute__ ((visibility("default"))) + #define H5_HLCPPDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5_HLCPPDLL + #define H5_HLCPPDLL + #define H5_HLCPPDLLVAR extern +#endif /* H5_HLCPPDLL */ + +#if defined(hdf5_f90cstub_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_FCDLL __declspec(dllexport) + #define H5_FCDLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_FCDLL __attribute__ ((visibility("default"))) + #define H5_FCDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_FCDLL __declspec(dllimport) + #define H5_FCDLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_FCDLL __attribute__ ((visibility("default"))) + #define H5_FCDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5_FCDLL + #define H5_FCDLL + #define H5_FCDLLVAR extern +#endif /* H5_FCDLL */ + +#if defined(hdf5_test_f90cstub_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_FCTESTDLL __declspec(dllexport) + #define H5_FCTESTDLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_FCTESTDLL __attribute__ ((visibility("default"))) + #define H5_FCTESTDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define H5_FCTESTDLL __declspec(dllimport) + #define H5_FCTESTDLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define H5_FCTESTDLL __attribute__ ((visibility("default"))) + #define H5_FCTESTDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef H5_FCTESTDLL + #define H5_FCTESTDLL + #define H5_FCTESTDLLVAR extern +#endif /* H5_FCTESTDLL */ + +#if defined(hdf5_hl_f90cstub_EXPORTS) + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define HDF5_HL_F90CSTUBDLL __declspec(dllexport) + #define HDF5_HL_F90CSTUBDLLVAR extern __declspec(dllexport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define HDF5_HL_F90CSTUBDLL __attribute__ ((visibility("default"))) + #define HDF5_HL_F90CSTUBDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#else + #if defined (_MSC_VER) /* MSVC Compiler Case */ + #define HDF5_HL_F90CSTUBDLL __declspec(dllimport) + #define HDF5_HL_F90CSTUBDLLVAR __declspec(dllimport) + #elif (__GNUC__ >= 4) /* GCC 4.x has support for visibility options */ + #define HDF5_HL_F90CSTUBDLL __attribute__ ((visibility("default"))) + #define HDF5_HL_F90CSTUBDLLVAR extern __attribute__ ((visibility("default"))) + #endif +#endif + +#ifndef HDF5_HL_F90CSTUBDLL + #define HDF5_HL_F90CSTUBDLL + #define HDF5_HL_F90CSTUBDLLVAR extern +#endif /* HDF5_HL_F90CSTUBDLL */ + +#elif defined(H5_BUILT_AS_STATIC_LIB) + #define H5_DLL + #define H5_HLDLL + #define H5_HLCPPDLL + #define HDF5_HL_F90CSTUBDLL + #define H5_DLLVAR extern + #define H5_DLLCPP + #define H5TEST_DLL + #define H5TEST_DLLVAR extern + #define H5TOOLS_DLL + #define H5TOOLS_DLLVAR extern + #define H5_FCDLL + #define H5_FCDLLVAR extern + #define H5_FCTESTDLL + #define H5_FCTESTDLLVAR extern + +#else +/* This is the original HDFGroup defined preprocessor code which should still work + * with the VS projects that are maintained by "The HDF Group" + * The Visual Studio project files will not be supported in the next major release of 1.10. + */ + +#if defined(H5_HAVE_WIN32_API) + +#if defined(_HDF5DLL_) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define H5_DLL __declspec(dllexport) +#define H5_DLLVAR extern __declspec(dllexport) +#elif defined(_HDF5USEDLL_) +#define H5_DLL __declspec(dllimport) +#define H5_DLLVAR __declspec(dllimport) +#else +#define H5_DLL +#define H5_DLLVAR extern +#endif /* _HDF5DLL_ */ + +#if defined(_HDF5TESTDLL_) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define H5TEST_DLL __declspec(dllexport) +#define H5TEST_DLLVAR extern __declspec(dllexport) +#elif defined(_HDF5TESTUSEDLL_) +#define H5TEST_DLL __declspec(dllimport) +#define H5TEST_DLLVAR __declspec(dllimport) +#else +#define H5TEST_DLL +#define H5TEST_DLLVAR extern +#endif /* _HDF5TESTDLL_ */ + +#if defined(_HDF5TOOLSDLL_) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define H5TOOLS_DLL __declspec(dllexport) +#define H5TOOLS_DLLVAR extern __declspec(dllexport) +#elif defined(_HDF5TOOLSUSEDLL_) +#define H5TOOLS_DLL __declspec(dllimport) +#define H5TOOLS_DLLVAR __declspec(dllimport) +#else +#define H5TOOLS_DLL +#define H5TOOLS_DLLVAR extern +#endif /* _HDF5TOOLSDLL_ */ + +#if defined(_HDF5_HLDLL_EXPORTS_) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define H5_HLDLL __declspec(dllexport) +#elif defined(_HDF5USEHLDLL_) +#define H5_HLDLL __declspec(dllimport) +#else +#define H5_HLDLL +#endif /* _HDF5_HLDLL_EXPORTS */ + +#if defined(HDF5_HL_CPPDLL_EXPORTS) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define H5_HLCPPDLL __declspec(dllexport) +#elif defined(HDF5USE_HLCPPDLL) +#define H5_HLCPPDLL __declspec(dllimport) +#else +#define H5_HLCPPDLL +#endif /*HDF5_HL_CPPDLL_EXPORTS*/ + +#if defined(HDF5_HL_F90CSTUBDLL_EXPORTS) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define HDF5_HL_F90CSTUBDLL __declspec(dllexport) +#elif defined(HDF5USE_HLF90CSTUBDLL) +#define HDF5_HL_F90CSTUBDLL __declspec(dllimport) +#else +#define HDF5_HL_F90CSTUBDLL +#endif /*HDF5_HL_F90CSTUBDLL_EXPORTS*/ + + +#if defined(HDF5FORT_CSTUB_DLL_EXPORTS) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define H5_FCDLL __declspec(dllexport) +#define H5_FCDLLVAR extern __declspec(dllexport) +#elif defined(HDF5FORT_CSTUB_USEDLL) +#define H5_FCDLL __declspec(dllimport) +#define H5_FCDLLVAR __declspec(dllimport) +#else +#define H5_FCDLL +#define H5_FCDLLVAR extern +#endif /* _HDF5_FORTRANDLL_EXPORTS_ */ + +#if defined(HDF5FORTTEST_CSTUB_DLL_EXPORTS) +#pragma warning(disable: 4273) /* Disable the dll linkage warnings */ +#define H5_FCTESTDLL __declspec(dllexport) +#define H5_FCTESTDLLVAR extern __declspec(dllexport) +#elif defined(HDF5FORTTEST_CSTUB_USEDLL) +#define H5_FCTESTDLL __declspec(dllimport) +#define H5_FCTESTDLLVAR __declspec(dllimport) +#else +#define H5_FCTESTDLL +#define H5_FCTESTDLLVAR extern +#endif /* _HDF5_FORTRANDLL_EXPORTS_ */ + +/* Added to export or to import C++ APIs - BMR (02-15-2002) */ +#if defined(HDF5_CPPDLL_EXPORTS) /* this name is generated at creation */ +#define H5_DLLCPP __declspec(dllexport) +#elif defined(HDF5CPP_USEDLL) +#define H5_DLLCPP __declspec(dllimport) +#else +#define H5_DLLCPP +#endif /* HDF5_CPPDLL_EXPORTS */ + +#else /*H5_HAVE_WIN32_API*/ +#define H5_DLL +#define H5_HLDLL +#define H5_HLCPPDLL +#define HDF5_HL_F90CSTUBDLL +#define H5_DLLVAR extern +#define H5_DLLCPP +#define H5TEST_DLL +#define H5TEST_DLLVAR extern +#define H5TOOLS_DLL +#define H5TOOLS_DLLVAR extern +#define H5_FCDLL +#define H5_FCDLLVAR extern +#define H5_FCTESTDLL +#define H5_FCTESTDLLVAR extern +#endif /*H5_HAVE_WIN32_API*/ + +#endif /* H5API_ADPT_H */ + +#endif /* */ diff --git a/privatemodules/nc4/include/H5overflow.h b/privatemodules/nc4/include/H5overflow.h new file mode 100644 index 0000000000000000000000000000000000000000..f4064f439639654a7c97934da129e07d09eaf8cb --- /dev/null +++ b/privatemodules/nc4/include/H5overflow.h @@ -0,0 +1,1939 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_overflow -- do not edit */ +/* Add new types to H5overflow.txt file */ + + +#ifndef _H5overflow_H +#define _H5overflow_H + + +/* Each type in this file is tested for assignment to the other types, + * and range checks are defined for bad assignments at run-time. + */ + +/* Assignment checks for unsigned */ + +/* src: unsigned, dst: int */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_INT + #define ASSIGN_unsigned_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_INT + #define ASSIGN_unsigned_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_INT */ + #define ASSIGN_unsigned_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: int */ + +/* src: unsigned, dst: uint8_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT8_T + #define ASSIGN_unsigned_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT8_T + #define ASSIGN_unsigned_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT8_T */ + #define ASSIGN_unsigned_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: uint8_t */ + +/* src: unsigned, dst: uint16_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT16_T + #define ASSIGN_unsigned_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT16_T + #define ASSIGN_unsigned_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT16_T */ + #define ASSIGN_unsigned_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: uint16_t */ + +/* src: unsigned, dst: uint32_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT32_T + #define ASSIGN_unsigned_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT32_T + #define ASSIGN_unsigned_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT32_T */ + #define ASSIGN_unsigned_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: uint32_t */ + +/* src: unsigned, dst: uint64_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_UINT64_T + #define ASSIGN_unsigned_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_UINT64_T + #define ASSIGN_unsigned_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_UINT64_T */ + #define ASSIGN_unsigned_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: uint64_t */ + +/* src: unsigned, dst: ptrdiff_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_unsigned_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_unsigned_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_unsigned_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: ptrdiff_t */ + +/* src: unsigned, dst: size_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_SIZE_T + #define ASSIGN_unsigned_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_SIZE_T + #define ASSIGN_unsigned_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_SIZE_T */ + #define ASSIGN_unsigned_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: size_t */ + +/* src: unsigned, dst: ssize_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_SSIZE_T + #define ASSIGN_unsigned_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_SSIZE_T + #define ASSIGN_unsigned_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_unsigned_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: ssize_t */ + +/* src: unsigned, dst: haddr_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_HADDR_T + #define ASSIGN_unsigned_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_HADDR_T + #define ASSIGN_unsigned_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_HADDR_T */ + #define ASSIGN_unsigned_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: haddr_t */ + +/* src: unsigned, dst: hsize_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_HSIZE_T + #define ASSIGN_unsigned_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_HSIZE_T + #define ASSIGN_unsigned_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_unsigned_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: hsize_t */ + +/* src: unsigned, dst: hssize_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_HSSIZE_T + #define ASSIGN_unsigned_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_HSSIZE_T + #define ASSIGN_unsigned_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_unsigned_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: hssize_t */ + +/* src: unsigned, dst: h5_stat_size_t */ +#if H5_SIZEOF_UNSIGNED < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_unsigned_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UNSIGNED > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_unsigned_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UNSIGNED == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_unsigned_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: unsigned dst: h5_stat_size_t */ + + +/* Assignment checks for int */ + +/* src: int, dst: unsigned */ +#if H5_SIZEOF_INT < H5_SIZEOF_UNSIGNED + #define ASSIGN_int_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_UNSIGNED + #define ASSIGN_int_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_int_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: unsigned */ + +/* src: int, dst: uint8_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_UINT8_T + #define ASSIGN_int_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_UINT8_T + #define ASSIGN_int_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT8_T */ + #define ASSIGN_int_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: uint8_t */ + +/* src: int, dst: uint16_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_UINT16_T + #define ASSIGN_int_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_UINT16_T + #define ASSIGN_int_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT16_T */ + #define ASSIGN_int_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: uint16_t */ + +/* src: int, dst: uint32_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_UINT32_T + #define ASSIGN_int_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_UINT32_T + #define ASSIGN_int_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT32_T */ + #define ASSIGN_int_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: uint32_t */ + +/* src: int, dst: uint64_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_UINT64_T + #define ASSIGN_int_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_UINT64_T + #define ASSIGN_int_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_UINT64_T */ + #define ASSIGN_int_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: uint64_t */ + +/* src: int, dst: ptrdiff_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_int_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_int_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_int_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: ptrdiff_t */ + +/* src: int, dst: size_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_SIZE_T + #define ASSIGN_int_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_SIZE_T + #define ASSIGN_int_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_SIZE_T */ + #define ASSIGN_int_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: size_t */ + +/* src: int, dst: ssize_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_SSIZE_T + #define ASSIGN_int_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_SSIZE_T + #define ASSIGN_int_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_int_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: ssize_t */ + +/* src: int, dst: haddr_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_HADDR_T + #define ASSIGN_int_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_HADDR_T + #define ASSIGN_int_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_HADDR_T */ + #define ASSIGN_int_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: haddr_t */ + +/* src: int, dst: hsize_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_HSIZE_T + #define ASSIGN_int_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_HSIZE_T + #define ASSIGN_int_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_int_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: hsize_t */ + +/* src: int, dst: hssize_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_HSSIZE_T + #define ASSIGN_int_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_HSSIZE_T + #define ASSIGN_int_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_int_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: hssize_t */ + +/* src: int, dst: h5_stat_size_t */ +#if H5_SIZEOF_INT < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_int_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_INT > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_int_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_INT == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_int_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: int dst: h5_stat_size_t */ + + +/* Assignment checks for uint8_t */ + +/* src: uint8_t, dst: unsigned */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_uint8_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_uint8_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_uint8_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: unsigned */ + +/* src: uint8_t, dst: int */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_INT + #define ASSIGN_uint8_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_INT + #define ASSIGN_uint8_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_INT */ + #define ASSIGN_uint8_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: int */ + +/* src: uint8_t, dst: uint16_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UINT16_T + #define ASSIGN_uint8_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UINT16_T + #define ASSIGN_uint8_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_uint8_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: uint16_t */ + +/* src: uint8_t, dst: uint32_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UINT32_T + #define ASSIGN_uint8_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UINT32_T + #define ASSIGN_uint8_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_uint8_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: uint32_t */ + +/* src: uint8_t, dst: uint64_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_UINT64_T + #define ASSIGN_uint8_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_UINT64_T + #define ASSIGN_uint8_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_uint8_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: uint64_t */ + +/* src: uint8_t, dst: ptrdiff_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint8_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint8_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_uint8_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: ptrdiff_t */ + +/* src: uint8_t, dst: size_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_SIZE_T + #define ASSIGN_uint8_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_SIZE_T + #define ASSIGN_uint8_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_uint8_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: size_t */ + +/* src: uint8_t, dst: ssize_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_uint8_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_uint8_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_uint8_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: ssize_t */ + +/* src: uint8_t, dst: haddr_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_HADDR_T + #define ASSIGN_uint8_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_HADDR_T + #define ASSIGN_uint8_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_uint8_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: haddr_t */ + +/* src: uint8_t, dst: hsize_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_uint8_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_uint8_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_uint8_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: hsize_t */ + +/* src: uint8_t, dst: hssize_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint8_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint8_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_uint8_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: hssize_t */ + +/* src: uint8_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_UINT8_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint8_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT8_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint8_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT8_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_uint8_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint8_t dst: h5_stat_size_t */ + + +/* Assignment checks for uint16_t */ + +/* src: uint16_t, dst: unsigned */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_uint16_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_uint16_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_uint16_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: unsigned */ + +/* src: uint16_t, dst: int */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_INT + #define ASSIGN_uint16_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_INT + #define ASSIGN_uint16_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_INT */ + #define ASSIGN_uint16_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: int */ + +/* src: uint16_t, dst: uint8_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UINT8_T + #define ASSIGN_uint16_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UINT8_T + #define ASSIGN_uint16_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_uint16_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: uint8_t */ + +/* src: uint16_t, dst: uint32_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UINT32_T + #define ASSIGN_uint16_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UINT32_T + #define ASSIGN_uint16_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_uint16_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: uint32_t */ + +/* src: uint16_t, dst: uint64_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_UINT64_T + #define ASSIGN_uint16_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_UINT64_T + #define ASSIGN_uint16_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_uint16_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: uint64_t */ + +/* src: uint16_t, dst: ptrdiff_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint16_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint16_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_uint16_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: ptrdiff_t */ + +/* src: uint16_t, dst: size_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_SIZE_T + #define ASSIGN_uint16_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_SIZE_T + #define ASSIGN_uint16_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_uint16_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: size_t */ + +/* src: uint16_t, dst: ssize_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_uint16_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_uint16_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_uint16_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: ssize_t */ + +/* src: uint16_t, dst: haddr_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_HADDR_T + #define ASSIGN_uint16_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_HADDR_T + #define ASSIGN_uint16_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_uint16_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: haddr_t */ + +/* src: uint16_t, dst: hsize_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_uint16_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_uint16_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_uint16_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: hsize_t */ + +/* src: uint16_t, dst: hssize_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint16_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint16_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_uint16_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: hssize_t */ + +/* src: uint16_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_UINT16_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint16_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT16_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint16_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT16_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_uint16_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint16_t dst: h5_stat_size_t */ + + +/* Assignment checks for uint32_t */ + +/* src: uint32_t, dst: unsigned */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_uint32_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_uint32_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_uint32_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: unsigned */ + +/* src: uint32_t, dst: int */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_INT + #define ASSIGN_uint32_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_INT + #define ASSIGN_uint32_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_INT */ + #define ASSIGN_uint32_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: int */ + +/* src: uint32_t, dst: uint8_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UINT8_T + #define ASSIGN_uint32_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UINT8_T + #define ASSIGN_uint32_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_uint32_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: uint8_t */ + +/* src: uint32_t, dst: uint16_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UINT16_T + #define ASSIGN_uint32_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UINT16_T + #define ASSIGN_uint32_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_uint32_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: uint16_t */ + +/* src: uint32_t, dst: uint64_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_UINT64_T + #define ASSIGN_uint32_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_UINT64_T + #define ASSIGN_uint32_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_uint32_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: uint64_t */ + +/* src: uint32_t, dst: ptrdiff_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint32_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint32_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_uint32_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: ptrdiff_t */ + +/* src: uint32_t, dst: size_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_SIZE_T + #define ASSIGN_uint32_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_SIZE_T + #define ASSIGN_uint32_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_uint32_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: size_t */ + +/* src: uint32_t, dst: ssize_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_uint32_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_uint32_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_uint32_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: ssize_t */ + +/* src: uint32_t, dst: haddr_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_HADDR_T + #define ASSIGN_uint32_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_HADDR_T + #define ASSIGN_uint32_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_uint32_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: haddr_t */ + +/* src: uint32_t, dst: hsize_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_uint32_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_uint32_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_uint32_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: hsize_t */ + +/* src: uint32_t, dst: hssize_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint32_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint32_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_uint32_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: hssize_t */ + +/* src: uint32_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_UINT32_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint32_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT32_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint32_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT32_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_uint32_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint32_t dst: h5_stat_size_t */ + + +/* Assignment checks for uint64_t */ + +/* src: uint64_t, dst: unsigned */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_uint64_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_uint64_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_uint64_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: unsigned */ + +/* src: uint64_t, dst: int */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_INT + #define ASSIGN_uint64_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_INT + #define ASSIGN_uint64_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_INT */ + #define ASSIGN_uint64_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: int */ + +/* src: uint64_t, dst: uint8_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UINT8_T + #define ASSIGN_uint64_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UINT8_T + #define ASSIGN_uint64_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_uint64_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: uint8_t */ + +/* src: uint64_t, dst: uint16_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UINT16_T + #define ASSIGN_uint64_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UINT16_T + #define ASSIGN_uint64_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_uint64_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: uint16_t */ + +/* src: uint64_t, dst: uint32_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_UINT32_T + #define ASSIGN_uint64_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_UINT32_T + #define ASSIGN_uint64_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_uint64_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: uint32_t */ + +/* src: uint64_t, dst: ptrdiff_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_uint64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_uint64_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: ptrdiff_t */ + +/* src: uint64_t, dst: size_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_SIZE_T + #define ASSIGN_uint64_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_SIZE_T + #define ASSIGN_uint64_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_uint64_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: size_t */ + +/* src: uint64_t, dst: ssize_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_uint64_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_uint64_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_uint64_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: ssize_t */ + +/* src: uint64_t, dst: haddr_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_HADDR_T + #define ASSIGN_uint64_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_HADDR_T + #define ASSIGN_uint64_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_uint64_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: haddr_t */ + +/* src: uint64_t, dst: hsize_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_uint64_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_uint64_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_uint64_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: hsize_t */ + +/* src: uint64_t, dst: hssize_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint64_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_uint64_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_uint64_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: hssize_t */ + +/* src: uint64_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_UINT64_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_UINT64_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_uint64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_UINT64_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_uint64_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: uint64_t dst: h5_stat_size_t */ + + +/* Assignment checks for ptrdiff_t */ + +/* src: ptrdiff_t, dst: unsigned */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_ptrdiff_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_ptrdiff_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_ptrdiff_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: unsigned */ + +/* src: ptrdiff_t, dst: int */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_INT + #define ASSIGN_ptrdiff_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_INT + #define ASSIGN_ptrdiff_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_INT */ + #define ASSIGN_ptrdiff_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: int */ + +/* src: ptrdiff_t, dst: uint8_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT8_T + #define ASSIGN_ptrdiff_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT8_T + #define ASSIGN_ptrdiff_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_ptrdiff_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: uint8_t */ + +/* src: ptrdiff_t, dst: uint16_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT16_T + #define ASSIGN_ptrdiff_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT16_T + #define ASSIGN_ptrdiff_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_ptrdiff_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: uint16_t */ + +/* src: ptrdiff_t, dst: uint32_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT32_T + #define ASSIGN_ptrdiff_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT32_T + #define ASSIGN_ptrdiff_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_ptrdiff_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: uint32_t */ + +/* src: ptrdiff_t, dst: uint64_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_UINT64_T + #define ASSIGN_ptrdiff_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_UINT64_T + #define ASSIGN_ptrdiff_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_ptrdiff_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: uint64_t */ + +/* src: ptrdiff_t, dst: size_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_SIZE_T + #define ASSIGN_ptrdiff_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_SIZE_T + #define ASSIGN_ptrdiff_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_ptrdiff_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: size_t */ + +/* src: ptrdiff_t, dst: ssize_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_ptrdiff_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_ptrdiff_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_ptrdiff_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: ssize_t */ + +/* src: ptrdiff_t, dst: haddr_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_HADDR_T + #define ASSIGN_ptrdiff_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_HADDR_T + #define ASSIGN_ptrdiff_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_ptrdiff_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: haddr_t */ + +/* src: ptrdiff_t, dst: hsize_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_ptrdiff_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_ptrdiff_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_ptrdiff_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: hsize_t */ + +/* src: ptrdiff_t, dst: hssize_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_ptrdiff_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_ptrdiff_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_ptrdiff_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: hssize_t */ + +/* src: ptrdiff_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_PTRDIFF_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_ptrdiff_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_PTRDIFF_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_ptrdiff_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_PTRDIFF_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_ptrdiff_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ptrdiff_t dst: h5_stat_size_t */ + + +/* Assignment checks for size_t */ + +/* src: size_t, dst: unsigned */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_size_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_size_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_size_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: unsigned */ + +/* src: size_t, dst: int */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_INT + #define ASSIGN_size_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_INT + #define ASSIGN_size_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_INT */ + #define ASSIGN_size_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: int */ + +/* src: size_t, dst: uint8_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT8_T + #define ASSIGN_size_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT8_T + #define ASSIGN_size_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_size_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: uint8_t */ + +/* src: size_t, dst: uint16_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT16_T + #define ASSIGN_size_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT16_T + #define ASSIGN_size_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_size_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: uint16_t */ + +/* src: size_t, dst: uint32_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT32_T + #define ASSIGN_size_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT32_T + #define ASSIGN_size_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_size_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: uint32_t */ + +/* src: size_t, dst: uint64_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_UINT64_T + #define ASSIGN_size_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_UINT64_T + #define ASSIGN_size_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_size_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: uint64_t */ + +/* src: size_t, dst: ptrdiff_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: ptrdiff_t */ + +/* src: size_t, dst: ssize_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_size_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_size_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_size_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: ssize_t */ + +/* src: size_t, dst: haddr_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_HADDR_T + #define ASSIGN_size_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_HADDR_T + #define ASSIGN_size_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_size_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: haddr_t */ + +/* src: size_t, dst: hsize_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_size_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_size_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_size_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: hsize_t */ + +/* src: size_t, dst: hssize_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_size_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_size_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_size_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: hssize_t */ + +/* src: size_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_SIZE_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_size_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SIZE_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_size_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_size_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: size_t dst: h5_stat_size_t */ + + +/* Assignment checks for ssize_t */ + +/* src: ssize_t, dst: unsigned */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_ssize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_ssize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_ssize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: unsigned */ + +/* src: ssize_t, dst: int */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_INT + #define ASSIGN_ssize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_INT + #define ASSIGN_ssize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_INT */ + #define ASSIGN_ssize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: int */ + +/* src: ssize_t, dst: uint8_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT8_T + #define ASSIGN_ssize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT8_T + #define ASSIGN_ssize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_ssize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: uint8_t */ + +/* src: ssize_t, dst: uint16_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT16_T + #define ASSIGN_ssize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT16_T + #define ASSIGN_ssize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_ssize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: uint16_t */ + +/* src: ssize_t, dst: uint32_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT32_T + #define ASSIGN_ssize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT32_T + #define ASSIGN_ssize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_ssize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: uint32_t */ + +/* src: ssize_t, dst: uint64_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_UINT64_T + #define ASSIGN_ssize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_UINT64_T + #define ASSIGN_ssize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_ssize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: uint64_t */ + +/* src: ssize_t, dst: ptrdiff_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_ssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_ssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_ssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: ptrdiff_t */ + +/* src: ssize_t, dst: size_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_SIZE_T + #define ASSIGN_ssize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_SIZE_T + #define ASSIGN_ssize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_ssize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: size_t */ + +/* src: ssize_t, dst: haddr_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_HADDR_T + #define ASSIGN_ssize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_HADDR_T + #define ASSIGN_ssize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_ssize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: haddr_t */ + +/* src: ssize_t, dst: hsize_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_ssize_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_ssize_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_ssize_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: hsize_t */ + +/* src: ssize_t, dst: hssize_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_ssize_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_ssize_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_ssize_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: hssize_t */ + +/* src: ssize_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_SSIZE_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_ssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_SSIZE_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_ssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_SSIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_ssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: ssize_t dst: h5_stat_size_t */ + + +/* Assignment checks for haddr_t */ + +/* src: haddr_t, dst: unsigned */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_haddr_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_haddr_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_haddr_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: unsigned */ + +/* src: haddr_t, dst: int */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_INT + #define ASSIGN_haddr_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_INT + #define ASSIGN_haddr_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_INT */ + #define ASSIGN_haddr_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: int */ + +/* src: haddr_t, dst: uint8_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT8_T + #define ASSIGN_haddr_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT8_T + #define ASSIGN_haddr_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_haddr_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: uint8_t */ + +/* src: haddr_t, dst: uint16_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT16_T + #define ASSIGN_haddr_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT16_T + #define ASSIGN_haddr_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_haddr_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: uint16_t */ + +/* src: haddr_t, dst: uint32_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT32_T + #define ASSIGN_haddr_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT32_T + #define ASSIGN_haddr_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_haddr_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: uint32_t */ + +/* src: haddr_t, dst: uint64_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_UINT64_T + #define ASSIGN_haddr_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_UINT64_T + #define ASSIGN_haddr_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_haddr_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: uint64_t */ + +/* src: haddr_t, dst: ptrdiff_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_haddr_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_haddr_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_haddr_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: ptrdiff_t */ + +/* src: haddr_t, dst: size_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_SIZE_T + #define ASSIGN_haddr_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_SIZE_T + #define ASSIGN_haddr_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_haddr_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: size_t */ + +/* src: haddr_t, dst: ssize_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_haddr_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_haddr_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_haddr_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: ssize_t */ + +/* src: haddr_t, dst: hsize_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_haddr_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_haddr_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_haddr_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: hsize_t */ + +/* src: haddr_t, dst: hssize_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_haddr_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_haddr_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_haddr_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: hssize_t */ + +/* src: haddr_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_HADDR_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_haddr_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HADDR_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_haddr_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HADDR_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_haddr_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: haddr_t dst: h5_stat_size_t */ + + +/* Assignment checks for hsize_t */ + +/* src: hsize_t, dst: unsigned */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_hsize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_hsize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_hsize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: unsigned */ + +/* src: hsize_t, dst: int */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_INT + #define ASSIGN_hsize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_INT + #define ASSIGN_hsize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_INT */ + #define ASSIGN_hsize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: int */ + +/* src: hsize_t, dst: uint8_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT8_T + #define ASSIGN_hsize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT8_T + #define ASSIGN_hsize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_hsize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: uint8_t */ + +/* src: hsize_t, dst: uint16_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT16_T + #define ASSIGN_hsize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT16_T + #define ASSIGN_hsize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_hsize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: uint16_t */ + +/* src: hsize_t, dst: uint32_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT32_T + #define ASSIGN_hsize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT32_T + #define ASSIGN_hsize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_hsize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: uint32_t */ + +/* src: hsize_t, dst: uint64_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_UINT64_T + #define ASSIGN_hsize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_UINT64_T + #define ASSIGN_hsize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_hsize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: uint64_t */ + +/* src: hsize_t, dst: ptrdiff_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_hsize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_hsize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_hsize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: ptrdiff_t */ + +/* src: hsize_t, dst: size_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_SIZE_T + #define ASSIGN_hsize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_SIZE_T + #define ASSIGN_hsize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_hsize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: size_t */ + +/* src: hsize_t, dst: ssize_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_hsize_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_hsize_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_hsize_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: ssize_t */ + +/* src: hsize_t, dst: haddr_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_HADDR_T + #define ASSIGN_hsize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_HADDR_T + #define ASSIGN_hsize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_hsize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: haddr_t */ + +/* src: hsize_t, dst: hssize_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_hsize_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_hsize_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_hsize_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: hssize_t */ + +/* src: hsize_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_HSIZE_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_hsize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSIZE_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_hsize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_hsize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hsize_t dst: h5_stat_size_t */ + + +/* Assignment checks for hssize_t */ + +/* src: hssize_t, dst: unsigned */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_hssize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_hssize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_hssize_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: unsigned */ + +/* src: hssize_t, dst: int */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_INT + #define ASSIGN_hssize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_INT + #define ASSIGN_hssize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_INT */ + #define ASSIGN_hssize_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: int */ + +/* src: hssize_t, dst: uint8_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT8_T + #define ASSIGN_hssize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT8_T + #define ASSIGN_hssize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_hssize_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: uint8_t */ + +/* src: hssize_t, dst: uint16_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT16_T + #define ASSIGN_hssize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT16_T + #define ASSIGN_hssize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_hssize_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: uint16_t */ + +/* src: hssize_t, dst: uint32_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT32_T + #define ASSIGN_hssize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT32_T + #define ASSIGN_hssize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_hssize_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: uint32_t */ + +/* src: hssize_t, dst: uint64_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_UINT64_T + #define ASSIGN_hssize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_UINT64_T + #define ASSIGN_hssize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_hssize_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: uint64_t */ + +/* src: hssize_t, dst: ptrdiff_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_hssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_hssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_hssize_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: ptrdiff_t */ + +/* src: hssize_t, dst: size_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_SIZE_T + #define ASSIGN_hssize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_SIZE_T + #define ASSIGN_hssize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_hssize_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: size_t */ + +/* src: hssize_t, dst: ssize_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_hssize_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_hssize_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_hssize_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: ssize_t */ + +/* src: hssize_t, dst: haddr_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_HADDR_T + #define ASSIGN_hssize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_HADDR_T + #define ASSIGN_hssize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_hssize_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: haddr_t */ + +/* src: hssize_t, dst: hsize_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_hssize_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_hssize_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_hssize_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: hsize_t */ + +/* src: hssize_t, dst: h5_stat_size_t */ +#if H5_SIZEOF_HSSIZE_T < H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_hssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_HSSIZE_T > H5_SIZEOF_H5_STAT_SIZE_T + #define ASSIGN_hssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_HSSIZE_T == H5_SIZEOF_H5_STAT_SIZE_T */ + #define ASSIGN_hssize_t_TO_h5_stat_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SIGNED_TO_UNSIGNED(dst, dsttype, src, srctype) +#endif /* src: hssize_t dst: h5_stat_size_t */ + + +/* Assignment checks for h5_stat_size_t */ + +/* src: h5_stat_size_t, dst: unsigned */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UNSIGNED + #define ASSIGN_h5_stat_size_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UNSIGNED + #define ASSIGN_h5_stat_size_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UNSIGNED */ + #define ASSIGN_h5_stat_size_t_TO_unsigned(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: unsigned */ + +/* src: h5_stat_size_t, dst: int */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_INT + #define ASSIGN_h5_stat_size_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_INT + #define ASSIGN_h5_stat_size_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_INT */ + #define ASSIGN_h5_stat_size_t_TO_int(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: int */ + +/* src: h5_stat_size_t, dst: uint8_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT8_T + #define ASSIGN_h5_stat_size_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT8_T + #define ASSIGN_h5_stat_size_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT8_T */ + #define ASSIGN_h5_stat_size_t_TO_uint8_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: uint8_t */ + +/* src: h5_stat_size_t, dst: uint16_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT16_T + #define ASSIGN_h5_stat_size_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT16_T + #define ASSIGN_h5_stat_size_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT16_T */ + #define ASSIGN_h5_stat_size_t_TO_uint16_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: uint16_t */ + +/* src: h5_stat_size_t, dst: uint32_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT32_T + #define ASSIGN_h5_stat_size_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT32_T + #define ASSIGN_h5_stat_size_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT32_T */ + #define ASSIGN_h5_stat_size_t_TO_uint32_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: uint32_t */ + +/* src: h5_stat_size_t, dst: uint64_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_UINT64_T + #define ASSIGN_h5_stat_size_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_UINT64_T + #define ASSIGN_h5_stat_size_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_UINT64_T */ + #define ASSIGN_h5_stat_size_t_TO_uint64_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: uint64_t */ + +/* src: h5_stat_size_t, dst: ptrdiff_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_PTRDIFF_T + #define ASSIGN_h5_stat_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_PTRDIFF_T + #define ASSIGN_h5_stat_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_PTRDIFF_T */ + #define ASSIGN_h5_stat_size_t_TO_ptrdiff_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: ptrdiff_t */ + +/* src: h5_stat_size_t, dst: size_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_SIZE_T + #define ASSIGN_h5_stat_size_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_SIZE_T + #define ASSIGN_h5_stat_size_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_SIZE_T */ + #define ASSIGN_h5_stat_size_t_TO_size_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: size_t */ + +/* src: h5_stat_size_t, dst: ssize_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_SSIZE_T + #define ASSIGN_h5_stat_size_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_SSIZE_T + #define ASSIGN_h5_stat_size_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_SSIZE_T */ + #define ASSIGN_h5_stat_size_t_TO_ssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: ssize_t */ + +/* src: h5_stat_size_t, dst: haddr_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_HADDR_T + #define ASSIGN_h5_stat_size_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_HADDR_T + #define ASSIGN_h5_stat_size_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_HADDR_T */ + #define ASSIGN_h5_stat_size_t_TO_haddr_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: haddr_t */ + +/* src: h5_stat_size_t, dst: hsize_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_HSIZE_T + #define ASSIGN_h5_stat_size_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_HSIZE_T + #define ASSIGN_h5_stat_size_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_HSIZE_T */ + #define ASSIGN_h5_stat_size_t_TO_hsize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_SAME_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: hsize_t */ + +/* src: h5_stat_size_t, dst: hssize_t */ +#if H5_SIZEOF_H5_STAT_SIZE_T < H5_SIZEOF_HSSIZE_T + #define ASSIGN_h5_stat_size_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_LARGER_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#elif H5_SIZEOF_H5_STAT_SIZE_T > H5_SIZEOF_HSSIZE_T + #define ASSIGN_h5_stat_size_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SMALLER_SIZE(dst, dsttype, src, srctype) +#else /* H5_SIZEOF_H5_STAT_SIZE_T == H5_SIZEOF_HSSIZE_T */ + #define ASSIGN_h5_stat_size_t_TO_hssize_t(dst, dsttype, src, srctype) \ + ASSIGN_TO_SAME_SIZE_UNSIGNED_TO_SIGNED(dst, dsttype, src, srctype) +#endif /* src: h5_stat_size_t dst: hssize_t */ + +#endif /* H5overflow_H */ + diff --git a/privatemodules/nc4/include/H5pubconf.h b/privatemodules/nc4/include/H5pubconf.h new file mode 100644 index 0000000000000000000000000000000000000000..cfa33dbc227476fa038d4a55989b0ba343c11b7f --- /dev/null +++ b/privatemodules/nc4/include/H5pubconf.h @@ -0,0 +1,724 @@ +/* src/H5config.h. Generated from H5config.h.in by configure. */ +/* src/H5config.h.in. Generated from configure.ac by autoheader. */ + +/* Define if building universal (internal helper macro) */ +/* #undef H5_AC_APPLE_UNIVERSAL_BUILD */ + +/* Define if your system generates wrong code for log2 routine. */ +/* #undef H5_BAD_LOG2_CODE_GENERATED */ + +/* Define if the memory buffers being written to disk should be cleared before + writing. */ +#define H5_CLEAR_MEMORY 1 + +/* Define if your system can handle converting denormalized floating-point + values. */ +#define H5_CONVERT_DENORMAL_FLOAT 1 + +/* Define if C++ compiler recognizes offsetof */ +/* #undef H5_CXX_HAVE_OFFSETOF */ + +/* Define the default plugins path to compile */ +#define H5_DEFAULT_PLUGINDIR "/usr/local/hdf5/lib/plugin" + +/* Define the default virtual file driver to compile */ +#define H5_DEFAULT_VFD H5FD_SEC2 + +/* Define if `dev_t' is a scalar */ +#define H5_DEV_T_IS_SCALAR 1 + +/* Define to dummy `main' function (if any) required to link to the Fortran + libraries. */ +/* #undef H5_FC_DUMMY_MAIN */ + +/* Define if F77 and FC dummy `main' functions are identical. */ +/* #undef H5_FC_DUMMY_MAIN_EQ_F77 */ + +/* Define to a macro mangling the given C identifier (in lower and upper + case), which must not contain underscores, for linking with Fortran. */ +/* #undef H5_FC_FUNC */ + +/* As FC_FUNC, but for C identifiers containing underscores. */ +/* #undef H5_FC_FUNC_ */ + +/* Define if your system can handle overflow converting floating-point to + integer values. */ +#define H5_FP_TO_INTEGER_OVERFLOW_WORKS 1 + +/* Define if your system roundup accurately converting floating-point to + unsigned long long values. */ +#define H5_FP_TO_ULLONG_ACCURATE 1 + +/* Define if your system has right maximum convert floating-point to unsigned + long long values. */ +#define H5_FP_TO_ULLONG_RIGHT_MAXIMUM 1 + +/* Define if gettimeofday() populates the tz pointer passed in */ +#define H5_GETTIMEOFDAY_GIVES_TZ 1 + +/* Define to 1 if you have the `alarm' function. */ +#define H5_HAVE_ALARM 1 + +/* Define if the __attribute__(()) extension is present */ +#define H5_HAVE_ATTRIBUTE 1 + +/* Define to 1 if you have the `BSDgettimeofday' function. */ +/* #undef H5_HAVE_BSDGETTIMEOFDAY */ + +/* Define if the compiler understands C99 designated initialization of structs + and unions */ +#define H5_HAVE_C99_DESIGNATED_INITIALIZER 1 + +/* Define if the compiler understands the __func__ keyword */ +#define H5_HAVE_C99_FUNC 1 + +/* Define to 1 if you have the `clock_gettime' function. */ +#define H5_HAVE_CLOCK_GETTIME 1 + +/* Define if the function stack tracing code is to be compiled in */ +/* #undef H5_HAVE_CODESTACK */ + +/* Define if Darwin or Mac OS X */ +/* #undef H5_HAVE_DARWIN */ + +/* Define to 1 if you have the declaration of `tzname', and to 0 if you don't. + */ +/* #undef H5_HAVE_DECL_TZNAME */ + +/* Define to 1 if you have the `difftime' function. */ +#define H5_HAVE_DIFFTIME 1 + +/* Define if the direct I/O virtual file driver should be compiled */ +/* #undef H5_HAVE_DIRECT */ + +/* Define to 1 if you have the <dirent.h> header file. */ +#define H5_HAVE_DIRENT_H 1 + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#define H5_HAVE_DLFCN_H 1 + +/* Define to 1 if you have the <dmalloc.h> header file. */ +/* #undef H5_HAVE_DMALLOC_H */ + +/* Define if library information should be embedded in the executables */ +#define H5_HAVE_EMBEDDED_LIBINFO 1 + +/* Define to 1 if you have the <features.h> header file. */ +#define H5_HAVE_FEATURES_H 1 + +/* Define if support for deflate (zlib) filter is enabled */ +#define H5_HAVE_FILTER_DEFLATE 1 + +/* Define if support for Fletcher32 checksum is enabled */ +#define H5_HAVE_FILTER_FLETCHER32 1 + +/* Define if support for nbit filter is enabled */ +#define H5_HAVE_FILTER_NBIT 1 + +/* Define if support for scaleoffset filter is enabled */ +#define H5_HAVE_FILTER_SCALEOFFSET 1 + +/* Define if support for shuffle filter is enabled */ +#define H5_HAVE_FILTER_SHUFFLE 1 + +/* Define if support for szip filter is enabled */ +/* #undef H5_HAVE_FILTER_SZIP */ + +/* Define to 1 if you have the `fork' function. */ +#define H5_HAVE_FORK 1 + +/* Define to 1 if you have the `frexpf' function. */ +#define H5_HAVE_FREXPF 1 + +/* Define to 1 if you have the `frexpl' function. */ +#define H5_HAVE_FREXPL 1 + +/* Define to 1 if you have the `fseeko' function. */ +#define H5_HAVE_FSEEKO 1 + +/* Define to 1 if you have the `fseeko64' function. */ +#define H5_HAVE_FSEEKO64 1 + +/* Define to 1 if you have the `fstat64' function. */ +#define H5_HAVE_FSTAT64 1 + +/* Define to 1 if you have the `ftello' function. */ +#define H5_HAVE_FTELLO 1 + +/* Define to 1 if you have the `ftello64' function. */ +#define H5_HAVE_FTELLO64 1 + +/* Define to 1 if you have the `ftruncate64' function. */ +#define H5_HAVE_FTRUNCATE64 1 + +/* Define if the compiler understands the __FUNCTION__ keyword */ +#define H5_HAVE_FUNCTION 1 + +/* Define to 1 if you have the `GetConsoleScreenBufferInfo' function. */ +/* #undef H5_HAVE_GETCONSOLESCREENBUFFERINFO */ + +/* Define to 1 if you have the `gethostname' function. */ +#define H5_HAVE_GETHOSTNAME 1 + +/* Define to 1 if you have the `getpwuid' function. */ +#define H5_HAVE_GETPWUID 1 + +/* Define to 1 if you have the `getrusage' function. */ +#define H5_HAVE_GETRUSAGE 1 + +/* Define to 1 if you have the `gettextinfo' function. */ +/* #undef H5_HAVE_GETTEXTINFO */ + +/* Define to 1 if you have the `gettimeofday' function. */ +#define H5_HAVE_GETTIMEOFDAY 1 + +/* Define to 1 if you have the `get_fpc_csr' function. */ +/* #undef H5_HAVE_GET_FPC_CSR */ + +/* Define if library will contain instrumentation to detect correct + optimization operation */ +/* #undef H5_HAVE_INSTRUMENTED_LIBRARY */ + +/* Define to 1 if you have the <inttypes.h> header file. */ +#define H5_HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `ioctl' function. */ +#define H5_HAVE_IOCTL 1 + +/* Define to 1 if you have the <io.h> header file. */ +/* #undef H5_HAVE_IO_H */ + +/* Define to 1 if you have the `dl' library (-ldl). */ +#define H5_HAVE_LIBDL 1 + +/* Define to 1 if you have the `dmalloc' library (-ldmalloc). */ +/* #undef H5_HAVE_LIBDMALLOC */ + +/* Define to 1 if you have the `lmpe' library (-llmpe). */ +/* #undef H5_HAVE_LIBLMPE */ + +/* Define to 1 if you have the `m' library (-lm). */ +#define H5_HAVE_LIBM 1 + +/* Define to 1 if you have the `mpe' library (-lmpe). */ +/* #undef H5_HAVE_LIBMPE */ + +/* Define to 1 if you have the `mpi' library (-lmpi). */ +/* #undef H5_HAVE_LIBMPI */ + +/* Define to 1 if you have the `mpich' library (-lmpich). */ +/* #undef H5_HAVE_LIBMPICH */ + +/* Define to 1 if you have the `mpio' library (-lmpio). */ +/* #undef H5_HAVE_LIBMPIO */ + +/* Define to 1 if you have the `nsl' library (-lnsl). */ +/* #undef H5_HAVE_LIBNSL */ + +/* Define to 1 if you have the `pthread' library (-lpthread). */ +/* #undef H5_HAVE_LIBPTHREAD */ + +/* Define to 1 if you have the `socket' library (-lsocket). */ +/* #undef H5_HAVE_LIBSOCKET */ + +/* Define to 1 if you have the `sz' library (-lsz). */ +/* #undef H5_HAVE_LIBSZ */ + +/* Define to 1 if you have the `ws2_32' library (-lws2_32). */ +/* #undef H5_HAVE_LIBWS2_32 */ + +/* Define to 1 if you have the `z' library (-lz). */ +#define H5_HAVE_LIBZ 1 + +/* Define to 1 if you have the `longjmp' function. */ +#define H5_HAVE_LONGJMP 1 + +/* Define to 1 if you have the `lseek64' function. */ +#define H5_HAVE_LSEEK64 1 + +/* Define to 1 if you have the `lstat' function. */ +#define H5_HAVE_LSTAT 1 + +/* Define to 1 if you have the <mach/mach_time.h> header file. */ +/* #undef H5_HAVE_MACH_MACH_TIME_H */ + +/* Define to 1 if you have the <memory.h> header file. */ +#define H5_HAVE_MEMORY_H 1 + +/* Define if we have MPE support */ +/* #undef H5_HAVE_MPE */ + +/* Define to 1 if you have the <mpe.h> header file. */ +/* #undef H5_HAVE_MPE_H */ + +/* Define if MPI_File_get_size works correctly */ +/* #undef H5_HAVE_MPI_GET_SIZE */ + +/* Define if `MPI_Comm_c2f' and `MPI_Comm_f2c' exists */ +/* #undef H5_HAVE_MPI_MULTI_LANG_Comm */ + +/* Define if `MPI_Info_c2f' and `MPI_Info_f2c' exists */ +/* #undef H5_HAVE_MPI_MULTI_LANG_Info */ + +/* Define if we have parallel support */ +/* #undef H5_HAVE_PARALLEL */ + +/* Define to 1 if you have the <pthread.h> header file. */ +/* #undef H5_HAVE_PTHREAD_H */ + +/* Define to 1 if you have the `random' function. */ +#define H5_HAVE_RANDOM 1 + +/* Define to 1 if you have the `rand_r' function. */ +#define H5_HAVE_RAND_R 1 + +/* Define to 1 if you have the `setjmp' function. */ +#define H5_HAVE_SETJMP 1 + +/* Define to 1 if you have the <setjmp.h> header file. */ +#define H5_HAVE_SETJMP_H 1 + +/* Define to 1 if you have the `setsysinfo' function. */ +/* #undef H5_HAVE_SETSYSINFO */ + +/* Define to 1 if you have the `siglongjmp' function. */ +#define H5_HAVE_SIGLONGJMP 1 + +/* Define to 1 if you have the `signal' function. */ +#define H5_HAVE_SIGNAL 1 + +/* Define to 1 if you have the `sigprocmask' function. */ +#define H5_HAVE_SIGPROCMASK 1 + +/* Define to 1 if you have the `sigsetjmp' function. */ +/* #undef H5_HAVE_SIGSETJMP */ + +/* Define to 1 if you have the `snprintf' function. */ +#define H5_HAVE_SNPRINTF 1 + +/* Define to 1 if you have the `srandom' function. */ +#define H5_HAVE_SRANDOM 1 + +/* Define to 1 if you have the `stat64' function. */ +#define H5_HAVE_STAT64 1 + +/* Define if `struct stat' has the `st_blocks' field */ +#define H5_HAVE_STAT_ST_BLOCKS 1 + +/* Define to 1 if you have the <stddef.h> header file. */ +#define H5_HAVE_STDDEF_H 1 + +/* Define to 1 if you have the <stdint.h> header file. */ +#define H5_HAVE_STDINT_H 1 + +/* Define to 1 if you have the <stdlib.h> header file. */ +#define H5_HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `strdup' function. */ +#define H5_HAVE_STRDUP 1 + +/* Define to 1 if you have the <strings.h> header file. */ +#define H5_HAVE_STRINGS_H 1 + +/* Define to 1 if you have the <string.h> header file. */ +#define H5_HAVE_STRING_H 1 + +/* Define if `struct text_info' is defined */ +/* #undef H5_HAVE_STRUCT_TEXT_INFO */ + +/* Define if `struct timezone' is defined */ +#define H5_HAVE_STRUCT_TIMEZONE 1 + +/* Define to 1 if `tm_zone' is a member of `struct tm'. */ +#define H5_HAVE_STRUCT_TM_TM_ZONE 1 + +/* Define if `struct videoconfig' is defined */ +/* #undef H5_HAVE_STRUCT_VIDEOCONFIG */ + +/* Define to 1 if you have the `symlink' function. */ +#define H5_HAVE_SYMLINK 1 + +/* Define to 1 if you have the `system' function. */ +#define H5_HAVE_SYSTEM 1 + +/* Define to 1 if you have the <sys/fpu.h> header file. */ +/* #undef H5_HAVE_SYS_FPU_H */ + +/* Define to 1 if you have the <sys/ioctl.h> header file. */ +#define H5_HAVE_SYS_IOCTL_H 1 + +/* Define to 1 if you have the <sys/proc.h> header file. */ +/* #undef H5_HAVE_SYS_PROC_H */ + +/* Define to 1 if you have the <sys/resource.h> header file. */ +#define H5_HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the <sys/socket.h> header file. */ +#define H5_HAVE_SYS_SOCKET_H 1 + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#define H5_HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the <sys/sysinfo.h> header file. */ +/* #undef H5_HAVE_SYS_SYSINFO_H */ + +/* Define to 1 if you have the <sys/timeb.h> header file. */ +#define H5_HAVE_SYS_TIMEB_H 1 + +/* Define to 1 if you have the <sys/time.h> header file. */ +#define H5_HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the <sys/types.h> header file. */ +#define H5_HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the <szlib.h> header file. */ +/* #undef H5_HAVE_SZLIB_H */ + +/* Define if we have thread safe support */ +/* #undef H5_HAVE_THREADSAFE */ + +/* Define if `timezone' is a global variable */ +/* #undef H5_HAVE_TIMEZONE */ + +/* Define if the ioctl TIOCGETD is defined */ +#define H5_HAVE_TIOCGETD 1 + +/* Define if the ioctl TIOGWINSZ is defined */ +#define H5_HAVE_TIOCGWINSZ 1 + +/* Define to 1 if you have the `tmpfile' function. */ +#define H5_HAVE_TMPFILE 1 + +/* Define if `tm_gmtoff' is a member of `struct tm' */ +#define H5_HAVE_TM_GMTOFF 1 + +/* Define to 1 if your `struct tm' has `tm_zone'. Deprecated, use + `HAVE_STRUCT_TM_TM_ZONE' instead. */ +#define H5_HAVE_TM_ZONE 1 + +/* Define to 1 if you don't have `tm_zone' but do have the external array + `tzname'. */ +/* #undef H5_HAVE_TZNAME */ + +/* Define to 1 if you have the <unistd.h> header file. */ +#define H5_HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `vasprintf' function. */ +#define H5_HAVE_VASPRINTF 1 + +/* Define to 1 if you have the `vsnprintf' function. */ +#define H5_HAVE_VSNPRINTF 1 + +/* Define to 1 if you have the `waitpid' function. */ +#define H5_HAVE_WAITPID 1 + +/* Define if your system has window style path name. */ +/* #undef H5_HAVE_WINDOW_PATH */ + +/* Define to 1 if you have the <winsock2.h> header file. */ +/* #undef H5_HAVE_WINSOCK2_H */ + +/* Define to 1 if you have the <zlib.h> header file. */ +#define H5_HAVE_ZLIB_H 1 + +/* Define to 1 if you have the `_getvideoconfig' function. */ +/* #undef H5_HAVE__GETVIDEOCONFIG */ + +/* Define to 1 if you have the `_scrsize' function. */ +/* #undef H5_HAVE__SCRSIZE */ + +/* Define if `__tm_gmtoff' is a member of `struct tm' */ +/* #undef H5_HAVE___TM_GMTOFF */ + +/* Define if your system can't handle converting floating-point values to long + long. */ +/* #undef H5_HW_FP_TO_LLONG_NOT_WORKS */ + +/* Define if HDF5's high-level library headers should be included in hdf5.h */ +#define H5_INCLUDE_HL 1 + +/* Define if your system can accurately convert from integers to long double + values. */ +#define H5_INTEGER_TO_LDOUBLE_ACCURATE 1 + +/* Define if your system can convert long double to integers accurately. */ +#define H5_LDOUBLE_TO_INTEGER_ACCURATE 1 + +/* Define if your system can convert from long double to integer values. */ +#define H5_LDOUBLE_TO_INTEGER_WORKS 1 + +/* Define if your system can convert long double to (unsigned) long long + values correctly. */ +#define H5_LDOUBLE_TO_LLONG_ACCURATE 1 + +/* Define if your system converts long double to (unsigned) long values with + special algorithm. */ +/* #undef H5_LDOUBLE_TO_LONG_SPECIAL */ + +/* Define if your system can convert long double to unsigned int values + correctly. */ +#define H5_LDOUBLE_TO_UINT_ACCURATE 1 + +/* Define if your system can compile long long to floating-point casts. */ +#define H5_LLONG_TO_FP_CAST_WORKS 1 + +/* Define if your system can convert (unsigned) long long to long double + values correctly. */ +#define H5_LLONG_TO_LDOUBLE_CORRECT 1 + +/* Define if your system can convert (unsigned) long to long double values + with special algorithm. */ +/* #undef H5_LONG_TO_LDOUBLE_SPECIAL */ + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#define H5_LT_OBJDIR ".libs/" + +/* Define if the metadata trace file code is to be compiled in */ +/* #undef H5_METADATA_TRACE_FILE */ + +/* Define if your system's `MPI_File_set_size' function works for files over + 2GB. */ +/* #undef H5_MPI_FILE_SET_SIZE_BIG */ + +/* Define if we can violate pointer alignment restrictions */ +#define H5_NO_ALIGNMENT_RESTRICTIONS 1 + +/* Define if deprecated public API symbols are disabled */ +/* #undef H5_NO_DEPRECATED_SYMBOLS */ + +/* Define if shared writing must be disabled (CodeWarrior only) */ +/* #undef H5_NO_SHARED_WRITING */ + +/* Name of package */ +#define H5_PACKAGE "hdf5" + +/* Define to the address where bug reports for this package should be sent. */ +#define H5_PACKAGE_BUGREPORT "help@hdfgroup.org" + +/* Define to the full name of this package. */ +#define H5_PACKAGE_NAME "HDF5" + +/* Define to the full name and version of this package. */ +#define H5_PACKAGE_STRING "HDF5 1.8.13" + +/* Define to the one symbol short name of this package. */ +#define H5_PACKAGE_TARNAME "hdf5" + +/* Define to the home page for this package. */ +#define H5_PACKAGE_URL "" + +/* Define to the version of this package. */ +#define H5_PACKAGE_VERSION "1.8.13" + +/* Width for printf() for type `long long' or `__int64', use `ll' */ +#define H5_PRINTF_LL_WIDTH "l" + +/* The size of `char', as computed by sizeof. */ +#define H5_SIZEOF_CHAR 1 + +/* The size of `double', as computed by sizeof. */ +#define H5_SIZEOF_DOUBLE 8 + +/* The size of `float', as computed by sizeof. */ +#define H5_SIZEOF_FLOAT 4 + +/* The size of `int', as computed by sizeof. */ +#define H5_SIZEOF_INT 4 + +/* The size of `int16_t', as computed by sizeof. */ +#define H5_SIZEOF_INT16_T 2 + +/* The size of `int32_t', as computed by sizeof. */ +#define H5_SIZEOF_INT32_T 4 + +/* The size of `int64_t', as computed by sizeof. */ +#define H5_SIZEOF_INT64_T 8 + +/* The size of `int8_t', as computed by sizeof. */ +#define H5_SIZEOF_INT8_T 1 + +/* The size of `int_fast16_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST16_T 8 + +/* The size of `int_fast32_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST32_T 8 + +/* The size of `int_fast64_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST64_T 8 + +/* The size of `int_fast8_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_FAST8_T 1 + +/* The size of `int_least16_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST16_T 2 + +/* The size of `int_least32_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST32_T 4 + +/* The size of `int_least64_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST64_T 8 + +/* The size of `int_least8_t', as computed by sizeof. */ +#define H5_SIZEOF_INT_LEAST8_T 1 + +/* The size of `long', as computed by sizeof. */ +#define H5_SIZEOF_LONG 8 + +/* The size of `long double', as computed by sizeof. */ +#define H5_SIZEOF_LONG_DOUBLE 16 + +/* The size of `long long', as computed by sizeof. */ +#define H5_SIZEOF_LONG_LONG 8 + +/* The size of `off64_t', as computed by sizeof. */ +#define H5_SIZEOF_OFF64_T 8 + +/* The size of `off_t', as computed by sizeof. */ +#define H5_SIZEOF_OFF_T 8 + +/* The size of `ptrdiff_t', as computed by sizeof. */ +#define H5_SIZEOF_PTRDIFF_T 8 + +/* The size of `short', as computed by sizeof. */ +#define H5_SIZEOF_SHORT 2 + +/* The size of `size_t', as computed by sizeof. */ +#define H5_SIZEOF_SIZE_T 8 + +/* The size of `ssize_t', as computed by sizeof. */ +#define H5_SIZEOF_SSIZE_T 8 + +/* The size of `uint16_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT16_T 2 + +/* The size of `uint32_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT32_T 4 + +/* The size of `uint64_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT64_T 8 + +/* The size of `uint8_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT8_T 1 + +/* The size of `uint_fast16_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST16_T 8 + +/* The size of `uint_fast32_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST32_T 8 + +/* The size of `uint_fast64_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST64_T 8 + +/* The size of `uint_fast8_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_FAST8_T 1 + +/* The size of `uint_least16_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST16_T 2 + +/* The size of `uint_least32_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST32_T 4 + +/* The size of `uint_least64_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST64_T 8 + +/* The size of `uint_least8_t', as computed by sizeof. */ +#define H5_SIZEOF_UINT_LEAST8_T 1 + +/* The size of `unsigned', as computed by sizeof. */ +#define H5_SIZEOF_UNSIGNED 4 + +/* The size of `__int64', as computed by sizeof. */ +#define H5_SIZEOF___INT64 0 + +/* Define to 1 if you have the ANSI C header files. */ +#define H5_STDC_HEADERS 1 + +/* Define if strict file format checks are enabled */ +/* #undef H5_STRICT_FORMAT_CHECKS */ + +/* Define if your system supports pthread_attr_setscope(&attribute, + PTHREAD_SCOPE_SYSTEM) call. */ +#define H5_SYSTEM_SCOPE_THREADS 1 + +/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */ +#define H5_TIME_WITH_SYS_TIME 1 + +/* Define to 1 if your <sys/time.h> declares `struct tm'. */ +/* #undef H5_TM_IN_SYS_TIME */ + +/* Define if your system can compile unsigned long long to floating-point + casts. */ +#define H5_ULLONG_TO_FP_CAST_WORKS 1 + +/* Define if your system can convert unsigned long long to long double with + correct precision. */ +#define H5_ULLONG_TO_LDOUBLE_PRECISION 1 + +/* Define if your system accurately converting unsigned long to float values. + */ +#define H5_ULONG_TO_FLOAT_ACCURATE 1 + +/* Define if your system can accurately convert unsigned (long) long values to + floating-point values. */ +#define H5_ULONG_TO_FP_BOTTOM_BIT_ACCURATE 1 + +/* Define using v1.6 public API symbols by default */ +/* #undef H5_USE_16_API_DEFAULT */ + +/* Define if a memory checking tool will be used on the library, to cause + library to be very picky about memory operations and also disable the + internal free list manager code. */ +/* #undef H5_USING_MEMCHECKER */ + +/* Version number of package */ +#define H5_VERSION "1.8.13" + +/* Define if vsnprintf() returns the correct value for formatted strings that + don't fit into size allowed */ +#define H5_VSNPRINTF_WORKS 1 + +/* Data accuracy is prefered to speed during data conversions */ +#define H5_WANT_DATA_ACCURACY 1 + +/* Check exception handling functions during data conversions */ +#define H5_WANT_DCONV_EXCEPTION 1 + +/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most + significant byte first (like Motorola and SPARC, unlike Intel). */ +#if defined AC_APPLE_UNIVERSAL_BUILD +# if defined __BIG_ENDIAN__ +# define WORDS_BIGENDIAN 1 +# endif +#else +# ifndef WORDS_BIGENDIAN +/* # undef WORDS_BIGENDIAN */ +# endif +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +/* #undef H5__FILE_OFFSET_BITS */ + +/* Define for large files, on AIX-style hosts. */ +/* #undef H5__LARGE_FILES */ + +/* Define to empty if `const' does not conform to ANSI C. */ +/* #undef H5_const */ + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#define H5_inline __inline__ +#endif + +/* Define to `long int' if <sys/types.h> does not define. */ +/* #undef H5_off_t */ + +/* Define to `long' if <sys/types.h> does not define. */ +/* #undef H5_ptrdiff_t */ + +/* Define to `unsigned long' if <sys/types.h> does not define. */ +/* #undef H5_size_t */ + +/* Define to `long' if <sys/types.h> does not define. */ +/* #undef H5_ssize_t */ diff --git a/privatemodules/nc4/include/H5public.h b/privatemodules/nc4/include/H5public.h new file mode 100644 index 0000000000000000000000000000000000000000..aaf0d749847fc8628e2f83328cbe7a8e864203b4 --- /dev/null +++ b/privatemodules/nc4/include/H5public.h @@ -0,0 +1,343 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This file contains public declarations for the HDF5 module. + */ +#ifndef _H5public_H +#define _H5public_H + +/* Include files for public use... */ +/* + * Since H5pubconf.h is a generated header file, it is messy to try + * to put a #ifndef _H5pubconf_H ... #endif guard in it. + * HDF5 has set an internal rule that it is being included here. + * Source files should NOT include H5pubconf.h directly but include + * it via H5public.h. The #ifndef _H5public_H guard above would + * prevent repeated include. + */ +#include "H5pubconf.h" /*from configure */ + +/* API Version macro wrapper definitions */ +#include "H5version.h" + +#ifdef H5_HAVE_FEATURES_H +#include <features.h> /*for setting POSIX, BSD, etc. compatibility */ +#endif +#ifdef H5_HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef H5_STDC_HEADERS +# include <limits.h> /*for H5T_NATIVE_CHAR defn in H5Tpublic.h */ +#endif +#ifndef __cplusplus +# ifdef H5_HAVE_STDINT_H +# include <stdint.h> /*for C9x types */ +# endif +#else +# ifdef H5_HAVE_STDINT_H_CXX +# include <stdint.h> /*for C9x types when include from C++ */ +# endif +#endif +#ifdef H5_HAVE_INTTYPES_H +# include <inttypes.h> /* For uint64_t on some platforms */ +#endif +#ifdef H5_HAVE_STDDEF_H +# include <stddef.h> +#endif +#ifdef H5_HAVE_PARALLEL +# include <mpi.h> +#ifndef MPI_FILE_NULL /*MPIO may be defined in mpi.h already */ +# include <mpio.h> +#endif +#endif + + +/* Include the Windows API adapter header early */ +#include "H5api_adpt.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/* Macros for enabling/disabling particular GCC warnings */ +/* (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 + */ +/* These pragmas are only implemented usefully in gcc 4.6+ */ +#if ((__GNUC__ * 100) + __GNUC_MINOR__) >= 406 + #define H5_GCC_DIAG_STR(s) #s + #define H5_GCC_DIAG_JOINSTR(x,y) H5_GCC_DIAG_STR(x ## y) + #define H5_GCC_DIAG_DO_PRAGMA(x) _Pragma (#x) + #define H5_GCC_DIAG_PRAGMA(x) H5_GCC_DIAG_DO_PRAGMA(GCC diagnostic x) + + #define H5_GCC_DIAG_OFF(x) H5_GCC_DIAG_PRAGMA(push) H5_GCC_DIAG_PRAGMA(ignored H5_GCC_DIAG_JOINSTR(-W,x)) + #define H5_GCC_DIAG_ON(x) H5_GCC_DIAG_PRAGMA(pop) +#else + #define H5_GCC_DIAG_OFF(x) + #define H5_GCC_DIAG_ON(x) +#endif + +/* Version numbers */ +#define H5_VERS_MAJOR 1 /* For major interface/format changes */ +#define H5_VERS_MINOR 8 /* For minor interface/format changes */ +#define H5_VERS_RELEASE 13 /* For tweaks, bug-fixes, or development */ +#define H5_VERS_SUBRELEASE "" /* For pre-releases like snap0 */ + /* Empty string for real releases. */ +#define H5_VERS_INFO "HDF5 library version: 1.8.13" /* Full version string */ + +#define H5check() H5check_version(H5_VERS_MAJOR,H5_VERS_MINOR, \ + H5_VERS_RELEASE) + +/* macros for comparing the version */ +#define H5_VERSION_GE(Maj,Min,Rel) \ + (((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR==Min) && (H5_VERS_RELEASE>=Rel)) || \ + ((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR>Min)) || \ + (H5_VERS_MAJOR>Maj)) + +#define H5_VERSION_LE(Maj,Min,Rel) \ + (((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR==Min) && (H5_VERS_RELEASE<=Rel)) || \ + ((H5_VERS_MAJOR==Maj) && (H5_VERS_MINOR<Min)) || \ + (H5_VERS_MAJOR<Maj)) + +/* + * Status return values. Failed integer functions in HDF5 result almost + * always in a negative value (unsigned failing functions sometimes return + * zero for failure) while successfull return is non-negative (often zero). + * The negative failure value is most commonly -1, but don't bet on it. The + * proper way to detect failure is something like: + * + * if((dset = H5Dopen2(file, name)) < 0) + * fprintf(stderr, "unable to open the requested dataset\n"); + */ +typedef int herr_t; + + +/* + * Boolean type. Successful return values are zero (false) or positive + * (true). The typical true value is 1 but don't bet on it. Boolean + * functions cannot fail. Functions that return `htri_t' however return zero + * (false), positive (true), or negative (failure). The proper way to test + * for truth from a htri_t function is: + * + * if ((retval = H5Tcommitted(type))>0) { + * printf("data type is committed\n"); + * } else if (!retval) { + * printf("data type is not committed\n"); + * } else { + * printf("error determining whether data type is committed\n"); + * } + */ +typedef unsigned int hbool_t; +typedef int htri_t; + +/* Define the ssize_t type if it not is defined */ +#if H5_SIZEOF_SSIZE_T==0 +/* Undefine this size, we will re-define it in one of the sections below */ +#undef H5_SIZEOF_SSIZE_T +#if H5_SIZEOF_SIZE_T==H5_SIZEOF_INT +typedef int ssize_t; +# define H5_SIZEOF_SSIZE_T H5_SIZEOF_INT +#elif H5_SIZEOF_SIZE_T==H5_SIZEOF_LONG +typedef long ssize_t; +# define H5_SIZEOF_SSIZE_T H5_SIZEOF_LONG +#elif H5_SIZEOF_SIZE_T==H5_SIZEOF_LONG_LONG +typedef long long ssize_t; +# define H5_SIZEOF_SSIZE_T H5_SIZEOF_LONG_LONG +#else /* Can't find matching type for ssize_t */ +# error "nothing appropriate for ssize_t" +#endif +#endif + +/* + * The sizes of file objects have their own types defined here, use a 64-bit + * type. + */ +#if H5_SIZEOF_LONG_LONG >= 8 +H5_GCC_DIAG_OFF(long-long) +typedef unsigned long long hsize_t; +typedef signed long long hssize_t; +H5_GCC_DIAG_ON(long-long) +# define H5_SIZEOF_HSIZE_T H5_SIZEOF_LONG_LONG +# define H5_SIZEOF_HSSIZE_T H5_SIZEOF_LONG_LONG +#else +# error "nothing appropriate for hsize_t" +#endif + +/* + * File addresses have their own types. + */ +#if H5_SIZEOF_INT64_T>=8 + typedef uint64_t haddr_t; +# define HADDR_UNDEF ((haddr_t)(int64_t)(-1)) +# define H5_SIZEOF_HADDR_T H5_SIZEOF_INT64_T +# ifdef H5_HAVE_PARALLEL +# define HADDR_AS_MPI_TYPE MPI_LONG_LONG_INT +# endif /* H5_HAVE_PARALLEL */ +#elif H5_SIZEOF_INT>=8 + typedef unsigned haddr_t; +# define HADDR_UNDEF ((haddr_t)(-1)) +# define H5_SIZEOF_HADDR_T H5_SIZEOF_INT +# ifdef H5_HAVE_PARALLEL +# define HADDR_AS_MPI_TYPE MPI_UNSIGNED +# endif /* H5_HAVE_PARALLEL */ +#elif H5_SIZEOF_LONG>=8 + typedef unsigned long haddr_t; +# define HADDR_UNDEF ((haddr_t)(long)(-1)) +# define H5_SIZEOF_HADDR_T H5_SIZEOF_LONG +# ifdef H5_HAVE_PARALLEL +# define HADDR_AS_MPI_TYPE MPI_UNSIGNED_LONG +# endif /* H5_HAVE_PARALLEL */ +#elif H5_SIZEOF_LONG_LONG>=8 + typedef unsigned long long haddr_t; +# define HADDR_UNDEF ((haddr_t)(long long)(-1)) +# define H5_SIZEOF_HADDR_T H5_SIZEOF_LONG_LONG +# ifdef H5_HAVE_PARALLEL +# define HADDR_AS_MPI_TYPE MPI_LONG_LONG_INT +# endif /* H5_HAVE_PARALLEL */ +#else +# error "nothing appropriate for haddr_t" +#endif +#if H5_SIZEOF_HADDR_T ==H5_SIZEOF_INT +# define H5_PRINTF_HADDR_FMT "%u" +#elif H5_SIZEOF_HADDR_T ==H5_SIZEOF_LONG +# define H5_PRINTF_HADDR_FMT "%lu" +#elif H5_SIZEOF_HADDR_T ==H5_SIZEOF_LONG_LONG +# define H5_PRINTF_HADDR_FMT "%" H5_PRINTF_LL_WIDTH "u" +#else +# error "nothing appropriate for H5_PRINTF_HADDR_FMT" +#endif +#define HADDR_MAX (HADDR_UNDEF-1) + +/* uint32_t type is used for creation order field for messages. It may be + * defined in Posix.1g, otherwise it is defined here. + */ +#if H5_SIZEOF_UINT32_T>=4 +#elif H5_SIZEOF_SHORT>=4 + typedef short uint32_t; +# undef H5_SIZEOF_UINT32_T +# define H5_SIZEOF_UINT32_T H5_SIZEOF_SHORT +#elif H5_SIZEOF_INT>=4 + typedef unsigned int uint32_t; +# undef H5_SIZEOF_UINT32_T +# define H5_SIZEOF_UINT32_T H5_SIZEOF_INT +#elif H5_SIZEOF_LONG>=4 + typedef unsigned long uint32_t; +# undef H5_SIZEOF_UINT32_T +# define H5_SIZEOF_UINT32_T H5_SIZEOF_LONG +#else +# error "nothing appropriate for uint32_t" +#endif + +/* int64_t type is used for creation order field for links. It may be + * defined in Posix.1g, otherwise it is defined here. + */ +#if H5_SIZEOF_INT64_T>=8 +#elif H5_SIZEOF_INT>=8 + typedef int int64_t; +# undef H5_SIZEOF_INT64_T +# define H5_SIZEOF_INT64_T H5_SIZEOF_INT +#elif H5_SIZEOF_LONG>=8 + typedef long int64_t; +# undef H5_SIZEOF_INT64_T +# define H5_SIZEOF_INT64_T H5_SIZEOF_LONG +#elif H5_SIZEOF_LONG_LONG>=8 + typedef long long int64_t; +# undef H5_SIZEOF_INT64_T +# define H5_SIZEOF_INT64_T H5_SIZEOF_LONG_LONG +#else +# error "nothing appropriate for int64_t" +#endif + +/* uint64_t type is used for fields for H5O_info_t. It may be + * defined in Posix.1g, otherwise it is defined here. + */ +#if H5_SIZEOF_UINT64_T>=8 +#elif H5_SIZEOF_INT>=8 + typedef unsigned uint64_t; +# undef H5_SIZEOF_UINT64_T +# define H5_SIZEOF_UINT64_T H5_SIZEOF_INT +#elif H5_SIZEOF_LONG>=8 + typedef unsigned long uint64_t; +# undef H5_SIZEOF_UINT64_T +# define H5_SIZEOF_UINT64_T H5_SIZEOF_LONG +#elif H5_SIZEOF_LONG_LONG>=8 + typedef unsigned long long uint64_t; +# undef H5_SIZEOF_UINT64_T +# define H5_SIZEOF_UINT64_T H5_SIZEOF_LONG_LONG +#else +# error "nothing appropriate for uint64_t" +#endif + +/* Default value for all property list classes */ +#define H5P_DEFAULT 0 + +/* Common iteration orders */ +typedef enum { + H5_ITER_UNKNOWN = -1, /* Unknown order */ + H5_ITER_INC, /* Increasing order */ + H5_ITER_DEC, /* Decreasing order */ + H5_ITER_NATIVE, /* No particular order, whatever is fastest */ + H5_ITER_N /* Number of iteration orders */ +} H5_iter_order_t; + +/* Iteration callback values */ +/* (Actually, any postive value will cause the iterator to stop and pass back + * that positive value to the function that called the iterator) + */ +#define H5_ITER_ERROR (-1) +#define H5_ITER_CONT (0) +#define H5_ITER_STOP (1) + +/* + * The types of indices on links in groups/attributes on objects. + * Primarily used for "<do> <foo> by index" routines and for iterating over + * links in groups/attributes on objects. + */ +typedef enum H5_index_t { + H5_INDEX_UNKNOWN = -1, /* Unknown index type */ + H5_INDEX_NAME, /* Index on names */ + H5_INDEX_CRT_ORDER, /* Index on creation order */ + H5_INDEX_N /* Number of indices defined */ +} H5_index_t; + +/* + * Storage info struct used by H5O_info_t and H5F_info_t + */ +typedef struct H5_ih_info_t { + hsize_t index_size; /* btree and/or list */ + hsize_t heap_size; +} H5_ih_info_t; + +/* Functions in H5.c */ +H5_DLL herr_t H5open(void); +H5_DLL herr_t H5close(void); +H5_DLL herr_t H5dont_atexit(void); +H5_DLL herr_t H5garbage_collect(void); +H5_DLL herr_t H5set_free_list_limits (int reg_global_lim, int reg_list_lim, + int arr_global_lim, int arr_list_lim, int blk_global_lim, + int blk_list_lim); +H5_DLL herr_t H5get_libversion(unsigned *majnum, unsigned *minnum, + unsigned *relnum); +H5_DLL herr_t H5check_version(unsigned majnum, unsigned minnum, + unsigned relnum); +H5_DLL herr_t H5free_memory(void *mem); + +#ifdef __cplusplus +} +#endif +#endif + diff --git a/privatemodules/nc4/include/H5version.h b/privatemodules/nc4/include/H5version.h new file mode 100644 index 0000000000000000000000000000000000000000..58de2abafd097fe62acc19bf2799aa8a5011a90f --- /dev/null +++ b/privatemodules/nc4/include/H5version.h @@ -0,0 +1,419 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* Generated automatically by bin/make_vers -- do not edit */ +/* Add new versioned symbols to H5vers.txt file */ + + +#ifndef _H5version_H +#define _H5version_H + +/* Issue error if contradicting macros have been defined. */ +#if defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS) +#error "Can't choose old API versions when deprecated APIs are disabled" +#endif /* defined(H5_USE_16_API) && defined(H5_NO_DEPRECATED_SYMBOLS) */ + + +/* If a particular "global" version of the library's interfaces is chosen, + * set the versions for the API symbols affected. + * + * Note: If an application has already chosen a particular version for an + * API symbol, the individual API version macro takes priority. + */ +#if defined(H5_USE_16_API_DEFAULT) && !defined(H5_USE_16_API) +#define H5_USE_16_API 1 +#endif /* H5_USE_16_API_DEFAULT && !H5_USE_16_API */ + +#ifdef H5_USE_16_API + +/*************/ +/* Functions */ +/*************/ + +#if !defined(H5Acreate_vers) +#define H5Acreate_vers 1 +#endif /* !defined(H5Acreate_vers) */ + +#if !defined(H5Aiterate_vers) +#define H5Aiterate_vers 1 +#endif /* !defined(H5Aiterate_vers) */ + +#if !defined(H5Dcreate_vers) +#define H5Dcreate_vers 1 +#endif /* !defined(H5Dcreate_vers) */ + +#if !defined(H5Dopen_vers) +#define H5Dopen_vers 1 +#endif /* !defined(H5Dopen_vers) */ + +#if !defined(H5Eclear_vers) +#define H5Eclear_vers 1 +#endif /* !defined(H5Eclear_vers) */ + +#if !defined(H5Eget_auto_vers) +#define H5Eget_auto_vers 1 +#endif /* !defined(H5Eget_auto_vers) */ + +#if !defined(H5Eprint_vers) +#define H5Eprint_vers 1 +#endif /* !defined(H5Eprint_vers) */ + +#if !defined(H5Epush_vers) +#define H5Epush_vers 1 +#endif /* !defined(H5Epush_vers) */ + +#if !defined(H5Eset_auto_vers) +#define H5Eset_auto_vers 1 +#endif /* !defined(H5Eset_auto_vers) */ + +#if !defined(H5Ewalk_vers) +#define H5Ewalk_vers 1 +#endif /* !defined(H5Ewalk_vers) */ + +#if !defined(H5Gcreate_vers) +#define H5Gcreate_vers 1 +#endif /* !defined(H5Gcreate_vers) */ + +#if !defined(H5Gopen_vers) +#define H5Gopen_vers 1 +#endif /* !defined(H5Gopen_vers) */ + +#if !defined(H5Pget_filter_vers) +#define H5Pget_filter_vers 1 +#endif /* !defined(H5Pget_filter_vers) */ + +#if !defined(H5Pget_filter_by_id_vers) +#define H5Pget_filter_by_id_vers 1 +#endif /* !defined(H5Pget_filter_by_id_vers) */ + +#if !defined(H5Pinsert_vers) +#define H5Pinsert_vers 1 +#endif /* !defined(H5Pinsert_vers) */ + +#if !defined(H5Pregister_vers) +#define H5Pregister_vers 1 +#endif /* !defined(H5Pregister_vers) */ + +#if !defined(H5Rget_obj_type_vers) +#define H5Rget_obj_type_vers 1 +#endif /* !defined(H5Rget_obj_type_vers) */ + +#if !defined(H5Tarray_create_vers) +#define H5Tarray_create_vers 1 +#endif /* !defined(H5Tarray_create_vers) */ + +#if !defined(H5Tcommit_vers) +#define H5Tcommit_vers 1 +#endif /* !defined(H5Tcommit_vers) */ + +#if !defined(H5Tget_array_dims_vers) +#define H5Tget_array_dims_vers 1 +#endif /* !defined(H5Tget_array_dims_vers) */ + +#if !defined(H5Topen_vers) +#define H5Topen_vers 1 +#endif /* !defined(H5Topen_vers) */ + +/************/ +/* Typedefs */ +/************/ + +#if !defined(H5E_auto_t_vers) +#define H5E_auto_t_vers 1 +#endif /* !defined(H5E_auto_t_vers) */ + +#if !defined(H5Z_class_t_vers) +#define H5Z_class_t_vers 1 +#endif /* !defined(H5Z_class_t_vers) */ + +#endif /* H5_USE_16_API */ + + +/* Choose the correct version of each API symbol, defaulting to the latest + * version of each. The "best" name for API parameters/data structures + * that have changed definitions is also set. An error is issued for + * specifying an invalid API version. + */ + +/*************/ +/* Functions */ +/*************/ + +#if !defined(H5Acreate_vers) || H5Acreate_vers == 2 +#ifndef H5Acreate_vers +#define H5Acreate_vers 2 +#endif /* H5Acreate_vers */ +#define H5Acreate H5Acreate2 +#elif H5Acreate_vers == 1 +#define H5Acreate H5Acreate1 +#else /* H5Acreate_vers */ +#error "H5Acreate_vers set to invalid value" +#endif /* H5Acreate_vers */ + +#if !defined(H5Aiterate_vers) || H5Aiterate_vers == 2 +#ifndef H5Aiterate_vers +#define H5Aiterate_vers 2 +#endif /* H5Aiterate_vers */ +#define H5Aiterate H5Aiterate2 +#define H5A_operator_t H5A_operator2_t +#elif H5Aiterate_vers == 1 +#define H5Aiterate H5Aiterate1 +#define H5A_operator_t H5A_operator1_t +#else /* H5Aiterate_vers */ +#error "H5Aiterate_vers set to invalid value" +#endif /* H5Aiterate_vers */ + +#if !defined(H5Dcreate_vers) || H5Dcreate_vers == 2 +#ifndef H5Dcreate_vers +#define H5Dcreate_vers 2 +#endif /* H5Dcreate_vers */ +#define H5Dcreate H5Dcreate2 +#elif H5Dcreate_vers == 1 +#define H5Dcreate H5Dcreate1 +#else /* H5Dcreate_vers */ +#error "H5Dcreate_vers set to invalid value" +#endif /* H5Dcreate_vers */ + +#if !defined(H5Dopen_vers) || H5Dopen_vers == 2 +#ifndef H5Dopen_vers +#define H5Dopen_vers 2 +#endif /* H5Dopen_vers */ +#define H5Dopen H5Dopen2 +#elif H5Dopen_vers == 1 +#define H5Dopen H5Dopen1 +#else /* H5Dopen_vers */ +#error "H5Dopen_vers set to invalid value" +#endif /* H5Dopen_vers */ + +#if !defined(H5Eclear_vers) || H5Eclear_vers == 2 +#ifndef H5Eclear_vers +#define H5Eclear_vers 2 +#endif /* H5Eclear_vers */ +#define H5Eclear H5Eclear2 +#elif H5Eclear_vers == 1 +#define H5Eclear H5Eclear1 +#else /* H5Eclear_vers */ +#error "H5Eclear_vers set to invalid value" +#endif /* H5Eclear_vers */ + +#if !defined(H5Eget_auto_vers) || H5Eget_auto_vers == 2 +#ifndef H5Eget_auto_vers +#define H5Eget_auto_vers 2 +#endif /* H5Eget_auto_vers */ +#define H5Eget_auto H5Eget_auto2 +#elif H5Eget_auto_vers == 1 +#define H5Eget_auto H5Eget_auto1 +#else /* H5Eget_auto_vers */ +#error "H5Eget_auto_vers set to invalid value" +#endif /* H5Eget_auto_vers */ + +#if !defined(H5Eprint_vers) || H5Eprint_vers == 2 +#ifndef H5Eprint_vers +#define H5Eprint_vers 2 +#endif /* H5Eprint_vers */ +#define H5Eprint H5Eprint2 +#elif H5Eprint_vers == 1 +#define H5Eprint H5Eprint1 +#else /* H5Eprint_vers */ +#error "H5Eprint_vers set to invalid value" +#endif /* H5Eprint_vers */ + +#if !defined(H5Epush_vers) || H5Epush_vers == 2 +#ifndef H5Epush_vers +#define H5Epush_vers 2 +#endif /* H5Epush_vers */ +#define H5Epush H5Epush2 +#elif H5Epush_vers == 1 +#define H5Epush H5Epush1 +#else /* H5Epush_vers */ +#error "H5Epush_vers set to invalid value" +#endif /* H5Epush_vers */ + +#if !defined(H5Eset_auto_vers) || H5Eset_auto_vers == 2 +#ifndef H5Eset_auto_vers +#define H5Eset_auto_vers 2 +#endif /* H5Eset_auto_vers */ +#define H5Eset_auto H5Eset_auto2 +#elif H5Eset_auto_vers == 1 +#define H5Eset_auto H5Eset_auto1 +#else /* H5Eset_auto_vers */ +#error "H5Eset_auto_vers set to invalid value" +#endif /* H5Eset_auto_vers */ + +#if !defined(H5Ewalk_vers) || H5Ewalk_vers == 2 +#ifndef H5Ewalk_vers +#define H5Ewalk_vers 2 +#endif /* H5Ewalk_vers */ +#define H5Ewalk H5Ewalk2 +#define H5E_error_t H5E_error2_t +#define H5E_walk_t H5E_walk2_t +#elif H5Ewalk_vers == 1 +#define H5Ewalk H5Ewalk1 +#define H5E_error_t H5E_error1_t +#define H5E_walk_t H5E_walk1_t +#else /* H5Ewalk_vers */ +#error "H5Ewalk_vers set to invalid value" +#endif /* H5Ewalk_vers */ + +#if !defined(H5Gcreate_vers) || H5Gcreate_vers == 2 +#ifndef H5Gcreate_vers +#define H5Gcreate_vers 2 +#endif /* H5Gcreate_vers */ +#define H5Gcreate H5Gcreate2 +#elif H5Gcreate_vers == 1 +#define H5Gcreate H5Gcreate1 +#else /* H5Gcreate_vers */ +#error "H5Gcreate_vers set to invalid value" +#endif /* H5Gcreate_vers */ + +#if !defined(H5Gopen_vers) || H5Gopen_vers == 2 +#ifndef H5Gopen_vers +#define H5Gopen_vers 2 +#endif /* H5Gopen_vers */ +#define H5Gopen H5Gopen2 +#elif H5Gopen_vers == 1 +#define H5Gopen H5Gopen1 +#else /* H5Gopen_vers */ +#error "H5Gopen_vers set to invalid value" +#endif /* H5Gopen_vers */ + +#if !defined(H5Pget_filter_vers) || H5Pget_filter_vers == 2 +#ifndef H5Pget_filter_vers +#define H5Pget_filter_vers 2 +#endif /* H5Pget_filter_vers */ +#define H5Pget_filter H5Pget_filter2 +#elif H5Pget_filter_vers == 1 +#define H5Pget_filter H5Pget_filter1 +#else /* H5Pget_filter_vers */ +#error "H5Pget_filter_vers set to invalid value" +#endif /* H5Pget_filter_vers */ + +#if !defined(H5Pget_filter_by_id_vers) || H5Pget_filter_by_id_vers == 2 +#ifndef H5Pget_filter_by_id_vers +#define H5Pget_filter_by_id_vers 2 +#endif /* H5Pget_filter_by_id_vers */ +#define H5Pget_filter_by_id H5Pget_filter_by_id2 +#elif H5Pget_filter_by_id_vers == 1 +#define H5Pget_filter_by_id H5Pget_filter_by_id1 +#else /* H5Pget_filter_by_id_vers */ +#error "H5Pget_filter_by_id_vers set to invalid value" +#endif /* H5Pget_filter_by_id_vers */ + +#if !defined(H5Pinsert_vers) || H5Pinsert_vers == 2 +#ifndef H5Pinsert_vers +#define H5Pinsert_vers 2 +#endif /* H5Pinsert_vers */ +#define H5Pinsert H5Pinsert2 +#elif H5Pinsert_vers == 1 +#define H5Pinsert H5Pinsert1 +#else /* H5Pinsert_vers */ +#error "H5Pinsert_vers set to invalid value" +#endif /* H5Pinsert_vers */ + +#if !defined(H5Pregister_vers) || H5Pregister_vers == 2 +#ifndef H5Pregister_vers +#define H5Pregister_vers 2 +#endif /* H5Pregister_vers */ +#define H5Pregister H5Pregister2 +#elif H5Pregister_vers == 1 +#define H5Pregister H5Pregister1 +#else /* H5Pregister_vers */ +#error "H5Pregister_vers set to invalid value" +#endif /* H5Pregister_vers */ + +#if !defined(H5Rget_obj_type_vers) || H5Rget_obj_type_vers == 2 +#ifndef H5Rget_obj_type_vers +#define H5Rget_obj_type_vers 2 +#endif /* H5Rget_obj_type_vers */ +#define H5Rget_obj_type H5Rget_obj_type2 +#elif H5Rget_obj_type_vers == 1 +#define H5Rget_obj_type H5Rget_obj_type1 +#else /* H5Rget_obj_type_vers */ +#error "H5Rget_obj_type_vers set to invalid value" +#endif /* H5Rget_obj_type_vers */ + +#if !defined(H5Tarray_create_vers) || H5Tarray_create_vers == 2 +#ifndef H5Tarray_create_vers +#define H5Tarray_create_vers 2 +#endif /* H5Tarray_create_vers */ +#define H5Tarray_create H5Tarray_create2 +#elif H5Tarray_create_vers == 1 +#define H5Tarray_create H5Tarray_create1 +#else /* H5Tarray_create_vers */ +#error "H5Tarray_create_vers set to invalid value" +#endif /* H5Tarray_create_vers */ + +#if !defined(H5Tcommit_vers) || H5Tcommit_vers == 2 +#ifndef H5Tcommit_vers +#define H5Tcommit_vers 2 +#endif /* H5Tcommit_vers */ +#define H5Tcommit H5Tcommit2 +#elif H5Tcommit_vers == 1 +#define H5Tcommit H5Tcommit1 +#else /* H5Tcommit_vers */ +#error "H5Tcommit_vers set to invalid value" +#endif /* H5Tcommit_vers */ + +#if !defined(H5Tget_array_dims_vers) || H5Tget_array_dims_vers == 2 +#ifndef H5Tget_array_dims_vers +#define H5Tget_array_dims_vers 2 +#endif /* H5Tget_array_dims_vers */ +#define H5Tget_array_dims H5Tget_array_dims2 +#elif H5Tget_array_dims_vers == 1 +#define H5Tget_array_dims H5Tget_array_dims1 +#else /* H5Tget_array_dims_vers */ +#error "H5Tget_array_dims_vers set to invalid value" +#endif /* H5Tget_array_dims_vers */ + +#if !defined(H5Topen_vers) || H5Topen_vers == 2 +#ifndef H5Topen_vers +#define H5Topen_vers 2 +#endif /* H5Topen_vers */ +#define H5Topen H5Topen2 +#elif H5Topen_vers == 1 +#define H5Topen H5Topen1 +#else /* H5Topen_vers */ +#error "H5Topen_vers set to invalid value" +#endif /* H5Topen_vers */ + +/************/ +/* Typedefs */ +/************/ + +#if !defined(H5E_auto_t_vers) || H5E_auto_t_vers == 2 +#ifndef H5E_auto_t_vers +#define H5E_auto_t_vers 2 +#endif /* H5E_auto_t_vers */ +#define H5E_auto_t H5E_auto2_t +#elif H5E_auto_t_vers == 1 +#define H5E_auto_t H5E_auto1_t +#else /* H5E_auto_t_vers */ +#error "H5E_auto_t_vers set to invalid value" +#endif /* H5E_auto_t_vers */ + + +#if !defined(H5Z_class_t_vers) || H5Z_class_t_vers == 2 +#ifndef H5Z_class_t_vers +#define H5Z_class_t_vers 2 +#endif /* H5Z_class_t_vers */ +#define H5Z_class_t H5Z_class2_t +#elif H5Z_class_t_vers == 1 +#define H5Z_class_t H5Z_class1_t +#else /* H5Z_class_t_vers */ +#error "H5Z_class_t_vers set to invalid value" +#endif /* H5Z_class_t_vers */ + +#endif /* H5version_H */ + diff --git a/privatemodules/nc4/include/hdf5.h b/privatemodules/nc4/include/hdf5.h new file mode 100644 index 0000000000000000000000000000000000000000..ef150630f5f6fa8982267b531b9bbaab57104acd --- /dev/null +++ b/privatemodules/nc4/include/hdf5.h @@ -0,0 +1,55 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This is the main public HDF5 include file. Put further information in + * a particular header file and include that here, don't fill this file with + * lots of gunk... + */ +#ifndef _HDF5_H +#define _HDF5_H + +#include "H5public.h" +#include "H5Apublic.h" /* Attributes */ +#include "H5ACpublic.h" /* Metadata cache */ +#include "H5Dpublic.h" /* Datasets */ +#include "H5Epublic.h" /* Errors */ +#include "H5Fpublic.h" /* Files */ +#include "H5FDpublic.h" /* File drivers */ +#include "H5Gpublic.h" /* Groups */ +#include "H5Ipublic.h" /* ID management */ +#include "H5Lpublic.h" /* Links */ +#include "H5MMpublic.h" /* Memory management */ +#include "H5Opublic.h" /* Object headers */ +#include "H5Ppublic.h" /* Property lists */ +#include "H5Rpublic.h" /* References */ +#include "H5Spublic.h" /* Dataspaces */ +#include "H5Tpublic.h" /* Datatypes */ +#include "H5Zpublic.h" /* Data filters */ + +/* Predefined file drivers */ +#include "H5FDcore.h" /* Files stored entirely in memory */ +#include "H5FDfamily.h" /* File families */ +#include "H5FDlog.h" /* sec2 driver with I/O logging (for debugging) */ +#include "H5FDmpi.h" /* MPI-based file drivers */ +#include "H5FDmulti.h" /* Usage-partitioned file family */ +#include "H5FDsec2.h" /* POSIX unbuffered file I/O */ +#include "H5FDstdio.h" /* Standard C buffered I/O */ +#ifdef H5_HAVE_WINDOWS +#include "H5FDwindows.h" /* Windows buffered I/O */ +#endif +#include "H5FDdirect.h" /* Linux direct I/O */ + +#endif diff --git a/privatemodules/nc4/include/hdf5_hl.h b/privatemodules/nc4/include/hdf5_hl.h new file mode 100644 index 0000000000000000000000000000000000000000..46439324e1c2b7b9ff7bd5d4bae3473bc032bbc5 --- /dev/null +++ b/privatemodules/nc4/include/hdf5_hl.h @@ -0,0 +1,33 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This is the main public HDF5 High Level include file. Put further + * information in a particular header file and include that here, don't + * fill this file with lots of gunk... + */ + +#ifndef _HDF5_HL_H +#define _HDF5_HL_H + +#include "H5DOpublic.h" /* dataset optimization */ +#include "H5DSpublic.h" /* dimension scales */ +#include "H5LTpublic.h" /* lite */ +#include "H5IMpublic.h" /* image */ +#include "H5TBpublic.h" /* table */ +#include "H5PTpublic.h" /* table */ + +#endif /*H5_INCLUDE_HL*/ + diff --git a/privatemodules/nc4/include/netcdf.h b/privatemodules/nc4/include/netcdf.h new file mode 100644 index 0000000000000000000000000000000000000000..2dbcebef3233ec62cd14ccb2e6e17ce28ed400cd --- /dev/null +++ b/privatemodules/nc4/include/netcdf.h @@ -0,0 +1,1978 @@ +/*! \file + +Main header file for the C API. + +Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 +University Corporation for Atmospheric Research/Unidata. + +See \ref copyright file for more info. +*/ + +#ifndef _NETCDF_ +#define _NETCDF_ + +#include <stddef.h> /* size_t, ptrdiff_t */ +#include <errno.h> /* netcdf functions sometimes return system errors */ + +/* Required for alloca on Windows */ +#if defined(_WIN32) || defined(_WIN64) +#include <malloc.h> +#endif + +#ifdef _WIN64 +#include <sys/stat.h> +#endif + +/*! The nc_type type is just an int. */ +typedef int nc_type; + +#if defined(__cplusplus) +extern "C" { +#endif + +/* + * The netcdf external data types + */ +#define NC_NAT 0 /**< Not A Type */ +#define NC_BYTE 1 /**< signed 1 byte integer */ +#define NC_CHAR 2 /**< ISO/ASCII character */ +#define NC_SHORT 3 /**< signed 2 byte integer */ +#define NC_INT 4 /**< signed 4 byte integer */ +#define NC_LONG NC_INT /**< \deprecated required for backward compatibility. */ +#define NC_FLOAT 5 /**< single precision floating point number */ +#define NC_DOUBLE 6 /**< double precision floating point number */ +#define NC_UBYTE 7 /**< unsigned 1 byte int */ +#define NC_USHORT 8 /**< unsigned 2-byte int */ +#define NC_UINT 9 /**< unsigned 4-byte int */ +#define NC_INT64 10 /**< signed 8-byte int */ +#define NC_UINT64 11 /**< unsigned 8-byte int */ +#define NC_STRING 12 /**< string */ + +#define NC_MAX_ATOMIC_TYPE NC_STRING + +/* The following are use internally in support of user-defines + * types. They are also the class returned by nc_inq_user_type. */ +#define NC_VLEN 13 /**< vlen (variable-length) types */ +#define NC_OPAQUE 14 /**< opaque types */ +#define NC_ENUM 15 /**< enum types */ +#define NC_COMPOUND 16 /**< compound types */ + +/* Define the first user defined type id (leave some room) */ +#define NC_FIRSTUSERTYPEID 32 + +/** Default fill value. This is used unless _FillValue attribute + * is set. These values are stuffed into newly allocated space as + * appropriate. The hope is that one might use these to notice that a + * particular datum has not been set. */ +/**@{*/ +#define NC_FILL_BYTE ((signed char)-127) +#define NC_FILL_CHAR ((char)0) +#define NC_FILL_SHORT ((short)-32767) +#define NC_FILL_INT (-2147483647L) +#define NC_FILL_FLOAT (9.9692099683868690e+36f) /* near 15 * 2^119 */ +#define NC_FILL_DOUBLE (9.9692099683868690e+36) +#define NC_FILL_UBYTE (255) +#define NC_FILL_USHORT (65535) +#define NC_FILL_UINT (4294967295U) +#define NC_FILL_INT64 ((long long)-9223372036854775806LL) +#define NC_FILL_UINT64 ((unsigned long long)18446744073709551614ULL) +#define NC_FILL_STRING ((char *)"") +/**@}*/ + +/*! Max or min values for a type. Nothing greater/smaller can be + * stored in a netCDF file for their associated types. Recall that a C + * compiler may define int to be any length it wants, but a NC_INT is + * *always* a 4 byte signed int. On a platform with 64 bit ints, + * there will be many ints which are outside the range supported by + * NC_INT. But since NC_INT is an external format, it has to mean the + * same thing everywhere. */ +/**@{*/ +#define NC_MAX_BYTE 127 +#define NC_MIN_BYTE (-NC_MAX_BYTE-1) +#define NC_MAX_CHAR 255 +#define NC_MAX_SHORT 32767 +#define NC_MIN_SHORT (-NC_MAX_SHORT - 1) +#define NC_MAX_INT 2147483647 +#define NC_MIN_INT (-NC_MAX_INT - 1) +#define NC_MAX_FLOAT 3.402823466e+38f +#define NC_MIN_FLOAT (-NC_MAX_FLOAT) +#define NC_MAX_DOUBLE 1.7976931348623157e+308 +#define NC_MIN_DOUBLE (-NC_MAX_DOUBLE) +#define NC_MAX_UBYTE NC_MAX_CHAR +#define NC_MAX_USHORT 65535U +#define NC_MAX_UINT 4294967295U +#define NC_MAX_INT64 (9223372036854775807LL) +#define NC_MIN_INT64 (-9223372036854775807LL-1) +#define NC_MAX_UINT64 (18446744073709551615ULL) +#define X_INT64_MAX (9223372036854775807LL) +#define X_INT64_MIN (-X_INT64_MAX - 1) +#define X_UINT64_MAX (18446744073709551615ULL) +/**@}*/ + +/** Name of fill value attribute. If you wish a variable to use a + * different value than the above defaults, create an attribute with + * the same type as the variable and this reserved name. The value you + * give the attribute will be used as the fill value for that + * variable. */ +#define _FillValue "_FillValue" +#define NC_FILL 0 /**< Argument to nc_set_fill() to clear NC_NOFILL */ +#define NC_NOFILL 0x100 /**< Argument to nc_set_fill() to turn off filling of data. */ + +/* Define the ioflags bits for nc_create and nc_open. + currently unused: + 0x0002 + 0x0040 + 0x0080 + and the whole upper 16 bits +*/ + +#define NC_NOWRITE 0x0000 /**< Set read-only access for nc_open(). */ +#define NC_WRITE 0x0001 /**< Set read-write access for nc_open(). */ +#define NC_CLOBBER 0x0000 /**< Destroy existing file. Mode flag for nc_create(). */ +#define NC_NOCLOBBER 0x0004 /**< Don't destroy existing file. Mode flag for nc_create(). */ + +#define NC_DISKLESS 0x0008 /**< Use diskless file. Mode flag for nc_open() or nc_create(). */ +#define NC_MMAP 0x0010 /**< Use diskless file with mmap. Mode flag for nc_open() or nc_create(). */ + +#define NC_64BIT_DATA 0x0020 /**< CDF-5 format: classic model but 64 bit dimensions and sizes */ +#define NC_CDF5 NC_64BIT_DATA /**< Alias NC_CDF5 to NC_64BIT_DATA */ + +#define NC_CLASSIC_MODEL 0x0100 /**< Enforce classic model on netCDF-4. Mode flag for nc_create(). */ +#define NC_64BIT_OFFSET 0x0200 /**< Use large (64-bit) file offsets. Mode flag for nc_create(). */ + +/** \deprecated The following flag currently is ignored, but use in + * nc_open() or nc_create() may someday support use of advisory + * locking to prevent multiple writers from clobbering a file + */ +#define NC_LOCK 0x0400 + +/** Share updates, limit caching. +Use this in mode flags for both nc_create() and nc_open(). */ +#define NC_SHARE 0x0800 + +#define NC_NETCDF4 0x1000 /**< Use netCDF-4/HDF5 format. Mode flag for nc_create(). */ + +/** Turn on MPI I/O. +Use this in mode flags for both nc_create() and nc_open(). */ +#define NC_MPIIO 0x2000 +/** Turn on MPI POSIX I/O. +Use this in mode flags for both nc_create() and nc_open(). */ +#define NC_MPIPOSIX 0x4000 /**< \deprecated As of libhdf5 1.8.13. */ + +#define NC_INMEMORY 0x8000 /**< Read from memory. Mode flag for nc_open() or nc_create(). */ + +#define NC_PNETCDF (NC_MPIIO) /**< Use parallel-netcdf library; alias for NC_MPIIO. */ + +/** Format specifier for nc_set_default_format() and returned + * by nc_inq_format. This returns the format as provided by + * the API. See nc_inq_format_extended to see the true file format. + * Starting with version 3.6, there are different format netCDF files. + * 4.0 introduces the third one. \see netcdf_format + */ +/**@{*/ +#define NC_FORMAT_CLASSIC (1) +/* After adding CDF5 support, this flag + is somewhat confusing. So, it is renamed. + Note that the name in the contributed code + NC_FORMAT_64BIT was renamed to NC_FORMAT_CDF2 +*/ +#define NC_FORMAT_64BIT_OFFSET (2) +#define NC_FORMAT_64BIT (NC_FORMAT_64BIT_OFFSET) /**< \deprecated Saved for compatibility. Use NC_FORMAT_64BIT_OFFSET or NC_FORMAT_64BIT_DATA, from netCDF 4.4.0 onwards. */ +#define NC_FORMAT_NETCDF4 (3) +#define NC_FORMAT_NETCDF4_CLASSIC (4) +#define NC_FORMAT_64BIT_DATA (5) + +/* Alias */ +#define NC_FORMAT_CDF5 NC_FORMAT_64BIT_DATA + +/**@}*/ + +/** Extended format specifier returned by nc_inq_format_extended() + * Added in version 4.3.1. This returns the true format of the + * underlying data. + * The function returns two values + * 1. a small integer indicating the underlying source type + * of the data. Note that this may differ from what the user + * sees from nc_inq_format() because this latter function + * returns what the user can expect to see thru the API. + * 2. A mode value indicating what mode flags are effectively + * set for this dataset. This usually will be a superset + * of the mode flags used as the argument to nc_open + * or nc_create. + * More or less, the #1 values track the set of dispatch tables. + * The #1 values are as follows. + * Note that CDF-5 returns NC_FORMAT_NC3, but sets the mode flag properly. + */ +/**@{*/ + +#define NC_FORMATX_NC3 (1) +#define NC_FORMATX_NC_HDF5 (2) /**< netCDF-4 subset of HDF5 */ +#define NC_FORMATX_NC4 NC_FORMATX_NC_HDF5 /**< alias */ +#define NC_FORMATX_NC_HDF4 (3) /**< netCDF-4 subset of HDF4 */ +#define NC_FORMATX_PNETCDF (4) +#define NC_FORMATX_DAP2 (5) +#define NC_FORMATX_DAP4 (6) +#define NC_FORMATX_UNDEFINED (0) + + /* To avoid breaking compatibility (such as in the python library), + we need to retain the NC_FORMAT_xxx format as well. This may come + out eventually, as the NC_FORMATX is more clear that it's an extended + format specifier.*/ + +#define NC_FORMAT_NC3 NC_FORMATX_NC3 /**< \deprecated As of 4.4.0, use NC_FORMATX_NC3 */ +#define NC_FORMAT_NC_HDF5 NC_FORMATX_NC_HDF5 /**< \deprecated As of 4.4.0, use NC_FORMATX_NC_HDF5 */ +#define NC_FORMAT_NC4 NC_FORMATX_NC4 /**< \deprecated As of 4.4.0, use NC_FORMATX_NC4 */ +#define NC_FORMAT_NC_HDF4 NC_FORMATX_NC_HDF4 /**< \deprecated As of 4.4.0, use NC_FORMATX_HDF4 */ +#define NC_FORMAT_PNETCDF NC_FORMATX_PNETCDF /**< \deprecated As of 4.4.0, use NC_FORMATX_PNETCDF */ +#define NC_FORMAT_DAP2 NC_FORMATX_DAP2 /**< \deprecated As of 4.4.0, use NC_FORMATX_DAP2 */ +#define NC_FORMAT_DAP4 NC_FORMATX_DAP4 /**< \deprecated As of 4.4.0, use NC_FORMATX_DAP4 */ +#define NC_FORMAT_UNDEFINED NC_FORMATX_UNDEFINED /**< \deprecated As of 4.4.0, use NC_FORMATX_UNDEFINED */ + +/**@}*/ + +/** Let nc__create() or nc__open() figure out a suitable buffer size. */ +#define NC_SIZEHINT_DEFAULT 0 + +/** In nc__enddef(), align to the buffer size. */ +#define NC_ALIGN_CHUNK ((size_t)(-1)) + +/** Size argument to nc_def_dim() for an unlimited dimension. */ +#define NC_UNLIMITED 0L + +/** Attribute id to put/get a global attribute. */ +#define NC_GLOBAL -1 + +/** +Maximum for classic library. + +In the classic netCDF model there are maximum values for the number of +dimensions in the file (\ref NC_MAX_DIMS), the number of global or per +variable attributes (\ref NC_MAX_ATTRS), the number of variables in +the file (\ref NC_MAX_VARS), and the length of a name (\ref +NC_MAX_NAME). + +These maximums are enforced by the interface, to facilitate writing +applications and utilities. However, nothing is statically allocated +to these sizes internally. + +These maximums are not used for netCDF-4/HDF5 files unless they were +created with the ::NC_CLASSIC_MODEL flag. + +As a rule, NC_MAX_VAR_DIMS <= NC_MAX_DIMS. +*/ +/**@{*/ +#define NC_MAX_DIMS 1024 +#define NC_MAX_ATTRS 8192 +#define NC_MAX_VARS 8192 +#define NC_MAX_NAME 256 +#define NC_MAX_VAR_DIMS 1024 /**< max per variable dimensions */ +/**@}*/ + +/** This is the max size of an SD dataset name in HDF4 (from HDF4 documentation).*/ +#define NC_MAX_HDF4_NAME 64 + +/** In HDF5 files you can set the endianness of variables with + nc_def_var_endian(). This define is used there. */ +/**@{*/ +#define NC_ENDIAN_NATIVE 0 +#define NC_ENDIAN_LITTLE 1 +#define NC_ENDIAN_BIG 2 +/**@}*/ + +/** In HDF5 files you can set storage for each variable to be either + * contiguous or chunked, with nc_def_var_chunking(). This define is + * used there. */ +/**@{*/ +#define NC_CHUNKED 0 +#define NC_CONTIGUOUS 1 +/**@}*/ + +/** In HDF5 files you can set check-summing for each variable. +Currently the only checksum available is Fletcher-32, which can be set +with the function nc_def_var_fletcher32. These defines are used +there. */ +/**@{*/ +#define NC_NOCHECKSUM 0 +#define NC_FLETCHER32 1 +/**@}*/ + +/**@{*/ +/** Control the HDF5 shuffle filter. In HDF5 files you can specify + * that a shuffle filter should be used on each chunk of a variable to + * improve compression for that variable. This per-variable shuffle + * property can be set with the function nc_def_var_deflate(). */ +#define NC_NOSHUFFLE 0 +#define NC_SHUFFLE 1 +/**@}*/ + +/** The netcdf version 3 functions all return integer error status. + * These are the possible values, in addition to certain values from + * the system errno.h. + */ +#define NC_ISSYSERR(err) ((err) > 0) + +#define NC_NOERR 0 /**< No Error */ +#define NC2_ERR (-1) /**< Returned for all errors in the v2 API. */ + +/** Not a netcdf id. + +The specified netCDF ID does not refer to an +open netCDF dataset. */ +#define NC_EBADID (-33) +#define NC_ENFILE (-34) /**< Too many netcdfs open */ +#define NC_EEXIST (-35) /**< netcdf file exists && NC_NOCLOBBER */ +#define NC_EINVAL (-36) /**< Invalid Argument */ +#define NC_EPERM (-37) /**< Write to read only */ + +/** Operation not allowed in data mode. This is returned for netCDF +classic or 64-bit offset files, or for netCDF-4 files, when they were +been created with ::NC_CLASSIC_MODEL flag in nc_create(). */ +#define NC_ENOTINDEFINE (-38) + +/** Operation not allowed in define mode. + +The specified netCDF is in define mode rather than data mode. + +With netCDF-4/HDF5 files, this error will not occur, unless +::NC_CLASSIC_MODEL was used in nc_create(). + */ +#define NC_EINDEFINE (-39) + +/** Index exceeds dimension bound. + +The specified corner indices were out of range for the rank of the +specified variable. For example, a negative index or an index that is +larger than the corresponding dimension length will cause an error. */ +#define NC_EINVALCOORDS (-40) + +/** NC_MAX_DIMS exceeded. Max number of dimensions exceeded in a +classic or 64-bit offset file, or an netCDF-4 file with +::NC_CLASSIC_MODEL on. */ +#define NC_EMAXDIMS (-41) + +#define NC_ENAMEINUSE (-42) /**< String match to name in use */ +#define NC_ENOTATT (-43) /**< Attribute not found */ +#define NC_EMAXATTS (-44) /**< NC_MAX_ATTRS exceeded */ +#define NC_EBADTYPE (-45) /**< Not a netcdf data type */ +#define NC_EBADDIM (-46) /**< Invalid dimension id or name */ +#define NC_EUNLIMPOS (-47) /**< NC_UNLIMITED in the wrong index */ + +/** NC_MAX_VARS exceeded. Max number of variables exceeded in a +classic or 64-bit offset file, or an netCDF-4 file with +::NC_CLASSIC_MODEL on. */ +#define NC_EMAXVARS (-48) + +/** Variable not found. + +The variable ID is invalid for the specified netCDF dataset. */ +#define NC_ENOTVAR (-49) +#define NC_EGLOBAL (-50) /**< Action prohibited on NC_GLOBAL varid */ +#define NC_ENOTNC (-51) /**< Not a netcdf file */ +#define NC_ESTS (-52) /**< In Fortran, string too short */ +#define NC_EMAXNAME (-53) /**< NC_MAX_NAME exceeded */ +#define NC_EUNLIMIT (-54) /**< NC_UNLIMITED size already in use */ +#define NC_ENORECVARS (-55) /**< nc_rec op when there are no record vars */ +#define NC_ECHAR (-56) /**< Attempt to convert between text & numbers */ + +/** Start+count exceeds dimension bound. + +The specified edge lengths added to the specified corner would have +referenced data out of range for the rank of the specified +variable. For example, an edge length that is larger than the +corresponding dimension length minus the corner index will cause an +error. */ +#define NC_EEDGE (-57) +#define NC_ESTRIDE (-58) /**< Illegal stride */ +#define NC_EBADNAME (-59) /**< Attribute or variable name contains illegal characters */ +/* N.B. following must match value in ncx.h */ + +/** Math result not representable. + +One or more of the values are out of the range of values representable +by the desired type. */ +#define NC_ERANGE (-60) +#define NC_ENOMEM (-61) /**< Memory allocation (malloc) failure */ +#define NC_EVARSIZE (-62) /**< One or more variable sizes violate format constraints */ +#define NC_EDIMSIZE (-63) /**< Invalid dimension size */ +#define NC_ETRUNC (-64) /**< File likely truncated or possibly corrupted */ +#define NC_EAXISTYPE (-65) /**< Unknown axis type. */ + +/* Following errors are added for DAP */ +#define NC_EDAP (-66) /**< Generic DAP error */ +#define NC_ECURL (-67) /**< Generic libcurl error */ +#define NC_EIO (-68) /**< Generic IO error */ +#define NC_ENODATA (-69) /**< Attempt to access variable with no data */ +#define NC_EDAPSVC (-70) /**< DAP server error */ +#define NC_EDAS (-71) /**< Malformed or inaccessible DAS */ +#define NC_EDDS (-72) /**< Malformed or inaccessible DDS */ +#define NC_EDATADDS (-73) /**< Malformed or inaccessible DATADDS */ +#define NC_EDAPURL (-74) /**< Malformed DAP URL */ +#define NC_EDAPCONSTRAINT (-75) /**< Malformed DAP Constraint*/ +#define NC_ETRANSLATION (-76) /**< Untranslatable construct */ +#define NC_EACCESS (-77) /**< Access Failure */ +#define NC_EAUTH (-78) /**< Authorization Failure */ + +/* Misc. additional errors */ +#define NC_ENOTFOUND (-90) /**< No such file */ +#define NC_ECANTREMOVE (-91) /**< Can't remove file */ + +/* The following was added in support of netcdf-4. Make all netcdf-4 + error codes < -100 so that errors can be added to netcdf-3 if + needed. */ +#define NC4_FIRST_ERROR (-100) + +/** Error at HDF5 layer. */ +#define NC_EHDFERR (-101) +#define NC_ECANTREAD (-102) /**< Can't read. */ +#define NC_ECANTWRITE (-103) /**< Can't write. */ +#define NC_ECANTCREATE (-104) /**< Can't create. */ +#define NC_EFILEMETA (-105) /**< Problem with file metadata. */ +#define NC_EDIMMETA (-106) /**< Problem with dimension metadata. */ +#define NC_EATTMETA (-107) /**< Problem with attribute metadata. */ +#define NC_EVARMETA (-108) /**< Problem with variable metadata. */ +#define NC_ENOCOMPOUND (-109) /**< Not a compound type. */ +#define NC_EATTEXISTS (-110) /**< Attribute already exists. */ +#define NC_ENOTNC4 (-111) /**< Attempting netcdf-4 operation on netcdf-3 file. */ + +/** Attempting netcdf-4 operation on strict nc3 netcdf-4 file. */ +#define NC_ESTRICTNC3 (-112) +#define NC_ENOTNC3 (-113) /**< Attempting netcdf-3 operation on netcdf-4 file. */ +#define NC_ENOPAR (-114) /**< Parallel operation on file opened for non-parallel access. */ +#define NC_EPARINIT (-115) /**< Error initializing for parallel access. */ +#define NC_EBADGRPID (-116) /**< Bad group ID. */ +#define NC_EBADTYPID (-117) /**< Bad type ID. */ +#define NC_ETYPDEFINED (-118) /**< Type has already been defined and may not be edited. */ +#define NC_EBADFIELD (-119) /**< Bad field ID. */ +#define NC_EBADCLASS (-120) /**< Bad class. */ +#define NC_EMAPTYPE (-121) /**< Mapped access for atomic types only. */ +#define NC_ELATEFILL (-122) /**< Attempt to define fill value when data already exists. */ +#define NC_ELATEDEF (-123) /**< Attempt to define var properties, like deflate, after enddef. */ +#define NC_EDIMSCALE (-124) /**< Problem with HDF5 dimscales. */ +#define NC_ENOGRP (-125) /**< No group found. */ +#define NC_ESTORAGE (-126) /**< Can't specify both contiguous and chunking. */ +#define NC_EBADCHUNK (-127) /**< Bad chunksize. */ +#define NC_ENOTBUILT (-128) /**< Attempt to use feature that was not turned on when netCDF was built. */ +#define NC_EDISKLESS (-129) /**< Error in using diskless access. */ +#define NC_ECANTEXTEND (-130) /**< Attempt to extend dataset during ind. I/O operation. */ +#define NC_EMPI (-131) /**< MPI operation failed. */ + +#define NC4_LAST_ERROR (-131) + +/* This is used in netCDF-4 files for dimensions without coordinate + * vars. */ +#define DIM_WITHOUT_VARIABLE "This is a netCDF dimension but not a netCDF variable." + +/* This is here at the request of the NCO team to support our + * mistake of having chunksizes be first ints, then size_t. Doh! */ +#define NC_HAVE_NEW_CHUNKING_API 1 + + +/*Errors for all remote access methods(e.g. DAP and CDMREMOTE)*/ +#define NC_EURL (NC_EDAPURL) /* Malformed URL */ +#define NC_ECONSTRAINT (NC_EDAPCONSTRAINT) /* Malformed Constraint*/ + + +/* + * The Interface + */ + +/* Declaration modifiers for DLL support (MSC et al) */ +#if defined(DLL_NETCDF) /* define when library is a DLL */ +# if defined(DLL_EXPORT) /* define when building the library */ +# define MSC_EXTRA __declspec(dllexport) +# else +# define MSC_EXTRA __declspec(dllimport) +# endif +#include <io.h> +#else +#define MSC_EXTRA +#endif /* defined(DLL_NETCDF) */ + +# define EXTERNL MSC_EXTRA extern + +#if defined(DLL_NETCDF) /* define when library is a DLL */ +EXTERNL int ncerr; +EXTERNL int ncopts; +#endif + +EXTERNL const char * +nc_inq_libvers(void); + +EXTERNL const char * +nc_strerror(int ncerr); + +EXTERNL int +nc__create(const char *path, int cmode, size_t initialsz, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc_create(const char *path, int cmode, int *ncidp); + +EXTERNL int +nc__open(const char *path, int mode, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc_open(const char *path, int mode, int *ncidp); + +/* Learn the path used to open/create the file. */ +EXTERNL int +nc_inq_path(int ncid, size_t *pathlen, char *path); + +/* Given an ncid and group name (NULL gets root group), return + * locid. */ +EXTERNL int +nc_inq_ncid(int ncid, const char *name, int *grp_ncid); + +/* Given a location id, return the number of groups it contains, and + * an array of their locids. */ +EXTERNL int +nc_inq_grps(int ncid, int *numgrps, int *ncids); + +/* Given locid, find name of group. (Root group is named "/".) */ +EXTERNL int +nc_inq_grpname(int ncid, char *name); + +/* Given ncid, find full name and len of full name. (Root group is + * named "/", with length 1.) */ +EXTERNL int +nc_inq_grpname_full(int ncid, size_t *lenp, char *full_name); + +/* Given ncid, find len of full name. */ +EXTERNL int +nc_inq_grpname_len(int ncid, size_t *lenp); + +/* Given an ncid, find the ncid of its parent group. */ +EXTERNL int +nc_inq_grp_parent(int ncid, int *parent_ncid); + +/* Given a name and parent ncid, find group ncid. */ +EXTERNL int +nc_inq_grp_ncid(int ncid, const char *grp_name, int *grp_ncid); + +/* Given a full name and ncid, find group ncid. */ +EXTERNL int +nc_inq_grp_full_ncid(int ncid, const char *full_name, int *grp_ncid); + +/* Get a list of ids for all the variables in a group. */ +EXTERNL int +nc_inq_varids(int ncid, int *nvars, int *varids); + +/* Find all dimids for a location. This finds all dimensions in a + * group, or any of its parents. */ +EXTERNL int +nc_inq_dimids(int ncid, int *ndims, int *dimids, int include_parents); + +/* Find all user-defined types for a location. This finds all + * user-defined types in a group. */ +EXTERNL int +nc_inq_typeids(int ncid, int *ntypes, int *typeids); + +/* Are two types equal? */ +EXTERNL int +nc_inq_type_equal(int ncid1, nc_type typeid1, int ncid2, + nc_type typeid2, int *equal); + +/* Create a group. its ncid is returned in the new_ncid pointer. */ +EXTERNL int +nc_def_grp(int parent_ncid, const char *name, int *new_ncid); + +/* Rename a group */ +EXTERNL int +nc_rename_grp(int grpid, const char *name); + +/* Here are functions for dealing with compound types. */ + +/* Create a compound type. */ +EXTERNL int +nc_def_compound(int ncid, size_t size, const char *name, nc_type *typeidp); + +/* Insert a named field into a compound type. */ +EXTERNL int +nc_insert_compound(int ncid, nc_type xtype, const char *name, + size_t offset, nc_type field_typeid); + +/* Insert a named array into a compound type. */ +EXTERNL int +nc_insert_array_compound(int ncid, nc_type xtype, const char *name, + size_t offset, nc_type field_typeid, + int ndims, const int *dim_sizes); + +/* Get the name and size of a type. */ +EXTERNL int +nc_inq_type(int ncid, nc_type xtype, char *name, size_t *size); + +/* Get the id of a type from the name. */ +EXTERNL int +nc_inq_typeid(int ncid, const char *name, nc_type *typeidp); + +/* Get the name, size, and number of fields in a compound type. */ +EXTERNL int +nc_inq_compound(int ncid, nc_type xtype, char *name, size_t *sizep, + size_t *nfieldsp); + +/* Get the name of a compound type. */ +EXTERNL int +nc_inq_compound_name(int ncid, nc_type xtype, char *name); + +/* Get the size of a compound type. */ +EXTERNL int +nc_inq_compound_size(int ncid, nc_type xtype, size_t *sizep); + +/* Get the number of fields in this compound type. */ +EXTERNL int +nc_inq_compound_nfields(int ncid, nc_type xtype, size_t *nfieldsp); + +/* Given the xtype and the fieldid, get all info about it. */ +EXTERNL int +nc_inq_compound_field(int ncid, nc_type xtype, int fieldid, char *name, + size_t *offsetp, nc_type *field_typeidp, int *ndimsp, + int *dim_sizesp); + +/* Given the typeid and the fieldid, get the name. */ +EXTERNL int +nc_inq_compound_fieldname(int ncid, nc_type xtype, int fieldid, + char *name); + +/* Given the xtype and the name, get the fieldid. */ +EXTERNL int +nc_inq_compound_fieldindex(int ncid, nc_type xtype, const char *name, + int *fieldidp); + +/* Given the xtype and fieldid, get the offset. */ +EXTERNL int +nc_inq_compound_fieldoffset(int ncid, nc_type xtype, int fieldid, + size_t *offsetp); + +/* Given the xtype and the fieldid, get the type of that field. */ +EXTERNL int +nc_inq_compound_fieldtype(int ncid, nc_type xtype, int fieldid, + nc_type *field_typeidp); + +/* Given the xtype and the fieldid, get the number of dimensions for + * that field (scalars are 0). */ +EXTERNL int +nc_inq_compound_fieldndims(int ncid, nc_type xtype, int fieldid, + int *ndimsp); + +/* Given the xtype and the fieldid, get the sizes of dimensions for + * that field. User must have allocated storage for the dim_sizes. */ +EXTERNL int +nc_inq_compound_fielddim_sizes(int ncid, nc_type xtype, int fieldid, + int *dim_sizes); + +/** This is the type of arrays of vlens. */ +typedef struct { + size_t len; /**< Length of VL data (in base type units) */ + void *p; /**< Pointer to VL data */ +} nc_vlen_t; + +/** Calculate an offset for creating a compound type. This calls a + * mysterious C macro which was found carved into one of the blocks of + * the Newgrange passage tomb in County Meath, Ireland. This code has + * been carbon dated to 3200 B.C.E. */ +#define NC_COMPOUND_OFFSET(S,M) (offsetof(S,M)) + +/* Create a variable length type. */ +EXTERNL int +nc_def_vlen(int ncid, const char *name, nc_type base_typeid, nc_type *xtypep); + +/* Find out about a vlen. */ +EXTERNL int +nc_inq_vlen(int ncid, nc_type xtype, char *name, size_t *datum_sizep, + nc_type *base_nc_typep); + +/* When you read VLEN type the library will actually allocate the + * storage space for the data. This storage space must be freed, so + * pass the pointer back to this function, when you're done with the + * data, and it will free the vlen memory. */ +EXTERNL int +nc_free_vlen(nc_vlen_t *vl); + +EXTERNL int +nc_free_vlens(size_t len, nc_vlen_t vlens[]); + +/* Put or get one element in a vlen array. */ +EXTERNL int +nc_put_vlen_element(int ncid, int typeid1, void *vlen_element, + size_t len, const void *data); + +EXTERNL int +nc_get_vlen_element(int ncid, int typeid1, const void *vlen_element, + size_t *len, void *data); + +/* When you read the string type the library will allocate the storage + * space for the data. This storage space must be freed, so pass the + * pointer back to this function, when you're done with the data, and + * it will free the string memory. */ +EXTERNL int +nc_free_string(size_t len, char **data); + +/* Find out about a user defined type. */ +EXTERNL int +nc_inq_user_type(int ncid, nc_type xtype, char *name, size_t *size, + nc_type *base_nc_typep, size_t *nfieldsp, int *classp); + +/* Write an attribute of any type. */ +EXTERNL int +nc_put_att(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const void *op); + +/* Read an attribute of any type. */ +EXTERNL int +nc_get_att(int ncid, int varid, const char *name, void *ip); + +/* Enum type. */ + +/* Create an enum type. Provide a base type and a name. At the moment + * only ints are accepted as base types. */ +EXTERNL int +nc_def_enum(int ncid, nc_type base_typeid, const char *name, + nc_type *typeidp); + +/* Insert a named value into an enum type. The value must fit within + * the size of the enum type, the name size must be <= NC_MAX_NAME. */ +EXTERNL int +nc_insert_enum(int ncid, nc_type xtype, const char *name, + const void *value); + +/* Get information about an enum type: its name, base type and the + * number of members defined. */ +EXTERNL int +nc_inq_enum(int ncid, nc_type xtype, char *name, nc_type *base_nc_typep, + size_t *base_sizep, size_t *num_membersp); + +/* Get information about an enum member: a name and value. Name size + * will be <= NC_MAX_NAME. */ +EXTERNL int +nc_inq_enum_member(int ncid, nc_type xtype, int idx, char *name, + void *value); + + +/* Get enum name from enum value. Name size will be <= NC_MAX_NAME. */ +EXTERNL int +nc_inq_enum_ident(int ncid, nc_type xtype, long long value, char *identifier); + +/* Opaque type. */ + +/* Create an opaque type. Provide a size and a name. */ +EXTERNL int +nc_def_opaque(int ncid, size_t size, const char *name, nc_type *xtypep); + +/* Get information about an opaque type. */ +EXTERNL int +nc_inq_opaque(int ncid, nc_type xtype, char *name, size_t *sizep); + +/* Write entire var of any type. */ +EXTERNL int +nc_put_var(int ncid, int varid, const void *op); + +/* Read entire var of any type. */ +EXTERNL int +nc_get_var(int ncid, int varid, void *ip); + +/* Write one value. */ +EXTERNL int +nc_put_var1(int ncid, int varid, const size_t *indexp, + const void *op); + +/* Read one value. */ +EXTERNL int +nc_get_var1(int ncid, int varid, const size_t *indexp, void *ip); + +/* Write an array of values. */ +EXTERNL int +nc_put_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, const void *op); + +/* Read an array of values. */ +EXTERNL int +nc_get_vara(int ncid, int varid, const size_t *startp, + const size_t *countp, void *ip); + +/* Write slices of an array of values. */ +EXTERNL int +nc_put_vars(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const void *op); + +/* Read slices of an array of values. */ +EXTERNL int +nc_get_vars(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + void *ip); + +/* Write mapped slices of an array of values. */ +EXTERNL int +nc_put_varm(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const void *op); + +/* Read mapped slices of an array of values. */ +EXTERNL int +nc_get_varm(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, void *ip); + +/* Extra netcdf-4 stuff. */ + +/* Set compression settings for a variable. Lower is faster, higher is + * better. Must be called after nc_def_var and before nc_enddef. */ +EXTERNL int +nc_def_var_deflate(int ncid, int varid, int shuffle, int deflate, + int deflate_level); + +/* Find out compression settings of a var. */ +EXTERNL int +nc_inq_var_deflate(int ncid, int varid, int *shufflep, + int *deflatep, int *deflate_levelp); + +/* Find out szip settings of a var. */ +EXTERNL int +nc_inq_var_szip(int ncid, int varid, int *options_maskp, int *pixels_per_blockp); + +/* Set fletcher32 checksum for a var. This must be done after nc_def_var + and before nc_enddef. */ +EXTERNL int +nc_def_var_fletcher32(int ncid, int varid, int fletcher32); + +/* Inquire about fletcher32 checksum for a var. */ +EXTERNL int +nc_inq_var_fletcher32(int ncid, int varid, int *fletcher32p); + +/* Define chunking for a variable. This must be done after nc_def_var + and before nc_enddef. */ +EXTERNL int +nc_def_var_chunking(int ncid, int varid, int storage, const size_t *chunksizesp); + +/* Inq chunking stuff for a var. */ +EXTERNL int +nc_inq_var_chunking(int ncid, int varid, int *storagep, size_t *chunksizesp); + +/* Define fill value behavior for a variable. This must be done after + nc_def_var and before nc_enddef. */ +EXTERNL int +nc_def_var_fill(int ncid, int varid, int no_fill, const void *fill_value); + +/* Inq fill value setting for a var. */ +EXTERNL int +nc_inq_var_fill(int ncid, int varid, int *no_fill, void *fill_valuep); + +/* Define the endianness of a variable. */ +EXTERNL int +nc_def_var_endian(int ncid, int varid, int endian); + +/* Learn about the endianness of a variable. */ +EXTERNL int +nc_inq_var_endian(int ncid, int varid, int *endianp); + +/* Set the fill mode (classic or 64-bit offset files only). */ +EXTERNL int +nc_set_fill(int ncid, int fillmode, int *old_modep); + +/* Set the default nc_create format to NC_FORMAT_CLASSIC, + * NC_FORMAT_64BIT, NC_FORMAT_NETCDF4, etc */ +EXTERNL int +nc_set_default_format(int format, int *old_formatp); + +/* Set the cache size, nelems, and preemption policy. */ +EXTERNL int +nc_set_chunk_cache(size_t size, size_t nelems, float preemption); + +/* Get the cache size, nelems, and preemption policy. */ +EXTERNL int +nc_get_chunk_cache(size_t *sizep, size_t *nelemsp, float *preemptionp); + +/* Set the per-variable cache size, nelems, and preemption policy. */ +EXTERNL int +nc_set_var_chunk_cache(int ncid, int varid, size_t size, size_t nelems, + float preemption); + +/* Get the per-variable cache size, nelems, and preemption policy. */ +EXTERNL int +nc_get_var_chunk_cache(int ncid, int varid, size_t *sizep, size_t *nelemsp, + float *preemptionp); + +EXTERNL int +nc_redef(int ncid); + +/* Is this ever used? Convert to parameter form */ +EXTERNL int +nc__enddef(int ncid, size_t h_minfree, size_t v_align, + size_t v_minfree, size_t r_align); + +EXTERNL int +nc_enddef(int ncid); + +EXTERNL int +nc_sync(int ncid); + +EXTERNL int +nc_abort(int ncid); + +EXTERNL int +nc_close(int ncid); + +EXTERNL int +nc_inq(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimidp); + +EXTERNL int +nc_inq_ndims(int ncid, int *ndimsp); + +EXTERNL int +nc_inq_nvars(int ncid, int *nvarsp); + +EXTERNL int +nc_inq_natts(int ncid, int *nattsp); + +EXTERNL int +nc_inq_unlimdim(int ncid, int *unlimdimidp); + +/* The next function is for NetCDF-4 only */ +EXTERNL int +nc_inq_unlimdims(int ncid, int *nunlimdimsp, int *unlimdimidsp); + +/* Added in 3.6.1 to return format of netCDF file. */ +EXTERNL int +nc_inq_format(int ncid, int *formatp); + +/* Added in 4.3.1 to return additional format info */ +EXTERNL int +nc_inq_format_extended(int ncid, int *formatp, int* modep); + +/* Begin _dim */ + +EXTERNL int +nc_def_dim(int ncid, const char *name, size_t len, int *idp); + +EXTERNL int +nc_inq_dimid(int ncid, const char *name, int *idp); + +EXTERNL int +nc_inq_dim(int ncid, int dimid, char *name, size_t *lenp); + +EXTERNL int +nc_inq_dimname(int ncid, int dimid, char *name); + +EXTERNL int +nc_inq_dimlen(int ncid, int dimid, size_t *lenp); + +EXTERNL int +nc_rename_dim(int ncid, int dimid, const char *name); + +/* End _dim */ +/* Begin _att */ + +EXTERNL int +nc_inq_att(int ncid, int varid, const char *name, + nc_type *xtypep, size_t *lenp); + +EXTERNL int +nc_inq_attid(int ncid, int varid, const char *name, int *idp); + +EXTERNL int +nc_inq_atttype(int ncid, int varid, const char *name, nc_type *xtypep); + +EXTERNL int +nc_inq_attlen(int ncid, int varid, const char *name, size_t *lenp); + +EXTERNL int +nc_inq_attname(int ncid, int varid, int attnum, char *name); + +EXTERNL int +nc_copy_att(int ncid_in, int varid_in, const char *name, int ncid_out, int varid_out); + +EXTERNL int +nc_rename_att(int ncid, int varid, const char *name, const char *newname); + +EXTERNL int +nc_del_att(int ncid, int varid, const char *name); + +/* End _att */ +/* Begin {put,get}_att */ +EXTERNL int +nc_put_att_text(int ncid, int varid, const char *name, + size_t len, const char *op); + +EXTERNL int +nc_get_att_text(int ncid, int varid, const char *name, char *ip); + +EXTERNL int +nc_put_att_string(int ncid, int varid, const char *name, + size_t len, const char **op); + +EXTERNL int +nc_get_att_string(int ncid, int varid, const char *name, char **ip); + +EXTERNL int +nc_put_att_uchar(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned char *op); + +EXTERNL int +nc_get_att_uchar(int ncid, int varid, const char *name, unsigned char *ip); + +EXTERNL int +nc_put_att_schar(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const signed char *op); + +EXTERNL int +nc_get_att_schar(int ncid, int varid, const char *name, signed char *ip); + +EXTERNL int +nc_put_att_short(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const short *op); + +EXTERNL int +nc_get_att_short(int ncid, int varid, const char *name, short *ip); + +EXTERNL int +nc_put_att_int(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const int *op); + +EXTERNL int +nc_get_att_int(int ncid, int varid, const char *name, int *ip); + +EXTERNL int +nc_put_att_long(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const long *op); + +EXTERNL int +nc_get_att_long(int ncid, int varid, const char *name, long *ip); + +EXTERNL int +nc_put_att_float(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const float *op); + +EXTERNL int +nc_get_att_float(int ncid, int varid, const char *name, float *ip); + +EXTERNL int +nc_put_att_double(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const double *op); + +EXTERNL int +nc_get_att_double(int ncid, int varid, const char *name, double *ip); + +EXTERNL int +nc_put_att_ushort(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned short *op); + +EXTERNL int +nc_get_att_ushort(int ncid, int varid, const char *name, unsigned short *ip); + +EXTERNL int +nc_put_att_uint(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned int *op); + +EXTERNL int +nc_get_att_uint(int ncid, int varid, const char *name, unsigned int *ip); + +EXTERNL int +nc_put_att_longlong(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const long long *op); + +EXTERNL int +nc_get_att_longlong(int ncid, int varid, const char *name, long long *ip); + +EXTERNL int +nc_put_att_ulonglong(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned long long *op); + +EXTERNL int +nc_get_att_ulonglong(int ncid, int varid, const char *name, + unsigned long long *ip); + + +/* End {put,get}_att */ +/* Begin _var */ + +EXTERNL int +nc_def_var(int ncid, const char *name, nc_type xtype, int ndims, + const int *dimidsp, int *varidp); + +EXTERNL int +nc_inq_var(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp); + +EXTERNL int +nc_inq_varid(int ncid, const char *name, int *varidp); + +EXTERNL int +nc_inq_varname(int ncid, int varid, char *name); + +EXTERNL int +nc_inq_vartype(int ncid, int varid, nc_type *xtypep); + +EXTERNL int +nc_inq_varndims(int ncid, int varid, int *ndimsp); + +EXTERNL int +nc_inq_vardimid(int ncid, int varid, int *dimidsp); + +EXTERNL int +nc_inq_varnatts(int ncid, int varid, int *nattsp); + +EXTERNL int +nc_rename_var(int ncid, int varid, const char *name); + +EXTERNL int +nc_copy_var(int ncid_in, int varid, int ncid_out); + +#ifndef ncvarcpy +/* support the old name for now */ +#define ncvarcpy(ncid_in, varid, ncid_out) ncvarcopy((ncid_in), (varid), (ncid_out)) +#endif + +/* End _var */ +/* Begin {put,get}_var1 */ + +EXTERNL int +nc_put_var1_text(int ncid, int varid, const size_t *indexp, const char *op); + +EXTERNL int +nc_get_var1_text(int ncid, int varid, const size_t *indexp, char *ip); + +EXTERNL int +nc_put_var1_uchar(int ncid, int varid, const size_t *indexp, + const unsigned char *op); + +EXTERNL int +nc_get_var1_uchar(int ncid, int varid, const size_t *indexp, + unsigned char *ip); + +EXTERNL int +nc_put_var1_schar(int ncid, int varid, const size_t *indexp, + const signed char *op); + +EXTERNL int +nc_get_var1_schar(int ncid, int varid, const size_t *indexp, + signed char *ip); + +EXTERNL int +nc_put_var1_short(int ncid, int varid, const size_t *indexp, + const short *op); + +EXTERNL int +nc_get_var1_short(int ncid, int varid, const size_t *indexp, + short *ip); + +EXTERNL int +nc_put_var1_int(int ncid, int varid, const size_t *indexp, const int *op); + +EXTERNL int +nc_get_var1_int(int ncid, int varid, const size_t *indexp, int *ip); + +EXTERNL int +nc_put_var1_long(int ncid, int varid, const size_t *indexp, const long *op); + +EXTERNL int +nc_get_var1_long(int ncid, int varid, const size_t *indexp, long *ip); + +EXTERNL int +nc_put_var1_float(int ncid, int varid, const size_t *indexp, const float *op); + +EXTERNL int +nc_get_var1_float(int ncid, int varid, const size_t *indexp, float *ip); + +EXTERNL int +nc_put_var1_double(int ncid, int varid, const size_t *indexp, const double *op); + +EXTERNL int +nc_get_var1_double(int ncid, int varid, const size_t *indexp, double *ip); + +EXTERNL int +nc_put_var1_ushort(int ncid, int varid, const size_t *indexp, + const unsigned short *op); + +EXTERNL int +nc_get_var1_ushort(int ncid, int varid, const size_t *indexp, + unsigned short *ip); + +EXTERNL int +nc_put_var1_uint(int ncid, int varid, const size_t *indexp, + const unsigned int *op); + +EXTERNL int +nc_get_var1_uint(int ncid, int varid, const size_t *indexp, + unsigned int *ip); + +EXTERNL int +nc_put_var1_longlong(int ncid, int varid, const size_t *indexp, + const long long *op); + +EXTERNL int +nc_get_var1_longlong(int ncid, int varid, const size_t *indexp, + long long *ip); + +EXTERNL int +nc_put_var1_ulonglong(int ncid, int varid, const size_t *indexp, + const unsigned long long *op); + +EXTERNL int +nc_get_var1_ulonglong(int ncid, int varid, const size_t *indexp, + unsigned long long *ip); + +EXTERNL int +nc_put_var1_string(int ncid, int varid, const size_t *indexp, + const char **op); + +EXTERNL int +nc_get_var1_string(int ncid, int varid, const size_t *indexp, + char **ip); + +/* End {put,get}_var1 */ +/* Begin {put,get}_vara */ + +EXTERNL int +nc_put_vara_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const char *op); + +EXTERNL int +nc_get_vara_text(int ncid, int varid, const size_t *startp, + const size_t *countp, char *ip); + +EXTERNL int +nc_put_vara_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned char *op); + +EXTERNL int +nc_get_vara_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned char *ip); + +EXTERNL int +nc_put_vara_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const signed char *op); + +EXTERNL int +nc_get_vara_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, signed char *ip); + +EXTERNL int +nc_put_vara_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const short *op); + +EXTERNL int +nc_get_vara_short(int ncid, int varid, const size_t *startp, + const size_t *countp, short *ip); + +EXTERNL int +nc_put_vara_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const int *op); + +EXTERNL int +nc_get_vara_int(int ncid, int varid, const size_t *startp, + const size_t *countp, int *ip); + +EXTERNL int +nc_put_vara_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const long *op); + +EXTERNL int +nc_get_vara_long(int ncid, int varid, + const size_t *startp, const size_t *countp, long *ip); + +EXTERNL int +nc_put_vara_float(int ncid, int varid, + const size_t *startp, const size_t *countp, const float *op); + +EXTERNL int +nc_get_vara_float(int ncid, int varid, + const size_t *startp, const size_t *countp, float *ip); + +EXTERNL int +nc_put_vara_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const double *op); + +EXTERNL int +nc_get_vara_double(int ncid, int varid, const size_t *startp, + const size_t *countp, double *ip); + +EXTERNL int +nc_put_vara_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned short *op); + +EXTERNL int +nc_get_vara_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned short *ip); + +EXTERNL int +nc_put_vara_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned int *op); + +EXTERNL int +nc_get_vara_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned int *ip); + +EXTERNL int +nc_put_vara_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const long long *op); + +EXTERNL int +nc_get_vara_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, long long *ip); + +EXTERNL int +nc_put_vara_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned long long *op); + +EXTERNL int +nc_get_vara_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned long long *ip); + +EXTERNL int +nc_put_vara_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const char **op); + +EXTERNL int +nc_get_vara_string(int ncid, int varid, const size_t *startp, + const size_t *countp, char **ip); + +/* End {put,get}_vara */ +/* Begin {put,get}_vars */ + +EXTERNL int +nc_put_vars_text(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const char *op); + +EXTERNL int +nc_get_vars_text(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + char *ip); + +EXTERNL int +nc_put_vars_uchar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const unsigned char *op); + +EXTERNL int +nc_get_vars_uchar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + unsigned char *ip); + +EXTERNL int +nc_put_vars_schar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const signed char *op); + +EXTERNL int +nc_get_vars_schar(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + signed char *ip); + +EXTERNL int +nc_put_vars_short(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const short *op); + +EXTERNL int +nc_get_vars_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + short *ip); + +EXTERNL int +nc_put_vars_int(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const int *op); + +EXTERNL int +nc_get_vars_int(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + int *ip); + +EXTERNL int +nc_put_vars_long(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const long *op); + +EXTERNL int +nc_get_vars_long(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + long *ip); + +EXTERNL int +nc_put_vars_float(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const float *op); + +EXTERNL int +nc_get_vars_float(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + float *ip); + +EXTERNL int +nc_put_vars_double(int ncid, int varid, + const size_t *startp, const size_t *countp, const ptrdiff_t *stridep, + const double *op); + +EXTERNL int +nc_get_vars_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + double *ip); + +EXTERNL int +nc_put_vars_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned short *op); + +EXTERNL int +nc_get_vars_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned short *ip); + +EXTERNL int +nc_put_vars_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned int *op); + +EXTERNL int +nc_get_vars_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned int *ip); + +EXTERNL int +nc_put_vars_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const long long *op); + +EXTERNL int +nc_get_vars_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + long long *ip); + +EXTERNL int +nc_put_vars_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned long long *op); + +EXTERNL int +nc_get_vars_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned long long *ip); + +EXTERNL int +nc_put_vars_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const char **op); + +EXTERNL int +nc_get_vars_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + char **ip); + +/* End {put,get}_vars */ +/* Begin {put,get}_varm */ + +EXTERNL int +nc_put_varm_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const char *op); + +EXTERNL int +nc_get_varm_text(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, char *ip); + +EXTERNL int +nc_put_varm_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const unsigned char *op); + +EXTERNL int +nc_get_varm_uchar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, unsigned char *ip); + +EXTERNL int +nc_put_varm_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const signed char *op); + +EXTERNL int +nc_get_varm_schar(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, signed char *ip); + +EXTERNL int +nc_put_varm_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const short *op); + +EXTERNL int +nc_get_varm_short(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, short *ip); + +EXTERNL int +nc_put_varm_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const int *op); + +EXTERNL int +nc_get_varm_int(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, int *ip); + +EXTERNL int +nc_put_varm_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const long *op); + +EXTERNL int +nc_get_varm_long(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, long *ip); + +EXTERNL int +nc_put_varm_float(int ncid, int varid,const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const float *op); + +EXTERNL int +nc_get_varm_float(int ncid, int varid,const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, float *ip); + +EXTERNL int +nc_put_varm_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t *imapp, const double *op); + +EXTERNL int +nc_get_varm_double(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, double *ip); + +EXTERNL int +nc_put_varm_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned short *op); + +EXTERNL int +nc_get_varm_ushort(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned short *ip); + +EXTERNL int +nc_put_varm_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned int *op); + +EXTERNL int +nc_get_varm_uint(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned int *ip); + +EXTERNL int +nc_put_varm_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const long long *op); + +EXTERNL int +nc_get_varm_longlong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, long long *ip); + +EXTERNL int +nc_put_varm_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned long long *op); + +EXTERNL int +nc_get_varm_ulonglong(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned long long *ip); + +EXTERNL int +nc_put_varm_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const char **op); + +EXTERNL int +nc_get_varm_string(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, char **ip); + +/* End {put,get}_varm */ +/* Begin {put,get}_var */ + +EXTERNL int +nc_put_var_text(int ncid, int varid, const char *op); + +EXTERNL int +nc_get_var_text(int ncid, int varid, char *ip); + +EXTERNL int +nc_put_var_uchar(int ncid, int varid, const unsigned char *op); + +EXTERNL int +nc_get_var_uchar(int ncid, int varid, unsigned char *ip); + +EXTERNL int +nc_put_var_schar(int ncid, int varid, const signed char *op); + +EXTERNL int +nc_get_var_schar(int ncid, int varid, signed char *ip); + +EXTERNL int +nc_put_var_short(int ncid, int varid, const short *op); + +EXTERNL int +nc_get_var_short(int ncid, int varid, short *ip); + +EXTERNL int +nc_put_var_int(int ncid, int varid, const int *op); + +EXTERNL int +nc_get_var_int(int ncid, int varid, int *ip); + +EXTERNL int +nc_put_var_long(int ncid, int varid, const long *op); + +EXTERNL int +nc_get_var_long(int ncid, int varid, long *ip); + +EXTERNL int +nc_put_var_float(int ncid, int varid, const float *op); + +EXTERNL int +nc_get_var_float(int ncid, int varid, float *ip); + +EXTERNL int +nc_put_var_double(int ncid, int varid, const double *op); + +EXTERNL int +nc_get_var_double(int ncid, int varid, double *ip); + +EXTERNL int +nc_put_var_ushort(int ncid, int varid, const unsigned short *op); + +EXTERNL int +nc_get_var_ushort(int ncid, int varid, unsigned short *ip); + +EXTERNL int +nc_put_var_uint(int ncid, int varid, const unsigned int *op); + +EXTERNL int +nc_get_var_uint(int ncid, int varid, unsigned int *ip); + +EXTERNL int +nc_put_var_longlong(int ncid, int varid, const long long *op); + +EXTERNL int +nc_get_var_longlong(int ncid, int varid, long long *ip); + +EXTERNL int +nc_put_var_ulonglong(int ncid, int varid, const unsigned long long *op); + +EXTERNL int +nc_get_var_ulonglong(int ncid, int varid, unsigned long long *ip); + +EXTERNL int +nc_put_var_string(int ncid, int varid, const char **op); + +EXTERNL int +nc_get_var_string(int ncid, int varid, char **ip); + +/* Begin Deprecated, same as functions with "_ubyte" replaced by "_uchar" */ +EXTERNL int +nc_put_att_ubyte(int ncid, int varid, const char *name, nc_type xtype, + size_t len, const unsigned char *op); +EXTERNL int +nc_get_att_ubyte(int ncid, int varid, const char *name, + unsigned char *ip); +EXTERNL int +nc_put_var1_ubyte(int ncid, int varid, const size_t *indexp, + const unsigned char *op); +EXTERNL int +nc_get_var1_ubyte(int ncid, int varid, const size_t *indexp, + unsigned char *ip); +EXTERNL int +nc_put_vara_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const unsigned char *op); +EXTERNL int +nc_get_vara_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, unsigned char *ip); +EXTERNL int +nc_put_vars_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const unsigned char *op); +EXTERNL int +nc_get_vars_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + unsigned char *ip); +EXTERNL int +nc_put_varm_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, const unsigned char *op); +EXTERNL int +nc_get_varm_ubyte(int ncid, int varid, const size_t *startp, + const size_t *countp, const ptrdiff_t *stridep, + const ptrdiff_t * imapp, unsigned char *ip); +EXTERNL int +nc_put_var_ubyte(int ncid, int varid, const unsigned char *op); +EXTERNL int +nc_get_var_ubyte(int ncid, int varid, unsigned char *ip); +/* End Deprecated */ + +#ifdef LOGGING + +/* Set the log level. 0 shows only errors, 1 only major messages, + * etc., to 5, which shows way too much information. */ +EXTERNL int +nc_set_log_level(int new_level); + +/* Use this to turn off logging by calling + nc_log_level(NC_TURN_OFF_LOGGING) */ +#define NC_TURN_OFF_LOGGING (-1) + +#else /* not LOGGING */ + +#define nc_set_log_level(e) + +#endif /* LOGGING */ + +/* Show the netCDF library's in-memory metadata for a file. */ +EXTERNL int +nc_show_metadata(int ncid); + +/* End {put,get}_var */ + +/* #ifdef _CRAYMPP */ +/* + * Public interfaces to better support + * CRAY multi-processor systems like T3E. + * A tip of the hat to NERSC. + */ +/* + * It turns out we need to declare and define + * these public interfaces on all platforms + * or things get ugly working out the + * FORTRAN interface. On !_CRAYMPP platforms, + * these functions work as advertised, but you + * can only use "processor element" 0. + */ + +EXTERNL int +nc__create_mp(const char *path, int cmode, size_t initialsz, int basepe, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc__open_mp(const char *path, int mode, int basepe, + size_t *chunksizehintp, int *ncidp); + +EXTERNL int +nc_delete(const char *path); + +EXTERNL int +nc_delete_mp(const char *path, int basepe); + +EXTERNL int +nc_set_base_pe(int ncid, int pe); + +EXTERNL int +nc_inq_base_pe(int ncid, int *pe); + +/* #endif _CRAYMPP */ + +/* This v2 function is used in the nc_test program. */ +EXTERNL int +nctypelen(nc_type datatype); + +/* Begin v2.4 backward compatibility */ +/* + * defining NO_NETCDF_2 to the preprocessor + * turns off backward compatibility declarations. + */ +#ifndef NO_NETCDF_2 + +/** Backward compatible alias. */ +/**@{*/ +#define FILL_BYTE NC_FILL_BYTE +#define FILL_CHAR NC_FILL_CHAR +#define FILL_SHORT NC_FILL_SHORT +#define FILL_LONG NC_FILL_INT +#define FILL_FLOAT NC_FILL_FLOAT +#define FILL_DOUBLE NC_FILL_DOUBLE + +#define MAX_NC_DIMS NC_MAX_DIMS +#define MAX_NC_ATTRS NC_MAX_ATTRS +#define MAX_NC_VARS NC_MAX_VARS +#define MAX_NC_NAME NC_MAX_NAME +#define MAX_VAR_DIMS NC_MAX_VAR_DIMS +/**@}*/ + + +/* + * Global error status + */ +EXTERNL int ncerr; + +#define NC_ENTOOL NC_EMAXNAME /* Backward compatibility */ +#define NC_EXDR (-32) /* */ +#define NC_SYSERR (-31) + +/* + * Global options variable. + * Used to determine behavior of error handler. + */ +#define NC_FATAL 1 +#define NC_VERBOSE 2 + +EXTERNL int ncopts; /* default is (NC_FATAL | NC_VERBOSE) */ + +EXTERNL void +nc_advise(const char *cdf_routine_name, int err, const char *fmt,...); + +/* + * C data type corresponding to a netCDF NC_LONG argument, + * a signed 32 bit object. + * + * This is the only thing in this file which architecture dependent. + */ +typedef int nclong; + +EXTERNL int +nccreate(const char* path, int cmode); + +EXTERNL int +ncopen(const char* path, int mode); + +EXTERNL int +ncsetfill(int ncid, int fillmode); + +EXTERNL int +ncredef(int ncid); + +EXTERNL int +ncendef(int ncid); + +EXTERNL int +ncsync(int ncid); + +EXTERNL int +ncabort(int ncid); + +EXTERNL int +ncclose(int ncid); + +EXTERNL int +ncinquire(int ncid, int *ndimsp, int *nvarsp, int *nattsp, int *unlimdimp); + +EXTERNL int +ncdimdef(int ncid, const char *name, long len); + +EXTERNL int +ncdimid(int ncid, const char *name); + +EXTERNL int +ncdiminq(int ncid, int dimid, char *name, long *lenp); + +EXTERNL int +ncdimrename(int ncid, int dimid, const char *name); + +EXTERNL int +ncattput(int ncid, int varid, const char *name, nc_type xtype, + int len, const void *op); + +EXTERNL int +ncattinq(int ncid, int varid, const char *name, nc_type *xtypep, int *lenp); + +EXTERNL int +ncattget(int ncid, int varid, const char *name, void *ip); + +EXTERNL int +ncattcopy(int ncid_in, int varid_in, const char *name, int ncid_out, + int varid_out); + +EXTERNL int +ncattname(int ncid, int varid, int attnum, char *name); + +EXTERNL int +ncattrename(int ncid, int varid, const char *name, const char *newname); + +EXTERNL int +ncattdel(int ncid, int varid, const char *name); + +EXTERNL int +ncvardef(int ncid, const char *name, nc_type xtype, + int ndims, const int *dimidsp); + +EXTERNL int +ncvarid(int ncid, const char *name); + +EXTERNL int +ncvarinq(int ncid, int varid, char *name, nc_type *xtypep, + int *ndimsp, int *dimidsp, int *nattsp); + +EXTERNL int +ncvarput1(int ncid, int varid, const long *indexp, const void *op); + +EXTERNL int +ncvarget1(int ncid, int varid, const long *indexp, void *ip); + +EXTERNL int +ncvarput(int ncid, int varid, const long *startp, const long *countp, + const void *op); + +EXTERNL int +ncvarget(int ncid, int varid, const long *startp, const long *countp, + void *ip); + +EXTERNL int +ncvarputs(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, const void *op); + +EXTERNL int +ncvargets(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, void *ip); + +EXTERNL int +ncvarputg(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, const long *imapp, const void *op); + +EXTERNL int +ncvargetg(int ncid, int varid, const long *startp, const long *countp, + const long *stridep, const long *imapp, void *ip); + +EXTERNL int +ncvarrename(int ncid, int varid, const char *name); + +EXTERNL int +ncrecinq(int ncid, int *nrecvarsp, int *recvaridsp, long *recsizesp); + +EXTERNL int +ncrecget(int ncid, long recnum, void **datap); + +EXTERNL int +ncrecput(int ncid, long recnum, void *const *datap); + +/* EXTERNL int nc_finalize(); */ + +/* End v2.4 backward compatibility */ +#endif /*!NO_NETCDF_2*/ + +#if defined(__cplusplus) +} +#endif + +/* Temporary hack to shut up warnings */ +#ifndef __MINGW32_VERSION +#define END_OF_MAIN() +#endif + +/* Define two hard-coded functionality-related + macros, but this is not going to be + standard practice. */ +#ifndef NC_HAVE_RENAME_GRP +#define NC_HAVE_RENAME_GRP /*!< rename_grp() support. */ +#endif + +#ifndef NC_HAVE_INQ_FORMAT_EXTENDED +#define NC_HAVE_INQ_FORMAT_EXTENDED /*!< inq_format_extended() support. */ +#endif + +#define NC_HAVE_META_H + +#endif /* _NETCDF_ */ diff --git a/privatemodules/nc4/include/netcdf.inc b/privatemodules/nc4/include/netcdf.inc new file mode 100644 index 0000000000000000000000000000000000000000..1371bcb52d841c5e815043e2637b74296ad1c059 --- /dev/null +++ b/privatemodules/nc4/include/netcdf.inc @@ -0,0 +1,1740 @@ +! NetCDF-3. +! +! netcdf version 3 fortran interface: +! + +! +! external netcdf data types: +! + integer nf_byte + integer nf_int1 + integer nf_char + integer nf_short + integer nf_int2 + integer nf_int + integer nf_float + integer nf_real + integer nf_double + + parameter (nf_byte = 1) + parameter (nf_int1 = nf_byte) + parameter (nf_char = 2) + parameter (nf_short = 3) + parameter (nf_int2 = nf_short) + parameter (nf_int = 4) + parameter (nf_float = 5) + parameter (nf_real = nf_float) + parameter (nf_double = 6) + +! +! default fill values: +! + integer nf_fill_byte + integer nf_fill_int1 + integer nf_fill_char + integer nf_fill_short + integer nf_fill_int2 + integer nf_fill_int + real nf_fill_float + real nf_fill_real + doubleprecision nf_fill_double + + parameter (nf_fill_byte = -127) + parameter (nf_fill_int1 = nf_fill_byte) + parameter (nf_fill_char = 0) + parameter (nf_fill_short = -32767) + parameter (nf_fill_int2 = nf_fill_short) + parameter (nf_fill_int = -2147483647) + parameter (nf_fill_float = 9.9692099683868690e+36) + parameter (nf_fill_real = nf_fill_float) + parameter (nf_fill_double = 9.9692099683868690d+36) + +! +! mode flags for opening and creating a netcdf dataset: +! + integer nf_nowrite + integer nf_write + integer nf_clobber + integer nf_noclobber + integer nf_fill + integer nf_nofill + integer nf_lock + integer nf_share + integer nf_64bit_offset + integer nf_sizehint_default + integer nf_align_chunk + integer nf_format_classic + integer nf_format_64bit + integer nf_diskless + integer nf_mmap + + parameter (nf_nowrite = 0) + parameter (nf_write = 1) + parameter (nf_clobber = 0) + parameter (nf_noclobber = 4) + parameter (nf_fill = 0) + parameter (nf_nofill = 256) + parameter (nf_lock = 1024) + parameter (nf_share = 2048) + parameter (nf_64bit_offset = 512) + parameter (nf_sizehint_default = 0) + parameter (nf_align_chunk = -1) + parameter (nf_format_classic = 1) + parameter (nf_format_64bit = 2) + parameter (nf_diskless = 8) + parameter (nf_mmap = 16) + +! +! size argument for defining an unlimited dimension: +! + integer nf_unlimited + parameter (nf_unlimited = 0) + +! +! global attribute id: +! + integer nf_global + parameter (nf_global = 0) + +! +! implementation limits: +! + integer nf_max_dims + integer nf_max_attrs + integer nf_max_vars + integer nf_max_name + integer nf_max_var_dims + + parameter (nf_max_dims = 1024) + parameter (nf_max_attrs = 8192) + parameter (nf_max_vars = 8192) + parameter (nf_max_name = 256) + parameter (nf_max_var_dims = nf_max_dims) + +! +! error codes: +! + integer nf_noerr + integer nf_ebadid + integer nf_eexist + integer nf_einval + integer nf_eperm + integer nf_enotindefine + integer nf_eindefine + integer nf_einvalcoords + integer nf_emaxdims + integer nf_enameinuse + integer nf_enotatt + integer nf_emaxatts + integer nf_ebadtype + integer nf_ebaddim + integer nf_eunlimpos + integer nf_emaxvars + integer nf_enotvar + integer nf_eglobal + integer nf_enotnc + integer nf_ests + integer nf_emaxname + integer nf_eunlimit + integer nf_enorecvars + integer nf_echar + integer nf_eedge + integer nf_estride + integer nf_ebadname + integer nf_erange + integer nf_enomem + integer nf_evarsize + integer nf_edimsize + integer nf_etrunc + + parameter (nf_noerr = 0) + parameter (nf_ebadid = -33) + parameter (nf_eexist = -35) + parameter (nf_einval = -36) + parameter (nf_eperm = -37) + parameter (nf_enotindefine = -38) + parameter (nf_eindefine = -39) + parameter (nf_einvalcoords = -40) + parameter (nf_emaxdims = -41) + parameter (nf_enameinuse = -42) + parameter (nf_enotatt = -43) + parameter (nf_emaxatts = -44) + parameter (nf_ebadtype = -45) + parameter (nf_ebaddim = -46) + parameter (nf_eunlimpos = -47) + parameter (nf_emaxvars = -48) + parameter (nf_enotvar = -49) + parameter (nf_eglobal = -50) + parameter (nf_enotnc = -51) + parameter (nf_ests = -52) + parameter (nf_emaxname = -53) + parameter (nf_eunlimit = -54) + parameter (nf_enorecvars = -55) + parameter (nf_echar = -56) + parameter (nf_eedge = -57) + parameter (nf_estride = -58) + parameter (nf_ebadname = -59) + parameter (nf_erange = -60) + parameter (nf_enomem = -61) + parameter (nf_evarsize = -62) + parameter (nf_edimsize = -63) + parameter (nf_etrunc = -64) +! +! error handling modes: +! + integer nf_fatal + integer nf_verbose + + parameter (nf_fatal = 1) + parameter (nf_verbose = 2) + +! +! miscellaneous routines: +! + character*80 nf_inq_libvers + external nf_inq_libvers + + character*80 nf_strerror +! (integer ncerr) + external nf_strerror + + logical nf_issyserr +! (integer ncerr) + external nf_issyserr + +! +! control routines: +! + integer nf_inq_base_pe +! (integer ncid, +! integer pe) + external nf_inq_base_pe + + integer nf_set_base_pe +! (integer ncid, +! integer pe) + external nf_set_base_pe + + integer nf_create +! (character*(*) path, +! integer cmode, +! integer ncid) + external nf_create + + integer nf__create +! (character*(*) path, +! integer cmode, +! integer initialsz, +! integer chunksizehint, +! integer ncid) + external nf__create + + integer nf__create_mp +! (character*(*) path, +! integer cmode, +! integer initialsz, +! integer basepe, +! integer chunksizehint, +! integer ncid) + external nf__create_mp + + integer nf_open +! (character*(*) path, +! integer mode, +! integer ncid) + external nf_open + + integer nf__open +! (character*(*) path, +! integer mode, +! integer chunksizehint, +! integer ncid) + external nf__open + + integer nf__open_mp +! (character*(*) path, +! integer mode, +! integer basepe, +! integer chunksizehint, +! integer ncid) + external nf__open_mp + + integer nf_set_fill +! (integer ncid, +! integer fillmode, +! integer old_mode) + external nf_set_fill + + integer nf_set_default_format +! (integer format, +! integer old_format) + external nf_set_default_format + + integer nf_redef +! (integer ncid) + external nf_redef + + integer nf_enddef +! (integer ncid) + external nf_enddef + + integer nf__enddef +! (integer ncid, +! integer h_minfree, +! integer v_align, +! integer v_minfree, +! integer r_align) + external nf__enddef + + integer nf_sync +! (integer ncid) + external nf_sync + + integer nf_abort +! (integer ncid) + external nf_abort + + integer nf_close +! (integer ncid) + external nf_close + + integer nf_delete +! (character*(*) ncid) + external nf_delete + +! +! general inquiry routines: +! + + integer nf_inq +! (integer ncid, +! integer ndims, +! integer nvars, +! integer ngatts, +! integer unlimdimid) + external nf_inq + +! new inquire path + + integer nf_inq_path + external nf_inq_path + + integer nf_inq_ndims +! (integer ncid, +! integer ndims) + external nf_inq_ndims + + integer nf_inq_nvars +! (integer ncid, +! integer nvars) + external nf_inq_nvars + + integer nf_inq_natts +! (integer ncid, +! integer ngatts) + external nf_inq_natts + + integer nf_inq_unlimdim +! (integer ncid, +! integer unlimdimid) + external nf_inq_unlimdim + + integer nf_inq_format +! (integer ncid, +! integer format) + external nf_inq_format + +! +! dimension routines: +! + + integer nf_def_dim +! (integer ncid, +! character(*) name, +! integer len, +! integer dimid) + external nf_def_dim + + integer nf_inq_dimid +! (integer ncid, +! character(*) name, +! integer dimid) + external nf_inq_dimid + + integer nf_inq_dim +! (integer ncid, +! integer dimid, +! character(*) name, +! integer len) + external nf_inq_dim + + integer nf_inq_dimname +! (integer ncid, +! integer dimid, +! character(*) name) + external nf_inq_dimname + + integer nf_inq_dimlen +! (integer ncid, +! integer dimid, +! integer len) + external nf_inq_dimlen + + integer nf_rename_dim +! (integer ncid, +! integer dimid, +! character(*) name) + external nf_rename_dim + +! +! general attribute routines: +! + + integer nf_inq_att +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len) + external nf_inq_att + + integer nf_inq_attid +! (integer ncid, +! integer varid, +! character(*) name, +! integer attnum) + external nf_inq_attid + + integer nf_inq_atttype +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype) + external nf_inq_atttype + + integer nf_inq_attlen +! (integer ncid, +! integer varid, +! character(*) name, +! integer len) + external nf_inq_attlen + + integer nf_inq_attname +! (integer ncid, +! integer varid, +! integer attnum, +! character(*) name) + external nf_inq_attname + + integer nf_copy_att +! (integer ncid_in, +! integer varid_in, +! character(*) name, +! integer ncid_out, +! integer varid_out) + external nf_copy_att + + integer nf_rename_att +! (integer ncid, +! integer varid, +! character(*) curname, +! character(*) newname) + external nf_rename_att + + integer nf_del_att +! (integer ncid, +! integer varid, +! character(*) name) + external nf_del_att + +! +! attribute put/get routines: +! + + integer nf_put_att_text +! (integer ncid, +! integer varid, +! character(*) name, +! integer len, +! character(*) text) + external nf_put_att_text + + integer nf_get_att_text +! (integer ncid, +! integer varid, +! character(*) name, +! character(*) text) + external nf_get_att_text + + integer nf_put_att_int1 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int1_t i1vals(1)) + external nf_put_att_int1 + + integer nf_get_att_int1 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int1_t i1vals(1)) + external nf_get_att_int1 + + integer nf_put_att_int2 +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! nf_int2_t i2vals(1)) + external nf_put_att_int2 + + integer nf_get_att_int2 +! (integer ncid, +! integer varid, +! character(*) name, +! nf_int2_t i2vals(1)) + external nf_get_att_int2 + + integer nf_put_att_int +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! integer ivals(1)) + external nf_put_att_int + + integer nf_get_att_int +! (integer ncid, +! integer varid, +! character(*) name, +! integer ivals(1)) + external nf_get_att_int + + integer nf_put_att_real +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! real rvals(1)) + external nf_put_att_real + + integer nf_get_att_real +! (integer ncid, +! integer varid, +! character(*) name, +! real rvals(1)) + external nf_get_att_real + + integer nf_put_att_double +! (integer ncid, +! integer varid, +! character(*) name, +! integer xtype, +! integer len, +! double dvals(1)) + external nf_put_att_double + + integer nf_get_att_double +! (integer ncid, +! integer varid, +! character(*) name, +! double dvals(1)) + external nf_get_att_double + +! +! general variable routines: +! + + integer nf_def_var +! (integer ncid, +! character(*) name, +! integer datatype, +! integer ndims, +! integer dimids(1), +! integer varid) + external nf_def_var + + integer nf_inq_var +! (integer ncid, +! integer varid, +! character(*) name, +! integer datatype, +! integer ndims, +! integer dimids(1), +! integer natts) + external nf_inq_var + + integer nf_inq_varid +! (integer ncid, +! character(*) name, +! integer varid) + external nf_inq_varid + + integer nf_inq_varname +! (integer ncid, +! integer varid, +! character(*) name) + external nf_inq_varname + + integer nf_inq_vartype +! (integer ncid, +! integer varid, +! integer xtype) + external nf_inq_vartype + + integer nf_inq_varndims +! (integer ncid, +! integer varid, +! integer ndims) + external nf_inq_varndims + + integer nf_inq_vardimid +! (integer ncid, +! integer varid, +! integer dimids(1)) + external nf_inq_vardimid + + integer nf_inq_varnatts +! (integer ncid, +! integer varid, +! integer natts) + external nf_inq_varnatts + + integer nf_rename_var +! (integer ncid, +! integer varid, +! character(*) name) + external nf_rename_var + + integer nf_copy_var +! (integer ncid_in, +! integer varid, +! integer ncid_out) + external nf_copy_var + +! +! entire variable put/get routines: +! + + integer nf_put_var_text +! (integer ncid, +! integer varid, +! character(*) text) + external nf_put_var_text + + integer nf_get_var_text +! (integer ncid, +! integer varid, +! character(*) text) + external nf_get_var_text + + integer nf_put_var_int1 +! (integer ncid, +! integer varid, +! nf_int1_t i1vals(1)) + external nf_put_var_int1 + + integer nf_get_var_int1 +! (integer ncid, +! integer varid, +! nf_int1_t i1vals(1)) + external nf_get_var_int1 + + integer nf_put_var_int2 +! (integer ncid, +! integer varid, +! nf_int2_t i2vals(1)) + external nf_put_var_int2 + + integer nf_get_var_int2 +! (integer ncid, +! integer varid, +! nf_int2_t i2vals(1)) + external nf_get_var_int2 + + integer nf_put_var_int +! (integer ncid, +! integer varid, +! integer ivals(1)) + external nf_put_var_int + + integer nf_get_var_int +! (integer ncid, +! integer varid, +! integer ivals(1)) + external nf_get_var_int + + integer nf_put_var_real +! (integer ncid, +! integer varid, +! real rvals(1)) + external nf_put_var_real + + integer nf_get_var_real +! (integer ncid, +! integer varid, +! real rvals(1)) + external nf_get_var_real + + integer nf_put_var_double +! (integer ncid, +! integer varid, +! doubleprecision dvals(1)) + external nf_put_var_double + + integer nf_get_var_double +! (integer ncid, +! integer varid, +! doubleprecision dvals(1)) + external nf_get_var_double + +! +! single variable put/get routines: +! + + integer nf_put_var1_text +! (integer ncid, +! integer varid, +! integer index(1), +! character*1 text) + external nf_put_var1_text + + integer nf_get_var1_text +! (integer ncid, +! integer varid, +! integer index(1), +! character*1 text) + external nf_get_var1_text + + integer nf_put_var1_int1 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int1_t i1val) + external nf_put_var1_int1 + + integer nf_get_var1_int1 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int1_t i1val) + external nf_get_var1_int1 + + integer nf_put_var1_int2 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int2_t i2val) + external nf_put_var1_int2 + + integer nf_get_var1_int2 +! (integer ncid, +! integer varid, +! integer index(1), +! nf_int2_t i2val) + external nf_get_var1_int2 + + integer nf_put_var1_int +! (integer ncid, +! integer varid, +! integer index(1), +! integer ival) + external nf_put_var1_int + + integer nf_get_var1_int +! (integer ncid, +! integer varid, +! integer index(1), +! integer ival) + external nf_get_var1_int + + integer nf_put_var1_real +! (integer ncid, +! integer varid, +! integer index(1), +! real rval) + external nf_put_var1_real + + integer nf_get_var1_real +! (integer ncid, +! integer varid, +! integer index(1), +! real rval) + external nf_get_var1_real + + integer nf_put_var1_double +! (integer ncid, +! integer varid, +! integer index(1), +! doubleprecision dval) + external nf_put_var1_double + + integer nf_get_var1_double +! (integer ncid, +! integer varid, +! integer index(1), +! doubleprecision dval) + external nf_get_var1_double + +! +! variable array put/get routines: +! + + integer nf_put_vara_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! character(*) text) + external nf_put_vara_text + + integer nf_get_vara_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! character(*) text) + external nf_get_vara_text + + integer nf_put_vara_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int1_t i1vals(1)) + external nf_put_vara_int1 + + integer nf_get_vara_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int1_t i1vals(1)) + external nf_get_vara_int1 + + integer nf_put_vara_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int2_t i2vals(1)) + external nf_put_vara_int2 + + integer nf_get_vara_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! nf_int2_t i2vals(1)) + external nf_get_vara_int2 + + integer nf_put_vara_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer ivals(1)) + external nf_put_vara_int + + integer nf_get_vara_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer ivals(1)) + external nf_get_vara_int + + integer nf_put_vara_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! real rvals(1)) + external nf_put_vara_real + + integer nf_get_vara_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! real rvals(1)) + external nf_get_vara_real + + integer nf_put_vara_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! doubleprecision dvals(1)) + external nf_put_vara_double + + integer nf_get_vara_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! doubleprecision dvals(1)) + external nf_get_vara_double + +! +! strided variable put/get routines: +! + + integer nf_put_vars_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! character(*) text) + external nf_put_vars_text + + integer nf_get_vars_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! character(*) text) + external nf_get_vars_text + + integer nf_put_vars_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int1_t i1vals(1)) + external nf_put_vars_int1 + + integer nf_get_vars_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int1_t i1vals(1)) + external nf_get_vars_int1 + + integer nf_put_vars_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int2_t i2vals(1)) + external nf_put_vars_int2 + + integer nf_get_vars_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! nf_int2_t i2vals(1)) + external nf_get_vars_int2 + + integer nf_put_vars_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer ivals(1)) + external nf_put_vars_int + + integer nf_get_vars_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer ivals(1)) + external nf_get_vars_int + + integer nf_put_vars_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! real rvals(1)) + external nf_put_vars_real + + integer nf_get_vars_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! real rvals(1)) + external nf_get_vars_real + + integer nf_put_vars_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! doubleprecision dvals(1)) + external nf_put_vars_double + + integer nf_get_vars_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! doubleprecision dvals(1)) + external nf_get_vars_double + +! +! mapped variable put/get routines: +! + + integer nf_put_varm_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! character(*) text) + external nf_put_varm_text + + integer nf_get_varm_text +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! character(*) text) + external nf_get_varm_text + + integer nf_put_varm_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int1_t i1vals(1)) + external nf_put_varm_int1 + + integer nf_get_varm_int1 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int1_t i1vals(1)) + external nf_get_varm_int1 + + integer nf_put_varm_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int2_t i2vals(1)) + external nf_put_varm_int2 + + integer nf_get_varm_int2 +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! nf_int2_t i2vals(1)) + external nf_get_varm_int2 + + integer nf_put_varm_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! integer ivals(1)) + external nf_put_varm_int + + integer nf_get_varm_int +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! integer ivals(1)) + external nf_get_varm_int + + integer nf_put_varm_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! real rvals(1)) + external nf_put_varm_real + + integer nf_get_varm_real +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! real rvals(1)) + external nf_get_varm_real + + integer nf_put_varm_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! doubleprecision dvals(1)) + external nf_put_varm_double + + integer nf_get_varm_double +! (integer ncid, +! integer varid, +! integer start(1), +! integer count(1), +! integer stride(1), +! integer imap(1), +! doubleprecision dvals(1)) + external nf_get_varm_double + + +! NetCDF-4. +! This is part of netCDF-4. Copyright 2006, UCAR, See COPYRIGHT +! file for distribution information. + +! Netcdf version 4 fortran interface. + +! $Id: netcdf4.inc,v 1.28 2010/05/25 13:53:02 ed Exp $ + +! New netCDF-4 types. + integer nf_ubyte + integer nf_ushort + integer nf_uint + integer nf_int64 + integer nf_uint64 + integer nf_string + integer nf_vlen + integer nf_opaque + integer nf_enum + integer nf_compound + + parameter (nf_ubyte = 7) + parameter (nf_ushort = 8) + parameter (nf_uint = 9) + parameter (nf_int64 = 10) + parameter (nf_uint64 = 11) + parameter (nf_string = 12) + parameter (nf_vlen = 13) + parameter (nf_opaque = 14) + parameter (nf_enum = 15) + parameter (nf_compound = 16) + +! New netCDF-4 fill values. + integer nf_fill_ubyte + integer nf_fill_ushort +! real nf_fill_uint +! real nf_fill_int64 +! real nf_fill_uint64 + parameter (nf_fill_ubyte = 255) + parameter (nf_fill_ushort = 65535) + +! New constants. + integer nf_format_netcdf4 + parameter (nf_format_netcdf4 = 3) + + integer nf_format_netcdf4_classic + parameter (nf_format_netcdf4_classic = 4) + + integer nf_netcdf4 + parameter (nf_netcdf4 = 4096) + + integer nf_classic_model + parameter (nf_classic_model = 256) + + integer nf_chunk_seq + parameter (nf_chunk_seq = 0) + integer nf_chunk_sub + parameter (nf_chunk_sub = 1) + integer nf_chunk_sizes + parameter (nf_chunk_sizes = 2) + + integer nf_endian_native + parameter (nf_endian_native = 0) + integer nf_endian_little + parameter (nf_endian_little = 1) + integer nf_endian_big + parameter (nf_endian_big = 2) + +! For NF_DEF_VAR_CHUNKING + integer nf_chunked + parameter (nf_chunked = 0) + integer nf_contiguous + parameter (nf_contiguous = 1) + +! For NF_DEF_VAR_FLETCHER32 + integer nf_nochecksum + parameter (nf_nochecksum = 0) + integer nf_fletcher32 + parameter (nf_fletcher32 = 1) + +! For NF_DEF_VAR_DEFLATE + integer nf_noshuffle + parameter (nf_noshuffle = 0) + integer nf_shuffle + parameter (nf_shuffle = 1) + +! For NF_DEF_VAR_SZIP + integer nf_szip_ec_option_mask + parameter (nf_szip_ec_option_mask = 4) + integer nf_szip_nn_option_mask + parameter (nf_szip_nn_option_mask = 32) + +! For parallel I/O. + integer nf_mpiio + parameter (nf_mpiio = 8192) + integer nf_mpiposix + parameter (nf_mpiposix = 16384) + integer nf_pnetcdf + parameter (nf_pnetcdf = 32768) + +! For NF_VAR_PAR_ACCESS. + integer nf_independent + parameter (nf_independent = 0) + integer nf_collective + parameter (nf_collective = 1) + +! New error codes. + integer nf_ehdferr ! Error at HDF5 layer. + parameter (nf_ehdferr = -101) + integer nf_ecantread ! Can't read. + parameter (nf_ecantread = -102) + integer nf_ecantwrite ! Can't write. + parameter (nf_ecantwrite = -103) + integer nf_ecantcreate ! Can't create. + parameter (nf_ecantcreate = -104) + integer nf_efilemeta ! Problem with file metadata. + parameter (nf_efilemeta = -105) + integer nf_edimmeta ! Problem with dimension metadata. + parameter (nf_edimmeta = -106) + integer nf_eattmeta ! Problem with attribute metadata. + parameter (nf_eattmeta = -107) + integer nf_evarmeta ! Problem with variable metadata. + parameter (nf_evarmeta = -108) + integer nf_enocompound ! Not a compound type. + parameter (nf_enocompound = -109) + integer nf_eattexists ! Attribute already exists. + parameter (nf_eattexists = -110) + integer nf_enotnc4 ! Attempting netcdf-4 operation on netcdf-3 file. + parameter (nf_enotnc4 = -111) + integer nf_estrictnc3 ! Attempting netcdf-4 operation on strict nc3 netcdf-4 file. + parameter (nf_estrictnc3 = -112) + integer nf_enotnc3 ! Attempting netcdf-3 operation on netcdf-4 file. + parameter (nf_enotnc3 = -113) + integer nf_enopar ! Parallel operation on file opened for non-parallel access. + parameter (nf_enopar = -114) + integer nf_eparinit ! Error initializing for parallel access. + parameter (nf_eparinit = -115) + integer nf_ebadgrpid ! Bad group ID. + parameter (nf_ebadgrpid = -116) + integer nf_ebadtypid ! Bad type ID. + parameter (nf_ebadtypid = -117) + integer nf_etypdefined ! Type has already been defined and may not be edited. + parameter (nf_etypdefined = -118) + integer nf_ebadfield ! Bad field ID. + parameter (nf_ebadfield = -119) + integer nf_ebadclass ! Bad class. + parameter (nf_ebadclass = -120) + integer nf_emaptype ! Mapped access for atomic types only. + parameter (nf_emaptype = -121) + integer nf_elatefill ! Attempt to define fill value when data already exists. + parameter (nf_elatefill = -122) + integer nf_elatedef ! Attempt to define var properties, like deflate, after enddef. + parameter (nf_elatedef = -123) + integer nf_edimscale ! Probem with HDF5 dimscales. + parameter (nf_edimscale = -124) + integer nf_enogrp ! No group found. + parameter (nf_enogrp = -125) + + +! New functions. + +! Parallel I/O. + integer nf_create_par + external nf_create_par + + integer nf_open_par + external nf_open_par + + integer nf_var_par_access + external nf_var_par_access + +! Functions to handle groups. + integer nf_inq_ncid + external nf_inq_ncid + + integer nf_inq_grps + external nf_inq_grps + + integer nf_inq_grpname + external nf_inq_grpname + + integer nf_inq_grpname_full + external nf_inq_grpname_full + + integer nf_inq_grpname_len + external nf_inq_grpname_len + + integer nf_inq_grp_parent + external nf_inq_grp_parent + + integer nf_inq_grp_ncid + external nf_inq_grp_ncid + + integer nf_inq_grp_full_ncid + external nf_inq_grp_full_ncid + + integer nf_inq_varids + external nf_inq_varids + + integer nf_inq_dimids + external nf_inq_dimids + + integer nf_def_grp + external nf_def_grp + +! New rename grp function + + integer nf_rename_grp + external nf_rename_grp + +! New options for netCDF variables. + integer nf_def_var_deflate + external nf_def_var_deflate + + integer nf_inq_var_deflate + external nf_inq_var_deflate + + integer nf_def_var_fletcher32 + external nf_def_var_fletcher32 + + integer nf_inq_var_fletcher32 + external nf_inq_var_fletcher32 + + integer nf_def_var_chunking + external nf_def_var_chunking + + integer nf_inq_var_chunking + external nf_inq_var_chunking + + integer nf_def_var_fill + external nf_def_var_fill + + integer nf_inq_var_fill + external nf_inq_var_fill + + integer nf_def_var_endian + external nf_def_var_endian + + integer nf_inq_var_endian + external nf_inq_var_endian + +! User defined types. + integer nf_inq_typeids + external nf_inq_typeids + + integer nf_inq_typeid + external nf_inq_typeid + + integer nf_inq_type + external nf_inq_type + + integer nf_inq_user_type + external nf_inq_user_type + +! User defined types - compound types. + integer nf_def_compound + external nf_def_compound + + integer nf_insert_compound + external nf_insert_compound + + integer nf_insert_array_compound + external nf_insert_array_compound + + integer nf_inq_compound + external nf_inq_compound + + integer nf_inq_compound_name + external nf_inq_compound_name + + integer nf_inq_compound_size + external nf_inq_compound_size + + integer nf_inq_compound_nfields + external nf_inq_compound_nfields + + integer nf_inq_compound_field + external nf_inq_compound_field + + integer nf_inq_compound_fieldname + external nf_inq_compound_fieldname + + integer nf_inq_compound_fieldindex + external nf_inq_compound_fieldindex + + integer nf_inq_compound_fieldoffset + external nf_inq_compound_fieldoffset + + integer nf_inq_compound_fieldtype + external nf_inq_compound_fieldtype + + integer nf_inq_compound_fieldndims + external nf_inq_compound_fieldndims + + integer nf_inq_compound_fielddim_sizes + external nf_inq_compound_fielddim_sizes + +! User defined types - variable length arrays. + integer nf_def_vlen + external nf_def_vlen + + integer nf_inq_vlen + external nf_inq_vlen + + integer nf_free_vlen + external nf_free_vlen + +! User defined types - enums. + integer nf_def_enum + external nf_def_enum + + integer nf_insert_enum + external nf_insert_enum + + integer nf_inq_enum + external nf_inq_enum + + integer nf_inq_enum_member + external nf_inq_enum_member + + integer nf_inq_enum_ident + external nf_inq_enum_ident + +! User defined types - opaque. + integer nf_def_opaque + external nf_def_opaque + + integer nf_inq_opaque + external nf_inq_opaque + +! Write and read attributes of any type, including user defined +! types. + integer nf_put_att + external nf_put_att + integer nf_get_att + external nf_get_att + +! Write and read variables of any type, including user defined +! types. + integer nf_put_var + external nf_put_var + integer nf_put_var1 + external nf_put_var1 + integer nf_put_vara + external nf_put_vara + integer nf_put_vars + external nf_put_vars + integer nf_get_var + external nf_get_var + integer nf_get_var1 + external nf_get_var1 + integer nf_get_vara + external nf_get_vara + integer nf_get_vars + external nf_get_vars + +! 64-bit int functions. + integer nf_put_var1_int64 + external nf_put_var1_int64 + integer nf_put_vara_int64 + external nf_put_vara_int64 + integer nf_put_vars_int64 + external nf_put_vars_int64 + integer nf_put_varm_int64 + external nf_put_varm_int64 + integer nf_put_var_int64 + external nf_put_var_int64 + integer nf_get_var1_int64 + external nf_get_var1_int64 + integer nf_get_vara_int64 + external nf_get_vara_int64 + integer nf_get_vars_int64 + external nf_get_vars_int64 + integer nf_get_varm_int64 + external nf_get_varm_int64 + integer nf_get_var_int64 + external nf_get_var_int64 + +! For helping F77 users with VLENs. + integer nf_get_vlen_element + external nf_get_vlen_element + integer nf_put_vlen_element + external nf_put_vlen_element + +! For dealing with file level chunk cache. + integer nf_set_chunk_cache + external nf_set_chunk_cache + integer nf_get_chunk_cache + external nf_get_chunk_cache + +! For dealing with per variable chunk cache. + integer nf_set_var_chunk_cache + external nf_set_var_chunk_cache + integer nf_get_var_chunk_cache + external nf_get_var_chunk_cache + +! NetCDF-2. +!ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc +! begin netcdf 2.4 backward compatibility: +! + +! +! functions in the fortran interface +! + integer nccre + integer ncopn + integer ncddef + integer ncdid + integer ncvdef + integer ncvid + integer nctlen + integer ncsfil + + external nccre + external ncopn + external ncddef + external ncdid + external ncvdef + external ncvid + external nctlen + external ncsfil + + + integer ncrdwr + integer nccreat + integer ncexcl + integer ncindef + integer ncnsync + integer nchsync + integer ncndirty + integer nchdirty + integer nclink + integer ncnowrit + integer ncwrite + integer ncclob + integer ncnoclob + integer ncglobal + integer ncfill + integer ncnofill + integer maxncop + integer maxncdim + integer maxncatt + integer maxncvar + integer maxncnam + integer maxvdims + integer ncnoerr + integer ncebadid + integer ncenfile + integer nceexist + integer nceinval + integer nceperm + integer ncenotin + integer nceindef + integer ncecoord + integer ncemaxds + integer ncename + integer ncenoatt + integer ncemaxat + integer ncebadty + integer ncebadd + integer ncests + integer nceunlim + integer ncemaxvs + integer ncenotvr + integer nceglob + integer ncenotnc + integer ncfoobar + integer ncsyserr + integer ncfatal + integer ncverbos + integer ncentool + + +! +! netcdf data types: +! + integer ncbyte + integer ncchar + integer ncshort + integer nclong + integer ncfloat + integer ncdouble + + parameter(ncbyte = 1) + parameter(ncchar = 2) + parameter(ncshort = 3) + parameter(nclong = 4) + parameter(ncfloat = 5) + parameter(ncdouble = 6) + +! +! masks for the struct nc flag field; passed in as 'mode' arg to +! nccreate and ncopen. +! + +! read/write, 0 => readonly + parameter(ncrdwr = 1) +! in create phase, cleared by ncendef + parameter(nccreat = 2) +! on create destroy existing file + parameter(ncexcl = 4) +! in define mode, cleared by ncendef + parameter(ncindef = 8) +! synchronise numrecs on change (x'10') + parameter(ncnsync = 16) +! synchronise whole header on change (x'20') + parameter(nchsync = 32) +! numrecs has changed (x'40') + parameter(ncndirty = 64) +! header info has changed (x'80') + parameter(nchdirty = 128) +! prefill vars on endef and increase of record, the default behavior + parameter(ncfill = 0) +! do not fill vars on endef and increase of record (x'100') + parameter(ncnofill = 256) +! isa link (x'8000') + parameter(nclink = 32768) + +! +! 'mode' arguments for nccreate and ncopen +! + parameter(ncnowrit = 0) + parameter(ncwrite = ncrdwr) + parameter(ncclob = nf_clobber) + parameter(ncnoclob = nf_noclobber) + +! +! 'size' argument to ncdimdef for an unlimited dimension +! + integer ncunlim + parameter(ncunlim = 0) + +! +! attribute id to put/get a global attribute +! + parameter(ncglobal = 0) + +! +! advisory maximums: +! + parameter(maxncop = 64) + parameter(maxncdim = 1024) + parameter(maxncatt = 8192) + parameter(maxncvar = 8192) +! not enforced + parameter(maxncnam = 256) + parameter(maxvdims = maxncdim) + +! +! global netcdf error status variable +! initialized in error.c +! + +! no error + parameter(ncnoerr = nf_noerr) +! not a netcdf id + parameter(ncebadid = nf_ebadid) +! too many netcdfs open + parameter(ncenfile = -31) ! nc_syserr +! netcdf file exists && ncnoclob + parameter(nceexist = nf_eexist) +! invalid argument + parameter(nceinval = nf_einval) +! write to read only + parameter(nceperm = nf_eperm) +! operation not allowed in data mode + parameter(ncenotin = nf_enotindefine ) +! operation not allowed in define mode + parameter(nceindef = nf_eindefine) +! coordinates out of domain + parameter(ncecoord = nf_einvalcoords) +! maxncdims exceeded + parameter(ncemaxds = nf_emaxdims) +! string match to name in use + parameter(ncename = nf_enameinuse) +! attribute not found + parameter(ncenoatt = nf_enotatt) +! maxncattrs exceeded + parameter(ncemaxat = nf_emaxatts) +! not a netcdf data type + parameter(ncebadty = nf_ebadtype) +! invalid dimension id + parameter(ncebadd = nf_ebaddim) +! ncunlimited in the wrong index + parameter(nceunlim = nf_eunlimpos) +! maxncvars exceeded + parameter(ncemaxvs = nf_emaxvars) +! variable not found + parameter(ncenotvr = nf_enotvar) +! action prohibited on ncglobal varid + parameter(nceglob = nf_eglobal) +! not a netcdf file + parameter(ncenotnc = nf_enotnc) + parameter(ncests = nf_ests) + parameter (ncentool = nf_emaxname) + parameter(ncfoobar = 32) + parameter(ncsyserr = -31) + +! +! global options variable. used to determine behavior of error handler. +! initialized in lerror.c +! + parameter(ncfatal = 1) + parameter(ncverbos = 2) + +! +! default fill values. these must be the same as in the c interface. +! + integer filbyte + integer filchar + integer filshort + integer fillong + real filfloat + doubleprecision fildoub + + parameter (filbyte = -127) + parameter (filchar = 0) + parameter (filshort = -32767) + parameter (fillong = -2147483647) + parameter (filfloat = 9.9692099683868690e+36) + parameter (fildoub = 9.9692099683868690e+36) diff --git a/privatemodules/nc4/include/netcdf.mod b/privatemodules/nc4/include/netcdf.mod new file mode 100644 index 0000000000000000000000000000000000000000..feeaa8230267c2faae785f64933c1e9b17e0860d Binary files /dev/null and b/privatemodules/nc4/include/netcdf.mod differ diff --git a/privatemodules/nc4/include/netcdf4_f03.mod b/privatemodules/nc4/include/netcdf4_f03.mod new file mode 100644 index 0000000000000000000000000000000000000000..d9c781f77939cc8e61a942a9c25ac137891d747a Binary files /dev/null and b/privatemodules/nc4/include/netcdf4_f03.mod differ diff --git a/privatemodules/nc4/include/netcdf4_nc_interfaces.mod b/privatemodules/nc4/include/netcdf4_nc_interfaces.mod new file mode 100644 index 0000000000000000000000000000000000000000..d11c90c4e4218485638d4106c176c29770a6dcb6 Binary files /dev/null and b/privatemodules/nc4/include/netcdf4_nc_interfaces.mod differ diff --git a/privatemodules/nc4/include/netcdf4_nf_interfaces.mod b/privatemodules/nc4/include/netcdf4_nf_interfaces.mod new file mode 100644 index 0000000000000000000000000000000000000000..790b498ba1a513aa9b0d9cd7f42d602b04b97691 Binary files /dev/null and b/privatemodules/nc4/include/netcdf4_nf_interfaces.mod differ diff --git a/privatemodules/nc4/include/netcdf_f03.mod b/privatemodules/nc4/include/netcdf_f03.mod new file mode 100644 index 0000000000000000000000000000000000000000..a18260bb100f99d9e4d4a8ea54ba0b4b33441e2a Binary files /dev/null and b/privatemodules/nc4/include/netcdf_f03.mod differ diff --git a/privatemodules/nc4/include/netcdf_fortv2_c_interfaces.mod b/privatemodules/nc4/include/netcdf_fortv2_c_interfaces.mod new file mode 100644 index 0000000000000000000000000000000000000000..bbd0c7b544abe7967faeb8d9b547544d4d8014e8 Binary files /dev/null and b/privatemodules/nc4/include/netcdf_fortv2_c_interfaces.mod differ diff --git a/privatemodules/nc4/include/netcdf_mem.h b/privatemodules/nc4/include/netcdf_mem.h new file mode 100644 index 0000000000000000000000000000000000000000..12f6bfaa8f04d481b9f56ade27e64c39310defd0 --- /dev/null +++ b/privatemodules/nc4/include/netcdf_mem.h @@ -0,0 +1,39 @@ +/*! \file netcdf_mem.h + * + * Main header file for in-memory (diskless) functionality. + * + * Copyright 2010 University Corporation for Atmospheric + * Research/Unidata. See COPYRIGHT file for more info. + * + * See \ref copyright file for more info. + * + */ + +#ifndef NETCDF_MEM_H +#define NETCDF_MEM_H 1 + +#if defined(__cplusplus) +extern "C" { +#endif + +/* Declaration modifiers for DLL support (MSC et al) */ +#if defined(DLL_NETCDF) /* define when library is a DLL */ +# if defined(DLL_EXPORT) /* define when building the library */ +# define MSC_EXTRA __declspec(dllexport) +# else +# define MSC_EXTRA __declspec(dllimport) +# endif +#include <io.h> +#else +#define MSC_EXTRA +#endif /* defined(DLL_NETCDF) */ + +# define EXTERNL MSC_EXTRA extern + +EXTERNL int nc_open_mem(const char* path, int mode, size_t size, void* memory, int* ncidp); + +#if defined(__cplusplus) +} +#endif + +#endif /* NETCDF_MEM_H */ diff --git a/privatemodules/nc4/include/netcdf_meta.h b/privatemodules/nc4/include/netcdf_meta.h new file mode 100644 index 0000000000000000000000000000000000000000..fe74e61c0e145121a37f2728220826ea14b5ef34 --- /dev/null +++ b/privatemodules/nc4/include/netcdf_meta.h @@ -0,0 +1,52 @@ +/*! \file netcdf_meta.h + * + * Meta information for libnetcdf which can be used by other packages which + * depend on libnetcdf. + * + * This file is automatically generated by the build system + * at configure time, and contains information related to + * how libnetcdf was built. It will not be required to + * include this file unless you want to probe the capabilities + * of libnetcdf. This should ideally only happen when configuring + * a project which depends on libnetcdf. At configure time, + * the dependant project can set its own macros which can be used + * in conditionals. + * + * Copyright 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, + * 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014 + * University Corporation for Atmospheric Research/Unidata. + * See \ref copyright file for more info. + */ + +#ifndef NETCDF_META_H +#define NETCDF_META_H + +#define NC_VERSION_MAJOR 4 /*!< netcdf-c major version. */ +#define NC_VERSION_MINOR 4 /*!< netcdf-c minor version. */ +#define NC_VERSION_PATCH 1 /*!< netcdf-c patch version. */ +#define NC_VERSION_NOTE ".1" /*!< netcdf-c note. May be blank. */ + +/*! netcdf-c version string. + * + * The format of the netcdf-c version string is as follows: + * \code + * NC_VERSION_MAJOR.NC_VERSION_MINOR.NC_VERSION_PATCH.NC_VERSION_NOTE + * \endcode + * Note that the trailing NC_VERSION_NOTE may be empty. It serves for + * identifiers such as '-rc1', etc. + */ +#define NC_VERSION "4.4.1.1" + +#define NC_HAS_NC2 1 /*!< API version 2 support. */ +#define NC_HAS_NC4 1 /*!< API version 4 support. */ +#define NC_HAS_HDF4 0 /*!< hdf4 support. */ +#define NC_HAS_HDF5 1 /*!< hdf5 support. */ +#define NC_HAS_SZIP 0 /*!< szip support (hdf5 only) */ +#define NC_HAS_DAP 1 /*!< DAP support. */ +#define NC_HAS_DISKLESS 1 /*!< diskless support. */ +#define NC_HAS_MMAP 0 /*!< mmap support. */ +#define NC_HAS_JNA 0 /*!< jna support. */ +#define NC_HAS_PNETCDF 0 /*!< pnetcdf support. */ +#define NC_HAS_PARALLEL 0 /*!< parallel IO support via hdf5 and/or pnetcdf. */ + +#endif diff --git a/privatemodules/nc4/include/netcdf_nc_data.mod b/privatemodules/nc4/include/netcdf_nc_data.mod new file mode 100644 index 0000000000000000000000000000000000000000..ff97ffe743ebb5974c739ac74a6b317e9a2d5475 Binary files /dev/null and b/privatemodules/nc4/include/netcdf_nc_data.mod differ diff --git a/privatemodules/nc4/include/netcdf_nc_interfaces.mod b/privatemodules/nc4/include/netcdf_nc_interfaces.mod new file mode 100644 index 0000000000000000000000000000000000000000..a9426d978680e3208115f3d0f95d5432c841d1e3 Binary files /dev/null and b/privatemodules/nc4/include/netcdf_nc_interfaces.mod differ diff --git a/privatemodules/nc4/include/netcdf_nf_data.mod b/privatemodules/nc4/include/netcdf_nf_data.mod new file mode 100644 index 0000000000000000000000000000000000000000..c5640a1ca77d33d705ff6c3481a70ef1bbb7043f Binary files /dev/null and b/privatemodules/nc4/include/netcdf_nf_data.mod differ diff --git a/privatemodules/nc4/include/netcdf_nf_interfaces.mod b/privatemodules/nc4/include/netcdf_nf_interfaces.mod new file mode 100644 index 0000000000000000000000000000000000000000..6950ef14a5a67550ff16c84048fc1ee79dd4a067 Binary files /dev/null and b/privatemodules/nc4/include/netcdf_nf_interfaces.mod differ diff --git a/privatemodules/nc4/include/typesizes.mod b/privatemodules/nc4/include/typesizes.mod new file mode 100644 index 0000000000000000000000000000000000000000..ec701c4f1756476b8df0ebc515401cbb1d93c91d Binary files /dev/null and b/privatemodules/nc4/include/typesizes.mod differ diff --git a/privatemodules/nc4/include/zconf.h b/privatemodules/nc4/include/zconf.h new file mode 100644 index 0000000000000000000000000000000000000000..996fff29215324c863c674d3aba0733ebcfb0cf3 --- /dev/null +++ b/privatemodules/nc4/include/zconf.h @@ -0,0 +1,511 @@ +/* zconf.h -- configuration of the zlib compression library + * Copyright (C) 1995-2013 Jean-loup Gailly. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +/* @(#) $Id$ */ + +#ifndef ZCONF_H +#define ZCONF_H + +/* + * If you *really* need a unique prefix for all types and library functions, + * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it. + * Even better than compiling with -DZ_PREFIX would be to use configure to set + * this permanently in zconf.h using "./configure --zprefix". + */ +#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */ +# define Z_PREFIX_SET + +/* all linked symbols */ +# define _dist_code z__dist_code +# define _length_code z__length_code +# define _tr_align z__tr_align +# define _tr_flush_bits z__tr_flush_bits +# define _tr_flush_block z__tr_flush_block +# define _tr_init z__tr_init +# define _tr_stored_block z__tr_stored_block +# define _tr_tally z__tr_tally +# define adler32 z_adler32 +# define adler32_combine z_adler32_combine +# define adler32_combine64 z_adler32_combine64 +# ifndef Z_SOLO +# define compress z_compress +# define compress2 z_compress2 +# define compressBound z_compressBound +# endif +# define crc32 z_crc32 +# define crc32_combine z_crc32_combine +# define crc32_combine64 z_crc32_combine64 +# define deflate z_deflate +# define deflateBound z_deflateBound +# define deflateCopy z_deflateCopy +# define deflateEnd z_deflateEnd +# define deflateInit2_ z_deflateInit2_ +# define deflateInit_ z_deflateInit_ +# define deflateParams z_deflateParams +# define deflatePending z_deflatePending +# define deflatePrime z_deflatePrime +# define deflateReset z_deflateReset +# define deflateResetKeep z_deflateResetKeep +# define deflateSetDictionary z_deflateSetDictionary +# define deflateSetHeader z_deflateSetHeader +# define deflateTune z_deflateTune +# define deflate_copyright z_deflate_copyright +# define get_crc_table z_get_crc_table +# ifndef Z_SOLO +# define gz_error z_gz_error +# define gz_intmax z_gz_intmax +# define gz_strwinerror z_gz_strwinerror +# define gzbuffer z_gzbuffer +# define gzclearerr z_gzclearerr +# define gzclose z_gzclose +# define gzclose_r z_gzclose_r +# define gzclose_w z_gzclose_w +# define gzdirect z_gzdirect +# define gzdopen z_gzdopen +# define gzeof z_gzeof +# define gzerror z_gzerror +# define gzflush z_gzflush +# define gzgetc z_gzgetc +# define gzgetc_ z_gzgetc_ +# define gzgets z_gzgets +# define gzoffset z_gzoffset +# define gzoffset64 z_gzoffset64 +# define gzopen z_gzopen +# define gzopen64 z_gzopen64 +# ifdef _WIN32 +# define gzopen_w z_gzopen_w +# endif +# define gzprintf z_gzprintf +# define gzvprintf z_gzvprintf +# define gzputc z_gzputc +# define gzputs z_gzputs +# define gzread z_gzread +# define gzrewind z_gzrewind +# define gzseek z_gzseek +# define gzseek64 z_gzseek64 +# define gzsetparams z_gzsetparams +# define gztell z_gztell +# define gztell64 z_gztell64 +# define gzungetc z_gzungetc +# define gzwrite z_gzwrite +# endif +# define inflate z_inflate +# define inflateBack z_inflateBack +# define inflateBackEnd z_inflateBackEnd +# define inflateBackInit_ z_inflateBackInit_ +# define inflateCopy z_inflateCopy +# define inflateEnd z_inflateEnd +# define inflateGetHeader z_inflateGetHeader +# define inflateInit2_ z_inflateInit2_ +# define inflateInit_ z_inflateInit_ +# define inflateMark z_inflateMark +# define inflatePrime z_inflatePrime +# define inflateReset z_inflateReset +# define inflateReset2 z_inflateReset2 +# define inflateSetDictionary z_inflateSetDictionary +# define inflateGetDictionary z_inflateGetDictionary +# define inflateSync z_inflateSync +# define inflateSyncPoint z_inflateSyncPoint +# define inflateUndermine z_inflateUndermine +# define inflateResetKeep z_inflateResetKeep +# define inflate_copyright z_inflate_copyright +# define inflate_fast z_inflate_fast +# define inflate_table z_inflate_table +# ifndef Z_SOLO +# define uncompress z_uncompress +# endif +# define zError z_zError +# ifndef Z_SOLO +# define zcalloc z_zcalloc +# define zcfree z_zcfree +# endif +# define zlibCompileFlags z_zlibCompileFlags +# define zlibVersion z_zlibVersion + +/* all zlib typedefs in zlib.h and zconf.h */ +# define Byte z_Byte +# define Bytef z_Bytef +# define alloc_func z_alloc_func +# define charf z_charf +# define free_func z_free_func +# ifndef Z_SOLO +# define gzFile z_gzFile +# endif +# define gz_header z_gz_header +# define gz_headerp z_gz_headerp +# define in_func z_in_func +# define intf z_intf +# define out_func z_out_func +# define uInt z_uInt +# define uIntf z_uIntf +# define uLong z_uLong +# define uLongf z_uLongf +# define voidp z_voidp +# define voidpc z_voidpc +# define voidpf z_voidpf + +/* all zlib structs in zlib.h and zconf.h */ +# define gz_header_s z_gz_header_s +# define internal_state z_internal_state + +#endif + +#if defined(__MSDOS__) && !defined(MSDOS) +# define MSDOS +#endif +#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2) +# define OS2 +#endif +#if defined(_WINDOWS) && !defined(WINDOWS) +# define WINDOWS +#endif +#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__) +# ifndef WIN32 +# define WIN32 +# endif +#endif +#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32) +# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__) +# ifndef SYS16BIT +# define SYS16BIT +# endif +# endif +#endif + +/* + * Compile with -DMAXSEG_64K if the alloc function cannot allocate more + * than 64k bytes at a time (needed on systems with 16-bit int). + */ +#ifdef SYS16BIT +# define MAXSEG_64K +#endif +#ifdef MSDOS +# define UNALIGNED_OK +#endif + +#ifdef __STDC_VERSION__ +# ifndef STDC +# define STDC +# endif +# if __STDC_VERSION__ >= 199901L +# ifndef STDC99 +# define STDC99 +# endif +# endif +#endif +#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus)) +# define STDC +#endif +#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__)) +# define STDC +#endif +#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32)) +# define STDC +#endif +#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__)) +# define STDC +#endif + +#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */ +# define STDC +#endif + +#ifndef STDC +# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */ +# define const /* note: need a more gentle solution here */ +# endif +#endif + +#if defined(ZLIB_CONST) && !defined(z_const) +# define z_const const +#else +# define z_const +#endif + +/* Some Mac compilers merge all .h files incorrectly: */ +#if defined(__MWERKS__)||defined(applec)||defined(THINK_C)||defined(__SC__) +# define NO_DUMMY_DECL +#endif + +/* Maximum value for memLevel in deflateInit2 */ +#ifndef MAX_MEM_LEVEL +# ifdef MAXSEG_64K +# define MAX_MEM_LEVEL 8 +# else +# define MAX_MEM_LEVEL 9 +# endif +#endif + +/* Maximum value for windowBits in deflateInit2 and inflateInit2. + * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files + * created by gzip. (Files created by minigzip can still be extracted by + * gzip.) + */ +#ifndef MAX_WBITS +# define MAX_WBITS 15 /* 32K LZ77 window */ +#endif + +/* The memory requirements for deflate are (in bytes): + (1 << (windowBits+2)) + (1 << (memLevel+9)) + that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values) + plus a few kilobytes for small objects. For example, if you want to reduce + the default memory requirements from 256K to 128K, compile with + make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7" + Of course this will generally degrade compression (there's no free lunch). + + The memory requirements for inflate are (in bytes) 1 << windowBits + that is, 32K for windowBits=15 (default value) plus a few kilobytes + for small objects. +*/ + + /* Type declarations */ + +#ifndef OF /* function prototypes */ +# ifdef STDC +# define OF(args) args +# else +# define OF(args) () +# endif +#endif + +#ifndef Z_ARG /* function prototypes for stdarg */ +# if defined(STDC) || defined(Z_HAVE_STDARG_H) +# define Z_ARG(args) args +# else +# define Z_ARG(args) () +# endif +#endif + +/* The following definitions for FAR are needed only for MSDOS mixed + * model programming (small or medium model with some far allocations). + * This was tested only with MSC; for other MSDOS compilers you may have + * to define NO_MEMCPY in zutil.h. If you don't need the mixed model, + * just define FAR to be empty. + */ +#ifdef SYS16BIT +# if defined(M_I86SM) || defined(M_I86MM) + /* MSC small or medium model */ +# define SMALL_MEDIUM +# ifdef _MSC_VER +# define FAR _far +# else +# define FAR far +# endif +# endif +# if (defined(__SMALL__) || defined(__MEDIUM__)) + /* Turbo C small or medium model */ +# define SMALL_MEDIUM +# ifdef __BORLANDC__ +# define FAR _far +# else +# define FAR far +# endif +# endif +#endif + +#if defined(WINDOWS) || defined(WIN32) + /* If building or using zlib as a DLL, define ZLIB_DLL. + * This is not mandatory, but it offers a little performance increase. + */ +# ifdef ZLIB_DLL +# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500)) +# ifdef ZLIB_INTERNAL +# define ZEXTERN extern __declspec(dllexport) +# else +# define ZEXTERN extern __declspec(dllimport) +# endif +# endif +# endif /* ZLIB_DLL */ + /* If building or using zlib with the WINAPI/WINAPIV calling convention, + * define ZLIB_WINAPI. + * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI. + */ +# ifdef ZLIB_WINAPI +# ifdef FAR +# undef FAR +# endif +# include <windows.h> + /* No need for _export, use ZLIB.DEF instead. */ + /* For complete Windows compatibility, use WINAPI, not __stdcall. */ +# define ZEXPORT WINAPI +# ifdef WIN32 +# define ZEXPORTVA WINAPIV +# else +# define ZEXPORTVA FAR CDECL +# endif +# endif +#endif + +#if defined (__BEOS__) +# ifdef ZLIB_DLL +# ifdef ZLIB_INTERNAL +# define ZEXPORT __declspec(dllexport) +# define ZEXPORTVA __declspec(dllexport) +# else +# define ZEXPORT __declspec(dllimport) +# define ZEXPORTVA __declspec(dllimport) +# endif +# endif +#endif + +#ifndef ZEXTERN +# define ZEXTERN extern +#endif +#ifndef ZEXPORT +# define ZEXPORT +#endif +#ifndef ZEXPORTVA +# define ZEXPORTVA +#endif + +#ifndef FAR +# define FAR +#endif + +#if !defined(__MACTYPES__) +typedef unsigned char Byte; /* 8 bits */ +#endif +typedef unsigned int uInt; /* 16 bits or more */ +typedef unsigned long uLong; /* 32 bits or more */ + +#ifdef SMALL_MEDIUM + /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */ +# define Bytef Byte FAR +#else + typedef Byte FAR Bytef; +#endif +typedef char FAR charf; +typedef int FAR intf; +typedef uInt FAR uIntf; +typedef uLong FAR uLongf; + +#ifdef STDC + typedef void const *voidpc; + typedef void FAR *voidpf; + typedef void *voidp; +#else + typedef Byte const *voidpc; + typedef Byte FAR *voidpf; + typedef Byte *voidp; +#endif + +#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC) +# include <limits.h> +# if (UINT_MAX == 0xffffffffUL) +# define Z_U4 unsigned +# elif (ULONG_MAX == 0xffffffffUL) +# define Z_U4 unsigned long +# elif (USHRT_MAX == 0xffffffffUL) +# define Z_U4 unsigned short +# endif +#endif + +#ifdef Z_U4 + typedef Z_U4 z_crc_t; +#else + typedef unsigned long z_crc_t; +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_UNISTD_H +#endif + +#if 1 /* was set to #if 1 by ./configure */ +# define Z_HAVE_STDARG_H +#endif + +#ifdef STDC +# ifndef Z_SOLO +# include <sys/types.h> /* for off_t */ +# endif +#endif + +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +# include <stdarg.h> /* for va_list */ +# endif +#endif + +#ifdef _WIN32 +# ifndef Z_SOLO +# include <stddef.h> /* for wchar_t */ +# endif +#endif + +/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and + * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even + * though the former does not conform to the LFS document), but considering + * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as + * equivalently requesting no 64-bit operations + */ +#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1 +# undef _LARGEFILE64_SOURCE +#endif + +#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H) +# define Z_HAVE_UNISTD_H +#endif +#ifndef Z_SOLO +# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE) +# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */ +# ifdef VMS +# include <unixio.h> /* for off_t */ +# endif +# ifndef z_off_t +# define z_off_t off_t +# endif +# endif +#endif + +#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0 +# define Z_LFS64 +#endif + +#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64) +# define Z_LARGE64 +#endif + +#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64) +# define Z_WANT64 +#endif + +#if !defined(SEEK_SET) && !defined(Z_SOLO) +# define SEEK_SET 0 /* Seek from beginning of file. */ +# define SEEK_CUR 1 /* Seek from current position. */ +# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */ +#endif + +#ifndef z_off_t +# define z_off_t long +#endif + +#if !defined(_WIN32) && defined(Z_LARGE64) +# define z_off64_t off64_t +#else +# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO) +# define z_off64_t __int64 +# else +# define z_off64_t z_off_t +# endif +#endif + +/* MVS linker does not support external names larger than 8 bytes */ +#if defined(__MVS__) + #pragma map(deflateInit_,"DEIN") + #pragma map(deflateInit2_,"DEIN2") + #pragma map(deflateEnd,"DEEND") + #pragma map(deflateBound,"DEBND") + #pragma map(inflateInit_,"ININ") + #pragma map(inflateInit2_,"ININ2") + #pragma map(inflateEnd,"INEND") + #pragma map(inflateSync,"INSY") + #pragma map(inflateSetDictionary,"INSEDI") + #pragma map(compressBound,"CMBND") + #pragma map(inflate_table,"INTABL") + #pragma map(inflate_fast,"INFA") + #pragma map(inflate_copyright,"INCOPY") +#endif + +#endif /* ZCONF_H */ diff --git a/privatemodules/nc4/include/zlib.h b/privatemodules/nc4/include/zlib.h new file mode 100644 index 0000000000000000000000000000000000000000..3e0c7672ac51d93782f020bba32eb1207617e70a --- /dev/null +++ b/privatemodules/nc4/include/zlib.h @@ -0,0 +1,1768 @@ +/* zlib.h -- interface of the 'zlib' general purpose compression library + version 1.2.8, April 28th, 2013 + + Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler + + This software is provided 'as-is', without any express or implied + warranty. In no event will the authors be held liable for any damages + arising from the use of this software. + + Permission is granted to anyone to use this software for any purpose, + including commercial applications, and to alter it and redistribute it + freely, subject to the following restrictions: + + 1. The origin of this software must not be misrepresented; you must not + claim that you wrote the original software. If you use this software + in a product, an acknowledgment in the product documentation would be + appreciated but is not required. + 2. Altered source versions must be plainly marked as such, and must not be + misrepresented as being the original software. + 3. This notice may not be removed or altered from any source distribution. + + Jean-loup Gailly Mark Adler + jloup@gzip.org madler@alumni.caltech.edu + + + The data format used by the zlib library is described by RFCs (Request for + Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950 + (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format). +*/ + +#ifndef ZLIB_H +#define ZLIB_H + +#include "zconf.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define ZLIB_VERSION "1.2.8" +#define ZLIB_VERNUM 0x1280 +#define ZLIB_VER_MAJOR 1 +#define ZLIB_VER_MINOR 2 +#define ZLIB_VER_REVISION 8 +#define ZLIB_VER_SUBREVISION 0 + +/* + The 'zlib' compression library provides in-memory compression and + decompression functions, including integrity checks of the uncompressed data. + This version of the library supports only one compression method (deflation) + but other algorithms will be added later and will have the same stream + interface. + + Compression can be done in a single step if the buffers are large enough, + or can be done by repeated calls of the compression function. In the latter + case, the application must provide more input and/or consume the output + (providing more output space) before each call. + + The compressed data format used by default by the in-memory functions is + the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped + around a deflate stream, which is itself documented in RFC 1951. + + The library also supports reading and writing files in gzip (.gz) format + with an interface similar to that of stdio using the functions that start + with "gz". The gzip format is different from the zlib format. gzip is a + gzip wrapper, documented in RFC 1952, wrapped around a deflate stream. + + This library can optionally read and write gzip streams in memory as well. + + The zlib format was designed to be compact and fast for use in memory + and on communications channels. The gzip format was designed for single- + file compression on file systems, has a larger header than zlib to maintain + directory information, and uses a different, slower check method than zlib. + + The library does not install any signal handler. The decoder checks + the consistency of the compressed data, so the library should never crash + even in case of corrupted input. +*/ + +typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size)); +typedef void (*free_func) OF((voidpf opaque, voidpf address)); + +struct internal_state; + +typedef struct z_stream_s { + z_const Bytef *next_in; /* next input byte */ + uInt avail_in; /* number of bytes available at next_in */ + uLong total_in; /* total number of input bytes read so far */ + + Bytef *next_out; /* next output byte should be put there */ + uInt avail_out; /* remaining free space at next_out */ + uLong total_out; /* total number of bytes output so far */ + + z_const char *msg; /* last error message, NULL if no error */ + struct internal_state FAR *state; /* not visible by applications */ + + alloc_func zalloc; /* used to allocate the internal state */ + free_func zfree; /* used to free the internal state */ + voidpf opaque; /* private data object passed to zalloc and zfree */ + + int data_type; /* best guess about the data type: binary or text */ + uLong adler; /* adler32 value of the uncompressed data */ + uLong reserved; /* reserved for future use */ +} z_stream; + +typedef z_stream FAR *z_streamp; + +/* + gzip header information passed to and from zlib routines. See RFC 1952 + for more details on the meanings of these fields. +*/ +typedef struct gz_header_s { + int text; /* true if compressed data believed to be text */ + uLong time; /* modification time */ + int xflags; /* extra flags (not used when writing a gzip file) */ + int os; /* operating system */ + Bytef *extra; /* pointer to extra field or Z_NULL if none */ + uInt extra_len; /* extra field length (valid if extra != Z_NULL) */ + uInt extra_max; /* space at extra (only when reading header) */ + Bytef *name; /* pointer to zero-terminated file name or Z_NULL */ + uInt name_max; /* space at name (only when reading header) */ + Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */ + uInt comm_max; /* space at comment (only when reading header) */ + int hcrc; /* true if there was or will be a header crc */ + int done; /* true when done reading gzip header (not used + when writing a gzip file) */ +} gz_header; + +typedef gz_header FAR *gz_headerp; + +/* + The application must update next_in and avail_in when avail_in has dropped + to zero. It must update next_out and avail_out when avail_out has dropped + to zero. The application must initialize zalloc, zfree and opaque before + calling the init function. All other fields are set by the compression + library and must not be updated by the application. + + The opaque value provided by the application will be passed as the first + parameter for calls of zalloc and zfree. This can be useful for custom + memory management. The compression library attaches no meaning to the + opaque value. + + zalloc must return Z_NULL if there is not enough memory for the object. + If zlib is used in a multi-threaded application, zalloc and zfree must be + thread safe. + + On 16-bit systems, the functions zalloc and zfree must be able to allocate + exactly 65536 bytes, but will not be required to allocate more than this if + the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers + returned by zalloc for objects of exactly 65536 bytes *must* have their + offset normalized to zero. The default allocation function provided by this + library ensures this (see zutil.c). To reduce memory requirements and avoid + any allocation of 64K objects, at the expense of compression ratio, compile + the library with -DMAX_WBITS=14 (see zconf.h). + + The fields total_in and total_out can be used for statistics or progress + reports. After compression, total_in holds the total size of the + uncompressed data and may be saved for use in the decompressor (particularly + if the decompressor wants to decompress everything in a single step). +*/ + + /* constants */ + +#define Z_NO_FLUSH 0 +#define Z_PARTIAL_FLUSH 1 +#define Z_SYNC_FLUSH 2 +#define Z_FULL_FLUSH 3 +#define Z_FINISH 4 +#define Z_BLOCK 5 +#define Z_TREES 6 +/* Allowed flush values; see deflate() and inflate() below for details */ + +#define Z_OK 0 +#define Z_STREAM_END 1 +#define Z_NEED_DICT 2 +#define Z_ERRNO (-1) +#define Z_STREAM_ERROR (-2) +#define Z_DATA_ERROR (-3) +#define Z_MEM_ERROR (-4) +#define Z_BUF_ERROR (-5) +#define Z_VERSION_ERROR (-6) +/* Return codes for the compression/decompression functions. Negative values + * are errors, positive values are used for special but normal events. + */ + +#define Z_NO_COMPRESSION 0 +#define Z_BEST_SPEED 1 +#define Z_BEST_COMPRESSION 9 +#define Z_DEFAULT_COMPRESSION (-1) +/* compression levels */ + +#define Z_FILTERED 1 +#define Z_HUFFMAN_ONLY 2 +#define Z_RLE 3 +#define Z_FIXED 4 +#define Z_DEFAULT_STRATEGY 0 +/* compression strategy; see deflateInit2() below for details */ + +#define Z_BINARY 0 +#define Z_TEXT 1 +#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */ +#define Z_UNKNOWN 2 +/* Possible values of the data_type field (though see inflate()) */ + +#define Z_DEFLATED 8 +/* The deflate compression method (the only one supported in this version) */ + +#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */ + +#define zlib_version zlibVersion() +/* for compatibility with versions < 1.0.2 */ + + + /* basic functions */ + +ZEXTERN const char * ZEXPORT zlibVersion OF((void)); +/* The application can compare zlibVersion and ZLIB_VERSION for consistency. + If the first character differs, the library code actually used is not + compatible with the zlib.h header file used by the application. This check + is automatically made by deflateInit and inflateInit. + */ + +/* +ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level)); + + Initializes the internal stream state for compression. The fields + zalloc, zfree and opaque must be initialized before by the caller. If + zalloc and zfree are set to Z_NULL, deflateInit updates them to use default + allocation functions. + + The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9: + 1 gives best speed, 9 gives best compression, 0 gives no compression at all + (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION + requests a default compromise between speed and compression (currently + equivalent to level 6). + + deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if level is not a valid compression level, or + Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible + with the version assumed by the caller (ZLIB_VERSION). msg is set to null + if there is no error message. deflateInit does not perform any compression: + this will be done by deflate(). +*/ + + +ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush)); +/* + deflate compresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. deflate performs one or both of the + following actions: + + - Compress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in and avail_in are updated and + processing will resume at this point for the next call of deflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. This action is forced if the parameter flush is non zero. + Forcing flush frequently degrades the compression ratio, so this parameter + should be set only when necessary (in interactive applications). Some + output may be provided even if flush is not set. + + Before the call of deflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating avail_in or avail_out accordingly; avail_out should + never be zero before the call. The application can consume the compressed + output when it wants, for example when the output buffer is full (avail_out + == 0), or after each call of deflate(). If deflate returns Z_OK and with + zero avail_out, it must be called again after making room in the output + buffer because there might be more output pending. + + Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to + decide how much data to accumulate before producing output, in order to + maximize compression. + + If the parameter flush is set to Z_SYNC_FLUSH, all pending output is + flushed to the output buffer and the output is aligned on a byte boundary, so + that the decompressor can get all input data available so far. (In + particular avail_in is zero after the call if enough output space has been + provided before the call.) Flushing may degrade compression for some + compression algorithms and so it should be used only when necessary. This + completes the current deflate block and follows it with an empty stored block + that is three bits plus filler bits to the next byte, followed by four bytes + (00 00 ff ff). + + If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the + output buffer, but the output is not aligned to a byte boundary. All of the + input data so far will be available to the decompressor, as for Z_SYNC_FLUSH. + This completes the current deflate block and follows it with an empty fixed + codes block that is 10 bits long. This assures that enough bytes are output + in order for the decompressor to finish the block before the empty fixed code + block. + + If flush is set to Z_BLOCK, a deflate block is completed and emitted, as + for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to + seven bits of the current block are held to be written as the next byte after + the next deflate block is completed. In this case, the decompressor may not + be provided enough bits at this point in order to complete decompression of + the data provided so far to the compressor. It may need to wait for the next + block to be emitted. This is for advanced applications that need to control + the emission of deflate blocks. + + If flush is set to Z_FULL_FLUSH, all output is flushed as with + Z_SYNC_FLUSH, and the compression state is reset so that decompression can + restart from this point if previous compressed data has been damaged or if + random access is desired. Using Z_FULL_FLUSH too often can seriously degrade + compression. + + If deflate returns with avail_out == 0, this function must be called again + with the same value of the flush parameter and more output space (updated + avail_out), until the flush is complete (deflate returns with non-zero + avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that + avail_out is greater than six to avoid repeated flush markers due to + avail_out == 0 on return. + + If the parameter flush is set to Z_FINISH, pending input is processed, + pending output is flushed and deflate returns with Z_STREAM_END if there was + enough output space; if deflate returns with Z_OK, this function must be + called again with Z_FINISH and more output space (updated avail_out) but no + more input data, until it returns with Z_STREAM_END or an error. After + deflate has returned Z_STREAM_END, the only possible operations on the stream + are deflateReset or deflateEnd. + + Z_FINISH can be used immediately after deflateInit if all the compression + is to be done in a single step. In this case, avail_out must be at least the + value returned by deflateBound (see below). Then deflate is guaranteed to + return Z_STREAM_END. If not enough output space is provided, deflate will + not return Z_STREAM_END, and it must be called again as described above. + + deflate() sets strm->adler to the adler32 checksum of all input read + so far (that is, total_in bytes). + + deflate() may update strm->data_type if it can make a good guess about + the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered + binary. This field is only for information purposes and does not affect the + compression algorithm in any manner. + + deflate() returns Z_OK if some progress has been made (more input + processed or more output produced), Z_STREAM_END if all input has been + consumed and all output has been produced (only when flush is set to + Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example + if next_in or next_out was Z_NULL), Z_BUF_ERROR if no progress is possible + (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not + fatal, and deflate() can be called again with more input and more output + space to continue compressing. +*/ + + +ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the + stream state was inconsistent, Z_DATA_ERROR if the stream was freed + prematurely (some input or output was discarded). In the error case, msg + may be set but then points to a static string (which must not be + deallocated). +*/ + + +/* +ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm)); + + Initializes the internal stream state for decompression. The fields + next_in, avail_in, zalloc, zfree and opaque must be initialized before by + the caller. If next_in is not Z_NULL and avail_in is large enough (the + exact value depends on the compression method), inflateInit determines the + compression method from the zlib header and allocates all data structures + accordingly; otherwise the allocation will be deferred to the first call of + inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to + use default allocation functions. + + inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit() does not process any header information -- that is deferred + until inflate() is called. +*/ + + +ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush)); +/* + inflate decompresses as much data as possible, and stops when the input + buffer becomes empty or the output buffer becomes full. It may introduce + some output latency (reading input without producing any output) except when + forced to flush. + + The detailed semantics are as follows. inflate performs one or both of the + following actions: + + - Decompress more input starting at next_in and update next_in and avail_in + accordingly. If not all input can be processed (because there is not + enough room in the output buffer), next_in is updated and processing will + resume at this point for the next call of inflate(). + + - Provide more output starting at next_out and update next_out and avail_out + accordingly. inflate() provides as much output as possible, until there is + no more input data or no more space in the output buffer (see below about + the flush parameter). + + Before the call of inflate(), the application should ensure that at least + one of the actions is possible, by providing more input and/or consuming more + output, and updating the next_* and avail_* values accordingly. The + application can consume the uncompressed output when it wants, for example + when the output buffer is full (avail_out == 0), or after each call of + inflate(). If inflate returns Z_OK and with zero avail_out, it must be + called again after making room in the output buffer because there might be + more output pending. + + The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH, + Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much + output as possible to the output buffer. Z_BLOCK requests that inflate() + stop if and when it gets to the next deflate block boundary. When decoding + the zlib or gzip format, this will cause inflate() to return immediately + after the header and before the first block. When doing a raw inflate, + inflate() will go ahead and process the first block, and will return when it + gets to the end of that block, or when it runs out of data. + + The Z_BLOCK option assists in appending to or combining deflate streams. + Also to assist in this, on return inflate() will set strm->data_type to the + number of unused bits in the last byte taken from strm->next_in, plus 64 if + inflate() is currently decoding the last block in the deflate stream, plus + 128 if inflate() returned immediately after decoding an end-of-block code or + decoding the complete header up to just before the first byte of the deflate + stream. The end-of-block will not be indicated until all of the uncompressed + data from that block has been written to strm->next_out. The number of + unused bits may in general be greater than seven, except when bit 7 of + data_type is set, in which case the number of unused bits will be less than + eight. data_type is set as noted here every time inflate() returns for all + flush options, and so can be used to determine the amount of currently + consumed input in bits. + + The Z_TREES option behaves as Z_BLOCK does, but it also returns when the + end of each deflate block header is reached, before any actual data in that + block is decoded. This allows the caller to determine the length of the + deflate block header for later use in random access within a deflate block. + 256 is added to the value of strm->data_type when inflate() returns + immediately after reaching the end of the deflate block header. + + inflate() should normally be called until it returns Z_STREAM_END or an + error. However if all decompression is to be performed in a single step (a + single call of inflate), the parameter flush should be set to Z_FINISH. In + this case all pending input is processed and all pending output is flushed; + avail_out must be large enough to hold all of the uncompressed data for the + operation to complete. (The size of the uncompressed data may have been + saved by the compressor for this purpose.) The use of Z_FINISH is not + required to perform an inflation in one step. However it may be used to + inform inflate that a faster approach can be used for the single inflate() + call. Z_FINISH also informs inflate to not maintain a sliding window if the + stream completes, which reduces inflate's memory footprint. If the stream + does not complete, either because not all of the stream is provided or not + enough output space is provided, then a sliding window will be allocated and + inflate() can be called again to continue the operation as if Z_NO_FLUSH had + been used. + + In this implementation, inflate() always flushes as much output as + possible to the output buffer, and always uses the faster approach on the + first call. So the effects of the flush parameter in this implementation are + on the return value of inflate() as noted below, when inflate() returns early + when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of + memory for a sliding window when Z_FINISH is used. + + If a preset dictionary is needed after this call (see inflateSetDictionary + below), inflate sets strm->adler to the Adler-32 checksum of the dictionary + chosen by the compressor and returns Z_NEED_DICT; otherwise it sets + strm->adler to the Adler-32 checksum of all output produced so far (that is, + total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described + below. At the end of the stream, inflate() checks that its computed adler32 + checksum is equal to that saved by the compressor and returns Z_STREAM_END + only if the checksum is correct. + + inflate() can decompress and check either zlib-wrapped or gzip-wrapped + deflate data. The header type is detected automatically, if requested when + initializing with inflateInit2(). Any information contained in the gzip + header is not retained, so applications that need that information should + instead use raw inflate, see inflateInit2() below, or inflateBack() and + perform their own processing of the gzip header and trailer. When processing + gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output + producted so far. The CRC-32 is checked against the gzip trailer. + + inflate() returns Z_OK if some progress has been made (more input processed + or more output produced), Z_STREAM_END if the end of the compressed data has + been reached and all uncompressed output has been produced, Z_NEED_DICT if a + preset dictionary is needed at this point, Z_DATA_ERROR if the input data was + corrupted (input stream not conforming to the zlib format or incorrect check + value), Z_STREAM_ERROR if the stream structure was inconsistent (for example + next_in or next_out was Z_NULL), Z_MEM_ERROR if there was not enough memory, + Z_BUF_ERROR if no progress is possible or if there was not enough room in the + output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and + inflate() can be called again with more input and more output space to + continue decompressing. If Z_DATA_ERROR is returned, the application may + then call inflateSync() to look for a good compression block if a partial + recovery of the data is desired. +*/ + + +ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm)); +/* + All dynamically allocated data structures for this stream are freed. + This function discards any unprocessed input and does not flush any pending + output. + + inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state + was inconsistent. In the error case, msg may be set but then points to a + static string (which must not be deallocated). +*/ + + + /* Advanced functions */ + +/* + The following functions are needed only in some special applications. +*/ + +/* +ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm, + int level, + int method, + int windowBits, + int memLevel, + int strategy)); + + This is another version of deflateInit with more compression options. The + fields next_in, zalloc, zfree and opaque must be initialized before by the + caller. + + The method parameter is the compression method. It must be Z_DEFLATED in + this version of the library. + + The windowBits parameter is the base two logarithm of the window size + (the size of the history buffer). It should be in the range 8..15 for this + version of the library. Larger values of this parameter result in better + compression at the expense of memory usage. The default value is 15 if + deflateInit is used instead. + + windowBits can also be -8..-15 for raw deflate. In this case, -windowBits + determines the window size. deflate() will then generate raw deflate data + with no zlib header or trailer, and will not compute an adler32 check value. + + windowBits can also be greater than 15 for optional gzip encoding. Add + 16 to windowBits to write a simple gzip header and trailer around the + compressed data instead of a zlib wrapper. The gzip header will have no + file name, no extra data, no comment, no modification time (set to zero), no + header crc, and the operating system will be set to 255 (unknown). If a + gzip stream is being written, strm->adler is a crc32 instead of an adler32. + + The memLevel parameter specifies how much memory should be allocated + for the internal compression state. memLevel=1 uses minimum memory but is + slow and reduces compression ratio; memLevel=9 uses maximum memory for + optimal speed. The default value is 8. See zconf.h for total memory usage + as a function of windowBits and memLevel. + + The strategy parameter is used to tune the compression algorithm. Use the + value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a + filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no + string match), or Z_RLE to limit match distances to one (run-length + encoding). Filtered data consists mostly of small values with a somewhat + random distribution. In this case, the compression algorithm is tuned to + compress them better. The effect of Z_FILTERED is to force more Huffman + coding and less string matching; it is somewhat intermediate between + Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as + fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The + strategy parameter only affects the compression ratio but not the + correctness of the compressed output even if it is not set appropriately. + Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler + decoder for special applications. + + deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid + method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is + incompatible with the version assumed by the caller (ZLIB_VERSION). msg is + set to null if there is no error message. deflateInit2 does not perform any + compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the compression dictionary from the given byte sequence + without producing any compressed output. When using the zlib format, this + function must be called immediately after deflateInit, deflateInit2 or + deflateReset, and before any call of deflate. When doing raw deflate, this + function must be called either before any call of deflate, or immediately + after the completion of a deflate block, i.e. after all input has been + consumed and all output has been delivered when using any of the flush + options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The + compressor and decompressor must use exactly the same dictionary (see + inflateSetDictionary). + + The dictionary should consist of strings (byte sequences) that are likely + to be encountered later in the data to be compressed, with the most commonly + used strings preferably put towards the end of the dictionary. Using a + dictionary is most useful when the data to be compressed is short and can be + predicted with good accuracy; the data can then be compressed better than + with the default empty dictionary. + + Depending on the size of the compression data structures selected by + deflateInit or deflateInit2, a part of the dictionary may in effect be + discarded, for example if the dictionary is larger than the window size + provided in deflateInit or deflateInit2. Thus the strings most likely to be + useful should be put at the end of the dictionary, not at the front. In + addition, the current implementation of deflate will use at most the window + size minus 262 bytes of the provided dictionary. + + Upon return of this function, strm->adler is set to the adler32 value + of the dictionary; the decompressor may later use this value to determine + which dictionary has been used by the compressor. (The adler32 value + applies to the whole dictionary even if only a subset of the dictionary is + actually used by the compressor.) If a raw deflate was requested, then the + adler32 value is not computed and strm->adler is not set. + + deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent (for example if deflate has already been called for this stream + or if not at a block boundary for raw deflate). deflateSetDictionary does + not perform any compression: this will be done by deflate(). +*/ + +ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when several compression strategies will be + tried, for example when there are several ways of pre-processing the input + data with a filter. The streams that will be discarded should then be freed + by calling deflateEnd. Note that deflateCopy duplicates the internal + compression state which can be quite large, so this strategy is slow and can + consume lots of memory. + + deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm)); +/* + This function is equivalent to deflateEnd followed by deflateInit, + but does not free and reallocate all the internal compression state. The + stream will keep the same compression level and any other attributes that + may have been set by deflateInit2. + + deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm, + int level, + int strategy)); +/* + Dynamically update the compression level and compression strategy. The + interpretation of level and strategy is as in deflateInit2. This can be + used to switch between compression and straight copy of the input data, or + to switch to a different kind of input data requiring a different strategy. + If the compression level is changed, the input available so far is + compressed with the old level (and may be flushed); the new level will take + effect only at the next call of deflate(). + + Before the call of deflateParams, the stream state must be set as for + a call of deflate(), since the currently available input may have to be + compressed and flushed. In particular, strm->avail_out must be non-zero. + + deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source + stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR if + strm->avail_out was zero. +*/ + +ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm, + int good_length, + int max_lazy, + int nice_length, + int max_chain)); +/* + Fine tune deflate's internal compression parameters. This should only be + used by someone who understands the algorithm used by zlib's deflate for + searching for the best matching string, and even then only by the most + fanatic optimizer trying to squeeze out the last compressed bit for their + specific input data. Read the deflate.c source code for the meaning of the + max_lazy, good_length, nice_length, and max_chain parameters. + + deflateTune() can be called after deflateInit() or deflateInit2(), and + returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream. + */ + +ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm, + uLong sourceLen)); +/* + deflateBound() returns an upper bound on the compressed size after + deflation of sourceLen bytes. It must be called after deflateInit() or + deflateInit2(), and after deflateSetHeader(), if used. This would be used + to allocate an output buffer for deflation in a single pass, and so would be + called before deflate(). If that first deflate() call is provided the + sourceLen input bytes, an output buffer allocated to the size returned by + deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed + to return Z_STREAM_END. Note that it is possible for the compressed size to + be larger than the value returned by deflateBound() if flush options other + than Z_FINISH or Z_NO_FLUSH are used. +*/ + +ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm, + unsigned *pending, + int *bits)); +/* + deflatePending() returns the number of bytes and bits of output that have + been generated, but not yet provided in the available output. The bytes not + provided would be due to the available output space having being consumed. + The number of bits of output not provided are between 0 and 7, where they + await more bits to join them in order to fill out a full byte. If pending + or bits are Z_NULL, then those values are not set. + + deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. + */ + +ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + deflatePrime() inserts bits in the deflate output stream. The intent + is that this function is used to start off the deflate output with the bits + leftover from a previous deflate stream when appending to it. As such, this + function can only be used for raw deflate, and must be used before the first + deflate() call after a deflateInit2() or deflateReset(). bits must be less + than or equal to 16, and that many of the least significant bits of value + will be inserted in the output. + + deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough + room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm, + gz_headerp head)); +/* + deflateSetHeader() provides gzip header information for when a gzip + stream is requested by deflateInit2(). deflateSetHeader() may be called + after deflateInit2() or deflateReset() and before the first call of + deflate(). The text, time, os, extra field, name, and comment information + in the provided gz_header structure are written to the gzip header (xflag is + ignored -- the extra flags are set according to the compression level). The + caller must assure that, if not Z_NULL, name and comment are terminated with + a zero byte, and that if extra is not Z_NULL, that extra_len bytes are + available there. If hcrc is true, a gzip header crc is included. Note that + the current versions of the command-line version of gzip (up through version + 1.3.x) do not support header crc's, and will report that it is a "multi-part + gzip file" and give up. + + If deflateSetHeader is not used, the default gzip header has text false, + the time set to zero, and os set to 255, with no extra, name, or comment + fields. The gzip header is returned to the default state by deflateReset(). + + deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm, + int windowBits)); + + This is another version of inflateInit with an extra parameter. The + fields next_in, avail_in, zalloc, zfree and opaque must be initialized + before by the caller. + + The windowBits parameter is the base two logarithm of the maximum window + size (the size of the history buffer). It should be in the range 8..15 for + this version of the library. The default value is 15 if inflateInit is used + instead. windowBits must be greater than or equal to the windowBits value + provided to deflateInit2() while compressing, or it must be equal to 15 if + deflateInit2() was not used. If a compressed stream with a larger window + size is given as input, inflate() will return with the error code + Z_DATA_ERROR instead of trying to allocate a larger window. + + windowBits can also be zero to request that inflate use the window size in + the zlib header of the compressed stream. + + windowBits can also be -8..-15 for raw inflate. In this case, -windowBits + determines the window size. inflate() will then process raw deflate data, + not looking for a zlib or gzip header, not generating a check value, and not + looking for any check values for comparison at the end of the stream. This + is for use with other formats that use the deflate compressed data format + such as zip. Those formats provide their own check values. If a custom + format is developed using the raw deflate format for compressed data, it is + recommended that a check value such as an adler32 or a crc32 be applied to + the uncompressed data as is done in the zlib, gzip, and zip formats. For + most applications, the zlib format should be used as is. Note that comments + above on the use in deflateInit2() applies to the magnitude of windowBits. + + windowBits can also be greater than 15 for optional gzip decoding. Add + 32 to windowBits to enable zlib and gzip decoding with automatic header + detection, or add 16 to decode only the gzip format (the zlib format will + return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a + crc32 instead of an adler32. + + inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_VERSION_ERROR if the zlib library version is incompatible with the + version assumed by the caller, or Z_STREAM_ERROR if the parameters are + invalid, such as a null pointer to the structure. msg is set to null if + there is no error message. inflateInit2 does not perform any decompression + apart from possibly reading the zlib header if present: actual decompression + will be done by inflate(). (So next_in and avail_in may be modified, but + next_out and avail_out are unused and unchanged.) The current implementation + of inflateInit2() does not process any header information -- that is + deferred until inflate() is called. +*/ + +ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm, + const Bytef *dictionary, + uInt dictLength)); +/* + Initializes the decompression dictionary from the given uncompressed byte + sequence. This function must be called immediately after a call of inflate, + if that call returned Z_NEED_DICT. The dictionary chosen by the compressor + can be determined from the adler32 value returned by that call of inflate. + The compressor and decompressor must use exactly the same dictionary (see + deflateSetDictionary). For raw inflate, this function can be called at any + time to set the dictionary. If the provided dictionary is smaller than the + window and there is already data in the window, then the provided dictionary + will amend what's there. The application must insure that the dictionary + that was used for compression is provided. + + inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a + parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is + inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the + expected one (incorrect adler32 value). inflateSetDictionary does not + perform any decompression: this will be done by subsequent calls of + inflate(). +*/ + +ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm, + Bytef *dictionary, + uInt *dictLength)); +/* + Returns the sliding dictionary being maintained by inflate. dictLength is + set to the number of bytes in the dictionary, and that many bytes are copied + to dictionary. dictionary must have enough space, where 32768 bytes is + always enough. If inflateGetDictionary() is called with dictionary equal to + Z_NULL, then only the dictionary length is returned, and nothing is copied. + Similary, if dictLength is Z_NULL, then it is not set. + + inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the + stream state is inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm)); +/* + Skips invalid compressed data until a possible full flush point (see above + for the description of deflate with Z_FULL_FLUSH) can be found, or until all + available input is skipped. No output is provided. + + inflateSync searches for a 00 00 FF FF pattern in the compressed data. + All full flush points have this pattern, but not all occurrences of this + pattern are full flush points. + + inflateSync returns Z_OK if a possible full flush point has been found, + Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point + has been found, or Z_STREAM_ERROR if the stream structure was inconsistent. + In the success case, the application may save the current current value of + total_in which indicates where valid compressed data was found. In the + error case, the application may repeatedly call inflateSync, providing more + input each time, until success or end of the input data. +*/ + +ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest, + z_streamp source)); +/* + Sets the destination stream as a complete copy of the source stream. + + This function can be useful when randomly accessing a large stream. The + first pass through the stream can periodically record the inflate state, + allowing restarting inflate at those points when randomly accessing the + stream. + + inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_STREAM_ERROR if the source stream state was inconsistent + (such as zalloc being Z_NULL). msg is left unchanged in both source and + destination. +*/ + +ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm)); +/* + This function is equivalent to inflateEnd followed by inflateInit, + but does not free and reallocate all the internal decompression state. The + stream will keep attributes that may have been set by inflateInit2. + + inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL). +*/ + +ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm, + int windowBits)); +/* + This function is the same as inflateReset, but it also permits changing + the wrap and window size requests. The windowBits parameter is interpreted + the same as it is for inflateInit2. + + inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent (such as zalloc or state being Z_NULL), or if + the windowBits parameter is invalid. +*/ + +ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm, + int bits, + int value)); +/* + This function inserts bits in the inflate input stream. The intent is + that this function is used to start inflating at a bit position in the + middle of a byte. The provided bits will be used before any bytes are used + from next_in. This function should only be used with raw inflate, and + should be used before the first inflate() call after inflateInit2() or + inflateReset(). bits must be less than or equal to 16, and that many of the + least significant bits of value will be inserted in the input. + + If bits is negative, then the input stream bit buffer is emptied. Then + inflatePrime() can be called again to put bits in the buffer. This is used + to clear out bits leftover after feeding inflate a block description prior + to feeding inflate codes. + + inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm)); +/* + This function returns two values, one in the lower 16 bits of the return + value, and the other in the remaining upper bits, obtained by shifting the + return value down 16 bits. If the upper value is -1 and the lower value is + zero, then inflate() is currently decoding information outside of a block. + If the upper value is -1 and the lower value is non-zero, then inflate is in + the middle of a stored block, with the lower value equaling the number of + bytes from the input remaining to copy. If the upper value is not -1, then + it is the number of bits back from the current bit position in the input of + the code (literal or length/distance pair) currently being processed. In + that case the lower value is the number of bytes already emitted for that + code. + + A code is being processed if inflate is waiting for more input to complete + decoding of the code, or if it has completed decoding but is waiting for + more output space to write the literal or match data. + + inflateMark() is used to mark locations in the input data for random + access, which may be at bit positions, and to note those cases where the + output of a code may span boundaries of random access blocks. The current + location in the input stream can be determined from avail_in and data_type + as noted in the description for the Z_BLOCK flush parameter for inflate. + + inflateMark returns the value noted above or -1 << 16 if the provided + source stream state was inconsistent. +*/ + +ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm, + gz_headerp head)); +/* + inflateGetHeader() requests that gzip header information be stored in the + provided gz_header structure. inflateGetHeader() may be called after + inflateInit2() or inflateReset(), and before the first call of inflate(). + As inflate() processes the gzip stream, head->done is zero until the header + is completed, at which time head->done is set to one. If a zlib stream is + being decoded, then head->done is set to -1 to indicate that there will be + no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be + used to force inflate() to return immediately after header processing is + complete and before any actual data is decompressed. + + The text, time, xflags, and os fields are filled in with the gzip header + contents. hcrc is set to true if there is a header CRC. (The header CRC + was valid if done is set to one.) If extra is not Z_NULL, then extra_max + contains the maximum number of bytes to write to extra. Once done is true, + extra_len contains the actual extra field length, and extra contains the + extra field, or that field truncated if extra_max is less than extra_len. + If name is not Z_NULL, then up to name_max characters are written there, + terminated with a zero unless the length is greater than name_max. If + comment is not Z_NULL, then up to comm_max characters are written there, + terminated with a zero unless the length is greater than comm_max. When any + of extra, name, or comment are not Z_NULL and the respective field is not + present in the header, then that field is set to Z_NULL to signal its + absence. This allows the use of deflateSetHeader() with the returned + structure to duplicate the header. However if those fields are set to + allocated memory, then the application will need to save those pointers + elsewhere so that they can be eventually freed. + + If inflateGetHeader is not used, then the header information is simply + discarded. The header is always checked for validity, including the header + CRC if present. inflateReset() will reset the process to discard the header + information. The application would need to call inflateGetHeader() again to + retrieve the header from the next gzip stream. + + inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source + stream state was inconsistent. +*/ + +/* +ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits, + unsigned char FAR *window)); + + Initialize the internal stream state for decompression using inflateBack() + calls. The fields zalloc, zfree and opaque in strm must be initialized + before the call. If zalloc and zfree are Z_NULL, then the default library- + derived memory allocation routines are used. windowBits is the base two + logarithm of the window size, in the range 8..15. window is a caller + supplied buffer of that size. Except for special applications where it is + assured that deflate was used with small window sizes, windowBits must be 15 + and a 32K byte window must be supplied to be able to decompress general + deflate streams. + + See inflateBack() for the usage of these routines. + + inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of + the parameters are invalid, Z_MEM_ERROR if the internal state could not be + allocated, or Z_VERSION_ERROR if the version of the library does not match + the version of the header file. +*/ + +typedef unsigned (*in_func) OF((void FAR *, + z_const unsigned char FAR * FAR *)); +typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned)); + +ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm, + in_func in, void FAR *in_desc, + out_func out, void FAR *out_desc)); +/* + inflateBack() does a raw inflate with a single call using a call-back + interface for input and output. This is potentially more efficient than + inflate() for file i/o applications, in that it avoids copying between the + output and the sliding window by simply making the window itself the output + buffer. inflate() can be faster on modern CPUs when used with large + buffers. inflateBack() trusts the application to not change the output + buffer passed by the output function, at least until inflateBack() returns. + + inflateBackInit() must be called first to allocate the internal state + and to initialize the state with the user-provided window buffer. + inflateBack() may then be used multiple times to inflate a complete, raw + deflate stream with each call. inflateBackEnd() is then called to free the + allocated state. + + A raw deflate stream is one with no zlib or gzip header or trailer. + This routine would normally be used in a utility that reads zip or gzip + files and writes out uncompressed files. The utility would decode the + header and process the trailer on its own, hence this routine expects only + the raw deflate stream to decompress. This is different from the normal + behavior of inflate(), which expects either a zlib or gzip header and + trailer around the deflate stream. + + inflateBack() uses two subroutines supplied by the caller that are then + called by inflateBack() for input and output. inflateBack() calls those + routines until it reads a complete deflate stream and writes out all of the + uncompressed data, or until it encounters an error. The function's + parameters and return types are defined above in the in_func and out_func + typedefs. inflateBack() will call in(in_desc, &buf) which should return the + number of bytes of provided input, and a pointer to that input in buf. If + there is no input available, in() must return zero--buf is ignored in that + case--and inflateBack() will return a buffer error. inflateBack() will call + out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out() + should return zero on success, or non-zero on failure. If out() returns + non-zero, inflateBack() will return with an error. Neither in() nor out() + are permitted to change the contents of the window provided to + inflateBackInit(), which is also the buffer that out() uses to write from. + The length written by out() will be at most the window size. Any non-zero + amount of input may be provided by in(). + + For convenience, inflateBack() can be provided input on the first call by + setting strm->next_in and strm->avail_in. If that input is exhausted, then + in() will be called. Therefore strm->next_in must be initialized before + calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called + immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in + must also be initialized, and then if strm->avail_in is not zero, input will + initially be taken from strm->next_in[0 .. strm->avail_in - 1]. + + The in_desc and out_desc parameters of inflateBack() is passed as the + first parameter of in() and out() respectively when they are called. These + descriptors can be optionally used to pass any information that the caller- + supplied in() and out() functions need to do their job. + + On return, inflateBack() will set strm->next_in and strm->avail_in to + pass back any unused input that was provided by the last in() call. The + return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR + if in() or out() returned an error, Z_DATA_ERROR if there was a format error + in the deflate stream (in which case strm->msg is set to indicate the nature + of the error), or Z_STREAM_ERROR if the stream was not properly initialized. + In the case of Z_BUF_ERROR, an input or output error can be distinguished + using strm->next_in which will be Z_NULL only if in() returned an error. If + strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning + non-zero. (in() will always be called before out(), so strm->next_in is + assured to be defined if out() returns non-zero.) Note that inflateBack() + cannot return Z_OK. +*/ + +ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm)); +/* + All memory allocated by inflateBackInit() is freed. + + inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream + state was inconsistent. +*/ + +ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void)); +/* Return flags indicating compile-time options. + + Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other: + 1.0: size of uInt + 3.2: size of uLong + 5.4: size of voidpf (pointer) + 7.6: size of z_off_t + + Compiler, assembler, and debug options: + 8: DEBUG + 9: ASMV or ASMINF -- use ASM code + 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention + 11: 0 (reserved) + + One-time table building (smaller code, but not thread-safe if true): + 12: BUILDFIXED -- build static block decoding tables when needed + 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed + 14,15: 0 (reserved) + + Library content (indicates missing functionality): + 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking + deflate code when not needed) + 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect + and decode gzip streams (to avoid linking crc code) + 18-19: 0 (reserved) + + Operation variations (changes in library functionality): + 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate + 21: FASTEST -- deflate algorithm with only one, lowest compression level + 22,23: 0 (reserved) + + The sprintf variant used by gzprintf (zero is best): + 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format + 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure! + 26: 0 = returns value, 1 = void -- 1 means inferred string length returned + + Remainder: + 27-31: 0 (reserved) + */ + +#ifndef Z_SOLO + + /* utility functions */ + +/* + The following utility functions are implemented on top of the basic + stream-oriented functions. To simplify the interface, some default options + are assumed (compression level and memory usage, standard memory allocation + functions). The source code of these utility functions can be modified if + you need special options. +*/ + +ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Compresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer. +*/ + +ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen, + int level)); +/* + Compresses the source buffer into the destination buffer. The level + parameter has the same meaning as in deflateInit. sourceLen is the byte + length of the source buffer. Upon entry, destLen is the total size of the + destination buffer, which must be at least the value returned by + compressBound(sourceLen). Upon exit, destLen is the actual size of the + compressed buffer. + + compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough + memory, Z_BUF_ERROR if there was not enough room in the output buffer, + Z_STREAM_ERROR if the level parameter is invalid. +*/ + +ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen)); +/* + compressBound() returns an upper bound on the compressed size after + compress() or compress2() on sourceLen bytes. It would be used before a + compress() or compress2() call to allocate the destination buffer. +*/ + +ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen, + const Bytef *source, uLong sourceLen)); +/* + Decompresses the source buffer into the destination buffer. sourceLen is + the byte length of the source buffer. Upon entry, destLen is the total size + of the destination buffer, which must be large enough to hold the entire + uncompressed data. (The size of the uncompressed data must have been saved + previously by the compressor and transmitted to the decompressor by some + mechanism outside the scope of this compression library.) Upon exit, destLen + is the actual size of the uncompressed buffer. + + uncompress returns Z_OK if success, Z_MEM_ERROR if there was not + enough memory, Z_BUF_ERROR if there was not enough room in the output + buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In + the case where there is not enough room, uncompress() will fill the output + buffer with the uncompressed data up to that point. +*/ + + /* gzip file access functions */ + +/* + This library supports reading and writing files in gzip (.gz) format with + an interface similar to that of stdio, using the functions that start with + "gz". The gzip format is different from the zlib format. gzip is a gzip + wrapper, documented in RFC 1952, wrapped around a deflate stream. +*/ + +typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */ + +/* +ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode)); + + Opens a gzip (.gz) file for reading or writing. The mode parameter is as + in fopen ("rb" or "wb") but can also include a compression level ("wb9") or + a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only + compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F' + for fixed code compression as in "wb9F". (See the description of + deflateInit2 for more information about the strategy parameter.) 'T' will + request transparent writing or appending with no compression and not using + the gzip format. + + "a" can be used instead of "w" to request that the gzip stream that will + be written be appended to the file. "+" will result in an error, since + reading and writing to the same gzip file is not supported. The addition of + "x" when writing will create the file exclusively, which fails if the file + already exists. On systems that support it, the addition of "e" when + reading or writing will set the flag to close the file on an execve() call. + + These functions, as well as gzip, will read and decode a sequence of gzip + streams in a file. The append function of gzopen() can be used to create + such a file. (Also see gzflush() for another way to do this.) When + appending, gzopen does not test whether the file begins with a gzip stream, + nor does it look for the end of the gzip streams to begin appending. gzopen + will simply append a gzip stream to the existing file. + + gzopen can be used to read a file which is not in gzip format; in this + case gzread will directly read from the file without decompression. When + reading, this will be detected automatically by looking for the magic two- + byte gzip header. + + gzopen returns NULL if the file could not be opened, if there was + insufficient memory to allocate the gzFile state, or if an invalid mode was + specified (an 'r', 'w', or 'a' was not provided, or '+' was provided). + errno can be checked to determine if the reason gzopen failed was that the + file could not be opened. +*/ + +ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode)); +/* + gzdopen associates a gzFile with the file descriptor fd. File descriptors + are obtained from calls like open, dup, creat, pipe or fileno (if the file + has been previously opened with fopen). The mode parameter is as in gzopen. + + The next call of gzclose on the returned gzFile will also close the file + descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor + fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd, + mode);. The duplicated descriptor should be saved to avoid a leak, since + gzdopen does not close fd if it fails. If you are using fileno() to get the + file descriptor from a FILE *, then you will have to use dup() to avoid + double-close()ing the file descriptor. Both gzclose() and fclose() will + close the associated file descriptor, so they need to have different file + descriptors. + + gzdopen returns NULL if there was insufficient memory to allocate the + gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not + provided, or '+' was provided), or if fd is -1. The file descriptor is not + used until the next gz* read, write, seek, or close operation, so gzdopen + will not detect if fd is invalid (unless fd is -1). +*/ + +ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size)); +/* + Set the internal buffer size used by this library's functions. The + default buffer size is 8192 bytes. This function must be called after + gzopen() or gzdopen(), and before any other calls that read or write the + file. The buffer memory allocation is always deferred to the first read or + write. Two buffers are allocated, either both of the specified size when + writing, or one of the specified size and the other twice that size when + reading. A larger buffer size of, for example, 64K or 128K bytes will + noticeably increase the speed of decompression (reading). + + The new buffer size also affects the maximum length for gzprintf(). + + gzbuffer() returns 0 on success, or -1 on failure, such as being called + too late. +*/ + +ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy)); +/* + Dynamically update the compression level or strategy. See the description + of deflateInit2 for the meaning of these parameters. + + gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not + opened for writing. +*/ + +ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len)); +/* + Reads the given number of uncompressed bytes from the compressed file. If + the input file is not in gzip format, gzread copies the given number of + bytes into the buffer directly from the file. + + After reaching the end of a gzip stream in the input, gzread will continue + to read, looking for another gzip stream. Any number of gzip streams may be + concatenated in the input file, and will all be decompressed by gzread(). + If something other than a gzip stream is encountered after a gzip stream, + that remaining trailing garbage is ignored (and no error is returned). + + gzread can be used to read a gzip file that is being concurrently written. + Upon reaching the end of the input, gzread will return with the available + data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then + gzclearerr can be used to clear the end of file indicator in order to permit + gzread to be tried again. Z_OK indicates that a gzip stream was completed + on the last gzread. Z_BUF_ERROR indicates that the input file ended in the + middle of a gzip stream. Note that gzread does not return -1 in the event + of an incomplete gzip stream. This error is deferred until gzclose(), which + will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip + stream. Alternatively, gzerror can be used before gzclose to detect this + case. + + gzread returns the number of uncompressed bytes actually read, less than + len for end of file, or -1 for error. +*/ + +ZEXTERN int ZEXPORT gzwrite OF((gzFile file, + voidpc buf, unsigned len)); +/* + Writes the given number of uncompressed bytes into the compressed file. + gzwrite returns the number of uncompressed bytes written or 0 in case of + error. +*/ + +ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...)); +/* + Converts, formats, and writes the arguments to the compressed file under + control of the format string, as in fprintf. gzprintf returns the number of + uncompressed bytes actually written, or 0 in case of error. The number of + uncompressed bytes written is limited to 8191, or one less than the buffer + size given to gzbuffer(). The caller should assure that this limit is not + exceeded. If it is exceeded, then gzprintf() will return an error (0) with + nothing written. In this case, there may also be a buffer overflow with + unpredictable consequences, which is possible only if zlib was compiled with + the insecure functions sprintf() or vsprintf() because the secure snprintf() + or vsnprintf() functions were not available. This can be determined using + zlibCompileFlags(). +*/ + +ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s)); +/* + Writes the given null-terminated string to the compressed file, excluding + the terminating null character. + + gzputs returns the number of characters written, or -1 in case of error. +*/ + +ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len)); +/* + Reads bytes from the compressed file until len-1 characters are read, or a + newline character is read and transferred to buf, or an end-of-file + condition is encountered. If any characters are read or if len == 1, the + string is terminated with a null character. If no characters are read due + to an end-of-file or len < 1, then the buffer is left untouched. + + gzgets returns buf which is a null-terminated string, or it returns NULL + for end-of-file or in case of error. If there was an error, the contents at + buf are indeterminate. +*/ + +ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c)); +/* + Writes c, converted to an unsigned char, into the compressed file. gzputc + returns the value that was written, or -1 in case of error. +*/ + +ZEXTERN int ZEXPORT gzgetc OF((gzFile file)); +/* + Reads one byte from the compressed file. gzgetc returns this byte or -1 + in case of end of file or error. This is implemented as a macro for speed. + As such, it does not do all of the checking the other functions do. I.e. + it does not check to see if file is NULL, nor whether the structure file + points to has been clobbered or not. +*/ + +ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file)); +/* + Push one character back onto the stream to be read as the first character + on the next read. At least one character of push-back is allowed. + gzungetc() returns the character pushed, or -1 on failure. gzungetc() will + fail if c is -1, and may fail if a character has been pushed but not read + yet. If gzungetc is used immediately after gzopen or gzdopen, at least the + output buffer size of pushed characters is allowed. (See gzbuffer above.) + The pushed character will be discarded if the stream is repositioned with + gzseek() or gzrewind(). +*/ + +ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush)); +/* + Flushes all pending output into the compressed file. The parameter flush + is as in the deflate() function. The return value is the zlib error number + (see function gzerror below). gzflush is only permitted when writing. + + If the flush parameter is Z_FINISH, the remaining data is written and the + gzip stream is completed in the output. If gzwrite() is called again, a new + gzip stream will be started in the output. gzread() is able to read such + concatented gzip streams. + + gzflush should be called only when strictly necessary because it will + degrade compression if called too often. +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file, + z_off_t offset, int whence)); + + Sets the starting position for the next gzread or gzwrite on the given + compressed file. The offset represents a number of bytes in the + uncompressed data stream. The whence parameter is defined as in lseek(2); + the value SEEK_END is not supported. + + If the file is opened for reading, this function is emulated but can be + extremely slow. If the file is opened for writing, only forward seeks are + supported; gzseek then compresses a sequence of zeroes up to the new + starting position. + + gzseek returns the resulting offset location as measured in bytes from + the beginning of the uncompressed stream, or -1 in case of error, in + particular if the file is opened for writing and the new starting position + would be before the current position. +*/ + +ZEXTERN int ZEXPORT gzrewind OF((gzFile file)); +/* + Rewinds the given file. This function is supported only for reading. + + gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file)); + + Returns the starting position for the next gzread or gzwrite on the given + compressed file. This position represents a number of bytes in the + uncompressed data stream, and is zero when starting, even if appending or + reading a gzip stream from the middle of a file using gzdopen(). + + gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR) +*/ + +/* +ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file)); + + Returns the current offset in the file being read or written. This offset + includes the count of bytes that precede the gzip stream, for example when + appending or when using gzdopen() for reading. When reading, the offset + does not include as yet unused buffered input. This information can be used + for a progress indicator. On error, gzoffset() returns -1. +*/ + +ZEXTERN int ZEXPORT gzeof OF((gzFile file)); +/* + Returns true (1) if the end-of-file indicator has been set while reading, + false (0) otherwise. Note that the end-of-file indicator is set only if the + read tried to go past the end of the input, but came up short. Therefore, + just like feof(), gzeof() may return false even if there is no more data to + read, in the event that the last read request was for the exact number of + bytes remaining in the input file. This will happen if the input file size + is an exact multiple of the buffer size. + + If gzeof() returns true, then the read functions will return no more data, + unless the end-of-file indicator is reset by gzclearerr() and the input file + has grown since the previous end of file was detected. +*/ + +ZEXTERN int ZEXPORT gzdirect OF((gzFile file)); +/* + Returns true (1) if file is being copied directly while reading, or false + (0) if file is a gzip stream being decompressed. + + If the input file is empty, gzdirect() will return true, since the input + does not contain a gzip stream. + + If gzdirect() is used immediately after gzopen() or gzdopen() it will + cause buffers to be allocated to allow reading the file to determine if it + is a gzip file. Therefore if gzbuffer() is used, it should be called before + gzdirect(). + + When writing, gzdirect() returns true (1) if transparent writing was + requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note: + gzdirect() is not needed when writing. Transparent writing must be + explicitly requested, so the application already knows the answer. When + linking statically, using gzdirect() will include all of the zlib code for + gzip file reading and decompression, which may not be desired.) +*/ + +ZEXTERN int ZEXPORT gzclose OF((gzFile file)); +/* + Flushes all pending output if necessary, closes the compressed file and + deallocates the (de)compression state. Note that once file is closed, you + cannot call gzerror with file, since its structures have been deallocated. + gzclose must not be called more than once on the same file, just as free + must not be called more than once on the same allocation. + + gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a + file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the + last read ended in the middle of a gzip stream, or Z_OK on success. +*/ + +ZEXTERN int ZEXPORT gzclose_r OF((gzFile file)); +ZEXTERN int ZEXPORT gzclose_w OF((gzFile file)); +/* + Same as gzclose(), but gzclose_r() is only for use when reading, and + gzclose_w() is only for use when writing or appending. The advantage to + using these instead of gzclose() is that they avoid linking in zlib + compression or decompression code that is not used when only reading or only + writing respectively. If gzclose() is used, then both compression and + decompression code will be included the application when linking to a static + zlib library. +*/ + +ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum)); +/* + Returns the error message for the last error which occurred on the given + compressed file. errnum is set to zlib error number. If an error occurred + in the file system and not in the compression library, errnum is set to + Z_ERRNO and the application may consult errno to get the exact error code. + + The application must not modify the returned string. Future calls to + this function may invalidate the previously returned string. If file is + closed, then the string previously returned by gzerror will no longer be + available. + + gzerror() should be used to distinguish errors from end-of-file for those + functions above that do not distinguish those cases in their return values. +*/ + +ZEXTERN void ZEXPORT gzclearerr OF((gzFile file)); +/* + Clears the error and end-of-file flags for file. This is analogous to the + clearerr() function in stdio. This is useful for continuing to read a gzip + file that is being written concurrently. +*/ + +#endif /* !Z_SOLO */ + + /* checksum functions */ + +/* + These functions are not related to compression but are exported + anyway because they might be useful in applications using the compression + library. +*/ + +ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len)); +/* + Update a running Adler-32 checksum with the bytes buf[0..len-1] and + return the updated checksum. If buf is Z_NULL, this function returns the + required initial value for the checksum. + + An Adler-32 checksum is almost as reliable as a CRC32 but can be computed + much faster. + + Usage example: + + uLong adler = adler32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + adler = adler32(adler, buffer, length); + } + if (adler != original_adler) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2, + z_off_t len2)); + + Combine two Adler-32 checksums into one. For two sequences of bytes, seq1 + and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for + each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of + seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note + that the z_off_t type (like off_t) is a signed integer. If len2 is + negative, the result has no meaning or utility. +*/ + +ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len)); +/* + Update a running CRC-32 with the bytes buf[0..len-1] and return the + updated CRC-32. If buf is Z_NULL, this function returns the required + initial value for the crc. Pre- and post-conditioning (one's complement) is + performed within this function so it shouldn't be done by the application. + + Usage example: + + uLong crc = crc32(0L, Z_NULL, 0); + + while (read_buffer(buffer, length) != EOF) { + crc = crc32(crc, buffer, length); + } + if (crc != original_crc) error(); +*/ + +/* +ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2)); + + Combine two CRC-32 check values into one. For two sequences of bytes, + seq1 and seq2 with lengths len1 and len2, CRC-32 check values were + calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32 + check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and + len2. +*/ + + + /* various hacks, don't look :) */ + +/* deflateInit and inflateInit are macros to allow checking the zlib version + * and the compiler's view of z_stream: + */ +ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method, + int windowBits, int memLevel, + int strategy, const char *version, + int stream_size)); +ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits, + const char *version, int stream_size)); +ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits, + unsigned char FAR *window, + const char *version, + int stream_size)); +#define deflateInit(strm, level) \ + deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit(strm) \ + inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream)) +#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \ + deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\ + (strategy), ZLIB_VERSION, (int)sizeof(z_stream)) +#define inflateInit2(strm, windowBits) \ + inflateInit2_((strm), (windowBits), ZLIB_VERSION, \ + (int)sizeof(z_stream)) +#define inflateBackInit(strm, windowBits, window) \ + inflateBackInit_((strm), (windowBits), (window), \ + ZLIB_VERSION, (int)sizeof(z_stream)) + +#ifndef Z_SOLO + +/* gzgetc() macro and its supporting function and exposed data structure. Note + * that the real internal state is much larger than the exposed structure. + * This abbreviated structure exposes just enough for the gzgetc() macro. The + * user should not mess with these exposed elements, since their names or + * behavior could change in the future, perhaps even capriciously. They can + * only be used by the gzgetc() macro. You have been warned. + */ +struct gzFile_s { + unsigned have; + unsigned char *next; + z_off64_t pos; +}; +ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */ +#ifdef Z_PREFIX_SET +# undef z_gzgetc +# define z_gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#else +# define gzgetc(g) \ + ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : gzgetc(g)) +#endif + +/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or + * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if + * both are true, the application gets the *64 functions, and the regular + * functions are changed to 64 bits) -- in case these are set on systems + * without large file support, _LFS64_LARGEFILE must also be true + */ +#ifdef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int)); + ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t)); +#endif + +#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64) +# ifdef Z_PREFIX_SET +# define z_gzopen z_gzopen64 +# define z_gzseek z_gzseek64 +# define z_gztell z_gztell64 +# define z_gzoffset z_gzoffset64 +# define z_adler32_combine z_adler32_combine64 +# define z_crc32_combine z_crc32_combine64 +# else +# define gzopen gzopen64 +# define gzseek gzseek64 +# define gztell gztell64 +# define gzoffset gzoffset64 +# define adler32_combine adler32_combine64 +# define crc32_combine crc32_combine64 +# endif +# ifndef Z_LARGE64 + ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t)); +# endif +#else + ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *)); + ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int)); + ZEXTERN z_off_t ZEXPORT gztell OF((gzFile)); + ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile)); + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); +#endif + +#else /* Z_SOLO */ + + ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t)); + ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t)); + +#endif /* !Z_SOLO */ + +/* hack for buggy compilers */ +#if !defined(ZUTIL_H) && !defined(NO_DUMMY_DECL) + struct internal_state {int dummy;}; +#endif + +/* undocumented functions */ +ZEXTERN const char * ZEXPORT zError OF((int)); +ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp)); +ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void)); +ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int)); +ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp)); +ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp)); +#if defined(_WIN32) && !defined(Z_SOLO) +ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path, + const char *mode)); +#endif +#if defined(STDC) || defined(Z_HAVE_STDARG_H) +# ifndef Z_SOLO +ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file, + const char *format, + va_list va)); +# endif +#endif + +#ifdef __cplusplus +} +#endif + +#endif /* ZLIB_H */ diff --git a/privatemodules/nc4/lib/libhdf5.a b/privatemodules/nc4/lib/libhdf5.a new file mode 100644 index 0000000000000000000000000000000000000000..b2a59016fa92fa3d6f0e43c17f26f3c51fda6bec Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5.a differ diff --git a/privatemodules/nc4/lib/libhdf5.la b/privatemodules/nc4/lib/libhdf5.la new file mode 100755 index 0000000000000000000000000000000000000000..030a7508f01412440eb0bd77cf26750e02901545 --- /dev/null +++ b/privatemodules/nc4/lib/libhdf5.la @@ -0,0 +1,41 @@ +# libhdf5.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.2 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libhdf5.so.8' + +# Names of this library. +library_names='libhdf5.so.8.0.2 libhdf5.so.8 libhdf5.so' + +# The name of the static archive. +old_library='libhdf5.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -L/home/erikvs/privatemodules/nc4/lib -lz -ldl -lm' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libhdf5. +current=8 +age=0 +revision=2 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/home/erikvs/privatemodules/nc4/lib' diff --git a/privatemodules/nc4/lib/libhdf5.settings b/privatemodules/nc4/lib/libhdf5.settings new file mode 100644 index 0000000000000000000000000000000000000000..5b1e958abe3aac71137fb9d6adcca19c9a051945 --- /dev/null +++ b/privatemodules/nc4/lib/libhdf5.settings @@ -0,0 +1,61 @@ + SUMMARY OF THE HDF5 CONFIGURATION + ================================= + +General Information: +------------------- + HDF5 Version: 1.8.13 + Configured on: Tue Nov 28 10:29:11 CET 2017 + Configured by: erikvs@int2.bullx + Configure mode: production + Host system: x86_64-unknown-linux-gnu + Uname information: Linux int2.bullx 3.10.0-693.5.2.el7.x86_64 #1 SMP Fri Oct 13 10:46:25 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux + Byte sex: little-endian + Libraries: static, shared + Installation point: /home/erikvs/privatemodules/nc4 + +Compiling Options: +------------------ + Compilation Mode: production + C Compiler: /hpc/sw/modules/wrappers/surfsara/gcc ( gcc (GCC) 5.2.0) + CFLAGS: -fPIC + H5_CFLAGS: -ansi -pedantic -Wall -W -Wundef -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-qual -Wcast-align -Wwrite-strings -Wconversion -Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wredundant-decls -Wnested-externs -Winline -O -fomit-frame-pointer -finline-functions + AM_CFLAGS: + CPPFLAGS: + H5_CPPFLAGS: -D_POSIX_C_SOURCE=199506L -DNDEBUG -UH5_DEBUG_API + AM_CPPFLAGS: -I/home/erikvs/privatemodules/nc4/include -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_BSD_SOURCE + Shared C Library: yes + Static C Library: yes + Statically Linked Executables: no + LDFLAGS: + H5_LDFLAGS: + AM_LDFLAGS: -L/home/erikvs/privatemodules/nc4/lib + Extra libraries: -lz -ldl -lm + Archiver: ar + Ranlib: ranlib + Debugged Packages: + API Tracing: no + +Languages: +---------- + Fortran: no + + C++: no + +Features: +--------- + Parallel HDF5: no + High Level library: yes + Threadsafety: no + Default API Mapping: v18 + With Deprecated Public Symbols: yes + I/O filters (external): deflate(zlib) + I/O filters (internal): shuffle,fletcher32,nbit,scaleoffset + MPE: no + Direct VFD: no + dmalloc: no +Clear file buffers before write: yes + Using memory checker: no + Function Stack Tracing: no + Strict File Format Checks: no + Optimization Instrumentation: no + Large File Support (LFS): yes diff --git a/privatemodules/nc4/lib/libhdf5.so b/privatemodules/nc4/lib/libhdf5.so new file mode 100755 index 0000000000000000000000000000000000000000..b4dc94dc11882000e633d833631b7ab063367635 Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5.so differ diff --git a/privatemodules/nc4/lib/libhdf5.so.8 b/privatemodules/nc4/lib/libhdf5.so.8 new file mode 100755 index 0000000000000000000000000000000000000000..b4dc94dc11882000e633d833631b7ab063367635 Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5.so.8 differ diff --git a/privatemodules/nc4/lib/libhdf5.so.8.0.2 b/privatemodules/nc4/lib/libhdf5.so.8.0.2 new file mode 100755 index 0000000000000000000000000000000000000000..b4dc94dc11882000e633d833631b7ab063367635 Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5.so.8.0.2 differ diff --git a/privatemodules/nc4/lib/libhdf5_hl.a b/privatemodules/nc4/lib/libhdf5_hl.a new file mode 100644 index 0000000000000000000000000000000000000000..c567ee6342d76cf0ff845a9e92f78a31e7e4a974 Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5_hl.a differ diff --git a/privatemodules/nc4/lib/libhdf5_hl.la b/privatemodules/nc4/lib/libhdf5_hl.la new file mode 100755 index 0000000000000000000000000000000000000000..60583e3969b5dd48b72f1d8e143ac5429ba2275d --- /dev/null +++ b/privatemodules/nc4/lib/libhdf5_hl.la @@ -0,0 +1,41 @@ +# libhdf5_hl.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.2 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libhdf5_hl.so.8' + +# Names of this library. +library_names='libhdf5_hl.so.8.0.2 libhdf5_hl.so.8 libhdf5_hl.so' + +# The name of the static archive. +old_library='libhdf5_hl.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -L/home/erikvs/privatemodules/nc4/lib /home/erikvs/privatemodules/nc4/lib/libhdf5.la -lz -ldl -lm' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libhdf5_hl. +current=8 +age=0 +revision=2 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/home/erikvs/privatemodules/nc4/lib' diff --git a/privatemodules/nc4/lib/libhdf5_hl.so b/privatemodules/nc4/lib/libhdf5_hl.so new file mode 100755 index 0000000000000000000000000000000000000000..f31080c5ef6f477d349a77b1121c9a1e59b7d2da Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5_hl.so differ diff --git a/privatemodules/nc4/lib/libhdf5_hl.so.8 b/privatemodules/nc4/lib/libhdf5_hl.so.8 new file mode 100755 index 0000000000000000000000000000000000000000..f31080c5ef6f477d349a77b1121c9a1e59b7d2da Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5_hl.so.8 differ diff --git a/privatemodules/nc4/lib/libhdf5_hl.so.8.0.2 b/privatemodules/nc4/lib/libhdf5_hl.so.8.0.2 new file mode 100755 index 0000000000000000000000000000000000000000..f31080c5ef6f477d349a77b1121c9a1e59b7d2da Binary files /dev/null and b/privatemodules/nc4/lib/libhdf5_hl.so.8.0.2 differ diff --git a/privatemodules/nc4/lib/libnetcdf.a b/privatemodules/nc4/lib/libnetcdf.a new file mode 100644 index 0000000000000000000000000000000000000000..b28c6a85e1e659d33282083baef131fcccd0e0f1 Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdf.a differ diff --git a/privatemodules/nc4/lib/libnetcdf.la b/privatemodules/nc4/lib/libnetcdf.la new file mode 100755 index 0000000000000000000000000000000000000000..639041eef98404d6f59b9acfa65d592abbb0cc6a --- /dev/null +++ b/privatemodules/nc4/lib/libnetcdf.la @@ -0,0 +1,41 @@ +# libnetcdf.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.6 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libnetcdf.so.11' + +# Names of this library. +library_names='libnetcdf.so.11.0.4 libnetcdf.so.11 libnetcdf.so' + +# The name of the static archive. +old_library='libnetcdf.a' + +# Linker flags that cannot go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -L/home/erikvs/privatemodules/nc4/lib /home/erikvs/privatemodules/nc4/lib/libhdf5_hl.la /home/erikvs/privatemodules/nc4/lib/libhdf5.la -ldl -lm -lz -lcurl' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libnetcdf. +current=11 +age=0 +revision=4 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/home/erikvs/privatemodules/nc4/lib' diff --git a/privatemodules/nc4/lib/libnetcdf.settings b/privatemodules/nc4/lib/libnetcdf.settings new file mode 100644 index 0000000000000000000000000000000000000000..7503b3b967a5ed637900d30ca1d4ea9f648513e1 --- /dev/null +++ b/privatemodules/nc4/lib/libnetcdf.settings @@ -0,0 +1,35 @@ +# NetCDF C Configuration Summary +============================== + +# General +------- +NetCDF Version: 4.4.1.1 +Configured On: Tue Nov 28 10:53:10 CET 2017 +Host System: x86_64-unknown-linux-gnu +Build Directory: /scratch/shared/erikvs/test/netcdf-4.4.1.1 +Install Prefix: /home/erikvs/privatemodules/nc4 + +# Compiling Options +----------------- +C Compiler: /hpc/sw/modules/wrappers/surfsara/gcc +CFLAGS: -fPIC +CPPFLAGS: -I/home/erikvs/privatemodules/nc4/include +LDFLAGS: -L/home/erikvs/privatemodules/nc4/lib +AM_CFLAGS: +AM_CPPFLAGS: +AM_LDFLAGS: +Shared Library: yes +Static Library: yes +Extra libraries: -lhdf5_hl -lhdf5 -ldl -lm -lz -lcurl + +# Features +-------- +NetCDF-2 API: yes +HDF4 Support: no +NetCDF-4 API: yes +NC-4 Parallel Support: no +PNetCDF Support: no +DAP Support: yes +Diskless Support: yes +MMap Support: no +JNA Support: no diff --git a/privatemodules/nc4/lib/libnetcdf.so b/privatemodules/nc4/lib/libnetcdf.so new file mode 100755 index 0000000000000000000000000000000000000000..0ab6f2969394e155fe21017359674dc39b9f0eb9 Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdf.so differ diff --git a/privatemodules/nc4/lib/libnetcdf.so.11 b/privatemodules/nc4/lib/libnetcdf.so.11 new file mode 100755 index 0000000000000000000000000000000000000000..0ab6f2969394e155fe21017359674dc39b9f0eb9 Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdf.so.11 differ diff --git a/privatemodules/nc4/lib/libnetcdf.so.11.0.4 b/privatemodules/nc4/lib/libnetcdf.so.11.0.4 new file mode 100755 index 0000000000000000000000000000000000000000..0ab6f2969394e155fe21017359674dc39b9f0eb9 Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdf.so.11.0.4 differ diff --git a/privatemodules/nc4/lib/libnetcdff.a b/privatemodules/nc4/lib/libnetcdff.a new file mode 100644 index 0000000000000000000000000000000000000000..cd29dde5ed4ff614f094abaa9066a4c12d3ade5b Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdff.a differ diff --git a/privatemodules/nc4/lib/libnetcdff.la b/privatemodules/nc4/lib/libnetcdff.la new file mode 100755 index 0000000000000000000000000000000000000000..096071bddb69845b09919ce9ec8409874dca06b7 --- /dev/null +++ b/privatemodules/nc4/lib/libnetcdff.la @@ -0,0 +1,41 @@ +# libnetcdff.la - a libtool library file +# Generated by libtool (GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1 +# +# Please DO NOT delete this file! +# It is necessary for linking the library. + +# The name that we can dlopen(3). +dlname='libnetcdff.so.6' + +# Names of this library. +library_names='libnetcdff.so.6.1.1 libnetcdff.so.6 libnetcdff.so' + +# The name of the static archive. +old_library='libnetcdff.a' + +# Linker flags that can not go in dependency_libs. +inherited_linker_flags='' + +# Libraries that this one depends upon. +dependency_libs=' -L/home/erikvs/privatemodules/nc4/lib /home/erikvs/privatemodules/nc4/lib/libnetcdf.la /home/erikvs/privatemodules/nc4/lib/libhdf5_hl.la /home/erikvs/privatemodules/nc4/lib/libhdf5.la -ldl -lm -lz -lcurl' + +# Names of additional weak libraries provided by this library +weak_library_names='' + +# Version information for libnetcdff. +current=7 +age=1 +revision=1 + +# Is this an already installed library? +installed=yes + +# Should we warn about portability when linking against -modules? +shouldnotlink=no + +# Files to dlopen/dlpreopen +dlopen='' +dlpreopen='' + +# Directory that this library needs to be installed in: +libdir='/home/erikvs/privatemodules/nc4/lib' diff --git a/privatemodules/nc4/lib/libnetcdff.so b/privatemodules/nc4/lib/libnetcdff.so new file mode 100755 index 0000000000000000000000000000000000000000..4e08944827411d51aff0d3c3388012732216b35c Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdff.so differ diff --git a/privatemodules/nc4/lib/libnetcdff.so.6 b/privatemodules/nc4/lib/libnetcdff.so.6 new file mode 100755 index 0000000000000000000000000000000000000000..4e08944827411d51aff0d3c3388012732216b35c Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdff.so.6 differ diff --git a/privatemodules/nc4/lib/libnetcdff.so.6.1.1 b/privatemodules/nc4/lib/libnetcdff.so.6.1.1 new file mode 100755 index 0000000000000000000000000000000000000000..4e08944827411d51aff0d3c3388012732216b35c Binary files /dev/null and b/privatemodules/nc4/lib/libnetcdff.so.6.1.1 differ diff --git a/privatemodules/nc4/lib/libz.a b/privatemodules/nc4/lib/libz.a new file mode 100644 index 0000000000000000000000000000000000000000..09273da40c12aac1942ae6331db29f66b4d919c5 Binary files /dev/null and b/privatemodules/nc4/lib/libz.a differ diff --git a/privatemodules/nc4/lib/libz.so b/privatemodules/nc4/lib/libz.so new file mode 100755 index 0000000000000000000000000000000000000000..009096bec3b2144e243e00946e752f5f5258c3c8 Binary files /dev/null and b/privatemodules/nc4/lib/libz.so differ diff --git a/privatemodules/nc4/lib/libz.so.1 b/privatemodules/nc4/lib/libz.so.1 new file mode 100755 index 0000000000000000000000000000000000000000..009096bec3b2144e243e00946e752f5f5258c3c8 Binary files /dev/null and b/privatemodules/nc4/lib/libz.so.1 differ diff --git a/privatemodules/nc4/lib/libz.so.1.2.8 b/privatemodules/nc4/lib/libz.so.1.2.8 new file mode 100755 index 0000000000000000000000000000000000000000..009096bec3b2144e243e00946e752f5f5258c3c8 Binary files /dev/null and b/privatemodules/nc4/lib/libz.so.1.2.8 differ diff --git a/privatemodules/nc4/lib/pkgconfig/netcdf-fortran.pc b/privatemodules/nc4/lib/pkgconfig/netcdf-fortran.pc new file mode 100644 index 0000000000000000000000000000000000000000..40fb3531d5d17bd426d3326a9636ba894637a9f1 --- /dev/null +++ b/privatemodules/nc4/lib/pkgconfig/netcdf-fortran.pc @@ -0,0 +1,15 @@ +prefix=/home/erikvs/privatemodules/nc4 +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include +ccompiler=gcc +fcompiler=gfortran + +Name: netcdf-fortran +Description: NetCDF Client Library for Fortran +URL: http://www.unidata.ucar.edu/netcdf +Version: 4.4.4 +Requires.private: netcdf > 4.1.1 +Libs: -L${libdir} -lnetcdff +Libs.private: -L${libdir} -lnetcdff -lnetcdf +Cflags: -I${includedir} diff --git a/privatemodules/nc4/lib/pkgconfig/netcdf.pc b/privatemodules/nc4/lib/pkgconfig/netcdf.pc new file mode 100644 index 0000000000000000000000000000000000000000..fb053c79c12da400bba8328dcd3b1af30416aa0d --- /dev/null +++ b/privatemodules/nc4/lib/pkgconfig/netcdf.pc @@ -0,0 +1,13 @@ +prefix=/home/erikvs/privatemodules/nc4 +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +includedir=${prefix}/include +ccompiler=gcc + +Name: netcdf +Description: NetCDF Client Library for C +URL: http://www.unidata.ucar.edu/netcdf +Version: 4.4.1.1 +Libs: -L${libdir} -lnetcdf +Cflags: -I${includedir} + diff --git a/privatemodules/nc4/lib/pkgconfig/zlib.pc b/privatemodules/nc4/lib/pkgconfig/zlib.pc new file mode 100644 index 0000000000000000000000000000000000000000..a039af2f6bff0a13117510ed6b712ef79ba9910e --- /dev/null +++ b/privatemodules/nc4/lib/pkgconfig/zlib.pc @@ -0,0 +1,13 @@ +prefix=/home/erikvs/privatemodules/nc4 +exec_prefix=${prefix} +libdir=${exec_prefix}/lib +sharedlibdir=${libdir} +includedir=${prefix}/include + +Name: zlib +Description: zlib compression library +Version: 1.2.8 + +Requires: +Libs: -L${libdir} -L${sharedlibdir} -lz +Cflags: -I${includedir} diff --git a/privatemodules/nc4/share/hdf5_examples/README b/privatemodules/nc4/share/hdf5_examples/README new file mode 100644 index 0000000000000000000000000000000000000000..0550b15619829df628a3410449cf51f12d85af05 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/README @@ -0,0 +1,17 @@ + HDF5 Examples + +This directory contains example programs for the installed APIs and scripts to +compile and run them. Examples in the c and hl/c subdirectories are always +installed, and those in fortan, hl/fortran, c++ and hl/c++ will be installed +when fortran or c++ are enabled. + +Running the run-all-ex.sh script in this directory will run the scripts and in +turn the examples in all the subdirectories where examples are installed. The +scripts can also be run individually. The appropriate compile scripts in the +bin directory for this install will be used by default to compile and link the +example programs. Note that h5redeploy must be run if these binaries are +copied or extracted in a directory other than the one where they were initially +installed. Compile scripts from other locations can be used by setting an +environment variable prefix to the path of the directory containing the bin +directory with the compile scripts h5cc, h5fc, etc. For example, export +prefix=/usr/local/hdf5 to use h5cc, h5fc, etc. in /usr/local/hdf5/bin. diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_attribute.c b/privatemodules/nc4/share/hdf5_examples/c/h5_attribute.c new file mode 100644 index 0000000000000000000000000000000000000000..0ea015322d762ca47d3eb5d4e2cb9179b8890d4e --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_attribute.c @@ -0,0 +1,295 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This program illustrates the usage of the H5A Interface functions. + * It creates and writes a dataset, and then creates and writes array, + * scalar, and string attributes of the dataset. + * Program reopens the file, attaches to the scalar attribute using + * attribute name and reads and displays its value. Then index of the + * third attribute is used to read and display attribute values. + * The H5Aiterate function is used to iterate through the dataset attributes, + * and display their names. The function is also reads and displays the values + * of the array attribute. + */ + +#include <stdlib.h> + +#include "hdf5.h" + +#define H5FILE_NAME "Attributes.h5" + +#define RANK 1 /* Rank and size of the dataset */ +#define SIZE 7 + +#define ARANK 2 /* Rank and dimension sizes of the first dataset attribute */ +#define ADIM1 2 +#define ADIM2 3 +#define ANAME "Float attribute" /* Name of the array attribute */ +#define ANAMES "Character attribute" /* Name of the string attribute */ + +static herr_t attr_info(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *opdata); + /* Operator function */ + +int +main (void) +{ + + hid_t file, dataset; /* File and dataset identifiers */ + + hid_t fid; /* Dataspace identifier */ + hid_t attr1, attr2, attr3; /* Attribute identifiers */ + hid_t attr; + hid_t aid1, aid2, aid3; /* Attribute dataspace identifiers */ + hid_t atype, atype_mem; /* Attribute type */ + H5T_class_t type_class; + + hsize_t fdim[] = {SIZE}; + hsize_t adim[] = {ADIM1, ADIM2}; /* Dimensions of the first attribute */ + + float matrix[ADIM1][ADIM2]; /* Attribute data */ + + herr_t ret; /* Return value */ + H5O_info_t oinfo; /* Object info */ + unsigned i, j; /* Counters */ + char string_out[80]; /* Buffer to read string attribute back */ + int point_out; /* Buffer to read scalar attribute back */ + + /* + * Data initialization. + */ + int vector[] = {1, 2, 3, 4, 5, 6, 7}; /* Dataset data */ + int point = 1; /* Value of the scalar attribute */ + char string[] = "ABCD"; /* Value of the string attribute */ + + + for (i=0; i < ADIM1; i++) { /* Values of the array attribute */ + for (j=0; j < ADIM2; j++) + matrix[i][j] = -1.; + } + + /* + * Create a file. + */ + file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create the dataspace for the dataset in the file. + */ + fid = H5Screate(H5S_SIMPLE); + ret = H5Sset_extent_simple(fid, RANK, fdim, NULL); + + /* + * Create the dataset in the file. + */ + dataset = H5Dcreate2(file, "Dataset", H5T_NATIVE_INT, fid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Write data to the dataset. + */ + ret = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL , H5S_ALL, H5P_DEFAULT, vector); + + /* + * Create dataspace for the first attribute. + */ + aid1 = H5Screate(H5S_SIMPLE); + ret = H5Sset_extent_simple(aid1, ARANK, adim, NULL); + + /* + * Create array attribute. + */ + attr1 = H5Acreate2(dataset, ANAME, H5T_NATIVE_FLOAT, aid1, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Write array attribute. + */ + ret = H5Awrite(attr1, H5T_NATIVE_FLOAT, matrix); + + /* + * Create scalar attribute. + */ + aid2 = H5Screate(H5S_SCALAR); + attr2 = H5Acreate2(dataset, "Integer attribute", H5T_NATIVE_INT, aid2, + H5P_DEFAULT, H5P_DEFAULT); + + /* + * Write scalar attribute. + */ + ret = H5Awrite(attr2, H5T_NATIVE_INT, &point); + + /* + * Create string attribute. + */ + aid3 = H5Screate(H5S_SCALAR); + atype = H5Tcopy(H5T_C_S1); + H5Tset_size(atype, 5); + H5Tset_strpad(atype,H5T_STR_NULLTERM); + attr3 = H5Acreate2(dataset, ANAMES, atype, aid3, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Write string attribute. + */ + ret = H5Awrite(attr3, atype, string); + + /* + * Close attribute and file dataspaces, and datatype. + */ + ret = H5Sclose(aid1); + ret = H5Sclose(aid2); + ret = H5Sclose(aid3); + ret = H5Sclose(fid); + ret = H5Tclose(atype); + + /* + * Close the attributes. + */ + ret = H5Aclose(attr1); + ret = H5Aclose(attr2); + ret = H5Aclose(attr3); + + /* + * Close the dataset. + */ + ret = H5Dclose(dataset); + + /* + * Close the file. + */ + ret = H5Fclose(file); + + /* + * Reopen the file. + */ + file = H5Fopen(H5FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT); + + /* + * Open the dataset. + */ + dataset = H5Dopen2(file, "Dataset", H5P_DEFAULT); + + /* + * Attach to the scalar attribute using attribute name, then read and + * display its value. + */ + attr = H5Aopen(dataset, "Integer attribute", H5P_DEFAULT); + ret = H5Aread(attr, H5T_NATIVE_INT, &point_out); + printf("The value of the attribute \"Integer attribute\" is %d \n", point_out); + ret = H5Aclose(attr); + + /* + * Find string attribute by iterating through all attributes + */ + ret = H5Oget_info(dataset, &oinfo); + for(i = 0; i < (unsigned)oinfo.num_attrs; i++) { + attr = H5Aopen_by_idx(dataset, ".", H5_INDEX_CRT_ORDER, H5_ITER_INC, (hsize_t)i, H5P_DEFAULT, H5P_DEFAULT); + atype = H5Aget_type(attr); + type_class = H5Tget_class(atype); + if (type_class == H5T_STRING) { + atype_mem = H5Tget_native_type(atype, H5T_DIR_ASCEND); + ret = H5Aread(attr, atype_mem, string_out); + printf("Found string attribute; its index is %d , value = %s \n", i, string_out); + ret = H5Tclose(atype_mem); + } + ret = H5Aclose(attr); + ret = H5Tclose(atype); + } + + /* + * Get attribute info using iteration function. + */ + ret = H5Aiterate2(dataset, H5_INDEX_NAME, H5_ITER_INC, NULL, attr_info, NULL); + + /* + * Close the dataset and the file. + */ + H5Dclose(dataset); + H5Fclose(file); + + return 0; +} + +/* + * Operator function. + */ +static herr_t +attr_info(hid_t loc_id, const char *name, const H5A_info_t *ainfo, void *opdata) +{ + hid_t attr, atype, aspace; /* Attribute, datatype and dataspace identifiers */ + int rank; + hsize_t sdim[64]; + herr_t ret; + int i; + size_t npoints; /* Number of elements in the array attribute. */ + float *float_array; /* Pointer to the array attribute. */ + + /* avoid warnings */ + opdata = opdata; + + /* + * Open the attribute using its name. + */ + attr = H5Aopen(loc_id, name, H5P_DEFAULT); + + /* + * Display attribute name. + */ + printf("\nName : %s\n", name); + + /* + * Get attribute datatype, dataspace, rank, and dimensions. + */ + atype = H5Aget_type(attr); + aspace = H5Aget_space(attr); + rank = H5Sget_simple_extent_ndims(aspace); + ret = H5Sget_simple_extent_dims(aspace, sdim, NULL); + + /* + * Display rank and dimension sizes for the array attribute. + */ + + if(rank > 0) { + printf("Rank : %d \n", rank); + printf("Dimension sizes : "); + for (i=0; i< rank; i++) + printf("%d ", (int)sdim[i]); + printf("\n"); + } + + /* + * Read array attribute and display its type and values. + */ + + if (H5T_FLOAT == H5Tget_class(atype)) { + printf("Type : FLOAT \n"); + npoints = H5Sget_simple_extent_npoints(aspace); + float_array = (float *)malloc(sizeof(float)*(int)npoints); + ret = H5Aread(attr, atype, float_array); + printf("Values : "); + for( i = 0; i < (int)npoints; i++) + printf("%f ", float_array[i]); + printf("\n"); + free(float_array); + } + + /* + * Release all identifiers. + */ + H5Tclose(atype); + H5Sclose(aspace); + H5Aclose(attr); + + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_chunk_read.c b/privatemodules/nc4/share/hdf5_examples/c/h5_chunk_read.c new file mode 100644 index 0000000000000000000000000000000000000000..98b0bb495d21473a4e0a7c1f2f09eeee92032aea --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_chunk_read.c @@ -0,0 +1,214 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example shows how to read data from a chunked dataset. + * We will read from the file created by h5_extend_write.c + */ + +#include "hdf5.h" + +#define H5FILE_NAME "SDSextendible.h5" +#define DATASETNAME "ExtendibleArray" +#define RANK 2 +#define RANKC 1 +#define NX 10 +#define NY 5 + +int +main (void) +{ + hid_t file; /* handles */ + hid_t dataset; + hid_t filespace; + hid_t memspace; + hid_t cparms; + hsize_t dims[2]; /* dataset and chunk dimensions*/ + hsize_t chunk_dims[2]; + hsize_t col_dims[1]; + hsize_t count[2]; + hsize_t offset[2]; + + herr_t status, status_n; + + int data_out[NX][NY]; /* buffer for dataset to be read */ + int chunk_out[2][5]; /* buffer for chunk to be read */ + int column[10]; /* buffer for column to be read */ + int rank, rank_chunk; + int i, j; + + + + /* + * Open the file and the dataset. + */ + file = H5Fopen(H5FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT); + dataset = H5Dopen2(file, DATASETNAME, H5P_DEFAULT); + + /* + * Get dataset rank and dimension. + */ + + filespace = H5Dget_space(dataset); /* Get filespace handle first. */ + rank = H5Sget_simple_extent_ndims(filespace); + status_n = H5Sget_simple_extent_dims(filespace, dims, NULL); + printf("dataset rank %d, dimensions %lu x %lu\n", + rank, (unsigned long)(dims[0]), (unsigned long)(dims[1])); + + /* + * Define the memory space to read dataset. + */ + memspace = H5Screate_simple(RANK,dims,NULL); + + /* + * Read dataset back and display. + */ + status = H5Dread(dataset, H5T_NATIVE_INT, memspace, filespace, + H5P_DEFAULT, data_out); + printf("\n"); + printf("Dataset: \n"); + for (j = 0; j < dims[0]; j++) { + for (i = 0; i < dims[1]; i++) printf("%d ", data_out[j][i]); + printf("\n"); + } + + /* + * Close/release resources. + */ + H5Sclose(memspace); + + /* + * dataset rank 2, dimensions 10 x 5 + * chunk rank 2, dimensions 2 x 5 + + * Dataset: + * 1 1 1 3 3 + * 1 1 1 3 3 + * 1 1 1 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + */ + + /* + * Read the third column from the dataset. + * First define memory dataspace, then define hyperslab + * and read it into column array. + */ + col_dims[0] = 10; + memspace = H5Screate_simple(RANKC, col_dims, NULL); + + /* + * Define the column (hyperslab) to read. + */ + offset[0] = 0; + offset[1] = 2; + count[0] = 10; + count[1] = 1; + status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, + count, NULL); + status = H5Dread(dataset, H5T_NATIVE_INT, memspace, filespace, + H5P_DEFAULT, column); + printf("\n"); + printf("Third column: \n"); + for (i = 0; i < 10; i++) { + printf("%d \n", column[i]); + } + + /* + * Close/release resources. + */ + H5Sclose(memspace); + + /* + * Third column: + * 1 + * 1 + * 1 + * 0 + * 0 + * 0 + * 0 + * 0 + * 0 + * 0 + */ + + /* + * Get creation properties list. + */ + cparms = H5Dget_create_plist(dataset); /* Get properties handle first. */ + + if (H5D_CHUNKED == H5Pget_layout(cparms)) { + + /* + * Get chunking information: rank and dimensions + */ + rank_chunk = H5Pget_chunk(cparms, 2, chunk_dims); + printf("chunk rank %d, dimensions %lu x %lu\n", rank_chunk, + (unsigned long)(chunk_dims[0]), (unsigned long)(chunk_dims[1])); + + /* + * Define the memory space to read a chunk. + */ + memspace = H5Screate_simple(rank_chunk,chunk_dims,NULL); + + /* + * Define chunk in the file (hyperslab) to read. + */ + offset[0] = 2; + offset[1] = 0; + count[0] = chunk_dims[0]; + count[1] = chunk_dims[1]; + status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, + count, NULL); + + /* + * Read chunk back and display. + */ + status = H5Dread(dataset, H5T_NATIVE_INT, memspace, filespace, + H5P_DEFAULT, chunk_out); + printf("\n"); + printf("Chunk: \n"); + for (j = 0; j < chunk_dims[0]; j++) { + for (i = 0; i < chunk_dims[1]; i++) printf("%d ", chunk_out[j][i]); + printf("\n"); + } + /* + * Chunk: + * 1 1 1 0 0 + * 2 0 0 0 0 + */ + + /* + * Close/release resources. + */ + H5Sclose(memspace); + } + + /* + * Close/release resources. + */ + H5Pclose(cparms); + H5Dclose(dataset); + H5Sclose(filespace); + H5Fclose(file); + + return 0; +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_cmprss.c b/privatemodules/nc4/share/hdf5_examples/c/h5_cmprss.c new file mode 100644 index 0000000000000000000000000000000000000000..4a2f9828081a66fb7405cc8fd4f953f31c7009e3 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_cmprss.c @@ -0,0 +1,125 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates how to create a compressed dataset. + * It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" + +#define FILE "cmprss.h5" +#define RANK 2 +#define DIM0 100 +#define DIM1 20 + +int main () { + + hid_t file_id, dataset_id, dataspace_id; /* identifiers */ + hid_t plist_id; + + size_t nelmts; + unsigned flags, filter_info; + H5Z_filter_t filter_type; + + herr_t status; + hsize_t dims[2]; + hsize_t cdims[2]; + + int idx; + int i,j, numfilt; + int buf[DIM0][DIM1]; + int rbuf [DIM0][DIM1]; + + /* Uncomment these variables to use SZIP compression + unsigned szip_options_mask; + unsigned szip_pixels_per_block; + */ + + /* Create a file. */ + file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + + /* Create dataset "Compressed Data" in the group using absolute name. */ + dims[0] = DIM0; + dims[1] = DIM1; + dataspace_id = H5Screate_simple (RANK, dims, NULL); + + plist_id = H5Pcreate (H5P_DATASET_CREATE); + + /* Dataset must be chunked for compression */ + cdims[0] = 20; + cdims[1] = 20; + status = H5Pset_chunk (plist_id, 2, cdims); + + /* Set ZLIB / DEFLATE Compression using compression level 6. + * To use SZIP Compression comment out these lines. + */ + status = H5Pset_deflate (plist_id, 6); + + /* Uncomment these lines to set SZIP Compression + szip_options_mask = H5_SZIP_NN_OPTION_MASK; + szip_pixels_per_block = 16; + status = H5Pset_szip (plist_id, szip_options_mask, szip_pixels_per_block); + */ + + dataset_id = H5Dcreate2 (file_id, "Compressed_Data", H5T_STD_I32BE, + dataspace_id, H5P_DEFAULT, plist_id, H5P_DEFAULT); + + for (i = 0; i< DIM0; i++) + for (j=0; j<DIM1; j++) + buf[i][j] = i+j; + + status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, buf); + + status = H5Sclose (dataspace_id); + status = H5Dclose (dataset_id); + status = H5Pclose (plist_id); + status = H5Fclose (file_id); + + /* Now reopen the file and dataset in the file. */ + file_id = H5Fopen (FILE, H5F_ACC_RDWR, H5P_DEFAULT); + dataset_id = H5Dopen2 (file_id, "Compressed_Data", H5P_DEFAULT); + + /* Retrieve filter information. */ + plist_id = H5Dget_create_plist (dataset_id); + + numfilt = H5Pget_nfilters (plist_id); + printf ("Number of filters associated with dataset: %i\n", numfilt); + + for (i=0; i<numfilt; i++) { + nelmts = 0; + filter_type = H5Pget_filter2 (plist_id, 0, &flags, &nelmts, NULL, 0, NULL, + &filter_info); + printf ("Filter Type: "); + switch (filter_type) { + case H5Z_FILTER_DEFLATE: + printf ("H5Z_FILTER_DEFLATE\n"); + break; + case H5Z_FILTER_SZIP: + printf ("H5Z_FILTER_SZIP\n"); + break; + default: + printf ("Other filter type included.\n"); + } + } + + status = H5Dread (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, rbuf); + + status = H5Dclose (dataset_id); + status = H5Pclose (plist_id); + status = H5Fclose (file_id); +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_compound.c b/privatemodules/nc4/share/hdf5_examples/c/h5_compound.c new file mode 100644 index 0000000000000000000000000000000000000000..3fca2a5acdf92553beaaad6b5224961fcc346498 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_compound.c @@ -0,0 +1,168 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example shows how to create a compound data type, + * write an array which has the compound data type to the file, + * and read back fields' subsets. + */ + +#include "hdf5.h" + +#define H5FILE_NAME "SDScompound.h5" +#define DATASETNAME "ArrayOfStructures" +#define LENGTH 10 +#define RANK 1 + +int +main(void) +{ + + /* First structure and dataset*/ + typedef struct s1_t { + int a; + float b; + double c; + } s1_t; + s1_t s1[LENGTH]; + hid_t s1_tid; /* File datatype identifier */ + + /* Second structure (subset of s1_t) and dataset*/ + typedef struct s2_t { + double c; + int a; + } s2_t; + s2_t s2[LENGTH]; + hid_t s2_tid; /* Memory datatype handle */ + + /* Third "structure" ( will be used to read float field of s1) */ + hid_t s3_tid; /* Memory datatype handle */ + float s3[LENGTH]; + + int i; + hid_t file, dataset, space; /* Handles */ + herr_t status; + hsize_t dim[] = {LENGTH}; /* Dataspace dimensions */ + + + /* + * Initialize the data + */ + for (i = 0; i< LENGTH; i++) { + s1[i].a = i; + s1[i].b = i*i; + s1[i].c = 1./(i+1); + } + + /* + * Create the data space. + */ + space = H5Screate_simple(RANK, dim, NULL); + + /* + * Create the file. + */ + file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create the memory data type. + */ + s1_tid = H5Tcreate (H5T_COMPOUND, sizeof(s1_t)); + H5Tinsert(s1_tid, "a_name", HOFFSET(s1_t, a), H5T_NATIVE_INT); + H5Tinsert(s1_tid, "c_name", HOFFSET(s1_t, c), H5T_NATIVE_DOUBLE); + H5Tinsert(s1_tid, "b_name", HOFFSET(s1_t, b), H5T_NATIVE_FLOAT); + + /* + * Create the dataset. + */ + dataset = H5Dcreate2(file, DATASETNAME, s1_tid, space, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Wtite data to the dataset; + */ + status = H5Dwrite(dataset, s1_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s1); + + /* + * Release resources + */ + H5Tclose(s1_tid); + H5Sclose(space); + H5Dclose(dataset); + H5Fclose(file); + + /* + * Open the file and the dataset. + */ + file = H5Fopen(H5FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT); + + dataset = H5Dopen2(file, DATASETNAME, H5P_DEFAULT); + + /* + * Create a data type for s2 + */ + s2_tid = H5Tcreate(H5T_COMPOUND, sizeof(s2_t)); + + H5Tinsert(s2_tid, "c_name", HOFFSET(s2_t, c), H5T_NATIVE_DOUBLE); + H5Tinsert(s2_tid, "a_name", HOFFSET(s2_t, a), H5T_NATIVE_INT); + + /* + * Read two fields c and a from s1 dataset. Fields in the file + * are found by their names "c_name" and "a_name". + */ + status = H5Dread(dataset, s2_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s2); + + /* + * Display the fields + */ + printf("\n"); + printf("Field c : \n"); + for( i = 0; i < LENGTH; i++) printf("%.4f ", s2[i].c); + printf("\n"); + + printf("\n"); + printf("Field a : \n"); + for( i = 0; i < LENGTH; i++) printf("%d ", s2[i].a); + printf("\n"); + + /* + * Create a data type for s3. + */ + s3_tid = H5Tcreate(H5T_COMPOUND, sizeof(float)); + + status = H5Tinsert(s3_tid, "b_name", 0, H5T_NATIVE_FLOAT); + + /* + * Read field b from s1 dataset. Field in the file is found by its name. + */ + status = H5Dread(dataset, s3_tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, s3); + + /* + * Display the field + */ + printf("\n"); + printf("Field b : \n"); + for( i = 0; i < LENGTH; i++) printf("%.4f ", s3[i]); + printf("\n"); + + /* + * Release resources + */ + H5Tclose(s2_tid); + H5Tclose(s3_tid); + H5Dclose(dataset); + H5Fclose(file); + + return 0; +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_crtatt.c b/privatemodules/nc4/share/hdf5_examples/c/h5_crtatt.c new file mode 100644 index 0000000000000000000000000000000000000000..416839fc47b548af6ebfd38c26e1b5d42c8f3f0e --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_crtatt.c @@ -0,0 +1,63 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates how to create an attribute attached to a + * dataset. It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" +#define FILE "dset.h5" + +int main() { + + hid_t file_id, dataset_id, attribute_id, dataspace_id; /* identifiers */ + hsize_t dims; + int attr_data[2]; + herr_t status; + + /* Initialize the attribute data. */ + attr_data[0] = 100; + attr_data[1] = 200; + + /* Open an existing file. */ + file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + + /* Open an existing dataset. */ + dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT); + + /* Create the data space for the attribute. */ + dims = 2; + dataspace_id = H5Screate_simple(1, &dims, NULL); + + /* Create a dataset attribute. */ + attribute_id = H5Acreate2 (dataset_id, "Units", H5T_STD_I32BE, dataspace_id, + H5P_DEFAULT, H5P_DEFAULT); + + /* Write the attribute data. */ + status = H5Awrite(attribute_id, H5T_NATIVE_INT, attr_data); + + /* Close the attribute. */ + status = H5Aclose(attribute_id); + + /* Close the dataspace. */ + status = H5Sclose(dataspace_id); + + /* Close to the dataset. */ + status = H5Dclose(dataset_id); + + /* Close the file. */ + status = H5Fclose(file_id); +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_crtdat.c b/privatemodules/nc4/share/hdf5_examples/c/h5_crtdat.c new file mode 100644 index 0000000000000000000000000000000000000000..bbb29b2558f15aa6b45011cc7967f2122fd4b6c2 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_crtdat.c @@ -0,0 +1,51 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates how to create a dataset that is a 4 x 6 + * array. It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" +#define FILE "dset.h5" + +int main() { + + hid_t file_id, dataset_id, dataspace_id; /* identifiers */ + hsize_t dims[2]; + herr_t status; + + /* Create a new file using default properties. */ + file_id = H5Fcreate(FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* Create the data space for the dataset. */ + dims[0] = 4; + dims[1] = 6; + dataspace_id = H5Screate_simple(2, dims, NULL); + + /* Create the dataset. */ + dataset_id = H5Dcreate2(file_id, "/dset", H5T_STD_I32BE, dataspace_id, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* End access to the dataset and release resources used by it. */ + status = H5Dclose(dataset_id); + + /* Terminate access to the data space. */ + status = H5Sclose(dataspace_id); + + /* Close the file. */ + status = H5Fclose(file_id); +} + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrp.c b/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrp.c new file mode 100644 index 0000000000000000000000000000000000000000..3a94a8f3395dbf9d3ca1f66adc25c138cc408278 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrp.c @@ -0,0 +1,40 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates how to create and close a group. + * It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" +#define FILE "group.h5" + +int main() { + + hid_t file_id, group_id; /* identifiers */ + herr_t status; + + /* Create a new file using default properties. */ + file_id = H5Fcreate(FILE, 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); + + /* Close the group. */ + status = H5Gclose(group_id); + + /* Terminate access to the file. */ + status = H5Fclose(file_id); +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrpar.c b/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrpar.c new file mode 100644 index 0000000000000000000000000000000000000000..9e6fc4091310d108adb888d5daede2a45af74cea --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrpar.c @@ -0,0 +1,48 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates the creation of groups using absolute and + * relative names. It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" +#define FILE "groups.h5" + +int main() { + + hid_t file_id, group1_id, group2_id, group3_id; /* identifiers */ + herr_t status; + + /* Create a new file using default properties. */ + file_id = H5Fcreate(FILE, 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); + + /* Create group "Group_A" in group "MyGroup" using absolute name. */ + group2_id = H5Gcreate2(file_id, "/MyGroup/Group_A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* Create group "Group_B" in group "MyGroup" using relative name. */ + group3_id = H5Gcreate2(group1_id, "Group_B", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* Close groups. */ + status = H5Gclose(group1_id); + status = H5Gclose(group2_id); + status = H5Gclose(group3_id); + + /* Close the file. */ + status = H5Fclose(file_id); +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrpd.c b/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrpd.c new file mode 100644 index 0000000000000000000000000000000000000000..9c45928fd85e6065b3c68cc3492f776f7315728d --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_crtgrpd.c @@ -0,0 +1,91 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates how to create a dataset in a group. + * It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" +#define FILE "groups.h5" + +int main() { + + hid_t file_id, group_id, dataset_id, dataspace_id; /* identifiers */ + hsize_t dims[2]; + herr_t status; + int i, j, dset1_data[3][3], dset2_data[2][10]; + + /* Initialize the first dataset. */ + for (i = 0; i < 3; i++) + for (j = 0; j < 3; j++) + dset1_data[i][j] = j + 1; + + /* Initialize the second dataset. */ + for (i = 0; i < 2; i++) + for (j = 0; j < 10; j++) + dset2_data[i][j] = j + 1; + + /* Open an existing file. */ + file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + + /* Create the data space for the first dataset. */ + dims[0] = 3; + dims[1] = 3; + dataspace_id = H5Screate_simple(2, dims, NULL); + + /* Create a dataset in group "MyGroup". */ + dataset_id = H5Dcreate2(file_id, "/MyGroup/dset1", H5T_STD_I32BE, dataspace_id, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* Write the first dataset. */ + status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + dset1_data); + + /* Close the data space for the first dataset. */ + status = H5Sclose(dataspace_id); + + /* Close the first dataset. */ + status = H5Dclose(dataset_id); + + /* Open an existing group of the specified file. */ + group_id = H5Gopen2(file_id, "/MyGroup/Group_A", H5P_DEFAULT); + + /* Create the data space for the second dataset. */ + dims[0] = 2; + dims[1] = 10; + dataspace_id = H5Screate_simple(2, dims, NULL); + + /* Create the second dataset in group "Group_A". */ + dataset_id = H5Dcreate2(group_id, "dset2", H5T_STD_I32BE, dataspace_id, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* Write the second dataset. */ + status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + dset2_data); + + /* Close the data space for the second dataset. */ + status = H5Sclose(dataspace_id); + + /* Close the second dataset */ + status = H5Dclose(dataset_id); + + /* Close the group. */ + status = H5Gclose(group_id); + + /* Close the file. */ + status = H5Fclose(file_id); +} + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_drivers.c b/privatemodules/nc4/share/hdf5_examples/c/h5_drivers.c new file mode 100644 index 0000000000000000000000000000000000000000..7245794108c100be1588d04bff96efe75a7749ae --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_drivers.c @@ -0,0 +1,104 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This shows how to use the hdf5 virtual file drivers. + * The example codes here do not check return values for the + * sake of simplicity. As in all proper programs, return codes + * should be checked. + */ + +#include "hdf5.h" +#include "stdlib.h" + +/* global variables */ +int cleanup_g = -1; /* whether to clean. Init to not set. */ + +/* prototypes */ +void cleanup(const char *); +void split_file(void); + + +/* + * Cleanup a file unless $HDF5_NOCLEANUP is set. + */ +void +cleanup(const char *filename) +{ + if (cleanup_g == -1) + cleanup_g = getenv("HDF5_NOCLEANUP") ? 0 : 1; + if (cleanup_g) + remove(filename); +} + + +/* + * This shows how to use the split file driver. + */ +void +split_file(void) +{ + hid_t fapl, fid; + + /* Example 1: Both metadata and rawdata files are in the same */ + /* directory. Use Station1-m.h5 and Station1-r.h5 as */ + /* the metadata and rawdata files. */ + fapl = H5Pcreate(H5P_FILE_ACCESS); + H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "-r.h5", H5P_DEFAULT); + fid=H5Fcreate("Station1",H5F_ACC_TRUNC,H5P_DEFAULT,fapl); + /* using the file ... */ + H5Fclose(fid); + H5Pclose(fapl); + /* Remove files created */ + cleanup("Station1-m.h5"); + cleanup("Station1-r.h5"); + + /* Example 2: metadata and rawdata files are in different */ + /* directories. Use PointA-m.h5 and /tmp/PointA-r.h5 as */ + /* the metadata and rawdata files. */ + fapl = H5Pcreate(H5P_FILE_ACCESS); + H5Pset_fapl_split(fapl, "-m.h5", H5P_DEFAULT, "/tmp/%s-r.h5", H5P_DEFAULT); + fid=H5Fcreate("PointA",H5F_ACC_TRUNC,H5P_DEFAULT,fapl); + /* using the file ... */ + H5Fclose(fid); + H5Pclose(fapl); + /* Remove files created */ + cleanup("PointA-m.h5"); + cleanup("/tmp/PointA-r.h5"); + + /* Example 3: Using default extension names for the metadata */ + /* and rawdata files. Use Measure.meta and Measure.raw as */ + /* the metadata and rawdata files. */ + fapl = H5Pcreate(H5P_FILE_ACCESS); + H5Pset_fapl_split(fapl, NULL, H5P_DEFAULT, NULL, H5P_DEFAULT); + fid=H5Fcreate("Measure",H5F_ACC_TRUNC,H5P_DEFAULT,fapl); + /* using the file ... */ + H5Fclose(fid); + H5Pclose(fapl); + /* Remove files created */ + cleanup("Measure.meta"); + cleanup("Measure.raw"); +} + + +/* Main Body */ +int +main (void) +{ + + split_file(); + + return(0); +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_elink_unix2win.c b/privatemodules/nc4/share/hdf5_examples/c/h5_elink_unix2win.c new file mode 100644 index 0000000000000000000000000000000000000000..9c0918c6807ae2d9d9faffa42a3c5a8ae5a6fa9d --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_elink_unix2win.c @@ -0,0 +1,206 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* This program demonstrates how to translate an external link created on + * a Windows machine into a format that a *nix machine can read. + * This is done by registering a new traversal function for external links. + * + * This example is designed to be run on Unix and will create an external + * link with a Windows-style path. Using the traversal function below, + * the example then successfully follows the external link. + * + * The external link will create a file called "u2w/u2w_target.h5". + * The example will fail if the directory u2w does not exist. + */ + +#include "hdf5.h" +#include <stdlib.h> +#include <string.h> + + +/* "Windows to Unix" traversal function for external links + * + * Translates a filename stored in Unix format to Windows format by replacing + * forward slashes with backslashes. + * Makes no attempt to handle Windows drive names (e.g., "C:\"), spaces within + * file names, quotes, etc. These are left as an exercise for the user. :) + * Note that this may not be necessary on your system; many Windows systems can + * understand Unix paths. + */ +static hid_t elink_unix2win_trav(const char *link_name, hid_t cur_group, + const void *udata, size_t udata_size, hid_t lapl_id) +{ + hid_t fid; + const char *file_name; + const char *obj_name; + char *new_fname = NULL; /* Buffer allocated to hold Unix file path */ + ssize_t prefix_len; /* External link prefix length */ + size_t fname_len; + size_t start_pos; /* Initial position in new_fname buffer */ + size_t x; /* Counter variable */ + hid_t ret_value = -1; + + printf("Converting Unix path to Windows path.\n"); + + if(H5Lunpack_elink_val(udata, udata_size, NULL, &file_name, &obj_name) < 0) + goto error; + fname_len = strlen(file_name); + + /* See if the external link prefix property is set */ + if((prefix_len = H5Pget_elink_prefix(lapl_id, NULL, 0)) < 0) + goto error; + + /* If so, prepend it to the filename. We assume that the prefix + * is in the correct format for the current file system. + */ + if(prefix_len > 0) + { + /* Allocate a buffer to hold the filename plus prefix */ + new_fname = malloc(prefix_len + fname_len + 1); + + /* Copy the prefix into the buffer */ + if(H5Pget_elink_prefix(lapl_id, new_fname, (size_t)(prefix_len + 1)) < 0) + goto error; + + start_pos = prefix_len; + } + else + { + /* Allocate a buffer to hold just the filename */ + new_fname = malloc(fname_len + 1); + start_pos = 0; + } + + /* We should now copy file_name into new_fname starting at position pos. + * We'll convert '/' characters into '\' characters as we go. + */ + for(x=0; file_name[x] != '\0'; x++) + { + if(file_name[x] == '/') + new_fname[x + start_pos] = '\\'; + else + new_fname[x + start_pos] = file_name[x]; + } + new_fname[x + start_pos] = '\0'; + + /* Now open the file and object within it */ + if((fid = H5Fopen(new_fname, H5F_ACC_RDWR, H5P_DEFAULT)) < 0) + goto error; + ret_value = H5Oopen(fid, obj_name, lapl_id); /* If this fails, our return value will be negative. */ + if(H5Fclose(fid) < 0) + goto error; + + /* Free file name if it's been allocated */ + if(new_fname) + free(new_fname); + + return ret_value; + +error: + /* Free file name if it's been allocated */ + if(new_fname) + free(new_fname); + return -1; +} + +const H5L_class_t elink_unix2win_class[1] = {{ + H5L_LINK_CLASS_T_VERS, /* H5L_class_t version */ + H5L_TYPE_EXTERNAL, /* Link type id number */ + "unix2win external link", /* Link class name for debugging */ + NULL, /* Creation callback */ + NULL, /* Move callback */ + NULL, /* Copy callback */ + elink_unix2win_trav, /* The actual traversal function */ + NULL, /* Deletion callback */ + NULL /* Query callback */ +}}; + + +/* The example function. + * Creates a file named "unix2win.h5" with an external link pointing to + * the file "u2w/u2w_target.h5". + * + * Registers a new traversal function for external links and then + * follows the external link to open the target file. + */ +static int +unix2win_example(void) +{ + hid_t fid = (-1); /* File ID */ + hid_t gid = (-1); /* Group ID */ + + /* Create the target file. */ +#ifdef H5_HAVE_WIN32_API + if((fid=H5Fcreate("u2w\\u2w_target.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) goto error; +#else + if((fid=H5Fcreate("u2w/u2w_target.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) goto error; +#endif + if(H5Fclose(fid) < 0) goto error; + + /* Create the source file with an external link in Windows format */ + if((fid=H5Fcreate("unix2win.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT))<0) goto error; + + /* Create the external link */ + if(H5Lcreate_external("u2w/../u2w/u2w_target.h5", "/", fid, "ext_link", H5P_DEFAULT, H5P_DEFAULT) < 0) goto error; + + /* If we are not on Windows, assume we are on a Unix-y filesystem and + * follow the external link normally. + * If we are on Windows, register the unix2win traversal function so + * that external links can be traversed. + */ + +#ifdef H5_HAVE_WIN32_API + /* Register the elink_unix2win class defined above to replace default + * external links + */ + if(H5Lregister(elink_unix2win_class) < 0) goto error; +#endif + + /* Now follow the link */ + if((gid = H5Gopen2(fid, "ext_link", H5P_DEFAULT)) < 0) goto error; + printf("Successfully followed external link.\n"); + + /* Close the group and the file */ + if(H5Gclose(gid) <0) goto error; + if(H5Fclose(fid) <0) goto error; + + return 0; + + error: + printf("Error!\n"); + H5E_BEGIN_TRY { + H5Gclose (gid); + H5Fclose (fid); + } H5E_END_TRY; + return -1; +} + + +/* Main function + * + * Invokes the example function. + */ +int +main(void) +{ + int ret; + + printf("Testing unix2win external links.\n"); + ret = unix2win_example(); + + return ret; +} + + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_extend.c b/privatemodules/nc4/share/hdf5_examples/c/h5_extend.c new file mode 100644 index 0000000000000000000000000000000000000000..105e553919a819cb4fce2aa9dc2ab5c2ec05f235 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_extend.c @@ -0,0 +1,146 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example how to work with extendible datasets. The dataset + * must be chunked in order to be extendible. + * + * It is used in the HDF5 Tutorial. + */ + + +#include "hdf5.h" + +#define FILENAME "extend.h5" +#define DATASETNAME "ExtendibleArray" +#define RANK 2 + +int +main (void) +{ + hid_t file; /* handles */ + hid_t dataspace, dataset; + hid_t filespace, memspace; + hid_t prop; + + hsize_t dims[2] = {3, 3}; /* dataset dimensions at creation time */ + hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; + herr_t status; + hsize_t chunk_dims[2] = {2, 5}; + int data[3][3] = { {1, 1, 1}, /* data to write */ + {1, 1, 1}, + {1, 1, 1} }; + + /* Variables used in extending and writing to the extended portion of dataset */ + hsize_t size[2]; + hsize_t offset[2]; + hsize_t dimsext[2] = {7, 3}; /* extend dimensions */ + int dataext[7][3] = { {2, 3, 4}, + {2, 3, 4}, + {2, 3, 4}, + {2, 3, 4}, + {2, 3, 4}, + {2, 3, 4}, + {2, 3, 4} }; + + /* Variables used in reading data back */ + hsize_t chunk_dimsr[2]; + hsize_t dimsr[2]; + hsize_t i, j; + int rdata[10][3]; + herr_t status_n; + int rank, rank_chunk; + + /* Create the data space with unlimited dimensions. */ + dataspace = H5Screate_simple (RANK, dims, maxdims); + + /* Create a new file. If file exists its contents will be overwritten. */ + file = H5Fcreate (FILENAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* Modify dataset creation properties, i.e. enable chunking */ + prop = H5Pcreate (H5P_DATASET_CREATE); + status = H5Pset_chunk (prop, RANK, chunk_dims); + + /* Create a new dataset within the file using chunk + creation properties. */ + dataset = H5Dcreate2 (file, DATASETNAME, H5T_NATIVE_INT, dataspace, + H5P_DEFAULT, prop, H5P_DEFAULT); + + /* Write data to dataset */ + status = H5Dwrite (dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, data); + + /* Extend the dataset. Dataset becomes 10 x 3 */ + size[0] = dims[0]+ dimsext[0]; + size[1] = dims[1]; + status = H5Dset_extent (dataset, size); + + /* Select a hyperslab in extended portion of dataset */ + filespace = H5Dget_space (dataset); + offset[0] = 3; + offset[1] = 0; + status = H5Sselect_hyperslab (filespace, H5S_SELECT_SET, offset, NULL, + dimsext, NULL); + + /* Define memory space */ + memspace = H5Screate_simple (RANK, dimsext, NULL); + + /* Write the data to the extended portion of dataset */ + status = H5Dwrite (dataset, H5T_NATIVE_INT, memspace, filespace, + H5P_DEFAULT, dataext); + + /* Close resources */ + status = H5Dclose (dataset); + status = H5Pclose (prop); + status = H5Sclose (dataspace); + status = H5Sclose (memspace); + status = H5Sclose (filespace); + status = H5Fclose (file); + + /******************************************** + * Re-open the file and read the data back. * + ********************************************/ + + file = H5Fopen (FILENAME, H5F_ACC_RDONLY, H5P_DEFAULT); + dataset = H5Dopen2 (file, DATASETNAME, H5P_DEFAULT); + + filespace = H5Dget_space (dataset); + rank = H5Sget_simple_extent_ndims (filespace); + status_n = H5Sget_simple_extent_dims (filespace, dimsr, NULL); + + prop = H5Dget_create_plist (dataset); + + if (H5D_CHUNKED == H5Pget_layout (prop)) + rank_chunk = H5Pget_chunk (prop, rank, chunk_dimsr); + + memspace = H5Screate_simple (rank, dimsr, NULL); + status = H5Dread (dataset, H5T_NATIVE_INT, memspace, filespace, + H5P_DEFAULT, rdata); + + printf("\n"); + printf("Dataset: \n"); + for (j = 0; j < dimsr[0]; j++) + { + for (i = 0; i < dimsr[1]; i++) + printf("%d ", rdata[j][i]); + printf("\n"); + } + + status = H5Pclose (prop); + status = H5Dclose (dataset); + status = H5Sclose (filespace); + status = H5Sclose (memspace); + status = H5Fclose (file); +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_extend_write.c b/privatemodules/nc4/share/hdf5_examples/c/h5_extend_write.c new file mode 100644 index 0000000000000000000000000000000000000000..74f6c01d5119570714a89d5c2f04ae7394953ef5 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_extend_write.c @@ -0,0 +1,189 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example shows how to work with extendible dataset. + * In the current version of the library dataset MUST be + * chunked. + * + */ + +#include "hdf5.h" + +#define H5FILE_NAME "SDSextendible.h5" +#define DATASETNAME "ExtendibleArray" +#define RANK 2 +#define NX 10 +#define NY 5 + +int +main (void) +{ + hid_t file; /* handles */ + hid_t dataspace, dataset; + hid_t filespace; + hid_t cparms; + hsize_t dims[2] = { 3, 3}; /* + * dataset dimensions + * at the creation time + */ + hsize_t dims1[2] = { 3, 3}; /* data1 dimensions */ + hsize_t dims2[2] = { 7, 1}; /* data2 dimensions */ + hsize_t dims3[2] = { 2, 2}; /* data3 dimensions */ + + hsize_t maxdims[2] = {H5S_UNLIMITED, H5S_UNLIMITED}; + hsize_t chunk_dims[2] ={2, 5}; + hsize_t size[2]; + hsize_t offset[2]; + + herr_t status; + + int data1[3][3] = { {1, 1, 1}, /* data to write */ + {1, 1, 1}, + {1, 1, 1} }; + + int data2[7] = { 2, 2, 2, 2, 2, 2, 2}; + + int data3[2][2] = { {3, 3}, + {3, 3} }; + int fillvalue = 0; + + /* + * Create the data space with unlimited dimensions. + */ + dataspace = H5Screate_simple(RANK, dims, maxdims); + + /* + * Create a new file. If file exists its contents will be overwritten. + */ + file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Modify dataset creation properties, i.e. enable chunking. + */ + cparms = H5Pcreate(H5P_DATASET_CREATE); + status = H5Pset_chunk( cparms, RANK, chunk_dims); + status = H5Pset_fill_value (cparms, H5T_NATIVE_INT, &fillvalue ); + + /* + * Create a new dataset within the file using cparms + * creation properties. + */ + dataset = H5Dcreate2(file, DATASETNAME, H5T_NATIVE_INT, dataspace, H5P_DEFAULT, + cparms, H5P_DEFAULT); + + /* + * Extend the dataset. This call assures that dataset is at least 3 x 3. + */ + size[0] = 3; + size[1] = 3; + status = H5Dset_extent(dataset, size); + + /* + * Select a hyperslab. + */ + filespace = H5Dget_space(dataset); + offset[0] = 0; + offset[1] = 0; + status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, + dims1, NULL); + + /* + * Write the data to the hyperslab. + */ + status = H5Dwrite(dataset, H5T_NATIVE_INT, dataspace, filespace, + H5P_DEFAULT, data1); + + /* + * Extend the dataset. Dataset becomes 10 x 3. + */ + dims[0] = dims1[0] + dims2[0]; + size[0] = dims[0]; + size[1] = dims[1]; + status = H5Dset_extent(dataset, size); + + /* + * Select a hyperslab. + */ + filespace = H5Dget_space(dataset); + offset[0] = 3; + offset[1] = 0; + status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, + dims2, NULL); + + /* + * Define memory space + */ + dataspace = H5Screate_simple(RANK, dims2, NULL); + + /* + * Write the data to the hyperslab. + */ + status = H5Dwrite(dataset, H5T_NATIVE_INT, dataspace, filespace, + H5P_DEFAULT, data2); + + /* + * Extend the dataset. Dataset becomes 10 x 5. + */ + dims[1] = dims1[1] + dims3[1]; + size[0] = dims[0]; + size[1] = dims[1]; + status = H5Dset_extent(dataset, size); + + /* + * Select a hyperslab + */ + filespace = H5Dget_space(dataset); + offset[0] = 0; + offset[1] = 3; + status = H5Sselect_hyperslab(filespace, H5S_SELECT_SET, offset, NULL, + dims3, NULL); + + /* + * Define memory space. + */ + dataspace = H5Screate_simple(RANK, dims3, NULL); + + /* + * Write the data to the hyperslab. + */ + status = H5Dwrite(dataset, H5T_NATIVE_INT, dataspace, filespace, + H5P_DEFAULT, data3); + + /* + * Resulting dataset + * + * 3 3 3 2 2 + * 3 3 3 2 2 + * 3 3 3 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + * 2 0 0 0 0 + */ + /* + * Close/release resources. + */ + H5Dclose(dataset); + H5Sclose(dataspace); + H5Sclose(filespace); + H5Pclose(cparms); + H5Fclose(file); + + return 0; +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_extlink.c b/privatemodules/nc4/share/hdf5_examples/c/h5_extlink.c new file mode 100644 index 0000000000000000000000000000000000000000..e8a24b878a93009484b9f21525cebea5a12954d2 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_extlink.c @@ -0,0 +1,673 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* This program demonstrates how to create and use "external links" in + * HDF5. + * + * External links point from one HDF5 file to an object (Group, Dataset, or + * committed Datatype) in another file. + */ + +#include "hdf5.h" +#include <string.h> + +#define SOURCE_FILE "extlink_source.h5" +#define TARGET_FILE "extlink_target.h5" + +#define PREFIX_SOURCE_FILE "extlink_prefix_source.h5" + +#define SOFT_LINK_FILE "soft_link.h5" +#define SOFT_LINK_NAME "soft_link_to_group" +#define UD_SOFT_LINK_NAME "ud_soft_link" +#define TARGET_GROUP "target_group" + +#define UD_SOFT_CLASS 65 + +#define HARD_LINK_FILE "hard_link.h5" +#define HARD_LINK_NAME "hard_link_to_group" +#define UD_HARD_LINK_NAME "ud_hard_link" + +#define UD_HARD_CLASS 66 + +#define PLIST_LINK_PROP "plist_link_prop" +#define UD_PLIST_CLASS 66 + + + +/* Basic external link example + * + * Creates two files and uses an external link to access an object in the + * second file from the first file. + */ +static void extlink_example(void) +{ + hid_t source_file_id, targ_file_id; + hid_t group_id, group2_id; + + /* Create two files, a source and a target */ + source_file_id = H5Fcreate(SOURCE_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + targ_file_id = H5Fcreate(TARGET_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* Create a group in the target file for the external link to point to. */ + group_id = H5Gcreate2(targ_file_id, "target_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* Close the group and the target file */ + H5Gclose(group_id); + + /* Create an external link in the source file pointing to the target group. + * We could instead have created the external link first, then created the + * group it points to; the order doesn't matter. + */ + H5Lcreate_external(TARGET_FILE, "target_group", source_file_id, "ext_link", H5P_DEFAULT, H5P_DEFAULT); + + /* Now we can use the external link to create a new group inside the + * target group (even though the target file is closed!). The external + * link works just like a soft link. + */ + group_id = H5Gcreate2(source_file_id, "ext_link/new_group", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* The group is inside the target file and we can access it normally. + * Here, group_id and group2_id point to the same group inside the + * target file. + */ + group2_id = H5Gopen2(targ_file_id, "target_group/new_group", H5P_DEFAULT); + + /* Don't forget to close the IDs we opened. */ + H5Gclose(group2_id); + H5Gclose(group_id); + + H5Fclose(targ_file_id); + H5Fclose(source_file_id); + + /* The link from the source file to the target file will work as long as + * the target file can be found. If the target file is moved, renamed, + * or deleted in the filesystem, HDF5 won't be able to find it and the + * external link will "dangle." + */ +} + + +/* External link prefix example + * + * Uses a group access property list to set a "prefix" for the filenames + * accessed through an external link. + * + * Group access property lists inherit from link access property lists; + * the external link prefix property is actually a property of LAPLs. + * + * This example requires a "red" directory and a "blue" directory to exist + * where it is run (so to run this example on Unix, first mkdir red and mkdir + * blue). + */ +static void extlink_prefix_example(void) +{ + hid_t source_file_id, red_file_id, blue_file_id; + hid_t group_id, group2_id; + hid_t gapl_id; + + /* Create three files, a source and two targets. The targets will have + * the same name, but one will be located in the red directory and one will + * be located in the blue directory */ + source_file_id = H5Fcreate(PREFIX_SOURCE_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + red_file_id = H5Fcreate("red/prefix_target.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + blue_file_id = H5Fcreate("blue/prefix_target.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* This test needs a red and a blue directory in the filesystem. If they're not present, + * trying to create the files above will fail. + */ + if(red_file_id < 0 || blue_file_id < 0) + printf("This test requires directories named 'red' and 'blue' to exist. Did you forget to create them?\n"); + + /* Create an external link in the source file pointing to the root group of + * a file named prefix_target.h5. This file doesn't exist in the current + * directory, but the files in the red and blue directories both have this + * name. + */ + H5Lcreate_external("prefix_target.h5", "/", source_file_id, "ext_link", H5P_DEFAULT, H5P_DEFAULT); + + /* If we tried to traverse the external link now, we would fail (since the + * file it points to doesn't exist). Instead, we'll create a group access + * property list that will provide a prefix path to the external link. + * Group access property lists inherit the properties of link access + * property lists. + */ + gapl_id = H5Pcreate(H5P_GROUP_ACCESS); + H5Pset_elink_prefix(gapl_id, "red/"); + + /* Now if we traverse the external link, HDF5 will look for an external + * file named red/prefix_target.h5, which exists. + * To pass the group access property list, we need to use H5Gopen2. + */ + group_id = H5Gopen2(source_file_id, "ext_link", gapl_id); + + /* Now we can use the open group ID to create a new group inside the + * "red" file. + */ + group2_id = H5Gcreate2(group_id, "pink", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* Close both groups. */ + H5Gclose(group2_id); + H5Gclose(group_id); + + /* If we change the prefix, the same external link can find a file in the blue + * directory. + */ + H5Pset_elink_prefix(gapl_id, "blue/"); + group_id = H5Gopen2(source_file_id, "ext_link", gapl_id); + group2_id = H5Gcreate2(group_id, "sky blue", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* Close both groups. */ + H5Gclose(group2_id); + H5Gclose(group_id); + + /* Each file has had a group created inside it using the same external link. */ + group_id = H5Gopen2(red_file_id, "pink", H5P_DEFAULT); + group2_id = H5Gopen2(blue_file_id, "sky blue", H5P_DEFAULT); + + /* Clean up our open IDs */ + H5Gclose(group2_id); + H5Gclose(group_id); + H5Pclose(gapl_id); + H5Fclose(blue_file_id); + H5Fclose(red_file_id); + H5Fclose(source_file_id); + + /* User-defined links can expand on the ability to pass in parameters + * using an access property list; for instance, a user-defined link + * might function like an external link but allow the full filename to be + * passed in through the access property list. + */ +} + + +/* Soft Link example + * + * Create a new class of user-defined links that behave like HDF5's built-in + * soft links. + * + * This isn't very useful by itself (HDF5's soft links already do the same + * thing), but it can serve as an example for how to reference objects by + * name. + */ + +/* We need to define the callback function that the soft link will use. + * It is defined after the example below. + * To keep the example simple, these links don't have a query callback. + * In general, link classes should always be query-able. + * We might also have wanted to supply a creation callback that checks + * that a path was supplied in the udata. + */ +static hid_t UD_soft_traverse(const char *link_name, hid_t cur_group, + const void *udata, size_t udata_size, hid_t lapl_id); + +static void soft_link_example(void) +{ + hid_t file_id; + hid_t group_id; + /* Define the link class that we'll use to register "user-defined soft + * links" using the callbacks we defined above. + * A link class can have NULL for any callback except its traverse + * callback. + */ + const H5L_class_t UD_soft_class[1] = {{ + H5L_LINK_CLASS_T_VERS, /* Version number for this struct. + * This field is always H5L_LINK_CLASS_T_VERS */ + (H5L_type_t)UD_SOFT_CLASS, /* Link class id number. This can be any + * value between H5L_TYPE_UD_MIN (64) and + * H5L_TYPE_MAX (255). It should be a + * value that isn't already being used by + * another kind of link. We'll use 65. */ + "UD_soft_link", /* Link class name for debugging */ + NULL, /* Creation callback */ + NULL, /* Move callback */ + NULL, /* Copy callback */ + UD_soft_traverse, /* The actual traversal function */ + NULL, /* Deletion callback */ + NULL /* Query callback */ + }}; + + + /* First, create a file and an object within the file for the link to + * point to. + */ + file_id = H5Fcreate(SOFT_LINK_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + group_id = H5Gcreate2(file_id, TARGET_GROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + H5Gclose(group_id); + + /* This is how we create a normal soft link to the group. + */ + H5Lcreate_soft(TARGET_GROUP, file_id, SOFT_LINK_NAME, H5P_DEFAULT, H5P_DEFAULT); + + /* To do the same thing using a user-defined link, we first have to + * register the link class we defined. + */ + H5Lregister(UD_soft_class); + + /* Now create a user-defined link. We give it the path to the group + * as its udata.1 + */ + H5Lcreate_ud(file_id, UD_SOFT_LINK_NAME, (H5L_type_t)UD_SOFT_CLASS, TARGET_GROUP, + strlen(TARGET_GROUP) + 1, H5P_DEFAULT, H5P_DEFAULT); + + /* We can access the group through the UD soft link like we would through + * a normal soft link. This link will still dangle if the object's + * original name is changed or unlinked. + */ + group_id = H5Gopen2(file_id, UD_SOFT_LINK_NAME, H5P_DEFAULT); + + /* The group is now open normally. Don't forget to close it! */ + H5Gclose(group_id); + + H5Fclose(file_id); +} + +/* UD_soft_traverse + * The actual traversal function simply needs to open the correct object by + * name and return its ID. + */ + +static hid_t UD_soft_traverse(const char *link_name, hid_t cur_group, + const void *udata, size_t udata_size, hid_t lapl_id) +{ + const char *target = (const char *) udata; + hid_t ret_value; + + /* Pass the udata straight through to HDF5. If it's invalid, let HDF5 + * return an error. + */ + ret_value = H5Oopen(cur_group, target, lapl_id); + return ret_value; +} + + +/* Hard Link example + * + * Create a new class of user-defined links that behave like HDF5's built-in + * hard links. + * + * This isn't very useful by itself (HDF5's hard links already do the same + * thing), but it can serve as an example for how to reference objects by + * address. + */ + +/* We need to define the callback functions that the hard link will use. + * These are defined after the example below. + * To keep the example simple, these links don't have a query callback. + * Generally, real link classes should always be query-able. + */ +static herr_t UD_hard_create(const char *link_name, hid_t loc_group, + const void *udata, size_t udata_size, hid_t lcpl_id); +static herr_t UD_hard_delete(const char *link_name, hid_t loc_group, + const void *udata, size_t udata_size); +static hid_t UD_hard_traverse(const char *link_name, hid_t cur_group, + const void *udata, size_t udata_size, hid_t lapl_id); + +static void hard_link_example(void) +{ + hid_t file_id; + hid_t group_id; + H5L_info_t li; + /* Define the link class that we'll use to register "user-defined hard + * links" using the callbacks we defined above. + * A link class can have NULL for any callback except its traverse + * callback. + */ + const H5L_class_t UD_hard_class[1] = {{ + H5L_LINK_CLASS_T_VERS, /* Version number for this struct. + * This field is always H5L_LINK_CLASS_T_VERS */ + (H5L_type_t)UD_HARD_CLASS, /* Link class id number. This can be any + * value between H5L_TYPE_UD_MIN (64) and + * H5L_TYPE_MAX (255). It should be a + * value that isn't already being used by + * another kind of link. We'll use 66. */ + "UD_hard_link", /* Link class name for debugging */ + UD_hard_create, /* Creation callback */ + NULL, /* Move callback */ + NULL, /* Copy callback */ + UD_hard_traverse, /* The actual traversal function */ + UD_hard_delete, /* Deletion callback */ + NULL /* Query callback */ + }}; + + + /* First, create a file and an object within the file for the link to + * point to. + */ + file_id = H5Fcreate(HARD_LINK_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + group_id = H5Gcreate2(file_id, TARGET_GROUP, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + H5Gclose(group_id); + + /* This is how we create a normal hard link to the group. This + * creates a second "name" for the group. + */ + H5Lcreate_hard(file_id, TARGET_GROUP, file_id, HARD_LINK_NAME, H5P_DEFAULT, H5P_DEFAULT); + + /* To do the same thing using a user-defined link, we first have to + * register the link class we defined. + */ + H5Lregister(UD_hard_class); + + /* Since hard links link by object address, we'll need to retrieve + * the target group's address. We do this by calling H5Lget_info + * on a hard link to the object. + */ + H5Lget_info(file_id, TARGET_GROUP, &li, H5P_DEFAULT); + + /* Now create a user-defined link. We give it the group's address + * as its udata. + */ + H5Lcreate_ud(file_id, UD_HARD_LINK_NAME, (H5L_type_t)UD_HARD_CLASS, &(li.u.address), + sizeof(li.u.address), H5P_DEFAULT, H5P_DEFAULT); + + /* The UD hard link has now incremented the group's reference count + * like a normal hard link would. This means that we can unlink the + * other two links to that group and it won't be deleted until the + * UD hard link is deleted. + */ + H5Ldelete(file_id, TARGET_GROUP, H5P_DEFAULT); + H5Ldelete(file_id, HARD_LINK_NAME, H5P_DEFAULT); + + /* The group is still accessible through the UD hard link. If this were + * a soft link instead, the object would have been deleted when the last + * hard link to it was unlinked. */ + group_id = H5Gopen2(file_id, UD_HARD_LINK_NAME, H5P_DEFAULT); + + /* The group is now open normally. Don't forget to close it! */ + H5Gclose(group_id); + + /* Removing the user-defined hard link will delete the group. */ + H5Ldelete(file_id, UD_HARD_LINK_NAME, H5P_DEFAULT); + + H5Fclose(file_id); +} + +/* Callbacks for User-defined hard links. */ +/* UD_hard_create + * The most important thing this callback does is to increment the reference + * count on the target object. Without this step, the object could be + * deleted while this link still pointed to it, resulting in possible data + * corruption! + * The create callback also checks the arguments used to create this link. + * If this function returns a negative value, the call to H5Lcreate_ud() + * will also return failure and the link will not be created. + */ +static herr_t UD_hard_create(const char *link_name, hid_t loc_group, + const void *udata, size_t udata_size, hid_t lcpl_id) +{ + haddr_t addr; + hid_t target_obj = -1; + herr_t ret_value = 0; + + /* Make sure that the address passed in looks valid */ + if(udata_size != sizeof(haddr_t)) + { + ret_value = -1; + goto done; + } + + addr = *((const haddr_t *) udata); + + /* Open the object this link points to so that we can increment + * its reference count. This also ensures that the address passed + * in points to a real object (although this check is not perfect!) */ + target_obj= H5Oopen_by_addr(loc_group, addr); + if(target_obj < 0) + { + ret_value = -1; + goto done; + } + + /* Increment the reference count of the target object */ + if(H5Oincr_refcount(target_obj) < 0) + { + ret_value = -1; + goto done; + } + +done: + /* Close the target object if we opened it */ + if(target_obj >= 0) + H5Oclose(target_obj); + return ret_value; +} + +/* UD_hard_delete + * Since the creation function increments the object's reference count, it's + * important to decrement it again when the link is deleted. + */ +static herr_t UD_hard_delete(const char *link_name, hid_t loc_group, + const void *udata, size_t udata_size) +{ + haddr_t addr; + hid_t target_obj = -1; + herr_t ret_value = 0; + + /* Sanity check; we have already verified the udata's size in the creation + * callback. + */ + if(udata_size != sizeof(haddr_t)) + { + ret_value = -1; + goto done; + } + + addr = *((const haddr_t *) udata); + + /* Open the object this link points to */ + target_obj= H5Oopen_by_addr(loc_group, addr); + if(target_obj < 0) + { + ret_value = -1; + goto done; + } + + /* Decrement the reference count of the target object */ + if(H5Odecr_refcount(target_obj) < 0) + { + ret_value = -1; + goto done; + } + +done: + /* Close the target object if we opened it */ + if(target_obj >= 0) + H5Oclose(target_obj); + return ret_value; +} + +/* UD_hard_traverse + * The actual traversal function simply needs to open the correct object and + * return its ID. + */ +static hid_t UD_hard_traverse(const char *link_name, hid_t cur_group, + const void *udata, size_t udata_size, hid_t lapl_id) +{ + haddr_t addr; + hid_t ret_value = -1; + + /* Sanity check; we have already verified the udata's size in the creation + * callback. + */ + if(udata_size != sizeof(haddr_t)) + return -1; + + addr = *((const haddr_t *) udata); + + /* Open the object by address. If H5Oopen_by_addr fails, ret_value will + * be negative to indicate that the traversal function failed. + */ + ret_value = H5Oopen_by_addr(cur_group, addr); + + return ret_value; +} + + + +/* Plist example + * + * Create a new class of user-defined links that open objects within a file + * based on a value passed in through a link access property list. + * + * Group, dataset, and datatype access property lists all inherit from link + * access property lists, so they can be used instead of LAPLs. + */ + +/* We need to define the callback functions that this link type will use. + * These are defined after the example below. + * These links have no udata, so they don't need a query function. + */ +static hid_t UD_plist_traverse(const char *link_name, hid_t cur_group, + const void *udata, size_t udata_size, hid_t lapl_id); + +static void plist_link_example(void) +{ + hid_t file_id; + hid_t group_id, group2_id; + hid_t gapl_id; + char *path = NULL; + + /* Define the link class that we'll use to register "plist + * links" using the callback we defined above. + * A link class can have NULL for any callback except its traverse + * callback. + */ + const H5L_class_t UD_plist_class[1] = {{ + H5L_LINK_CLASS_T_VERS, /* Version number for this struct. + * This field is always H5L_LINK_CLASS_T_VERS */ + (H5L_type_t)UD_PLIST_CLASS, /* Link class id number. This can be any + * value between H5L_TYPE_UD_MIN (64) and + * H5L_TYPE_MAX (255). It should be a + * value that isn't already being used by + * another kind of link. We'll use 67. */ + "UD_plist_link", /* Link class name for debugging */ + NULL, /* Creation callback */ + NULL, /* Move callback */ + NULL, /* Copy callback */ + UD_plist_traverse, /* The actual traversal function */ + NULL, /* Deletion callback */ + NULL /* Query callback */ + }}; + + + /* First, create a file and two objects within the file for the link to + * point to. + */ + file_id = H5Fcreate(HARD_LINK_FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + group_id = H5Gcreate2(file_id, "group_1", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + H5Gclose(group_id); + group_id = H5Gcreate2(file_id, "group_1/group_2", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + H5Gclose(group_id); + + /* Register "plist links" and create one. It has no udata at all. */ + H5Lregister(UD_plist_class); + H5Lcreate_ud(file_id, "plist_link", (H5L_type_t)UD_PLIST_CLASS, NULL, 0, + H5P_DEFAULT, H5P_DEFAULT); + + /* Create a group access property list to pass in the target for the + * plist link. + */ + gapl_id = H5Pcreate(H5P_GROUP_ACCESS); + + /* There is no HDF5 API for setting the property that controls these + * links, so we have to add the property manually + */ + H5Pinsert2(gapl_id, PLIST_LINK_PROP, sizeof(const char *), &(path), NULL, NULL, NULL, NULL, NULL, NULL); + + /* Set the property to point to the first group. */ + path = "group_1"; + H5Pset(gapl_id, PLIST_LINK_PROP, &path); + + /* Open the first group through the plist link using the GAPL we just + * created */ + group_id = H5Gopen2(file_id, "plist_link", gapl_id); + + /* If we change the value set on the property list, it will change where + * the plist link points. + */ + path = "group_1/group_2"; + H5Pset(gapl_id, PLIST_LINK_PROP, &path); + group2_id = H5Gopen2(file_id, "plist_link", gapl_id); + + /* group_id points to group_1 and group2_id points to group_2, both opened + * through the same link. + * Using more than one of this type of link could quickly become confusing, + * since they will all use the same property list; however, there is + * nothing to prevent the links from changing the property list in their + * traverse callbacks. + */ + + /* Clean up */ + H5Pclose(gapl_id); + H5Gclose(group_id); + H5Gclose(group2_id); + H5Fclose(file_id); +} + +/* Traversal callback for User-defined plist links. */ +/* UD_plist_traverse + * Open a path passed in through the property list. + */ +static hid_t UD_plist_traverse(const char *link_name, hid_t cur_group, + const void *udata, size_t udata_size, hid_t lapl_id) +{ + char * path; + hid_t ret_value = -1; + + /* If the link property isn't set or can't be found, traversal fails. */ + if(H5Pexist(lapl_id, PLIST_LINK_PROP) < 0) + goto error; + + if(H5Pget(lapl_id, PLIST_LINK_PROP, &path) < 0) + goto error; + + /* Open the object by address. If H5Oopen_by_addr fails, ret_value will + * be negative to indicate that the traversal function failed. + */ + ret_value = H5Oopen(cur_group, path, lapl_id); + + return ret_value; + +error: + return -1; +} + + + +/* Main function + * + * Invokes the example functions. + */ + int +main(void) +{ + printf("Testing basic external links.\n"); + extlink_example(); + + printf("Testing external link prefixes.\n"); + extlink_prefix_example(); + + printf("Testing user-defined soft links.\n"); + soft_link_example(); + + printf("Testing user-defined hard links.\n"); + hard_link_example(); + + printf("Testing user-defined property list links.\n"); + plist_link_example(); + + return 0; +} + + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_group.c b/privatemodules/nc4/share/hdf5_examples/c/h5_group.c new file mode 100644 index 0000000000000000000000000000000000000000..6b73210d8e82bee7171a2775ff2adc3eaecf7ded --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_group.c @@ -0,0 +1,261 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This program creates a group in the file and two datasets in the group. + * Hard link to the group object is created and one of the datasets is accessed + * under new name. + * Iterator functions are used to find information about the objects + * in the root group and in the created group. + */ + + +#include "hdf5.h" + + +#define H5FILE_NAME "group.h5" +#define RANK 2 + +static herr_t file_info(hid_t loc_id, const char *name, const H5L_info_t *linfo, + void *opdata); /* Link iteration operator function */ +static herr_t group_info(hid_t loc_id, const char *name, const H5L_info_t *linfo, + void *opdata); /* Link iteration operator function */ +int +main(void) +{ + + hid_t file; + hid_t grp; + hid_t dataset, dataspace; + hid_t plist; + + herr_t status; + hsize_t dims[2]; + hsize_t cdims[2]; + + int idx_f, idx_g; + + /* + * Create a file. + */ + file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create a group in the file. + */ + grp = H5Gcreate2(file, "/Data", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create dataset "Compressed Data" in the group using absolute + * name. Dataset creation property list is modified to use + * GZIP compression with the compression effort set to 6. + * Note that compression can be used only when dataset is chunked. + */ + dims[0] = 1000; + dims[1] = 20; + cdims[0] = 20; + cdims[1] = 20; + dataspace = H5Screate_simple(RANK, dims, NULL); + plist = H5Pcreate(H5P_DATASET_CREATE); + H5Pset_chunk(plist, 2, cdims); + H5Pset_deflate( plist, 6); + dataset = H5Dcreate2(file, "/Data/Compressed_Data", H5T_NATIVE_INT, + dataspace, H5P_DEFAULT, plist, H5P_DEFAULT); + /* + * Close the first dataset . + */ + H5Sclose(dataspace); + H5Dclose(dataset); + + /* + * Create the second dataset. + */ + dims[0] = 500; + dims[1] = 20; + dataspace = H5Screate_simple(RANK, dims, NULL); + dataset = H5Dcreate2(file, "/Data/Float_Data", H5T_NATIVE_FLOAT, + dataspace, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + *Close the second dataset and file. + */ + H5Sclose(dataspace); + H5Dclose(dataset); + H5Pclose(plist); + H5Gclose(grp); + H5Fclose(file); + + /* + * Now reopen the file and group in the file. + */ + file = H5Fopen(H5FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + grp = H5Gopen2(file, "Data", H5P_DEFAULT); + + /* + * Access "Compressed_Data" dataset in the group. + */ + dataset = H5Dopen2(grp, "Compressed_Data", H5P_DEFAULT); + if( dataset < 0) printf(" Dataset 'Compressed-Data' is not found. \n"); + printf("\"/Data/Compressed_Data\" dataset is open \n"); + + /* + * Close the dataset. + */ + status = H5Dclose(dataset); + + /* + * Create hard link to the Data group. + */ + status = H5Lcreate_hard(file, "Data", H5L_SAME_LOC, "Data_new", H5P_DEFAULT, H5P_DEFAULT); + + /* + * We can access "Compressed_Data" dataset using created + * hard link "Data_new". + */ + dataset = H5Dopen2(file, "/Data_new/Compressed_Data", H5P_DEFAULT); + if( dataset < 0) printf(" Dataset is not found. \n"); + printf("\"/Data_new/Compressed_Data\" dataset is open \n"); + + /* + * Close the dataset. + */ + status = H5Dclose(dataset); + + + /* + * Use iterator to see the names of the objects in the root group. + */ + idx_f = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, NULL, file_info, NULL); + + /* + * Unlink name "Data" and use iterator to see the names + * of the objects in the file root direvtory. + */ + if(H5Ldelete(file, "Data", H5P_DEFAULT) < 0) + printf(" H5Ldelete failed \n"); + else + printf("\"Data\" is unlinked \n"); + + idx_f = H5Literate(file, H5_INDEX_NAME, H5_ITER_INC, NULL, file_info, NULL); + + /* + * Use iterator to see the names of the objects in the group + * /Data_new. + */ + idx_g = H5Literate_by_name(grp, "/Data_new", H5_INDEX_NAME, H5_ITER_INC, NULL, group_info, NULL, H5P_DEFAULT); + + /* + * Close the file. + */ + + H5Gclose(grp); + H5Fclose(file); + + return 0; +} + +/* + * Operator function. + */ +static herr_t +file_info(hid_t loc_id, const char *name, const H5L_info_t *linfo, void *opdata) +{ + /* avoid compiler warnings */ + loc_id = loc_id; + opdata = opdata; + linfo = linfo; + + /* + * Display group name. The name is passed to the function by + * the Library. Some magic :-) + */ + printf("\nName : %s\n", name); + + return 0; +} + + +/* + * Operator function. + */ +static herr_t +group_info(hid_t loc_id, const char *name, const H5L_info_t *linfo, void *opdata) +{ + hid_t did; /* dataset identifier */ + hid_t tid; /* datatype identifier */ + H5T_class_t t_class; + hid_t pid; /* data_property identifier */ + hsize_t chunk_dims_out[2]; + int rank_chunk; + + /* avoid warnings */ + opdata = opdata; + linfo = linfo; + + /* + * Open the datasets using their names. + */ + did = H5Dopen2(loc_id, name, H5P_DEFAULT); + + /* + * Display dataset name. + */ + printf("\nName : %s\n", name); + + /* + * Display dataset information. + */ + tid = H5Dget_type(did); /* get datatype*/ + pid = H5Dget_create_plist(did); /* get creation property list */ + + /* + * Check if dataset is chunked. + */ + if(H5D_CHUNKED == H5Pget_layout(pid)) { + /* + * get chunking information: rank and dimensions. + */ + rank_chunk = H5Pget_chunk(pid, 2, chunk_dims_out); + printf("chunk rank %d, dimensions %lu x %lu\n", rank_chunk, + (unsigned long)(chunk_dims_out[0]), + (unsigned long)(chunk_dims_out[1])); + } + else { + t_class = H5Tget_class(tid); + if(t_class < 0) { + puts(" Invalid datatype.\n"); + } + else { + if(t_class == H5T_INTEGER) + puts(" Datatype is 'H5T_NATIVE_INTEGER'.\n"); + if(t_class == H5T_FLOAT) + puts(" Datatype is 'H5T_NATIVE_FLOAT'.\n"); + if(t_class == H5T_STRING) + puts(" Datatype is 'H5T_NATIVE_STRING'.\n"); + if(t_class == H5T_BITFIELD) + puts(" Datatype is 'H5T_NATIVE_BITFIELD'.\n"); + if(t_class == H5T_OPAQUE) + puts(" Datatype is 'H5T_NATIVE_OPAQUE'.\n"); + if(t_class == H5T_COMPOUND) + puts(" Datatype is 'H5T_NATIVE_COMPOUND'.\n"); + } + } + + H5Dclose(did); + H5Pclose(pid); + H5Tclose(tid); + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_mount.c b/privatemodules/nc4/share/hdf5_examples/c/h5_mount.c new file mode 100644 index 0000000000000000000000000000000000000000..6da71a1fa682eaafee7a48b341eb54a3ab29aef3 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_mount.c @@ -0,0 +1,133 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This program shows the concept of "mounting files". + * Program creates one file with group G in it, and another + * file with dataset D. Then second file is mounted in the first one + * under the "mounting point" G. Dataset D is accessed in the first file + * under name /G/D and data is printed out. + */ + +#include "hdf5.h" + +#define FILE1 "mount1.h5" +#define FILE2 "mount2.h5" + +#define RANK 2 +#define NX 4 +#define NY 5 + +int main(void) +{ + + hid_t fid1, fid2, gid; /* Files and group identifiers */ + hid_t did, tid, sid; /* Dataset and datatype identifiers */ + + herr_t status; + hsize_t dims[] = {NX,NY}; /* Dataset dimensions */ + + int i, j; + int bm[NX][NY], bm_out[NX][NY]; /* Data buffers */ + + /* + * Initialization of buffer matrix "bm" + */ + for(i =0; i < NX; i++) + for(j = 0; j < NY; j++) + bm[i][j] = i + j; + + /* + * Create first file and a group in it. + */ + fid1 = H5Fcreate(FILE1, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + gid = H5Gcreate2(fid1, "/G", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Close group and file + */ + H5Gclose(gid); + H5Fclose(fid1); + + /* + * Create second file and dataset "D" in it. + */ + fid2 = H5Fcreate(FILE2, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + dims[0] = NX; + dims[1] = NY; + sid = H5Screate_simple(RANK, dims, NULL); + did = H5Dcreate2(fid2, "D", H5T_NATIVE_INT, sid, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Write data to the dataset. + */ + status = H5Dwrite(did, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm); + + /* + * Close all identifiers. + */ + H5Sclose(sid); + H5Dclose(did); + H5Fclose(fid2); + + /* + * Reopen both files + */ + fid1 = H5Fopen(FILE1, H5F_ACC_RDONLY, H5P_DEFAULT); + fid2 = H5Fopen(FILE2, H5F_ACC_RDONLY, H5P_DEFAULT); + + /* + * Mount second file under G in the first file. + */ + H5Fmount(fid1, "/G", fid2, H5P_DEFAULT); + + /* + * Access dataset D in the first file under /G/D name. + */ + did = H5Dopen2(fid1, "/G/D", H5P_DEFAULT); + tid = H5Dget_type(did); + status = H5Dread(did, tid, H5S_ALL, H5S_ALL, H5P_DEFAULT, bm_out); + + /* + * Print out the data. + */ + for(i=0; i<NX; i++){ + for(j=0; j<NY; j++) + printf(" %d", bm_out[i][j]); + printf("\n"); + } + + /* + * Close all identifers + */ + H5Tclose(tid); + H5Dclose(did); + + /* + * Unmounting second file + */ + H5Funmount(fid1, "/G"); + + /* + * Close both files + */ + H5Fclose(fid1); + H5Fclose(fid2); + + return 0; +} + + + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_rdwt.c b/privatemodules/nc4/share/hdf5_examples/c/h5_rdwt.c new file mode 100644 index 0000000000000000000000000000000000000000..d5444e0b98aad62625ef9475c7e468d4ea33f482 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_rdwt.c @@ -0,0 +1,53 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates how to write and read data in an existing + * dataset. It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" +#define FILE "dset.h5" + +int main() { + + hid_t file_id, dataset_id; /* identifiers */ + herr_t status; + int i, j, dset_data[4][6]; + + /* Initialize the dataset. */ + for (i = 0; i < 4; i++) + for (j = 0; j < 6; j++) + dset_data[i][j] = i * 6 + j + 1; + + /* Open an existing file. */ + file_id = H5Fopen(FILE, H5F_ACC_RDWR, H5P_DEFAULT); + + /* Open an existing dataset. */ + dataset_id = H5Dopen2(file_id, "/dset", H5P_DEFAULT); + + /* Write the dataset. */ + status = H5Dwrite(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + dset_data); + + status = H5Dread(dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, + dset_data); + + /* Close the dataset. */ + status = H5Dclose(dataset_id); + + /* Close the file. */ + status = H5Fclose(file_id); +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_read.c b/privatemodules/nc4/share/hdf5_examples/c/h5_read.c new file mode 100644 index 0000000000000000000000000000000000000000..6fe75be15d139650aaba0809cc964af079daaedd --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_read.c @@ -0,0 +1,151 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example reads hyperslab from the SDS.h5 file + * created by h5_write.c program into two-dimensional + * plane of the three-dimensional array. + * Information about dataset in the SDS.h5 file is obtained. + */ + +#include "hdf5.h" + +#define H5FILE_NAME "SDS.h5" +#define DATASETNAME "IntArray" +#define NX_SUB 3 /* hyperslab dimensions */ +#define NY_SUB 4 +#define NX 7 /* output buffer dimensions */ +#define NY 7 +#define NZ 3 +#define RANK 2 +#define RANK_OUT 3 + +int +main (void) +{ + hid_t file, dataset; /* handles */ + hid_t datatype, dataspace; + hid_t memspace; + H5T_class_t t_class; /* data type class */ + H5T_order_t order; /* data order */ + size_t size; /* + * size of the data element + * stored in file + */ + hsize_t dimsm[3]; /* memory space dimensions */ + hsize_t dims_out[2]; /* dataset dimensions */ + herr_t status; + + int data_out[NX][NY][NZ ]; /* output buffer */ + + hsize_t count[2]; /* size of the hyperslab in the file */ + hsize_t offset[2]; /* hyperslab offset in the file */ + hsize_t count_out[3]; /* size of the hyperslab in memory */ + hsize_t offset_out[3]; /* hyperslab offset in memory */ + int i, j, k, status_n, rank; + + for (j = 0; j < NX; j++) { + for (i = 0; i < NY; i++) { + for (k = 0; k < NZ ; k++) + data_out[j][i][k] = 0; + } + } + + /* + * Open the file and the dataset. + */ + file = H5Fopen(H5FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT); + dataset = H5Dopen2(file, DATASETNAME, H5P_DEFAULT); + + /* + * Get datatype and dataspace handles and then query + * dataset class, order, size, rank and dimensions. + */ + datatype = H5Dget_type(dataset); /* datatype handle */ + t_class = H5Tget_class(datatype); + if (t_class == H5T_INTEGER) printf("Data set has INTEGER type \n"); + order = H5Tget_order(datatype); + if (order == H5T_ORDER_LE) printf("Little endian order \n"); + + size = H5Tget_size(datatype); + printf(" Data size is %d \n", (int)size); + + dataspace = H5Dget_space(dataset); /* dataspace handle */ + rank = H5Sget_simple_extent_ndims(dataspace); + status_n = H5Sget_simple_extent_dims(dataspace, dims_out, NULL); + printf("rank %d, dimensions %lu x %lu \n", rank, + (unsigned long)(dims_out[0]), (unsigned long)(dims_out[1])); + + /* + * Define hyperslab in the dataset. + */ + offset[0] = 1; + offset[1] = 2; + count[0] = NX_SUB; + count[1] = NY_SUB; + status = H5Sselect_hyperslab(dataspace, H5S_SELECT_SET, offset, NULL, + count, NULL); + + /* + * Define the memory dataspace. + */ + dimsm[0] = NX; + dimsm[1] = NY; + dimsm[2] = NZ ; + memspace = H5Screate_simple(RANK_OUT,dimsm,NULL); + + /* + * Define memory hyperslab. + */ + offset_out[0] = 3; + offset_out[1] = 0; + offset_out[2] = 0; + count_out[0] = NX_SUB; + count_out[1] = NY_SUB; + count_out[2] = 1; + status = H5Sselect_hyperslab(memspace, H5S_SELECT_SET, offset_out, NULL, + count_out, NULL); + + /* + * Read data from hyperslab in the file into the hyperslab in + * memory and display. + */ + status = H5Dread(dataset, H5T_NATIVE_INT, memspace, dataspace, + H5P_DEFAULT, data_out); + for (j = 0; j < NX; j++) { + for (i = 0; i < NY; i++) printf("%d ", data_out[j][i][0]); + printf("\n"); + } + /* + * 0 0 0 0 0 0 0 + * 0 0 0 0 0 0 0 + * 0 0 0 0 0 0 0 + * 3 4 5 6 0 0 0 + * 4 5 6 7 0 0 0 + * 5 6 7 8 0 0 0 + * 0 0 0 0 0 0 0 + */ + + /* + * Close/release resources. + */ + H5Tclose(datatype); + H5Dclose(dataset); + H5Sclose(dataspace); + H5Sclose(memspace); + H5Fclose(file); + + return 0; +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_ref2reg.c b/privatemodules/nc4/share/hdf5_examples/c/h5_ref2reg.c new file mode 100644 index 0000000000000000000000000000000000000000..17ec724690b760cc5810454062a80665612d7b10 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_ref2reg.c @@ -0,0 +1,210 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +/* + This program shows how to create, store and dereference references + to the dataset regions. + + It creates a file and writes a two dimensional integer dataset + to it. Then it creates a dataset to store region references in. It + stores references to a hyperslab and 3 points selected (for the + integer dataset previously created). + + It then reopens the references dataset, reads and dereferences the + region references, and then reads and displays the selected hyperslab + and selected elements data from the integer dataset. +*/ + +#include "hdf5.h" + +#define filename "REF_REG.h5" +#define dsetnamev "MATRIX" +#define dsetnamer "REGION_REFERENCES" + +int main(void) +{ + hid_t file_id; /* file identifier */ + hid_t space_id; /* dataspace identifiers */ + hid_t spacer_id; + hid_t dsetv_id; /*dataset identifiers*/ + hid_t dsetr_id; + hsize_t dims[2] = {2,9}; + hsize_t dimsr[1] = {2}; + int rank = 2; + int rankr =1; + herr_t status; + hdset_reg_ref_t ref[2]; + hdset_reg_ref_t ref_out[2]; + int data[2][9] = {{1,1,2,3,3,4,5,5,6},{1,2,2,3,4,4,5,6,6}}; + int data_out[2][9] = {{0,0,0,0,0,0,0,0,0},{0,0,0,0,0,0,0,0,0}}; + hsize_t start[2]; + hsize_t count[2]; + hsize_t coord[2][3] = {{0, 0, 1}, {6, 0, 8}}; + unsigned num_points = 3; + int i, j; + size_t name_size1, name_size2; + char buf1[10], buf2[10]; + + /* + * Create file with default file access and file creation properties. + */ + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create dataspace for datasets. + */ + space_id = H5Screate_simple(rank, dims, NULL); + spacer_id = H5Screate_simple(rankr, dimsr, NULL); + + /* + * Create integer dataset. + */ + dsetv_id = H5Dcreate2(file_id, dsetnamev, H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Write data to the dataset. + */ + status = H5Dwrite(dsetv_id, H5T_NATIVE_INT, H5S_ALL , H5S_ALL, H5P_DEFAULT,data); + status = H5Dclose(dsetv_id); + + /* + * Dataset with references. + */ + dsetr_id = H5Dcreate2(file_id, dsetnamer, H5T_STD_REF_DSETREG, spacer_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create a reference to the hyperslab. + */ + start[0] = 0; + start[1] = 3; + count[0] = 2; + count[1] = 3; + status = H5Sselect_hyperslab(space_id, H5S_SELECT_SET, start, NULL, count, NULL); + status = H5Rcreate(&ref[0], file_id, dsetnamev, H5R_DATASET_REGION, space_id); + + /* + * Create a reference to elements selection. + */ + status = H5Sselect_none(space_id); + status = H5Sselect_elements(space_id, H5S_SELECT_SET, num_points, (const hsize_t *)coord); + status = H5Rcreate(&ref[1], file_id, dsetnamev, H5R_DATASET_REGION, space_id); + + /* + * Write dataset with the references. + */ + status = H5Dwrite(dsetr_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, H5P_DEFAULT,ref); + + /* + * Close all objects. + */ + status = H5Sclose(space_id); + status = H5Sclose(spacer_id); + status = H5Dclose(dsetr_id); + status = H5Fclose(file_id); + + /* + * Reopen the file to read selections back. + */ + file_id = H5Fopen(filename, H5F_ACC_RDWR, H5P_DEFAULT); + + /* + * Reopen the dataset with object references and read references + * to the buffer. + */ + dsetr_id = H5Dopen2(file_id, dsetnamer, H5P_DEFAULT); + + status = H5Dread(dsetr_id, H5T_STD_REF_DSETREG, H5S_ALL, H5S_ALL, + H5P_DEFAULT, ref_out); + + /* + * Dereference the first reference. + */ + dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, &ref_out[0]); + /* + * Get name of the dataset the first region reference points to + * using H5Rget_name + */ + name_size1 = H5Rget_name(dsetr_id, H5R_DATASET_REGION, &ref_out[0], (char*)buf1, 10); + printf(" Dataset's name (returned by H5Rget_name) the reference points to is %s, name length is %d\n", buf1, (int)name_size1); + /* + * Get name of the dataset the first region reference points to + * using H5Iget_name + */ + name_size2 = H5Iget_name(dsetv_id, (char*)buf2, 10); + printf(" Dataset's name (returned by H5Iget_name) the reference points to is %s, name length is %d\n", buf2, (int)name_size2); + + space_id = H5Rget_region(dsetr_id, H5R_DATASET_REGION,&ref_out[0]); + + /* + * Read and display hyperslab selection from the dataset. + */ + + status = H5Dread(dsetv_id, H5T_NATIVE_INT, H5S_ALL, space_id, + H5P_DEFAULT, data_out); + printf("Selected hyperslab: "); + for (i = 0; i <= 1; i++) + { + printf("\n"); + for (j = 0; j <= 8; j++) + printf("%d ", data_out[i][j]); + } + printf("\n"); + + /* + * Close dataspace and the dataset. + */ + status = H5Sclose(space_id); + status = H5Dclose(dsetv_id); + + /* + * Initialize data_out array again to get point selection. + */ + for (i = 0; i <= 1; i++) + for (j = 0; j <= 8; j++) + data_out[i][j] = 0; + + /* + * Dereference the second reference. + */ + dsetv_id = H5Rdereference(dsetr_id, H5R_DATASET_REGION, &ref_out[1]); + space_id = H5Rget_region(dsetv_id, H5R_DATASET_REGION,&ref_out[1]); + + /* + * Read selected data from the dataset. + */ + + status = H5Dread(dsetv_id, H5T_NATIVE_INT, H5S_ALL, space_id, + H5P_DEFAULT, data_out); + printf("Selected points: "); + for (i = 0; i <= 1; i++) + { + printf("\n"); + for (j = 0; j <= 8; j++) + printf("%d ", data_out[i][j]); + } + printf("\n"); + + /* + * Close dataspace and the dataset. + */ + status = H5Sclose(space_id); + status = H5Dclose(dsetv_id); + status = H5Dclose(dsetr_id); + status = H5Fclose(file_id); + + return 0; +} + + + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_reference.c b/privatemodules/nc4/share/hdf5_examples/c/h5_reference.c new file mode 100644 index 0000000000000000000000000000000000000000..31aa2cf409f4ab43fa0688b4e7c09bf5de8df16d --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_reference.c @@ -0,0 +1,149 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + /* + * This program illustrates how references to objects can be used. + * Program creates a dataset and a group in a file. It also creates + * second dataset, and references to the first dataset and the group + * are stored in it. + * Program reopens the file and reads dataset with the references. + * References are used to open the objects. Information about the + * objects is displayed. + */ + +#include <stdlib.h> + +#include "hdf5.h" + +#define H5FILE_NAME "refere.h5" + +int +main(void) { + hid_t fid; /* File, group, datasets, datatypes */ + hid_t gid_a; /* and dataspaces identifiers */ + hid_t did_b, sid_b, tid_b; + hid_t did_r, tid_r, sid_r; + H5O_type_t obj_type; + herr_t status; + + hobj_ref_t *wbuf; /* buffer to write to disk */ + hobj_ref_t *rbuf; /* buffer to read from disk */ + + + hsize_t dim_r[1]; + hsize_t dim_b[2]; + + /* + * Create a file using default properties. + */ + fid = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create group "A" in the file. + */ + gid_a = H5Gcreate2(fid, "A", H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create dataset "B" in the file. + */ + dim_b[0] = 2; + dim_b[1] = 6; + sid_b = H5Screate_simple(2, dim_b, NULL); + did_b = H5Dcreate2(fid, "B", H5T_NATIVE_FLOAT, sid_b, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create dataset "R" to store references to the objects "A" and "B". + */ + dim_r[0] = 2; + sid_r = H5Screate_simple(1, dim_r, NULL); + tid_r = H5Tcopy(H5T_STD_REF_OBJ); + did_r = H5Dcreate2(fid, "R", tid_r, sid_r, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Allocate write and read buffers. + */ + wbuf = (hobj_ref_t *)malloc(sizeof(hobj_ref_t) * 2); + rbuf = (hobj_ref_t *)malloc(sizeof(hobj_ref_t) * 2); + + /* + * Create references to the group "A" and dataset "B" + * and store them in the wbuf. + */ + H5Rcreate(&wbuf[0], fid, "A", H5R_OBJECT, -1); + H5Rcreate(&wbuf[1], fid, "B", H5R_OBJECT, -1); + + /* + * Write dataset R using default transfer properties. + */ + status = H5Dwrite(did_r, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, wbuf); + + /* + * Close all objects. + */ + H5Gclose(gid_a); + + H5Sclose(sid_b); + H5Dclose(did_b); + + H5Tclose(tid_r); + H5Sclose(sid_r); + H5Dclose(did_r); + + H5Fclose(fid); + + /* + * Reopen the file. + */ + fid = H5Fopen(H5FILE_NAME, H5F_ACC_RDWR, H5P_DEFAULT); + + /* + * Open and read dataset "R". + */ + did_r = H5Dopen2(fid, "R", H5P_DEFAULT); + status = H5Dread(did_r, H5T_STD_REF_OBJ, H5S_ALL, H5S_ALL, H5P_DEFAULT, rbuf); + + /* + * Find the type of referenced objects. + */ + status = H5Rget_obj_type2(did_r, H5R_OBJECT, &rbuf[0], &obj_type); + if(obj_type == H5O_TYPE_GROUP) + printf("First dereferenced object is a group. \n"); + + status = H5Rget_obj_type2(did_r, H5R_OBJECT, &rbuf[1], &obj_type); + if(obj_type == H5O_TYPE_DATASET) + printf("Second dereferenced object is a dataset. \n"); + + /* + * Get datatype of the dataset "B" + */ + did_b = H5Rdereference(did_r, H5R_OBJECT, &rbuf[1]); + tid_b = H5Dget_type(did_b); + if(H5Tequal(tid_b, H5T_NATIVE_FLOAT)) + printf("Datatype of the dataset is H5T_NATIVE_FLOAT.\n"); + printf("\n"); + + /* + * Close all objects and free memory buffers. + */ + H5Dclose(did_r); + H5Dclose(did_b); + H5Tclose(tid_b); + H5Fclose(fid); + free(rbuf); + free(wbuf); + + return 0; + } + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_select.c b/privatemodules/nc4/share/hdf5_examples/c/h5_select.c new file mode 100644 index 0000000000000000000000000000000000000000..ceb9c2c663890ebe88d835449fce63dde9c68777 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_select.c @@ -0,0 +1,334 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This program shows how the H5Sselect_hyperslab and H5Sselect_elements + * functions are used to write selected data from memory to the file. + * Program takes 48 elements from the linear buffer and writes them into + * the matrix using 3x2 blocks, (4,3) stride and (2,4) count. + * Then four elements of the matrix are overwritten with the new values and + * file is closed. Program reopens the file and selects the union of two + * hyperslabs in the dataset in the file. Then it reads the selection into the + * memory dataset preserving the shape of the selection. + */ + +#include "hdf5.h" + +#define H5FILE_NAME "Select.h5" + +#define MSPACE1_RANK 1 /* Rank of the first dataset in memory */ +#define MSPACE1_DIM 50 /* Dataset size in memory */ + +#define MSPACE2_RANK 1 /* Rank of the second dataset in memory */ +#define MSPACE2_DIM 4 /* Dataset size in memory */ + +#define FSPACE_RANK 2 /* Dataset rank as it is stored in the file */ +#define FSPACE_DIM1 8 /* Dimension sizes of the dataset as it is + stored in the file */ +#define FSPACE_DIM2 12 + + /* We will read dataset back from the file + to the dataset in memory with these + dataspace parameters. */ +#define MSPACE_RANK 2 +#define MSPACE_DIM1 8 +#define MSPACE_DIM2 9 + +#define NPOINTS 4 /* Number of points that will be selected + and overwritten */ +int +main (void) +{ + + hid_t file, dataset; /* File and dataset identifiers */ + hid_t mid1, mid2, mid, fid; /* Dataspace identifiers */ + hid_t plist; /* Dataset property list identifier */ + + hsize_t dim1[] = {MSPACE1_DIM}; /* Dimension size of the first dataset + (in memory) */ + hsize_t dim2[] = {MSPACE2_DIM}; /* Dimension size of the second dataset + (in memory */ + hsize_t fdim[] = {FSPACE_DIM1, FSPACE_DIM2}; + /* Dimension sizes of the dataset (on disk) */ + hsize_t mdim[] = {MSPACE_DIM1, MSPACE_DIM2}; /* Dimension sizes of the + dataset in memory when we + read selection from the + dataset on the disk */ + + hsize_t start[2]; /* Start of hyperslab */ + hsize_t stride[2]; /* Stride of hyperslab */ + hsize_t count[2]; /* Block count */ + hsize_t block[2]; /* Block sizes */ + + hsize_t coord[NPOINTS][FSPACE_RANK]; /* Array to store selected points + from the file dataspace */ + herr_t ret; + unsigned i,j; + int fillvalue = 0; /* Fill value for the dataset */ + + int matrix_out[MSPACE_DIM1][MSPACE_DIM2]; /* Buffer to read from the + dataset */ + int vector[MSPACE1_DIM]; + int values[] = {53, 59, 61, 67}; /* New values to be written */ + + /* + * Buffers' initialization. + */ + vector[0] = vector[MSPACE1_DIM - 1] = -1; + for(i = 1; i < MSPACE1_DIM - 1; i++) + vector[i] = i; + + /* + * Create a file. + */ + file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Create property list for a dataset and set up fill values. + */ + plist = H5Pcreate(H5P_DATASET_CREATE); + ret = H5Pset_fill_value(plist, H5T_NATIVE_INT, &fillvalue); + + /* + * Create dataspace for the dataset in the file. + */ + fid = H5Screate_simple(FSPACE_RANK, fdim, NULL); + + /* + * Create dataset in the file. Notice that creation + * property list plist is used. + */ + dataset = H5Dcreate2(file, "Matrix in file", H5T_NATIVE_INT, fid, H5P_DEFAULT, plist, H5P_DEFAULT); + + /* + * Select hyperslab for the dataset in the file, using 3x2 blocks, + * (4,3) stride and (2,4) count starting at the position (0,1). + */ + start[0] = 0; start[1] = 1; + stride[0] = 4; stride[1] = 3; + count[0] = 2; count[1] = 4; + block[0] = 3; block[1] = 2; + ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, start, stride, count, block); + + /* + * Create dataspace for the first dataset. + */ + mid1 = H5Screate_simple(MSPACE1_RANK, dim1, NULL); + + /* + * Select hyperslab. + * We will use 48 elements of the vector buffer starting at the second element. + * Selected elements are 1 2 3 . . . 48 + */ + start[0] = 1; + stride[0] = 1; + count[0] = 48; + block[0] = 1; + ret = H5Sselect_hyperslab(mid1, H5S_SELECT_SET, start, stride, count, block); + + /* + * Write selection from the vector buffer to the dataset in the file. + * + * File dataset should look like this: + * 0 1 2 0 3 4 0 5 6 0 7 8 + * 0 9 10 0 11 12 0 13 14 0 15 16 + * 0 17 18 0 19 20 0 21 22 0 23 24 + * 0 0 0 0 0 0 0 0 0 0 0 0 + * 0 25 26 0 27 28 0 29 30 0 31 32 + * 0 33 34 0 35 36 0 37 38 0 39 40 + * 0 41 42 0 43 44 0 45 46 0 47 48 + * 0 0 0 0 0 0 0 0 0 0 0 0 + */ + ret = H5Dwrite(dataset, H5T_NATIVE_INT, mid1, fid, H5P_DEFAULT, vector); + + /* + * Reset the selection for the file dataspace fid. + */ + ret = H5Sselect_none(fid); + + /* + * Create dataspace for the second dataset. + */ + mid2 = H5Screate_simple(MSPACE2_RANK, dim2, NULL); + + /* + * Select sequence of NPOINTS points in the file dataspace. + */ + coord[0][0] = 0; coord[0][1] = 0; + coord[1][0] = 3; coord[1][1] = 3; + coord[2][0] = 3; coord[2][1] = 5; + coord[3][0] = 5; coord[3][1] = 6; + + ret = H5Sselect_elements(fid, H5S_SELECT_SET, NPOINTS, (const hsize_t *)coord); + + /* + * Write new selection of points to the dataset. + */ + ret = H5Dwrite(dataset, H5T_NATIVE_INT, mid2, fid, H5P_DEFAULT, values); + + /* + * File dataset should look like this: + * 53 1 2 0 3 4 0 5 6 0 7 8 + * 0 9 10 0 11 12 0 13 14 0 15 16 + * 0 17 18 0 19 20 0 21 22 0 23 24 + * 0 0 0 59 0 61 0 0 0 0 0 0 + * 0 25 26 0 27 28 0 29 30 0 31 32 + * 0 33 34 0 35 36 67 37 38 0 39 40 + * 0 41 42 0 43 44 0 45 46 0 47 48 + * 0 0 0 0 0 0 0 0 0 0 0 0 + * + */ + + /* + * Close memory file and memory dataspaces. + */ + ret = H5Sclose(mid1); + ret = H5Sclose(mid2); + ret = H5Sclose(fid); + + /* + * Close dataset. + */ + ret = H5Dclose(dataset); + + /* + * Close the file. + */ + ret = H5Fclose(file); + + /* + * Open the file. + */ + file = H5Fopen(H5FILE_NAME, H5F_ACC_RDONLY, H5P_DEFAULT); + + /* + * Open the dataset. + */ + dataset = H5Dopen2(file, "Matrix in file", H5P_DEFAULT); + + /* + * Get dataspace of the open dataset. + */ + fid = H5Dget_space(dataset); + + /* + * Select first hyperslab for the dataset in the file. The following + * elements are selected: + * 10 0 11 12 + * 18 0 19 20 + * 0 59 0 61 + * + */ + start[0] = 1; start[1] = 2; + block[0] = 1; block[1] = 1; + stride[0] = 1; stride[1] = 1; + count[0] = 3; count[1] = 4; + ret = H5Sselect_hyperslab(fid, H5S_SELECT_SET, start, stride, count, block); + + /* + * Add second selected hyperslab to the selection. + * The following elements are selected: + * 19 20 0 21 22 + * 0 61 0 0 0 + * 27 28 0 29 30 + * 35 36 67 37 38 + * 43 44 0 45 46 + * 0 0 0 0 0 + * Note that two hyperslabs overlap. Common elements are: + * 19 20 + * 0 61 + */ + start[0] = 2; start[1] = 4; + block[0] = 1; block[1] = 1; + stride[0] = 1; stride[1] = 1; + count[0] = 6; count[1] = 5; + ret = H5Sselect_hyperslab(fid, H5S_SELECT_OR, start, stride, count, block); + + /* + * Create memory dataspace. + */ + mid = H5Screate_simple(MSPACE_RANK, mdim, NULL); + + /* + * Select two hyperslabs in memory. Hyperslabs has the same + * size and shape as the selected hyperslabs for the file dataspace. + */ + start[0] = 0; start[1] = 0; + block[0] = 1; block[1] = 1; + stride[0] = 1; stride[1] = 1; + count[0] = 3; count[1] = 4; + ret = H5Sselect_hyperslab(mid, H5S_SELECT_SET, start, stride, count, block); + + start[0] = 1; start[1] = 2; + block[0] = 1; block[1] = 1; + stride[0] = 1; stride[1] = 1; + count[0] = 6; count[1] = 5; + ret = H5Sselect_hyperslab(mid, H5S_SELECT_OR, start, stride, count, block); + + /* + * Initialize data buffer. + */ + for (i = 0; i < MSPACE_DIM1; i++) { + for (j = 0; j < MSPACE_DIM2; j++) + matrix_out[i][j] = 0; + } + /* + * Read data back to the buffer matrix_out. + */ + ret = H5Dread(dataset, H5T_NATIVE_INT, mid, fid, + H5P_DEFAULT, matrix_out); + + /* + * Display the result. Memory dataset is: + * + * 10 0 11 12 0 0 0 0 0 + * 18 0 19 20 0 21 22 0 0 + * 0 59 0 61 0 0 0 0 0 + * 0 0 27 28 0 29 30 0 0 + * 0 0 35 36 67 37 38 0 0 + * 0 0 43 44 0 45 46 0 0 + * 0 0 0 0 0 0 0 0 0 + * 0 0 0 0 0 0 0 0 0 + */ + for(i = 0; i < MSPACE_DIM1; i++) { + for(j = 0; j < MSPACE_DIM2; j++) + printf("%3d ", matrix_out[i][j]); + printf("\n"); + } + + /* + * Close memory file and memory dataspaces. + */ + ret = H5Sclose(mid); + ret = H5Sclose(fid); + + /* + * Close dataset. + */ + ret = H5Dclose(dataset); + + /* + * Close property list + */ + ret = H5Pclose(plist); + + /* + * Close the file. + */ + ret = H5Fclose(file); + + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_shared_mesg.c b/privatemodules/nc4/share/hdf5_examples/c/h5_shared_mesg.c new file mode 100644 index 0000000000000000000000000000000000000000..0c7f2f0cf4cda22af910c30044fe16bb7d10d21b --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_shared_mesg.c @@ -0,0 +1,327 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This program illustrates the usage of HDF5's implicit message sharing + * feature, which can be used to save space when the same messages are + * used many times in a file. + * + * This example creates a standard file using file creation property lists + * to control which messages are shared. Messages that can be shared are + * datatypes, dataspaces, attributes, fill values, and filter pipelines. + * + */ + +#include <stdlib.h> + +#include "hdf5.h" + +#define NUM_DATASETS 40 +const char* DSETNAME[] = { + "dataset0", "dataset1", + "dataset2", "dataset3", + "dataset4", "dataset5", + "dataset6", "dataset7", + "dataset8", "dataset9", + "dataset10", "dataset11", + "dataset12", "dataset13", + "dataset14", "dataset15", + "dataset16", "dataset17", + "dataset18", "dataset19", + "dataset20", "dataset21", + "dataset22", "dataset23", + "dataset24", "dataset25", + "dataset26", "dataset27", + "dataset28", "dataset29", + "dataset30", "dataset31", + "dataset32", "dataset33", + "dataset34", "dataset35", + "dataset36", "dataset37", + "dataset38", "dataset39", + NULL +}; + +herr_t create_standard_file(const char *filename, hid_t fcpl); + +/*------------------------------------------------------------------------- + * Function: main + * + * Purpose: Enables shared messages using File Creation Property Lists + * and creates files using these settings. + * + *------------------------------------------------------------------------- + */ +int main(void) +{ + hid_t fcpl_id; + herr_t ret; + + /* Create a file creation property list */ + fcpl_id = H5Pcreate(H5P_FILE_CREATE); + if(fcpl_id < 0) goto error; + + /* The file creation property list is the default list right now. + * Create a file using it (this is the same as creating a file with + * H5P_DEFAULT). Implicit shared messages will be disabled. + */ + ret = create_standard_file("default_file.h5", fcpl_id); + if(ret < 0) goto error; + + /* There are five kinds of messages that can be shared: datatypes, + * dataspaces, attributes, fill values, and filter pipelines. + * Shared messages are stored in up to five "indexes," where each + * index can contain one or more types of message. Using more indexes + * will result in more overhead for sharing, but can also provide + * more "tunability" and may affect caching performance. + */ + /* To begin with, use only one index. */ + ret = H5Pset_shared_mesg_nindexes(fcpl_id, 1); + if(ret < 0) goto error; + + /* Each index has a "minimum message size" for a message of that + * type to be shared. Since sharing a message creates some overhead, + * this is to prevent this overhead for very small messages when little + * space would be saved by sharing them anyway. + * If the content of the file isn't known beforehand, it's probably best + * to set the minimum size "high"; over 100 or 200 bytes. If the content + * of the file is known, this value can be used to trade space saved for + * performance lost. The smaller this value is, the more messages will + * be shared, so the more overhead will be incurred. + * This value is in bytes. A shared message involves about 30 bytes of + * overhead. Note that even messages that are only written once will + * require this overhead (since they "might" be shared in the future), + * so setting the minimum size too low may result in a file actually growing + * in size. + * For this example case, we'll set the minimum sharing size to be small + * since we know that every message the "standard" file uses will be + * repeated many times. + */ + /* The other property that each index has is the kinds of messages that + * it holds. For the simple case, we'll put every message that could be + * shared in this single index. + */ + ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_SHMESG_ALL_FLAG, 40); + if(ret < 0) goto error; + + /* The other property that can be set for shared messages is the + * list/B-tree cutoff for the indexes. + * Each shared message index beins life as a simple list of messages + * and becomes a B-tree when "too many" messages are written to it. + * This keeps the indexes simple when only a few messages are shared, + * but allows them to scale for many messages. If many messages are + * deleted from the B-tree, it scales back down into a list. + * A "resonable" setting for maximum list size and minimum btree size + * depends on what kinds of messages will be stored in the file. + * These numbers are the same for all indexes in a file. + * We'll guess at some numbers, though we could just as easily have kept + * the default values. The first value is the maximum list size, the + * second the minimum B-tree size. + */ + ret = H5Pset_shared_mesg_phase_change(fcpl_id, 30, 20); + if(ret < 0) goto error; + + /* Now create a file with this property list. After the FCPL is used, + * everything is automatic; messages will be shared and this will be + * completely transparent to the user. Even if the file is closed + * and re-opened, this settings will be saved and applied to messages + * written later. + */ + ret = create_standard_file("one_index_file.h5", fcpl_id); + if(ret < 0) goto error; + + /* Now try some variations on this. The FCPL hasn't been closed, so + * we don't need to re-create it. + * For instance, if we set the index to only share very large + * messages, none of the messages we write will qualify and the file + * will be about the same size as a normal file (with just a little extra + * overhead). + */ + ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_SHMESG_ALL_FLAG, 1000); + if(ret < 0) goto error; + + ret = create_standard_file("only_huge_mesgs_file.h5", fcpl_id); + if(ret < 0) goto error; + + + /* Or, suppose we only wanted to shared dataspaces and + * attributes (which might make sense if we were going to use committed + * datatypes). We could change the flags on the index: + */ + ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_SHMESG_SDSPACE_FLAG | H5O_SHMESG_ATTR_FLAG, 40); + if(ret < 0) goto error; + + ret = create_standard_file("only_dspaces_and_attrs_file.h5", fcpl_id); + if(ret < 0) goto error; + + + /* We could create a second index and put attributes in it to separate them + * from datatypes and dataspaces (and then run some performance metrics to + * see whether this improved caching performance). + */ + ret = H5Pset_shared_mesg_nindexes(fcpl_id, 2); + if(ret < 0) goto error; + ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_SHMESG_DTYPE_FLAG | H5O_SHMESG_SDSPACE_FLAG, 40); + if(ret < 0) goto error; + ret = H5Pset_shared_mesg_index(fcpl_id, 1, H5O_SHMESG_ATTR_FLAG, 40); + if(ret < 0) goto error; + + ret = create_standard_file("separate_indexes_file.h5", fcpl_id); + if(ret < 0) goto error; + + /* We can try twiddling the "phase change" values and see what it does to + * the file size. Since there's only a few different messages (two + * datatypes, two dataspaces, and one attribute), using smaller lists will + * save some space. + */ + ret = H5Pset_shared_mesg_nindexes(fcpl_id, 1); + if(ret < 0) goto error; + ret = H5Pset_shared_mesg_index(fcpl_id, 0, H5O_SHMESG_ALL_FLAG, 40); + if(ret < 0) goto error; + + ret = H5Pset_shared_mesg_phase_change(fcpl_id, 5, 0); + if(ret < 0) goto error; + + ret = create_standard_file("small_lists_file.h5", fcpl_id); + if(ret < 0) goto error; + + /* Or we could create indexes that are never lists, but are created as + * B-trees. We do this by setting the "maximum list size" to zero. + */ + ret = H5Pset_shared_mesg_phase_change(fcpl_id, 0, 0); + if(ret < 0) goto error; + + ret = create_standard_file("btrees_file.h5", fcpl_id); + if(ret < 0) goto error; + + + /* Obviously there are a lot more permutations of these options possible. + * Performance will often be a tradeoff of speed for space, but will + * depend a great deal on the specific application. If performance is + * important, the best thing to do is to play with these settings to find + * the ones that work best for you. + * Please let The HDF Group (help@hdfgroup.org) know what you find! + */ + + + /* Close the property list */ + ret = H5Pclose(fcpl_id); + if(ret < 0) goto error; + return 0; + +error: + return -1; +} + +/*------------------------------------------------------------------------- + * Function: create_standard_file + * + * Purpose: A helper functon for the example. Creates an HDF5 file + * with many repeated messages using the file creation + * property list FCPL. + * + * This function only uses datatypes, dataspaces, and + * attributes. Fill values and filter pipelines can also + * be shared in the same way (i.e., by enabling sharing in + * the FCPL and writing the same message more than once). + *------------------------------------------------------------------------- + */ +herr_t +create_standard_file(const char *filename, hid_t fcpl_id) +{ + hid_t file_id=-1; + hid_t type_id=-1, temp_type_id=-1; + hsize_t dims[] = {10, 9, 8, 7, 6, 5, 4, 3, 2, 1}; + hid_t space_id=-1; + hid_t attr_type_id = -1; + hid_t attr_space_id = -1; + int attr_data[] = {1,2,3,4,5,6,7,8,9,0}; + hid_t dset_id=-1; + hid_t attr_id=-1; + int x; + herr_t ret; + + /* Create the file */ + file_id = H5Fcreate(filename, H5F_ACC_TRUNC, fcpl_id, H5P_DEFAULT); + if(file_id < 0) goto error; + + /* Create the datatype we'll be using. Generally, sharing messages + * is most useful when the message is complex and takes more space on + * disk, so this type will be an array type rather than an atomic type. + * However, any type can be shared. + */ + temp_type_id = H5Tarray_create2(H5T_NATIVE_INT, 2, dims); + if(temp_type_id < 0) goto error; + type_id = H5Tarray_create2(temp_type_id, 2, dims); + if(type_id < 0) goto error; + ret = H5Tclose(temp_type_id); + if(ret < 0) goto error; + + /* Create the dataspace we'll be using. + * Again, create a more complex dataspace so that more space will + * be saved when we share it. + */ + space_id = H5Screate_simple(10, dims, dims); + if(space_id < 0) goto error; + + /* Create a datatype and dataspace for the attributes we'll be creating. + * The datatype will be a single integer, and each attribute will hold + * 10 integers. + */ + attr_type_id = H5Tcopy(H5T_NATIVE_INT); + if(attr_type_id < 0) goto error; + attr_space_id = H5Screate_simple(1, dims, dims); + if(attr_space_id < 0) goto error; + + + /* Begin using the messages many times. Do this by creating datasets + * that use this datatype, dataspace, and have this attribute. + */ + for(x = 0; x < NUM_DATASETS; ++x) { + /* Create a dataset */ + dset_id = H5Dcreate2(file_id, DSETNAME[x], type_id, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + if(dset_id < 0) goto error; + + /* Create an attribute on the dataset */ + attr_id = H5Acreate2(dset_id, "attr_name", attr_type_id, attr_space_id, H5P_DEFAULT, H5P_DEFAULT); + if(attr_id < 0) goto error; + + /* Write data to the attribute */ + ret = H5Awrite(attr_id, H5T_NATIVE_INT, attr_data); + if(ret < 0) goto error; + + ret = H5Aclose(attr_id); + if(ret < 0) goto error; + ret = H5Dclose(dset_id); + if(ret < 0) goto error; + } + + /* Close all open IDs */ + ret = H5Tclose(attr_type_id); + if(ret < 0) goto error; + ret = H5Sclose(attr_space_id); + if(ret < 0) goto error; + ret = H5Tclose(type_id); + if(ret < 0) goto error; + ret = H5Sclose(space_id); + if(ret < 0) goto error; + ret = H5Fclose(file_id); + if(ret < 0) goto error; + + return 0; + +error: + return -1; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_subset.c b/privatemodules/nc4/share/hdf5_examples/c/h5_subset.c new file mode 100644 index 0000000000000000000000000000000000000000..66872ea9fad1041007022a2f10de396f02336da0 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_subset.c @@ -0,0 +1,153 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example illustrates how to read/write a subset of data (a slab) + * from/to a dataset in an HDF5 file. It is used in the HDF5 Tutorial. + */ + +#include "hdf5.h" + +#define FILE "subset.h5" +#define DATASETNAME "IntArray" +#define RANK 2 + +#define DIM0_SUB 3 /* subset dimensions */ +#define DIM1_SUB 4 + + +#define DIM0 8 /* size of dataset */ +#define DIM1 10 + +int +main (void) +{ + hsize_t dims[2], dimsm[2]; + int data[DIM0][DIM1]; /* data to write */ + int sdata[DIM0_SUB][DIM1_SUB]; /* subset to write */ + int rdata[DIM0][DIM1]; /* buffer for read */ + + hid_t file_id, dataset_id; /* handles */ + hid_t dataspace_id, memspace_id; + + herr_t status; + + hsize_t count[2]; /* size of subset in the file */ + hsize_t offset[2]; /* subset offset in the file */ + hsize_t stride[2]; + hsize_t block[2]; + int i, j; + + + /***************************************************************** + * Create a new file with default creation and access properties.* + * Then create a dataset and write data to it and close the file * + * and dataset. * + *****************************************************************/ + + file_id = H5Fcreate (FILE, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + dims[0] = DIM0; + dims[1] = DIM1; + dataspace_id = H5Screate_simple (RANK, dims, NULL); + + dataset_id = H5Dcreate2 (file_id, DATASETNAME, H5T_STD_I32BE, dataspace_id, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + + for (j = 0; j < DIM0; j++) { + for (i = 0; i < DIM1; i++) + if (i< (DIM1/2)) + data[j][i] = 1; + else + data[j][i] = 2; + } + + status = H5Dwrite (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, data); + + printf ("\nData Written to File:\n"); + for (i = 0; i<DIM0; i++){ + for (j = 0; j<DIM1; j++) + printf (" %i", data[i][j]); + printf ("\n"); + } + status = H5Sclose (dataspace_id); + status = H5Dclose (dataset_id); + status = H5Fclose (file_id); + + + /***************************************************** + * Reopen the file and dataset and write a subset of * + * values to the dataset. + *****************************************************/ + + file_id = H5Fopen (FILE, H5F_ACC_RDWR, H5P_DEFAULT); + dataset_id = H5Dopen2 (file_id, DATASETNAME, H5P_DEFAULT); + + /* Specify size and shape of subset to write. */ + + offset[0] = 1; + offset[1] = 2; + + count[0] = DIM0_SUB; + count[1] = DIM1_SUB; + + stride[0] = 1; + stride[1] = 1; + + block[0] = 1; + block[1] = 1; + + /* Create memory space with size of subset. Get file dataspace + and select subset from file dataspace. */ + + dimsm[0] = DIM0_SUB; + dimsm[1] = DIM1_SUB; + memspace_id = H5Screate_simple (RANK, dimsm, NULL); + + dataspace_id = H5Dget_space (dataset_id); + status = H5Sselect_hyperslab (dataspace_id, H5S_SELECT_SET, offset, + stride, count, block); + + /* Write a subset of data to the dataset, then read the + entire dataset back from the file. */ + + printf ("\nWrite subset to file specifying:\n"); + printf (" offset=1x2 stride=1x1 count=3x4 block=1x1\n"); + for (j = 0; j < DIM0_SUB; j++) { + for (i = 0; i < DIM1_SUB; i++) + sdata[j][i] = 5; + } + + status = H5Dwrite (dataset_id, H5T_NATIVE_INT, memspace_id, + dataspace_id, H5P_DEFAULT, sdata); + + status = H5Dread (dataset_id, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, + H5P_DEFAULT, rdata); + + printf ("\nData in File after Subset is Written:\n"); + for (i = 0; i<DIM0; i++){ + for (j = 0; j<DIM1; j++) + printf (" %i", rdata[i][j]); + printf ("\n"); + } + + status = H5Sclose (memspace_id); + status = H5Sclose (dataspace_id); + status = H5Dclose (dataset_id); + status = H5Fclose (file_id); + +} diff --git a/privatemodules/nc4/share/hdf5_examples/c/h5_write.c b/privatemodules/nc4/share/hdf5_examples/c/h5_write.c new file mode 100644 index 0000000000000000000000000000000000000000..93d40ea728efb180a7a5e73b184204a3e9efa93f --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/h5_write.c @@ -0,0 +1,97 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * This example writes data to the HDF5 file. + * Data conversion is performed during write operation. + */ + +#include "hdf5.h" + +#define H5FILE_NAME "SDS.h5" +#define DATASETNAME "IntArray" +#define NX 5 /* dataset dimensions */ +#define NY 6 +#define RANK 2 + +int +main (void) +{ + hid_t file, dataset; /* file and dataset handles */ + hid_t datatype, dataspace; /* handles */ + hsize_t dimsf[2]; /* dataset dimensions */ + herr_t status; + int data[NX][NY]; /* data to write */ + int i, j; + + /* + * Data and output buffer initialization. + */ + for(j = 0; j < NX; j++) + for(i = 0; i < NY; i++) + data[j][i] = i + j; + /* + * 0 1 2 3 4 5 + * 1 2 3 4 5 6 + * 2 3 4 5 6 7 + * 3 4 5 6 7 8 + * 4 5 6 7 8 9 + */ + + /* + * Create a new file using H5F_ACC_TRUNC access, + * default file creation properties, and default file + * access properties. + */ + file = H5Fcreate(H5FILE_NAME, H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Describe the size of the array and create the data space for fixed + * size dataset. + */ + dimsf[0] = NX; + dimsf[1] = NY; + dataspace = H5Screate_simple(RANK, dimsf, NULL); + + /* + * Define datatype for the data in the file. + * We will store little endian INT numbers. + */ + datatype = H5Tcopy(H5T_NATIVE_INT); + status = H5Tset_order(datatype, H5T_ORDER_LE); + + /* + * Create a new dataset within the file using defined dataspace and + * datatype and default dataset creation properties. + */ + dataset = H5Dcreate2(file, DATASETNAME, datatype, dataspace, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* + * Write the data to the dataset using default transfer properties. + */ + status = H5Dwrite(dataset, H5T_NATIVE_INT, H5S_ALL, H5S_ALL, H5P_DEFAULT, data); + + /* + * Close/release resources. + */ + H5Sclose(dataspace); + H5Tclose(datatype); + H5Dclose(dataset); + H5Fclose(file); + + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/c/ph5example.c b/privatemodules/nc4/share/hdf5_examples/c/ph5example.c new file mode 100644 index 0000000000000000000000000000000000000000..7a41db205ab2881b20d026b389002e1f01cc83db --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/ph5example.c @@ -0,0 +1,1132 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +/* + * Example of using the parallel HDF5 library to access datasets. + * Last revised: April 24, 2001. + * + * This program contains two parts. In the first part, the mpi processes + * collectively create a new parallel HDF5 file and create two fixed + * dimension datasets in it. Then each process writes a hyperslab into + * each dataset in an independent mode. All processes collectively + * close the datasets and the file. + * In the second part, the processes collectively open the created file + * and the two datasets in it. Then each process reads a hyperslab from + * each dataset in an independent mode and prints them out. + * All processes collectively close the datasets and the file. + * + * The need of requirement of parallel file prefix is that in general + * the current working directory in which compiling is done, is not suitable + * for parallel I/O and there is no standard pathname for parallel file + * systems. In some cases, the parallel file name may even needs some + * parallel file type prefix such as: "pfs:/GF/...". Therefore, this + * example requires an explicite parallel file prefix. See the usage + * for more detail. + */ + +#include <assert.h> +#include "hdf5.h" +#include <string.h> +#include <stdlib.h> + +#ifdef H5_HAVE_PARALLEL +/* Temporary source code */ +#define FAIL -1 +/* temporary code end */ + +/* Define some handy debugging shorthands, routines, ... */ +/* debugging tools */ +#define MESG(x)\ + if (verbose) printf("%s\n", x);\ + +#define MPI_BANNER(mesg)\ + {printf("--------------------------------\n");\ + printf("Proc %d: ", mpi_rank); \ + printf("*** %s\n", mesg);\ + printf("--------------------------------\n");} + +#define SYNC(comm)\ + {MPI_BANNER("doing a SYNC"); MPI_Barrier(comm); MPI_BANNER("SYNC DONE");} +/* End of Define some handy debugging shorthands, routines, ... */ + +/* Constants definitions */ +/* 24 is a multiple of 2, 3, 4, 6, 8, 12. Neat for parallel tests. */ +#define SPACE1_DIM1 24 +#define SPACE1_DIM2 24 +#define SPACE1_RANK 2 +#define DATASETNAME1 "Data1" +#define DATASETNAME2 "Data2" +#define DATASETNAME3 "Data3" +/* hyperslab layout styles */ +#define BYROW 1 /* divide into slabs of rows */ +#define BYCOL 2 /* divide into blocks of columns */ + +#define PARAPREFIX "HDF5_PARAPREFIX" /* file prefix environment variable name */ + + +/* dataset data type. Int's can be easily octo dumped. */ +typedef int DATATYPE; + +/* global variables */ +int nerrors = 0; /* errors count */ +#ifndef PATH_MAX +#define PATH_MAX 512 +#endif /* !PATH_MAX */ +char testfiles[2][PATH_MAX]; + + +int mpi_size, mpi_rank; /* mpi variables */ + +/* option flags */ +int verbose = 0; /* verbose, default as no. */ +int doread=1; /* read test */ +int dowrite=1; /* write test */ +int docleanup=1; /* cleanup */ + +/* Prototypes */ +void slab_set(hsize_t start[], hsize_t count[], hsize_t stride[], int mode); +void dataset_fill(hsize_t start[], hsize_t count[], hsize_t stride[], DATATYPE * dataset); +void dataset_print(hsize_t start[], hsize_t count[], hsize_t stride[], DATATYPE * dataset); +int dataset_vrfy(hsize_t start[], hsize_t count[], hsize_t stride[], DATATYPE *dataset, DATATYPE *original); +void phdf5writeInd(char *filename); +void phdf5readInd(char *filename); +void phdf5writeAll(char *filename); +void phdf5readAll(char *filename); +void test_split_comm_access(char filenames[][PATH_MAX]); +int parse_options(int argc, char **argv); +void usage(void); +int mkfilenames(char *prefix); +void cleanup(void); + + +/* + * Setup the dimensions of the hyperslab. + * Two modes--by rows or by columns. + * Assume dimension rank is 2. + */ +void +slab_set(hsize_t start[], hsize_t count[], hsize_t stride[], int mode) +{ + switch (mode){ + case BYROW: + /* Each process takes a slabs of rows. */ + stride[0] = 1; + stride[1] = 1; + count[0] = SPACE1_DIM1/mpi_size; + count[1] = SPACE1_DIM2; + start[0] = mpi_rank*count[0]; + start[1] = 0; + break; + case BYCOL: + /* Each process takes a block of columns. */ + stride[0] = 1; + stride[1] = 1; + count[0] = SPACE1_DIM1; + count[1] = SPACE1_DIM2/mpi_size; + start[0] = 0; + start[1] = mpi_rank*count[1]; + break; + default: + /* Unknown mode. Set it to cover the whole dataset. */ + printf("unknown slab_set mode (%d)\n", mode); + stride[0] = 1; + stride[1] = 1; + count[0] = SPACE1_DIM1; + count[1] = SPACE1_DIM2; + start[0] = 0; + start[1] = 0; + break; + } +} + + +/* + * Fill the dataset with trivial data for testing. + * Assume dimension rank is 2 and data is stored contiguous. + */ +void +dataset_fill(hsize_t start[], hsize_t count[], hsize_t stride[], DATATYPE * dataset) +{ + DATATYPE *dataptr = dataset; + hsize_t i, j; + + /* put some trivial data in the data_array */ + for (i=0; i < count[0]; i++){ + for (j=0; j < count[1]; j++){ + *dataptr++ = (i*stride[0]+start[0])*100 + (j*stride[1]+start[1]+1); + } + } +} + + +/* + * Print the content of the dataset. + */ +void dataset_print(hsize_t start[], hsize_t count[], hsize_t stride[], DATATYPE * dataset) +{ + DATATYPE *dataptr = dataset; + hsize_t i, j; + + /* print the slab read */ + for (i=0; i < count[0]; i++){ + printf("Row %lu: ", (unsigned long)(i*stride[0]+start[0])); + for (j=0; j < count[1]; j++){ + printf("%03d ", *dataptr++); + } + printf("\n"); + } +} + + +/* + * Print the content of the dataset. + */ +int dataset_vrfy(hsize_t start[], hsize_t count[], hsize_t stride[], DATATYPE *dataset, DATATYPE *original) +{ +#define MAX_ERR_REPORT 10 /* Maximum number of errors reported */ + + hsize_t i, j; + int nerr; + + /* print it if verbose */ + if (verbose) + dataset_print(start, count, stride, dataset); + + nerr = 0; + for (i=0; i < count[0]; i++){ + for (j=0; j < count[1]; j++){ + if (*dataset++ != *original++){ + nerr++; + if (nerr <= MAX_ERR_REPORT){ + printf("Dataset Verify failed at [%lu][%lu](row %lu, col %lu): expect %d, got %d\n", + (unsigned long)i, (unsigned long)j, + (unsigned long)(i*stride[0]+start[0]), (unsigned long)(j*stride[1]+start[1]), + *(dataset-1), *(original-1)); + } + } + } + } + if (nerr > MAX_ERR_REPORT) + printf("[more errors ...]\n"); + if (nerr) + printf("%d errors found in dataset_vrfy\n", nerr); + return(nerr); +} + + +/* + * Example of using the parallel HDF5 library to create two datasets + * in one HDF5 files with parallel MPIO access support. + * The Datasets are of sizes (number-of-mpi-processes x DIM1) x DIM2. + * Each process controls only a slab of size DIM1 x DIM2 within each + * dataset. + */ + +void +phdf5writeInd(char *filename) +{ + hid_t fid1; /* HDF5 file IDs */ + hid_t acc_tpl1; /* File access templates */ + hid_t sid1; /* Dataspace ID */ + hid_t file_dataspace; /* File dataspace ID */ + hid_t mem_dataspace; /* memory dataspace ID */ + hid_t dataset1, dataset2; /* Dataset ID */ + hsize_t dims1[SPACE1_RANK] = + {SPACE1_DIM1,SPACE1_DIM2}; /* dataspace dim sizes */ + DATATYPE data_array1[SPACE1_DIM1][SPACE1_DIM2]; /* data buffer */ + + hsize_t start[SPACE1_RANK]; /* for hyperslab setting */ + hsize_t count[SPACE1_RANK], stride[SPACE1_RANK]; /* for hyperslab setting */ + + herr_t ret; /* Generic return value */ + + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Info info = MPI_INFO_NULL; + + if (verbose) + printf("Independent write test on file %s\n", filename); + + /* ------------------- + * START AN HDF5 FILE + * -------------------*/ + /* setup file access template with parallel IO access. */ + acc_tpl1 = H5Pcreate (H5P_FILE_ACCESS); + assert(acc_tpl1 != FAIL); + MESG("H5Pcreate access succeed"); + /* set Parallel access with communicator */ + ret = H5Pset_fapl_mpio(acc_tpl1, comm, info); + assert(ret != FAIL); + MESG("H5Pset_fapl_mpio succeed"); + + /* create the file collectively */ + fid1 = H5Fcreate(filename, H5F_ACC_TRUNC, H5P_DEFAULT, acc_tpl1); + assert(fid1 != FAIL); + MESG("H5Fcreate succeed"); + + /* Release file-access template */ + ret = H5Pclose(acc_tpl1); + assert(ret != FAIL); + + + /* -------------------------- + * Define the dimensions of the overall datasets + * and the slabs local to the MPI process. + * ------------------------- */ + /* setup dimensionality object */ + sid1 = H5Screate_simple(SPACE1_RANK, dims1, NULL); + assert (sid1 != FAIL); + MESG("H5Screate_simple succeed"); + + + /* create a dataset collectively */ + dataset1 = H5Dcreate2(fid1, DATASETNAME1, H5T_NATIVE_INT, sid1, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + assert(dataset1 != FAIL); + MESG("H5Dcreate2 succeed"); + + /* create another dataset collectively */ + dataset2 = H5Dcreate2(fid1, DATASETNAME2, H5T_NATIVE_INT, sid1, + H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + assert(dataset2 != FAIL); + MESG("H5Dcreate2 succeed"); + + + + /* set up dimensions of the slab this process accesses */ + start[0] = mpi_rank*SPACE1_DIM1/mpi_size; + start[1] = 0; + count[0] = SPACE1_DIM1/mpi_size; + count[1] = SPACE1_DIM2; + stride[0] = 1; + stride[1] =1; +if (verbose) + printf("start[]=(%lu,%lu), count[]=(%lu,%lu), total datapoints=%lu\n", + (unsigned long)start[0], (unsigned long)start[1], + (unsigned long)count[0], (unsigned long)count[1], + (unsigned long)(count[0]*count[1])); + + /* put some trivial data in the data_array */ + dataset_fill(start, count, stride, &data_array1[0][0]); + MESG("data_array initialized"); + + /* create a file dataspace independently */ + file_dataspace = H5Dget_space (dataset1); + assert(file_dataspace != FAIL); + MESG("H5Dget_space succeed"); + ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, + count, NULL); + assert(ret != FAIL); + MESG("H5Sset_hyperslab succeed"); + + /* create a memory dataspace independently */ + mem_dataspace = H5Screate_simple (SPACE1_RANK, count, NULL); + assert (mem_dataspace != FAIL); + + /* write data independently */ + ret = H5Dwrite(dataset1, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + H5P_DEFAULT, data_array1); + assert(ret != FAIL); + MESG("H5Dwrite succeed"); + + /* write data independently */ + ret = H5Dwrite(dataset2, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + H5P_DEFAULT, data_array1); + assert(ret != FAIL); + MESG("H5Dwrite succeed"); + + /* release dataspace ID */ + H5Sclose(file_dataspace); + + /* close dataset collectively */ + ret=H5Dclose(dataset1); + assert(ret != FAIL); + MESG("H5Dclose1 succeed"); + ret=H5Dclose(dataset2); + assert(ret != FAIL); + MESG("H5Dclose2 succeed"); + + /* release all IDs created */ + H5Sclose(sid1); + + /* close the file collectively */ + H5Fclose(fid1); +} + +/* Example of using the parallel HDF5 library to read a dataset */ +void +phdf5readInd(char *filename) +{ + hid_t fid1; /* HDF5 file IDs */ + hid_t acc_tpl1; /* File access templates */ + hid_t file_dataspace; /* File dataspace ID */ + hid_t mem_dataspace; /* memory dataspace ID */ + hid_t dataset1, dataset2; /* Dataset ID */ + DATATYPE data_array1[SPACE1_DIM1][SPACE1_DIM2]; /* data buffer */ + DATATYPE data_origin1[SPACE1_DIM1][SPACE1_DIM2]; /* expected data buffer */ + + hsize_t start[SPACE1_RANK]; /* for hyperslab setting */ + hsize_t count[SPACE1_RANK], stride[SPACE1_RANK]; /* for hyperslab setting */ + + herr_t ret; /* Generic return value */ + + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Info info = MPI_INFO_NULL; + + if (verbose) + printf("Independent read test on file %s\n", filename); + + /* setup file access template */ + acc_tpl1 = H5Pcreate (H5P_FILE_ACCESS); + assert(acc_tpl1 != FAIL); + /* set Parallel access with communicator */ + ret = H5Pset_fapl_mpio(acc_tpl1, comm, info); + assert(ret != FAIL); + + + /* open the file collectively */ + fid1=H5Fopen(filename,H5F_ACC_RDWR,acc_tpl1); + assert(fid1 != FAIL); + + /* Release file-access template */ + ret=H5Pclose(acc_tpl1); + assert(ret != FAIL); + + /* open the dataset1 collectively */ + dataset1 = H5Dopen2(fid1, DATASETNAME1, H5P_DEFAULT); + assert(dataset1 != FAIL); + + /* open another dataset collectively */ + dataset2 = H5Dopen2(fid1, DATASETNAME1, H5P_DEFAULT); + assert(dataset2 != FAIL); + + + /* set up dimensions of the slab this process accesses */ + start[0] = mpi_rank*SPACE1_DIM1/mpi_size; + start[1] = 0; + count[0] = SPACE1_DIM1/mpi_size; + count[1] = SPACE1_DIM2; + stride[0] = 1; + stride[1] =1; +if (verbose) + printf("start[]=(%lu,%lu), count[]=(%lu,%lu), total datapoints=%lu\n", + (unsigned long)start[0], (unsigned long)start[1], + (unsigned long)count[0], (unsigned long)count[1], + (unsigned long)(count[0]*count[1])); + + /* create a file dataspace independently */ + file_dataspace = H5Dget_space (dataset1); + assert(file_dataspace != FAIL); + ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, + count, NULL); + assert(ret != FAIL); + + /* create a memory dataspace independently */ + mem_dataspace = H5Screate_simple (SPACE1_RANK, count, NULL); + assert (mem_dataspace != FAIL); + + /* fill dataset with test data */ + dataset_fill(start, count, stride, &data_origin1[0][0]); + + /* read data independently */ + ret = H5Dread(dataset1, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + H5P_DEFAULT, data_array1); + assert(ret != FAIL); + + /* verify the read data with original expected data */ + ret = dataset_vrfy(start, count, stride, &data_array1[0][0], &data_origin1[0][0]); + assert(ret != FAIL); + + /* read data independently */ + ret = H5Dread(dataset2, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + H5P_DEFAULT, data_array1); + assert(ret != FAIL); + + /* verify the read data with original expected data */ + ret = dataset_vrfy(start, count, stride, &data_array1[0][0], &data_origin1[0][0]); + assert(ret == 0); + + /* close dataset collectively */ + ret=H5Dclose(dataset1); + assert(ret != FAIL); + ret=H5Dclose(dataset2); + assert(ret != FAIL); + + /* release all IDs created */ + H5Sclose(file_dataspace); + + /* close the file collectively */ + H5Fclose(fid1); +} + + +/* + * Example of using the parallel HDF5 library to create two datasets + * in one HDF5 file with collective parallel access support. + * The Datasets are of sizes (number-of-mpi-processes x DIM1) x DIM2. + * Each process controls only a slab of size DIM1 x DIM2 within each + * dataset. [Note: not so yet. Datasets are of sizes DIM1xDIM2 and + * each process controls a hyperslab within.] + */ + +void +phdf5writeAll(char *filename) +{ + hid_t fid1; /* HDF5 file IDs */ + hid_t acc_tpl1; /* File access templates */ + hid_t xfer_plist; /* Dataset transfer properties list */ + hid_t sid1; /* Dataspace ID */ + hid_t file_dataspace; /* File dataspace ID */ + hid_t mem_dataspace; /* memory dataspace ID */ + hid_t dataset1, dataset2; /* Dataset ID */ + hsize_t dims1[SPACE1_RANK] = + {SPACE1_DIM1,SPACE1_DIM2}; /* dataspace dim sizes */ + DATATYPE data_array1[SPACE1_DIM1][SPACE1_DIM2]; /* data buffer */ + + hsize_t start[SPACE1_RANK]; /* for hyperslab setting */ + hsize_t count[SPACE1_RANK], stride[SPACE1_RANK]; /* for hyperslab setting */ + + herr_t ret; /* Generic return value */ + + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Info info = MPI_INFO_NULL; + + if (verbose) + printf("Collective write test on file %s\n", filename); + + /* ------------------- + * START AN HDF5 FILE + * -------------------*/ + /* setup file access template with parallel IO access. */ + acc_tpl1 = H5Pcreate (H5P_FILE_ACCESS); + assert(acc_tpl1 != FAIL); + MESG("H5Pcreate access succeed"); + /* set Parallel access with communicator */ + ret = H5Pset_fapl_mpio(acc_tpl1, comm, info); + assert(ret != FAIL); + MESG("H5Pset_fapl_mpio succeed"); + + /* create the file collectively */ + fid1=H5Fcreate(filename,H5F_ACC_TRUNC,H5P_DEFAULT,acc_tpl1); + assert(fid1 != FAIL); + MESG("H5Fcreate succeed"); + + /* Release file-access template */ + ret=H5Pclose(acc_tpl1); + assert(ret != FAIL); + + + /* -------------------------- + * Define the dimensions of the overall datasets + * and create the dataset + * ------------------------- */ + /* setup dimensionality object */ + sid1 = H5Screate_simple (SPACE1_RANK, dims1, NULL); + assert (sid1 != FAIL); + MESG("H5Screate_simple succeed"); + + + /* create a dataset collectively */ + dataset1 = H5Dcreate2(fid1, DATASETNAME1, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + assert(dataset1 != FAIL); + MESG("H5Dcreate2 succeed"); + + /* create another dataset collectively */ + dataset2 = H5Dcreate2(fid1, DATASETNAME2, H5T_NATIVE_INT, sid1, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + assert(dataset2 != FAIL); + MESG("H5Dcreate2 2 succeed"); + + /* + * Set up dimensions of the slab this process accesses. + */ + + /* Dataset1: each process takes a block of rows. */ + slab_set(start, count, stride, BYROW); +if (verbose) + printf("start[]=(%lu,%lu), count[]=(%lu,%lu), total datapoints=%lu\n", + (unsigned long)start[0], (unsigned long)start[1], + (unsigned long)count[0], (unsigned long)count[1], + (unsigned long)(count[0]*count[1])); + + /* create a file dataspace independently */ + file_dataspace = H5Dget_space (dataset1); + assert(file_dataspace != FAIL); + MESG("H5Dget_space succeed"); + ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, + count, NULL); + assert(ret != FAIL); + MESG("H5Sset_hyperslab succeed"); + + /* create a memory dataspace independently */ + mem_dataspace = H5Screate_simple (SPACE1_RANK, count, NULL); + assert (mem_dataspace != FAIL); + + /* fill the local slab with some trivial data */ + dataset_fill(start, count, stride, &data_array1[0][0]); + MESG("data_array initialized"); + if (verbose){ + MESG("data_array created"); + dataset_print(start, count, stride, &data_array1[0][0]); + } + + /* set up the collective transfer properties list */ + xfer_plist = H5Pcreate (H5P_DATASET_XFER); + assert(xfer_plist != FAIL); + ret=H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE); + assert(ret != FAIL); + MESG("H5Pcreate xfer succeed"); + + /* write data collectively */ + ret = H5Dwrite(dataset1, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + xfer_plist, data_array1); + assert(ret != FAIL); + MESG("H5Dwrite succeed"); + + /* release all temporary handles. */ + /* Could have used them for dataset2 but it is cleaner */ + /* to create them again.*/ + H5Sclose(file_dataspace); + H5Sclose(mem_dataspace); + H5Pclose(xfer_plist); + + /* Dataset2: each process takes a block of columns. */ + slab_set(start, count, stride, BYCOL); +if (verbose) + printf("start[]=(%lu,%lu), count[]=(%lu,%lu), total datapoints=%lu\n", + (unsigned long)start[0], (unsigned long)start[1], + (unsigned long)count[0], (unsigned long)count[1], + (unsigned long)(count[0]*count[1])); + + /* put some trivial data in the data_array */ + dataset_fill(start, count, stride, &data_array1[0][0]); + MESG("data_array initialized"); + if (verbose){ + MESG("data_array created"); + dataset_print(start, count, stride, &data_array1[0][0]); + } + + /* create a file dataspace independently */ + file_dataspace = H5Dget_space (dataset1); + assert(file_dataspace != FAIL); + MESG("H5Dget_space succeed"); + ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, + count, NULL); + assert(ret != FAIL); + MESG("H5Sset_hyperslab succeed"); + + /* create a memory dataspace independently */ + mem_dataspace = H5Screate_simple (SPACE1_RANK, count, NULL); + assert (mem_dataspace != FAIL); + + /* fill the local slab with some trivial data */ + dataset_fill(start, count, stride, &data_array1[0][0]); + MESG("data_array initialized"); + if (verbose){ + MESG("data_array created"); + dataset_print(start, count, stride, &data_array1[0][0]); + } + + /* set up the collective transfer properties list */ + xfer_plist = H5Pcreate (H5P_DATASET_XFER); + assert(xfer_plist != FAIL); + ret=H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE); + assert(ret != FAIL); + MESG("H5Pcreate xfer succeed"); + + /* write data independently */ + ret = H5Dwrite(dataset2, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + xfer_plist, data_array1); + assert(ret != FAIL); + MESG("H5Dwrite succeed"); + + /* release all temporary handles. */ + H5Sclose(file_dataspace); + H5Sclose(mem_dataspace); + H5Pclose(xfer_plist); + + + /* + * All writes completed. Close datasets collectively + */ + ret=H5Dclose(dataset1); + assert(ret != FAIL); + MESG("H5Dclose1 succeed"); + ret=H5Dclose(dataset2); + assert(ret != FAIL); + MESG("H5Dclose2 succeed"); + + /* release all IDs created */ + H5Sclose(sid1); + + /* close the file collectively */ + H5Fclose(fid1); +} + +/* + * Example of using the parallel HDF5 library to read two datasets + * in one HDF5 file with collective parallel access support. + * The Datasets are of sizes (number-of-mpi-processes x DIM1) x DIM2. + * Each process controls only a slab of size DIM1 x DIM2 within each + * dataset. [Note: not so yet. Datasets are of sizes DIM1xDIM2 and + * each process controls a hyperslab within.] + */ + +void +phdf5readAll(char *filename) +{ + hid_t fid1; /* HDF5 file IDs */ + hid_t acc_tpl1; /* File access templates */ + hid_t xfer_plist; /* Dataset transfer properties list */ + hid_t file_dataspace; /* File dataspace ID */ + hid_t mem_dataspace; /* memory dataspace ID */ + hid_t dataset1, dataset2; /* Dataset ID */ + DATATYPE data_array1[SPACE1_DIM1][SPACE1_DIM2]; /* data buffer */ + DATATYPE data_origin1[SPACE1_DIM1][SPACE1_DIM2]; /* expected data buffer */ + + hsize_t start[SPACE1_RANK]; /* for hyperslab setting */ + hsize_t count[SPACE1_RANK], stride[SPACE1_RANK]; /* for hyperslab setting */ + + herr_t ret; /* Generic return value */ + + MPI_Comm comm = MPI_COMM_WORLD; + MPI_Info info = MPI_INFO_NULL; + + if (verbose) + printf("Collective read test on file %s\n", filename); + + /* ------------------- + * OPEN AN HDF5 FILE + * -------------------*/ + /* setup file access template with parallel IO access. */ + acc_tpl1 = H5Pcreate (H5P_FILE_ACCESS); + assert(acc_tpl1 != FAIL); + MESG("H5Pcreate access succeed"); + /* set Parallel access with communicator */ + ret = H5Pset_fapl_mpio(acc_tpl1, comm, info); + assert(ret != FAIL); + MESG("H5Pset_fapl_mpio succeed"); + + /* open the file collectively */ + fid1=H5Fopen(filename,H5F_ACC_RDWR,acc_tpl1); + assert(fid1 != FAIL); + MESG("H5Fopen succeed"); + + /* Release file-access template */ + ret=H5Pclose(acc_tpl1); + assert(ret != FAIL); + + + /* -------------------------- + * Open the datasets in it + * ------------------------- */ + /* open the dataset1 collectively */ + dataset1 = H5Dopen2(fid1, DATASETNAME1, H5P_DEFAULT); + assert(dataset1 != FAIL); + MESG("H5Dopen2 succeed"); + + /* open another dataset collectively */ + dataset2 = H5Dopen2(fid1, DATASETNAME1, H5P_DEFAULT); + assert(dataset2 != FAIL); + MESG("H5Dopen2 2 succeed"); + + /* + * Set up dimensions of the slab this process accesses. + */ + + /* Dataset1: each process takes a block of columns. */ + slab_set(start, count, stride, BYCOL); +if (verbose) + printf("start[]=(%lu,%lu), count[]=(%lu,%lu), total datapoints=%lu\n", + (unsigned long)start[0], (unsigned long)start[1], + (unsigned long)count[0], (unsigned long)count[1], + (unsigned long)(count[0]*count[1])); + + /* create a file dataspace independently */ + file_dataspace = H5Dget_space (dataset1); + assert(file_dataspace != FAIL); + MESG("H5Dget_space succeed"); + ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, + count, NULL); + assert(ret != FAIL); + MESG("H5Sset_hyperslab succeed"); + + /* create a memory dataspace independently */ + mem_dataspace = H5Screate_simple (SPACE1_RANK, count, NULL); + assert (mem_dataspace != FAIL); + + /* fill dataset with test data */ + dataset_fill(start, count, stride, &data_origin1[0][0]); + MESG("data_array initialized"); + if (verbose){ + MESG("data_array created"); + dataset_print(start, count, stride, &data_array1[0][0]); + } + + /* set up the collective transfer properties list */ + xfer_plist = H5Pcreate (H5P_DATASET_XFER); + assert(xfer_plist != FAIL); + ret=H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE); + assert(ret != FAIL); + MESG("H5Pcreate xfer succeed"); + + /* read data collectively */ + ret = H5Dread(dataset1, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + xfer_plist, data_array1); + assert(ret != FAIL); + MESG("H5Dread succeed"); + + /* verify the read data with original expected data */ + ret = dataset_vrfy(start, count, stride, &data_array1[0][0], &data_origin1[0][0]); + assert(ret != FAIL); + + /* release all temporary handles. */ + /* Could have used them for dataset2 but it is cleaner */ + /* to create them again.*/ + H5Sclose(file_dataspace); + H5Sclose(mem_dataspace); + H5Pclose(xfer_plist); + + /* Dataset2: each process takes a block of rows. */ + slab_set(start, count, stride, BYROW); +if (verbose) + printf("start[]=(%lu,%lu), count[]=(%lu,%lu), total datapoints=%lu\n", + (unsigned long)start[0], (unsigned long)start[1], + (unsigned long)count[0], (unsigned long)count[1], + (unsigned long)(count[0]*count[1])); + + /* create a file dataspace independently */ + file_dataspace = H5Dget_space (dataset1); + assert(file_dataspace != FAIL); + MESG("H5Dget_space succeed"); + ret=H5Sselect_hyperslab(file_dataspace, H5S_SELECT_SET, start, stride, + count, NULL); + assert(ret != FAIL); + MESG("H5Sset_hyperslab succeed"); + + /* create a memory dataspace independently */ + mem_dataspace = H5Screate_simple (SPACE1_RANK, count, NULL); + assert (mem_dataspace != FAIL); + + /* fill dataset with test data */ + dataset_fill(start, count, stride, &data_origin1[0][0]); + MESG("data_array initialized"); + if (verbose){ + MESG("data_array created"); + dataset_print(start, count, stride, &data_array1[0][0]); + } + + /* set up the collective transfer properties list */ + xfer_plist = H5Pcreate (H5P_DATASET_XFER); + assert(xfer_plist != FAIL); + ret=H5Pset_dxpl_mpio(xfer_plist, H5FD_MPIO_COLLECTIVE); + assert(ret != FAIL); + MESG("H5Pcreate xfer succeed"); + + /* read data independently */ + ret = H5Dread(dataset2, H5T_NATIVE_INT, mem_dataspace, file_dataspace, + xfer_plist, data_array1); + assert(ret != FAIL); + MESG("H5Dread succeed"); + + /* verify the read data with original expected data */ + ret = dataset_vrfy(start, count, stride, &data_array1[0][0], &data_origin1[0][0]); + assert(ret != FAIL); + + /* release all temporary handles. */ + H5Sclose(file_dataspace); + H5Sclose(mem_dataspace); + H5Pclose(xfer_plist); + + + /* + * All reads completed. Close datasets collectively + */ + ret=H5Dclose(dataset1); + assert(ret != FAIL); + MESG("H5Dclose1 succeed"); + ret=H5Dclose(dataset2); + assert(ret != FAIL); + MESG("H5Dclose2 succeed"); + + /* close the file collectively */ + H5Fclose(fid1); +} + +/* + * test file access by communicator besides COMM_WORLD. + * Split COMM_WORLD into two, one (even_comm) contains the original + * processes of even ranks. The other (odd_comm) contains the original + * processes of odd ranks. Processes in even_comm creates a file, then + * cloose it, using even_comm. Processes in old_comm just do a barrier + * using odd_comm. Then they all do a barrier using COMM_WORLD. + * If the file creation and cloose does not do correct collective action + * according to the communicator argument, the processes will freeze up + * sooner or later due to barrier mixed up. + */ +void +test_split_comm_access(char filenames[][PATH_MAX]) +{ + MPI_Comm comm; + MPI_Info info = MPI_INFO_NULL; + int color, mrc; + int newrank, newprocs; + hid_t fid; /* file IDs */ + hid_t acc_tpl; /* File access properties */ + herr_t ret; /* generic return value */ + + if (verbose) + printf("Independent write test on file %s %s\n", + filenames[0], filenames[1]); + + color = mpi_rank%2; + mrc = MPI_Comm_split (MPI_COMM_WORLD, color, mpi_rank, &comm); + assert(mrc==MPI_SUCCESS); + MPI_Comm_size(comm,&newprocs); + MPI_Comm_rank(comm,&newrank); + + if (color){ + /* odd-rank processes */ + mrc = MPI_Barrier(comm); + assert(mrc==MPI_SUCCESS); + }else{ + /* even-rank processes */ + /* setup file access template */ + acc_tpl = H5Pcreate (H5P_FILE_ACCESS); + assert(acc_tpl != FAIL); + + /* set Parallel access with communicator */ + ret = H5Pset_fapl_mpio(acc_tpl, comm, info); + assert(ret != FAIL); + + /* create the file collectively */ + fid=H5Fcreate(filenames[color],H5F_ACC_TRUNC,H5P_DEFAULT,acc_tpl); + assert(fid != FAIL); + MESG("H5Fcreate succeed"); + + /* Release file-access template */ + ret=H5Pclose(acc_tpl); + assert(ret != FAIL); + + ret=H5Fclose(fid); + assert(ret != FAIL); + } + if (mpi_rank == 0){ + mrc = MPI_File_delete(filenames[color], info); + assert(mrc==MPI_SUCCESS); + } +} + +/* + * Show command usage + */ +void +usage(void) +{ + printf("Usage: testphdf5 [-f <prefix>] [-r] [-w] [-v]\n"); + printf("\t-f\tfile prefix for parallel test files.\n"); + printf("\t \te.g. pfs:/PFS/myname\n"); + printf("\t \tcan be set via $" PARAPREFIX ".\n"); + printf("\t \tDefault is current directory.\n"); + printf("\t-c\tno cleanup\n"); + printf("\t-r\tno read\n"); + printf("\t-w\tno write\n"); + printf("\t-v\tverbose on\n"); + printf("\tdefault do write then read\n"); + printf("\n"); +} + + +/* + * compose the test filename with the prefix supplied. + * return code: 0 if no error + * 1 otherwise. + */ +int +mkfilenames(char *prefix) +{ + int i, n; + size_t strsize; + + /* filename will be prefix/ParaEgN.h5 where N is 0 to 9. */ + /* So, string must be big enough to hold the prefix, / and 10 more chars */ + /* and the terminating null. */ + strsize = strlen(prefix) + 12; + if (strsize > PATH_MAX){ + printf("File prefix too long; Use a short path name.\n"); + return(1); + } + n = sizeof(testfiles)/sizeof(testfiles[0]); + if (n > 9){ + printf("Warning: Too many entries in testfiles. " + "Need to adjust the code to accommodate the large size.\n"); + } + for (i=0; i<n; i++){ + sprintf(testfiles[i], "%s/ParaEg%d.h5", prefix, i); + } + return(0); + +} + + +/* + * parse the command line options + */ +int +parse_options(int argc, char **argv){ + int i, n; + + /* initialize testfiles to nulls */ + n = sizeof(testfiles)/sizeof(testfiles[0]); + for (i=0; i<n; i++){ + testfiles[i][0] = '\0'; + } + + while (--argc){ + if (**(++argv) != '-'){ + break; + }else{ + switch(*(*argv+1)){ + case 'f': ++argv; + if (--argc < 1){ + usage(); + nerrors++; + return(1); + } + if (mkfilenames(*argv)){ + nerrors++; + return(1); + } + break; + case 'c': docleanup = 0; /* no cleanup */ + break; + case 'r': doread = 0; + break; + case 'w': dowrite = 0; + break; + case 'v': verbose = 1; + break; + default: usage(); + nerrors++; + return(1); + } + } + } + + /* check the file prefix */ + if (testfiles[0][0] == '\0'){ + /* try get it from environment variable HDF5_PARAPREFIX */ + char *env; + char *env_default = "."; /* default to current directory */ + if ((env=getenv(PARAPREFIX))==NULL){ + env = env_default; + } + mkfilenames(env); + } + return(0); +} + + +/* + * cleanup test files created + */ +void +cleanup(void) +{ + int i, n; + + n = sizeof(testfiles)/sizeof(testfiles[0]); + for (i=0; i<n; i++){ + MPI_File_delete(testfiles[i], MPI_INFO_NULL); + } +} + + +/* Main Program */ +int +main(int argc, char **argv) +{ + int mpi_namelen; + char mpi_name[MPI_MAX_PROCESSOR_NAME]; + int i, n; + + MPI_Init(&argc,&argv); + MPI_Comm_size(MPI_COMM_WORLD,&mpi_size); + MPI_Comm_rank(MPI_COMM_WORLD,&mpi_rank); + MPI_Get_processor_name(mpi_name,&mpi_namelen); + /* Make sure datasets can be divided into equal chunks by the processes */ + if ((SPACE1_DIM1 % mpi_size) || (SPACE1_DIM2 % mpi_size)){ + printf("DIM1(%d) and DIM2(%d) must be multiples of processes (%d)\n", + SPACE1_DIM1, SPACE1_DIM2, mpi_size); + nerrors++; + goto finish; + } + + if (parse_options(argc, argv) != 0) + goto finish; + + /* show test file names */ + if (mpi_rank == 0){ + n = sizeof(testfiles)/sizeof(testfiles[0]); + printf("Parallel test files are:\n"); + for (i=0; i<n; i++){ + printf(" %s\n", testfiles[i]); + } + } + + if (dowrite){ + MPI_BANNER("testing PHDF5 dataset using split communicators..."); + test_split_comm_access(testfiles); + MPI_BANNER("testing PHDF5 dataset independent write..."); + phdf5writeInd(testfiles[0]); + MPI_BANNER("testing PHDF5 dataset collective write..."); + phdf5writeAll(testfiles[1]); + } + if (doread){ + MPI_BANNER("testing PHDF5 dataset independent read..."); + phdf5readInd(testfiles[0]); + MPI_BANNER("testing PHDF5 dataset collective read..."); + phdf5readAll(testfiles[1]); + } + + if (!(dowrite || doread)){ + usage(); + nerrors++; + } + +finish: + if (mpi_rank == 0){ /* only process 0 reports */ + if (nerrors) + printf("***PHDF5 tests detected %d errors***\n", nerrors); + else{ + printf("===================================\n"); + printf("PHDF5 tests finished with no errors\n"); + printf("===================================\n"); + } + } + if (docleanup) + cleanup(); + MPI_Finalize(); + + return(nerrors); +} + +#else /* H5_HAVE_PARALLEL */ +/* dummy program since H5_HAVE_PARALLE is not configured in */ +int +main(void) +{ +printf("No PHDF5 example because parallel is not configured in\n"); +return(0); +} +#endif /* H5_HAVE_PARALLEL */ diff --git a/privatemodules/nc4/share/hdf5_examples/c/run-c-ex.sh b/privatemodules/nc4/share/hdf5_examples/c/run-c-ex.sh new file mode 100755 index 0000000000000000000000000000000000000000..415d2d0dc316c05727a08724478736f736a1f801 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/c/run-c-ex.sh @@ -0,0 +1,142 @@ +#! /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 files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have +# access to either file, you may request a copy from help@hdfgroup.org. + +# +# This file: run-c-ex.sh +# Written by: Larry Knox +# Date: May 11, 2010 +# +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # +# # +# This script will compile and run the c examples from source files installed # +# in .../share/hdf5_examples/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 + +# Where the tool is installed. +# default is relative path to installed location of the tools +prefix="${prefix:-../../../}" +PARALLEL=no # 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 ################## + +if ! test -d red; then + mkdir red +fi +if ! test -d blue; then + mkdir blue +fi +if ! test -d u2w; then + mkdir u2w +fi + +# Run tests +if [ $? -eq 0 ] +then + if (RunTest h5_crtdat &&\ + rm h5_crtdat &&\ + RunTest h5_extend &&\ + rm h5_extend &&\ + RunTest h5_rdwt &&\ + rm h5_rdwt &&\ + RunTest h5_crtatt &&\ + rm h5_crtatt &&\ + RunTest h5_crtgrp &&\ + rm h5_crtgrp &&\ + RunTest h5_crtgrpar &&\ + rm h5_crtgrpar &&\ + RunTest h5_crtgrpd &&\ + rm h5_crtgrpd &&\ + RunTest h5_subset &&\ + rm h5_subset &&\ + RunTest h5_cmprss &&\ + rm h5_cmprss &&\ + RunTest h5_write &&\ + rm h5_write &&\ + RunTest h5_read &&\ + rm h5_read &&\ + RunTest h5_extend_write &&\ + rm h5_extend_write &&\ + RunTest h5_chunk_read &&\ + rm h5_chunk_read &&\ + RunTest h5_compound &&\ + rm h5_compound &&\ + RunTest h5_group &&\ + rm h5_group &&\ + RunTest h5_select &&\ + rm h5_select &&\ + RunTest h5_attribute &&\ + rm h5_attribute &&\ + RunTest h5_mount &&\ + rm h5_mount &&\ + RunTest h5_reference &&\ + rm h5_reference &&\ + RunTest h5_drivers &&\ + rm h5_drivers &&\ + RunTest h5_ref2reg &&\ + rm h5_ref2reg &&\ + RunTest h5_extlink &&\ + rm h5_extlink &&\ + RunTest h5_elink_unix2win &&\ + rm h5_elink_unix2win &&\ + RunTest h5_shared_mesg &&\ + rm h5_shared_mesg); then + EXIT_VALUE=${EXIT_SUCCESS} + else + EXIT_VALUE=${EXIT_FAILURE} + fi +fi + +# Cleanup +rm *.o +rm *.h5 +rm -rf red blue u2w +echo + +exit $EXIT_VALUE + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_ds1.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_ds1.c new file mode 100644 index 0000000000000000000000000000000000000000..8b7e530786ed12fc1df8b45ef26d4da0eb08b31f --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_ds1.c @@ -0,0 +1,114 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" + + +#define RANK 2 +#define DIM_DATA 12 +#define DIM1_SIZE 3 +#define DIM2_SIZE 4 +#define DIM0 0 +#define DIM1 1 + +#define DSET_NAME "Mydata" +#define DS_1_NAME "Yaxis" +#define DS_2_NAME "Xaxis" + +int main(void) +{ + + hid_t fid; /* file ID */ + hid_t did; /* dataset ID */ + hid_t dsid; /* DS dataset ID */ + int rank = RANK; /* rank of data dataset */ + int rankds = 1; /* rank of DS dataset */ + hsize_t dims[RANK] = {DIM1_SIZE,DIM2_SIZE}; /* size of data dataset */ + int buf[DIM_DATA] = {1,2,3,4,5,6,7,8,9,10,11,12}; /* data of data dataset */ + hsize_t s1_dim[1] = {DIM1_SIZE}; /* size of DS 1 dataset */ + hsize_t s2_dim[1] = {DIM2_SIZE}; /* size of DS 2 dataset */ + float s1_wbuf[DIM1_SIZE] = {10,20,30}; /* data of DS 1 dataset */ + 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) + goto out; + + /* make a dataset */ + if (H5LTmake_dataset_int(fid,DSET_NAME,rank,dims,buf)<0) + goto out; + + /* make a DS dataset for the first dimension */ + if (H5LTmake_dataset_float(fid,DS_1_NAME,rankds,s1_dim,s1_wbuf)<0) + goto out; + + /* make a DS dataset for the second dimension */ + if (H5LTmake_dataset_int(fid,DS_2_NAME,rankds,s2_dim,s2_wbuf)<0) + goto out; + + +/*------------------------------------------------------------------------- + * attach the DS_1_NAME dimension scale to DSET_NAME at dimension 0 + *------------------------------------------------------------------------- + */ + + /* get the dataset id for DSET_NAME */ + if ((did = H5Dopen2(fid,DSET_NAME, H5P_DEFAULT))<0) + goto out; + + /* get the DS dataset id */ + if ((dsid = H5Dopen2(fid,DS_1_NAME, H5P_DEFAULT))<0) + goto out; + + /* attach the DS_1_NAME dimension scale to DSET_NAME at dimension index 0 */ + if (H5DSattach_scale(did,dsid,DIM0)<0) + goto out; + + /* close DS id */ + if (H5Dclose(dsid)<0) + goto out; + +/*------------------------------------------------------------------------- + * attach the DS_2_NAME dimension scale to DSET_NAME + *------------------------------------------------------------------------- + */ + + /* get the DS dataset id */ + if ((dsid = H5Dopen2(fid,DS_2_NAME, H5P_DEFAULT))<0) + goto out; + + /* attach the DS_2_NAME dimension scale to DSET_NAME as the 2nd dimension (index 1) */ + if (H5DSattach_scale(did,dsid,DIM1)<0) + goto out; + + /* close DS id */ + if (H5Dclose(dsid)<0) + goto out; + + /* close file */ + H5Fclose(fid); + + return 0; + +out: + printf("Error on return function...Exiting\n"); + return 1; + +} + + + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_image1.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_image1.c new file mode 100644 index 0000000000000000000000000000000000000000..96bc7c7e33e540954c66643a3351b6c3ee8e7466 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_image1.c @@ -0,0 +1,72 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" + +#define WIDTH 400 +#define HEIGHT 200 +#define PAL_ENTRIES 9 +unsigned char buf [ WIDTH*HEIGHT ]; + +int main( void ) +{ + hid_t file_id; + herr_t status; + hsize_t pal_dims[] = {PAL_ENTRIES,3}; + size_t i, j; + int n, space; + unsigned char pal[PAL_ENTRIES*3] = { /* create a palette with 9 colors */ + 0,0,168, /* dark blue */ + 0,0,252, /* blue */ + 0,168,252, /* ocean blue */ + 84,252,252, /* light blue */ + 168,252,168, /* light green */ + 0,252,168, /* green */ + 252,252,84, /* yellow */ + 252,168,0, /* orange */ + 252,0,0}; /* red */ + + /* create an image of 9 values divided evenly by the array */ + space = WIDTH*HEIGHT / PAL_ENTRIES; + for (i=0, j=0, n=0; i < WIDTH*HEIGHT; i++, j++ ) + { + buf[i] = n; + if ( j > space ) + { + n++; + j=0; + } + if (n>PAL_ENTRIES-1) n=0; + } + + /* create a new HDF5 file using default properties. */ + file_id = H5Fcreate( "ex_image1.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT ); + + /* make the image */ + status = H5IMmake_image_8bit( file_id, "image1", (hsize_t)WIDTH, (hsize_t)HEIGHT, buf ); + + /* make a palette */ + status = H5IMmake_palette( file_id, "pallete", pal_dims, pal ); + + /* attach the palette to the image */ + status = H5IMlink_palette( file_id, "image1", "pallete" ); + + /* close the file. */ + status = H5Fclose( file_id ); + + return 0; + +} diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_image2.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_image2.c new file mode 100644 index 0000000000000000000000000000000000000000..3276f7c60eff5a01a40c96dbcec22ec794a1759b --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_image2.c @@ -0,0 +1,186 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> +#include <string.h> + +#define DATA_FILE1 "image8.txt" +#define DATA_FILE2 "image24pixel.txt" +#define IMAGE1_NAME "image8bit" +#define IMAGE2_NAME "image24bitpixel" +#define PAL_NAME "palette" +#define PAL_ENTRIES 256 + +static int read_data(const char* file_name, hsize_t *width, hsize_t *height ); +unsigned char *gbuf = NULL; /* global buffer for image data */ + +int main( void ) +{ + hid_t file_id; /* HDF5 file identifier */ + hsize_t width; /* width of image */ + hsize_t height; /* height of image */ + unsigned char pal[ PAL_ENTRIES * 3 ]; /* palette array */ + hsize_t pal_dims[2] = {PAL_ENTRIES,3}; /* palette dimensions */ + herr_t status, i, n; + + /* create a new HDF5 file using default properties. */ + file_id = H5Fcreate( "ex_image2.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT ); + + /* read first data file */ + if (read_data(DATA_FILE1,&width,&height)<0) + goto out; + + /* make the image */ + status=H5IMmake_image_8bit( file_id, IMAGE1_NAME, width, height, gbuf ); + if (gbuf) { + free(gbuf); + gbuf = NULL; + } + +/*------------------------------------------------------------------------- + * define a palette, blue to red tones + *------------------------------------------------------------------------- + */ + for ( i=0, n=0; i<PAL_ENTRIES*3; i+=3, n++) + { + pal[i] =n; /* red */ + pal[i+1]=0; /* green */ + pal[i+2]=255-n; /* blue */ + } + + /* make a palette */ + status=H5IMmake_palette( file_id, PAL_NAME, pal_dims, pal ); + + /* attach the palette to the image */ + status=H5IMlink_palette( file_id, IMAGE1_NAME, PAL_NAME ); + +/*------------------------------------------------------------------------- + * True color image example with pixel interlace + *------------------------------------------------------------------------- + */ + + /* read second data file */ + if (read_data(DATA_FILE2,&width,&height)<0) + goto out; + + /* make dataset */ + status=H5IMmake_image_24bit( file_id, IMAGE2_NAME, width, height, "INTERLACE_PIXEL", gbuf ); + + /* close the file. */ + H5Fclose( file_id ); + + if(gbuf) { + free(gbuf); + gbuf = NULL; + } + + return 0; + +out: + printf("Error on return function...Exiting\n"); + + if(gbuf) { + free(gbuf); + gbuf = NULL; + } + + return 1; +} + + +/*------------------------------------------------------------------------- + * read_data + * utility function to read ASCII image data + * the files have a header of the type + * + * components + * n + * height + * n + * width + * n + * + * followed by the image data + * + *------------------------------------------------------------------------- + */ + +static int read_data( const char* fname, /*IN*/ + hsize_t *width, /*OUT*/ + hsize_t *height /*OUT*/ ) +{ + int i, n; + int color_planes; + char str[20]; + FILE *f; + int w, h; + char *srcdir = getenv("srcdir"); /* the source directory */ + char data_file[512]=""; /* buffer to hold name of existing data file */ + +/*------------------------------------------------------------------------- + * compose the name of the file to open, using "srcdir", if appropriate + *------------------------------------------------------------------------- + */ + strcpy(data_file, ""); + if (srcdir) + { + strcpy(data_file, srcdir); + strcat(data_file, "/"); + } + strcat(data_file,fname); + +/*------------------------------------------------------------------------- + * read + *------------------------------------------------------------------------- + */ + + f = fopen(data_file, "r"); + if ( f == NULL ) + { + printf( "Could not open file %s. Try set $srcdir \n", data_file ); + return -1; + } + + fscanf( f, "%s", str ); + fscanf( f, "%d", &color_planes ); + fscanf( f, "%s", str ); + fscanf( f, "%d", &h); + fscanf( f, "%s", str ); + fscanf( f, "%d", &w); + + *width = (hsize_t)w; + *height = (hsize_t)h; + + if ( gbuf ) + { + free( gbuf ); + gbuf=NULL; + } + + gbuf = (unsigned char*) malloc (w * h * color_planes * sizeof( unsigned char )); + + for (i = 0; i < h * w * color_planes ; i++) + { + fscanf( f, "%d",&n ); + gbuf[i] = (unsigned char)n; + } + fclose(f); + + return 1; + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite1.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite1.c new file mode 100644 index 0000000000000000000000000000000000000000..2a82fef1b683ec8ac3893b8395fb8be490a78d2e --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite1.c @@ -0,0 +1,42 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +#include "hdf5.h" +#include "hdf5_hl.h" + +#define RANK 2 + + +int main( void ) +{ + hid_t file_id; + hsize_t dims[RANK]={2,3}; + int data[6]={1,2,3,4,5,6}; + herr_t status; + + /* create a HDF5 file */ + file_id = H5Fcreate ("ex_lite1.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* create and write an integer type dataset named "dset" */ + status = H5LTmake_dataset(file_id,"/dset",RANK,dims,H5T_NATIVE_INT,data); + + /* close file */ + status = H5Fclose (file_id); + + return 0; +} + + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite2.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite2.c new file mode 100644 index 0000000000000000000000000000000000000000..98f92c8d90f780093dc66ec22893775025ccfc44 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite2.c @@ -0,0 +1,54 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" + +int main( void ) +{ + hid_t file_id; + int data[6]; + hsize_t dims[2]; + herr_t status; + size_t i, j, nrow, n_values; + + /* open file from ex_lite1.c */ + file_id = H5Fopen ("ex_lite1.h5", H5F_ACC_RDONLY, H5P_DEFAULT); + + /* read dataset */ + status = H5LTread_dataset_int(file_id,"/dset",data); + + /* get the dimensions of the dataset */ + status = H5LTget_dataset_info(file_id,"/dset",dims,NULL,NULL); + + /* print it by rows */ + n_values = (size_t)(dims[0] * dims[1]); + nrow = (size_t)dims[1]; + for (i=0; i<n_values/nrow; i++ ) + { + for (j=0; j<nrow; j++) + printf (" %d", data[i*nrow + j]); + printf ("\n"); + } + + /* close file */ + status = H5Fclose (file_id); + + return 0; + + +} + + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite3.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite3.c new file mode 100644 index 0000000000000000000000000000000000000000..9164c7b5861f4424446a88946ea069bee64d2cd1 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_lite3.c @@ -0,0 +1,70 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +#define ATTR_SIZE 5 + +int main( void ) +{ + hid_t file_id; + hid_t dset_id; + hid_t space_id; + hsize_t dims[1] = { ATTR_SIZE }; + int data[ATTR_SIZE] = {1,2,3,4,5}; + herr_t status; + int i; + + /* create a file */ + file_id = H5Fcreate("ex_lite3.h5", H5F_ACC_TRUNC, H5P_DEFAULT, H5P_DEFAULT); + + /* create a data space */ + space_id = H5Screate_simple(1, dims, NULL); + + /* create a dataset named "dset" */ + dset_id = H5Dcreate2(file_id, "dset", H5T_NATIVE_INT, space_id, H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); + + /* close */ + status = H5Dclose(dset_id); + status = H5Sclose(space_id); + +/*------------------------------------------------------------------------- + * example of H5LTset_attribute_int + *------------------------------------------------------------------------- + */ + + /* create and write the attribute "attr1" on the dataset "dset" */ + status = H5LTset_attribute_int(file_id, "dset", "attr1", data, ATTR_SIZE); + +/*------------------------------------------------------------------------- + * example of H5LTget_attribute_int + *------------------------------------------------------------------------- + */ + + /* get the attribute "attr1" from the dataset "dset" */ + status = H5LTget_attribute_int(file_id, "dset", "attr1", data); + + for(i = 0; i < ATTR_SIZE; i++ ) + printf(" %d", data[i]); + printf("\n"); + + /* close file */ + status = H5Fclose(file_id); + + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_01.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_01.c new file mode 100644 index 0000000000000000000000000000000000000000..de304d96b6e57ec5a9294a0276eaf4a448c75616 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_01.c @@ -0,0 +1,138 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBmake_table + * H5TBread_table + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define TABLE_NAME "table" + + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + Particle dst_buf[NRECORDS]; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + + size_t dst_sizes[NFIELDS] = { sizeof( dst_buf[0].name), + sizeof( dst_buf[0].lati), + sizeof( dst_buf[0].longi), + sizeof( dst_buf[0].pressure), + sizeof( dst_buf[0].temperature)}; + + + /* Define an array of Particles */ + Particle p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int *fill_data = NULL; + int compress = 0; + herr_t status; + int i; + + /* Initialize field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + +/*------------------------------------------------------------------------- + * H5TBmake_table + *------------------------------------------------------------------------- + */ + + status=H5TBmake_table( "Table Title", file_id, TABLE_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + +/*------------------------------------------------------------------------- + * H5TBread_table + *------------------------------------------------------------------------- + */ + + status=H5TBread_table( file_id, TABLE_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* print it by rows */ + for (i=0; i<NRECORDS; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + +/*------------------------------------------------------------------------- + * end + *------------------------------------------------------------------------- + */ + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_02.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_02.c new file mode 100644 index 0000000000000000000000000000000000000000..98e33d3e05701a0c0d70c06c41d8b920db675f81 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_02.c @@ -0,0 +1,132 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBappend_records + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define NRECORDS_ADD (hsize_t) 2 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + Particle dst_buf[NRECORDS+NRECORDS_ADD]; + +/* Define an array of Particles */ + Particle p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + + size_t dst_sizes[NFIELDS] = { sizeof( p_data[0].name), + sizeof( p_data[0].lati), + sizeof( p_data[0].longi), + sizeof( p_data[0].pressure), + sizeof( p_data[0].temperature)}; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int *fill_data = NULL; + int compress = 0; + herr_t status; + int i; + + /* Append particles */ + Particle particle_in[ NRECORDS_ADD ] = + {{ "eight",80,80, 8.0f, 80.0}, + {"nine",90,90, 9.0f, 90.0} }; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* make a table */ + status=H5TBmake_table( "Table Title",file_id,TABLE_NAME,NFIELDS,NRECORDS, + dst_size, field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + /* append two records */ + status=H5TBappend_records(file_id, TABLE_NAME,NRECORDS_ADD, dst_size, dst_offset, dst_sizes, + &particle_in ); + + /* read the table */ + status=H5TBread_table( file_id, TABLE_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* print it by rows */ + for (i=0; i<NRECORDS+NRECORDS_ADD; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_03.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_03.c new file mode 100644 index 0000000000000000000000000000000000000000..7315fd3ac687cc1d32f7ca026d1fdedf8341e98c --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_03.c @@ -0,0 +1,139 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBwrite_records + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define NRECORDS_WRITE (hsize_t) 2 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + Particle dst_buf[NRECORDS]; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + + Particle p = {"zero",0,0, 0.0f, 0.0}; + size_t dst_sizes[NFIELDS] = { sizeof( p.name), + sizeof( p.lati), + sizeof( p.longi), + sizeof( p.pressure), + sizeof( p.temperature)}; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + /* Fill value particle */ + Particle fill_data[1] = + { {"no data",-1,-1, -99.0f, -99.0} }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + hsize_t start; /* Record to start reading/writing */ + hsize_t nrecords; /* Number of records to read/write */ + herr_t status; + int i; + + /* Define 2 new particles to write */ + Particle particle_in[NRECORDS_WRITE] = + { {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0} }; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make the table */ + status=H5TBmake_table( "Table Title", + file_id, + TABLE_NAME, + NFIELDS, + NRECORDS, + dst_size, + field_names, + dst_offset, + field_type, + chunk_size, + fill_data, + 0, /* no compression */ + NULL ); /* no data written */ + + + /* Overwrite 2 records starting at record 0 */ + start = 0; + nrecords = NRECORDS_WRITE; + status=H5TBwrite_records( file_id, TABLE_NAME, start, nrecords, dst_size, dst_offset, + dst_sizes, particle_in); + + /* read the table */ + status=H5TBread_table( file_id, TABLE_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* print it by rows */ + for (i=0; i<NRECORDS; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_04.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_04.c new file mode 100644 index 0000000000000000000000000000000000000000..0a01116e9d173ad34334d27852831ceadb70f9b6 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_04.c @@ -0,0 +1,166 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBwrite_fields_name + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define NRECORDS_ADD (hsize_t) 3 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + /* Define a subset of Particle, with latitude and longitude fields */ + typedef struct Position + { + int lati; + int longi; + } Position; + + /* Define a subset of Particle, with name and pressure fields */ + typedef struct NamePressure + { + char name[16]; + float pressure; + } NamePressure; + + Particle dst_buf[NRECORDS]; + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + size_t dst_sizes[NFIELDS] = { sizeof( dst_buf[0].name), + sizeof( dst_buf[0].lati), + sizeof( dst_buf[0].longi), + sizeof( dst_buf[0].pressure), + sizeof( dst_buf[0].temperature)}; + size_t field_offset_pos[2] = { HOFFSET( Position, lati ), + HOFFSET( Position, longi )}; + const char *field_names[NFIELDS] = /* Define field information */ + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + Particle fill_data[1] = + { {"no data",-1,-1, -99.0f, -99.0} }; /* Fill value particle */ + hsize_t start; /* Record to start reading/writing */ + hsize_t nrecords; /* Number of records to read/write */ + int compress = 0; + herr_t status; + int i; + Particle *p_data = NULL; /* Initially no data */ + float pressure_in [NRECORDS_ADD] = /* Define new values for the field "Pressure" */ + { 0.0f,1.0f,2.0f}; + Position position_in[NRECORDS_ADD] = {/* Define new values for "Latitude,Longitude" */ + {0,0}, + {10,10}, + {20,20}}; + NamePressure namepre_in[NRECORDS_ADD] =/* Define new values for "Name,Pressure" */ + { {"zero",0.0f}, + {"one", 1.0f}, + {"two", 2.0f}, + }; + size_t field_sizes_pos[2]= + { + sizeof(position_in[0].longi), + sizeof(position_in[0].lati) + }; + size_t field_sizes_pre[1]= + { + sizeof(namepre_in[0].pressure) + }; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make the table */ + status=H5TBmake_table( "Table Title",file_id,TABLE_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + /* Write the pressure field starting at record 2 */ + start = 2; + nrecords = NRECORDS_ADD; + status=H5TBwrite_fields_name( file_id, TABLE_NAME, "Pressure", start, nrecords, + sizeof( float ), 0, field_sizes_pre, pressure_in ); + + /* Write the new longitude and latitude information starting at record 2 */ + start = 2; + nrecords = NRECORDS_ADD; + status=H5TBwrite_fields_name( file_id, TABLE_NAME, "Latitude,Longitude", start, nrecords, + sizeof( Position ), field_offset_pos, field_sizes_pos, position_in ); + + /* read the table */ + status=H5TBread_table( file_id, TABLE_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* print it by rows */ + for (i=0; i<NRECORDS; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + +/*------------------------------------------------------------------------- + * end + *------------------------------------------------------------------------- + */ + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_05.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_05.c new file mode 100644 index 0000000000000000000000000000000000000000..f0c96ebf4ca2f5fbb389fae2f43837765c8e9a52 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_05.c @@ -0,0 +1,176 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBwrite_fields_index + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define NRECORDS_ADD (hsize_t) 3 +#define TABLE_NAME "table" + + + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + /* Define a subset of Particle, with latitude and longitude fields */ + typedef struct Position + { + int lati; + int longi; + } Position; + + /* Define a subset of Particle, with name and pressure fields */ + typedef struct NamePressure + { + char name[16]; + float pressure; + } NamePressure; + + /* Calculate the type_size and the offsets of our struct members */ + Particle dst_buf[NRECORDS]; + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + size_t dst_sizes[NFIELDS] = { sizeof( dst_buf[0].name), + sizeof( dst_buf[0].lati), + sizeof( dst_buf[0].longi), + sizeof( dst_buf[0].pressure), + sizeof( dst_buf[0].temperature)}; + + size_t field_offset_pos[2] = { HOFFSET( Position, lati ), + HOFFSET( Position, longi )}; + + /* Initially no data */ + Particle *p_data = NULL; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + Particle fill_data[1] = + { {"no data",-1,-1, -99.0f, -99.0} }; /* Fill value particle */ + int compress = 0; + hsize_t nfields; + hsize_t start; /* Record to start reading/writing */ + hsize_t nrecords; /* Number of records to read/write */ + herr_t status; + int i; + + /* Define new values for the field "Pressure" */ + float pressure_in [NRECORDS_ADD] = + { 0.0f,1.0f,2.0f}; + int field_index_pre[1] = { 3 }; + int field_index_pos[2] = { 1,2 }; + + /* Define new values for the fields "Latitude,Longitude" */ + Position position_in[NRECORDS_ADD] = { {0,0}, + {10,10}, + {20,20} }; + + size_t field_sizes_pos[2]= + { + sizeof(position_in[0].longi), + sizeof(position_in[0].lati) + }; + + size_t field_sizes_pre[1]= + { + sizeof(float) + }; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make the table */ + status=H5TBmake_table( "Table Title", file_id, TABLE_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + /* Write the pressure field starting at record 2 */ + nfields = 1; + start = 2; + nrecords = NRECORDS_ADD; + status=H5TBwrite_fields_index( file_id, TABLE_NAME, nfields, field_index_pre, start, nrecords, + sizeof( float ), 0, field_sizes_pre, pressure_in ); + + + /* Write the new longitude and latitude information starting at record 2 */ + nfields = 2; + start = 2; + nrecords = NRECORDS_ADD; + status=H5TBwrite_fields_index( file_id, TABLE_NAME, nfields, field_index_pos, start, nrecords, + sizeof( Position ), field_offset_pos, field_sizes_pos, position_in ); + + + /* read the table */ + status=H5TBread_table( file_id, TABLE_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* print it by rows */ + for (i=0; i<NRECORDS; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_06.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_06.c new file mode 100644 index 0000000000000000000000000000000000000000..261b23c772e00eac2bec208371af37ea531d7bb9 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_06.c @@ -0,0 +1,98 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBget_table_info + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + Particle fill_data[1] = + { {"no data",-1,-1, -99.0f, -99.0} }; /* Fill value particle */ + int compress = 0; + hsize_t nfields_out; + hsize_t nrecords_out; + herr_t status; + + /* Initialize field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make a table */ + status=H5TBmake_table( "Table Title",file_id,TABLE_NAME,NFIELDS,NRECORDS,dst_size, + field_names, dst_offset, field_type, + chunk_size, fill_data, compress, NULL); + + /* Get table info */ + status=H5TBget_table_info (file_id,TABLE_NAME, &nfields_out, &nrecords_out ); + + /* print */ + printf ("Table has %d fields and %d records\n",(int)nfields_out,(int)nrecords_out); + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_07.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_07.c new file mode 100644 index 0000000000000000000000000000000000000000..3479aa81db7f61a7b6a5502e35e29bc9c7b5e625 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_07.c @@ -0,0 +1,115 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBdelete_record + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + + /* Define an array of Particles */ + Particle p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + const char *field_names[NFIELDS] = /* Define field information */ + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int compress = 0; + Particle fill_data[1] = + { {"no data",-1,-1, -99.0f, -99.0} }; + hsize_t start; /* Record to start reading */ + hsize_t nrecords; /* Number of records to insert/delete */ + hsize_t nfields_out; + hsize_t nrecords_out; + herr_t status; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make the table */ + status=H5TBmake_table( "Table Title",file_id,TABLE_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + /* Delete records */ + start = 3; + nrecords = 3; + status=H5TBdelete_record( file_id, TABLE_NAME, start, nrecords ); + + /* Get table info */ + status=H5TBget_table_info (file_id,TABLE_NAME, &nfields_out, &nrecords_out ); + + /* print */ + printf ("Table has %d fields and %d records\n",(int)nfields_out,(int)nrecords_out); + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_08.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_08.c new file mode 100644 index 0000000000000000000000000000000000000000..4078beafeb65b88d7326c9d7dc184241012dcb50 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_08.c @@ -0,0 +1,146 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBinsert_record + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define NRECORDS_INS (hsize_t) 2 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + Particle dst_buf[ NRECORDS + NRECORDS_INS ]; + + /* Define an array of Particles */ + Particle p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + size_t dst_sizes[NFIELDS] = { sizeof( p_data[0].name), + sizeof( p_data[0].lati), + sizeof( p_data[0].longi), + sizeof( p_data[0].pressure), + sizeof( p_data[0].temperature)}; + + /* Define an array of Particles to insert */ + Particle p_data_insert[NRECORDS_INS] = + { {"new",30,30, 3.0f, 30.0}, + {"new",40,40, 4.0f, 40.0} + }; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int compress = 0; + int *fill_data = NULL; + hsize_t start; /* Record to start reading */ + hsize_t nrecords; /* Number of records to insert/delete */ + herr_t status; + hsize_t nfields_out; + hsize_t nrecords_out; + int i; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make the table */ + status=H5TBmake_table( "Table Title",file_id,TABLE_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + /* Insert records */ + start = 3; + nrecords = NRECORDS_INS; + status=H5TBinsert_record( file_id, TABLE_NAME, start, nrecords, dst_size, dst_offset, + dst_sizes, p_data_insert ); + + /* read the table */ + status=H5TBread_table( file_id, TABLE_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* get table info */ + status=H5TBget_table_info(file_id,TABLE_NAME, &nfields_out, &nrecords_out ); + + /* print */ + printf ("Table has %d fields and %d records\n",(int)nfields_out,(int)nrecords_out); + + /* print it by rows */ + for (i=0; i<nrecords_out; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_09.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_09.c new file mode 100644 index 0000000000000000000000000000000000000000..7ba0aa1493c6e72473a44f6abf8c85e6bc85f933 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_09.c @@ -0,0 +1,146 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBadd_records_from + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define NRECORDS_INS (hsize_t) 2 +#define TABLE1_NAME "table1" +#define TABLE2_NAME "table2" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + Particle dst_buf[ NRECORDS + NRECORDS_INS ]; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + size_t dst_sizes[NFIELDS] = { sizeof( dst_buf[0].name), + sizeof( dst_buf[0].lati), + sizeof( dst_buf[0].longi), + sizeof( dst_buf[0].pressure), + sizeof( dst_buf[0].temperature)}; + + /* Define an array of Particles */ + Particle p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int compress = 0; + Particle fill_data[1] = + { {"no data",-1,-1, -99.0f, -99.0} }; /* Fill value particle */ + hsize_t start1; /* Record to start reading from 1st table */ + hsize_t nrecords; /* Number of records to insert */ + hsize_t start2; /* Record to start writing in 2nd table */ + herr_t status; + int i; + hsize_t nfields_out; + hsize_t nrecords_out; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make 2 tables: TABLE2_NAME is empty */ + status=H5TBmake_table( "Table Title",file_id,TABLE1_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + status=H5TBmake_table( "Table Title",file_id,TABLE2_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, NULL ); + + + /* Add 2 records from TABLE1_NAME to TABLE2_NAME */ + start1 = 3; + nrecords = NRECORDS_INS; + start2 = 6; + status=H5TBadd_records_from( file_id, TABLE1_NAME, start1, nrecords, TABLE2_NAME, start2 ); + + /* read TABLE2_NAME: it should have 2 more records now */ + status=H5TBread_table( file_id, TABLE2_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* Get table info */ + status=H5TBget_table_info (file_id,TABLE2_NAME, &nfields_out, &nrecords_out ); + + /* print */ + printf ("Table has %d fields and %d records\n",(int)nfields_out,(int)nrecords_out); + + /* print it by rows */ + for (i=0; i<nrecords_out; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_10.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_10.c new file mode 100644 index 0000000000000000000000000000000000000000..20543c2bd408f986526102c29be0ffb791934ddc --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_10.c @@ -0,0 +1,139 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBcombine_tables + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define TABLE1_NAME "table1" +#define TABLE2_NAME "table2" +#define TABLE3_NAME "table3" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + /* Define an array of Particles */ + Particle p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + Particle dst_buf[ 2 * NRECORDS ]; + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + size_t dst_sizes[NFIELDS] = { sizeof( dst_buf[0].name), + sizeof( dst_buf[0].lati), + sizeof( dst_buf[0].longi), + sizeof( dst_buf[0].pressure), + sizeof( dst_buf[0].temperature)}; + + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int compress = 0; + int *fill_data = NULL; + herr_t status; + hsize_t nfields_out; + hsize_t nrecords_out; + int i; + + /* Initialize the field field_type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make two tables */ + status=H5TBmake_table( "Table Title",file_id,TABLE1_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + status=H5TBmake_table( "Table Title",file_id,TABLE2_NAME,NFIELDS,NRECORDS, + dst_size,field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + /* Combine the two tables into a third in the same file */ + status=H5TBcombine_tables( file_id, TABLE1_NAME, file_id, TABLE2_NAME, TABLE3_NAME ); + + /* read the combined table */ + status=H5TBread_table( file_id, TABLE3_NAME, dst_size, dst_offset, dst_sizes, dst_buf ); + + /* Get table info */ + status=H5TBget_table_info (file_id,TABLE3_NAME, &nfields_out, &nrecords_out ); + + /* print */ + printf ("Table has %d fields and %d records\n",(int)nfields_out,(int)nrecords_out); + + /* print it by rows */ + for (i=0; i<nrecords_out; i++) { + printf ("%-5s %-5d %-5d %-5f %-5f", + dst_buf[i].name, + dst_buf[i].lati, + dst_buf[i].longi, + dst_buf[i].pressure, + dst_buf[i].temperature); + printf ("\n"); + } + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_11.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_11.c new file mode 100644 index 0000000000000000000000000000000000000000..872fa4e4909c582545ce218054145d6a00f70266 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_11.c @@ -0,0 +1,120 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBinsert_field + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle1 + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle1; + +/* Define an array of Particles */ + Particle1 p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size1 = sizeof( Particle1 ); + size_t dst_offset1[NFIELDS] = { HOFFSET( Particle1, name ), + HOFFSET( Particle1, lati ), + HOFFSET( Particle1, longi ), + HOFFSET( Particle1, pressure ), + HOFFSET( Particle1, temperature )}; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int compress = 0; + Particle1 fill_data[1] = { "no data",-1,-1, -99.0f, -99.0 }; + int fill_data_new[1] = { -100 }; + hsize_t position; + herr_t status; + hsize_t nfields_out; + hsize_t nrecords_out; + + /* Define the inserted field information */ + hid_t field_type_new = H5T_NATIVE_INT; + int data[NRECORDS] = { 0,1,2,3,4,5,6,7 }; + + /* Initialize the field type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make the table */ + status=H5TBmake_table( "Table Title",file_id,TABLE_NAME,NFIELDS,NRECORDS, + dst_size1,field_names, dst_offset1, field_type, + chunk_size, fill_data, compress, p_data ); + + /* Insert the new field at the end of the field list */ + position = NFIELDS; + status=H5TBinsert_field( file_id, TABLE_NAME, "New Field", field_type_new, position, + fill_data_new, data ); + + /* Get table info */ + status=H5TBget_table_info (file_id,TABLE_NAME, &nfields_out, &nrecords_out ); + + /* print */ + printf ("Table has %d fields and %d records\n",(int)nfields_out,(int)nrecords_out); + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_12.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_12.c new file mode 100644 index 0000000000000000000000000000000000000000..b6cc2b428824a2a87983807a93a280999ae4038f --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ex_table_12.c @@ -0,0 +1,112 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Table API example + * + * H5TBdelete_field + * + *------------------------------------------------------------------------- + */ + +#define NFIELDS (hsize_t) 5 +#define NRECORDS (hsize_t) 8 +#define TABLE_NAME "table" + +int main( void ) +{ + typedef struct Particle + { + char name[16]; + int lati; + int longi; + float pressure; + double temperature; + } Particle; + + /* Calculate the size and the offsets of our struct members in memory */ + size_t dst_size = sizeof( Particle ); + size_t dst_offset[NFIELDS] = { HOFFSET( Particle, name ), + HOFFSET( Particle, lati ), + HOFFSET( Particle, longi ), + HOFFSET( Particle, pressure ), + HOFFSET( Particle, temperature )}; + + /* Define an array of Particles */ + Particle p_data[NRECORDS] = { + {"zero",0,0, 0.0f, 0.0}, + {"one",10,10, 1.0f, 10.0}, + {"two", 20,20, 2.0f, 20.0}, + {"three",30,30, 3.0f, 30.0}, + {"four", 40,40, 4.0f, 40.0}, + {"five", 50,50, 5.0f, 50.0}, + {"six", 60,60, 6.0f, 60.0}, + {"seven",70,70, 7.0f, 70.0} + }; + + /* Define field information */ + const char *field_names[NFIELDS] = + { "Name","Latitude", "Longitude", "Pressure", "Temperature" }; + hid_t field_type[NFIELDS]; + hid_t string_type; + hid_t file_id; + hsize_t chunk_size = 10; + int compress = 0; + Particle fill_data[1] = + { {"no data",-1,-1, -99.0f, -99.0} }; + herr_t status; + hsize_t nfields_out; + hsize_t nrecords_out; + + /* Initialize the field type */ + string_type = H5Tcopy( H5T_C_S1 ); + H5Tset_size( string_type, 16 ); + field_type[0] = string_type; + field_type[1] = H5T_NATIVE_INT; + field_type[2] = H5T_NATIVE_INT; + field_type[3] = H5T_NATIVE_FLOAT; + 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 ); + + /* Make a table */ + status=H5TBmake_table( "Table Title", file_id, TABLE_NAME, NFIELDS, NRECORDS, dst_size, + field_names, dst_offset, field_type, + chunk_size, fill_data, compress, p_data ); + + /* Delete the field */ + status=H5TBdelete_field( file_id, TABLE_NAME, "Pressure" ); + + /* Get table info */ + status=H5TBget_table_info (file_id,TABLE_NAME, &nfields_out, &nrecords_out ); + + /* print */ + printf ("Table has %d fields and %d records\n",(int)nfields_out,(int)nrecords_out); + + /* close type */ + H5Tclose( string_type ); + + /* close the file */ + H5Fclose( file_id ); + + return 0; + +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/image24pixel.txt b/privatemodules/nc4/share/hdf5_examples/hl/c/image24pixel.txt new file mode 100644 index 0000000000000000000000000000000000000000..8af73f299e918329558b98b232efa79c86a6dc83 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/image24pixel.txt @@ -0,0 +1,101475 @@ +components +3 +height +149 +width +227 +48 +47 +45 +48 +47 +45 +49 +48 +46 +50 +49 +47 +53 +49 +46 +53 +49 +46 +54 +50 +47 +54 +50 +47 +56 +51 +47 +56 +51 +47 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +50 +47 +57 +49 +46 +57 +49 +46 +56 +48 +45 +56 +48 +45 +57 +49 +46 +57 +49 +46 +58 +50 +47 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +54 +46 +43 +54 +46 +43 +54 +46 +43 +53 +45 +42 +53 +45 +42 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +52 +44 +41 +50 +45 +41 +47 +42 +36 +47 +44 +37 +47 +44 +37 +48 +45 +38 +49 +46 +39 +50 +47 +40 +51 +48 +41 +51 +48 +41 +54 +51 +44 +54 +51 +44 +55 +52 +45 +56 +53 +46 +56 +53 +46 +57 +54 +47 +58 +55 +48 +58 +55 +46 +65 +58 +48 +66 +60 +48 +68 +62 +50 +70 +64 +52 +73 +65 +52 +74 +66 +53 +75 +67 +54 +75 +67 +54 +77 +68 +53 +77 +68 +53 +79 +67 +51 +78 +66 +50 +79 +67 +51 +79 +67 +51 +80 +68 +52 +82 +69 +53 +82 +63 +49 +89 +63 +50 +98 +64 +52 +110 +66 +53 +125 +69 +54 +139 +72 +56 +153 +71 +57 +163 +70 +55 +175 +71 +58 +184 +71 +57 +190 +69 +58 +197 +71 +59 +199 +71 +62 +202 +71 +63 +203 +72 +64 +208 +69 +64 +231 +70 +76 +237 +67 +76 +235 +68 +75 +235 +69 +73 +238 +67 +73 +239 +66 +68 +241 +62 +66 +244 +61 +65 +248 +59 +65 +247 +58 +64 +244 +58 +63 +240 +60 +63 +233 +63 +64 +226 +64 +62 +215 +63 +60 +203 +65 +55 +187 +61 +47 +181 +64 +46 +181 +64 +46 +180 +63 +45 +180 +63 +45 +179 +64 +45 +178 +63 +45 +175 +64 +45 +173 +64 +44 +170 +65 +44 +166 +65 +45 +162 +66 +44 +159 +64 +42 +155 +65 +41 +152 +64 +42 +150 +65 +44 +148 +62 +45 +146 +63 +47 +146 +63 +47 +145 +62 +46 +145 +62 +44 +144 +61 +43 +146 +60 +43 +146 +60 +43 +148 +63 +43 +148 +63 +43 +148 +61 +42 +148 +61 +42 +148 +61 +42 +149 +62 +43 +150 +63 +44 +150 +64 +47 +150 +63 +54 +149 +62 +53 +151 +61 +50 +159 +63 +49 +169 +66 +51 +179 +68 +51 +188 +68 +52 +191 +68 +52 +185 +63 +48 +181 +65 +50 +172 +70 +56 +158 +72 +59 +135 +72 +57 +111 +65 +50 +84 +56 +42 +67 +51 +38 +61 +53 +50 +57 +53 +52 +57 +53 +52 +55 +51 +50 +55 +49 +49 +54 +48 +48 +53 +48 +45 +53 +48 +45 +55 +50 +47 +55 +50 +47 +55 +50 +47 +54 +49 +46 +54 +49 +45 +53 +48 +44 +53 +48 +44 +52 +49 +44 +47 +47 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +48 +47 +45 +48 +47 +45 +50 +46 +45 +50 +46 +45 +53 +44 +45 +52 +43 +44 +52 +42 +43 +51 +41 +42 +55 +40 +43 +61 +46 +49 +69 +54 +57 +80 +58 +60 +106 +66 +67 +124 +73 +72 +141 +77 +77 +149 +79 +79 +159 +87 +91 +170 +100 +110 +170 +111 +131 +159 +116 +144 +148 +123 +163 +135 +127 +174 +128 +134 +186 +126 +136 +189 +115 +121 +173 +96 +97 +145 +84 +75 +118 +80 +68 +104 +83 +74 +103 +79 +71 +94 +77 +72 +94 +84 +81 +98 +102 +100 +111 +124 +125 +130 +141 +145 +144 +153 +158 +152 +163 +169 +159 +162 +168 +154 +158 +160 +147 +143 +146 +129 +123 +124 +108 +102 +103 +85 +88 +87 +69 +81 +78 +69 +85 +82 +91 +85 +81 +98 +85 +81 +98 +48 +47 +45 +48 +47 +45 +49 +48 +46 +49 +48 +46 +52 +48 +45 +53 +49 +46 +54 +50 +47 +54 +50 +47 +56 +51 +47 +56 +51 +47 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +58 +51 +45 +57 +49 +46 +57 +49 +46 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +57 +49 +46 +57 +49 +46 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +56 +48 +45 +54 +46 +43 +54 +46 +43 +53 +45 +42 +53 +45 +42 +53 +45 +42 +52 +44 +41 +52 +44 +41 +52 +44 +41 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +53 +45 +42 +51 +46 +42 +48 +43 +37 +48 +45 +38 +48 +45 +38 +49 +46 +39 +50 +47 +40 +51 +48 +41 +52 +49 +42 +52 +49 +42 +54 +51 +44 +54 +51 +44 +55 +52 +45 +55 +52 +45 +56 +53 +46 +57 +54 +47 +58 +55 +48 +58 +55 +46 +64 +57 +47 +65 +59 +47 +67 +61 +49 +69 +63 +51 +72 +64 +51 +73 +65 +52 +74 +66 +53 +74 +66 +53 +76 +67 +52 +76 +67 +52 +77 +65 +49 +77 +65 +49 +77 +65 +49 +78 +66 +50 +79 +67 +51 +81 +68 +52 +80 +62 +48 +85 +63 +49 +94 +65 +51 +106 +67 +52 +120 +68 +54 +132 +69 +52 +146 +69 +53 +156 +67 +51 +167 +67 +52 +175 +65 +52 +181 +65 +52 +188 +66 +55 +192 +68 +58 +196 +69 +60 +197 +70 +61 +205 +67 +64 +225 +69 +73 +231 +66 +73 +232 +67 +73 +234 +68 +72 +237 +68 +71 +239 +66 +68 +243 +64 +67 +246 +63 +67 +248 +59 +65 +247 +58 +64 +244 +58 +63 +240 +60 +63 +233 +63 +64 +224 +65 +62 +213 +64 +60 +202 +64 +54 +185 +62 +47 +181 +64 +46 +180 +63 +45 +180 +63 +45 +180 +63 +45 +178 +63 +44 +176 +63 +45 +175 +64 +45 +173 +64 +44 +169 +64 +43 +166 +65 +45 +161 +65 +43 +159 +64 +42 +155 +65 +41 +152 +64 +42 +150 +65 +44 +148 +62 +45 +146 +63 +47 +145 +62 +46 +145 +62 +46 +145 +62 +44 +144 +61 +43 +146 +60 +43 +146 +60 +43 +148 +63 +43 +147 +62 +42 +148 +61 +42 +148 +61 +42 +148 +61 +42 +149 +62 +43 +150 +63 +44 +150 +64 +47 +148 +64 +53 +149 +62 +53 +152 +62 +51 +160 +62 +49 +171 +65 +51 +181 +68 +52 +189 +67 +52 +191 +68 +53 +187 +65 +50 +183 +67 +54 +172 +70 +56 +156 +73 +59 +133 +71 +58 +108 +64 +51 +83 +57 +42 +66 +52 +41 +62 +54 +51 +58 +54 +53 +57 +53 +52 +56 +52 +51 +56 +50 +50 +55 +49 +49 +54 +49 +46 +54 +49 +46 +55 +50 +47 +55 +50 +47 +55 +50 +47 +54 +49 +46 +54 +49 +45 +53 +48 +44 +53 +48 +44 +52 +49 +44 +47 +47 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +48 +47 +45 +48 +47 +45 +50 +46 +45 +50 +46 +45 +51 +45 +45 +53 +44 +45 +52 +42 +43 +51 +41 +42 +53 +41 +43 +60 +45 +48 +67 +52 +55 +78 +56 +58 +100 +62 +61 +118 +69 +65 +134 +74 +73 +143 +78 +76 +154 +84 +86 +164 +97 +106 +165 +108 +125 +157 +114 +142 +145 +123 +162 +134 +128 +174 +127 +133 +185 +123 +132 +187 +111 +117 +169 +91 +91 +141 +81 +72 +117 +79 +67 +105 +79 +70 +101 +79 +71 +95 +80 +72 +95 +82 +78 +95 +91 +89 +102 +110 +111 +116 +131 +135 +136 +148 +153 +149 +153 +158 +151 +154 +160 +148 +153 +157 +143 +143 +145 +131 +126 +127 +111 +106 +107 +89 +93 +91 +76 +86 +83 +74 +88 +83 +90 +86 +82 +97 +88 +81 +97 +47 +46 +44 +47 +46 +44 +48 +47 +45 +49 +48 +46 +52 +48 +45 +52 +48 +45 +53 +49 +46 +53 +49 +46 +55 +50 +46 +55 +50 +46 +55 +50 +46 +55 +50 +46 +57 +50 +44 +57 +50 +44 +57 +50 +44 +57 +50 +44 +57 +49 +46 +56 +48 +46 +55 +47 +45 +55 +47 +45 +55 +47 +45 +55 +47 +45 +56 +48 +46 +57 +49 +47 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +54 +46 +44 +53 +45 +43 +53 +45 +43 +53 +45 +43 +52 +44 +42 +52 +44 +42 +52 +44 +42 +52 +44 +42 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +53 +45 +43 +51 +46 +42 +50 +45 +39 +49 +46 +39 +50 +47 +40 +51 +48 +41 +51 +48 +41 +52 +49 +42 +52 +49 +42 +53 +50 +43 +54 +51 +44 +54 +51 +44 +54 +51 +44 +55 +52 +45 +56 +53 +46 +57 +54 +47 +57 +54 +47 +58 +55 +46 +63 +56 +46 +64 +58 +46 +66 +60 +48 +68 +62 +50 +71 +63 +52 +72 +64 +53 +72 +64 +51 +72 +64 +51 +73 +64 +49 +73 +64 +49 +75 +63 +49 +75 +63 +49 +75 +63 +47 +76 +64 +48 +77 +65 +49 +78 +66 +50 +77 +65 +49 +81 +65 +49 +89 +66 +50 +100 +67 +50 +113 +67 +51 +124 +67 +50 +135 +66 +50 +146 +65 +48 +152 +60 +45 +160 +58 +43 +167 +59 +46 +175 +61 +50 +181 +64 +54 +186 +68 +58 +191 +70 +61 +197 +68 +62 +217 +67 +69 +225 +64 +70 +227 +66 +71 +231 +66 +70 +234 +68 +70 +240 +67 +69 +244 +65 +68 +248 +63 +68 +250 +59 +64 +249 +58 +63 +245 +59 +64 +240 +61 +64 +232 +64 +64 +220 +65 +61 +209 +64 +59 +198 +64 +53 +183 +61 +46 +179 +64 +45 +179 +64 +45 +178 +63 +44 +178 +63 +45 +176 +63 +45 +175 +62 +44 +173 +64 +44 +170 +63 +45 +167 +64 +45 +165 +64 +44 +161 +65 +43 +157 +65 +44 +154 +63 +42 +152 +64 +42 +149 +64 +43 +148 +62 +45 +145 +62 +46 +145 +62 +46 +145 +62 +46 +144 +61 +43 +144 +61 +43 +144 +61 +43 +144 +61 +43 +145 +62 +44 +145 +62 +44 +146 +60 +43 +146 +60 +43 +147 +61 +44 +147 +61 +44 +148 +63 +43 +149 +63 +46 +149 +65 +54 +150 +63 +53 +154 +62 +51 +163 +62 +50 +175 +65 +52 +185 +67 +53 +191 +68 +53 +193 +67 +53 +192 +68 +56 +184 +70 +59 +174 +73 +61 +153 +74 +61 +129 +71 +59 +104 +64 +52 +81 +58 +44 +66 +53 +44 +63 +55 +52 +61 +55 +55 +60 +54 +54 +58 +52 +52 +57 +52 +49 +56 +51 +48 +55 +50 +47 +55 +50 +47 +54 +50 +47 +54 +50 +47 +54 +50 +47 +53 +49 +46 +53 +50 +45 +52 +49 +44 +52 +49 +44 +50 +49 +44 +46 +48 +45 +44 +49 +45 +46 +48 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +48 +47 +45 +50 +46 +45 +53 +47 +47 +52 +46 +46 +53 +44 +45 +52 +42 +43 +52 +42 +43 +57 +45 +47 +62 +50 +52 +73 +53 +54 +91 +57 +55 +108 +63 +57 +124 +69 +64 +134 +73 +68 +144 +79 +77 +152 +91 +96 +155 +102 +118 +148 +109 +136 +140 +119 +158 +131 +125 +173 +125 +130 +185 +117 +126 +183 +102 +109 +164 +84 +86 +137 +77 +69 +118 +76 +65 +107 +77 +65 +101 +79 +70 +99 +81 +72 +99 +77 +72 +94 +78 +75 +92 +91 +91 +101 +113 +116 +121 +133 +137 +136 +135 +140 +134 +138 +143 +136 +141 +144 +133 +134 +138 +124 +120 +122 +108 +102 +105 +88 +90 +91 +77 +86 +83 +76 +90 +85 +91 +90 +84 +96 +91 +83 +96 +46 +45 +43 +47 +46 +44 +47 +46 +44 +48 +47 +45 +51 +47 +44 +52 +48 +45 +52 +48 +45 +52 +48 +45 +54 +49 +45 +54 +49 +45 +54 +49 +45 +54 +49 +45 +56 +49 +43 +56 +49 +43 +56 +49 +43 +56 +49 +43 +55 +47 +45 +55 +47 +45 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +55 +47 +45 +55 +47 +45 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +56 +48 +46 +53 +45 +43 +53 +45 +43 +53 +45 +43 +52 +44 +42 +52 +44 +42 +52 +44 +42 +51 +43 +41 +51 +43 +41 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +54 +46 +44 +52 +47 +44 +51 +48 +43 +51 +48 +41 +51 +48 +41 +52 +49 +42 +52 +49 +42 +53 +50 +43 +53 +50 +43 +53 +50 +43 +53 +50 +43 +53 +50 +43 +54 +51 +44 +55 +52 +45 +56 +53 +46 +56 +53 +46 +57 +54 +47 +57 +54 +45 +62 +55 +45 +63 +57 +45 +64 +58 +46 +66 +60 +48 +69 +61 +50 +69 +61 +50 +70 +62 +49 +70 +62 +49 +71 +61 +49 +71 +62 +47 +72 +60 +46 +73 +61 +47 +73 +61 +47 +74 +62 +46 +76 +64 +48 +74 +65 +48 +75 +68 +50 +78 +69 +52 +85 +68 +52 +94 +68 +51 +105 +68 +50 +115 +66 +49 +126 +65 +47 +134 +63 +45 +140 +57 +41 +148 +57 +39 +157 +57 +42 +163 +60 +45 +172 +64 +51 +179 +69 +56 +184 +72 +60 +193 +70 +62 +210 +68 +67 +218 +65 +67 +222 +66 +67 +226 +68 +67 +231 +67 +68 +236 +66 +67 +243 +64 +67 +247 +63 +65 +250 +59 +64 +249 +58 +63 +245 +59 +64 +238 +62 +64 +229 +65 +64 +218 +66 +61 +205 +64 +57 +194 +64 +51 +181 +61 +45 +176 +64 +44 +176 +64 +44 +176 +64 +44 +175 +62 +44 +174 +63 +44 +174 +63 +44 +172 +63 +43 +169 +64 +45 +166 +63 +44 +163 +64 +43 +160 +64 +42 +156 +64 +43 +152 +64 +42 +150 +64 +41 +148 +63 +42 +145 +62 +44 +145 +62 +46 +145 +62 +46 +144 +61 +45 +144 +61 +43 +144 +61 +43 +143 +60 +42 +143 +60 +42 +144 +61 +43 +144 +61 +43 +143 +60 +42 +143 +60 +42 +146 +60 +43 +145 +62 +44 +148 +62 +45 +146 +63 +45 +149 +65 +54 +150 +63 +53 +156 +62 +50 +166 +64 +52 +178 +66 +54 +188 +67 +56 +193 +67 +55 +194 +66 +55 +194 +70 +60 +186 +74 +63 +172 +76 +64 +151 +75 +62 +124 +70 +58 +98 +64 +52 +76 +58 +46 +65 +55 +45 +64 +56 +53 +62 +57 +54 +61 +55 +55 +60 +55 +52 +58 +53 +50 +57 +52 +49 +56 +51 +48 +56 +51 +48 +54 +50 +47 +54 +50 +47 +54 +50 +47 +51 +50 +46 +53 +50 +45 +50 +49 +44 +50 +49 +44 +49 +50 +45 +45 +50 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +48 +48 +46 +48 +48 +46 +49 +48 +46 +49 +48 +46 +53 +49 +48 +54 +48 +48 +53 +47 +47 +53 +44 +45 +52 +43 +44 +54 +44 +45 +58 +48 +49 +68 +50 +50 +84 +55 +49 +99 +59 +51 +113 +65 +55 +123 +69 +59 +130 +72 +68 +137 +82 +85 +141 +95 +108 +139 +105 +130 +131 +115 +152 +125 +121 +171 +120 +125 +181 +111 +119 +181 +96 +102 +162 +81 +82 +139 +76 +69 +121 +76 +64 +112 +76 +64 +104 +80 +69 +103 +81 +70 +102 +76 +67 +94 +71 +66 +86 +77 +76 +90 +94 +94 +102 +106 +110 +113 +117 +121 +120 +120 +125 +119 +122 +128 +118 +119 +122 +111 +107 +111 +97 +96 +98 +84 +87 +89 +76 +84 +84 +76 +93 +87 +89 +93 +86 +93 +93 +86 +94 +45 +45 +45 +45 +45 +45 +46 +45 +43 +47 +46 +44 +48 +47 +45 +49 +48 +46 +51 +47 +44 +52 +48 +45 +51 +47 +44 +51 +47 +44 +52 +47 +43 +52 +47 +43 +52 +47 +43 +52 +47 +43 +54 +47 +41 +54 +47 +41 +52 +47 +44 +52 +47 +44 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +52 +47 +44 +52 +47 +44 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +53 +48 +45 +51 +46 +43 +51 +46 +43 +50 +45 +42 +50 +45 +42 +50 +45 +42 +49 +44 +41 +49 +44 +41 +49 +44 +41 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +47 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +53 +50 +45 +53 +50 +45 +53 +50 +45 +53 +50 +45 +53 +50 +45 +54 +51 +46 +54 +51 +46 +55 +52 +47 +56 +53 +48 +57 +54 +49 +57 +54 +47 +60 +53 +45 +61 +54 +44 +63 +56 +46 +64 +57 +47 +66 +58 +47 +67 +59 +48 +67 +59 +48 +67 +59 +46 +68 +58 +46 +68 +58 +46 +70 +58 +46 +71 +59 +45 +72 +60 +46 +73 +61 +47 +74 +62 +48 +73 +64 +49 +74 +71 +54 +77 +72 +53 +82 +71 +53 +89 +70 +53 +98 +69 +51 +106 +68 +49 +117 +66 +47 +125 +62 +44 +130 +59 +41 +139 +58 +41 +147 +58 +42 +154 +61 +44 +163 +66 +50 +172 +70 +56 +178 +74 +61 +187 +73 +63 +204 +71 +66 +212 +68 +67 +216 +68 +66 +221 +69 +66 +226 +66 +66 +233 +65 +65 +240 +61 +64 +244 +60 +62 +249 +58 +63 +248 +58 +60 +244 +60 +62 +237 +63 +62 +225 +66 +62 +211 +67 +58 +197 +65 +53 +185 +63 +48 +178 +63 +45 +174 +63 +44 +174 +63 +44 +174 +63 +44 +173 +62 +45 +172 +62 +45 +172 +62 +45 +170 +63 +45 +168 +62 +46 +164 +63 +45 +160 +63 +44 +158 +63 +43 +154 +63 +44 +151 +63 +43 +149 +62 +42 +147 +62 +42 +145 +62 +44 +144 +63 +46 +143 +62 +45 +143 +62 +45 +143 +62 +45 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +142 +61 +44 +143 +60 +44 +143 +62 +45 +145 +62 +46 +144 +63 +46 +148 +66 +52 +151 +65 +52 +157 +64 +49 +168 +64 +51 +182 +65 +55 +191 +67 +57 +197 +66 +56 +196 +65 +55 +190 +67 +59 +183 +72 +63 +166 +76 +67 +144 +74 +64 +116 +69 +59 +90 +62 +50 +69 +57 +45 +60 +53 +43 +64 +57 +51 +64 +56 +53 +63 +55 +53 +62 +54 +51 +61 +53 +50 +60 +52 +49 +57 +52 +48 +56 +51 +47 +54 +50 +47 +52 +51 +47 +52 +51 +47 +50 +51 +46 +51 +50 +46 +49 +50 +45 +49 +50 +45 +48 +50 +45 +45 +50 +46 +44 +50 +46 +45 +50 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +48 +48 +46 +49 +48 +46 +51 +50 +48 +53 +49 +48 +53 +49 +48 +52 +46 +46 +50 +44 +44 +52 +43 +44 +55 +46 +47 +61 +47 +46 +78 +53 +46 +89 +57 +46 +101 +61 +49 +110 +64 +51 +115 +66 +59 +121 +75 +75 +128 +90 +101 +131 +103 +128 +127 +112 +151 +122 +120 +170 +117 +123 +183 +107 +115 +180 +95 +100 +166 +84 +84 +148 +79 +71 +131 +76 +66 +119 +78 +65 +109 +78 +66 +104 +77 +65 +101 +74 +65 +96 +71 +66 +89 +71 +70 +88 +75 +75 +87 +77 +80 +85 +93 +99 +99 +96 +102 +98 +98 +105 +97 +96 +102 +92 +90 +96 +84 +87 +91 +77 +85 +88 +77 +88 +88 +80 +94 +89 +86 +96 +87 +88 +96 +87 +90 +44 +44 +44 +44 +44 +44 +46 +45 +43 +46 +45 +43 +47 +46 +44 +48 +47 +45 +51 +47 +44 +51 +47 +44 +50 +46 +43 +50 +46 +43 +51 +46 +42 +51 +46 +42 +51 +46 +42 +51 +46 +42 +53 +46 +40 +53 +45 +42 +51 +46 +43 +51 +46 +43 +50 +45 +42 +49 +44 +41 +49 +44 +41 +50 +45 +42 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +50 +45 +42 +50 +45 +42 +50 +45 +42 +50 +45 +42 +49 +44 +41 +49 +44 +41 +49 +44 +41 +48 +43 +40 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +51 +46 +43 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +52 +49 +44 +53 +50 +45 +53 +50 +45 +54 +51 +46 +55 +52 +47 +56 +53 +48 +56 +53 +48 +56 +53 +46 +59 +52 +44 +60 +53 +43 +61 +54 +44 +62 +55 +45 +64 +55 +46 +65 +57 +46 +65 +57 +46 +65 +57 +46 +67 +57 +47 +67 +57 +45 +69 +57 +45 +70 +58 +46 +71 +59 +47 +72 +60 +46 +74 +62 +48 +72 +65 +49 +74 +71 +54 +73 +72 +54 +78 +71 +53 +86 +70 +54 +92 +69 +51 +100 +67 +50 +110 +64 +48 +118 +62 +45 +123 +60 +43 +130 +59 +41 +140 +59 +42 +148 +61 +44 +156 +64 +49 +163 +70 +53 +170 +74 +58 +180 +74 +61 +196 +72 +64 +204 +69 +65 +209 +70 +65 +214 +69 +64 +222 +67 +65 +228 +64 +62 +236 +62 +63 +241 +58 +60 +247 +59 +60 +244 +58 +59 +240 +60 +61 +233 +64 +61 +220 +67 +61 +205 +67 +56 +190 +64 +50 +177 +62 +44 +174 +63 +44 +171 +64 +44 +170 +63 +43 +170 +63 +43 +170 +63 +45 +169 +62 +44 +169 +62 +44 +168 +63 +44 +165 +62 +45 +162 +63 +44 +160 +63 +44 +155 +62 +44 +151 +63 +43 +149 +62 +42 +147 +62 +41 +145 +63 +42 +143 +62 +43 +143 +62 +45 +143 +62 +45 +143 +62 +45 +142 +61 +44 +142 +61 +44 +142 +61 +44 +141 +60 +43 +142 +61 +44 +139 +60 +43 +141 +60 +43 +139 +60 +43 +139 +60 +45 +140 +61 +44 +141 +62 +47 +142 +63 +46 +148 +66 +52 +151 +65 +50 +160 +64 +50 +172 +66 +53 +185 +67 +57 +194 +67 +58 +197 +66 +58 +194 +65 +59 +186 +65 +57 +177 +73 +64 +163 +78 +71 +141 +78 +69 +111 +71 +61 +83 +63 +52 +65 +59 +47 +57 +54 +45 +64 +57 +51 +65 +55 +53 +63 +55 +52 +62 +54 +51 +60 +52 +49 +57 +52 +48 +56 +51 +47 +55 +52 +47 +52 +51 +47 +52 +51 +47 +51 +52 +47 +50 +51 +46 +50 +51 +46 +48 +50 +45 +48 +50 +45 +46 +51 +45 +45 +51 +47 +45 +51 +47 +46 +51 +47 +46 +51 +47 +48 +50 +47 +48 +50 +47 +49 +49 +47 +49 +49 +47 +50 +49 +47 +51 +50 +48 +51 +50 +48 +52 +48 +47 +50 +46 +45 +49 +45 +44 +52 +46 +46 +56 +46 +44 +71 +52 +45 +79 +52 +41 +88 +56 +43 +96 +60 +48 +101 +63 +54 +109 +71 +70 +121 +89 +100 +130 +107 +133 +128 +117 +159 +124 +124 +178 +119 +124 +188 +110 +117 +187 +100 +104 +175 +91 +91 +161 +82 +77 +143 +76 +66 +126 +79 +65 +114 +76 +64 +104 +73 +61 +99 +72 +62 +96 +72 +66 +94 +69 +67 +88 +64 +66 +79 +59 +64 +70 +66 +71 +74 +68 +77 +74 +74 +81 +74 +74 +81 +73 +73 +81 +70 +75 +81 +69 +79 +85 +73 +86 +87 +79 +94 +89 +83 +96 +89 +83 +96 +88 +85 +43 +43 +43 +43 +43 +43 +44 +44 +44 +45 +45 +45 +47 +46 +44 +47 +46 +44 +48 +47 +45 +48 +47 +45 +49 +45 +42 +49 +45 +42 +49 +45 +42 +49 +45 +42 +50 +45 +41 +50 +45 +41 +50 +45 +41 +50 +45 +41 +50 +45 +42 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +50 +44 +44 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +50 +44 +44 +50 +44 +44 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +48 +42 +42 +48 +42 +42 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +45 +45 +51 +46 +43 +52 +49 +44 +52 +49 +44 +52 +49 +44 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +52 +49 +44 +52 +49 +44 +53 +50 +45 +54 +51 +46 +55 +52 +47 +55 +52 +47 +56 +53 +48 +56 +53 +46 +58 +51 +43 +59 +52 +44 +60 +53 +45 +61 +54 +46 +63 +54 +47 +63 +54 +45 +63 +54 +45 +63 +55 +44 +66 +56 +46 +66 +56 +46 +69 +56 +47 +69 +57 +45 +71 +59 +47 +72 +60 +48 +74 +62 +50 +72 +64 +51 +72 +69 +54 +71 +70 +52 +75 +69 +53 +81 +68 +52 +88 +67 +50 +95 +66 +50 +102 +63 +46 +110 +61 +44 +118 +61 +44 +124 +58 +42 +133 +57 +41 +140 +59 +42 +147 +61 +46 +155 +66 +50 +162 +70 +55 +172 +70 +56 +187 +70 +60 +194 +70 +62 +201 +70 +62 +208 +69 +62 +217 +68 +64 +226 +67 +63 +234 +64 +64 +240 +62 +62 +242 +58 +58 +241 +59 +58 +236 +60 +60 +228 +65 +60 +214 +67 +59 +198 +68 +54 +181 +64 +47 +170 +61 +41 +170 +63 +45 +169 +64 +45 +169 +64 +45 +168 +63 +44 +168 +62 +46 +168 +62 +46 +167 +61 +45 +165 +62 +45 +163 +61 +46 +160 +63 +46 +158 +63 +45 +154 +63 +45 +150 +63 +44 +147 +62 +42 +145 +63 +42 +143 +62 +41 +143 +62 +43 +141 +62 +45 +141 +62 +45 +140 +61 +44 +140 +61 +46 +140 +61 +46 +139 +60 +45 +139 +60 +45 +139 +60 +45 +138 +61 +45 +138 +59 +44 +137 +60 +44 +138 +60 +47 +139 +62 +46 +139 +61 +48 +140 +63 +47 +146 +67 +50 +152 +66 +49 +161 +65 +49 +174 +66 +54 +188 +67 +58 +194 +67 +60 +196 +67 +61 +192 +67 +61 +185 +70 +65 +178 +81 +74 +165 +88 +82 +143 +88 +81 +115 +82 +73 +87 +73 +62 +67 +67 +55 +60 +63 +54 +62 +57 +51 +64 +55 +50 +62 +55 +49 +61 +54 +48 +58 +53 +47 +57 +52 +46 +56 +51 +47 +54 +51 +46 +52 +51 +46 +52 +51 +46 +51 +52 +47 +49 +51 +46 +49 +51 +46 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +51 +47 +45 +51 +47 +45 +51 +47 +45 +51 +47 +46 +51 +47 +46 +51 +47 +48 +50 +47 +48 +50 +47 +48 +48 +46 +49 +49 +47 +50 +50 +48 +50 +49 +47 +48 +47 +45 +47 +46 +44 +50 +46 +45 +52 +47 +44 +63 +48 +43 +68 +48 +41 +75 +51 +41 +84 +56 +45 +90 +60 +52 +100 +70 +70 +117 +93 +106 +131 +115 +141 +137 +128 +171 +133 +132 +190 +126 +131 +199 +116 +122 +198 +109 +112 +189 +99 +101 +175 +86 +83 +154 +76 +67 +130 +75 +63 +113 +73 +60 +103 +71 +59 +99 +69 +62 +95 +70 +66 +93 +68 +66 +87 +63 +65 +78 +59 +63 +72 +58 +66 +69 +62 +72 +71 +68 +77 +72 +71 +81 +73 +71 +81 +72 +74 +82 +71 +78 +86 +75 +85 +88 +77 +94 +90 +79 +97 +89 +78 +97 +88 +79 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +44 +46 +44 +45 +47 +46 +44 +48 +47 +45 +48 +47 +45 +49 +45 +42 +49 +45 +42 +49 +45 +42 +49 +45 +42 +50 +45 +41 +50 +45 +41 +50 +45 +41 +50 +45 +42 +50 +44 +44 +49 +43 +43 +49 +43 +43 +48 +42 +42 +48 +42 +42 +49 +43 +43 +49 +43 +43 +50 +44 +44 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +50 +44 +44 +50 +44 +44 +50 +44 +44 +49 +43 +43 +49 +43 +43 +48 +42 +42 +48 +42 +42 +48 +42 +42 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +50 +44 +44 +51 +47 +44 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +51 +48 +43 +52 +49 +44 +52 +49 +44 +53 +50 +45 +54 +51 +46 +54 +51 +46 +55 +52 +47 +56 +53 +48 +56 +53 +48 +57 +50 +44 +58 +51 +43 +59 +52 +44 +60 +53 +45 +62 +53 +46 +62 +53 +46 +62 +53 +46 +62 +53 +44 +66 +56 +47 +66 +56 +46 +69 +56 +47 +69 +56 +47 +71 +58 +49 +73 +61 +49 +74 +62 +50 +73 +63 +51 +70 +67 +52 +70 +67 +52 +74 +66 +53 +79 +65 +52 +84 +65 +50 +92 +64 +50 +98 +62 +48 +106 +60 +45 +113 +60 +46 +119 +57 +42 +125 +56 +41 +133 +56 +40 +140 +58 +44 +149 +61 +47 +155 +66 +52 +164 +66 +53 +178 +70 +58 +186 +69 +59 +193 +70 +62 +202 +71 +63 +212 +71 +64 +222 +70 +65 +231 +67 +65 +238 +66 +64 +237 +59 +59 +235 +59 +59 +231 +62 +59 +223 +66 +59 +209 +68 +58 +191 +68 +52 +175 +64 +45 +164 +62 +40 +166 +65 +45 +166 +65 +45 +165 +64 +44 +165 +64 +46 +165 +64 +46 +164 +63 +45 +164 +63 +45 +164 +62 +47 +162 +62 +46 +159 +64 +46 +156 +63 +46 +152 +63 +45 +149 +62 +43 +145 +63 +42 +143 +62 +41 +143 +62 +43 +141 +62 +45 +141 +62 +45 +141 +62 +45 +140 +61 +44 +140 +61 +46 +139 +60 +45 +139 +60 +45 +138 +61 +45 +138 +61 +45 +136 +60 +46 +136 +60 +46 +136 +60 +46 +136 +60 +47 +135 +62 +47 +136 +62 +49 +139 +63 +49 +145 +68 +50 +150 +67 +49 +162 +66 +52 +173 +67 +54 +186 +67 +59 +193 +68 +62 +193 +68 +62 +187 +69 +65 +185 +80 +76 +178 +91 +84 +165 +101 +92 +145 +102 +93 +117 +95 +84 +91 +85 +73 +71 +77 +65 +67 +73 +63 +60 +57 +50 +63 +56 +50 +62 +55 +49 +59 +54 +48 +57 +52 +46 +55 +52 +45 +54 +51 +46 +52 +51 +46 +52 +51 +46 +51 +52 +46 +50 +52 +47 +49 +51 +46 +47 +52 +46 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +51 +47 +45 +51 +47 +45 +51 +47 +45 +51 +47 +46 +51 +47 +46 +51 +47 +48 +50 +47 +48 +50 +47 +47 +47 +45 +48 +48 +46 +50 +50 +48 +50 +50 +48 +49 +48 +46 +48 +47 +45 +48 +47 +45 +51 +47 +44 +56 +44 +44 +59 +44 +41 +67 +48 +42 +75 +55 +48 +83 +60 +54 +94 +73 +72 +116 +98 +110 +135 +122 +148 +144 +138 +182 +140 +141 +198 +132 +136 +207 +122 +128 +204 +114 +120 +198 +105 +107 +182 +87 +87 +159 +73 +68 +132 +69 +61 +110 +71 +60 +100 +68 +60 +97 +67 +62 +94 +67 +65 +89 +64 +67 +86 +64 +68 +80 +62 +69 +75 +71 +81 +82 +75 +87 +85 +81 +94 +87 +85 +96 +88 +83 +95 +85 +82 +94 +84 +84 +94 +83 +89 +95 +83 +94 +91 +76 +97 +90 +74 +97 +90 +74 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +46 +45 +45 +45 +45 +45 +45 +45 +46 +45 +43 +46 +45 +43 +47 +46 +44 +47 +46 +44 +49 +45 +42 +48 +44 +41 +48 +44 +41 +48 +44 +41 +47 +43 +40 +47 +43 +40 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +48 +44 +43 +49 +45 +44 +49 +45 +44 +50 +46 +45 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +48 +44 +41 +49 +45 +42 +50 +46 +43 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +51 +47 +44 +52 +48 +45 +53 +49 +46 +54 +50 +47 +55 +52 +47 +56 +48 +45 +57 +50 +44 +58 +51 +45 +59 +52 +46 +61 +52 +47 +62 +53 +46 +62 +53 +46 +62 +53 +46 +63 +52 +46 +63 +53 +44 +66 +53 +45 +67 +54 +46 +68 +55 +47 +70 +57 +48 +71 +58 +49 +70 +60 +50 +71 +63 +52 +72 +64 +53 +74 +64 +54 +80 +63 +53 +84 +62 +51 +88 +60 +49 +94 +57 +48 +98 +54 +43 +109 +57 +46 +116 +56 +45 +124 +56 +43 +131 +57 +44 +141 +59 +47 +147 +61 +48 +152 +63 +49 +158 +62 +48 +167 +65 +51 +173 +65 +52 +181 +67 +56 +190 +69 +58 +202 +71 +61 +212 +71 +62 +222 +69 +63 +229 +67 +64 +232 +64 +63 +234 +66 +65 +230 +68 +65 +218 +69 +62 +200 +68 +56 +183 +66 +49 +170 +65 +46 +162 +66 +44 +162 +65 +46 +161 +64 +45 +162 +63 +44 +162 +62 +46 +161 +61 +45 +161 +61 +45 +162 +62 +46 +160 +63 +47 +156 +60 +44 +154 +61 +44 +152 +60 +45 +149 +62 +45 +147 +61 +44 +144 +61 +43 +142 +61 +42 +140 +62 +42 +139 +60 +43 +139 +60 +43 +138 +61 +45 +137 +60 +44 +137 +60 +44 +137 +60 +44 +136 +58 +45 +135 +59 +45 +137 +61 +47 +134 +60 +47 +134 +60 +47 +135 +61 +48 +136 +62 +51 +136 +64 +50 +137 +65 +53 +139 +65 +52 +145 +69 +53 +151 +68 +52 +163 +69 +57 +177 +73 +62 +186 +71 +64 +187 +68 +62 +187 +69 +65 +184 +77 +71 +180 +90 +82 +175 +102 +95 +163 +113 +102 +145 +115 +104 +126 +114 +100 +106 +106 +94 +86 +94 +83 +73 +81 +70 +76 +76 +66 +74 +70 +61 +66 +62 +53 +60 +56 +47 +57 +53 +44 +55 +52 +43 +54 +51 +44 +51 +51 +43 +52 +51 +46 +51 +52 +46 +49 +52 +45 +49 +52 +45 +48 +50 +45 +47 +49 +44 +44 +49 +43 +44 +49 +43 +45 +50 +46 +45 +50 +46 +45 +50 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +48 +50 +47 +48 +50 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +52 +48 +47 +52 +43 +48 +59 +47 +51 +65 +51 +50 +67 +52 +47 +74 +59 +54 +93 +79 +79 +121 +109 +121 +139 +133 +159 +147 +144 +187 +148 +150 +207 +144 +149 +217 +131 +137 +211 +116 +122 +198 +106 +110 +183 +95 +98 +167 +90 +91 +148 +76 +73 +116 +72 +66 +100 +65 +62 +93 +62 +62 +88 +63 +66 +85 +65 +73 +86 +76 +85 +92 +85 +96 +98 +98 +113 +110 +110 +125 +120 +118 +134 +124 +114 +127 +117 +108 +121 +111 +103 +117 +104 +95 +107 +95 +87 +95 +80 +91 +90 +70 +96 +90 +68 +99 +93 +71 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +45 +47 +45 +45 +45 +45 +45 +45 +46 +44 +45 +46 +45 +43 +47 +46 +44 +46 +45 +43 +48 +44 +41 +48 +44 +41 +47 +43 +40 +47 +43 +40 +47 +43 +40 +47 +43 +40 +46 +42 +41 +46 +42 +41 +46 +42 +41 +46 +42 +41 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +48 +44 +43 +48 +44 +41 +49 +45 +42 +50 +46 +43 +51 +47 +44 +51 +47 +44 +50 +46 +43 +50 +46 +43 +50 +46 +43 +50 +46 +43 +50 +46 +43 +50 +46 +43 +51 +47 +44 +52 +48 +45 +53 +49 +46 +54 +50 +47 +56 +48 +46 +57 +49 +46 +58 +50 +47 +59 +52 +46 +61 +52 +47 +62 +53 +48 +62 +53 +48 +61 +52 +45 +63 +52 +46 +63 +52 +46 +65 +52 +46 +66 +53 +45 +67 +54 +46 +69 +56 +48 +71 +58 +50 +72 +59 +51 +72 +62 +53 +72 +62 +53 +76 +61 +54 +79 +62 +54 +81 +61 +52 +86 +59 +50 +90 +57 +48 +95 +55 +47 +104 +55 +48 +112 +55 +46 +119 +55 +45 +129 +57 +45 +137 +57 +46 +144 +60 +49 +150 +60 +49 +155 +61 +49 +162 +64 +51 +167 +65 +51 +172 +66 +53 +180 +68 +56 +190 +69 +58 +201 +70 +60 +212 +69 +61 +219 +68 +61 +223 +68 +64 +224 +69 +64 +222 +70 +65 +212 +71 +62 +196 +70 +56 +178 +67 +50 +165 +66 +45 +158 +66 +45 +159 +67 +46 +158 +66 +45 +159 +64 +46 +158 +63 +45 +158 +63 +45 +158 +63 +45 +158 +62 +46 +158 +62 +46 +154 +61 +44 +153 +62 +44 +150 +61 +45 +148 +61 +44 +144 +61 +43 +143 +62 +43 +140 +62 +42 +140 +61 +44 +139 +60 +43 +138 +61 +43 +137 +60 +44 +137 +60 +44 +137 +60 +44 +135 +59 +43 +135 +59 +45 +133 +60 +45 +134 +60 +47 +133 +61 +47 +133 +61 +49 +131 +61 +49 +132 +62 +50 +134 +64 +54 +135 +65 +55 +136 +66 +54 +147 +71 +57 +151 +69 +55 +163 +71 +60 +175 +74 +64 +184 +73 +66 +184 +71 +65 +183 +76 +70 +179 +84 +78 +177 +100 +92 +170 +113 +102 +159 +126 +111 +144 +127 +111 +127 +124 +109 +109 +115 +101 +90 +102 +90 +78 +88 +77 +76 +78 +65 +75 +73 +61 +69 +67 +55 +64 +61 +52 +61 +58 +49 +56 +56 +46 +52 +52 +44 +49 +49 +41 +50 +51 +45 +50 +51 +45 +48 +51 +44 +47 +50 +43 +47 +49 +44 +46 +48 +43 +46 +48 +43 +46 +48 +43 +47 +49 +46 +45 +50 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +48 +50 +47 +48 +50 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +49 +49 +47 +50 +48 +49 +53 +43 +52 +57 +45 +55 +60 +50 +51 +63 +53 +51 +72 +63 +58 +94 +86 +84 +120 +114 +124 +138 +136 +158 +147 +147 +185 +148 +151 +202 +144 +150 +212 +132 +139 +207 +121 +129 +194 +113 +121 +184 +107 +116 +173 +104 +110 +158 +92 +95 +128 +88 +90 +113 +83 +85 +106 +82 +87 +106 +84 +94 +104 +90 +103 +109 +102 +118 +118 +114 +130 +127 +116 +136 +127 +126 +146 +135 +131 +149 +137 +126 +142 +129 +118 +134 +121 +114 +128 +113 +102 +116 +101 +90 +101 +84 +89 +88 +67 +94 +88 +62 +97 +91 +67 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +45 +47 +44 +46 +45 +45 +45 +45 +45 +45 +45 +46 +45 +43 +46 +45 +43 +46 +45 +43 +45 +44 +42 +47 +43 +40 +46 +42 +39 +46 +42 +39 +46 +42 +39 +44 +43 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +44 +42 +43 +44 +42 +43 +45 +43 +44 +45 +43 +44 +45 +43 +44 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +46 +44 +48 +44 +43 +48 +44 +43 +49 +45 +44 +50 +46 +45 +50 +46 +45 +50 +46 +45 +50 +46 +45 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +50 +46 +45 +51 +47 +46 +52 +48 +47 +53 +49 +46 +56 +48 +46 +57 +49 +46 +58 +50 +47 +59 +51 +48 +61 +51 +49 +61 +52 +47 +61 +52 +47 +61 +52 +47 +63 +52 +48 +63 +52 +46 +65 +52 +46 +65 +52 +46 +67 +54 +48 +68 +55 +49 +70 +57 +51 +71 +58 +52 +72 +59 +53 +74 +59 +54 +75 +60 +55 +78 +61 +54 +80 +59 +54 +83 +58 +53 +86 +55 +50 +91 +54 +46 +99 +54 +48 +107 +54 +46 +116 +53 +44 +125 +55 +47 +135 +57 +47 +141 +59 +48 +148 +60 +48 +150 +60 +49 +157 +63 +51 +160 +64 +52 +162 +64 +51 +168 +64 +51 +177 +67 +54 +186 +68 +56 +197 +69 +58 +205 +68 +58 +213 +70 +64 +215 +72 +64 +212 +73 +66 +204 +73 +63 +190 +69 +58 +174 +67 +51 +161 +66 +46 +156 +65 +46 +157 +66 +47 +156 +65 +46 +156 +63 +46 +155 +62 +45 +155 +62 +45 +155 +62 +45 +155 +62 +47 +155 +63 +48 +152 +60 +45 +150 +61 +45 +148 +60 +46 +147 +61 +46 +143 +62 +45 +140 +61 +44 +139 +60 +43 +138 +61 +43 +137 +60 +42 +137 +60 +42 +137 +60 +44 +135 +59 +43 +135 +59 +45 +133 +60 +45 +132 +58 +45 +131 +59 +45 +132 +60 +48 +130 +60 +48 +130 +60 +50 +130 +62 +51 +131 +63 +52 +133 +65 +56 +135 +67 +58 +136 +68 +57 +148 +74 +61 +151 +72 +59 +160 +72 +62 +172 +75 +68 +178 +75 +70 +179 +76 +71 +178 +83 +77 +174 +96 +86 +173 +115 +103 +166 +129 +113 +157 +140 +122 +145 +142 +123 +130 +137 +119 +115 +128 +111 +99 +113 +98 +88 +99 +85 +78 +82 +68 +77 +78 +64 +72 +73 +59 +68 +68 +56 +64 +64 +52 +57 +59 +46 +52 +54 +43 +47 +49 +38 +48 +49 +41 +48 +49 +41 +47 +48 +42 +47 +48 +42 +46 +47 +42 +46 +47 +42 +47 +47 +45 +47 +47 +45 +47 +47 +45 +46 +48 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +48 +46 +49 +47 +50 +54 +43 +57 +55 +43 +57 +56 +47 +52 +59 +54 +51 +72 +69 +62 +95 +94 +89 +122 +122 +124 +139 +141 +154 +144 +148 +177 +146 +151 +191 +143 +149 +199 +132 +142 +195 +125 +137 +187 +123 +137 +182 +124 +139 +178 +125 +140 +171 +125 +136 +154 +119 +131 +143 +113 +126 +135 +110 +125 +130 +110 +126 +126 +111 +130 +126 +121 +142 +133 +131 +153 +141 +139 +161 +148 +145 +168 +152 +144 +165 +148 +136 +157 +138 +131 +150 +131 +124 +141 +123 +106 +123 +105 +92 +104 +84 +86 +86 +62 +91 +87 +58 +93 +89 +62 +45 +46 +48 +45 +46 +48 +45 +46 +48 +45 +46 +48 +45 +46 +48 +45 +46 +48 +46 +46 +46 +46 +46 +46 +46 +45 +43 +46 +45 +43 +45 +44 +42 +45 +44 +42 +46 +42 +39 +46 +42 +39 +46 +42 +39 +46 +42 +41 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +45 +43 +44 +45 +43 +44 +45 +43 +44 +45 +43 +44 +46 +44 +45 +46 +44 +45 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +43 +42 +48 +44 +43 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +50 +46 +45 +51 +47 +46 +52 +48 +47 +57 +49 +47 +58 +50 +48 +59 +51 +49 +60 +52 +49 +61 +51 +49 +61 +51 +49 +61 +51 +49 +61 +52 +47 +62 +51 +47 +62 +51 +47 +64 +50 +47 +64 +51 +45 +65 +52 +46 +67 +54 +48 +68 +55 +49 +69 +56 +50 +70 +57 +51 +72 +57 +52 +73 +58 +53 +74 +59 +54 +76 +58 +54 +78 +57 +52 +81 +56 +51 +84 +53 +48 +94 +55 +50 +101 +54 +48 +111 +54 +47 +120 +56 +47 +130 +57 +48 +138 +58 +47 +144 +60 +49 +148 +62 +49 +153 +63 +52 +155 +63 +52 +155 +63 +50 +159 +63 +49 +165 +65 +50 +174 +66 +53 +184 +68 +55 +191 +69 +58 +199 +71 +62 +203 +72 +64 +202 +74 +65 +195 +73 +62 +182 +70 +58 +170 +66 +53 +158 +65 +48 +153 +64 +46 +153 +65 +45 +153 +65 +45 +152 +63 +45 +151 +62 +44 +151 +62 +44 +153 +62 +44 +153 +61 +46 +151 +62 +46 +149 +60 +44 +148 +61 +44 +147 +61 +46 +144 +61 +45 +142 +61 +44 +138 +61 +43 +138 +61 +45 +137 +60 +44 +136 +59 +41 +136 +59 +41 +135 +59 +43 +135 +59 +43 +132 +59 +44 +132 +59 +44 +131 +59 +45 +128 +59 +44 +129 +59 +47 +128 +60 +49 +128 +60 +49 +129 +62 +53 +131 +64 +55 +131 +67 +58 +135 +68 +60 +136 +69 +60 +148 +76 +64 +150 +72 +60 +158 +71 +62 +167 +74 +67 +174 +76 +73 +174 +81 +76 +173 +93 +86 +170 +106 +94 +167 +128 +111 +161 +143 +121 +154 +154 +130 +143 +155 +131 +134 +149 +128 +122 +139 +120 +109 +123 +106 +98 +109 +93 +83 +90 +74 +81 +85 +70 +75 +79 +64 +69 +73 +58 +64 +68 +54 +59 +61 +48 +53 +55 +44 +49 +51 +40 +48 +49 +41 +47 +48 +40 +46 +47 +41 +46 +45 +40 +46 +45 +41 +46 +45 +41 +47 +46 +44 +48 +47 +45 +47 +46 +44 +47 +46 +44 +47 +46 +44 +47 +46 +44 +47 +46 +44 +46 +46 +44 +47 +46 +44 +46 +46 +44 +48 +47 +45 +47 +47 +45 +48 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +47 +47 +45 +50 +45 +49 +55 +44 +58 +54 +42 +56 +51 +45 +49 +57 +54 +49 +72 +74 +63 +98 +102 +88 +123 +128 +122 +139 +144 +147 +141 +147 +163 +143 +150 +176 +140 +149 +182 +131 +144 +178 +129 +144 +175 +133 +153 +178 +141 +164 +182 +146 +168 +179 +147 +168 +171 +144 +164 +163 +140 +160 +158 +135 +158 +152 +130 +153 +143 +125 +152 +137 +129 +156 +139 +136 +163 +144 +148 +176 +154 +152 +177 +155 +148 +173 +151 +139 +163 +141 +133 +155 +132 +127 +146 +124 +107 +124 +105 +88 +102 +79 +83 +86 +59 +89 +85 +56 +90 +86 +57 +43 +47 +50 +43 +47 +50 +43 +47 +50 +43 +47 +50 +45 +46 +48 +45 +46 +48 +46 +46 +46 +46 +46 +46 +45 +45 +45 +45 +45 +45 +46 +45 +43 +45 +44 +42 +45 +44 +42 +44 +43 +41 +44 +43 +41 +44 +43 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +44 +42 +43 +45 +43 +44 +45 +43 +44 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +45 +46 +47 +43 +42 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +47 +43 +42 +46 +42 +41 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +48 +44 +43 +49 +45 +44 +51 +47 +46 +52 +48 +47 +57 +48 +49 +58 +50 +48 +59 +51 +49 +60 +52 +50 +61 +51 +50 +61 +51 +49 +60 +50 +48 +60 +50 +48 +61 +50 +48 +61 +50 +46 +63 +49 +46 +63 +49 +46 +64 +50 +47 +65 +51 +48 +66 +53 +47 +67 +54 +48 +68 +54 +51 +67 +56 +52 +68 +57 +53 +69 +58 +54 +71 +57 +54 +72 +57 +52 +75 +56 +52 +78 +53 +48 +88 +55 +50 +95 +54 +48 +105 +55 +48 +114 +55 +47 +125 +58 +49 +134 +60 +49 +140 +62 +50 +144 +62 +50 +151 +64 +54 +151 +63 +53 +151 +63 +53 +151 +63 +51 +156 +64 +51 +163 +67 +53 +171 +67 +54 +179 +69 +56 +186 +69 +59 +189 +71 +61 +190 +72 +62 +185 +71 +61 +176 +68 +56 +166 +65 +53 +155 +63 +48 +151 +64 +47 +151 +64 +45 +151 +64 +45 +150 +63 +46 +149 +62 +45 +148 +61 +44 +149 +60 +44 +150 +61 +47 +150 +61 +47 +149 +60 +46 +147 +59 +45 +146 +60 +47 +142 +60 +46 +139 +60 +45 +137 +60 +44 +137 +60 +44 +136 +60 +44 +135 +59 +43 +134 +58 +42 +134 +58 +42 +134 +58 +42 +131 +58 +43 +131 +58 +43 +130 +58 +44 +128 +58 +46 +128 +58 +48 +128 +60 +49 +128 +61 +52 +127 +63 +54 +130 +66 +57 +131 +68 +61 +135 +70 +64 +136 +72 +63 +145 +75 +65 +146 +72 +61 +154 +71 +63 +163 +76 +69 +168 +80 +76 +168 +88 +81 +169 +102 +93 +166 +118 +104 +162 +140 +119 +155 +153 +128 +149 +164 +135 +140 +163 +135 +134 +157 +131 +126 +145 +125 +116 +130 +113 +106 +117 +101 +92 +101 +82 +86 +95 +76 +78 +85 +67 +69 +76 +58 +63 +70 +54 +60 +64 +50 +55 +58 +47 +54 +56 +45 +48 +49 +41 +48 +48 +40 +46 +45 +40 +47 +44 +39 +47 +43 +40 +47 +43 +42 +49 +45 +44 +50 +46 +45 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +47 +46 +44 +49 +45 +44 +47 +46 +44 +50 +46 +45 +48 +47 +45 +50 +46 +45 +48 +47 +45 +48 +47 +45 +48 +47 +45 +48 +47 +45 +50 +45 +49 +56 +44 +58 +53 +41 +53 +49 +43 +43 +54 +54 +44 +71 +76 +56 +96 +104 +81 +122 +131 +112 +136 +146 +135 +141 +151 +150 +143 +154 +160 +141 +153 +165 +134 +150 +163 +135 +155 +162 +144 +170 +169 +155 +185 +177 +160 +192 +179 +152 +183 +168 +154 +182 +167 +155 +183 +168 +152 +183 +165 +145 +177 +156 +137 +171 +146 +137 +171 +144 +144 +177 +148 +146 +179 +150 +149 +180 +149 +144 +173 +143 +136 +162 +133 +132 +155 +129 +123 +146 +120 +103 +122 +100 +84 +98 +73 +81 +84 +57 +85 +84 +56 +86 +85 +57 +44 +48 +51 +44 +48 +51 +44 +48 +51 +44 +48 +51 +46 +47 +49 +46 +47 +49 +47 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +46 +47 +46 +44 +46 +45 +43 +46 +45 +43 +46 +45 +43 +45 +44 +42 +45 +44 +42 +45 +43 +44 +45 +43 +44 +45 +43 +44 +44 +42 +43 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +44 +42 +43 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +44 +42 +43 +44 +42 +43 +44 +42 +43 +45 +43 +44 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +43 +42 +47 +43 +42 +48 +44 +43 +48 +44 +43 +47 +43 +42 +47 +43 +42 +46 +42 +41 +45 +41 +40 +48 +44 +43 +48 +44 +43 +47 +43 +42 +48 +44 +43 +49 +45 +44 +50 +46 +45 +51 +47 +46 +52 +48 +47 +58 +49 +50 +58 +49 +50 +59 +51 +49 +60 +52 +50 +61 +51 +50 +60 +50 +49 +60 +50 +48 +59 +49 +47 +61 +50 +48 +60 +49 +47 +62 +48 +45 +62 +48 +45 +63 +49 +46 +64 +50 +47 +65 +52 +46 +63 +52 +46 +64 +53 +49 +64 +55 +50 +64 +57 +51 +65 +58 +52 +66 +57 +52 +67 +56 +52 +70 +55 +52 +72 +53 +47 +81 +53 +49 +88 +53 +47 +97 +54 +47 +108 +56 +45 +117 +57 +46 +128 +60 +47 +134 +62 +48 +139 +61 +49 +147 +63 +53 +149 +62 +53 +147 +63 +53 +147 +63 +52 +149 +66 +52 +154 +66 +52 +160 +67 +52 +165 +68 +52 +172 +66 +53 +176 +68 +56 +180 +69 +58 +177 +69 +59 +170 +66 +55 +161 +63 +52 +154 +62 +49 +150 +62 +48 +149 +63 +46 +148 +63 +43 +147 +61 +44 +147 +61 +44 +147 +60 +43 +147 +60 +43 +148 +60 +46 +148 +60 +46 +147 +59 +45 +146 +60 +45 +143 +60 +46 +141 +59 +45 +138 +59 +44 +137 +60 +44 +135 +59 +43 +135 +59 +43 +134 +58 +42 +134 +58 +42 +133 +57 +41 +131 +58 +41 +131 +58 +43 +129 +57 +42 +127 +57 +45 +127 +57 +45 +128 +60 +49 +127 +60 +51 +127 +63 +54 +128 +65 +56 +130 +67 +60 +133 +70 +63 +136 +73 +66 +138 +73 +67 +142 +74 +65 +144 +71 +62 +151 +72 +67 +159 +78 +74 +167 +86 +82 +167 +96 +90 +169 +112 +101 +164 +131 +114 +156 +148 +125 +150 +161 +131 +143 +168 +138 +136 +167 +136 +131 +160 +132 +126 +150 +126 +121 +136 +117 +112 +123 +106 +100 +112 +92 +93 +105 +83 +82 +94 +74 +74 +83 +64 +66 +75 +58 +62 +69 +53 +58 +64 +50 +57 +60 +49 +51 +52 +44 +50 +50 +42 +49 +46 +41 +47 +44 +39 +47 +41 +41 +48 +42 +42 +49 +43 +43 +50 +44 +44 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +49 +43 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +47 +46 +44 +47 +46 +44 +47 +46 +44 +50 +44 +46 +56 +42 +55 +53 +40 +49 +51 +43 +40 +53 +54 +38 +69 +75 +49 +92 +103 +71 +117 +130 +100 +134 +147 +121 +142 +155 +138 +145 +158 +148 +144 +159 +154 +139 +158 +152 +141 +165 +151 +151 +180 +158 +162 +197 +165 +169 +206 +173 +165 +201 +173 +166 +202 +176 +167 +203 +177 +164 +200 +172 +151 +190 +159 +139 +179 +145 +136 +176 +141 +141 +178 +144 +142 +178 +142 +144 +178 +143 +141 +172 +138 +132 +161 +130 +128 +153 +123 +119 +142 +114 +100 +120 +93 +81 +95 +69 +77 +81 +54 +81 +81 +53 +82 +81 +53 +44 +48 +51 +44 +48 +51 +44 +48 +51 +44 +48 +51 +46 +47 +49 +46 +47 +49 +46 +47 +49 +46 +47 +49 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +47 +46 +44 +47 +46 +44 +46 +45 +43 +46 +45 +43 +47 +45 +46 +46 +44 +45 +46 +44 +45 +45 +43 +44 +44 +42 +43 +43 +41 +42 +43 +41 +42 +42 +40 +41 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +42 +40 +41 +42 +40 +41 +42 +40 +41 +41 +39 +40 +41 +39 +40 +43 +41 +42 +43 +41 +42 +44 +42 +43 +45 +43 +44 +46 +44 +45 +46 +44 +45 +47 +45 +46 +47 +45 +46 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +47 +43 +42 +46 +42 +41 +45 +41 +40 +44 +40 +39 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +45 +44 +50 +46 +45 +52 +48 +47 +52 +48 +47 +58 +49 +50 +59 +50 +51 +59 +50 +51 +60 +51 +52 +61 +51 +50 +60 +50 +49 +60 +50 +49 +59 +49 +48 +60 +49 +47 +60 +49 +47 +62 +48 +47 +61 +47 +46 +62 +48 +45 +62 +48 +45 +63 +49 +46 +62 +51 +47 +61 +54 +48 +59 +54 +48 +59 +56 +51 +60 +57 +52 +61 +58 +53 +62 +57 +51 +64 +55 +50 +67 +54 +48 +71 +52 +46 +79 +52 +43 +89 +52 +43 +100 +53 +43 +110 +56 +44 +120 +58 +45 +127 +59 +46 +133 +59 +46 +143 +60 +52 +145 +60 +53 +144 +62 +51 +143 +64 +51 +144 +65 +50 +147 +66 +49 +151 +65 +50 +153 +64 +48 +160 +62 +49 +166 +64 +52 +170 +66 +55 +170 +66 +57 +165 +64 +54 +159 +62 +53 +151 +61 +50 +149 +63 +50 +146 +63 +45 +146 +63 +45 +145 +62 +44 +144 +61 +43 +145 +59 +42 +145 +59 +42 +146 +60 +45 +146 +60 +45 +145 +59 +46 +145 +59 +46 +142 +59 +45 +141 +59 +45 +138 +59 +46 +136 +58 +45 +134 +58 +44 +132 +59 +44 +133 +57 +41 +133 +57 +41 +131 +58 +41 +130 +57 +40 +130 +57 +42 +129 +57 +42 +126 +56 +44 +126 +56 +44 +128 +60 +49 +128 +61 +52 +128 +64 +55 +129 +66 +57 +132 +69 +62 +133 +73 +65 +136 +75 +70 +140 +77 +70 +140 +73 +65 +142 +72 +64 +152 +74 +70 +161 +83 +79 +168 +93 +88 +169 +104 +98 +169 +123 +110 +164 +142 +121 +153 +156 +129 +146 +167 +134 +137 +172 +139 +130 +170 +136 +128 +161 +132 +127 +153 +128 +126 +139 +119 +120 +129 +110 +106 +120 +97 +100 +114 +91 +90 +104 +81 +81 +93 +73 +73 +84 +67 +67 +76 +59 +62 +68 +54 +60 +63 +52 +54 +55 +47 +52 +52 +44 +51 +48 +43 +48 +43 +39 +49 +40 +41 +49 +40 +41 +50 +41 +42 +52 +43 +44 +50 +41 +42 +50 +41 +42 +50 +41 +42 +50 +41 +42 +50 +41 +42 +48 +42 +42 +48 +42 +42 +48 +42 +42 +49 +43 +43 +49 +43 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +49 +43 +45 +54 +41 +50 +53 +41 +45 +52 +45 +37 +52 +54 +33 +65 +72 +38 +87 +99 +59 +113 +128 +87 +130 +146 +109 +141 +156 +125 +144 +160 +134 +144 +162 +140 +139 +161 +138 +141 +168 +137 +149 +184 +142 +160 +200 +148 +164 +208 +157 +169 +211 +171 +168 +210 +174 +167 +209 +173 +161 +203 +165 +147 +189 +151 +133 +175 +135 +130 +172 +132 +135 +176 +134 +136 +174 +133 +140 +177 +136 +139 +171 +134 +129 +159 +123 +123 +148 +116 +113 +136 +107 +95 +115 +87 +77 +93 +66 +73 +79 +51 +74 +77 +48 +76 +76 +48 +46 +47 +49 +44 +48 +49 +46 +47 +49 +46 +47 +49 +46 +48 +47 +46 +48 +47 +46 +48 +47 +47 +47 +47 +48 +48 +46 +48 +48 +46 +48 +48 +46 +48 +47 +45 +48 +47 +45 +48 +47 +43 +47 +46 +44 +49 +45 +44 +50 +46 +45 +49 +45 +44 +49 +45 +44 +48 +44 +43 +47 +43 +44 +44 +42 +43 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +42 +43 +41 +44 +43 +41 +42 +43 +41 +44 +43 +41 +42 +45 +40 +44 +42 +40 +41 +44 +40 +41 +41 +39 +40 +41 +39 +40 +40 +38 +39 +42 +40 +41 +43 +41 +42 +44 +42 +43 +44 +43 +41 +45 +43 +44 +46 +45 +43 +47 +46 +44 +47 +46 +44 +45 +44 +42 +45 +44 +42 +47 +43 +42 +47 +43 +42 +46 +42 +41 +45 +41 +40 +44 +40 +39 +44 +40 +39 +49 +45 +44 +50 +45 +42 +50 +45 +42 +50 +45 +42 +51 +46 +43 +52 +47 +44 +53 +48 +45 +54 +49 +46 +59 +51 +49 +59 +51 +49 +60 +52 +50 +60 +52 +50 +61 +51 +49 +60 +50 +48 +59 +49 +47 +59 +49 +47 +60 +49 +47 +60 +49 +47 +61 +47 +46 +61 +47 +46 +61 +47 +44 +62 +48 +45 +63 +49 +46 +61 +50 +46 +62 +51 +45 +61 +54 +46 +60 +55 +49 +57 +57 +49 +57 +58 +50 +58 +58 +50 +59 +56 +49 +63 +54 +47 +67 +50 +43 +74 +49 +44 +84 +50 +41 +94 +51 +42 +104 +54 +43 +111 +57 +45 +118 +60 +46 +123 +59 +47 +135 +61 +50 +139 +61 +51 +139 +63 +50 +140 +64 +50 +142 +64 +51 +143 +64 +49 +146 +63 +49 +149 +61 +47 +152 +60 +47 +156 +62 +50 +162 +66 +54 +161 +67 +55 +158 +66 +55 +153 +63 +52 +150 +62 +50 +148 +62 +49 +148 +62 +47 +147 +61 +46 +144 +61 +45 +142 +61 +44 +142 +61 +44 +140 +61 +44 +140 +61 +46 +141 +62 +47 +142 +60 +46 +142 +60 +46 +139 +60 +47 +138 +59 +46 +136 +58 +45 +135 +59 +45 +132 +59 +44 +132 +59 +44 +130 +58 +43 +128 +59 +43 +127 +58 +42 +126 +59 +42 +126 +59 +43 +124 +58 +42 +124 +58 +44 +124 +58 +46 +128 +62 +50 +129 +62 +53 +128 +64 +54 +130 +67 +58 +133 +70 +61 +133 +74 +66 +136 +77 +69 +139 +79 +71 +140 +73 +67 +142 +73 +68 +147 +80 +74 +152 +92 +84 +157 +104 +96 +157 +117 +105 +158 +135 +117 +157 +153 +128 +147 +162 +133 +143 +170 +137 +137 +172 +139 +129 +169 +135 +127 +162 +132 +125 +155 +127 +122 +144 +121 +116 +136 +111 +103 +126 +98 +98 +121 +93 +92 +112 +85 +85 +103 +79 +78 +93 +72 +71 +82 +65 +64 +73 +56 +61 +65 +51 +56 +56 +46 +56 +53 +46 +53 +48 +44 +51 +43 +41 +50 +40 +41 +50 +40 +41 +51 +41 +42 +52 +42 +43 +50 +41 +44 +48 +42 +42 +48 +42 +44 +50 +41 +42 +50 +41 +44 +50 +41 +44 +50 +41 +44 +50 +41 +44 +51 +42 +45 +51 +42 +45 +49 +43 +45 +49 +43 +45 +48 +44 +45 +48 +44 +45 +48 +44 +45 +49 +43 +47 +52 +41 +47 +52 +42 +43 +52 +45 +37 +52 +54 +33 +63 +70 +37 +84 +96 +56 +109 +124 +81 +129 +144 +103 +137 +153 +116 +141 +158 +122 +141 +161 +126 +136 +161 +122 +138 +167 +123 +145 +182 +130 +155 +196 +136 +159 +203 +144 +159 +201 +153 +158 +199 +157 +157 +198 +154 +152 +193 +149 +140 +183 +138 +130 +173 +128 +133 +174 +130 +140 +181 +137 +132 +171 +127 +137 +174 +133 +137 +169 +130 +126 +156 +120 +118 +143 +111 +108 +131 +102 +90 +110 +83 +74 +90 +63 +70 +76 +50 +70 +74 +47 +70 +72 +48 +47 +48 +43 +46 +48 +43 +47 +48 +43 +48 +49 +44 +48 +49 +44 +48 +49 +44 +49 +50 +45 +50 +49 +45 +51 +50 +46 +52 +51 +47 +52 +51 +47 +54 +50 +47 +53 +49 +46 +52 +49 +44 +51 +47 +44 +52 +47 +44 +53 +48 +45 +53 +48 +45 +52 +47 +44 +51 +46 +43 +50 +44 +44 +49 +45 +44 +48 +44 +43 +48 +44 +43 +46 +44 +45 +46 +44 +45 +45 +45 +47 +45 +45 +47 +44 +44 +46 +43 +43 +45 +42 +41 +46 +41 +41 +43 +46 +41 +47 +46 +41 +45 +47 +40 +47 +46 +41 +45 +47 +41 +45 +46 +41 +45 +46 +42 +43 +46 +42 +43 +47 +43 +42 +47 +43 +42 +45 +44 +42 +46 +45 +41 +45 +45 +43 +45 +46 +41 +46 +47 +42 +46 +47 +42 +45 +45 +45 +45 +45 +45 +46 +44 +45 +47 +45 +46 +47 +46 +44 +48 +47 +45 +50 +46 +43 +50 +46 +43 +50 +45 +42 +52 +44 +41 +53 +45 +42 +54 +46 +43 +56 +47 +42 +58 +49 +44 +58 +49 +42 +59 +50 +43 +61 +52 +45 +61 +52 +45 +62 +53 +48 +62 +53 +48 +62 +53 +48 +61 +52 +47 +60 +51 +46 +59 +50 +45 +61 +50 +46 +60 +49 +45 +60 +49 +47 +59 +48 +46 +61 +47 +46 +62 +48 +47 +62 +48 +47 +64 +49 +46 +66 +47 +41 +66 +49 +41 +60 +51 +42 +57 +54 +45 +53 +56 +45 +52 +55 +46 +54 +54 +46 +59 +50 +45 +64 +45 +41 +71 +41 +39 +79 +39 +39 +86 +41 +38 +91 +46 +40 +97 +53 +44 +102 +60 +48 +109 +63 +48 +121 +65 +48 +127 +64 +47 +134 +65 +49 +139 +66 +51 +143 +64 +51 +147 +61 +48 +147 +59 +47 +146 +56 +45 +147 +59 +47 +147 +61 +46 +148 +65 +49 +149 +66 +50 +148 +67 +50 +146 +65 +48 +145 +62 +46 +145 +59 +44 +151 +59 +48 +151 +58 +50 +146 +59 +49 +140 +61 +48 +136 +63 +48 +132 +63 +47 +130 +63 +46 +130 +63 +46 +136 +64 +49 +136 +63 +48 +138 +62 +49 +137 +61 +48 +136 +60 +47 +135 +59 +46 +132 +58 +45 +131 +59 +45 +123 +57 +43 +126 +64 +51 +118 +60 +46 +112 +56 +41 +118 +62 +45 +118 +62 +45 +118 +59 +45 +125 +63 +50 +125 +59 +47 +131 +63 +52 +136 +68 +57 +139 +72 +63 +138 +76 +65 +135 +77 +66 +133 +79 +67 +135 +78 +69 +144 +76 +73 +149 +84 +80 +147 +99 +89 +142 +113 +97 +138 +125 +106 +134 +138 +113 +135 +151 +124 +136 +159 +130 +139 +166 +135 +138 +167 +137 +139 +168 +138 +138 +168 +140 +132 +165 +136 +124 +161 +130 +114 +155 +123 +110 +151 +117 +104 +142 +105 +97 +133 +95 +91 +122 +88 +89 +116 +85 +90 +110 +83 +86 +101 +78 +79 +88 +69 +73 +75 +61 +66 +63 +54 +64 +57 +51 +58 +48 +46 +53 +43 +42 +51 +39 +41 +51 +39 +43 +51 +39 +43 +49 +38 +42 +47 +41 +45 +45 +41 +42 +45 +40 +44 +45 +39 +41 +47 +38 +43 +49 +38 +44 +51 +38 +45 +51 +38 +45 +52 +39 +46 +52 +39 +46 +51 +40 +48 +50 +40 +48 +48 +41 +49 +47 +42 +49 +47 +42 +49 +47 +42 +48 +47 +41 +45 +49 +43 +43 +48 +45 +40 +47 +47 +35 +60 +63 +42 +86 +92 +64 +112 +122 +88 +127 +139 +103 +141 +156 +117 +139 +157 +115 +140 +161 +118 +140 +166 +119 +138 +168 +118 +137 +170 +117 +142 +180 +123 +153 +191 +134 +159 +193 +143 +157 +190 +143 +150 +186 +138 +143 +179 +131 +136 +174 +125 +133 +171 +124 +131 +170 +123 +133 +170 +126 +131 +168 +125 +131 +166 +126 +128 +158 +124 +121 +148 +117 +114 +137 +109 +104 +124 +99 +89 +107 +85 +77 +90 +70 +74 +82 +61 +68 +73 +51 +62 +65 +46 +47 +48 +42 +48 +49 +43 +48 +49 +43 +48 +49 +43 +49 +50 +44 +49 +50 +44 +50 +49 +44 +51 +50 +45 +52 +51 +46 +52 +51 +46 +55 +52 +47 +55 +52 +47 +54 +51 +46 +53 +50 +45 +53 +48 +44 +53 +48 +44 +55 +47 +44 +55 +47 +44 +54 +46 +44 +54 +46 +44 +51 +46 +43 +50 +45 +42 +48 +44 +43 +48 +44 +43 +48 +44 +45 +47 +45 +46 +47 +45 +48 +45 +45 +47 +45 +44 +49 +43 +42 +47 +41 +42 +46 +41 +40 +45 +46 +41 +47 +47 +40 +47 +47 +40 +47 +47 +40 +47 +47 +41 +45 +47 +41 +45 +46 +42 +43 +46 +42 +43 +47 +43 +42 +47 +43 +42 +46 +45 +41 +46 +45 +41 +46 +47 +42 +46 +47 +42 +46 +47 +41 +46 +47 +42 +46 +46 +46 +46 +46 +48 +46 +46 +46 +46 +46 +46 +47 +46 +44 +47 +46 +44 +49 +45 +42 +51 +46 +43 +53 +45 +42 +53 +46 +40 +55 +46 +41 +56 +47 +40 +58 +47 +41 +59 +48 +42 +60 +50 +41 +61 +51 +42 +62 +53 +44 +62 +53 +44 +62 +53 +46 +62 +53 +46 +62 +53 +46 +61 +52 +45 +60 +51 +46 +60 +51 +46 +61 +50 +46 +60 +49 +45 +59 +48 +46 +59 +48 +46 +61 +47 +46 +61 +47 +46 +62 +48 +47 +64 +49 +46 +68 +47 +42 +70 +47 +41 +67 +50 +43 +64 +51 +43 +61 +52 +45 +60 +51 +44 +59 +50 +45 +62 +48 +45 +65 +44 +43 +70 +42 +41 +75 +41 +40 +80 +42 +39 +86 +45 +41 +92 +51 +45 +97 +57 +49 +103 +61 +47 +112 +65 +47 +120 +65 +45 +128 +65 +48 +136 +64 +50 +143 +63 +52 +145 +61 +51 +147 +58 +50 +147 +59 +49 +141 +57 +46 +139 +60 +47 +139 +62 +46 +140 +64 +48 +141 +65 +49 +141 +65 +49 +142 +65 +47 +145 +63 +49 +149 +59 +50 +149 +59 +50 +144 +60 +50 +139 +61 +48 +134 +62 +48 +131 +64 +47 +129 +63 +47 +129 +64 +46 +133 +64 +49 +134 +62 +47 +135 +61 +48 +136 +60 +46 +133 +59 +46 +132 +59 +44 +130 +58 +44 +127 +60 +44 +119 +57 +44 +119 +61 +49 +112 +59 +45 +109 +57 +43 +114 +63 +46 +114 +63 +46 +113 +57 +42 +117 +58 +44 +127 +61 +49 +132 +64 +53 +138 +68 +58 +140 +72 +61 +138 +74 +64 +135 +77 +65 +133 +79 +67 +136 +77 +69 +144 +74 +72 +149 +84 +82 +145 +102 +93 +138 +119 +102 +131 +135 +112 +127 +147 +119 +128 +159 +127 +131 +166 +134 +134 +167 +136 +139 +168 +138 +143 +167 +141 +143 +167 +141 +136 +165 +137 +127 +160 +131 +117 +156 +125 +109 +153 +118 +100 +147 +105 +94 +139 +96 +89 +130 +90 +89 +123 +88 +90 +119 +88 +88 +111 +83 +82 +97 +74 +77 +86 +67 +69 +73 +59 +65 +65 +55 +59 +56 +51 +53 +48 +45 +51 +42 +43 +50 +41 +42 +49 +40 +43 +46 +40 +42 +49 +40 +43 +48 +39 +44 +48 +39 +44 +48 +39 +44 +49 +38 +44 +51 +38 +45 +52 +39 +48 +52 +39 +48 +52 +39 +48 +51 +40 +48 +50 +40 +49 +48 +41 +49 +47 +42 +49 +45 +42 +51 +44 +43 +51 +44 +43 +49 +50 +45 +49 +50 +46 +45 +48 +44 +41 +45 +45 +37 +56 +58 +44 +83 +88 +66 +111 +120 +93 +128 +139 +105 +135 +150 +111 +134 +153 +108 +134 +158 +110 +136 +163 +112 +134 +164 +112 +132 +165 +112 +138 +173 +119 +147 +182 +128 +153 +185 +135 +150 +182 +132 +147 +179 +129 +140 +174 +123 +134 +171 +120 +130 +168 +119 +130 +168 +121 +131 +168 +124 +131 +166 +124 +130 +164 +127 +127 +157 +123 +120 +146 +117 +113 +136 +110 +104 +123 +101 +89 +106 +87 +77 +90 +72 +70 +77 +59 +64 +68 +51 +59 +62 +45 +49 +50 +44 +49 +50 +44 +49 +50 +44 +49 +50 +44 +50 +51 +45 +50 +51 +45 +52 +51 +46 +52 +51 +46 +53 +52 +47 +53 +52 +47 +56 +53 +48 +56 +53 +48 +56 +53 +48 +55 +52 +47 +55 +50 +46 +54 +49 +45 +56 +48 +45 +56 +48 +45 +55 +47 +44 +54 +46 +43 +52 +47 +44 +51 +46 +43 +50 +44 +44 +49 +45 +44 +49 +45 +46 +47 +45 +46 +48 +46 +49 +47 +45 +48 +45 +45 +47 +44 +44 +46 +43 +42 +47 +43 +41 +46 +47 +40 +47 +49 +39 +47 +47 +41 +45 +47 +41 +45 +47 +41 +45 +47 +41 +45 +46 +42 +43 +46 +42 +43 +48 +44 +43 +48 +44 +43 +47 +46 +42 +47 +46 +42 +47 +46 +41 +48 +47 +42 +48 +47 +42 +48 +47 +43 +47 +47 +45 +47 +47 +47 +48 +46 +47 +48 +46 +47 +48 +47 +45 +47 +46 +44 +49 +45 +42 +50 +45 +42 +54 +46 +43 +55 +48 +42 +57 +48 +43 +58 +49 +42 +60 +49 +43 +61 +51 +42 +62 +52 +43 +63 +53 +44 +63 +54 +45 +63 +54 +45 +64 +55 +46 +64 +55 +46 +63 +54 +47 +62 +53 +46 +61 +52 +45 +61 +52 +45 +61 +50 +46 +60 +49 +45 +59 +48 +46 +59 +48 +46 +59 +48 +46 +59 +48 +46 +60 +49 +47 +63 +49 +46 +68 +49 +43 +71 +47 +43 +74 +46 +43 +76 +44 +45 +79 +43 +47 +78 +42 +46 +74 +42 +47 +71 +42 +46 +68 +44 +44 +65 +46 +42 +66 +45 +40 +70 +45 +40 +79 +46 +41 +89 +48 +42 +99 +50 +45 +105 +52 +44 +107 +58 +44 +111 +59 +45 +119 +59 +48 +129 +61 +52 +135 +60 +54 +140 +60 +53 +141 +58 +52 +141 +58 +52 +138 +60 +50 +135 +61 +50 +134 +62 +50 +133 +63 +51 +134 +65 +50 +137 +65 +51 +140 +66 +53 +143 +67 +53 +142 +63 +50 +143 +61 +47 +140 +62 +49 +138 +62 +46 +135 +62 +47 +133 +62 +44 +134 +61 +46 +134 +61 +44 +137 +59 +46 +137 +60 +44 +136 +58 +45 +134 +58 +42 +132 +59 +44 +128 +60 +41 +126 +61 +43 +122 +61 +43 +124 +62 +49 +120 +60 +49 +117 +59 +47 +116 +60 +47 +118 +65 +49 +118 +65 +49 +117 +61 +46 +118 +59 +45 +127 +63 +53 +132 +65 +56 +138 +70 +61 +140 +72 +63 +138 +74 +65 +137 +74 +65 +136 +78 +67 +140 +77 +70 +147 +73 +72 +153 +83 +81 +151 +101 +92 +146 +117 +101 +138 +132 +110 +131 +144 +116 +129 +156 +123 +130 +164 +131 +134 +168 +135 +138 +169 +137 +143 +169 +140 +145 +168 +140 +144 +164 +137 +138 +158 +131 +130 +153 +125 +122 +151 +120 +107 +149 +109 +97 +146 +101 +92 +139 +97 +92 +134 +96 +93 +130 +96 +91 +124 +93 +85 +114 +86 +80 +104 +80 +70 +89 +69 +66 +80 +63 +58 +68 +57 +51 +58 +50 +46 +51 +44 +42 +47 +41 +40 +45 +41 +43 +42 +40 +50 +38 +40 +53 +36 +42 +53 +36 +42 +53 +36 +42 +52 +37 +42 +53 +38 +43 +51 +40 +46 +51 +42 +47 +48 +42 +46 +47 +42 +46 +44 +43 +48 +43 +44 +48 +41 +45 +48 +40 +45 +49 +38 +46 +49 +40 +45 +48 +49 +47 +50 +51 +47 +46 +46 +42 +39 +42 +42 +34 +53 +55 +42 +80 +85 +65 +109 +118 +91 +124 +138 +105 +128 +144 +107 +126 +147 +106 +127 +153 +106 +131 +159 +110 +128 +160 +110 +126 +160 +109 +128 +165 +113 +135 +172 +120 +141 +175 +124 +139 +173 +122 +136 +170 +120 +132 +169 +118 +129 +167 +118 +127 +167 +117 +127 +166 +119 +127 +166 +121 +127 +164 +121 +128 +162 +125 +125 +155 +121 +119 +145 +116 +112 +135 +109 +104 +124 +99 +89 +107 +85 +77 +90 +70 +69 +73 +58 +62 +64 +50 +57 +58 +44 +50 +51 +45 +50 +51 +45 +51 +52 +46 +51 +52 +46 +51 +52 +46 +52 +53 +47 +53 +52 +47 +53 +52 +47 +54 +53 +48 +55 +54 +49 +57 +54 +49 +58 +55 +50 +58 +55 +50 +57 +54 +49 +57 +52 +48 +57 +52 +48 +58 +50 +47 +57 +49 +46 +57 +49 +46 +56 +48 +45 +53 +48 +45 +52 +47 +44 +52 +46 +46 +52 +46 +46 +51 +47 +48 +51 +47 +48 +49 +47 +48 +49 +47 +50 +48 +46 +49 +46 +46 +48 +45 +45 +47 +45 +43 +46 +48 +41 +48 +50 +41 +46 +48 +42 +46 +48 +42 +46 +48 +42 +46 +48 +42 +44 +47 +43 +44 +47 +43 +42 +49 +45 +44 +49 +45 +44 +48 +47 +43 +48 +47 +43 +49 +48 +43 +49 +48 +43 +49 +48 +43 +49 +48 +44 +49 +49 +47 +49 +49 +49 +49 +47 +48 +49 +48 +46 +49 +48 +46 +50 +46 +43 +51 +46 +43 +51 +46 +42 +57 +50 +44 +57 +50 +44 +59 +50 +43 +60 +51 +44 +62 +52 +43 +64 +54 +45 +64 +54 +45 +65 +55 +46 +66 +56 +47 +65 +56 +47 +66 +57 +48 +65 +56 +47 +65 +56 +49 +64 +55 +48 +62 +53 +46 +62 +53 +46 +61 +50 +46 +61 +50 +46 +60 +49 +47 +59 +48 +46 +59 +48 +46 +60 +49 +47 +61 +50 +48 +63 +49 +46 +66 +51 +46 +70 +49 +46 +77 +45 +46 +84 +41 +48 +88 +38 +47 +87 +37 +46 +81 +38 +47 +75 +40 +46 +68 +47 +46 +62 +49 +43 +60 +50 +41 +64 +50 +41 +72 +47 +40 +84 +47 +41 +96 +45 +42 +101 +46 +41 +105 +57 +47 +107 +59 +47 +117 +60 +51 +125 +60 +54 +133 +59 +56 +137 +59 +57 +138 +59 +55 +136 +58 +54 +137 +62 +56 +134 +64 +56 +134 +66 +57 +133 +66 +57 +133 +67 +55 +134 +66 +55 +135 +65 +55 +137 +65 +53 +137 +64 +49 +137 +64 +47 +136 +63 +46 +136 +63 +46 +135 +62 +45 +136 +60 +44 +136 +59 +43 +137 +58 +43 +138 +56 +42 +138 +56 +42 +136 +57 +42 +133 +57 +41 +130 +59 +41 +125 +60 +40 +122 +61 +40 +120 +62 +42 +127 +64 +49 +122 +55 +46 +120 +56 +46 +120 +60 +49 +117 +59 +45 +118 +62 +47 +123 +65 +51 +123 +64 +50 +128 +66 +55 +132 +68 +58 +135 +71 +61 +137 +73 +63 +136 +73 +64 +138 +75 +66 +138 +78 +68 +140 +80 +72 +144 +81 +74 +147 +90 +81 +148 +101 +91 +143 +114 +98 +137 +125 +103 +132 +136 +109 +131 +147 +118 +131 +156 +124 +135 +165 +131 +136 +167 +135 +139 +168 +137 +143 +168 +138 +143 +163 +135 +139 +158 +130 +136 +152 +126 +127 +150 +121 +114 +148 +111 +108 +146 +105 +104 +142 +103 +102 +140 +101 +103 +139 +103 +100 +134 +101 +96 +125 +95 +92 +118 +91 +81 +103 +80 +76 +93 +74 +66 +80 +63 +57 +68 +54 +50 +58 +47 +46 +52 +42 +44 +47 +40 +45 +42 +37 +53 +37 +38 +56 +35 +40 +56 +35 +40 +55 +36 +40 +52 +37 +40 +51 +39 +43 +50 +41 +44 +48 +44 +45 +44 +42 +43 +43 +43 +45 +42 +43 +45 +40 +44 +45 +39 +44 +47 +39 +44 +47 +37 +45 +47 +40 +44 +45 +46 +42 +43 +49 +43 +43 +48 +43 +39 +46 +43 +34 +56 +56 +44 +80 +85 +65 +105 +113 +89 +118 +132 +99 +123 +140 +104 +121 +143 +104 +124 +150 +105 +127 +156 +108 +125 +159 +109 +121 +158 +107 +122 +160 +109 +127 +165 +114 +130 +167 +116 +128 +165 +113 +125 +163 +112 +125 +163 +112 +125 +165 +115 +126 +165 +118 +126 +165 +120 +125 +164 +120 +124 +161 +120 +125 +159 +122 +122 +153 +119 +117 +144 +113 +110 +135 +106 +101 +124 +98 +87 +107 +82 +78 +91 +71 +69 +71 +57 +63 +61 +48 +57 +55 +42 +52 +53 +47 +52 +53 +47 +52 +53 +47 +53 +54 +48 +53 +54 +48 +53 +54 +48 +55 +54 +49 +55 +54 +49 +56 +55 +50 +56 +55 +50 +59 +56 +51 +60 +57 +52 +60 +57 +52 +60 +57 +52 +60 +55 +51 +60 +55 +51 +60 +52 +49 +60 +52 +49 +59 +51 +48 +59 +51 +48 +56 +51 +48 +55 +50 +47 +54 +49 +46 +54 +49 +46 +53 +49 +48 +54 +50 +49 +54 +50 +49 +51 +49 +50 +50 +48 +49 +49 +47 +48 +48 +46 +47 +49 +45 +46 +50 +44 +48 +52 +43 +46 +52 +43 +46 +52 +43 +46 +50 +44 +46 +50 +44 +44 +50 +44 +44 +50 +44 +44 +51 +47 +46 +51 +47 +44 +51 +47 +44 +51 +47 +44 +50 +49 +44 +50 +49 +44 +51 +50 +45 +51 +50 +46 +51 +50 +48 +51 +50 +48 +51 +50 +48 +51 +50 +48 +53 +49 +48 +53 +49 +46 +54 +49 +46 +54 +49 +45 +59 +52 +46 +60 +53 +47 +61 +52 +45 +63 +54 +45 +65 +55 +46 +66 +56 +47 +69 +56 +47 +67 +57 +47 +68 +58 +49 +68 +58 +49 +69 +59 +50 +68 +58 +49 +67 +57 +48 +66 +56 +47 +64 +53 +47 +64 +53 +47 +62 +51 +47 +62 +51 +47 +61 +50 +46 +61 +50 +46 +61 +50 +48 +61 +50 +48 +62 +51 +49 +62 +51 +49 +66 +52 +49 +70 +50 +49 +78 +48 +50 +85 +44 +52 +90 +40 +51 +89 +39 +50 +83 +40 +49 +76 +44 +49 +68 +50 +48 +60 +53 +45 +57 +55 +43 +60 +54 +42 +68 +51 +41 +78 +49 +41 +90 +47 +41 +94 +47 +41 +102 +58 +49 +106 +59 +51 +115 +60 +55 +122 +61 +58 +130 +60 +58 +134 +60 +59 +135 +59 +59 +134 +58 +58 +130 +59 +55 +129 +62 +56 +129 +65 +56 +129 +66 +57 +131 +67 +58 +131 +67 +58 +133 +64 +57 +132 +64 +55 +132 +66 +50 +132 +67 +49 +133 +64 +48 +134 +62 +47 +136 +60 +46 +137 +59 +46 +139 +57 +45 +140 +56 +45 +138 +54 +43 +137 +55 +43 +135 +56 +43 +131 +58 +43 +127 +60 +43 +122 +61 +42 +119 +62 +42 +120 +62 +42 +127 +57 +45 +122 +48 +39 +129 +56 +47 +131 +63 +52 +117 +53 +43 +113 +53 +42 +124 +66 +54 +125 +67 +55 +127 +69 +58 +129 +71 +60 +131 +73 +62 +132 +74 +63 +133 +74 +66 +135 +76 +68 +138 +79 +71 +137 +85 +74 +130 +94 +78 +129 +102 +81 +134 +109 +89 +135 +114 +93 +136 +121 +98 +137 +131 +105 +141 +144 +117 +141 +154 +124 +138 +159 +126 +136 +163 +130 +136 +167 +133 +137 +168 +134 +135 +166 +132 +132 +162 +128 +129 +156 +125 +127 +151 +119 +125 +144 +112 +125 +142 +108 +123 +140 +108 +120 +139 +107 +120 +139 +109 +117 +136 +108 +112 +131 +103 +108 +126 +100 +99 +113 +88 +92 +104 +82 +83 +90 +72 +73 +75 +61 +66 +64 +52 +61 +54 +44 +57 +47 +38 +55 +42 +36 +57 +39 +39 +57 +37 +39 +54 +38 +39 +52 +38 +38 +49 +39 +38 +46 +40 +40 +44 +43 +41 +44 +44 +42 +41 +43 +40 +41 +43 +42 +41 +43 +42 +41 +43 +42 +42 +42 +44 +42 +42 +44 +43 +41 +44 +45 +41 +42 +44 +35 +36 +50 +42 +39 +53 +48 +42 +56 +54 +42 +66 +67 +53 +85 +90 +70 +102 +112 +87 +110 +125 +94 +116 +136 +101 +113 +138 +98 +117 +144 +101 +120 +152 +105 +119 +155 +107 +115 +153 +104 +116 +154 +105 +119 +159 +107 +122 +162 +110 +120 +160 +108 +119 +159 +109 +120 +160 +110 +121 +163 +115 +123 +165 +117 +123 +165 +119 +124 +163 +119 +121 +158 +117 +122 +156 +119 +119 +150 +116 +115 +142 +111 +109 +134 +104 +100 +123 +95 +87 +107 +80 +78 +92 +69 +68 +69 +55 +62 +58 +47 +56 +52 +41 +53 +54 +48 +53 +54 +48 +54 +55 +49 +54 +55 +49 +55 +56 +50 +55 +56 +50 +56 +55 +50 +56 +55 +50 +57 +56 +51 +58 +57 +52 +61 +58 +53 +62 +59 +54 +62 +59 +54 +62 +59 +54 +62 +57 +53 +62 +57 +53 +63 +55 +52 +63 +55 +52 +62 +54 +51 +61 +53 +50 +59 +54 +51 +58 +53 +50 +57 +52 +49 +57 +52 +49 +56 +52 +49 +56 +52 +51 +57 +53 +52 +56 +52 +51 +55 +51 +50 +52 +51 +49 +53 +49 +50 +52 +48 +47 +54 +45 +48 +54 +45 +46 +54 +45 +48 +54 +45 +46 +52 +46 +46 +52 +46 +46 +52 +46 +46 +52 +47 +44 +52 +48 +45 +52 +48 +45 +52 +48 +45 +53 +49 +46 +51 +50 +45 +51 +50 +45 +52 +51 +46 +52 +51 +46 +52 +51 +47 +52 +51 +49 +53 +52 +50 +53 +52 +48 +56 +52 +49 +56 +53 +48 +57 +52 +48 +58 +53 +47 +61 +54 +48 +62 +55 +47 +64 +55 +46 +65 +56 +47 +67 +57 +48 +68 +58 +48 +71 +58 +49 +72 +59 +50 +70 +60 +51 +70 +60 +51 +70 +60 +51 +70 +60 +51 +69 +59 +50 +67 +57 +48 +66 +55 +49 +65 +54 +48 +64 +53 +49 +64 +53 +49 +63 +52 +48 +62 +51 +47 +62 +51 +49 +63 +52 +50 +64 +53 +51 +64 +53 +51 +65 +54 +50 +68 +53 +50 +75 +50 +53 +81 +49 +54 +86 +46 +54 +85 +45 +53 +82 +47 +53 +75 +49 +50 +68 +53 +50 +63 +56 +48 +61 +57 +45 +63 +57 +43 +67 +55 +41 +73 +54 +40 +83 +50 +41 +88 +50 +41 +93 +50 +43 +100 +51 +44 +108 +53 +48 +118 +54 +52 +125 +55 +55 +130 +56 +55 +131 +55 +55 +130 +54 +54 +126 +55 +53 +125 +58 +52 +125 +60 +54 +125 +62 +53 +128 +63 +57 +131 +64 +56 +134 +63 +57 +133 +65 +56 +131 +65 +51 +131 +65 +49 +132 +65 +49 +132 +63 +48 +136 +60 +47 +136 +58 +46 +137 +57 +46 +138 +56 +45 +135 +55 +44 +134 +56 +44 +131 +57 +44 +128 +59 +44 +126 +60 +44 +124 +61 +44 +121 +62 +44 +126 +60 +44 +133 +53 +42 +138 +51 +44 +160 +77 +69 +166 +89 +81 +138 +65 +56 +124 +57 +48 +130 +70 +59 +128 +75 +61 +123 +71 +58 +122 +74 +60 +124 +76 +62 +125 +77 +63 +127 +77 +66 +130 +80 +69 +137 +85 +74 +134 +92 +76 +119 +105 +79 +117 +112 +82 +130 +114 +88 +141 +117 +93 +150 +117 +98 +159 +124 +105 +166 +135 +115 +167 +145 +122 +157 +147 +122 +150 +153 +124 +146 +160 +127 +143 +165 +129 +139 +165 +130 +134 +161 +126 +130 +156 +121 +131 +150 +118 +134 +143 +112 +136 +141 +111 +134 +140 +112 +131 +142 +112 +129 +142 +112 +126 +141 +112 +122 +138 +109 +118 +134 +107 +109 +125 +98 +104 +116 +92 +96 +104 +83 +87 +90 +71 +80 +77 +62 +72 +64 +51 +66 +54 +42 +64 +47 +39 +61 +43 +39 +60 +42 +40 +56 +42 +39 +53 +42 +40 +50 +42 +39 +47 +44 +39 +44 +45 +39 +43 +45 +40 +43 +45 +40 +44 +45 +40 +45 +44 +42 +47 +43 +42 +51 +41 +42 +52 +40 +42 +54 +39 +42 +54 +40 +40 +51 +40 +36 +60 +51 +44 +69 +62 +52 +73 +71 +56 +81 +82 +64 +93 +98 +75 +103 +113 +86 +106 +121 +90 +110 +130 +93 +107 +132 +92 +108 +137 +93 +112 +145 +98 +113 +149 +101 +111 +149 +100 +111 +151 +101 +114 +154 +102 +117 +159 +109 +114 +156 +106 +113 +155 +105 +116 +158 +110 +120 +162 +114 +122 +164 +118 +121 +162 +118 +121 +159 +118 +118 +154 +116 +119 +153 +118 +117 +148 +114 +111 +141 +107 +106 +133 +102 +99 +124 +94 +85 +108 +79 +78 +92 +69 +67 +68 +54 +64 +57 +47 +58 +51 +41 +54 +55 +49 +55 +56 +50 +55 +56 +50 +55 +56 +50 +56 +57 +51 +56 +57 +51 +57 +56 +51 +58 +57 +52 +58 +57 +52 +59 +58 +53 +62 +59 +54 +63 +60 +55 +63 +60 +55 +63 +60 +55 +64 +59 +55 +64 +59 +55 +66 +58 +55 +66 +58 +55 +65 +57 +54 +64 +56 +53 +61 +56 +52 +61 +56 +52 +60 +55 +51 +60 +55 +51 +60 +55 +51 +60 +55 +52 +60 +55 +52 +60 +55 +52 +59 +54 +51 +57 +53 +50 +57 +51 +51 +56 +51 +48 +56 +47 +48 +57 +47 +46 +56 +47 +48 +56 +48 +46 +56 +48 +46 +56 +48 +46 +54 +49 +46 +54 +49 +45 +54 +49 +45 +54 +49 +45 +53 +50 +45 +53 +50 +45 +54 +51 +46 +54 +51 +46 +55 +52 +47 +55 +52 +47 +53 +52 +48 +53 +52 +48 +56 +52 +49 +57 +53 +50 +58 +54 +51 +60 +57 +52 +61 +56 +52 +64 +57 +51 +64 +55 +48 +65 +56 +47 +67 +57 +48 +68 +58 +48 +71 +58 +49 +72 +60 +48 +73 +61 +49 +73 +61 +49 +74 +61 +52 +74 +61 +52 +74 +61 +52 +73 +60 +51 +70 +60 +51 +68 +58 +49 +66 +56 +47 +65 +55 +46 +65 +56 +49 +64 +55 +48 +64 +55 +50 +63 +54 +49 +63 +54 +49 +64 +55 +50 +64 +55 +50 +65 +56 +51 +64 +54 +52 +65 +55 +53 +67 +56 +54 +70 +56 +55 +72 +57 +54 +74 +56 +54 +74 +56 +54 +72 +57 +52 +69 +56 +48 +69 +56 +47 +69 +57 +45 +70 +56 +43 +73 +57 +44 +73 +57 +42 +76 +57 +43 +82 +54 +42 +90 +47 +38 +100 +47 +39 +110 +51 +45 +122 +54 +51 +131 +57 +56 +137 +59 +57 +139 +59 +58 +139 +61 +59 +139 +65 +62 +135 +64 +58 +130 +61 +54 +127 +60 +51 +127 +58 +51 +130 +60 +52 +136 +61 +55 +138 +64 +55 +133 +63 +53 +132 +64 +51 +132 +62 +50 +134 +62 +50 +134 +60 +49 +133 +59 +48 +132 +58 +47 +131 +59 +47 +128 +58 +46 +127 +59 +46 +126 +60 +46 +127 +61 +47 +127 +61 +47 +128 +60 +47 +129 +59 +47 +135 +57 +47 +144 +49 +43 +160 +61 +56 +203 +108 +102 +216 +127 +121 +171 +91 +84 +138 +68 +60 +136 +76 +65 +127 +78 +64 +117 +73 +60 +114 +77 +61 +113 +80 +63 +114 +81 +64 +118 +83 +64 +124 +85 +68 +132 +90 +74 +128 +100 +79 +113 +113 +79 +116 +120 +85 +138 +118 +91 +156 +115 +95 +173 +109 +99 +186 +107 +102 +194 +111 +107 +195 +116 +111 +191 +128 +119 +183 +137 +122 +173 +148 +126 +163 +156 +128 +154 +159 +129 +145 +159 +126 +139 +154 +121 +137 +151 +118 +140 +143 +114 +142 +142 +114 +139 +144 +114 +135 +146 +114 +132 +147 +114 +128 +147 +115 +122 +146 +112 +119 +144 +112 +112 +137 +105 +107 +130 +101 +103 +119 +92 +94 +107 +81 +88 +93 +71 +80 +79 +59 +72 +67 +48 +67 +58 +43 +65 +50 +43 +64 +49 +44 +59 +48 +42 +56 +47 +42 +52 +47 +41 +50 +47 +40 +46 +47 +39 +46 +47 +41 +48 +47 +42 +51 +46 +42 +54 +44 +43 +58 +42 +43 +62 +40 +43 +65 +38 +43 +69 +36 +43 +67 +38 +40 +70 +53 +45 +76 +67 +52 +86 +81 +62 +91 +89 +68 +96 +98 +74 +103 +109 +81 +105 +119 +86 +106 +123 +87 +108 +130 +91 +103 +130 +87 +102 +134 +87 +108 +142 +92 +111 +148 +97 +110 +148 +97 +110 +150 +98 +114 +154 +102 +115 +157 +107 +111 +155 +106 +111 +153 +105 +114 +156 +110 +119 +160 +116 +121 +162 +120 +120 +158 +119 +117 +155 +118 +115 +151 +115 +117 +151 +118 +115 +146 +114 +110 +139 +108 +105 +132 +99 +98 +123 +91 +84 +109 +77 +77 +93 +67 +72 +73 +59 +69 +60 +51 +63 +54 +45 +55 +56 +50 +55 +56 +50 +56 +57 +51 +56 +57 +51 +56 +57 +51 +57 +58 +52 +58 +57 +52 +58 +57 +52 +59 +58 +53 +60 +59 +54 +63 +60 +55 +64 +61 +56 +64 +61 +56 +64 +61 +56 +65 +60 +56 +65 +60 +56 +67 +59 +56 +67 +59 +56 +67 +59 +56 +66 +58 +55 +63 +58 +54 +62 +57 +53 +62 +57 +53 +61 +56 +52 +62 +57 +53 +62 +57 +53 +62 +57 +53 +62 +57 +53 +61 +56 +53 +60 +55 +51 +58 +53 +49 +59 +51 +48 +58 +48 +46 +58 +48 +46 +57 +49 +46 +57 +49 +46 +57 +49 +47 +57 +49 +46 +57 +49 +46 +55 +50 +46 +54 +49 +45 +54 +49 +45 +54 +51 +46 +54 +51 +46 +54 +51 +46 +55 +52 +47 +55 +52 +47 +55 +52 +47 +53 +52 +48 +54 +53 +49 +57 +53 +50 +59 +56 +51 +60 +57 +52 +63 +58 +52 +66 +59 +53 +66 +59 +51 +65 +56 +47 +66 +58 +47 +67 +57 +47 +69 +59 +47 +72 +60 +48 +73 +61 +49 +74 +62 +50 +74 +62 +50 +75 +62 +53 +75 +62 +53 +74 +61 +52 +74 +61 +52 +70 +60 +51 +69 +59 +50 +67 +57 +48 +66 +56 +47 +66 +57 +50 +66 +57 +50 +65 +56 +51 +64 +55 +50 +64 +55 +50 +65 +56 +51 +66 +57 +52 +66 +57 +52 +63 +56 +50 +64 +57 +51 +66 +59 +53 +69 +60 +55 +71 +60 +54 +73 +60 +54 +77 +60 +53 +78 +59 +52 +77 +54 +46 +78 +54 +44 +81 +54 +43 +81 +54 +43 +81 +55 +42 +82 +56 +43 +80 +57 +41 +86 +54 +39 +103 +53 +42 +114 +54 +44 +126 +59 +51 +137 +64 +57 +149 +68 +64 +155 +72 +68 +159 +74 +71 +159 +76 +70 +160 +81 +74 +153 +76 +68 +142 +68 +59 +133 +59 +48 +132 +55 +45 +133 +55 +45 +140 +57 +49 +143 +60 +52 +139 +60 +53 +138 +61 +55 +137 +60 +54 +136 +59 +53 +136 +59 +53 +132 +59 +52 +128 +60 +51 +125 +61 +51 +122 +62 +51 +122 +62 +51 +122 +62 +51 +125 +61 +51 +129 +59 +51 +134 +57 +51 +139 +54 +51 +146 +51 +49 +150 +41 +38 +176 +63 +59 +234 +125 +122 +252 +150 +146 +195 +104 +99 +149 +72 +64 +137 +75 +64 +120 +72 +58 +112 +76 +60 +106 +81 +61 +104 +83 +62 +106 +86 +62 +111 +86 +64 +118 +90 +69 +128 +95 +76 +130 +102 +80 +124 +113 +81 +134 +118 +85 +160 +115 +92 +183 +107 +94 +203 +95 +95 +214 +84 +92 +218 +81 +91 +218 +82 +92 +230 +111 +117 +219 +121 +120 +207 +133 +124 +195 +142 +126 +184 +147 +128 +174 +148 +125 +165 +145 +120 +162 +142 +118 +159 +137 +114 +159 +137 +116 +156 +140 +117 +152 +142 +117 +148 +144 +117 +141 +144 +115 +137 +143 +115 +133 +144 +114 +127 +137 +110 +124 +133 +106 +119 +121 +97 +112 +110 +87 +105 +97 +78 +98 +82 +66 +87 +68 +53 +83 +59 +47 +79 +52 +45 +77 +49 +45 +73 +48 +44 +68 +47 +42 +64 +47 +40 +59 +46 +38 +55 +46 +39 +54 +47 +39 +57 +48 +41 +58 +47 +41 +61 +46 +43 +65 +44 +43 +70 +41 +43 +72 +40 +43 +75 +39 +43 +72 +41 +39 +84 +66 +52 +89 +81 +60 +100 +94 +70 +103 +101 +76 +105 +108 +79 +110 +117 +86 +109 +123 +88 +108 +126 +88 +107 +132 +90 +103 +132 +86 +103 +135 +86 +109 +143 +93 +112 +149 +98 +113 +150 +98 +114 +153 +100 +117 +157 +105 +116 +155 +108 +111 +153 +107 +111 +150 +106 +114 +153 +109 +119 +157 +118 +121 +159 +120 +119 +154 +121 +116 +150 +117 +115 +148 +117 +117 +148 +117 +115 +144 +113 +111 +138 +107 +105 +132 +101 +97 +124 +91 +84 +109 +77 +77 +93 +66 +78 +79 +63 +76 +67 +58 +69 +60 +51 +57 +58 +52 +57 +58 +52 +57 +58 +52 +57 +58 +52 +57 +58 +52 +58 +59 +53 +61 +60 +55 +61 +60 +55 +61 +60 +55 +61 +60 +55 +64 +61 +56 +64 +61 +56 +65 +62 +57 +66 +63 +58 +68 +63 +59 +68 +63 +59 +69 +64 +60 +69 +64 +60 +69 +64 +58 +68 +63 +57 +68 +63 +57 +67 +62 +56 +69 +62 +56 +68 +61 +55 +66 +59 +53 +66 +59 +53 +66 +59 +53 +66 +59 +53 +66 +58 +55 +66 +59 +53 +65 +58 +52 +65 +58 +52 +65 +56 +51 +65 +56 +51 +65 +56 +51 +64 +55 +50 +64 +54 +52 +62 +55 +49 +62 +55 +49 +62 +55 +49 +60 +55 +49 +60 +55 +49 +59 +54 +48 +58 +53 +47 +56 +53 +46 +56 +53 +46 +55 +52 +47 +55 +52 +47 +57 +54 +49 +57 +54 +49 +57 +54 +49 +58 +55 +48 +60 +55 +49 +61 +56 +50 +65 +58 +50 +66 +59 +49 +67 +58 +49 +68 +60 +49 +70 +60 +50 +74 +62 +50 +75 +63 +51 +76 +64 +50 +78 +64 +51 +78 +64 +53 +78 +64 +55 +78 +64 +55 +76 +63 +54 +75 +62 +53 +73 +60 +51 +72 +59 +50 +69 +59 +50 +69 +59 +50 +66 +57 +48 +65 +56 +47 +64 +57 +49 +63 +56 +48 +63 +56 +48 +63 +56 +48 +64 +57 +51 +64 +57 +51 +60 +53 +47 +77 +68 +61 +77 +64 +58 +75 +58 +51 +84 +64 +57 +82 +54 +50 +81 +48 +43 +95 +60 +54 +91 +52 +45 +94 +54 +46 +95 +52 +43 +92 +48 +39 +94 +47 +37 +101 +54 +44 +109 +61 +49 +114 +60 +48 +137 +73 +61 +143 +71 +59 +151 +73 +63 +159 +75 +65 +159 +70 +62 +155 +62 +55 +154 +61 +54 +158 +68 +59 +166 +78 +68 +164 +80 +69 +168 +86 +74 +171 +89 +75 +165 +79 +66 +153 +65 +53 +151 +59 +48 +156 +62 +54 +148 +57 +56 +146 +56 +56 +143 +53 +53 +137 +51 +50 +136 +55 +52 +135 +62 +56 +127 +63 +54 +117 +60 +49 +117 +65 +52 +115 +63 +50 +116 +59 +48 +121 +57 +48 +133 +54 +50 +142 +50 +51 +149 +44 +49 +155 +38 +44 +198 +72 +73 +229 +99 +97 +194 +70 +68 +202 +89 +85 +224 +122 +118 +171 +86 +79 +134 +70 +60 +132 +86 +70 +109 +82 +61 +105 +91 +65 +105 +98 +70 +107 +100 +72 +107 +95 +69 +111 +94 +68 +125 +99 +76 +141 +106 +84 +145 +99 +76 +177 +110 +93 +208 +111 +104 +218 +89 +93 +222 +59 +76 +229 +45 +69 +241 +44 +72 +243 +49 +76 +243 +65 +89 +233 +74 +92 +227 +91 +101 +226 +111 +114 +224 +124 +124 +218 +129 +125 +216 +133 +127 +215 +138 +130 +196 +126 +118 +192 +128 +119 +189 +131 +120 +185 +133 +120 +181 +135 +120 +175 +136 +119 +171 +138 +121 +167 +138 +120 +157 +128 +112 +157 +125 +110 +154 +121 +106 +150 +110 +98 +145 +98 +90 +135 +85 +78 +127 +72 +67 +123 +65 +63 +117 +58 +60 +103 +47 +50 +100 +48 +50 +97 +49 +49 +79 +39 +39 +71 +37 +35 +76 +48 +45 +77 +53 +49 +72 +51 +46 +69 +50 +44 +68 +49 +45 +70 +49 +46 +70 +46 +44 +71 +43 +42 +75 +45 +45 +81 +54 +47 +89 +72 +52 +96 +87 +58 +102 +95 +66 +103 +100 +69 +107 +111 +78 +117 +124 +90 +117 +132 +93 +111 +129 +89 +108 +131 +87 +108 +135 +90 +112 +141 +93 +114 +146 +97 +115 +149 +98 +117 +151 +100 +119 +153 +102 +118 +155 +104 +114 +150 +106 +115 +152 +111 +115 +151 +113 +113 +149 +111 +115 +149 +116 +119 +153 +120 +122 +152 +124 +121 +150 +122 +120 +149 +121 +115 +141 +114 +109 +135 +106 +107 +132 +102 +105 +130 +100 +97 +122 +90 +84 +109 +77 +79 +95 +68 +79 +80 +64 +84 +75 +66 +82 +73 +64 +57 +58 +52 +57 +58 +52 +57 +58 +52 +57 +58 +52 +58 +59 +53 +59 +60 +54 +62 +61 +56 +63 +62 +57 +62 +61 +56 +62 +61 +56 +65 +62 +57 +65 +62 +57 +66 +63 +58 +67 +64 +59 +68 +63 +59 +68 +63 +59 +70 +65 +61 +69 +64 +60 +69 +64 +58 +69 +64 +58 +68 +63 +57 +68 +63 +57 +69 +62 +56 +69 +62 +56 +69 +62 +56 +69 +62 +56 +69 +62 +56 +68 +61 +53 +67 +60 +54 +67 +60 +52 +68 +59 +52 +67 +58 +49 +66 +57 +50 +66 +57 +50 +66 +57 +50 +66 +57 +50 +65 +56 +51 +65 +56 +51 +64 +57 +51 +64 +57 +51 +62 +55 +49 +60 +55 +49 +59 +54 +48 +59 +54 +48 +57 +54 +47 +56 +53 +46 +55 +52 +47 +55 +52 +47 +57 +54 +49 +57 +54 +47 +57 +54 +47 +58 +55 +48 +60 +55 +49 +62 +58 +49 +65 +58 +48 +66 +60 +48 +67 +59 +48 +69 +59 +47 +73 +61 +49 +74 +62 +48 +76 +64 +50 +76 +64 +50 +78 +64 +51 +78 +64 +51 +78 +64 +53 +78 +64 +55 +77 +63 +54 +74 +61 +52 +73 +60 +51 +72 +59 +50 +69 +59 +50 +69 +59 +50 +67 +58 +49 +66 +57 +48 +64 +57 +49 +64 +57 +49 +64 +57 +49 +64 +57 +49 +65 +58 +52 +65 +58 +50 +67 +58 +51 +73 +56 +49 +75 +47 +43 +86 +46 +44 +106 +55 +54 +116 +58 +57 +123 +59 +59 +133 +69 +67 +129 +68 +63 +131 +72 +64 +132 +73 +65 +132 +72 +62 +141 +74 +66 +152 +79 +72 +161 +80 +76 +162 +79 +71 +147 +68 +55 +148 +66 +52 +154 +66 +54 +159 +67 +56 +160 +62 +51 +156 +55 +45 +156 +55 +45 +159 +61 +48 +163 +67 +53 +155 +63 +48 +153 +64 +48 +160 +69 +51 +164 +71 +54 +167 +70 +54 +174 +72 +58 +182 +78 +69 +181 +75 +77 +176 +71 +76 +167 +64 +68 +155 +56 +59 +147 +55 +56 +142 +61 +58 +133 +62 +56 +121 +61 +51 +114 +60 +48 +124 +72 +59 +135 +75 +65 +133 +62 +56 +133 +43 +43 +149 +40 +46 +181 +57 +68 +211 +75 +87 +219 +76 +78 +221 +79 +77 +199 +64 +61 +190 +65 +63 +208 +96 +92 +179 +89 +81 +132 +64 +53 +130 +84 +68 +121 +97 +73 +101 +91 +64 +96 +92 +63 +107 +104 +73 +117 +108 +79 +119 +102 +74 +127 +99 +75 +150 +99 +78 +185 +102 +88 +210 +97 +91 +224 +88 +90 +231 +67 +78 +238 +46 +69 +249 +39 +68 +255 +40 +72 +255 +42 +73 +255 +48 +78 +243 +53 +78 +236 +63 +82 +234 +76 +90 +230 +82 +94 +224 +84 +93 +222 +85 +93 +221 +90 +98 +219 +98 +105 +216 +101 +108 +214 +105 +110 +213 +108 +113 +208 +112 +114 +206 +116 +116 +204 +118 +119 +201 +120 +119 +204 +124 +125 +203 +121 +123 +203 +118 +121 +202 +113 +117 +202 +107 +115 +201 +101 +111 +199 +97 +108 +197 +95 +108 +195 +97 +110 +177 +84 +95 +163 +76 +85 +153 +72 +81 +141 +68 +75 +132 +70 +73 +107 +55 +57 +72 +28 +27 +84 +49 +45 +77 +48 +42 +72 +49 +43 +74 +54 +47 +75 +56 +49 +75 +58 +50 +79 +62 +54 +85 +69 +56 +91 +79 +53 +99 +90 +57 +103 +97 +65 +105 +102 +69 +110 +114 +79 +122 +130 +93 +122 +137 +98 +116 +134 +94 +114 +137 +95 +112 +137 +95 +112 +139 +96 +113 +142 +96 +117 +146 +100 +119 +148 +100 +119 +148 +100 +119 +148 +102 +115 +146 +105 +120 +150 +114 +122 +151 +120 +121 +150 +120 +126 +152 +125 +131 +157 +132 +133 +157 +135 +131 +155 +133 +129 +153 +131 +122 +146 +122 +114 +137 +111 +109 +132 +104 +104 +129 +100 +96 +121 +91 +84 +109 +77 +78 +97 +69 +82 +83 +67 +86 +80 +68 +86 +79 +69 +56 +57 +51 +56 +57 +51 +56 +57 +51 +57 +58 +52 +59 +60 +54 +60 +61 +55 +63 +62 +57 +64 +63 +58 +64 +63 +58 +64 +63 +58 +67 +64 +59 +67 +64 +59 +67 +64 +59 +67 +64 +59 +68 +63 +59 +68 +63 +59 +70 +65 +59 +70 +65 +59 +70 +65 +59 +69 +64 +58 +69 +64 +58 +69 +64 +58 +71 +64 +56 +70 +63 +55 +74 +65 +58 +73 +64 +57 +72 +63 +56 +71 +62 +53 +70 +61 +54 +69 +60 +51 +70 +60 +51 +69 +59 +49 +68 +58 +49 +68 +58 +49 +68 +58 +49 +68 +58 +49 +68 +59 +52 +68 +59 +52 +68 +59 +52 +67 +60 +52 +63 +56 +48 +63 +56 +48 +60 +55 +49 +59 +54 +48 +58 +53 +47 +58 +53 +47 +57 +52 +46 +57 +52 +46 +57 +54 +47 +57 +54 +47 +58 +53 +47 +59 +55 +46 +62 +55 +47 +64 +57 +47 +66 +57 +48 +67 +59 +48 +69 +59 +49 +70 +60 +48 +73 +61 +49 +75 +63 +49 +77 +63 +50 +77 +64 +48 +78 +65 +49 +77 +64 +48 +80 +63 +53 +77 +63 +52 +76 +62 +51 +75 +61 +50 +73 +60 +51 +72 +59 +50 +69 +59 +49 +68 +58 +48 +67 +58 +49 +67 +58 +49 +65 +58 +48 +65 +58 +48 +63 +59 +50 +64 +60 +51 +64 +60 +51 +68 +59 +52 +83 +69 +60 +82 +51 +46 +105 +51 +51 +142 +65 +71 +173 +76 +87 +193 +86 +96 +203 +93 +102 +196 +96 +98 +154 +66 +62 +150 +73 +63 +149 +77 +65 +155 +79 +66 +171 +82 +74 +190 +85 +82 +203 +80 +83 +196 +76 +75 +163 +65 +52 +157 +66 +48 +160 +64 +48 +165 +63 +49 +165 +59 +46 +163 +55 +43 +164 +56 +43 +167 +61 +47 +171 +69 +54 +161 +62 +43 +152 +55 +36 +157 +58 +39 +165 +62 +45 +172 +65 +47 +178 +67 +50 +184 +67 +58 +167 +48 +50 +177 +57 +66 +185 +68 +76 +190 +75 +82 +186 +77 +82 +173 +75 +76 +150 +65 +62 +130 +55 +49 +123 +56 +47 +118 +54 +44 +122 +49 +42 +133 +48 +45 +156 +51 +55 +186 +60 +71 +215 +70 +87 +232 +77 +91 +225 +71 +73 +206 +54 +51 +205 +60 +57 +187 +52 +49 +198 +79 +75 +198 +99 +93 +148 +74 +63 +140 +91 +74 +125 +99 +76 +106 +95 +67 +104 +99 +69 +117 +111 +79 +128 +111 +81 +130 +103 +74 +143 +103 +78 +177 +104 +89 +224 +100 +98 +239 +84 +90 +238 +71 +81 +239 +58 +73 +248 +52 +74 +255 +52 +78 +255 +50 +77 +254 +46 +72 +255 +53 +79 +245 +51 +75 +240 +53 +74 +239 +56 +76 +237 +55 +77 +233 +54 +75 +236 +54 +76 +239 +57 +80 +241 +65 +88 +239 +67 +91 +239 +70 +93 +237 +73 +97 +236 +77 +99 +234 +81 +101 +233 +84 +104 +232 +86 +107 +228 +84 +107 +229 +83 +106 +228 +80 +106 +228 +78 +105 +233 +78 +109 +238 +81 +112 +242 +83 +115 +244 +87 +118 +252 +105 +133 +237 +99 +124 +225 +93 +116 +210 +87 +108 +203 +90 +108 +199 +101 +114 +166 +83 +93 +114 +45 +50 +93 +39 +39 +88 +49 +44 +87 +58 +52 +81 +63 +53 +66 +58 +45 +58 +56 +41 +63 +66 +49 +76 +78 +57 +86 +79 +51 +97 +86 +54 +101 +95 +63 +104 +101 +68 +113 +117 +84 +127 +134 +101 +126 +140 +105 +119 +136 +100 +120 +140 +105 +117 +139 +101 +114 +139 +100 +114 +139 +99 +118 +140 +101 +121 +143 +104 +122 +144 +105 +122 +144 +106 +128 +149 +118 +132 +155 +126 +138 +158 +133 +141 +160 +138 +146 +163 +144 +151 +168 +150 +152 +169 +153 +150 +166 +153 +145 +162 +146 +135 +152 +134 +122 +141 +121 +112 +131 +109 +103 +126 +98 +94 +119 +89 +84 +109 +77 +80 +99 +71 +82 +87 +67 +88 +85 +70 +89 +85 +73 +55 +56 +50 +55 +56 +50 +56 +57 +51 +57 +58 +52 +59 +60 +54 +61 +62 +56 +64 +63 +58 +65 +64 +59 +66 +65 +60 +66 +65 +60 +68 +65 +60 +68 +65 +60 +68 +65 +60 +68 +65 +60 +69 +64 +60 +69 +64 +60 +71 +66 +60 +71 +66 +60 +71 +66 +60 +70 +65 +59 +70 +65 +59 +70 +66 +57 +72 +65 +57 +72 +65 +57 +76 +67 +60 +75 +66 +57 +74 +65 +56 +73 +64 +55 +72 +62 +53 +71 +61 +51 +70 +60 +50 +69 +59 +49 +68 +58 +48 +68 +58 +48 +69 +59 +49 +69 +59 +50 +68 +59 +50 +69 +60 +51 +69 +60 +53 +69 +60 +53 +64 +57 +49 +63 +56 +48 +61 +56 +50 +60 +55 +49 +59 +54 +48 +58 +53 +47 +58 +53 +47 +58 +53 +47 +57 +54 +47 +57 +54 +45 +59 +55 +46 +59 +55 +44 +63 +56 +46 +64 +58 +46 +67 +59 +48 +68 +60 +47 +70 +60 +48 +70 +61 +46 +74 +62 +48 +75 +63 +47 +77 +64 +48 +77 +64 +48 +77 +64 +47 +77 +64 +48 +79 +63 +50 +79 +62 +52 +76 +62 +51 +75 +61 +50 +74 +60 +51 +71 +58 +49 +69 +59 +49 +68 +58 +48 +68 +59 +50 +68 +59 +50 +66 +59 +49 +64 +60 +49 +64 +60 +51 +65 +61 +52 +66 +62 +53 +70 +60 +51 +81 +56 +49 +88 +43 +38 +135 +59 +63 +189 +85 +96 +216 +85 +101 +228 +86 +102 +226 +86 +99 +201 +75 +79 +157 +52 +48 +148 +58 +47 +144 +62 +48 +152 +66 +51 +173 +70 +61 +196 +74 +71 +212 +67 +72 +203 +63 +64 +177 +66 +55 +167 +70 +53 +169 +66 +51 +172 +64 +51 +175 +63 +51 +176 +62 +51 +179 +66 +52 +180 +68 +54 +178 +71 +53 +169 +66 +47 +163 +60 +41 +164 +59 +40 +169 +60 +40 +171 +58 +40 +174 +54 +38 +173 +51 +40 +182 +57 +55 +186 +57 +61 +187 +56 +62 +186 +55 +60 +190 +61 +66 +197 +74 +76 +196 +84 +83 +190 +88 +83 +153 +63 +55 +139 +52 +42 +135 +45 +37 +157 +54 +49 +195 +72 +75 +219 +80 +87 +224 +66 +81 +218 +52 +64 +221 +59 +57 +204 +47 +42 +209 +57 +52 +198 +56 +52 +197 +70 +64 +200 +93 +85 +167 +88 +75 +144 +87 +70 +119 +87 +64 +120 +100 +73 +126 +112 +83 +130 +111 +81 +133 +102 +74 +145 +99 +75 +172 +109 +91 +213 +117 +105 +234 +85 +87 +246 +70 +80 +242 +62 +74 +242 +60 +73 +249 +64 +78 +253 +67 +81 +249 +61 +76 +243 +55 +72 +253 +66 +83 +248 +60 +77 +244 +55 +75 +246 +54 +75 +248 +52 +74 +249 +50 +73 +255 +51 +78 +255 +56 +83 +255 +51 +84 +252 +53 +86 +252 +54 +87 +249 +56 +87 +247 +58 +90 +248 +61 +92 +246 +63 +94 +245 +64 +97 +247 +67 +102 +245 +67 +103 +244 +64 +101 +245 +63 +103 +247 +65 +105 +252 +67 +109 +255 +71 +115 +255 +74 +115 +255 +81 +117 +253 +84 +117 +250 +87 +118 +239 +85 +113 +228 +86 +110 +226 +99 +120 +213 +102 +118 +180 +89 +98 +124 +49 +53 +104 +48 +47 +88 +49 +42 +80 +56 +44 +71 +62 +47 +63 +64 +46 +59 +68 +47 +65 +70 +47 +81 +74 +46 +95 +84 +56 +103 +96 +67 +111 +107 +78 +124 +124 +96 +136 +142 +114 +135 +145 +118 +125 +139 +113 +122 +141 +113 +124 +143 +115 +124 +143 +115 +122 +141 +111 +122 +138 +109 +125 +140 +111 +131 +146 +117 +136 +151 +122 +149 +163 +138 +156 +169 +149 +163 +174 +157 +166 +177 +161 +172 +180 +167 +177 +185 +174 +176 +183 +176 +171 +181 +173 +161 +171 +162 +148 +160 +148 +131 +145 +130 +115 +132 +113 +104 +124 +99 +93 +116 +88 +83 +108 +78 +80 +100 +72 +80 +88 +67 +86 +87 +69 +87 +88 +72 +54 +55 +49 +54 +55 +49 +55 +56 +50 +56 +57 +51 +58 +59 +53 +60 +61 +55 +63 +62 +57 +64 +63 +58 +66 +65 +60 +66 +65 +60 +68 +65 +60 +68 +65 +60 +68 +65 +60 +69 +66 +61 +70 +65 +61 +70 +65 +61 +70 +67 +60 +70 +67 +60 +71 +66 +60 +72 +67 +61 +72 +68 +59 +72 +68 +59 +74 +67 +59 +74 +67 +57 +76 +67 +58 +75 +66 +57 +75 +65 +56 +74 +64 +54 +74 +61 +52 +73 +61 +49 +72 +60 +48 +71 +59 +47 +69 +59 +47 +69 +59 +47 +69 +59 +47 +69 +59 +49 +69 +59 +49 +69 +59 +49 +68 +59 +50 +68 +59 +50 +64 +57 +47 +64 +57 +47 +64 +57 +49 +63 +56 +48 +60 +55 +49 +59 +54 +48 +59 +54 +48 +58 +53 +47 +59 +55 +46 +59 +55 +46 +59 +55 +46 +60 +56 +45 +63 +56 +46 +65 +59 +47 +67 +59 +48 +68 +60 +47 +71 +61 +49 +71 +62 +47 +75 +63 +49 +77 +64 +48 +77 +64 +48 +78 +65 +48 +79 +63 +47 +79 +63 +48 +79 +63 +50 +78 +61 +51 +78 +61 +51 +74 +60 +49 +73 +59 +48 +71 +59 +47 +68 +58 +48 +68 +58 +48 +68 +60 +49 +68 +60 +49 +66 +59 +49 +64 +60 +49 +65 +61 +50 +65 +63 +51 +66 +63 +54 +75 +61 +52 +91 +54 +46 +116 +52 +50 +172 +77 +83 +218 +94 +105 +229 +78 +95 +226 +65 +81 +213 +55 +69 +182 +39 +43 +167 +50 +41 +156 +56 +40 +145 +58 +38 +149 +61 +41 +171 +65 +51 +193 +69 +61 +211 +63 +63 +204 +60 +59 +177 +63 +53 +168 +66 +52 +170 +64 +50 +173 +63 +50 +178 +64 +53 +184 +67 +57 +188 +72 +59 +187 +74 +60 +172 +62 +47 +170 +63 +47 +168 +61 +43 +166 +59 +41 +170 +57 +41 +176 +58 +44 +183 +59 +47 +187 +61 +49 +200 +71 +65 +204 +69 +65 +206 +64 +63 +205 +57 +57 +211 +56 +60 +220 +67 +69 +223 +77 +78 +218 +83 +79 +193 +68 +62 +195 +77 +67 +203 +84 +76 +209 +85 +77 +215 +75 +74 +218 +64 +66 +223 +53 +62 +224 +51 +55 +217 +52 +46 +215 +57 +46 +205 +51 +43 +206 +59 +52 +190 +57 +52 +178 +65 +57 +181 +91 +80 +150 +85 +67 +123 +78 +57 +130 +98 +73 +136 +106 +80 +133 +96 +70 +147 +90 +70 +176 +100 +84 +206 +112 +100 +232 +109 +104 +231 +70 +75 +237 +60 +68 +230 +59 +67 +227 +62 +68 +227 +68 +72 +227 +73 +75 +228 +74 +76 +229 +73 +77 +240 +76 +83 +239 +68 +77 +239 +58 +73 +242 +55 +72 +245 +52 +71 +248 +49 +70 +254 +52 +76 +255 +58 +82 +255 +57 +86 +253 +58 +88 +252 +59 +88 +250 +59 +90 +251 +60 +93 +252 +63 +95 +253 +65 +98 +252 +67 +101 +253 +69 +105 +251 +69 +107 +250 +68 +108 +250 +68 +109 +250 +67 +111 +249 +68 +111 +249 +68 +113 +250 +67 +111 +255 +72 +112 +255 +66 +104 +255 +74 +109 +253 +79 +112 +238 +75 +104 +230 +80 +107 +226 +93 +114 +216 +99 +115 +186 +91 +99 +140 +64 +68 +96 +38 +36 +81 +43 +34 +86 +64 +51 +86 +79 +61 +74 +76 +55 +65 +67 +45 +82 +74 +51 +101 +89 +67 +117 +106 +86 +128 +123 +103 +142 +141 +121 +153 +156 +139 +149 +156 +140 +136 +147 +131 +130 +142 +128 +137 +151 +136 +143 +155 +141 +140 +153 +136 +135 +146 +130 +138 +147 +130 +151 +158 +142 +164 +168 +153 +178 +182 +167 +184 +188 +174 +191 +193 +182 +192 +193 +185 +194 +195 +189 +197 +198 +193 +195 +195 +195 +190 +190 +190 +176 +181 +177 +162 +169 +162 +141 +151 +140 +121 +135 +118 +105 +123 +101 +92 +115 +89 +84 +109 +79 +82 +102 +74 +80 +90 +66 +84 +89 +67 +86 +91 +71 +53 +54 +48 +53 +54 +48 +54 +55 +49 +55 +56 +50 +56 +57 +51 +58 +59 +53 +61 +60 +55 +62 +61 +56 +64 +63 +58 +64 +63 +58 +67 +64 +59 +68 +65 +60 +69 +66 +61 +69 +66 +61 +71 +66 +62 +71 +66 +62 +71 +68 +61 +71 +68 +61 +72 +67 +61 +73 +68 +62 +73 +69 +60 +73 +69 +60 +75 +68 +58 +76 +69 +59 +76 +67 +58 +75 +67 +56 +76 +66 +56 +75 +65 +53 +76 +64 +52 +75 +63 +51 +74 +62 +50 +73 +61 +49 +71 +61 +49 +71 +61 +49 +70 +60 +48 +70 +60 +48 +69 +59 +49 +69 +59 +49 +68 +59 +50 +67 +58 +49 +65 +58 +48 +65 +58 +48 +64 +57 +49 +64 +57 +49 +61 +56 +50 +60 +55 +49 +59 +54 +48 +59 +54 +48 +59 +55 +46 +59 +55 +46 +59 +55 +44 +60 +56 +45 +63 +57 +45 +65 +59 +47 +68 +60 +47 +69 +61 +48 +72 +63 +48 +74 +62 +48 +76 +63 +47 +77 +64 +48 +78 +65 +48 +78 +65 +48 +79 +63 +47 +79 +63 +47 +79 +63 +50 +78 +61 +51 +77 +60 +50 +76 +59 +49 +73 +59 +48 +71 +59 +47 +70 +57 +48 +67 +57 +47 +67 +59 +48 +66 +60 +48 +66 +59 +49 +64 +60 +49 +64 +62 +50 +65 +63 +51 +66 +63 +54 +78 +59 +52 +106 +57 +52 +149 +71 +69 +195 +90 +95 +218 +88 +98 +220 +68 +81 +219 +57 +70 +209 +52 +59 +188 +44 +43 +172 +50 +39 +159 +56 +37 +150 +58 +33 +148 +58 +32 +161 +61 +38 +179 +64 +46 +193 +59 +50 +189 +56 +49 +167 +55 +44 +162 +58 +45 +165 +57 +45 +167 +55 +44 +175 +58 +49 +184 +66 +56 +186 +69 +59 +183 +69 +58 +174 +62 +50 +173 +63 +48 +167 +60 +44 +164 +54 +39 +170 +54 +41 +182 +62 +48 +195 +68 +59 +202 +71 +61 +188 +58 +45 +203 +65 +54 +221 +70 +63 +232 +68 +66 +239 +63 +65 +239 +59 +62 +231 +52 +55 +218 +48 +48 +216 +57 +53 +222 +73 +66 +229 +85 +76 +224 +80 +71 +216 +63 +57 +214 +50 +48 +224 +48 +50 +231 +55 +55 +216 +49 +40 +221 +61 +47 +202 +46 +34 +205 +56 +49 +189 +52 +44 +174 +55 +47 +200 +104 +92 +184 +108 +92 +142 +87 +67 +135 +90 +67 +132 +86 +63 +139 +81 +61 +170 +91 +76 +209 +106 +97 +226 +103 +98 +229 +83 +84 +240 +69 +75 +239 +62 +70 +226 +60 +64 +216 +62 +62 +209 +66 +62 +209 +72 +66 +219 +80 +77 +233 +87 +87 +235 +79 +82 +238 +68 +77 +239 +59 +71 +245 +54 +70 +246 +50 +70 +246 +47 +68 +249 +50 +71 +253 +55 +78 +251 +57 +83 +248 +58 +84 +248 +58 +86 +249 +59 +87 +254 +61 +92 +255 +63 +97 +255 +67 +101 +255 +68 +107 +251 +60 +101 +251 +62 +104 +250 +63 +106 +247 +64 +108 +247 +64 +110 +244 +62 +110 +241 +61 +108 +241 +60 +105 +255 +74 +114 +251 +61 +97 +251 +66 +100 +255 +78 +110 +251 +77 +110 +243 +80 +109 +236 +86 +111 +224 +91 +110 +231 +114 +130 +194 +97 +106 +150 +74 +76 +116 +58 +56 +93 +53 +45 +82 +56 +43 +82 +66 +50 +87 +76 +58 +94 +81 +65 +114 +101 +85 +136 +124 +110 +149 +141 +130 +159 +157 +145 +166 +167 +159 +161 +166 +159 +150 +156 +152 +149 +158 +155 +158 +167 +164 +166 +175 +172 +166 +172 +168 +162 +167 +163 +166 +168 +163 +181 +180 +176 +194 +193 +188 +204 +201 +192 +209 +206 +197 +213 +208 +204 +213 +208 +205 +212 +206 +206 +213 +207 +209 +209 +203 +207 +203 +198 +202 +191 +189 +192 +176 +178 +175 +152 +159 +152 +128 +140 +126 +109 +126 +107 +96 +116 +91 +87 +110 +82 +86 +106 +78 +83 +95 +71 +86 +96 +72 +87 +95 +72 +53 +54 +48 +53 +54 +48 +53 +54 +48 +53 +54 +48 +54 +55 +49 +56 +57 +51 +58 +57 +52 +59 +58 +53 +61 +60 +55 +62 +61 +56 +65 +62 +57 +67 +64 +59 +68 +65 +60 +70 +67 +62 +72 +67 +63 +72 +67 +63 +71 +68 +61 +72 +69 +62 +73 +68 +62 +73 +68 +62 +74 +70 +61 +74 +70 +61 +77 +70 +60 +77 +70 +60 +77 +69 +58 +76 +68 +57 +77 +67 +57 +77 +67 +55 +78 +66 +54 +77 +65 +51 +78 +64 +51 +77 +65 +51 +74 +65 +50 +74 +65 +50 +73 +64 +49 +72 +63 +48 +71 +61 +49 +70 +60 +48 +68 +60 +49 +68 +60 +49 +67 +58 +49 +67 +58 +49 +65 +58 +50 +64 +57 +49 +63 +56 +50 +63 +56 +50 +60 +55 +49 +60 +55 +49 +60 +56 +47 +60 +56 +45 +60 +56 +45 +60 +56 +45 +64 +58 +46 +65 +59 +47 +68 +60 +47 +69 +61 +48 +72 +63 +48 +75 +63 +49 +77 +64 +48 +78 +65 +48 +80 +64 +48 +80 +64 +48 +79 +64 +45 +79 +63 +47 +79 +61 +49 +79 +61 +49 +77 +61 +48 +76 +60 +47 +73 +59 +48 +70 +58 +46 +69 +56 +47 +67 +57 +47 +66 +58 +47 +65 +59 +47 +65 +58 +48 +63 +59 +48 +63 +61 +49 +64 +62 +50 +64 +64 +52 +78 +58 +49 +111 +50 +47 +165 +75 +75 +190 +84 +86 +186 +63 +68 +188 +49 +54 +193 +48 +51 +191 +49 +47 +183 +50 +41 +167 +50 +33 +162 +57 +35 +155 +61 +33 +150 +61 +31 +152 +61 +32 +158 +63 +35 +164 +59 +37 +162 +55 +37 +158 +54 +41 +160 +56 +45 +162 +54 +44 +165 +52 +44 +173 +56 +49 +183 +64 +58 +184 +67 +60 +178 +64 +54 +177 +66 +55 +173 +65 +52 +168 +60 +47 +166 +56 +43 +175 +58 +48 +188 +67 +56 +195 +68 +61 +196 +65 +55 +193 +64 +45 +203 +64 +45 +213 +55 +43 +221 +44 +38 +232 +36 +37 +245 +39 +43 +253 +44 +49 +252 +49 +52 +233 +44 +42 +227 +48 +43 +220 +53 +44 +217 +55 +44 +220 +53 +44 +223 +52 +44 +229 +50 +45 +228 +51 +43 +215 +52 +37 +212 +55 +38 +207 +51 +38 +206 +55 +44 +196 +55 +46 +187 +63 +55 +199 +97 +85 +210 +127 +113 +166 +101 +83 +143 +86 +66 +139 +76 +58 +164 +86 +73 +203 +100 +91 +224 +99 +95 +232 +82 +84 +233 +66 +73 +246 +69 +77 +238 +63 +68 +225 +62 +63 +213 +64 +60 +202 +63 +56 +200 +63 +55 +211 +69 +65 +229 +77 +76 +240 +74 +78 +245 +63 +75 +251 +56 +72 +255 +54 +72 +254 +53 +72 +249 +50 +69 +249 +54 +71 +250 +59 +77 +247 +58 +80 +246 +58 +82 +246 +56 +82 +249 +56 +85 +251 +56 +88 +254 +59 +93 +255 +61 +97 +255 +63 +103 +255 +64 +106 +255 +64 +108 +255 +65 +112 +255 +67 +115 +251 +68 +116 +249 +67 +116 +247 +67 +115 +244 +67 +111 +251 +73 +109 +245 +68 +97 +249 +72 +101 +252 +77 +106 +250 +77 +107 +255 +88 +116 +255 +97 +122 +242 +94 +116 +240 +107 +126 +229 +113 +126 +211 +111 +119 +175 +93 +97 +132 +67 +65 +104 +54 +47 +105 +65 +55 +115 +85 +74 +121 +101 +92 +140 +125 +118 +163 +150 +144 +173 +163 +161 +178 +174 +171 +182 +182 +182 +178 +182 +185 +170 +175 +179 +176 +183 +189 +182 +189 +197 +189 +193 +202 +192 +195 +202 +195 +194 +202 +201 +198 +205 +213 +206 +214 +221 +215 +219 +226 +218 +216 +231 +221 +219 +233 +221 +221 +230 +218 +220 +229 +216 +223 +228 +215 +224 +224 +212 +222 +217 +207 +216 +202 +197 +203 +186 +186 +186 +162 +167 +163 +136 +146 +135 +116 +130 +113 +101 +120 +98 +92 +115 +87 +91 +111 +83 +92 +106 +80 +92 +105 +79 +94 +104 +79 +53 +54 +49 +53 +54 +49 +53 +54 +49 +53 +54 +48 +53 +54 +49 +54 +55 +49 +56 +55 +50 +57 +56 +51 +60 +59 +54 +61 +60 +55 +64 +61 +56 +66 +63 +58 +68 +65 +60 +70 +67 +60 +71 +68 +61 +72 +69 +62 +72 +69 +62 +72 +69 +62 +72 +69 +60 +74 +70 +61 +74 +70 +59 +75 +71 +59 +75 +71 +59 +78 +72 +58 +77 +71 +59 +77 +71 +59 +77 +69 +58 +77 +68 +59 +77 +68 +59 +77 +68 +61 +78 +67 +63 +78 +67 +61 +77 +67 +55 +77 +68 +53 +75 +66 +51 +74 +65 +50 +72 +62 +50 +71 +61 +49 +69 +61 +50 +68 +59 +50 +67 +58 +49 +67 +58 +51 +65 +58 +50 +65 +58 +52 +64 +57 +51 +63 +55 +52 +60 +55 +51 +60 +55 +49 +62 +55 +47 +62 +55 +47 +60 +56 +47 +61 +57 +48 +62 +58 +49 +65 +58 +50 +67 +60 +50 +68 +61 +51 +72 +64 +53 +73 +63 +51 +76 +64 +50 +77 +65 +49 +78 +65 +48 +80 +64 +48 +79 +64 +45 +79 +63 +47 +76 +62 +49 +76 +62 +51 +75 +61 +50 +76 +59 +51 +74 +57 +49 +73 +56 +49 +70 +55 +48 +67 +56 +50 +65 +56 +47 +62 +58 +47 +61 +59 +47 +60 +61 +47 +63 +61 +48 +64 +62 +47 +66 +63 +48 +83 +57 +44 +134 +61 +55 +193 +93 +91 +200 +90 +89 +174 +56 +54 +170 +47 +42 +177 +50 +43 +171 +47 +37 +171 +51 +35 +170 +58 +38 +171 +67 +42 +169 +71 +44 +163 +70 +39 +160 +66 +38 +161 +66 +38 +161 +61 +35 +158 +58 +35 +160 +57 +42 +163 +59 +48 +166 +58 +48 +166 +55 +46 +173 +60 +52 +182 +67 +60 +183 +69 +59 +176 +64 +53 +171 +61 +48 +168 +60 +47 +169 +59 +46 +172 +60 +48 +187 +69 +57 +198 +76 +65 +197 +69 +60 +188 +56 +44 +188 +55 +36 +201 +60 +40 +218 +61 +46 +227 +53 +44 +238 +44 +42 +246 +42 +43 +249 +40 +43 +247 +39 +39 +246 +44 +42 +241 +48 +43 +236 +52 +44 +232 +54 +44 +227 +53 +42 +226 +52 +41 +225 +51 +40 +222 +52 +37 +222 +59 +42 +207 +50 +31 +219 +63 +48 +205 +55 +41 +199 +57 +45 +194 +63 +53 +179 +65 +54 +209 +108 +96 +191 +103 +89 +165 +82 +66 +170 +78 +65 +205 +98 +90 +232 +103 +98 +231 +81 +82 +235 +64 +70 +246 +65 +74 +237 +60 +68 +227 +58 +61 +215 +59 +60 +207 +62 +57 +195 +61 +52 +185 +54 +44 +187 +52 +46 +199 +56 +52 +229 +71 +72 +234 +63 +69 +242 +58 +68 +249 +57 +72 +252 +57 +73 +250 +55 +71 +250 +58 +73 +251 +63 +78 +252 +67 +85 +251 +65 +86 +250 +63 +84 +249 +59 +84 +251 +58 +85 +253 +58 +90 +255 +59 +94 +255 +60 +99 +255 +64 +104 +255 +63 +107 +255 +63 +110 +251 +63 +111 +247 +64 +112 +245 +65 +113 +245 +64 +115 +243 +66 +112 +244 +68 +106 +252 +79 +109 +255 +86 +115 +243 +76 +104 +231 +66 +96 +249 +86 +115 +255 +105 +133 +255 +102 +130 +246 +94 +119 +238 +96 +120 +231 +104 +123 +220 +112 +125 +199 +112 +120 +170 +102 +103 +143 +92 +88 +126 +89 +81 +153 +126 +119 +171 +152 +146 +190 +176 +173 +197 +187 +186 +198 +194 +195 +200 +199 +204 +199 +199 +207 +195 +195 +207 +203 +202 +216 +204 +202 +216 +209 +202 +218 +215 +206 +223 +221 +213 +228 +230 +219 +233 +232 +224 +235 +237 +227 +235 +239 +229 +230 +242 +232 +230 +244 +232 +232 +240 +228 +230 +238 +225 +232 +237 +224 +233 +234 +221 +231 +228 +216 +226 +209 +202 +209 +193 +191 +194 +171 +171 +169 +145 +150 +143 +122 +134 +120 +108 +123 +104 +98 +117 +95 +96 +114 +90 +100 +114 +89 +100 +112 +88 +100 +110 +86 +50 +49 +47 +51 +50 +48 +52 +51 +49 +54 +53 +49 +56 +55 +53 +57 +56 +52 +57 +56 +52 +57 +56 +52 +59 +58 +53 +60 +59 +54 +61 +61 +53 +63 +63 +55 +65 +65 +57 +67 +67 +57 +69 +69 +59 +69 +69 +59 +72 +72 +64 +72 +72 +62 +72 +72 +60 +74 +72 +59 +75 +74 +56 +76 +75 +55 +77 +76 +56 +78 +75 +56 +77 +74 +57 +74 +70 +58 +71 +68 +59 +74 +70 +67 +78 +73 +77 +78 +73 +80 +71 +68 +79 +68 +63 +69 +78 +69 +62 +76 +67 +52 +74 +64 +52 +75 +65 +53 +77 +67 +57 +76 +66 +56 +70 +61 +52 +66 +57 +48 +69 +60 +53 +67 +58 +53 +64 +57 +51 +63 +55 +52 +64 +56 +53 +63 +55 +53 +60 +55 +52 +60 +52 +50 +67 +58 +53 +66 +57 +52 +65 +57 +54 +62 +57 +53 +63 +58 +55 +62 +58 +55 +63 +59 +56 +64 +60 +57 +66 +63 +58 +68 +64 +55 +71 +64 +54 +74 +64 +52 +76 +64 +48 +79 +64 +45 +79 +64 +43 +76 +63 +44 +70 +64 +50 +69 +62 +52 +72 +59 +51 +74 +56 +52 +75 +54 +53 +77 +52 +55 +75 +55 +57 +72 +58 +58 +67 +62 +58 +55 +56 +48 +55 +59 +45 +62 +66 +49 +62 +64 +43 +58 +56 +35 +67 +59 +36 +101 +66 +46 +189 +106 +92 +183 +75 +65 +166 +55 +44 +164 +54 +41 +167 +55 +43 +164 +54 +39 +163 +56 +38 +168 +61 +43 +162 +57 +36 +165 +60 +38 +169 +64 +42 +171 +65 +41 +172 +61 +41 +172 +57 +38 +174 +54 +37 +170 +55 +37 +164 +54 +39 +161 +55 +41 +162 +56 +42 +166 +60 +46 +170 +64 +50 +172 +66 +52 +172 +66 +50 +172 +65 +49 +169 +62 +44 +171 +61 +44 +173 +60 +44 +179 +61 +47 +189 +67 +52 +196 +70 +56 +192 +62 +49 +184 +50 +38 +199 +57 +43 +203 +57 +42 +207 +57 +43 +213 +57 +45 +219 +55 +45 +225 +54 +46 +231 +52 +47 +237 +50 +45 +240 +46 +44 +242 +47 +45 +242 +49 +44 +239 +50 +44 +234 +53 +42 +227 +55 +41 +221 +58 +41 +218 +59 +40 +219 +58 +38 +212 +51 +31 +207 +52 +32 +206 +56 +39 +197 +56 +39 +190 +54 +40 +194 +66 +53 +207 +83 +73 +200 +78 +67 +207 +83 +75 +225 +92 +87 +238 +93 +90 +240 +80 +82 +237 +62 +67 +243 +56 +63 +248 +63 +71 +235 +64 +70 +225 +67 +68 +214 +64 +65 +201 +62 +57 +187 +60 +51 +179 +58 +47 +177 +59 +47 +180 +59 +48 +202 +76 +64 +212 +75 +67 +222 +70 +67 +226 +62 +63 +235 +60 +65 +248 +63 +71 +254 +62 +73 +249 +59 +71 +253 +69 +81 +250 +68 +81 +253 +68 +82 +255 +68 +85 +253 +64 +86 +250 +60 +85 +254 +61 +90 +255 +66 +100 +255 +70 +107 +255 +65 +106 +249 +59 +103 +245 +58 +103 +244 +61 +109 +248 +68 +115 +253 +73 +121 +255 +75 +122 +255 +78 +121 +255 +78 +117 +249 +81 +116 +239 +82 +113 +229 +79 +106 +229 +79 +106 +247 +90 +119 +255 +103 +135 +255 +93 +128 +240 +69 +105 +245 +86 +118 +232 +94 +120 +198 +91 +109 +194 +117 +125 +140 +92 +92 +145 +114 +109 +171 +143 +132 +189 +167 +156 +212 +195 +187 +222 +213 +208 +221 +220 +218 +220 +219 +224 +222 +220 +231 +226 +219 +235 +231 +216 +237 +235 +216 +238 +241 +217 +241 +244 +220 +242 +245 +227 +243 +245 +231 +244 +243 +236 +244 +244 +239 +243 +248 +243 +240 +248 +243 +239 +248 +240 +238 +245 +236 +237 +242 +231 +235 +237 +226 +232 +232 +221 +227 +229 +220 +225 +214 +208 +212 +205 +201 +202 +187 +186 +184 +163 +165 +160 +139 +144 +137 +121 +131 +120 +114 +125 +111 +112 +123 +107 +123 +132 +115 +119 +128 +109 +118 +125 +107 +48 +46 +47 +49 +47 +48 +51 +50 +48 +53 +52 +50 +54 +53 +51 +55 +54 +50 +56 +55 +51 +56 +55 +50 +58 +57 +52 +59 +58 +53 +61 +61 +53 +63 +63 +55 +65 +65 +55 +67 +67 +57 +68 +68 +56 +69 +69 +59 +72 +72 +62 +72 +72 +62 +72 +72 +60 +74 +72 +57 +75 +74 +54 +76 +75 +54 +77 +77 +53 +78 +77 +56 +75 +74 +56 +75 +73 +61 +75 +74 +69 +80 +80 +82 +87 +85 +96 +89 +88 +106 +86 +84 +106 +82 +79 +96 +79 +73 +75 +77 +68 +63 +72 +63 +58 +70 +61 +56 +71 +62 +57 +72 +63 +58 +70 +61 +56 +66 +59 +53 +68 +58 +56 +65 +57 +54 +63 +55 +52 +63 +55 +52 +64 +56 +53 +64 +56 +53 +61 +56 +53 +59 +54 +50 +61 +52 +47 +61 +52 +47 +61 +53 +50 +60 +55 +52 +61 +57 +54 +62 +58 +57 +61 +60 +58 +62 +61 +57 +66 +63 +58 +68 +63 +57 +71 +64 +54 +74 +64 +52 +77 +64 +48 +79 +64 +45 +80 +63 +43 +76 +63 +44 +65 +64 +46 +63 +64 +50 +69 +60 +53 +72 +57 +54 +74 +54 +55 +74 +52 +55 +70 +51 +55 +67 +52 +55 +65 +60 +57 +60 +59 +54 +61 +61 +49 +69 +63 +49 +74 +58 +42 +80 +54 +37 +100 +65 +46 +133 +74 +58 +176 +80 +66 +171 +59 +45 +160 +50 +35 +161 +54 +38 +163 +58 +39 +158 +55 +36 +158 +57 +37 +163 +62 +42 +161 +59 +37 +167 +60 +40 +174 +63 +43 +179 +64 +45 +182 +61 +44 +183 +57 +42 +184 +54 +40 +181 +55 +41 +170 +57 +41 +165 +58 +42 +164 +57 +41 +165 +59 +43 +168 +62 +46 +171 +65 +49 +171 +66 +47 +171 +64 +46 +174 +63 +44 +171 +58 +40 +177 +60 +43 +191 +69 +54 +198 +72 +57 +193 +63 +49 +188 +56 +43 +192 +54 +41 +203 +55 +43 +207 +55 +44 +208 +57 +46 +209 +59 +45 +212 +60 +47 +216 +58 +46 +224 +56 +47 +231 +52 +45 +238 +49 +45 +244 +46 +43 +244 +46 +43 +241 +48 +43 +234 +52 +41 +225 +55 +40 +215 +58 +39 +213 +58 +36 +222 +60 +39 +217 +54 +35 +213 +56 +37 +212 +61 +42 +204 +59 +42 +193 +53 +38 +196 +58 +47 +207 +70 +60 +209 +70 +63 +218 +73 +68 +233 +79 +77 +243 +80 +81 +244 +71 +73 +240 +59 +64 +245 +58 +65 +248 +67 +72 +229 +66 +69 +218 +68 +67 +210 +66 +65 +197 +62 +56 +183 +59 +49 +174 +58 +45 +170 +60 +45 +171 +61 +46 +182 +69 +53 +198 +76 +63 +212 +78 +69 +220 +71 +67 +227 +63 +62 +239 +63 +66 +250 +63 +70 +254 +64 +74 +248 +67 +74 +247 +67 +76 +250 +68 +80 +255 +70 +84 +253 +66 +83 +249 +62 +83 +252 +62 +88 +255 +66 +97 +255 +70 +104 +255 +67 +105 +252 +63 +105 +249 +64 +106 +249 +66 +112 +252 +70 +118 +254 +74 +122 +255 +75 +123 +255 +72 +120 +255 +71 +115 +244 +74 +111 +242 +82 +116 +243 +93 +122 +246 +96 +123 +247 +88 +118 +247 +79 +112 +250 +70 +107 +248 +68 +107 +238 +68 +104 +220 +73 +102 +203 +92 +111 +182 +106 +116 +115 +71 +72 +150 +121 +115 +180 +148 +137 +206 +176 +165 +229 +209 +200 +239 +226 +220 +235 +231 +230 +233 +232 +237 +236 +230 +242 +237 +226 +243 +246 +227 +249 +251 +225 +250 +255 +227 +253 +255 +230 +253 +255 +236 +254 +255 +242 +253 +254 +247 +254 +252 +250 +251 +253 +249 +246 +252 +249 +244 +251 +246 +243 +249 +244 +241 +247 +238 +239 +243 +234 +237 +240 +231 +236 +238 +229 +234 +230 +221 +224 +220 +214 +216 +202 +198 +197 +179 +178 +174 +158 +161 +154 +142 +147 +140 +137 +143 +133 +136 +144 +131 +142 +148 +134 +137 +144 +128 +134 +140 +126 +47 +46 +44 +48 +47 +45 +49 +48 +46 +50 +49 +47 +52 +51 +47 +53 +52 +48 +55 +54 +50 +55 +54 +49 +58 +57 +52 +58 +58 +50 +60 +60 +52 +62 +62 +54 +64 +64 +54 +66 +66 +56 +67 +67 +57 +68 +68 +58 +73 +70 +61 +73 +71 +59 +74 +72 +59 +76 +73 +56 +77 +74 +55 +78 +76 +55 +78 +76 +55 +79 +76 +57 +75 +73 +58 +78 +75 +66 +84 +82 +83 +95 +94 +102 +105 +104 +120 +109 +109 +133 +108 +107 +138 +107 +104 +131 +96 +89 +105 +89 +81 +92 +79 +71 +82 +72 +64 +75 +72 +62 +71 +71 +61 +69 +69 +60 +65 +64 +58 +60 +67 +58 +59 +63 +58 +55 +60 +55 +52 +60 +55 +51 +61 +56 +50 +62 +57 +51 +62 +58 +49 +61 +57 +48 +56 +51 +45 +57 +52 +46 +59 +54 +48 +60 +57 +50 +61 +58 +51 +62 +59 +52 +63 +60 +53 +64 +60 +51 +69 +62 +52 +71 +63 +52 +73 +63 +51 +76 +64 +48 +79 +63 +48 +80 +63 +47 +80 +63 +45 +76 +63 +44 +60 +59 +39 +58 +61 +42 +62 +60 +47 +65 +58 +48 +66 +55 +51 +67 +53 +52 +63 +52 +50 +60 +50 +49 +63 +55 +52 +68 +57 +53 +75 +56 +50 +82 +49 +44 +92 +43 +39 +111 +46 +44 +139 +58 +57 +164 +69 +67 +165 +58 +48 +162 +50 +36 +159 +49 +32 +164 +57 +39 +165 +60 +41 +158 +55 +36 +158 +56 +34 +162 +60 +38 +164 +59 +38 +170 +61 +41 +177 +65 +45 +182 +65 +47 +185 +62 +46 +187 +60 +45 +190 +58 +45 +190 +60 +47 +178 +60 +46 +172 +60 +46 +169 +57 +43 +169 +57 +43 +171 +60 +43 +173 +62 +45 +173 +62 +45 +173 +60 +44 +178 +63 +45 +176 +56 +40 +185 +62 +46 +203 +76 +61 +203 +71 +58 +188 +54 +42 +186 +50 +38 +201 +57 +46 +208 +54 +44 +212 +54 +43 +212 +56 +44 +214 +58 +46 +216 +58 +47 +220 +56 +46 +227 +54 +47 +232 +51 +44 +240 +48 +45 +244 +46 +43 +244 +46 +43 +240 +49 +41 +231 +50 +39 +221 +54 +38 +212 +56 +34 +210 +55 +33 +221 +56 +36 +220 +53 +35 +218 +57 +39 +218 +62 +47 +211 +61 +46 +200 +54 +41 +197 +57 +44 +203 +65 +55 +201 +60 +53 +205 +62 +56 +217 +69 +65 +229 +75 +73 +234 +74 +74 +233 +67 +67 +236 +63 +65 +235 +67 +67 +222 +67 +65 +213 +68 +63 +205 +66 +61 +194 +61 +52 +182 +58 +46 +174 +56 +42 +171 +58 +42 +172 +59 +43 +172 +56 +41 +192 +68 +56 +212 +78 +69 +221 +73 +69 +224 +64 +64 +232 +62 +65 +247 +66 +73 +255 +72 +80 +244 +65 +71 +244 +64 +73 +249 +67 +79 +253 +71 +84 +254 +69 +85 +250 +64 +85 +251 +63 +88 +254 +65 +95 +255 +68 +102 +255 +67 +105 +255 +67 +107 +255 +70 +112 +255 +73 +119 +255 +75 +123 +255 +76 +124 +255 +74 +122 +255 +66 +116 +255 +68 +116 +254 +72 +113 +250 +78 +116 +252 +91 +124 +255 +98 +128 +250 +87 +118 +236 +69 +99 +248 +77 +109 +254 +86 +119 +218 +64 +92 +203 +71 +94 +218 +121 +132 +187 +121 +123 +103 +64 +59 +151 +123 +112 +178 +140 +129 +215 +177 +166 +245 +216 +208 +253 +234 +228 +250 +240 +239 +250 +245 +249 +249 +243 +253 +244 +236 +251 +251 +233 +255 +255 +233 +255 +255 +234 +255 +255 +237 +255 +255 +242 +255 +255 +246 +255 +255 +251 +255 +255 +254 +252 +255 +253 +250 +255 +252 +248 +255 +249 +247 +255 +247 +245 +254 +244 +245 +252 +242 +243 +250 +239 +243 +248 +239 +242 +240 +231 +234 +229 +223 +225 +211 +207 +206 +190 +189 +185 +173 +174 +168 +162 +165 +158 +157 +163 +153 +157 +163 +151 +163 +171 +158 +157 +165 +150 +153 +161 +148 +47 +46 +44 +47 +46 +44 +48 +47 +45 +49 +48 +44 +50 +49 +45 +51 +50 +46 +53 +52 +47 +54 +53 +48 +56 +56 +48 +57 +57 +49 +59 +59 +51 +61 +61 +53 +63 +63 +53 +65 +65 +55 +66 +66 +56 +67 +67 +57 +72 +69 +60 +74 +70 +59 +75 +72 +57 +77 +74 +57 +80 +75 +56 +79 +77 +56 +81 +76 +56 +79 +76 +59 +76 +74 +62 +81 +80 +76 +94 +93 +98 +109 +108 +122 +122 +122 +146 +129 +130 +161 +128 +130 +168 +128 +128 +166 +123 +117 +151 +114 +107 +138 +101 +95 +123 +89 +83 +109 +84 +76 +100 +77 +69 +90 +71 +64 +80 +66 +60 +72 +68 +63 +70 +64 +59 +63 +60 +56 +55 +59 +54 +51 +59 +54 +48 +60 +56 +47 +61 +57 +46 +59 +56 +47 +58 +55 +48 +57 +57 +49 +59 +59 +51 +62 +59 +50 +63 +61 +49 +64 +60 +49 +63 +59 +47 +65 +59 +45 +70 +63 +47 +72 +63 +46 +75 +63 +47 +77 +64 +47 +79 +63 +48 +79 +63 +47 +80 +62 +48 +76 +63 +47 +66 +61 +42 +63 +62 +44 +64 +61 +46 +65 +58 +48 +65 +58 +50 +64 +57 +51 +62 +57 +53 +60 +57 +52 +61 +56 +52 +70 +56 +53 +80 +52 +49 +88 +44 +43 +107 +41 +43 +135 +48 +54 +161 +55 +65 +174 +61 +65 +167 +54 +46 +165 +55 +40 +165 +58 +40 +170 +63 +45 +168 +63 +44 +160 +57 +38 +161 +56 +35 +164 +59 +38 +165 +58 +38 +171 +60 +41 +179 +62 +44 +185 +64 +47 +189 +62 +47 +193 +61 +48 +197 +61 +49 +196 +62 +50 +189 +63 +51 +182 +61 +50 +178 +57 +46 +174 +56 +42 +175 +57 +43 +176 +58 +44 +178 +58 +44 +179 +57 +42 +182 +59 +44 +185 +59 +45 +196 +66 +52 +203 +69 +57 +200 +62 +51 +190 +49 +39 +192 +50 +40 +205 +57 +47 +214 +53 +43 +216 +52 +42 +218 +54 +45 +219 +55 +45 +222 +55 +46 +225 +54 +44 +230 +51 +44 +236 +49 +42 +243 +48 +44 +244 +46 +43 +244 +47 +41 +239 +48 +40 +228 +50 +38 +219 +52 +36 +210 +54 +32 +208 +53 +31 +215 +50 +30 +218 +48 +31 +218 +52 +36 +220 +60 +46 +214 +61 +47 +208 +57 +46 +205 +61 +50 +210 +68 +58 +196 +53 +45 +197 +54 +48 +202 +59 +53 +216 +68 +64 +226 +77 +73 +229 +75 +73 +222 +67 +63 +214 +61 +56 +211 +64 +57 +206 +65 +56 +199 +62 +52 +190 +60 +47 +181 +58 +43 +176 +56 +42 +175 +57 +43 +177 +59 +45 +172 +52 +38 +189 +63 +51 +209 +72 +64 +217 +72 +67 +221 +66 +64 +229 +64 +68 +243 +70 +76 +253 +78 +85 +240 +63 +69 +240 +63 +69 +246 +66 +77 +254 +72 +85 +254 +72 +87 +252 +66 +87 +250 +64 +88 +252 +65 +94 +255 +65 +99 +255 +67 +102 +255 +70 +109 +255 +73 +114 +255 +77 +121 +255 +79 +124 +255 +76 +123 +255 +72 +121 +255 +63 +113 +255 +74 +122 +255 +79 +122 +252 +73 +112 +246 +77 +110 +252 +87 +117 +252 +87 +117 +243 +79 +106 +239 +75 +102 +236 +78 +103 +206 +62 +85 +220 +98 +113 +251 +156 +164 +211 +141 +141 +104 +57 +51 +113 +75 +64 +166 +119 +109 +210 +163 +155 +247 +210 +202 +255 +231 +226 +255 +242 +241 +255 +251 +254 +255 +250 +255 +249 +241 +254 +250 +237 +255 +252 +237 +255 +255 +237 +255 +255 +240 +255 +255 +242 +253 +255 +246 +254 +254 +250 +251 +255 +251 +250 +255 +252 +249 +255 +251 +247 +255 +249 +247 +255 +248 +246 +255 +245 +246 +254 +244 +245 +254 +243 +247 +253 +242 +246 +246 +235 +239 +236 +227 +228 +218 +213 +210 +201 +198 +193 +186 +185 +180 +179 +180 +172 +177 +180 +169 +176 +182 +170 +183 +191 +180 +175 +183 +172 +169 +177 +166 +49 +48 +44 +49 +48 +44 +48 +47 +43 +48 +47 +43 +49 +48 +44 +50 +49 +44 +52 +51 +46 +53 +52 +47 +55 +55 +47 +56 +56 +48 +57 +57 +49 +59 +59 +51 +61 +61 +51 +63 +63 +53 +65 +65 +55 +68 +65 +56 +73 +69 +58 +76 +70 +58 +78 +72 +58 +80 +74 +58 +82 +75 +57 +82 +77 +58 +83 +76 +58 +81 +75 +61 +79 +74 +68 +86 +84 +85 +102 +100 +113 +119 +120 +141 +134 +134 +168 +141 +144 +185 +143 +147 +195 +143 +144 +198 +142 +139 +192 +135 +131 +182 +123 +119 +169 +112 +109 +154 +105 +100 +141 +95 +91 +126 +85 +80 +110 +78 +74 +97 +75 +71 +88 +69 +66 +77 +63 +61 +66 +59 +55 +56 +57 +53 +50 +57 +54 +47 +56 +53 +44 +56 +53 +44 +54 +55 +49 +55 +56 +51 +56 +57 +49 +59 +59 +49 +62 +60 +47 +63 +60 +43 +66 +61 +42 +67 +60 +41 +71 +63 +44 +74 +63 +43 +75 +64 +44 +76 +65 +47 +77 +64 +48 +77 +63 +50 +76 +64 +52 +76 +62 +51 +77 +63 +52 +76 +62 +53 +73 +58 +51 +67 +56 +50 +63 +56 +50 +60 +57 +52 +56 +59 +52 +55 +60 +53 +57 +60 +51 +64 +57 +49 +72 +51 +46 +90 +49 +47 +119 +55 +56 +149 +62 +68 +167 +61 +71 +169 +56 +60 +170 +59 +48 +170 +60 +43 +171 +64 +46 +172 +65 +47 +169 +64 +45 +165 +60 +41 +166 +59 +39 +171 +62 +42 +167 +56 +36 +173 +58 +39 +181 +60 +43 +188 +61 +46 +193 +60 +45 +197 +59 +46 +202 +60 +48 +202 +61 +51 +197 +63 +54 +190 +62 +51 +186 +58 +47 +183 +55 +44 +183 +55 +44 +184 +56 +43 +186 +56 +43 +186 +56 +43 +187 +55 +43 +199 +65 +53 +205 +67 +56 +197 +56 +46 +193 +49 +38 +198 +51 +41 +203 +55 +45 +207 +53 +43 +219 +52 +43 +223 +51 +41 +225 +52 +45 +226 +54 +44 +227 +53 +44 +231 +53 +43 +236 +49 +42 +240 +47 +42 +245 +47 +44 +246 +47 +42 +242 +47 +41 +236 +48 +39 +226 +50 +35 +217 +52 +33 +208 +53 +31 +207 +52 +30 +214 +49 +30 +217 +47 +30 +216 +50 +34 +216 +54 +41 +215 +57 +45 +212 +58 +48 +214 +63 +54 +216 +69 +61 +214 +70 +62 +205 +64 +55 +201 +60 +53 +203 +64 +57 +214 +75 +68 +217 +78 +71 +210 +69 +62 +197 +59 +49 +197 +61 +49 +194 +60 +48 +192 +60 +47 +186 +59 +44 +183 +57 +42 +180 +58 +43 +182 +60 +45 +185 +63 +48 +181 +57 +45 +191 +60 +50 +201 +64 +58 +210 +67 +63 +219 +67 +66 +227 +68 +72 +237 +74 +79 +246 +79 +86 +236 +63 +69 +237 +62 +67 +242 +66 +76 +251 +73 +85 +255 +74 +89 +253 +70 +88 +250 +67 +89 +251 +67 +93 +251 +64 +95 +251 +66 +100 +255 +69 +108 +255 +74 +115 +255 +78 +122 +255 +79 +124 +255 +76 +121 +255 +72 +118 +255 +68 +114 +255 +78 +124 +255 +80 +122 +251 +72 +111 +245 +74 +108 +253 +86 +116 +254 +87 +115 +243 +81 +105 +231 +71 +95 +224 +72 +93 +226 +88 +104 +255 +147 +158 +255 +178 +184 +239 +155 +155 +140 +72 +69 +108 +47 +42 +166 +106 +98 +206 +149 +142 +243 +198 +192 +255 +225 +220 +255 +240 +239 +255 +251 +253 +255 +253 +255 +251 +246 +253 +252 +246 +255 +253 +245 +255 +255 +245 +255 +255 +246 +255 +255 +248 +255 +255 +250 +254 +255 +252 +251 +255 +252 +249 +255 +251 +247 +255 +250 +247 +255 +248 +247 +255 +247 +246 +255 +245 +247 +255 +244 +246 +255 +243 +247 +255 +243 +247 +253 +241 +243 +243 +233 +234 +228 +220 +218 +214 +209 +205 +205 +202 +195 +201 +201 +191 +202 +202 +192 +202 +205 +194 +201 +208 +200 +190 +200 +191 +182 +192 +183 +54 +53 +49 +52 +51 +46 +51 +50 +46 +49 +48 +43 +49 +48 +43 +50 +49 +44 +51 +50 +45 +52 +51 +46 +54 +54 +46 +55 +55 +47 +56 +56 +48 +58 +58 +50 +60 +60 +50 +62 +62 +52 +64 +64 +54 +66 +64 +52 +74 +68 +56 +77 +69 +56 +79 +72 +56 +82 +75 +59 +84 +75 +58 +84 +77 +59 +83 +76 +60 +82 +75 +65 +81 +76 +73 +90 +87 +94 +108 +105 +124 +127 +126 +157 +140 +143 +184 +150 +153 +204 +153 +158 +216 +154 +158 +222 +153 +152 +218 +148 +145 +212 +140 +138 +201 +134 +133 +191 +129 +126 +181 +120 +118 +167 +110 +107 +150 +102 +101 +135 +93 +90 +119 +86 +84 +105 +77 +75 +89 +68 +65 +74 +62 +60 +63 +59 +58 +56 +59 +55 +52 +55 +54 +50 +53 +53 +53 +52 +53 +55 +54 +54 +52 +56 +55 +50 +60 +58 +46 +63 +60 +43 +67 +62 +42 +70 +64 +42 +71 +63 +42 +72 +64 +43 +73 +65 +44 +73 +66 +48 +73 +65 +52 +72 +66 +54 +72 +65 +57 +72 +63 +58 +76 +61 +58 +76 +58 +58 +71 +55 +55 +64 +54 +53 +58 +54 +53 +53 +55 +52 +49 +56 +49 +47 +57 +48 +55 +60 +53 +55 +52 +43 +67 +48 +41 +93 +56 +50 +126 +66 +65 +149 +71 +71 +157 +63 +64 +158 +52 +52 +167 +59 +47 +170 +60 +43 +170 +63 +45 +170 +63 +45 +169 +62 +44 +169 +62 +42 +172 +63 +43 +176 +63 +45 +171 +56 +37 +178 +57 +40 +185 +58 +43 +191 +57 +45 +195 +57 +44 +200 +58 +46 +205 +58 +48 +207 +60 +52 +203 +62 +53 +198 +59 +52 +194 +57 +49 +193 +56 +46 +193 +56 +46 +194 +57 +47 +194 +56 +46 +195 +54 +44 +197 +55 +45 +209 +67 +57 +208 +64 +55 +195 +48 +38 +195 +44 +35 +208 +55 +47 +214 +60 +52 +211 +50 +42 +224 +51 +44 +228 +50 +40 +231 +50 +43 +232 +51 +42 +234 +51 +43 +237 +50 +43 +240 +47 +42 +243 +45 +42 +246 +47 +42 +245 +46 +41 +241 +48 +41 +236 +49 +40 +225 +52 +36 +218 +53 +34 +209 +54 +32 +208 +53 +31 +216 +55 +35 +217 +51 +35 +214 +51 +36 +213 +51 +38 +213 +53 +41 +212 +56 +44 +212 +60 +49 +214 +63 +54 +236 +89 +81 +225 +82 +74 +211 +72 +65 +204 +67 +59 +202 +69 +60 +204 +73 +63 +200 +69 +59 +192 +62 +49 +188 +58 +42 +188 +59 +40 +188 +58 +42 +185 +58 +41 +183 +58 +40 +184 +58 +43 +188 +62 +48 +191 +65 +51 +193 +65 +54 +193 +60 +51 +197 +60 +54 +207 +65 +61 +215 +69 +69 +221 +71 +72 +228 +73 +77 +235 +76 +80 +232 +66 +70 +234 +64 +67 +240 +67 +73 +249 +75 +84 +254 +78 +89 +252 +74 +90 +252 +70 +92 +252 +70 +95 +248 +65 +95 +249 +66 +97 +253 +69 +105 +255 +74 +112 +255 +78 +119 +255 +79 +122 +255 +78 +120 +255 +76 +118 +254 +77 +119 +255 +79 +118 +252 +77 +116 +250 +79 +115 +255 +87 +121 +255 +95 +123 +252 +85 +111 +233 +71 +94 +243 +86 +107 +231 +83 +99 +240 +100 +113 +255 +144 +154 +254 +137 +145 +236 +130 +134 +194 +95 +98 +165 +77 +76 +179 +104 +101 +206 +141 +137 +240 +187 +183 +255 +219 +215 +255 +238 +237 +255 +247 +247 +255 +250 +253 +251 +249 +254 +253 +250 +255 +252 +251 +255 +253 +250 +255 +255 +250 +255 +255 +250 +254 +255 +251 +252 +253 +252 +250 +255 +251 +248 +255 +251 +247 +255 +251 +248 +255 +250 +249 +255 +250 +249 +255 +247 +249 +255 +245 +247 +254 +242 +246 +252 +240 +242 +249 +237 +239 +242 +230 +230 +231 +221 +219 +223 +216 +210 +219 +215 +206 +221 +219 +207 +224 +222 +210 +223 +225 +214 +221 +228 +220 +207 +216 +211 +197 +206 +201 +60 +57 +52 +59 +56 +49 +56 +53 +48 +53 +50 +43 +52 +49 +42 +52 +49 +42 +53 +50 +43 +54 +51 +44 +55 +52 +45 +56 +53 +46 +57 +54 +47 +59 +56 +49 +61 +58 +49 +63 +60 +51 +65 +62 +53 +67 +63 +52 +74 +66 +55 +77 +67 +55 +80 +71 +56 +83 +74 +59 +87 +75 +59 +85 +76 +61 +85 +75 +63 +83 +74 +67 +83 +74 +75 +93 +87 +99 +110 +108 +130 +130 +130 +166 +145 +149 +197 +154 +160 +218 +159 +166 +234 +162 +169 +241 +161 +165 +239 +158 +160 +235 +153 +155 +229 +149 +152 +221 +148 +149 +214 +144 +145 +202 +137 +137 +189 +130 +131 +177 +122 +121 +161 +114 +113 +145 +102 +99 +126 +88 +86 +107 +80 +78 +92 +73 +71 +82 +70 +67 +76 +67 +66 +74 +63 +63 +75 +61 +61 +71 +59 +58 +64 +59 +57 +58 +60 +57 +52 +63 +59 +47 +67 +61 +45 +69 +64 +44 +70 +64 +42 +70 +65 +43 +69 +66 +47 +69 +67 +52 +67 +67 +55 +66 +67 +59 +65 +67 +62 +65 +65 +65 +69 +59 +67 +71 +61 +70 +71 +64 +72 +71 +68 +75 +70 +71 +76 +67 +72 +75 +63 +72 +71 +62 +71 +66 +67 +72 +65 +65 +61 +52 +75 +58 +48 +102 +70 +59 +128 +80 +70 +138 +74 +64 +140 +63 +53 +146 +56 +45 +164 +62 +47 +169 +62 +44 +171 +62 +42 +172 +63 +43 +173 +64 +44 +175 +64 +45 +176 +63 +45 +177 +60 +42 +177 +56 +39 +182 +56 +41 +189 +57 +42 +195 +57 +44 +200 +56 +45 +204 +56 +46 +210 +57 +49 +212 +59 +53 +207 +58 +52 +205 +58 +51 +203 +56 +49 +203 +56 +49 +204 +57 +50 +205 +58 +50 +204 +55 +48 +203 +54 +47 +211 +60 +53 +213 +62 +53 +210 +57 +49 +204 +50 +40 +206 +52 +42 +216 +59 +50 +218 +60 +51 +215 +51 +42 +228 +49 +42 +233 +49 +39 +236 +49 +42 +238 +50 +41 +240 +49 +41 +242 +47 +41 +244 +45 +40 +246 +44 +40 +247 +45 +41 +244 +47 +41 +240 +49 +41 +233 +51 +40 +226 +53 +39 +217 +54 +37 +210 +55 +33 +207 +55 +32 +212 +57 +37 +213 +56 +37 +211 +54 +37 +209 +52 +37 +210 +52 +40 +211 +55 +43 +210 +56 +46 +208 +55 +47 +227 +78 +71 +232 +88 +80 +231 +90 +83 +218 +81 +73 +204 +71 +62 +196 +68 +57 +191 +64 +55 +185 +62 +47 +185 +60 +42 +185 +60 +38 +185 +60 +40 +185 +58 +39 +184 +57 +40 +186 +59 +42 +192 +62 +48 +195 +65 +52 +201 +68 +59 +198 +64 +55 +201 +64 +58 +209 +70 +67 +213 +73 +72 +214 +72 +71 +216 +71 +74 +223 +73 +75 +230 +70 +72 +232 +66 +68 +237 +68 +73 +245 +76 +83 +252 +81 +90 +251 +79 +93 +251 +76 +93 +251 +75 +96 +246 +68 +94 +247 +68 +97 +249 +70 +102 +253 +73 +108 +255 +78 +117 +255 +79 +120 +255 +79 +120 +255 +80 +119 +246 +85 +119 +242 +84 +117 +244 +84 +118 +250 +89 +120 +255 +93 +123 +255 +92 +119 +247 +83 +107 +236 +74 +95 +246 +89 +106 +239 +87 +102 +227 +79 +93 +239 +94 +107 +218 +78 +89 +223 +86 +96 +222 +86 +96 +210 +89 +96 +191 +99 +100 +199 +128 +124 +230 +169 +166 +255 +208 +207 +255 +233 +231 +255 +241 +240 +255 +246 +247 +254 +252 +253 +251 +252 +255 +249 +253 +255 +248 +252 +255 +250 +251 +253 +250 +250 +252 +249 +249 +249 +250 +249 +247 +252 +248 +245 +255 +250 +246 +255 +250 +247 +255 +251 +250 +255 +250 +249 +255 +247 +247 +254 +242 +242 +252 +237 +240 +249 +234 +237 +240 +225 +228 +233 +221 +221 +228 +217 +213 +226 +217 +210 +230 +223 +213 +235 +231 +219 +241 +237 +225 +241 +241 +229 +236 +243 +236 +220 +231 +227 +208 +219 +215 +64 +61 +54 +61 +58 +51 +58 +55 +48 +55 +52 +45 +53 +50 +43 +53 +50 +43 +53 +50 +43 +54 +51 +44 +55 +52 +45 +55 +52 +45 +57 +54 +47 +59 +56 +49 +61 +58 +49 +63 +60 +51 +64 +61 +52 +66 +62 +51 +74 +66 +55 +77 +67 +55 +82 +70 +56 +86 +74 +58 +87 +75 +59 +88 +76 +60 +87 +75 +63 +84 +73 +67 +83 +74 +77 +94 +88 +102 +112 +109 +136 +130 +132 +171 +145 +151 +203 +156 +164 +227 +163 +173 +245 +167 +176 +253 +170 +177 +255 +166 +172 +250 +161 +167 +243 +160 +164 +238 +159 +163 +234 +157 +161 +225 +153 +155 +214 +149 +150 +204 +146 +146 +196 +137 +136 +180 +121 +121 +159 +106 +105 +139 +96 +93 +124 +88 +85 +112 +82 +80 +104 +79 +77 +101 +78 +74 +99 +75 +71 +94 +70 +66 +83 +64 +61 +72 +63 +58 +62 +63 +58 +54 +64 +60 +49 +65 +62 +47 +67 +64 +47 +67 +66 +48 +66 +67 +51 +66 +68 +55 +63 +68 +61 +62 +68 +64 +60 +69 +68 +59 +66 +72 +65 +67 +82 +71 +72 +92 +80 +81 +99 +89 +91 +106 +95 +97 +110 +99 +99 +109 +99 +98 +104 +101 +95 +97 +102 +88 +87 +95 +74 +69 +106 +72 +63 +130 +83 +73 +146 +88 +76 +143 +76 +60 +142 +65 +49 +150 +63 +46 +167 +66 +48 +174 +64 +47 +174 +65 +45 +175 +64 +45 +176 +65 +46 +180 +65 +47 +178 +61 +43 +176 +55 +38 +181 +55 +40 +188 +56 +43 +194 +56 +43 +200 +56 +45 +205 +54 +45 +209 +55 +47 +213 +56 +49 +216 +59 +52 +210 +55 +50 +208 +55 +50 +208 +55 +50 +209 +56 +50 +212 +57 +52 +212 +57 +52 +211 +56 +51 +211 +54 +47 +222 +65 +58 +213 +56 +47 +209 +51 +42 +214 +56 +47 +222 +61 +53 +222 +61 +53 +218 +57 +49 +220 +53 +44 +231 +50 +41 +235 +48 +39 +239 +48 +40 +241 +48 +41 +244 +47 +41 +247 +45 +41 +247 +44 +40 +247 +44 +40 +247 +45 +41 +244 +47 +41 +238 +50 +41 +233 +52 +41 +225 +53 +39 +218 +55 +38 +212 +55 +36 +207 +56 +35 +206 +55 +34 +207 +56 +37 +206 +55 +36 +207 +54 +38 +208 +55 +41 +210 +57 +43 +209 +55 +43 +206 +52 +42 +203 +52 +43 +227 +78 +71 +243 +100 +92 +235 +96 +89 +213 +79 +70 +196 +65 +55 +186 +59 +50 +181 +57 +45 +184 +62 +41 +184 +62 +39 +185 +60 +38 +185 +59 +37 +186 +57 +38 +189 +57 +42 +192 +60 +47 +196 +62 +50 +202 +68 +57 +202 +65 +57 +206 +69 +63 +213 +75 +72 +211 +76 +73 +206 +71 +68 +205 +69 +69 +214 +72 +71 +227 +73 +73 +230 +67 +68 +232 +69 +72 +242 +77 +83 +248 +83 +90 +249 +82 +92 +247 +79 +94 +250 +79 +97 +244 +72 +94 +245 +71 +96 +248 +71 +100 +251 +73 +105 +255 +78 +114 +255 +81 +120 +255 +82 +121 +255 +84 +122 +239 +84 +116 +239 +90 +119 +249 +96 +126 +253 +96 +125 +249 +86 +113 +242 +78 +103 +245 +81 +105 +253 +90 +109 +251 +93 +108 +255 +102 +116 +235 +80 +94 +243 +88 +102 +238 +83 +97 +246 +90 +104 +237 +79 +94 +223 +83 +94 +190 +92 +93 +188 +114 +111 +216 +152 +150 +249 +198 +195 +255 +226 +225 +255 +235 +233 +254 +242 +242 +255 +255 +253 +252 +255 +255 +251 +255 +255 +248 +255 +255 +249 +255 +253 +249 +253 +252 +250 +252 +249 +252 +251 +247 +253 +249 +246 +253 +248 +244 +255 +248 +245 +255 +249 +248 +255 +249 +248 +255 +245 +245 +251 +239 +239 +247 +232 +235 +243 +229 +229 +235 +221 +221 +232 +218 +217 +228 +217 +211 +232 +222 +213 +240 +232 +221 +249 +243 +229 +255 +250 +236 +254 +254 +242 +244 +250 +246 +227 +237 +236 +214 +224 +223 +66 +62 +53 +65 +61 +52 +64 +60 +51 +62 +58 +49 +60 +56 +47 +58 +54 +45 +56 +52 +43 +55 +51 +42 +54 +50 +41 +54 +50 +41 +55 +51 +42 +56 +52 +43 +59 +54 +48 +62 +57 +51 +65 +60 +54 +69 +62 +54 +73 +64 +55 +77 +67 +55 +82 +70 +56 +85 +73 +57 +87 +74 +58 +88 +75 +59 +90 +76 +65 +91 +78 +72 +84 +73 +77 +88 +82 +96 +103 +100 +129 +124 +126 +167 +141 +146 +202 +151 +160 +227 +158 +170 +246 +165 +176 +255 +170 +179 +255 +171 +178 +255 +172 +180 +255 +172 +178 +252 +170 +177 +249 +170 +175 +243 +168 +172 +236 +169 +171 +232 +159 +161 +218 +153 +154 +210 +141 +141 +193 +129 +127 +177 +116 +114 +161 +104 +101 +146 +93 +90 +135 +88 +82 +126 +88 +81 +122 +89 +81 +118 +86 +79 +110 +77 +72 +95 +67 +63 +77 +63 +58 +64 +63 +59 +58 +66 +63 +56 +62 +62 +52 +64 +66 +53 +66 +69 +58 +63 +68 +61 +60 +66 +62 +58 +67 +66 +62 +70 +72 +65 +75 +84 +70 +85 +106 +85 +101 +126 +101 +113 +137 +108 +114 +136 +119 +117 +139 +131 +119 +139 +132 +111 +126 +128 +95 +106 +137 +91 +101 +144 +88 +91 +157 +87 +87 +164 +87 +81 +162 +78 +68 +154 +65 +51 +151 +58 +40 +158 +59 +40 +167 +60 +42 +172 +61 +42 +174 +63 +44 +177 +64 +46 +179 +64 +45 +180 +63 +45 +182 +61 +44 +185 +59 +44 +186 +54 +39 +190 +54 +40 +196 +54 +42 +203 +55 +45 +209 +55 +45 +214 +56 +47 +218 +57 +49 +218 +56 +51 +215 +56 +52 +216 +57 +53 +217 +58 +54 +216 +57 +51 +216 +54 +49 +216 +54 +49 +218 +56 +51 +221 +58 +51 +230 +67 +60 +224 +61 +54 +218 +55 +48 +227 +64 +55 +254 +91 +82 +255 +108 +99 +255 +93 +84 +231 +63 +54 +229 +51 +41 +237 +50 +41 +241 +50 +42 +244 +47 +41 +244 +42 +38 +245 +40 +37 +248 +40 +38 +248 +43 +40 +247 +45 +43 +243 +48 +44 +237 +50 +43 +227 +49 +39 +218 +48 +35 +212 +49 +34 +212 +52 +36 +211 +58 +40 +204 +59 +38 +202 +60 +40 +205 +60 +41 +207 +60 +42 +210 +58 +44 +210 +57 +43 +210 +56 +44 +209 +55 +45 +218 +64 +56 +207 +56 +49 +220 +71 +65 +244 +99 +94 +229 +88 +81 +203 +66 +60 +197 +64 +59 +183 +52 +42 +183 +58 +38 +182 +60 +36 +185 +60 +38 +186 +60 +38 +189 +58 +40 +191 +58 +43 +196 +60 +48 +198 +62 +50 +199 +62 +52 +204 +67 +59 +217 +80 +74 +223 +88 +82 +212 +79 +74 +195 +63 +58 +192 +63 +58 +207 +72 +68 +222 +72 +71 +226 +71 +69 +230 +74 +75 +239 +80 +84 +241 +82 +87 +239 +78 +86 +237 +75 +88 +241 +76 +92 +249 +82 +102 +248 +79 +102 +247 +75 +101 +247 +74 +102 +252 +77 +108 +255 +81 +115 +255 +82 +118 +253 +82 +118 +245 +88 +119 +239 +89 +118 +243 +89 +117 +251 +92 +120 +255 +93 +120 +255 +91 +115 +254 +88 +110 +252 +86 +106 +255 +101 +117 +247 +89 +103 +253 +95 +109 +252 +94 +108 +234 +73 +88 +235 +73 +88 +251 +84 +101 +233 +88 +101 +198 +102 +103 +173 +103 +101 +203 +142 +139 +232 +181 +178 +249 +209 +207 +255 +234 +231 +254 +238 +238 +252 +248 +247 +246 +250 +249 +247 +255 +253 +247 +255 +254 +246 +255 +252 +248 +254 +252 +253 +255 +252 +253 +252 +248 +251 +247 +244 +255 +250 +246 +255 +250 +246 +255 +247 +244 +253 +243 +241 +255 +244 +244 +255 +243 +243 +246 +232 +232 +231 +217 +217 +228 +214 +213 +223 +209 +206 +225 +214 +208 +241 +231 +222 +252 +244 +231 +253 +247 +231 +255 +251 +232 +255 +255 +243 +249 +254 +248 +231 +240 +239 +218 +227 +226 +67 +63 +54 +66 +62 +51 +65 +61 +52 +63 +59 +50 +61 +57 +48 +59 +55 +46 +58 +54 +45 +57 +53 +44 +55 +51 +42 +55 +51 +42 +55 +51 +42 +56 +52 +43 +58 +53 +47 +61 +56 +50 +64 +59 +53 +68 +61 +53 +72 +63 +54 +76 +66 +54 +81 +69 +55 +84 +72 +56 +86 +73 +56 +87 +74 +57 +89 +75 +62 +90 +77 +69 +85 +74 +78 +87 +81 +95 +101 +98 +127 +121 +123 +164 +138 +143 +201 +148 +157 +226 +155 +166 +245 +163 +174 +254 +171 +180 +255 +172 +181 +255 +174 +182 +255 +175 +183 +255 +176 +183 +255 +175 +182 +252 +175 +180 +248 +175 +178 +245 +169 +170 +235 +162 +163 +227 +152 +152 +216 +140 +138 +201 +128 +127 +187 +117 +113 +174 +105 +101 +160 +99 +94 +152 +96 +87 +142 +96 +86 +136 +93 +84 +127 +86 +80 +116 +77 +73 +98 +70 +67 +84 +66 +65 +73 +65 +65 +67 +60 +60 +58 +65 +66 +61 +70 +69 +65 +67 +68 +63 +65 +63 +64 +68 +66 +69 +79 +77 +82 +88 +86 +99 +102 +103 +131 +116 +116 +150 +130 +125 +157 +138 +125 +155 +149 +124 +154 +160 +124 +150 +165 +113 +136 +164 +96 +117 +172 +89 +107 +180 +87 +98 +185 +81 +88 +181 +73 +71 +173 +64 +57 +168 +60 +47 +168 +61 +41 +169 +63 +41 +167 +56 +37 +168 +55 +37 +171 +56 +38 +174 +57 +40 +176 +56 +39 +178 +57 +40 +181 +55 +40 +184 +54 +40 +187 +51 +37 +194 +52 +40 +202 +55 +45 +211 +58 +50 +217 +60 +51 +222 +61 +53 +223 +60 +53 +223 +60 +53 +225 +62 +57 +223 +60 +55 +223 +60 +55 +225 +62 +57 +229 +66 +61 +232 +67 +61 +231 +66 +60 +230 +65 +59 +229 +64 +58 +230 +66 +57 +228 +64 +55 +220 +56 +47 +213 +49 +40 +216 +54 +43 +235 +73 +62 +255 +91 +79 +241 +64 +54 +238 +54 +44 +234 +43 +35 +238 +41 +35 +248 +45 +41 +255 +47 +45 +254 +44 +43 +246 +40 +40 +250 +48 +46 +245 +52 +47 +239 +54 +49 +231 +54 +46 +222 +51 +41 +214 +50 +38 +212 +50 +37 +207 +54 +38 +203 +58 +39 +200 +59 +39 +202 +60 +40 +205 +58 +40 +207 +57 +42 +208 +55 +41 +209 +53 +41 +208 +52 +40 +211 +57 +47 +207 +53 +45 +212 +61 +54 +229 +80 +74 +229 +84 +81 +219 +76 +72 +205 +66 +63 +183 +49 +40 +188 +59 +40 +187 +61 +38 +189 +60 +39 +190 +59 +39 +190 +57 +40 +192 +56 +40 +194 +58 +44 +196 +58 +47 +200 +62 +52 +203 +66 +56 +213 +79 +70 +220 +87 +80 +210 +82 +73 +195 +68 +61 +191 +67 +59 +204 +72 +67 +219 +76 +72 +223 +74 +70 +229 +77 +76 +235 +83 +82 +237 +84 +87 +235 +80 +86 +233 +78 +86 +236 +79 +90 +247 +86 +102 +248 +85 +104 +249 +83 +105 +250 +82 +107 +252 +82 +109 +255 +83 +113 +255 +83 +116 +254 +83 +117 +241 +76 +108 +245 +84 +115 +255 +92 +121 +255 +96 +123 +255 +91 +117 +253 +85 +110 +250 +82 +105 +249 +84 +101 +249 +87 +102 +242 +84 +98 +249 +93 +104 +249 +93 +104 +236 +82 +94 +241 +87 +99 +247 +93 +105 +217 +86 +94 +182 +96 +95 +153 +92 +87 +185 +127 +125 +218 +169 +165 +239 +199 +197 +254 +224 +222 +251 +233 +233 +253 +248 +245 +248 +250 +247 +247 +255 +253 +247 +255 +254 +245 +255 +252 +248 +254 +252 +253 +255 +252 +254 +253 +251 +252 +248 +245 +253 +250 +245 +254 +249 +245 +252 +247 +243 +252 +244 +241 +255 +245 +244 +255 +244 +244 +245 +233 +233 +234 +220 +219 +229 +215 +212 +222 +209 +203 +223 +213 +204 +239 +229 +219 +252 +245 +229 +255 +249 +231 +255 +252 +232 +255 +255 +239 +248 +253 +246 +232 +241 +238 +221 +227 +225 +69 +65 +54 +69 +65 +53 +67 +63 +52 +65 +61 +50 +63 +59 +48 +61 +57 +46 +60 +56 +45 +59 +55 +44 +56 +52 +43 +56 +52 +43 +55 +51 +42 +56 +52 +43 +58 +53 +47 +61 +56 +50 +63 +58 +52 +67 +60 +52 +71 +62 +53 +74 +66 +55 +78 +68 +56 +82 +70 +54 +84 +71 +54 +87 +71 +55 +89 +73 +60 +89 +74 +67 +87 +75 +75 +88 +80 +93 +98 +94 +121 +115 +117 +156 +133 +138 +194 +144 +153 +220 +152 +164 +240 +160 +171 +250 +170 +179 +254 +173 +181 +254 +175 +183 +255 +177 +185 +255 +179 +186 +255 +180 +187 +255 +181 +185 +255 +181 +185 +255 +175 +178 +249 +172 +172 +244 +163 +163 +235 +153 +151 +224 +142 +141 +211 +131 +128 +199 +120 +117 +188 +115 +109 +179 +107 +96 +162 +105 +93 +155 +99 +90 +145 +93 +87 +133 +86 +82 +119 +78 +75 +104 +69 +68 +86 +64 +64 +76 +56 +53 +60 +65 +60 +64 +75 +65 +66 +76 +64 +66 +81 +62 +66 +90 +69 +74 +112 +87 +93 +130 +99 +115 +152 +115 +149 +165 +122 +165 +175 +127 +167 +178 +123 +162 +184 +118 +154 +192 +112 +147 +194 +99 +131 +192 +84 +110 +193 +71 +94 +207 +76 +92 +207 +73 +82 +195 +61 +62 +183 +54 +48 +180 +58 +43 +178 +61 +41 +173 +61 +39 +175 +60 +41 +176 +59 +41 +178 +58 +41 +180 +59 +42 +183 +60 +44 +187 +60 +45 +192 +60 +45 +196 +60 +46 +196 +54 +42 +203 +56 +46 +211 +60 +49 +217 +63 +53 +223 +65 +56 +225 +62 +55 +224 +60 +51 +223 +58 +52 +220 +55 +49 +217 +52 +46 +216 +51 +45 +222 +57 +51 +230 +65 +59 +236 +69 +63 +233 +66 +60 +228 +61 +53 +227 +60 +52 +219 +52 +44 +216 +52 +43 +219 +55 +45 +212 +50 +39 +204 +44 +32 +214 +54 +42 +233 +71 +58 +245 +75 +62 +242 +64 +54 +239 +52 +45 +240 +45 +41 +246 +44 +42 +250 +44 +44 +252 +44 +44 +248 +42 +44 +240 +42 +41 +236 +47 +43 +232 +50 +46 +227 +53 +46 +220 +52 +43 +216 +49 +40 +213 +49 +39 +209 +51 +39 +205 +55 +40 +203 +58 +41 +205 +58 +40 +208 +58 +41 +210 +59 +42 +211 +58 +42 +212 +56 +43 +212 +56 +44 +209 +52 +43 +214 +60 +52 +213 +58 +53 +213 +60 +55 +229 +79 +78 +237 +89 +87 +217 +69 +69 +194 +51 +47 +192 +59 +44 +191 +60 +40 +192 +59 +42 +191 +58 +41 +193 +57 +41 +192 +56 +40 +192 +56 +42 +192 +56 +44 +198 +61 +51 +199 +65 +54 +207 +74 +65 +216 +85 +75 +210 +82 +71 +198 +71 +62 +192 +68 +58 +199 +71 +62 +214 +75 +68 +216 +73 +67 +221 +76 +73 +228 +83 +80 +229 +83 +84 +226 +80 +83 +226 +77 +83 +229 +78 +87 +242 +88 +100 +246 +90 +104 +253 +91 +112 +254 +90 +114 +252 +86 +110 +250 +82 +108 +251 +81 +108 +255 +81 +112 +248 +70 +106 +255 +79 +116 +255 +89 +123 +255 +90 +121 +255 +86 +113 +252 +84 +107 +254 +87 +107 +255 +92 +109 +250 +89 +104 +247 +91 +104 +248 +98 +109 +242 +98 +107 +231 +96 +103 +234 +105 +110 +229 +106 +109 +197 +94 +95 +160 +93 +87 +126 +77 +70 +155 +108 +102 +195 +151 +148 +223 +185 +182 +241 +211 +209 +244 +224 +223 +255 +245 +244 +249 +249 +247 +249 +255 +253 +247 +255 +255 +245 +255 +252 +248 +254 +252 +253 +255 +254 +255 +252 +253 +252 +248 +247 +252 +249 +244 +252 +249 +242 +250 +247 +242 +251 +246 +242 +255 +247 +244 +255 +246 +244 +249 +238 +236 +239 +228 +226 +230 +219 +215 +220 +209 +203 +221 +211 +201 +238 +228 +216 +253 +246 +228 +255 +251 +232 +255 +253 +231 +255 +255 +236 +248 +251 +242 +233 +239 +235 +224 +229 +225 +73 +69 +57 +72 +68 +56 +70 +66 +54 +68 +64 +52 +66 +62 +51 +64 +60 +49 +63 +59 +48 +62 +58 +47 +58 +54 +45 +57 +53 +44 +57 +53 +44 +57 +53 +44 +58 +53 +47 +60 +55 +49 +62 +57 +51 +64 +59 +53 +69 +62 +54 +73 +64 +55 +76 +68 +55 +79 +70 +53 +82 +69 +52 +85 +69 +53 +87 +71 +56 +87 +73 +62 +88 +77 +75 +88 +78 +87 +94 +90 +113 +112 +112 +150 +128 +134 +186 +140 +150 +212 +149 +161 +233 +157 +169 +245 +168 +176 +249 +169 +177 +249 +173 +179 +253 +176 +183 +255 +177 +183 +255 +178 +185 +255 +180 +184 +255 +180 +184 +255 +175 +177 +252 +171 +173 +248 +165 +167 +242 +159 +158 +234 +151 +150 +226 +140 +139 +215 +130 +129 +205 +125 +121 +197 +117 +109 +182 +112 +103 +170 +102 +96 +158 +95 +90 +144 +89 +88 +132 +81 +81 +117 +71 +71 +99 +65 +62 +81 +61 +53 +68 +72 +56 +66 +84 +61 +67 +96 +64 +69 +110 +67 +74 +128 +79 +85 +150 +93 +100 +170 +103 +120 +189 +108 +141 +201 +110 +153 +203 +111 +152 +201 +105 +143 +198 +97 +131 +199 +88 +120 +198 +73 +103 +196 +59 +85 +197 +51 +72 +216 +65 +80 +223 +69 +79 +208 +60 +60 +195 +56 +49 +194 +64 +50 +186 +65 +44 +175 +59 +36 +173 +54 +34 +173 +53 +36 +174 +53 +36 +179 +53 +38 +182 +55 +40 +188 +56 +43 +195 +59 +45 +200 +60 +47 +211 +64 +54 +215 +64 +55 +218 +64 +54 +220 +63 +54 +222 +61 +53 +222 +57 +51 +221 +54 +46 +219 +52 +44 +211 +46 +40 +210 +45 +39 +211 +46 +40 +216 +51 +45 +225 +58 +52 +227 +60 +52 +225 +56 +49 +220 +53 +45 +220 +53 +45 +208 +44 +34 +205 +41 +31 +217 +55 +44 +226 +66 +54 +220 +63 +48 +208 +52 +37 +203 +46 +31 +233 +70 +55 +243 +73 +60 +253 +72 +63 +252 +60 +55 +244 +45 +42 +241 +35 +37 +245 +39 +41 +251 +47 +50 +241 +45 +46 +235 +47 +46 +228 +50 +46 +222 +51 +44 +218 +49 +42 +215 +48 +42 +214 +47 +41 +211 +48 +39 +211 +55 +42 +210 +57 +43 +214 +58 +43 +216 +60 +45 +218 +62 +47 +219 +63 +48 +220 +64 +51 +220 +64 +51 +210 +54 +42 +230 +76 +66 +229 +74 +69 +206 +53 +48 +223 +71 +70 +243 +90 +92 +223 +73 +75 +213 +65 +63 +200 +60 +47 +196 +59 +43 +195 +58 +42 +195 +58 +42 +194 +58 +42 +194 +58 +42 +193 +57 +43 +190 +57 +42 +194 +60 +48 +194 +62 +50 +200 +70 +57 +207 +79 +66 +206 +80 +68 +198 +72 +60 +191 +67 +55 +193 +67 +55 +206 +72 +63 +209 +70 +63 +213 +74 +69 +219 +80 +75 +221 +82 +79 +217 +77 +76 +218 +75 +77 +220 +75 +80 +235 +88 +96 +243 +91 +103 +252 +97 +113 +255 +97 +117 +250 +88 +109 +245 +79 +103 +245 +77 +103 +253 +78 +107 +255 +76 +112 +255 +79 +116 +255 +83 +115 +255 +82 +110 +250 +84 +108 +252 +90 +111 +255 +99 +117 +255 +105 +120 +255 +102 +117 +250 +98 +111 +244 +98 +109 +236 +101 +108 +224 +103 +108 +212 +106 +106 +200 +106 +104 +177 +104 +97 +141 +94 +84 +104 +70 +60 +130 +93 +85 +172 +135 +129 +206 +171 +169 +229 +199 +197 +239 +218 +217 +255 +243 +243 +251 +247 +246 +249 +253 +252 +248 +255 +255 +245 +255 +254 +248 +254 +254 +255 +255 +255 +255 +251 +255 +254 +248 +248 +251 +250 +245 +250 +250 +242 +249 +248 +243 +253 +250 +245 +255 +251 +247 +255 +250 +247 +253 +243 +241 +247 +236 +232 +235 +224 +218 +223 +213 +204 +222 +212 +202 +237 +230 +214 +254 +247 +228 +255 +254 +232 +255 +254 +229 +255 +254 +233 +247 +249 +238 +234 +239 +232 +228 +231 +224 +78 +72 +58 +77 +71 +57 +76 +70 +56 +74 +68 +54 +72 +66 +54 +70 +64 +52 +68 +61 +51 +67 +60 +50 +63 +56 +48 +62 +55 +47 +61 +54 +46 +61 +54 +46 +61 +54 +48 +62 +55 +49 +64 +57 +51 +63 +58 +52 +67 +62 +56 +69 +65 +56 +75 +67 +56 +78 +69 +54 +81 +68 +51 +82 +69 +50 +86 +70 +54 +86 +72 +59 +90 +77 +71 +86 +77 +82 +91 +87 +104 +108 +107 +139 +126 +130 +177 +138 +147 +206 +146 +159 +227 +154 +166 +238 +166 +174 +247 +169 +175 +249 +173 +176 +253 +175 +179 +253 +176 +179 +255 +176 +180 +254 +176 +179 +255 +175 +179 +253 +171 +174 +251 +168 +171 +248 +164 +167 +244 +160 +162 +239 +154 +156 +233 +147 +149 +226 +138 +140 +217 +134 +133 +209 +131 +127 +201 +123 +117 +187 +109 +107 +172 +100 +101 +158 +95 +97 +146 +89 +91 +132 +82 +81 +115 +78 +72 +98 +87 +70 +89 +95 +67 +81 +109 +66 +76 +129 +69 +77 +152 +77 +84 +172 +85 +93 +188 +91 +98 +202 +90 +104 +214 +84 +112 +223 +83 +118 +222 +84 +117 +215 +80 +110 +208 +74 +99 +203 +67 +89 +198 +57 +74 +194 +47 +63 +211 +57 +69 +225 +68 +77 +228 +72 +75 +215 +63 +60 +205 +62 +54 +203 +71 +58 +194 +73 +52 +182 +63 +41 +183 +62 +43 +184 +61 +45 +186 +60 +45 +189 +62 +47 +195 +63 +48 +202 +66 +52 +208 +68 +55 +213 +69 +58 +217 +69 +57 +218 +66 +55 +219 +62 +53 +217 +59 +50 +217 +54 +45 +217 +53 +44 +218 +51 +43 +215 +51 +42 +212 +49 +42 +215 +52 +45 +218 +55 +46 +221 +57 +48 +223 +56 +48 +222 +55 +47 +221 +54 +46 +220 +53 +44 +214 +47 +38 +217 +53 +43 +215 +55 +43 +207 +50 +35 +205 +49 +34 +210 +57 +41 +213 +62 +45 +212 +59 +41 +216 +60 +45 +230 +68 +55 +248 +74 +65 +253 +68 +63 +249 +54 +52 +245 +42 +45 +246 +42 +45 +247 +47 +50 +247 +54 +55 +237 +53 +53 +226 +51 +48 +218 +49 +44 +215 +48 +42 +215 +47 +44 +217 +48 +45 +217 +48 +43 +227 +56 +49 +228 +57 +49 +226 +58 +49 +226 +59 +50 +224 +60 +48 +223 +61 +48 +220 +63 +48 +218 +62 +49 +209 +55 +43 +239 +87 +76 +248 +97 +90 +211 +59 +54 +209 +59 +58 +230 +80 +81 +220 +70 +72 +230 +80 +81 +207 +60 +52 +202 +58 +47 +198 +56 +44 +197 +57 +44 +196 +58 +45 +196 +60 +46 +195 +59 +45 +192 +59 +44 +190 +58 +45 +190 +60 +46 +195 +65 +51 +199 +72 +57 +199 +73 +59 +194 +68 +54 +190 +64 +50 +188 +62 +48 +201 +70 +60 +202 +69 +60 +206 +73 +66 +213 +80 +73 +215 +82 +77 +213 +78 +75 +211 +75 +75 +215 +76 +79 +233 +90 +96 +240 +94 +104 +252 +102 +114 +255 +104 +120 +252 +93 +113 +242 +80 +101 +243 +77 +101 +252 +79 +107 +255 +83 +117 +255 +82 +116 +254 +81 +111 +244 +82 +106 +243 +92 +111 +250 +103 +119 +253 +105 +119 +249 +101 +115 +253 +101 +116 +245 +94 +109 +239 +94 +107 +236 +106 +114 +221 +115 +117 +192 +107 +102 +168 +101 +92 +156 +110 +97 +127 +101 +86 +89 +71 +57 +110 +86 +74 +150 +123 +114 +190 +159 +156 +223 +193 +193 +238 +214 +214 +254 +238 +239 +254 +245 +246 +252 +252 +252 +249 +255 +255 +246 +255 +254 +249 +253 +254 +255 +255 +255 +255 +251 +255 +254 +248 +250 +253 +254 +248 +250 +253 +244 +250 +251 +245 +254 +253 +248 +255 +255 +250 +255 +253 +249 +255 +250 +244 +255 +246 +241 +242 +233 +226 +229 +221 +210 +225 +217 +204 +240 +233 +215 +255 +250 +228 +255 +255 +230 +255 +254 +229 +255 +254 +233 +246 +248 +234 +237 +240 +231 +232 +233 +225 +81 +75 +61 +80 +74 +60 +79 +73 +59 +77 +71 +57 +75 +69 +57 +73 +67 +55 +71 +64 +54 +71 +64 +54 +66 +59 +51 +65 +58 +50 +64 +57 +49 +63 +56 +48 +63 +56 +50 +63 +56 +50 +65 +58 +52 +64 +59 +53 +66 +63 +56 +69 +66 +57 +75 +69 +57 +77 +70 +54 +80 +69 +51 +82 +69 +50 +85 +70 +51 +85 +72 +55 +89 +76 +67 +85 +75 +76 +90 +83 +99 +105 +105 +133 +124 +129 +171 +137 +147 +200 +147 +158 +222 +154 +164 +235 +166 +172 +248 +169 +172 +251 +172 +173 +253 +173 +176 +255 +174 +177 +255 +174 +177 +254 +173 +176 +253 +173 +176 +253 +169 +172 +249 +167 +170 +247 +164 +168 +242 +162 +166 +240 +159 +163 +237 +154 +158 +232 +149 +153 +227 +146 +148 +222 +146 +146 +218 +137 +138 +205 +124 +128 +192 +115 +120 +178 +111 +117 +169 +109 +112 +157 +105 +103 +142 +106 +95 +125 +121 +95 +120 +130 +87 +106 +142 +80 +95 +163 +79 +92 +187 +83 +92 +205 +84 +93 +214 +80 +87 +218 +72 +83 +224 +65 +83 +228 +65 +84 +224 +69 +85 +217 +69 +81 +210 +69 +77 +204 +65 +70 +199 +59 +60 +198 +54 +54 +227 +74 +76 +229 +73 +74 +224 +66 +65 +211 +56 +52 +206 +57 +50 +206 +65 +55 +200 +68 +53 +190 +63 +46 +195 +69 +54 +195 +69 +54 +197 +70 +55 +201 +69 +56 +206 +70 +56 +209 +71 +58 +215 +71 +60 +218 +71 +61 +214 +62 +51 +213 +59 +49 +214 +56 +47 +213 +52 +44 +214 +51 +42 +216 +52 +43 +219 +52 +44 +218 +54 +45 +219 +56 +49 +221 +60 +52 +224 +61 +52 +223 +60 +51 +221 +57 +48 +220 +53 +45 +220 +53 +44 +219 +55 +45 +210 +46 +36 +221 +59 +48 +218 +61 +46 +205 +49 +34 +198 +45 +29 +206 +55 +38 +210 +61 +41 +205 +58 +38 +204 +57 +39 +212 +56 +41 +226 +58 +47 +243 +61 +57 +255 +64 +64 +255 +60 +62 +254 +51 +55 +243 +44 +47 +234 +44 +46 +225 +43 +42 +216 +42 +41 +212 +43 +40 +215 +47 +44 +222 +52 +52 +228 +56 +56 +233 +57 +57 +239 +55 +53 +240 +55 +52 +238 +55 +51 +232 +55 +49 +227 +55 +45 +220 +54 +42 +215 +53 +40 +209 +53 +38 +205 +53 +40 +231 +80 +69 +255 +109 +99 +219 +72 +65 +200 +52 +50 +215 +67 +67 +211 +62 +66 +234 +86 +86 +217 +65 +60 +210 +62 +52 +203 +56 +46 +198 +54 +43 +198 +58 +45 +198 +60 +47 +195 +62 +47 +193 +61 +46 +187 +57 +43 +187 +60 +45 +190 +63 +48 +192 +65 +50 +191 +65 +50 +189 +64 +46 +188 +61 +46 +187 +60 +45 +195 +67 +54 +196 +68 +57 +200 +72 +63 +208 +80 +71 +211 +82 +76 +208 +79 +73 +210 +78 +76 +213 +79 +78 +233 +94 +99 +238 +97 +103 +251 +105 +116 +255 +110 +122 +255 +100 +117 +245 +86 +106 +245 +81 +105 +254 +86 +111 +255 +86 +115 +255 +86 +113 +245 +87 +110 +238 +93 +110 +241 +109 +120 +247 +117 +127 +240 +106 +115 +227 +87 +98 +243 +95 +109 +245 +94 +109 +241 +96 +111 +241 +114 +125 +238 +135 +138 +206 +128 +124 +169 +117 +104 +151 +122 +106 +117 +106 +88 +82 +77 +58 +97 +85 +71 +132 +112 +103 +177 +149 +146 +221 +191 +191 +239 +213 +216 +253 +233 +235 +254 +244 +245 +252 +250 +251 +250 +254 +255 +248 +254 +254 +252 +253 +255 +255 +254 +255 +255 +250 +255 +255 +249 +253 +255 +255 +251 +248 +254 +244 +250 +253 +246 +255 +255 +250 +255 +255 +250 +255 +255 +248 +255 +252 +246 +255 +253 +245 +250 +241 +232 +238 +230 +219 +234 +226 +213 +245 +240 +221 +255 +251 +229 +255 +254 +229 +255 +254 +226 +255 +255 +231 +249 +250 +234 +242 +244 +231 +238 +240 +229 +83 +77 +61 +82 +76 +60 +81 +75 +61 +79 +73 +59 +77 +71 +57 +75 +69 +55 +74 +68 +56 +73 +67 +55 +69 +62 +52 +68 +61 +51 +66 +59 +51 +65 +58 +50 +64 +57 +51 +65 +58 +52 +65 +57 +54 +64 +59 +55 +65 +64 +59 +67 +67 +59 +73 +69 +57 +77 +71 +55 +79 +71 +50 +82 +70 +48 +85 +70 +49 +85 +72 +53 +87 +75 +63 +82 +72 +70 +88 +82 +94 +106 +103 +130 +125 +129 +167 +137 +147 +196 +146 +158 +218 +152 +162 +231 +164 +167 +246 +166 +167 +250 +171 +169 +252 +171 +172 +254 +172 +173 +255 +173 +174 +254 +172 +174 +251 +172 +174 +251 +168 +172 +246 +166 +170 +244 +164 +168 +241 +163 +167 +240 +161 +168 +238 +160 +167 +237 +157 +164 +232 +155 +162 +230 +153 +158 +226 +146 +154 +219 +139 +147 +210 +134 +143 +202 +131 +141 +194 +132 +136 +183 +131 +129 +168 +136 +121 +154 +143 +109 +136 +154 +99 +122 +169 +88 +105 +187 +81 +95 +207 +77 +89 +224 +73 +82 +232 +65 +73 +232 +62 +65 +228 +62 +62 +222 +65 +60 +216 +69 +61 +210 +74 +60 +202 +75 +60 +194 +71 +53 +191 +68 +50 +195 +65 +49 +226 +86 +73 +223 +72 +63 +217 +60 +55 +216 +54 +51 +218 +56 +53 +216 +59 +54 +210 +57 +52 +200 +56 +48 +192 +58 +46 +190 +60 +46 +191 +59 +46 +192 +58 +46 +194 +56 +43 +195 +55 +42 +198 +52 +39 +198 +50 +38 +206 +52 +42 +208 +51 +42 +209 +51 +40 +212 +51 +41 +214 +51 +42 +217 +53 +44 +221 +54 +46 +220 +56 +47 +222 +61 +51 +219 +61 +50 +220 +59 +49 +219 +56 +47 +219 +55 +45 +218 +54 +44 +216 +52 +42 +215 +51 +41 +213 +51 +38 +211 +51 +37 +208 +52 +37 +207 +54 +38 +210 +61 +41 +209 +62 +42 +202 +57 +36 +192 +50 +28 +200 +58 +38 +202 +52 +37 +213 +49 +39 +231 +53 +49 +250 +60 +60 +255 +61 +64 +255 +55 +61 +247 +51 +55 +234 +45 +49 +225 +45 +46 +217 +45 +45 +215 +47 +46 +220 +52 +51 +227 +57 +58 +233 +59 +61 +240 +57 +61 +246 +50 +54 +248 +48 +51 +244 +48 +49 +237 +49 +47 +228 +49 +42 +222 +50 +40 +213 +49 +37 +207 +51 +36 +201 +49 +36 +209 +61 +49 +250 +106 +95 +228 +84 +76 +200 +57 +53 +208 +64 +63 +203 +58 +61 +228 +82 +83 +228 +74 +72 +220 +67 +61 +209 +58 +51 +201 +54 +46 +198 +56 +46 +197 +59 +48 +194 +60 +48 +191 +61 +47 +186 +59 +42 +188 +63 +45 +189 +64 +46 +188 +63 +45 +186 +59 +42 +186 +59 +40 +189 +59 +43 +190 +60 +44 +188 +62 +48 +188 +62 +50 +192 +68 +56 +200 +76 +66 +204 +80 +72 +202 +78 +70 +204 +76 +73 +208 +78 +76 +232 +97 +101 +236 +97 +102 +248 +104 +114 +255 +111 +123 +255 +104 +120 +247 +90 +107 +247 +85 +106 +253 +91 +114 +249 +91 +114 +244 +95 +115 +233 +98 +113 +227 +107 +116 +234 +125 +128 +242 +133 +136 +234 +118 +121 +222 +92 +100 +246 +101 +116 +255 +107 +124 +247 +98 +117 +238 +106 +119 +249 +144 +149 +239 +161 +159 +196 +148 +138 +163 +140 +124 +106 +105 +85 +73 +81 +60 +88 +85 +70 +117 +103 +92 +165 +140 +136 +220 +190 +190 +242 +213 +217 +249 +227 +230 +255 +242 +245 +255 +249 +251 +252 +253 +255 +249 +253 +255 +252 +253 +255 +255 +253 +255 +255 +251 +255 +255 +248 +253 +254 +255 +251 +247 +253 +243 +247 +253 +243 +253 +255 +247 +255 +255 +248 +255 +253 +246 +255 +251 +245 +255 +255 +246 +255 +250 +240 +246 +240 +226 +242 +236 +220 +251 +246 +226 +255 +252 +230 +254 +252 +227 +254 +253 +225 +255 +255 +230 +253 +254 +236 +248 +249 +235 +246 +246 +234 +86 +79 +63 +84 +78 +62 +83 +75 +62 +80 +74 +60 +79 +71 +58 +76 +70 +56 +76 +68 +55 +74 +68 +56 +72 +64 +53 +70 +64 +52 +69 +60 +51 +66 +59 +49 +66 +57 +50 +65 +58 +50 +67 +58 +51 +65 +60 +54 +67 +64 +57 +68 +68 +58 +74 +70 +58 +77 +71 +55 +79 +71 +50 +81 +70 +48 +84 +72 +50 +85 +72 +53 +85 +73 +61 +81 +71 +69 +87 +81 +93 +106 +104 +128 +126 +130 +168 +140 +148 +197 +147 +157 +216 +153 +162 +231 +159 +160 +242 +164 +160 +247 +166 +163 +250 +169 +166 +253 +169 +169 +255 +169 +171 +254 +169 +172 +253 +169 +172 +251 +165 +171 +245 +163 +170 +242 +163 +167 +238 +162 +167 +235 +164 +169 +237 +165 +170 +238 +165 +168 +237 +163 +167 +238 +152 +161 +230 +150 +161 +227 +148 +159 +221 +148 +159 +213 +149 +155 +203 +152 +150 +190 +158 +141 +175 +168 +132 +160 +164 +102 +127 +178 +93 +114 +193 +82 +99 +206 +74 +88 +218 +66 +78 +228 +62 +72 +235 +60 +67 +235 +61 +62 +231 +64 +58 +223 +67 +55 +216 +70 +55 +209 +74 +55 +199 +74 +52 +191 +71 +47 +189 +67 +44 +193 +64 +45 +225 +83 +69 +221 +68 +60 +221 +57 +55 +230 +62 +61 +236 +68 +67 +230 +64 +64 +219 +56 +57 +207 +53 +51 +205 +67 +57 +200 +68 +56 +201 +67 +56 +199 +65 +53 +198 +62 +50 +195 +57 +44 +194 +54 +41 +194 +50 +39 +198 +50 +40 +203 +51 +40 +206 +52 +42 +211 +53 +44 +216 +53 +46 +217 +52 +46 +219 +52 +46 +219 +52 +44 +228 +66 +55 +222 +60 +49 +218 +54 +44 +218 +54 +44 +223 +57 +45 +223 +57 +45 +219 +53 +41 +213 +49 +37 +216 +56 +40 +206 +49 +32 +202 +49 +33 +208 +57 +40 +206 +56 +39 +199 +52 +34 +202 +55 +37 +212 +67 +48 +200 +55 +38 +206 +56 +42 +215 +54 +44 +222 +53 +46 +230 +51 +47 +238 +53 +51 +246 +58 +57 +251 +63 +62 +255 +76 +75 +250 +72 +70 +242 +66 +66 +236 +62 +61 +234 +60 +61 +231 +55 +58 +229 +50 +54 +230 +44 +49 +244 +43 +49 +248 +41 +47 +244 +44 +46 +239 +47 +46 +232 +49 +43 +224 +52 +42 +217 +53 +41 +211 +55 +40 +198 +48 +33 +192 +46 +31 +244 +100 +89 +235 +93 +83 +207 +64 +58 +212 +68 +67 +203 +59 +59 +223 +77 +77 +234 +82 +81 +224 +72 +69 +211 +59 +54 +201 +54 +47 +198 +56 +46 +198 +57 +47 +195 +59 +45 +190 +58 +43 +190 +60 +44 +193 +64 +45 +192 +65 +46 +187 +60 +41 +183 +56 +37 +184 +57 +38 +189 +60 +41 +190 +63 +46 +181 +55 +41 +179 +55 +43 +184 +62 +49 +193 +71 +58 +197 +75 +64 +197 +73 +65 +200 +73 +66 +203 +74 +69 +229 +97 +95 +230 +94 +96 +241 +100 +106 +254 +110 +119 +254 +107 +117 +243 +93 +105 +240 +88 +101 +246 +94 +109 +248 +97 +116 +241 +100 +116 +229 +104 +112 +223 +110 +114 +233 +127 +127 +249 +141 +139 +247 +131 +132 +239 +110 +115 +253 +112 +121 +255 +120 +134 +245 +97 +113 +223 +88 +102 +246 +136 +145 +255 +180 +180 +211 +173 +162 +164 +153 +135 +96 +104 +80 +69 +81 +57 +82 +84 +63 +107 +97 +85 +156 +136 +129 +220 +192 +191 +244 +215 +217 +246 +224 +227 +255 +241 +244 +255 +248 +251 +253 +253 +255 +251 +252 +255 +252 +253 +255 +255 +253 +255 +255 +252 +255 +254 +249 +253 +250 +255 +249 +242 +254 +240 +242 +252 +241 +249 +255 +244 +253 +255 +247 +250 +252 +241 +254 +251 +242 +255 +255 +244 +255 +255 +243 +252 +246 +232 +248 +242 +226 +254 +249 +229 +255 +253 +231 +253 +251 +226 +253 +252 +224 +255 +255 +233 +255 +255 +241 +252 +252 +240 +251 +251 +239 +88 +79 +64 +87 +80 +64 +87 +78 +63 +85 +78 +62 +84 +75 +60 +82 +75 +59 +82 +73 +58 +80 +72 +59 +77 +67 +55 +75 +67 +54 +75 +65 +53 +72 +64 +51 +72 +62 +50 +71 +63 +50 +72 +62 +50 +70 +64 +52 +71 +67 +58 +71 +69 +57 +74 +71 +56 +78 +73 +54 +82 +74 +53 +85 +74 +52 +85 +74 +52 +86 +75 +57 +88 +78 +68 +85 +76 +77 +90 +84 +98 +107 +104 +131 +123 +126 +167 +137 +143 +195 +145 +153 +215 +152 +159 +231 +166 +162 +246 +167 +161 +249 +165 +160 +252 +164 +161 +252 +162 +163 +255 +163 +167 +255 +164 +170 +255 +164 +173 +252 +161 +170 +245 +161 +169 +241 +161 +168 +236 +164 +169 +237 +167 +170 +239 +172 +170 +243 +174 +170 +246 +171 +170 +246 +161 +168 +246 +156 +166 +238 +149 +160 +222 +152 +159 +211 +166 +164 +203 +180 +160 +188 +180 +135 +155 +179 +105 +120 +186 +78 +93 +205 +70 +84 +219 +65 +77 +227 +61 +73 +228 +61 +71 +227 +62 +69 +223 +64 +69 +223 +64 +68 +226 +61 +65 +221 +61 +61 +219 +70 +66 +200 +59 +52 +202 +68 +59 +202 +69 +60 +186 +49 +41 +219 +74 +69 +230 +75 +73 +233 +67 +69 +235 +62 +66 +232 +59 +63 +230 +60 +63 +225 +61 +62 +219 +59 +59 +212 +60 +57 +207 +66 +59 +200 +63 +55 +202 +68 +59 +209 +77 +65 +205 +75 +62 +191 +61 +48 +184 +54 +41 +189 +57 +44 +191 +55 +43 +195 +54 +44 +200 +53 +45 +203 +50 +42 +209 +47 +42 +212 +47 +43 +219 +50 +47 +224 +53 +46 +231 +65 +53 +224 +56 +43 +219 +49 +36 +222 +50 +38 +230 +57 +43 +231 +59 +45 +225 +55 +38 +215 +50 +31 +209 +50 +31 +206 +51 +31 +203 +52 +33 +201 +51 +34 +201 +51 +34 +203 +51 +37 +206 +53 +39 +207 +53 +41 +202 +48 +38 +207 +50 +41 +209 +53 +41 +210 +54 +42 +210 +52 +40 +213 +51 +38 +215 +51 +39 +220 +52 +41 +224 +50 +41 +230 +51 +46 +235 +53 +50 +235 +51 +51 +233 +47 +50 +231 +45 +50 +232 +45 +52 +237 +46 +53 +246 +45 +51 +246 +43 +47 +239 +43 +44 +236 +47 +45 +234 +53 +46 +227 +57 +44 +217 +55 +40 +208 +52 +37 +195 +45 +28 +196 +51 +34 +231 +88 +72 +233 +89 +78 +203 +59 +51 +223 +78 +73 +197 +52 +49 +218 +72 +72 +225 +79 +80 +220 +74 +74 +212 +67 +64 +204 +59 +54 +200 +56 +48 +198 +56 +44 +199 +57 +43 +200 +60 +43 +197 +60 +42 +194 +59 +40 +190 +57 +38 +188 +59 +40 +187 +60 +41 +186 +61 +41 +186 +61 +43 +183 +60 +44 +180 +56 +44 +181 +59 +48 +185 +61 +49 +187 +63 +51 +187 +63 +51 +190 +64 +52 +192 +64 +53 +196 +65 +55 +239 +106 +97 +245 +112 +105 +234 +99 +95 +244 +109 +106 +251 +113 +113 +236 +97 +100 +244 +103 +109 +255 +112 +121 +255 +107 +122 +251 +104 +120 +234 +103 +111 +226 +101 +105 +229 +103 +106 +237 +109 +110 +243 +110 +111 +245 +109 +111 +255 +119 +123 +255 +126 +133 +241 +95 +108 +241 +105 +119 +214 +103 +112 +248 +174 +175 +189 +167 +154 +133 +141 +117 +97 +112 +81 +74 +89 +58 +77 +81 +56 +115 +110 +90 +165 +149 +136 +205 +182 +176 +237 +213 +211 +255 +238 +240 +255 +244 +245 +255 +245 +249 +252 +247 +251 +251 +251 +253 +253 +254 +255 +254 +255 +255 +255 +254 +255 +251 +255 +254 +239 +255 +243 +229 +252 +232 +231 +249 +233 +240 +254 +237 +248 +255 +245 +252 +255 +244 +253 +255 +242 +255 +253 +240 +255 +253 +241 +255 +251 +238 +255 +250 +234 +255 +250 +230 +254 +249 +227 +252 +250 +225 +252 +250 +225 +251 +250 +229 +253 +253 +241 +255 +255 +250 +255 +255 +250 +89 +80 +65 +88 +79 +64 +88 +79 +64 +86 +77 +62 +85 +76 +61 +84 +75 +60 +83 +74 +59 +82 +73 +58 +78 +69 +54 +77 +68 +53 +76 +67 +52 +75 +66 +51 +74 +65 +50 +74 +65 +50 +74 +65 +50 +73 +65 +52 +71 +67 +56 +72 +68 +57 +76 +70 +56 +79 +72 +54 +82 +74 +53 +83 +75 +52 +86 +75 +55 +84 +75 +58 +88 +78 +69 +85 +76 +77 +89 +85 +99 +107 +104 +131 +123 +125 +166 +134 +140 +192 +141 +149 +211 +150 +154 +225 +161 +156 +236 +163 +155 +241 +161 +157 +244 +161 +158 +249 +160 +161 +253 +160 +165 +255 +162 +170 +255 +161 +172 +251 +160 +172 +244 +160 +171 +237 +158 +167 +232 +161 +166 +232 +164 +164 +234 +166 +164 +237 +166 +162 +238 +163 +160 +237 +163 +166 +243 +160 +164 +235 +160 +160 +220 +165 +155 +205 +177 +153 +189 +188 +143 +166 +189 +115 +130 +191 +87 +98 +204 +70 +77 +220 +63 +70 +230 +59 +67 +233 +58 +65 +230 +59 +67 +225 +62 +67 +219 +64 +68 +218 +65 +70 +224 +60 +67 +218 +57 +63 +218 +65 +68 +203 +59 +59 +204 +66 +63 +202 +64 +61 +193 +51 +49 +229 +79 +80 +230 +67 +70 +232 +63 +68 +234 +59 +66 +231 +56 +63 +226 +56 +59 +219 +56 +57 +213 +58 +56 +207 +59 +55 +212 +69 +63 +198 +61 +53 +197 +60 +52 +204 +71 +62 +204 +76 +65 +193 +67 +53 +184 +58 +44 +183 +57 +43 +185 +55 +42 +191 +55 +43 +198 +54 +45 +203 +52 +45 +209 +50 +46 +216 +51 +47 +225 +53 +51 +228 +56 +52 +229 +61 +50 +226 +58 +45 +225 +53 +41 +225 +52 +38 +228 +52 +39 +226 +53 +39 +221 +51 +34 +213 +50 +31 +211 +56 +36 +205 +56 +34 +201 +56 +37 +200 +58 +38 +204 +58 +43 +206 +58 +44 +207 +55 +44 +208 +51 +42 +213 +51 +46 +214 +53 +45 +211 +55 +43 +207 +55 +41 +201 +54 +38 +199 +52 +34 +203 +52 +33 +207 +52 +34 +216 +50 +36 +222 +50 +38 +227 +48 +43 +230 +46 +44 +230 +44 +45 +230 +44 +47 +230 +45 +50 +232 +46 +51 +236 +43 +46 +237 +44 +45 +236 +48 +46 +232 +50 +46 +224 +52 +42 +219 +53 +39 +213 +56 +39 +210 +57 +39 +213 +63 +46 +187 +42 +25 +214 +68 +53 +208 +62 +49 +217 +70 +62 +235 +86 +80 +218 +66 +63 +216 +66 +65 +231 +85 +86 +226 +82 +82 +220 +75 +72 +212 +67 +62 +205 +61 +53 +201 +57 +46 +200 +57 +43 +199 +56 +40 +200 +59 +42 +196 +59 +40 +191 +58 +39 +189 +60 +41 +189 +62 +43 +186 +63 +45 +185 +64 +47 +182 +62 +46 +178 +58 +44 +180 +59 +48 +183 +61 +48 +184 +62 +49 +186 +63 +48 +189 +63 +49 +193 +66 +51 +197 +67 +53 +235 +105 +92 +242 +109 +100 +231 +98 +91 +240 +107 +102 +245 +111 +108 +232 +98 +97 +241 +107 +108 +254 +115 +120 +255 +111 +126 +255 +110 +124 +242 +107 +114 +228 +97 +102 +228 +92 +96 +239 +99 +102 +253 +110 +112 +255 +119 +120 +253 +117 +119 +255 +121 +126 +235 +89 +100 +237 +99 +112 +215 +99 +110 +242 +168 +169 +178 +162 +147 +118 +134 +107 +94 +114 +79 +78 +95 +59 +83 +90 +59 +117 +115 +92 +169 +157 +141 +214 +196 +184 +246 +225 +220 +255 +245 +241 +255 +248 +248 +255 +248 +249 +253 +249 +250 +251 +251 +251 +250 +254 +253 +251 +255 +254 +250 +254 +255 +246 +255 +250 +237 +255 +242 +227 +255 +232 +227 +251 +229 +235 +254 +234 +244 +255 +240 +249 +255 +241 +252 +255 +241 +255 +255 +240 +255 +253 +239 +255 +253 +237 +255 +251 +233 +254 +247 +229 +249 +244 +224 +248 +243 +221 +250 +245 +223 +250 +247 +228 +249 +249 +239 +251 +252 +246 +254 +253 +249 +92 +80 +66 +91 +79 +65 +91 +79 +65 +89 +77 +63 +88 +76 +62 +87 +75 +61 +86 +74 +60 +86 +74 +60 +83 +71 +57 +82 +70 +56 +81 +69 +55 +79 +67 +53 +79 +67 +53 +79 +67 +53 +79 +67 +53 +77 +67 +55 +74 +67 +57 +74 +70 +59 +77 +71 +57 +80 +73 +55 +83 +75 +54 +86 +75 +53 +86 +75 +55 +84 +75 +58 +87 +77 +67 +86 +77 +78 +90 +87 +98 +107 +105 +129 +121 +123 +161 +133 +137 +185 +139 +145 +203 +146 +150 +214 +153 +152 +222 +155 +151 +227 +155 +152 +233 +155 +156 +238 +157 +159 +244 +158 +163 +247 +160 +167 +248 +160 +169 +244 +160 +170 +239 +157 +168 +232 +155 +165 +227 +156 +162 +224 +156 +160 +224 +157 +158 +225 +156 +154 +227 +155 +153 +226 +153 +154 +221 +158 +152 +214 +168 +147 +204 +178 +140 +189 +191 +131 +169 +198 +115 +145 +197 +91 +111 +194 +70 +81 +209 +68 +76 +218 +65 +68 +223 +63 +65 +225 +62 +63 +225 +62 +65 +225 +62 +67 +223 +62 +68 +223 +62 +70 +224 +60 +67 +215 +56 +61 +213 +63 +65 +207 +65 +64 +202 +67 +63 +195 +60 +56 +196 +57 +54 +233 +87 +87 +224 +66 +67 +228 +62 +66 +232 +59 +63 +227 +57 +60 +220 +54 +56 +214 +54 +54 +209 +57 +54 +204 +59 +54 +213 +72 +65 +196 +59 +49 +190 +53 +43 +197 +65 +53 +205 +75 +62 +198 +72 +58 +187 +61 +47 +183 +56 +41 +186 +54 +41 +191 +55 +41 +199 +55 +44 +207 +54 +46 +215 +53 +48 +222 +55 +49 +230 +57 +53 +233 +61 +57 +217 +50 +42 +218 +51 +42 +221 +53 +42 +223 +52 +42 +223 +52 +42 +222 +54 +41 +220 +57 +42 +217 +62 +44 +198 +51 +33 +192 +51 +31 +187 +52 +33 +186 +53 +34 +191 +55 +41 +191 +55 +41 +191 +50 +40 +193 +44 +37 +227 +64 +59 +229 +62 +56 +222 +61 +51 +213 +60 +46 +204 +57 +41 +200 +55 +36 +200 +55 +34 +204 +55 +35 +210 +55 +37 +213 +51 +36 +215 +47 +38 +217 +46 +39 +219 +46 +42 +220 +46 +45 +219 +47 +47 +220 +46 +47 +219 +44 +41 +223 +48 +43 +224 +53 +45 +220 +53 +44 +213 +51 +38 +208 +52 +37 +208 +57 +38 +209 +62 +42 +212 +65 +47 +194 +49 +32 +231 +83 +69 +210 +59 +48 +218 +65 +59 +222 +67 +63 +232 +74 +73 +240 +84 +85 +237 +85 +84 +231 +83 +81 +227 +79 +77 +221 +74 +67 +214 +67 +59 +207 +60 +50 +202 +56 +43 +197 +54 +38 +196 +55 +38 +192 +55 +37 +188 +55 +38 +185 +58 +39 +185 +60 +42 +183 +62 +45 +181 +61 +44 +178 +61 +44 +176 +58 +44 +177 +59 +47 +180 +60 +46 +181 +61 +47 +183 +61 +46 +185 +63 +48 +190 +67 +52 +195 +69 +55 +220 +92 +81 +234 +103 +93 +228 +97 +89 +240 +108 +103 +246 +112 +109 +231 +97 +96 +236 +102 +103 +245 +106 +113 +228 +80 +94 +240 +94 +107 +240 +106 +113 +235 +104 +109 +235 +99 +103 +242 +102 +105 +254 +111 +113 +255 +117 +119 +253 +114 +117 +252 +111 +117 +231 +81 +93 +232 +90 +104 +217 +97 +109 +237 +158 +161 +170 +152 +138 +108 +122 +96 +89 +109 +72 +79 +100 +61 +87 +96 +65 +119 +119 +93 +173 +165 +146 +225 +209 +194 +255 +238 +230 +255 +248 +241 +255 +251 +247 +255 +252 +248 +252 +253 +248 +250 +255 +251 +251 +255 +253 +251 +255 +253 +249 +255 +251 +244 +255 +246 +233 +255 +237 +222 +252 +226 +220 +246 +221 +225 +247 +224 +233 +251 +229 +239 +251 +231 +245 +252 +234 +252 +255 +236 +253 +250 +233 +255 +250 +234 +255 +248 +230 +249 +242 +224 +241 +234 +216 +239 +232 +213 +243 +236 +217 +247 +242 +223 +251 +248 +239 +252 +252 +244 +255 +254 +249 +92 +80 +66 +92 +80 +66 +91 +79 +65 +90 +78 +64 +89 +77 +63 +89 +77 +63 +88 +76 +62 +88 +76 +62 +85 +73 +59 +84 +72 +58 +83 +71 +57 +82 +70 +56 +82 +70 +56 +82 +70 +56 +82 +70 +56 +80 +70 +58 +76 +69 +59 +75 +71 +60 +79 +73 +59 +82 +75 +57 +84 +76 +55 +87 +76 +54 +87 +76 +56 +87 +75 +59 +86 +76 +66 +85 +77 +75 +92 +86 +96 +106 +104 +126 +121 +121 +155 +130 +133 +178 +138 +141 +194 +143 +148 +206 +148 +148 +210 +149 +148 +214 +149 +149 +219 +150 +152 +227 +152 +155 +232 +152 +158 +236 +155 +161 +237 +155 +163 +235 +156 +165 +232 +152 +162 +223 +150 +159 +218 +149 +155 +213 +147 +153 +213 +147 +151 +214 +146 +147 +214 +145 +144 +210 +136 +131 +189 +148 +130 +182 +168 +124 +175 +184 +115 +162 +199 +102 +143 +207 +88 +120 +210 +72 +97 +208 +62 +75 +217 +68 +74 +218 +68 +67 +218 +69 +65 +220 +68 +65 +222 +66 +67 +225 +64 +69 +229 +62 +70 +229 +62 +70 +227 +63 +70 +214 +58 +62 +209 +63 +64 +209 +69 +68 +198 +65 +60 +186 +54 +49 +197 +62 +58 +234 +90 +89 +221 +65 +66 +227 +64 +67 +230 +61 +64 +227 +58 +61 +219 +56 +57 +211 +57 +55 +208 +60 +56 +206 +65 +56 +207 +69 +59 +194 +58 +46 +187 +50 +40 +192 +60 +47 +199 +69 +55 +196 +69 +54 +189 +62 +47 +184 +57 +40 +189 +56 +41 +194 +57 +41 +203 +56 +46 +210 +58 +47 +217 +56 +48 +224 +57 +49 +232 +59 +55 +235 +62 +56 +217 +48 +43 +218 +49 +42 +222 +51 +44 +224 +51 +44 +225 +52 +45 +225 +54 +46 +220 +56 +46 +217 +59 +47 +202 +54 +40 +199 +58 +41 +195 +59 +43 +192 +59 +44 +192 +58 +46 +195 +58 +48 +198 +59 +54 +208 +56 +53 +236 +67 +64 +237 +64 +60 +228 +64 +55 +217 +61 +49 +207 +57 +42 +199 +57 +37 +200 +58 +38 +201 +59 +37 +207 +60 +40 +208 +55 +39 +207 +49 +37 +209 +49 +37 +212 +49 +40 +214 +51 +44 +212 +49 +44 +209 +47 +42 +211 +50 +42 +211 +53 +44 +211 +55 +43 +208 +55 +41 +205 +53 +39 +202 +55 +37 +204 +59 +40 +204 +62 +42 +204 +59 +40 +207 +60 +44 +244 +94 +80 +224 +70 +60 +210 +51 +47 +210 +46 +44 +230 +64 +64 +251 +87 +88 +255 +117 +115 +255 +114 +111 +255 +106 +103 +246 +94 +89 +231 +80 +71 +213 +65 +55 +199 +53 +40 +189 +46 +32 +196 +56 +39 +192 +56 +40 +187 +56 +38 +184 +59 +41 +183 +60 +44 +181 +61 +45 +178 +61 +44 +176 +60 +45 +175 +59 +46 +173 +60 +46 +176 +60 +47 +176 +60 +45 +177 +59 +45 +182 +62 +46 +188 +66 +51 +192 +70 +55 +203 +77 +65 +223 +96 +87 +226 +97 +91 +244 +112 +108 +248 +116 +114 +230 +96 +97 +228 +93 +97 +232 +93 +100 +218 +70 +84 +234 +88 +101 +239 +105 +114 +236 +107 +111 +240 +104 +108 +249 +109 +112 +255 +113 +118 +255 +115 +118 +254 +111 +115 +248 +103 +110 +229 +74 +88 +229 +82 +98 +218 +93 +107 +230 +148 +150 +168 +145 +131 +106 +116 +89 +85 +106 +67 +83 +104 +63 +92 +103 +69 +121 +124 +95 +176 +170 +148 +231 +220 +202 +255 +245 +232 +255 +249 +240 +255 +249 +239 +252 +252 +242 +251 +254 +245 +250 +255 +249 +249 +255 +250 +246 +255 +248 +242 +252 +243 +234 +251 +235 +219 +247 +222 +208 +241 +210 +205 +234 +204 +209 +235 +206 +217 +237 +210 +223 +239 +213 +233 +243 +219 +242 +247 +225 +244 +246 +225 +249 +246 +227 +251 +246 +227 +244 +237 +219 +234 +227 +209 +231 +222 +205 +235 +226 +209 +240 +233 +217 +251 +244 +234 +251 +246 +240 +254 +249 +243 +92 +80 +66 +92 +80 +66 +91 +79 +65 +91 +79 +65 +90 +78 +64 +89 +77 +63 +89 +77 +63 +89 +77 +63 +87 +75 +61 +86 +74 +60 +85 +73 +59 +85 +73 +59 +84 +72 +58 +85 +73 +59 +85 +73 +59 +83 +73 +61 +79 +71 +60 +79 +73 +61 +81 +73 +60 +83 +76 +58 +85 +77 +56 +88 +77 +55 +89 +76 +57 +88 +76 +60 +85 +75 +65 +85 +75 +73 +92 +85 +93 +104 +101 +120 +117 +116 +147 +124 +126 +165 +133 +135 +183 +140 +143 +194 +141 +144 +195 +142 +145 +200 +142 +146 +207 +144 +148 +212 +146 +149 +220 +147 +151 +224 +148 +152 +223 +147 +154 +222 +149 +157 +220 +146 +155 +214 +142 +148 +206 +137 +144 +199 +133 +139 +197 +129 +135 +195 +126 +130 +193 +129 +125 +184 +128 +115 +159 +145 +110 +150 +170 +102 +143 +193 +92 +134 +214 +78 +118 +225 +65 +101 +229 +59 +85 +230 +59 +75 +226 +67 +71 +220 +71 +67 +216 +73 +65 +216 +73 +65 +220 +71 +67 +227 +66 +71 +236 +62 +72 +237 +61 +72 +230 +66 +73 +215 +62 +64 +208 +64 +63 +208 +73 +69 +191 +62 +56 +179 +50 +44 +200 +67 +60 +224 +85 +80 +220 +68 +67 +225 +65 +67 +227 +63 +64 +225 +62 +63 +218 +63 +61 +212 +64 +60 +209 +68 +59 +207 +70 +60 +199 +61 +50 +192 +56 +42 +189 +53 +41 +189 +57 +42 +191 +61 +45 +191 +61 +45 +189 +59 +43 +189 +60 +41 +194 +58 +42 +199 +59 +42 +207 +59 +47 +213 +59 +47 +219 +56 +47 +224 +56 +47 +231 +56 +51 +235 +57 +53 +231 +56 +53 +230 +52 +50 +229 +49 +48 +232 +50 +49 +233 +51 +50 +231 +52 +48 +222 +49 +43 +214 +47 +39 +205 +48 +39 +205 +54 +45 +201 +57 +48 +197 +54 +46 +194 +51 +45 +196 +51 +48 +206 +57 +59 +222 +62 +64 +235 +56 +59 +237 +55 +54 +228 +55 +49 +216 +53 +44 +204 +52 +38 +198 +53 +34 +196 +55 +35 +197 +58 +37 +203 +61 +41 +203 +56 +38 +204 +52 +38 +206 +53 +39 +212 +56 +44 +212 +58 +48 +211 +57 +47 +208 +56 +45 +208 +62 +49 +202 +59 +45 +197 +56 +39 +196 +55 +37 +198 +57 +39 +199 +60 +41 +199 +60 +41 +199 +58 +40 +205 +62 +45 +205 +58 +42 +216 +62 +50 +225 +67 +58 +212 +47 +45 +228 +58 +58 +224 +50 +52 +223 +53 +54 +215 +53 +51 +214 +59 +54 +222 +67 +62 +229 +75 +67 +234 +81 +73 +234 +83 +72 +232 +84 +72 +228 +85 +71 +203 +63 +48 +196 +63 +46 +190 +60 +44 +184 +61 +45 +183 +62 +45 +180 +63 +46 +176 +63 +47 +174 +62 +48 +172 +60 +46 +172 +60 +46 +172 +60 +46 +172 +61 +44 +173 +60 +44 +177 +61 +46 +183 +65 +51 +186 +68 +54 +198 +76 +65 +222 +98 +88 +226 +99 +93 +240 +110 +108 +244 +114 +114 +229 +96 +99 +229 +96 +101 +232 +95 +103 +251 +105 +118 +254 +109 +122 +241 +110 +118 +229 +100 +104 +234 +98 +102 +252 +109 +113 +255 +117 +123 +255 +118 +124 +254 +107 +115 +245 +95 +106 +232 +71 +87 +228 +75 +93 +221 +90 +104 +226 +137 +141 +172 +142 +131 +115 +121 +93 +93 +114 +73 +94 +117 +73 +104 +119 +80 +129 +136 +102 +179 +178 +150 +232 +226 +204 +255 +250 +233 +255 +253 +237 +254 +252 +237 +251 +255 +240 +249 +255 +242 +247 +255 +243 +244 +255 +241 +237 +251 +234 +227 +241 +224 +218 +237 +215 +201 +232 +200 +191 +227 +189 +187 +221 +186 +192 +222 +188 +200 +224 +192 +207 +226 +196 +217 +230 +204 +227 +235 +211 +235 +239 +216 +243 +242 +222 +247 +242 +223 +242 +235 +217 +234 +225 +210 +231 +219 +205 +233 +221 +207 +238 +226 +214 +241 +231 +222 +240 +231 +224 +242 +233 +226 +91 +79 +65 +91 +79 +65 +91 +79 +65 +90 +78 +64 +90 +78 +64 +89 +77 +63 +89 +77 +63 +89 +77 +63 +88 +76 +62 +88 +76 +62 +87 +75 +61 +86 +74 +60 +86 +74 +60 +87 +75 +61 +87 +75 +61 +88 +76 +62 +81 +73 +62 +81 +73 +62 +83 +75 +62 +85 +76 +59 +88 +77 +57 +88 +77 +55 +89 +76 +57 +88 +77 +59 +87 +75 +63 +85 +76 +71 +89 +83 +87 +101 +94 +110 +110 +106 +131 +117 +116 +150 +126 +125 +165 +131 +134 +177 +133 +138 +180 +132 +139 +185 +135 +141 +193 +137 +142 +200 +139 +143 +207 +140 +143 +212 +141 +144 +213 +141 +144 +211 +144 +148 +211 +139 +144 +202 +131 +136 +192 +126 +129 +184 +120 +123 +178 +114 +116 +173 +108 +110 +171 +111 +104 +156 +131 +105 +140 +148 +98 +123 +175 +88 +120 +203 +79 +113 +227 +65 +102 +239 +56 +87 +243 +53 +78 +244 +58 +72 +235 +66 +69 +225 +72 +66 +217 +76 +66 +215 +77 +66 +222 +73 +69 +229 +69 +71 +240 +63 +73 +240 +62 +74 +228 +67 +72 +215 +67 +67 +204 +65 +62 +206 +73 +68 +186 +59 +52 +176 +52 +44 +201 +73 +64 +213 +76 +70 +216 +66 +65 +218 +63 +61 +219 +59 +59 +218 +60 +59 +216 +64 +61 +212 +69 +63 +205 +71 +60 +203 +71 +58 +192 +56 +42 +193 +56 +40 +192 +56 +42 +190 +57 +40 +188 +57 +39 +187 +56 +38 +189 +58 +40 +192 +59 +40 +196 +59 +41 +202 +61 +44 +210 +60 +46 +215 +59 +46 +220 +56 +46 +225 +54 +46 +228 +54 +47 +232 +53 +48 +234 +50 +50 +234 +46 +47 +234 +43 +48 +240 +47 +50 +246 +51 +55 +247 +54 +55 +240 +52 +53 +230 +50 +49 +219 +46 +42 +216 +51 +47 +215 +53 +50 +210 +50 +50 +209 +46 +49 +211 +46 +52 +220 +53 +61 +235 +58 +68 +237 +48 +54 +238 +48 +50 +230 +51 +47 +220 +51 +44 +209 +53 +41 +202 +55 +39 +200 +57 +40 +201 +60 +40 +198 +56 +36 +201 +54 +36 +206 +54 +40 +211 +58 +44 +218 +62 +50 +221 +65 +53 +221 +65 +53 +216 +65 +54 +211 +71 +56 +201 +65 +49 +194 +59 +40 +192 +57 +38 +195 +60 +41 +198 +61 +42 +197 +60 +42 +197 +56 +38 +204 +58 +43 +205 +55 +41 +205 +48 +39 +230 +67 +60 +219 +50 +47 +239 +63 +65 +227 +47 +50 +218 +42 +44 +213 +49 +47 +210 +53 +46 +213 +56 +49 +214 +57 +48 +210 +56 +46 +204 +53 +42 +198 +50 +38 +192 +49 +35 +206 +69 +53 +198 +65 +50 +188 +61 +46 +181 +58 +42 +177 +57 +41 +175 +57 +43 +171 +58 +44 +170 +58 +44 +171 +59 +47 +171 +61 +48 +172 +62 +47 +172 +60 +46 +171 +60 +43 +173 +60 +44 +178 +62 +47 +181 +65 +50 +201 +83 +71 +224 +103 +94 +224 +99 +95 +234 +106 +105 +238 +110 +111 +230 +99 +104 +240 +106 +113 +246 +110 +120 +255 +110 +123 +255 +114 +126 +241 +112 +117 +231 +102 +107 +240 +103 +110 +255 +116 +122 +255 +117 +126 +255 +110 +117 +253 +103 +112 +244 +90 +102 +237 +72 +89 +229 +72 +91 +222 +87 +102 +220 +128 +131 +180 +146 +134 +133 +136 +107 +113 +134 +93 +111 +137 +90 +121 +138 +96 +141 +151 +114 +182 +183 +152 +223 +222 +194 +249 +244 +222 +252 +250 +229 +255 +255 +239 +250 +255 +238 +244 +255 +238 +238 +255 +234 +230 +249 +227 +220 +239 +217 +208 +227 +205 +197 +222 +193 +178 +213 +173 +172 +211 +167 +172 +209 +168 +178 +210 +171 +185 +213 +175 +190 +214 +178 +201 +218 +186 +210 +223 +193 +224 +230 +204 +232 +234 +212 +240 +237 +218 +241 +234 +216 +236 +227 +212 +233 +221 +209 +232 +218 +207 +234 +220 +211 +232 +219 +211 +230 +217 +211 +229 +216 +210 +91 +78 +62 +91 +78 +62 +91 +78 +62 +91 +78 +62 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +89 +76 +60 +89 +76 +60 +88 +75 +59 +88 +75 +59 +88 +75 +59 +89 +76 +60 +89 +76 +60 +89 +77 +63 +83 +73 +63 +84 +74 +62 +85 +76 +61 +88 +76 +60 +89 +78 +58 +90 +77 +58 +90 +77 +58 +89 +78 +60 +89 +77 +63 +85 +76 +69 +88 +79 +82 +95 +87 +98 +100 +95 +115 +106 +102 +129 +115 +111 +144 +121 +121 +157 +122 +128 +164 +122 +130 +169 +127 +131 +178 +130 +133 +188 +133 +134 +198 +135 +136 +203 +136 +137 +204 +136 +137 +202 +136 +136 +200 +131 +131 +191 +125 +124 +181 +121 +118 +173 +115 +112 +167 +110 +107 +164 +105 +101 +160 +111 +95 +142 +132 +94 +117 +151 +85 +97 +179 +78 +96 +210 +74 +98 +236 +64 +90 +246 +54 +79 +251 +52 +71 +252 +58 +69 +240 +64 +64 +231 +70 +62 +222 +74 +64 +219 +75 +66 +224 +72 +69 +231 +68 +71 +240 +63 +73 +239 +63 +74 +221 +65 +68 +212 +70 +68 +200 +65 +61 +201 +72 +66 +180 +58 +47 +177 +55 +44 +206 +79 +70 +201 +66 +60 +206 +61 +56 +208 +54 +52 +207 +49 +48 +208 +53 +49 +211 +62 +56 +207 +69 +59 +200 +70 +57 +195 +68 +53 +190 +57 +40 +195 +58 +40 +194 +58 +42 +191 +58 +39 +189 +56 +37 +190 +57 +38 +191 +58 +39 +193 +58 +38 +196 +57 +38 +203 +58 +41 +211 +58 +44 +217 +57 +43 +221 +55 +43 +225 +53 +43 +228 +51 +43 +234 +51 +45 +235 +42 +43 +241 +42 +45 +248 +45 +51 +253 +46 +52 +255 +49 +55 +255 +50 +55 +255 +51 +56 +253 +53 +56 +250 +55 +59 +246 +55 +60 +243 +57 +62 +243 +56 +65 +246 +56 +68 +247 +55 +70 +252 +53 +72 +254 +53 +69 +246 +42 +53 +244 +45 +50 +237 +49 +50 +227 +52 +47 +217 +54 +45 +208 +56 +42 +206 +59 +43 +206 +61 +44 +203 +53 +38 +209 +56 +42 +217 +59 +47 +223 +61 +50 +226 +62 +52 +228 +61 +52 +229 +62 +53 +223 +65 +54 +217 +74 +60 +207 +71 +55 +201 +65 +49 +196 +60 +44 +194 +57 +41 +194 +57 +39 +198 +56 +42 +200 +57 +41 +201 +50 +39 +211 +57 +47 +225 +64 +56 +235 +68 +62 +222 +48 +47 +224 +46 +46 +235 +52 +54 +232 +54 +54 +216 +51 +45 +213 +55 +46 +215 +57 +48 +215 +58 +49 +213 +59 +49 +210 +59 +48 +205 +58 +48 +201 +59 +47 +214 +76 +63 +204 +70 +58 +191 +64 +49 +180 +57 +42 +176 +54 +41 +172 +54 +40 +171 +55 +42 +169 +56 +42 +172 +59 +45 +173 +61 +47 +174 +62 +48 +173 +61 +47 +171 +60 +43 +171 +60 +43 +173 +60 +46 +177 +61 +48 +192 +75 +65 +218 +100 +90 +222 +99 +94 +232 +107 +105 +240 +111 +115 +234 +105 +110 +245 +114 +122 +253 +117 +127 +241 +101 +112 +248 +111 +121 +245 +116 +121 +237 +111 +115 +248 +111 +118 +255 +120 +127 +255 +116 +125 +255 +101 +111 +252 +98 +110 +242 +84 +98 +241 +72 +91 +231 +68 +89 +222 +81 +97 +217 +118 +123 +189 +149 +137 +152 +153 +122 +129 +150 +107 +123 +151 +102 +130 +149 +104 +145 +157 +117 +172 +178 +142 +203 +204 +173 +224 +224 +196 +233 +236 +209 +236 +244 +220 +227 +241 +215 +215 +235 +207 +205 +228 +199 +196 +221 +191 +187 +212 +182 +180 +203 +174 +172 +199 +164 +156 +193 +149 +152 +194 +144 +156 +195 +148 +163 +201 +154 +170 +203 +158 +175 +203 +162 +184 +206 +168 +194 +211 +177 +206 +217 +187 +216 +222 +196 +228 +227 +206 +235 +229 +213 +236 +226 +214 +233 +219 +210 +229 +212 +205 +226 +209 +202 +223 +205 +201 +218 +203 +198 +213 +198 +193 +91 +78 +62 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +89 +76 +60 +89 +76 +60 +90 +77 +61 +89 +76 +60 +89 +76 +60 +88 +75 +59 +88 +75 +59 +89 +76 +60 +90 +77 +61 +90 +76 +63 +86 +74 +62 +86 +74 +62 +88 +76 +62 +89 +78 +60 +90 +77 +60 +90 +77 +58 +90 +77 +58 +90 +77 +60 +91 +79 +65 +87 +77 +68 +87 +77 +76 +92 +82 +90 +94 +88 +102 +98 +93 +113 +106 +102 +127 +113 +113 +141 +116 +119 +150 +116 +122 +156 +120 +125 +167 +125 +128 +181 +129 +129 +191 +132 +131 +197 +133 +132 +200 +135 +132 +199 +130 +125 +191 +127 +121 +183 +125 +116 +173 +122 +111 +167 +122 +109 +165 +120 +105 +162 +116 +101 +160 +124 +95 +141 +133 +79 +93 +152 +72 +75 +178 +69 +75 +211 +71 +82 +237 +66 +82 +246 +58 +73 +252 +54 +67 +253 +58 +64 +244 +62 +61 +235 +66 +59 +228 +69 +63 +225 +70 +65 +227 +69 +66 +230 +67 +70 +237 +63 +72 +234 +64 +73 +214 +64 +65 +209 +71 +68 +197 +65 +60 +195 +71 +63 +178 +57 +46 +179 +58 +47 +209 +85 +75 +195 +62 +53 +201 +56 +51 +199 +47 +44 +197 +42 +38 +200 +47 +42 +205 +58 +51 +204 +67 +57 +195 +67 +54 +188 +62 +47 +192 +59 +42 +196 +59 +41 +195 +60 +41 +193 +58 +39 +194 +59 +40 +195 +60 +41 +194 +59 +39 +195 +56 +37 +196 +53 +36 +202 +55 +37 +212 +56 +41 +217 +55 +42 +221 +53 +42 +225 +51 +42 +229 +51 +41 +234 +50 +42 +245 +51 +51 +254 +54 +56 +255 +56 +60 +255 +52 +58 +255 +45 +50 +255 +40 +45 +255 +40 +45 +254 +43 +49 +254 +45 +51 +246 +41 +48 +242 +38 +49 +247 +41 +54 +255 +44 +63 +255 +42 +65 +252 +32 +57 +244 +25 +47 +246 +34 +48 +243 +40 +46 +237 +44 +49 +230 +48 +47 +218 +49 +44 +212 +51 +43 +209 +53 +41 +208 +54 +42 +212 +54 +43 +221 +57 +48 +230 +61 +54 +235 +62 +55 +235 +58 +52 +232 +55 +49 +232 +53 +48 +226 +57 +50 +223 +72 +61 +215 +75 +60 +211 +69 +55 +203 +61 +47 +196 +54 +40 +194 +51 +37 +200 +54 +41 +207 +56 +45 +206 +52 +42 +212 +54 +45 +230 +67 +60 +223 +56 +50 +224 +50 +49 +210 +32 +32 +236 +56 +57 +229 +54 +51 +213 +49 +40 +210 +52 +41 +210 +52 +41 +207 +53 +41 +206 +54 +43 +202 +54 +42 +200 +53 +43 +197 +55 +43 +227 +89 +78 +216 +82 +70 +202 +72 +59 +190 +64 +50 +183 +59 +47 +181 +59 +46 +181 +60 +49 +181 +60 +49 +175 +57 +45 +177 +59 +47 +177 +61 +48 +177 +61 +46 +175 +59 +44 +173 +57 +42 +173 +57 +44 +174 +58 +45 +177 +60 +50 +208 +89 +81 +220 +98 +93 +236 +112 +112 +244 +118 +121 +238 +109 +114 +245 +113 +124 +248 +114 +125 +255 +121 +131 +255 +127 +137 +250 +124 +128 +235 +109 +113 +241 +104 +112 +255 +114 +124 +255 +115 +127 +255 +105 +116 +250 +92 +106 +243 +80 +97 +245 +71 +94 +232 +64 +87 +220 +78 +94 +215 +112 +116 +196 +152 +139 +164 +163 +132 +134 +156 +110 +126 +154 +103 +129 +151 +104 +141 +156 +113 +161 +169 +130 +180 +186 +150 +200 +205 +173 +213 +220 +189 +202 +215 +185 +191 +210 +178 +176 +202 +167 +166 +193 +158 +157 +187 +151 +154 +182 +144 +150 +178 +140 +145 +176 +134 +140 +180 +130 +138 +181 +127 +143 +186 +133 +152 +192 +140 +158 +195 +144 +162 +196 +146 +170 +197 +154 +179 +201 +162 +190 +206 +170 +201 +210 +181 +216 +218 +196 +227 +224 +205 +232 +222 +210 +230 +216 +207 +223 +205 +201 +218 +199 +195 +211 +193 +189 +206 +188 +184 +200 +182 +180 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +88 +75 +59 +88 +75 +59 +88 +75 +59 +89 +76 +60 +89 +76 +60 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +76 +63 +90 +76 +63 +90 +77 +61 +91 +78 +61 +93 +77 +61 +94 +79 +60 +92 +79 +60 +92 +79 +62 +89 +77 +61 +87 +77 +67 +87 +76 +72 +88 +78 +79 +90 +80 +88 +93 +85 +98 +96 +89 +105 +96 +93 +114 +103 +103 +129 +106 +109 +142 +112 +114 +155 +114 +116 +167 +120 +119 +179 +129 +126 +193 +137 +131 +201 +138 +131 +199 +137 +126 +192 +140 +126 +188 +138 +120 +178 +135 +112 +168 +139 +112 +167 +145 +114 +171 +139 +106 +163 +137 +90 +132 +143 +71 +82 +161 +66 +60 +179 +65 +64 +202 +68 +67 +220 +64 +67 +231 +58 +62 +243 +60 +62 +254 +68 +69 +246 +62 +60 +241 +62 +58 +236 +62 +61 +233 +65 +64 +233 +67 +67 +233 +68 +72 +233 +66 +73 +226 +67 +72 +207 +63 +62 +197 +64 +57 +190 +63 +54 +183 +62 +51 +176 +60 +47 +178 +60 +48 +192 +68 +56 +210 +77 +68 +199 +54 +49 +212 +59 +54 +205 +50 +46 +204 +51 +46 +214 +67 +59 +199 +63 +51 +181 +54 +39 +187 +62 +44 +186 +55 +37 +193 +58 +39 +195 +60 +41 +194 +59 +40 +192 +57 +37 +194 +57 +38 +197 +58 +39 +199 +58 +40 +203 +58 +39 +208 +57 +40 +214 +54 +40 +216 +50 +36 +218 +46 +34 +224 +47 +37 +236 +55 +46 +245 +61 +53 +246 +57 +51 +247 +54 +49 +248 +49 +46 +249 +43 +43 +250 +40 +41 +252 +38 +40 +252 +38 +40 +252 +38 +40 +251 +38 +42 +247 +33 +41 +248 +34 +46 +255 +39 +55 +255 +41 +62 +255 +33 +59 +255 +24 +54 +255 +23 +49 +254 +37 +54 +238 +34 +43 +229 +34 +42 +227 +43 +45 +221 +45 +45 +211 +42 +39 +209 +44 +40 +218 +50 +47 +226 +54 +50 +232 +54 +52 +238 +54 +54 +242 +54 +53 +242 +49 +50 +239 +46 +47 +238 +44 +44 +229 +47 +44 +220 +57 +50 +209 +58 +49 +210 +57 +49 +236 +83 +75 +187 +34 +26 +196 +43 +35 +223 +70 +62 +200 +46 +38 +205 +46 +40 +222 +60 +55 +232 +69 +64 +226 +58 +55 +216 +47 +42 +218 +46 +42 +226 +53 +49 +229 +60 +55 +223 +62 +52 +213 +60 +46 +207 +53 +41 +203 +51 +38 +204 +53 +42 +205 +59 +46 +203 +59 +48 +197 +56 +46 +236 +98 +88 +224 +90 +79 +200 +67 +58 +185 +54 +44 +186 +58 +47 +184 +56 +45 +177 +51 +39 +180 +54 +42 +176 +48 +37 +176 +50 +38 +174 +50 +38 +175 +52 +37 +176 +54 +39 +178 +58 +42 +180 +60 +46 +179 +61 +49 +176 +58 +48 +186 +67 +59 +214 +92 +87 +236 +112 +112 +241 +115 +118 +246 +120 +124 +251 +121 +131 +245 +113 +124 +255 +122 +132 +253 +119 +128 +242 +117 +123 +244 +118 +122 +253 +116 +124 +255 +114 +124 +255 +107 +120 +255 +100 +115 +255 +94 +110 +241 +74 +92 +245 +69 +92 +239 +70 +91 +217 +70 +86 +208 +103 +107 +190 +144 +128 +158 +155 +122 +134 +156 +109 +125 +153 +102 +126 +148 +99 +135 +151 +106 +148 +159 +119 +158 +166 +129 +160 +168 +131 +156 +168 +132 +146 +163 +127 +138 +163 +124 +128 +159 +118 +122 +154 +113 +121 +154 +111 +124 +157 +114 +129 +160 +118 +131 +164 +117 +132 +172 +119 +134 +177 +121 +140 +183 +127 +147 +188 +132 +149 +190 +134 +152 +189 +135 +157 +189 +140 +162 +189 +144 +167 +188 +147 +175 +189 +154 +189 +195 +167 +206 +205 +185 +220 +212 +199 +224 +211 +202 +218 +200 +196 +211 +192 +188 +203 +185 +183 +192 +177 +174 +184 +168 +168 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +77 +61 +88 +75 +59 +88 +75 +59 +88 +75 +59 +89 +76 +60 +89 +76 +60 +90 +77 +61 +90 +77 +61 +90 +77 +61 +90 +76 +63 +90 +77 +61 +92 +76 +61 +93 +77 +61 +93 +78 +59 +94 +79 +60 +92 +79 +60 +92 +79 +62 +93 +80 +64 +91 +79 +67 +91 +78 +70 +89 +78 +74 +90 +80 +81 +92 +83 +88 +95 +85 +94 +94 +88 +102 +97 +93 +116 +101 +100 +131 +107 +105 +145 +110 +108 +157 +117 +113 +172 +127 +122 +188 +135 +128 +196 +139 +128 +196 +143 +128 +193 +145 +125 +186 +143 +116 +171 +143 +108 +162 +154 +111 +164 +165 +115 +168 +158 +103 +158 +154 +86 +125 +156 +61 +69 +166 +55 +46 +175 +54 +46 +192 +61 +53 +208 +65 +59 +218 +63 +58 +231 +64 +58 +243 +65 +61 +245 +61 +61 +245 +59 +60 +244 +60 +62 +241 +62 +65 +236 +66 +69 +231 +66 +70 +225 +66 +70 +216 +66 +67 +199 +60 +55 +189 +61 +52 +182 +60 +49 +177 +59 +47 +171 +58 +44 +174 +58 +43 +189 +65 +53 +208 +74 +65 +218 +71 +64 +220 +65 +61 +212 +54 +51 +208 +53 +49 +213 +64 +57 +205 +67 +56 +187 +57 +43 +178 +53 +35 +189 +56 +39 +194 +59 +40 +196 +61 +42 +196 +61 +42 +196 +59 +40 +198 +59 +40 +199 +58 +40 +202 +57 +40 +207 +57 +40 +207 +54 +38 +212 +50 +37 +218 +50 +37 +227 +53 +42 +234 +56 +46 +239 +56 +48 +240 +57 +49 +231 +50 +39 +231 +49 +38 +235 +47 +38 +240 +45 +39 +246 +44 +40 +250 +45 +42 +254 +46 +44 +255 +46 +47 +251 +42 +45 +248 +37 +43 +250 +36 +46 +255 +39 +55 +255 +37 +59 +255 +29 +55 +255 +20 +51 +252 +19 +48 +244 +29 +47 +245 +45 +56 +244 +50 +59 +228 +41 +48 +218 +39 +43 +219 +45 +47 +221 +47 +49 +218 +42 +45 +241 +58 +62 +244 +55 +61 +247 +52 +58 +246 +50 +54 +246 +47 +52 +248 +48 +51 +249 +50 +53 +244 +56 +55 +219 +50 +45 +218 +59 +53 +215 +56 +50 +228 +69 +63 +228 +69 +63 +206 +47 +43 +209 +50 +46 +193 +34 +30 +212 +53 +49 +225 +63 +58 +232 +69 +64 +224 +61 +56 +216 +51 +45 +217 +50 +44 +221 +54 +48 +221 +58 +49 +212 +58 +46 +207 +57 +42 +201 +53 +39 +199 +53 +40 +200 +57 +43 +202 +60 +48 +202 +60 +50 +198 +57 +47 +237 +99 +89 +225 +88 +78 +201 +64 +56 +186 +52 +43 +194 +57 +49 +195 +58 +48 +191 +54 +44 +194 +57 +47 +191 +53 +43 +190 +52 +42 +189 +52 +42 +187 +53 +41 +184 +54 +41 +181 +53 +40 +180 +54 +40 +176 +54 +41 +180 +59 +48 +187 +66 +57 +211 +89 +84 +232 +108 +106 +239 +113 +116 +246 +120 +124 +254 +124 +132 +249 +117 +128 +255 +122 +132 +253 +119 +128 +244 +119 +125 +245 +118 +125 +254 +117 +125 +255 +111 +123 +255 +104 +118 +255 +97 +113 +255 +93 +110 +242 +75 +93 +246 +68 +92 +242 +70 +92 +221 +73 +89 +208 +102 +104 +183 +138 +119 +149 +146 +111 +127 +147 +98 +117 +146 +92 +120 +142 +93 +127 +144 +99 +138 +149 +107 +141 +152 +112 +139 +149 +112 +133 +148 +109 +112 +135 +93 +108 +137 +93 +104 +137 +92 +103 +141 +94 +107 +143 +95 +113 +149 +101 +121 +155 +105 +124 +158 +107 +132 +171 +116 +133 +177 +118 +139 +183 +124 +142 +186 +125 +146 +187 +127 +148 +187 +130 +151 +188 +134 +155 +187 +137 +155 +181 +134 +161 +179 +139 +172 +183 +151 +188 +190 +168 +205 +199 +183 +213 +200 +191 +212 +195 +188 +206 +188 +186 +197 +181 +181 +186 +172 +172 +177 +163 +163 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +60 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +92 +76 +60 +92 +76 +61 +92 +76 +61 +93 +75 +61 +93 +77 +61 +93 +78 +59 +94 +79 +60 +94 +79 +60 +92 +79 +60 +95 +82 +65 +93 +81 +65 +92 +80 +68 +91 +78 +70 +90 +79 +75 +91 +80 +78 +93 +81 +83 +92 +82 +90 +93 +84 +103 +98 +89 +118 +101 +95 +133 +105 +99 +145 +113 +108 +164 +125 +119 +181 +132 +126 +190 +137 +125 +189 +152 +132 +193 +155 +128 +183 +156 +118 +169 +160 +111 +158 +177 +115 +162 +189 +117 +165 +183 +104 +152 +177 +81 +118 +181 +61 +70 +186 +54 +49 +182 +54 +45 +189 +61 +50 +200 +68 +56 +210 +69 +59 +219 +66 +58 +228 +63 +57 +241 +61 +62 +247 +58 +62 +249 +58 +63 +247 +61 +66 +239 +64 +69 +229 +66 +69 +215 +65 +66 +205 +66 +63 +192 +59 +52 +184 +57 +48 +177 +57 +43 +173 +57 +42 +169 +56 +40 +173 +57 +42 +187 +63 +51 +207 +70 +60 +217 +68 +62 +215 +57 +54 +217 +55 +52 +218 +59 +55 +220 +67 +61 +221 +79 +69 +206 +72 +60 +181 +51 +35 +190 +57 +40 +193 +58 +39 +196 +59 +41 +198 +61 +43 +201 +61 +44 +200 +60 +43 +201 +58 +41 +204 +57 +41 +207 +55 +41 +207 +50 +35 +211 +47 +35 +223 +52 +42 +238 +61 +51 +244 +63 +54 +241 +57 +49 +233 +52 +43 +224 +54 +39 +221 +54 +38 +226 +50 +37 +230 +48 +37 +234 +46 +37 +238 +45 +38 +239 +44 +40 +242 +44 +41 +242 +44 +45 +239 +40 +43 +240 +39 +47 +247 +41 +54 +253 +37 +58 +252 +30 +55 +251 +22 +51 +248 +24 +51 +244 +37 +55 +241 +47 +58 +242 +52 +64 +239 +53 +64 +238 +57 +66 +238 +58 +67 +233 +53 +62 +229 +45 +55 +240 +50 +60 +243 +47 +59 +246 +46 +57 +246 +45 +55 +245 +46 +51 +245 +46 +49 +243 +47 +49 +237 +52 +50 +220 +48 +44 +226 +61 +57 +218 +54 +52 +223 +59 +57 +255 +109 +106 +229 +67 +65 +209 +47 +45 +206 +47 +44 +217 +58 +55 +223 +64 +60 +224 +65 +59 +219 +60 +54 +213 +55 +46 +214 +53 +45 +214 +53 +43 +210 +54 +42 +200 +54 +39 +195 +54 +37 +194 +54 +39 +196 +56 +41 +197 +59 +46 +198 +60 +49 +198 +60 +49 +197 +59 +49 +235 +96 +89 +225 +84 +77 +201 +60 +51 +191 +48 +40 +203 +59 +51 +209 +62 +54 +206 +59 +51 +210 +61 +54 +216 +61 +56 +215 +60 +55 +212 +61 +54 +207 +60 +50 +201 +59 +49 +195 +57 +46 +188 +54 +42 +182 +54 +41 +185 +59 +47 +188 +64 +54 +207 +84 +77 +227 +103 +101 +237 +111 +114 +248 +122 +126 +255 +129 +136 +253 +123 +131 +255 +122 +131 +252 +121 +129 +245 +122 +127 +246 +121 +127 +254 +117 +127 +255 +110 +124 +255 +99 +117 +255 +92 +111 +255 +89 +109 +242 +73 +94 +245 +65 +90 +242 +70 +92 +224 +76 +90 +203 +97 +97 +167 +122 +101 +130 +128 +90 +110 +130 +81 +104 +133 +79 +109 +131 +82 +116 +133 +88 +123 +136 +93 +125 +136 +94 +120 +132 +92 +113 +130 +88 +96 +122 +77 +95 +127 +80 +97 +133 +85 +101 +141 +89 +110 +149 +96 +117 +156 +103 +125 +160 +106 +128 +163 +109 +132 +171 +114 +135 +176 +116 +139 +180 +120 +142 +184 +121 +140 +184 +121 +143 +185 +122 +146 +186 +126 +148 +186 +129 +147 +177 +127 +149 +172 +128 +154 +170 +134 +168 +174 +146 +184 +181 +162 +196 +186 +174 +200 +185 +178 +198 +183 +180 +183 +171 +173 +169 +160 +165 +159 +150 +155 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +92 +76 +60 +93 +75 +61 +93 +75 +61 +93 +76 +60 +94 +77 +61 +94 +77 +59 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +81 +64 +94 +81 +64 +93 +79 +66 +91 +79 +67 +92 +78 +69 +91 +78 +70 +92 +79 +73 +91 +79 +79 +94 +80 +95 +98 +84 +109 +100 +89 +123 +103 +94 +137 +111 +104 +156 +122 +117 +173 +132 +124 +183 +136 +123 +179 +155 +132 +186 +166 +133 +180 +175 +128 +170 +184 +122 +161 +200 +120 +159 +211 +116 +156 +204 +99 +140 +198 +77 +108 +216 +72 +82 +217 +67 +66 +209 +67 +63 +203 +70 +61 +201 +73 +60 +204 +72 +59 +211 +69 +59 +222 +65 +60 +238 +64 +65 +245 +60 +65 +251 +60 +68 +249 +62 +69 +240 +65 +72 +226 +66 +68 +209 +65 +64 +197 +64 +59 +191 +63 +54 +182 +60 +49 +175 +57 +43 +171 +58 +42 +170 +57 +41 +174 +56 +42 +188 +62 +48 +206 +68 +58 +213 +60 +55 +213 +51 +49 +224 +59 +57 +229 +65 +63 +225 +68 +63 +232 +83 +76 +223 +85 +74 +191 +58 +43 +193 +57 +41 +190 +55 +36 +192 +55 +37 +196 +59 +41 +201 +61 +44 +202 +61 +44 +203 +57 +42 +206 +56 +41 +205 +52 +38 +210 +50 +38 +217 +50 +41 +229 +57 +47 +241 +62 +55 +245 +62 +54 +240 +53 +46 +228 +47 +38 +222 +54 +41 +221 +55 +41 +224 +52 +42 +228 +50 +40 +231 +46 +41 +233 +46 +41 +236 +44 +41 +236 +44 +43 +232 +42 +44 +230 +39 +44 +234 +40 +49 +240 +42 +57 +245 +39 +60 +246 +34 +59 +250 +31 +61 +251 +37 +65 +253 +56 +74 +228 +40 +54 +229 +44 +58 +255 +77 +89 +255 +93 +105 +255 +78 +90 +242 +60 +73 +244 +58 +72 +232 +41 +56 +237 +42 +56 +241 +45 +57 +244 +48 +58 +241 +50 +55 +234 +48 +49 +225 +43 +42 +215 +40 +37 +216 +48 +45 +218 +55 +50 +212 +50 +47 +229 +67 +64 +255 +115 +112 +245 +86 +83 +221 +62 +59 +229 +71 +68 +219 +61 +58 +218 +60 +57 +213 +58 +53 +210 +56 +48 +209 +55 +45 +208 +54 +42 +205 +52 +38 +198 +51 +35 +190 +53 +35 +185 +54 +36 +187 +56 +38 +191 +59 +44 +192 +60 +47 +191 +57 +45 +192 +58 +47 +197 +60 +50 +229 +88 +81 +220 +77 +71 +202 +55 +48 +199 +48 +41 +215 +60 +55 +222 +65 +58 +218 +59 +53 +223 +60 +53 +231 +62 +57 +233 +61 +57 +230 +63 +57 +225 +64 +56 +217 +63 +53 +208 +60 +50 +200 +58 +46 +193 +57 +45 +187 +57 +44 +187 +61 +49 +203 +78 +72 +224 +99 +95 +236 +110 +111 +250 +124 +127 +255 +132 +136 +255 +125 +133 +252 +118 +127 +250 +119 +127 +245 +122 +127 +247 +122 +128 +255 +118 +128 +255 +109 +123 +255 +98 +116 +254 +91 +110 +250 +84 +104 +240 +71 +92 +241 +61 +86 +240 +68 +90 +225 +79 +92 +195 +91 +90 +146 +104 +82 +111 +109 +71 +95 +115 +66 +92 +121 +67 +100 +122 +73 +108 +125 +80 +116 +129 +86 +118 +131 +88 +114 +129 +88 +111 +129 +87 +109 +135 +90 +108 +142 +92 +111 +149 +98 +117 +157 +104 +123 +164 +108 +129 +168 +111 +132 +170 +113 +135 +170 +112 +134 +172 +113 +136 +176 +116 +139 +179 +117 +140 +182 +118 +138 +183 +118 +138 +183 +118 +139 +184 +119 +144 +184 +122 +145 +180 +124 +143 +171 +123 +144 +165 +124 +154 +165 +133 +170 +172 +150 +187 +180 +164 +197 +184 +175 +198 +184 +181 +177 +171 +175 +161 +158 +165 +151 +146 +153 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +91 +75 +59 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +92 +76 +60 +93 +76 +60 +94 +75 +60 +94 +75 +60 +94 +77 +61 +94 +77 +59 +95 +78 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +78 +62 +94 +78 +62 +92 +79 +63 +94 +78 +65 +93 +79 +66 +94 +80 +69 +94 +79 +74 +98 +78 +89 +99 +80 +100 +99 +84 +113 +101 +89 +125 +108 +101 +145 +120 +114 +162 +127 +119 +168 +131 +118 +164 +148 +125 +167 +172 +134 +171 +194 +137 +169 +206 +130 +158 +218 +119 +148 +223 +108 +137 +218 +89 +119 +216 +69 +95 +236 +70 +84 +242 +73 +78 +233 +77 +78 +219 +76 +72 +205 +71 +62 +202 +69 +60 +210 +69 +62 +219 +67 +62 +234 +66 +66 +242 +63 +67 +248 +63 +71 +246 +65 +74 +237 +68 +73 +222 +68 +70 +205 +66 +63 +192 +63 +57 +189 +65 +55 +181 +61 +47 +174 +58 +43 +171 +58 +42 +170 +57 +41 +174 +56 +42 +187 +59 +46 +204 +63 +54 +225 +70 +65 +226 +61 +59 +238 +66 +66 +235 +65 +65 +222 +59 +54 +227 +74 +66 +230 +88 +76 +213 +75 +62 +200 +64 +50 +192 +56 +40 +188 +51 +35 +193 +56 +40 +200 +60 +45 +201 +58 +42 +203 +55 +41 +208 +56 +43 +206 +48 +37 +215 +51 +41 +224 +56 +47 +233 +59 +52 +237 +58 +53 +237 +54 +48 +235 +48 +43 +229 +44 +39 +223 +48 +43 +223 +50 +44 +229 +49 +48 +235 +50 +48 +241 +51 +53 +244 +51 +54 +246 +53 +56 +244 +53 +58 +235 +46 +53 +232 +45 +54 +235 +47 +61 +240 +49 +67 +242 +46 +70 +245 +42 +71 +252 +44 +78 +255 +52 +82 +245 +58 +77 +229 +51 +63 +238 +62 +75 +255 +92 +105 +255 +104 +118 +255 +85 +100 +245 +67 +83 +247 +64 +82 +238 +51 +68 +237 +51 +65 +237 +51 +62 +233 +54 +60 +227 +57 +57 +219 +56 +51 +206 +52 +42 +199 +47 +36 +203 +50 +42 +199 +46 +40 +208 +55 +50 +242 +89 +84 +246 +92 +90 +242 +88 +86 +219 +65 +63 +226 +72 +70 +220 +66 +64 +212 +60 +55 +206 +55 +48 +205 +54 +45 +207 +56 +45 +207 +57 +43 +202 +55 +39 +194 +53 +35 +185 +56 +35 +179 +57 +36 +181 +58 +40 +184 +61 +45 +185 +59 +44 +182 +54 +41 +188 +55 +46 +198 +61 +53 +219 +78 +71 +217 +69 +65 +206 +53 +48 +208 +49 +45 +225 +62 +57 +231 +64 +58 +227 +56 +49 +231 +53 +49 +235 +50 +48 +238 +50 +49 +235 +53 +50 +231 +56 +51 +225 +58 +50 +216 +58 +47 +208 +57 +46 +200 +58 +46 +190 +54 +42 +186 +56 +43 +200 +73 +66 +220 +95 +89 +235 +110 +108 +251 +125 +128 +255 +133 +137 +255 +126 +131 +247 +116 +124 +248 +118 +126 +245 +122 +127 +248 +123 +129 +254 +116 +129 +255 +108 +124 +255 +97 +117 +255 +90 +112 +247 +81 +101 +241 +72 +93 +240 +62 +86 +238 +69 +90 +227 +83 +93 +188 +86 +82 +131 +91 +66 +98 +98 +60 +92 +112 +63 +91 +118 +67 +102 +121 +75 +110 +126 +81 +116 +129 +86 +120 +133 +90 +121 +136 +95 +119 +140 +97 +121 +149 +101 +120 +154 +104 +122 +160 +109 +124 +167 +113 +129 +170 +114 +132 +171 +114 +133 +171 +112 +134 +169 +111 +137 +172 +114 +139 +174 +116 +138 +178 +116 +138 +180 +116 +136 +181 +116 +135 +182 +114 +137 +184 +116 +139 +184 +119 +143 +183 +123 +140 +173 +120 +141 +164 +120 +151 +165 +130 +170 +174 +149 +191 +186 +167 +203 +193 +181 +207 +198 +193 +188 +186 +191 +168 +170 +182 +156 +156 +168 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +90 +74 +58 +91 +75 +59 +91 +75 +59 +92 +76 +60 +92 +76 +60 +93 +76 +60 +94 +75 +60 +94 +75 +60 +94 +75 +60 +95 +76 +61 +94 +77 +59 +95 +78 +60 +94 +79 +60 +94 +79 +60 +93 +78 +59 +93 +78 +59 +94 +79 +60 +95 +79 +63 +95 +79 +63 +96 +80 +64 +97 +81 +65 +98 +80 +70 +101 +76 +80 +101 +77 +93 +97 +79 +101 +98 +85 +115 +104 +96 +133 +116 +111 +151 +123 +116 +157 +125 +113 +151 +143 +118 +150 +174 +131 +159 +203 +140 +161 +218 +131 +150 +227 +116 +133 +232 +101 +117 +230 +81 +100 +228 +63 +80 +242 +55 +72 +252 +64 +78 +244 +73 +81 +227 +71 +74 +209 +65 +64 +203 +66 +60 +209 +67 +63 +217 +67 +66 +230 +67 +70 +235 +64 +70 +239 +64 +71 +239 +66 +72 +231 +68 +73 +218 +68 +69 +201 +66 +62 +190 +63 +54 +186 +64 +53 +177 +59 +45 +169 +56 +40 +168 +57 +40 +170 +57 +41 +176 +56 +42 +188 +58 +45 +202 +59 +51 +232 +73 +69 +233 +63 +63 +235 +61 +62 +229 +55 +56 +218 +50 +47 +222 +65 +58 +238 +90 +80 +244 +104 +91 +218 +80 +67 +201 +65 +51 +190 +53 +37 +194 +54 +39 +199 +57 +43 +200 +57 +43 +203 +55 +43 +210 +56 +44 +209 +48 +38 +218 +54 +45 +230 +59 +52 +233 +59 +52 +234 +52 +48 +232 +47 +44 +234 +45 +43 +235 +45 +45 +241 +52 +56 +243 +52 +59 +247 +51 +61 +250 +50 +60 +251 +49 +61 +253 +49 +61 +250 +48 +60 +247 +49 +62 +244 +49 +65 +241 +50 +66 +242 +53 +75 +243 +53 +78 +242 +49 +78 +244 +46 +79 +254 +49 +88 +255 +62 +95 +230 +51 +72 +248 +78 +91 +255 +95 +108 +255 +92 +107 +252 +84 +99 +250 +79 +95 +244 +68 +88 +233 +56 +74 +243 +65 +81 +234 +58 +71 +221 +50 +58 +210 +47 +50 +202 +50 +45 +194 +56 +45 +189 +59 +43 +188 +58 +42 +196 +58 +47 +192 +50 +40 +217 +74 +66 +250 +107 +99 +221 +76 +71 +225 +80 +75 +207 +59 +57 +207 +59 +57 +224 +76 +74 +212 +64 +60 +202 +55 +48 +202 +55 +45 +206 +60 +47 +205 +60 +43 +203 +58 +41 +196 +59 +40 +180 +59 +38 +173 +58 +37 +175 +60 +41 +179 +62 +45 +177 +57 +41 +175 +51 +39 +186 +58 +47 +202 +68 +59 +214 +71 +65 +216 +67 +61 +212 +55 +50 +215 +50 +46 +231 +59 +55 +236 +58 +54 +232 +50 +46 +237 +50 +45 +242 +44 +45 +244 +44 +44 +242 +46 +47 +239 +51 +49 +232 +55 +49 +226 +58 +49 +218 +60 +49 +210 +62 +50 +194 +54 +41 +186 +52 +41 +197 +66 +58 +215 +88 +82 +231 +106 +104 +250 +124 +125 +255 +134 +137 +255 +127 +132 +248 +117 +125 +249 +119 +127 +246 +123 +128 +247 +122 +128 +252 +114 +127 +253 +105 +121 +255 +94 +115 +255 +89 +111 +245 +79 +99 +244 +75 +96 +242 +64 +88 +239 +70 +91 +229 +85 +95 +182 +83 +78 +121 +84 +58 +94 +96 +56 +96 +115 +69 +97 +124 +73 +110 +129 +83 +118 +134 +89 +123 +136 +93 +126 +139 +96 +129 +144 +103 +130 +151 +108 +128 +156 +108 +125 +159 +109 +124 +164 +111 +125 +168 +112 +128 +169 +111 +130 +170 +110 +131 +169 +108 +133 +169 +108 +137 +170 +113 +139 +173 +113 +137 +175 +114 +136 +178 +114 +133 +178 +111 +133 +180 +112 +135 +182 +114 +137 +184 +116 +139 +181 +118 +135 +173 +116 +140 +166 +119 +153 +169 +132 +175 +181 +153 +198 +196 +175 +213 +206 +190 +217 +210 +204 +194 +194 +202 +172 +178 +192 +155 +161 +175 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +90 +75 +56 +91 +76 +57 +91 +76 +57 +92 +77 +58 +92 +77 +58 +93 +76 +58 +94 +75 +60 +96 +74 +60 +94 +75 +60 +95 +76 +61 +94 +77 +59 +95 +78 +60 +94 +79 +60 +94 +79 +60 +94 +79 +58 +95 +80 +59 +96 +79 +59 +97 +80 +62 +97 +80 +62 +97 +80 +62 +97 +80 +60 +100 +78 +65 +104 +75 +77 +103 +75 +87 +99 +78 +95 +98 +84 +109 +106 +97 +128 +118 +112 +146 +124 +118 +152 +128 +115 +145 +143 +117 +142 +173 +128 +148 +205 +134 +148 +222 +127 +135 +237 +113 +121 +246 +101 +108 +246 +82 +91 +244 +62 +75 +248 +47 +66 +255 +55 +75 +251 +65 +79 +235 +64 +73 +219 +63 +67 +214 +66 +66 +213 +67 +67 +215 +65 +66 +224 +65 +69 +227 +64 +69 +230 +63 +70 +228 +65 +70 +223 +67 +70 +212 +66 +66 +199 +64 +60 +189 +62 +53 +184 +62 +51 +175 +57 +43 +168 +55 +39 +169 +58 +41 +173 +60 +42 +180 +60 +44 +193 +61 +49 +207 +63 +55 +223 +61 +58 +229 +57 +57 +227 +48 +51 +226 +47 +50 +224 +52 +50 +219 +57 +52 +230 +77 +69 +252 +108 +97 +242 +104 +91 +217 +81 +67 +198 +60 +47 +198 +58 +45 +200 +58 +46 +201 +55 +42 +205 +54 +43 +213 +56 +47 +213 +52 +44 +222 +55 +47 +230 +57 +51 +232 +54 +50 +233 +49 +47 +232 +47 +44 +238 +49 +47 +245 +49 +53 +255 +50 +66 +255 +48 +68 +255 +45 +69 +255 +43 +65 +255 +38 +63 +255 +35 +60 +250 +32 +56 +244 +32 +55 +246 +39 +65 +243 +43 +69 +242 +47 +77 +242 +49 +80 +240 +44 +80 +243 +42 +84 +254 +51 +96 +255 +66 +104 +240 +67 +87 +255 +95 +108 +255 +103 +116 +247 +85 +100 +236 +74 +89 +239 +74 +90 +234 +65 +84 +217 +49 +66 +235 +64 +82 +221 +55 +67 +201 +45 +49 +186 +40 +40 +177 +46 +36 +171 +56 +38 +165 +63 +38 +168 +64 +39 +184 +63 +46 +188 +58 +44 +221 +89 +77 +225 +93 +81 +205 +71 +62 +205 +68 +62 +193 +54 +51 +201 +59 +55 +228 +85 +81 +213 +70 +64 +201 +57 +49 +200 +56 +45 +201 +58 +44 +200 +57 +40 +200 +57 +40 +196 +61 +41 +177 +63 +39 +166 +60 +38 +168 +59 +38 +172 +61 +42 +171 +55 +40 +172 +51 +40 +188 +61 +52 +211 +76 +70 +214 +71 +65 +221 +69 +64 +219 +57 +54 +220 +51 +48 +233 +55 +51 +236 +53 +49 +235 +48 +43 +244 +49 +45 +253 +44 +47 +255 +43 +45 +250 +46 +47 +244 +49 +47 +237 +52 +47 +230 +56 +49 +223 +59 +49 +216 +62 +50 +201 +57 +46 +189 +51 +40 +192 +59 +50 +207 +78 +72 +225 +97 +94 +247 +121 +122 +255 +136 +138 +255 +131 +135 +252 +121 +129 +252 +122 +130 +248 +124 +132 +247 +122 +130 +249 +111 +124 +249 +101 +117 +252 +90 +111 +252 +86 +108 +238 +75 +96 +242 +74 +97 +240 +64 +87 +236 +69 +89 +225 +84 +93 +174 +77 +71 +112 +77 +49 +92 +94 +54 +95 +114 +68 +102 +126 +78 +117 +136 +91 +127 +142 +99 +132 +144 +104 +134 +146 +106 +136 +151 +110 +137 +158 +115 +136 +164 +116 +132 +166 +116 +127 +167 +114 +125 +168 +112 +127 +168 +110 +129 +169 +109 +131 +169 +108 +134 +168 +108 +136 +167 +110 +138 +169 +110 +136 +172 +111 +134 +174 +111 +130 +175 +108 +130 +177 +107 +131 +181 +110 +133 +183 +114 +135 +179 +116 +134 +173 +116 +140 +168 +119 +155 +173 +133 +176 +185 +154 +199 +199 +175 +214 +207 +189 +215 +210 +204 +188 +192 +201 +165 +174 +189 +147 +156 +171 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +90 +75 +56 +91 +74 +56 +91 +76 +57 +92 +75 +57 +92 +77 +58 +93 +76 +58 +93 +76 +58 +94 +75 +60 +94 +75 +60 +94 +75 +60 +94 +77 +61 +94 +77 +61 +94 +79 +60 +94 +79 +60 +92 +79 +60 +96 +81 +62 +97 +82 +61 +97 +82 +63 +98 +81 +63 +98 +81 +63 +97 +80 +62 +97 +79 +59 +98 +76 +63 +107 +77 +75 +106 +76 +84 +101 +79 +92 +100 +87 +107 +107 +101 +127 +120 +117 +148 +125 +124 +156 +127 +120 +151 +145 +122 +148 +171 +129 +149 +198 +132 +144 +217 +126 +133 +238 +117 +122 +252 +109 +111 +253 +90 +91 +249 +70 +76 +247 +52 +69 +255 +58 +78 +251 +64 +81 +238 +63 +76 +229 +65 +74 +225 +69 +73 +221 +66 +70 +215 +60 +64 +222 +63 +68 +223 +62 +67 +225 +62 +67 +222 +64 +65 +218 +66 +65 +208 +65 +61 +197 +62 +56 +188 +61 +52 +181 +63 +49 +172 +59 +43 +169 +56 +40 +173 +60 +44 +180 +63 +46 +187 +64 +49 +202 +65 +55 +216 +67 +61 +217 +55 +52 +225 +56 +53 +222 +46 +46 +226 +51 +48 +230 +58 +54 +211 +48 +39 +207 +53 +41 +235 +85 +71 +255 +119 +106 +235 +91 +80 +209 +67 +55 +202 +60 +48 +203 +59 +48 +201 +55 +42 +205 +54 +43 +212 +58 +48 +218 +55 +48 +223 +56 +50 +229 +54 +51 +231 +51 +50 +234 +48 +49 +237 +49 +50 +244 +51 +54 +252 +53 +60 +252 +37 +53 +255 +35 +56 +255 +34 +56 +255 +33 +56 +255 +32 +55 +255 +31 +53 +251 +29 +52 +246 +30 +53 +237 +28 +50 +236 +32 +57 +237 +39 +66 +238 +41 +71 +237 +39 +74 +239 +41 +77 +253 +53 +92 +255 +70 +104 +255 +96 +115 +254 +94 +106 +247 +85 +98 +242 +80 +93 +242 +80 +93 +240 +75 +89 +227 +62 +76 +210 +48 +59 +218 +61 +70 +205 +54 +59 +187 +47 +46 +175 +46 +40 +168 +52 +39 +162 +59 +40 +155 +63 +38 +157 +61 +37 +170 +57 +39 +178 +56 +43 +210 +86 +74 +187 +59 +50 +196 +63 +56 +190 +52 +49 +189 +50 +47 +206 +67 +64 +229 +87 +83 +213 +72 +65 +200 +57 +49 +196 +54 +42 +197 +54 +40 +196 +53 +37 +198 +53 +36 +195 +58 +40 +177 +60 +40 +167 +58 +38 +168 +55 +37 +173 +57 +42 +172 +52 +38 +175 +49 +37 +194 +63 +53 +219 +82 +74 +217 +73 +65 +225 +72 +66 +222 +59 +54 +222 +50 +46 +234 +52 +49 +237 +49 +47 +239 +45 +43 +252 +50 +50 +254 +44 +47 +253 +43 +46 +249 +43 +45 +243 +43 +43 +237 +45 +42 +230 +49 +42 +223 +52 +44 +214 +56 +44 +209 +61 +49 +191 +50 +40 +188 +55 +46 +200 +73 +66 +217 +92 +88 +243 +119 +119 +255 +137 +139 +255 +134 +138 +253 +126 +133 +255 +125 +133 +252 +125 +134 +253 +119 +130 +252 +107 +122 +249 +96 +114 +249 +87 +108 +249 +83 +105 +234 +68 +92 +240 +71 +94 +236 +59 +85 +228 +65 +86 +215 +81 +90 +162 +73 +67 +102 +70 +45 +88 +93 +53 +90 +109 +63 +98 +125 +74 +116 +140 +92 +128 +150 +103 +135 +152 +108 +136 +155 +110 +138 +160 +114 +139 +165 +118 +140 +172 +122 +134 +171 +119 +129 +170 +114 +126 +167 +109 +124 +165 +105 +125 +165 +103 +129 +165 +103 +131 +165 +105 +131 +164 +107 +133 +166 +109 +132 +170 +109 +130 +172 +108 +128 +173 +104 +128 +175 +105 +129 +179 +106 +132 +182 +111 +137 +182 +115 +136 +176 +114 +140 +173 +120 +153 +176 +132 +172 +188 +152 +189 +198 +169 +201 +203 +181 +203 +205 +194 +182 +191 +196 +159 +171 +183 +140 +152 +164 +93 +75 +55 +92 +75 +55 +93 +75 +55 +92 +75 +55 +93 +75 +55 +92 +75 +55 +93 +75 +55 +92 +75 +55 +94 +76 +56 +93 +76 +56 +94 +76 +56 +93 +76 +56 +94 +76 +56 +93 +76 +56 +94 +76 +56 +93 +76 +58 +93 +74 +60 +93 +75 +61 +94 +76 +62 +92 +76 +60 +92 +76 +60 +91 +78 +61 +93 +80 +63 +94 +83 +65 +96 +83 +66 +95 +82 +63 +96 +80 +64 +98 +81 +65 +99 +82 +66 +100 +81 +66 +100 +78 +65 +100 +76 +66 +107 +75 +76 +104 +75 +80 +101 +79 +91 +102 +91 +108 +110 +107 +134 +120 +123 +156 +129 +133 +170 +137 +137 +173 +143 +132 +166 +165 +136 +166 +190 +136 +159 +208 +130 +144 +225 +121 +128 +240 +114 +115 +249 +106 +102 +255 +97 +96 +244 +77 +87 +237 +65 +79 +231 +61 +74 +233 +66 +76 +235 +69 +79 +231 +65 +75 +228 +61 +69 +229 +62 +70 +226 +59 +66 +224 +59 +63 +221 +58 +61 +217 +59 +58 +212 +60 +57 +204 +59 +54 +196 +58 +48 +185 +57 +44 +167 +54 +38 +175 +65 +48 +173 +60 +44 +172 +54 +40 +191 +65 +53 +204 +70 +61 +204 +61 +53 +208 +55 +50 +218 +56 +53 +220 +55 +49 +222 +53 +46 +222 +54 +45 +222 +56 +42 +221 +60 +42 +215 +58 +39 +211 +54 +37 +217 +59 +48 +240 +83 +76 +242 +90 +79 +217 +69 +57 +199 +56 +42 +205 +62 +46 +212 +66 +51 +210 +58 +45 +211 +50 +42 +240 +71 +66 +225 +47 +47 +239 +54 +59 +244 +55 +62 +239 +45 +56 +255 +66 +77 +240 +40 +51 +250 +38 +50 +255 +41 +50 +255 +41 +50 +249 +29 +39 +253 +34 +42 +255 +39 +47 +254 +39 +47 +240 +29 +38 +238 +31 +41 +248 +44 +55 +233 +33 +46 +235 +38 +55 +240 +44 +64 +227 +33 +57 +255 +86 +112 +229 +43 +66 +255 +92 +108 +255 +94 +105 +255 +89 +99 +251 +84 +92 +246 +79 +87 +236 +71 +77 +222 +62 +64 +208 +54 +52 +204 +61 +55 +197 +64 +55 +184 +62 +49 +167 +54 +38 +156 +49 +33 +154 +53 +35 +157 +58 +39 +160 +59 +41 +167 +56 +45 +174 +55 +47 +194 +69 +63 +191 +59 +55 +189 +51 +49 +196 +54 +52 +197 +53 +52 +212 +68 +67 +219 +76 +72 +218 +75 +69 +209 +68 +59 +200 +58 +48 +196 +52 +41 +199 +53 +40 +203 +52 +41 +197 +53 +42 +188 +60 +47 +179 +57 +44 +173 +47 +35 +171 +40 +30 +179 +45 +36 +195 +57 +47 +210 +67 +59 +216 +72 +63 +228 +80 +70 +223 +69 +61 +218 +55 +48 +221 +48 +42 +231 +48 +44 +242 +50 +49 +249 +49 +51 +253 +49 +52 +247 +47 +49 +246 +48 +49 +246 +48 +49 +243 +48 +46 +242 +48 +46 +237 +50 +45 +230 +53 +45 +221 +57 +47 +213 +61 +48 +190 +50 +37 +192 +62 +49 +185 +61 +51 +214 +95 +89 +233 +115 +113 +255 +143 +143 +251 +132 +134 +255 +135 +140 +255 +132 +141 +255 +120 +135 +253 +104 +123 +252 +95 +116 +254 +92 +115 +250 +86 +110 +243 +77 +101 +242 +72 +99 +235 +60 +89 +237 +62 +91 +224 +66 +89 +216 +94 +105 +141 +63 +59 +92 +67 +45 +83 +91 +54 +92 +116 +66 +103 +134 +77 +119 +150 +93 +125 +156 +99 +127 +157 +103 +128 +161 +106 +131 +166 +110 +130 +168 +111 +128 +167 +110 +127 +166 +109 +126 +165 +108 +125 +165 +105 +124 +164 +104 +125 +163 +102 +127 +163 +101 +127 +163 +102 +127 +165 +108 +127 +166 +109 +129 +171 +108 +127 +172 +107 +126 +173 +103 +127 +174 +102 +129 +177 +103 +131 +179 +105 +135 +181 +109 +139 +180 +114 +139 +177 +118 +142 +174 +124 +153 +180 +137 +167 +189 +153 +175 +194 +164 +178 +193 +174 +163 +175 +173 +141 +152 +158 +124 +135 +141 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +93 +75 +55 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +76 +56 +94 +75 +58 +92 +75 +59 +94 +76 +62 +95 +77 +63 +94 +78 +62 +91 +78 +61 +91 +78 +61 +92 +81 +63 +94 +82 +66 +95 +83 +67 +93 +81 +65 +93 +79 +66 +95 +79 +66 +96 +78 +68 +98 +80 +70 +99 +79 +72 +101 +77 +73 +105 +76 +78 +103 +78 +84 +101 +83 +97 +103 +95 +116 +110 +111 +142 +121 +126 +166 +128 +136 +183 +135 +139 +187 +158 +150 +199 +163 +140 +182 +171 +127 +160 +185 +120 +142 +211 +121 +133 +234 +124 +125 +244 +117 +111 +244 +105 +100 +245 +94 +99 +238 +81 +90 +233 +71 +82 +238 +74 +83 +243 +76 +86 +242 +71 +80 +238 +64 +74 +234 +60 +69 +228 +57 +63 +224 +58 +60 +220 +57 +58 +215 +60 +56 +210 +61 +55 +203 +60 +52 +196 +58 +47 +186 +59 +44 +171 +60 +43 +170 +63 +45 +169 +56 +40 +178 +58 +44 +193 +65 +54 +197 +60 +52 +199 +54 +49 +212 +60 +55 +210 +53 +48 +214 +53 +45 +215 +53 +42 +216 +52 +40 +217 +56 +38 +219 +58 +38 +219 +59 +37 +218 +57 +39 +221 +54 +46 +230 +65 +59 +235 +77 +68 +225 +73 +60 +208 +62 +47 +199 +56 +40 +202 +56 +41 +211 +59 +46 +221 +58 +51 +245 +73 +69 +228 +48 +49 +241 +55 +60 +246 +54 +65 +241 +46 +60 +255 +63 +77 +237 +37 +50 +243 +36 +44 +247 +37 +40 +251 +41 +44 +253 +43 +44 +252 +42 +43 +248 +40 +40 +246 +40 +40 +247 +43 +44 +239 +36 +39 +237 +37 +40 +234 +37 +44 +253 +59 +68 +216 +26 +38 +238 +50 +65 +250 +63 +80 +213 +35 +51 +255 +104 +117 +255 +97 +106 +255 +90 +97 +253 +86 +93 +247 +78 +83 +231 +65 +67 +218 +59 +56 +210 +61 +54 +193 +55 +44 +194 +66 +53 +188 +71 +54 +172 +61 +44 +154 +47 +31 +147 +39 +26 +146 +38 +25 +147 +39 +27 +158 +45 +37 +176 +58 +54 +209 +84 +80 +206 +72 +71 +195 +53 +52 +198 +52 +53 +209 +61 +61 +235 +87 +85 +216 +71 +66 +214 +71 +63 +208 +65 +57 +199 +57 +47 +198 +51 +41 +202 +54 +44 +208 +55 +47 +206 +55 +48 +199 +61 +51 +194 +57 +49 +194 +53 +46 +195 +50 +45 +201 +52 +46 +209 +56 +51 +216 +63 +57 +222 +69 +61 +228 +74 +64 +222 +65 +56 +218 +54 +45 +221 +48 +42 +231 +48 +44 +242 +50 +49 +251 +48 +51 +251 +48 +51 +244 +48 +50 +243 +49 +50 +244 +48 +49 +243 +47 +48 +243 +48 +46 +238 +49 +45 +231 +52 +45 +223 +57 +45 +215 +61 +49 +191 +51 +36 +190 +60 +47 +183 +61 +50 +211 +94 +87 +233 +118 +115 +255 +144 +144 +249 +133 +136 +253 +134 +140 +255 +128 +138 +255 +115 +132 +255 +100 +121 +255 +92 +116 +255 +89 +114 +252 +84 +110 +246 +76 +103 +243 +68 +97 +236 +61 +90 +236 +66 +95 +223 +74 +96 +194 +83 +92 +128 +61 +55 +88 +67 +46 +82 +92 +57 +91 +118 +67 +101 +135 +75 +115 +149 +89 +120 +156 +95 +119 +157 +98 +123 +161 +102 +125 +165 +105 +125 +166 +106 +124 +165 +105 +124 +165 +105 +124 +164 +104 +123 +163 +101 +123 +161 +100 +123 +161 +100 +125 +161 +99 +126 +162 +101 +124 +163 +106 +125 +166 +108 +125 +169 +108 +125 +170 +105 +124 +171 +101 +125 +173 +99 +127 +175 +99 +130 +177 +99 +133 +176 +104 +135 +178 +107 +136 +175 +112 +136 +171 +115 +139 +171 +124 +144 +172 +132 +144 +170 +135 +140 +162 +139 +118 +133 +126 +99 +111 +111 +83 +95 +95 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +93 +76 +56 +94 +75 +58 +95 +78 +62 +97 +80 +64 +96 +80 +64 +93 +80 +63 +92 +79 +62 +91 +79 +63 +91 +82 +67 +91 +81 +69 +91 +81 +71 +92 +79 +71 +92 +79 +73 +95 +80 +77 +99 +81 +79 +102 +84 +84 +103 +84 +86 +103 +84 +88 +103 +86 +96 +104 +92 +112 +108 +105 +134 +115 +118 +161 +124 +131 +185 +130 +138 +201 +138 +142 +206 +152 +146 +210 +160 +139 +196 +170 +131 +178 +185 +125 +159 +207 +128 +147 +228 +131 +138 +238 +126 +122 +242 +115 +109 +248 +102 +105 +242 +85 +92 +234 +73 +81 +237 +72 +79 +243 +73 +82 +245 +71 +81 +242 +65 +75 +238 +61 +69 +228 +55 +61 +224 +55 +58 +219 +56 +57 +213 +60 +55 +207 +63 +55 +201 +63 +52 +193 +61 +48 +184 +61 +45 +174 +61 +45 +170 +60 +43 +171 +58 +44 +184 +66 +54 +199 +72 +63 +192 +59 +50 +187 +48 +41 +202 +58 +50 +205 +54 +47 +208 +54 +46 +213 +55 +44 +216 +56 +44 +217 +55 +40 +217 +56 +38 +220 +57 +38 +224 +58 +42 +221 +52 +45 +219 +52 +46 +226 +65 +57 +233 +79 +67 +222 +72 +58 +200 +53 +37 +200 +50 +35 +217 +64 +50 +226 +62 +53 +245 +72 +68 +231 +48 +50 +242 +53 +59 +248 +54 +63 +245 +49 +61 +255 +66 +80 +244 +46 +59 +240 +41 +48 +235 +35 +38 +236 +36 +39 +249 +49 +51 +245 +45 +47 +239 +39 +39 +236 +38 +37 +245 +49 +50 +234 +40 +41 +245 +55 +57 +231 +42 +48 +225 +40 +48 +234 +50 +60 +255 +81 +93 +237 +59 +73 +255 +89 +101 +255 +94 +102 +242 +85 +92 +239 +78 +84 +241 +76 +82 +235 +69 +73 +222 +58 +59 +214 +55 +52 +214 +62 +57 +194 +53 +44 +194 +62 +50 +189 +65 +53 +181 +60 +49 +173 +55 +45 +168 +49 +41 +162 +43 +35 +157 +38 +32 +155 +36 +30 +169 +47 +42 +199 +69 +67 +194 +58 +58 +188 +44 +44 +200 +51 +53 +215 +65 +66 +244 +94 +93 +208 +63 +58 +210 +67 +59 +208 +65 +57 +203 +61 +51 +204 +57 +47 +212 +61 +52 +218 +64 +56 +219 +64 +59 +219 +64 +60 +216 +61 +59 +221 +62 +59 +227 +65 +63 +228 +62 +62 +224 +58 +58 +227 +63 +61 +235 +73 +68 +224 +66 +57 +221 +60 +52 +217 +53 +44 +221 +50 +43 +231 +49 +45 +240 +51 +49 +245 +49 +50 +248 +48 +50 +244 +48 +50 +244 +48 +50 +244 +48 +49 +243 +47 +48 +243 +48 +46 +238 +49 +45 +231 +52 +45 +223 +57 +45 +216 +62 +50 +192 +52 +37 +186 +56 +43 +181 +59 +48 +208 +91 +84 +237 +122 +119 +255 +147 +146 +251 +135 +138 +253 +129 +137 +255 +124 +137 +255 +113 +129 +253 +100 +120 +254 +90 +114 +255 +85 +111 +252 +79 +107 +250 +73 +102 +244 +65 +95 +238 +63 +92 +234 +71 +98 +223 +84 +103 +165 +64 +72 +117 +56 +51 +88 +70 +50 +85 +95 +60 +95 +119 +69 +102 +135 +78 +114 +147 +90 +117 +152 +94 +116 +154 +95 +120 +158 +99 +123 +163 +103 +123 +163 +103 +121 +162 +102 +121 +162 +102 +121 +161 +99 +120 +160 +98 +121 +159 +98 +121 +160 +97 +124 +160 +98 +122 +160 +99 +122 +162 +102 +123 +164 +104 +123 +167 +104 +123 +168 +101 +123 +169 +97 +123 +169 +96 +125 +171 +96 +127 +174 +96 +135 +178 +106 +138 +181 +110 +139 +178 +115 +137 +172 +116 +134 +166 +119 +130 +158 +117 +121 +147 +110 +111 +134 +108 +81 +99 +87 +64 +79 +76 +50 +65 +62 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +77 +57 +94 +76 +56 +96 +78 +58 +97 +80 +60 +96 +81 +62 +93 +80 +63 +90 +78 +62 +89 +79 +67 +88 +80 +69 +88 +79 +72 +91 +81 +79 +95 +85 +84 +98 +88 +89 +101 +88 +95 +105 +89 +99 +108 +92 +102 +107 +94 +104 +108 +96 +108 +108 +99 +116 +111 +107 +134 +114 +116 +155 +121 +126 +181 +127 +135 +200 +133 +141 +214 +140 +143 +220 +142 +135 +212 +159 +139 +208 +173 +138 +194 +179 +129 +167 +189 +121 +144 +204 +123 +130 +222 +129 +124 +241 +130 +123 +254 +116 +116 +253 +100 +103 +244 +88 +92 +242 +79 +84 +242 +73 +80 +242 +68 +77 +240 +63 +71 +239 +60 +66 +229 +54 +59 +225 +55 +56 +219 +57 +55 +213 +60 +55 +206 +64 +54 +198 +64 +52 +191 +64 +49 +184 +63 +46 +173 +57 +42 +173 +62 +45 +177 +61 +48 +188 +70 +58 +204 +82 +71 +199 +72 +63 +186 +53 +46 +186 +49 +41 +200 +57 +49 +205 +56 +49 +211 +59 +48 +217 +61 +49 +219 +59 +45 +217 +54 +39 +220 +54 +38 +224 +56 +43 +224 +53 +45 +219 +50 +43 +224 +61 +52 +236 +78 +66 +227 +75 +61 +210 +58 +44 +209 +56 +42 +224 +66 +54 +222 +54 +45 +240 +62 +58 +233 +47 +48 +239 +48 +53 +245 +50 +58 +248 +52 +62 +255 +74 +86 +255 +70 +79 +253 +62 +69 +242 +51 +56 +226 +36 +38 +237 +47 +49 +234 +44 +44 +240 +50 +50 +232 +42 +42 +235 +47 +46 +241 +57 +57 +209 +26 +28 +229 +50 +54 +220 +43 +49 +231 +56 +63 +239 +68 +76 +255 +87 +98 +241 +75 +85 +217 +60 +67 +219 +64 +68 +225 +66 +70 +225 +62 +65 +222 +57 +61 +220 +56 +57 +218 +55 +56 +212 +57 +55 +201 +56 +51 +195 +56 +49 +190 +57 +50 +193 +64 +58 +206 +77 +72 +215 +85 +83 +210 +77 +78 +196 +66 +64 +178 +55 +50 +182 +57 +53 +207 +75 +73 +217 +77 +76 +227 +81 +82 +239 +89 +90 +234 +82 +81 +241 +89 +86 +201 +53 +49 +206 +62 +54 +210 +66 +57 +208 +64 +55 +211 +63 +53 +217 +66 +57 +224 +67 +60 +226 +64 +59 +233 +63 +64 +231 +56 +61 +236 +57 +61 +242 +63 +67 +239 +58 +63 +232 +53 +56 +236 +62 +61 +246 +77 +74 +222 +57 +51 +219 +54 +48 +218 +51 +43 +222 +51 +44 +229 +52 +46 +236 +51 +48 +242 +50 +49 +244 +48 +49 +244 +48 +50 +246 +47 +50 +246 +48 +49 +245 +47 +48 +245 +47 +46 +240 +48 +45 +233 +52 +45 +224 +56 +45 +217 +63 +51 +194 +54 +39 +183 +53 +40 +179 +57 +46 +203 +86 +79 +239 +124 +121 +255 +147 +146 +254 +135 +139 +255 +128 +137 +255 +121 +135 +252 +110 +126 +250 +99 +118 +250 +88 +111 +252 +80 +106 +251 +72 +102 +250 +67 +98 +242 +61 +92 +239 +66 +94 +229 +77 +100 +215 +90 +104 +136 +50 +53 +107 +57 +48 +92 +77 +56 +91 +101 +67 +99 +123 +75 +106 +137 +80 +115 +146 +89 +116 +149 +92 +117 +152 +94 +119 +157 +98 +121 +161 +101 +122 +162 +102 +119 +160 +100 +118 +160 +97 +119 +159 +97 +118 +158 +96 +120 +159 +96 +120 +159 +96 +123 +159 +97 +122 +160 +99 +122 +162 +102 +122 +163 +103 +122 +167 +102 +122 +167 +98 +122 +168 +96 +122 +168 +93 +124 +171 +93 +126 +173 +95 +134 +178 +103 +139 +180 +110 +140 +179 +116 +138 +173 +115 +134 +166 +117 +128 +157 +113 +116 +142 +105 +105 +128 +100 +80 +98 +84 +67 +82 +75 +56 +71 +64 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +59 +94 +77 +57 +93 +75 +53 +95 +77 +53 +96 +80 +57 +95 +80 +59 +92 +79 +62 +90 +78 +64 +88 +79 +70 +88 +81 +75 +89 +80 +81 +96 +87 +92 +103 +96 +104 +110 +102 +115 +115 +104 +121 +115 +103 +123 +115 +103 +125 +113 +103 +127 +111 +108 +129 +112 +112 +138 +114 +118 +153 +118 +124 +172 +122 +130 +193 +127 +135 +208 +132 +139 +220 +138 +140 +225 +147 +142 +224 +157 +141 +214 +160 +132 +190 +158 +117 +159 +160 +108 +130 +172 +110 +115 +188 +117 +111 +210 +118 +107 +240 +115 +109 +253 +109 +108 +254 +104 +105 +251 +95 +96 +249 +83 +87 +244 +71 +77 +237 +60 +66 +234 +55 +61 +232 +53 +59 +227 +54 +56 +221 +57 +56 +215 +60 +55 +208 +64 +55 +199 +65 +53 +192 +65 +48 +185 +64 +47 +173 +55 +41 +180 +64 +51 +175 +58 +48 +176 +59 +49 +200 +82 +72 +213 +92 +81 +201 +77 +67 +187 +59 +48 +190 +57 +48 +193 +55 +45 +204 +57 +47 +214 +62 +51 +219 +61 +49 +218 +54 +42 +220 +52 +39 +226 +54 +42 +224 +51 +44 +226 +55 +48 +228 +61 +53 +229 +69 +57 +226 +70 +57 +222 +66 +51 +222 +65 +50 +226 +62 +50 +219 +48 +38 +234 +55 +50 +236 +48 +47 +238 +45 +48 +239 +44 +50 +246 +51 +59 +255 +76 +84 +255 +87 +94 +255 +90 +95 +255 +79 +83 +225 +46 +49 +227 +48 +51 +224 +44 +45 +247 +69 +69 +232 +54 +54 +220 +44 +44 +218 +44 +45 +234 +61 +63 +219 +49 +52 +216 +50 +54 +255 +98 +104 +224 +61 +66 +202 +41 +49 +202 +45 +52 +193 +38 +42 +213 +59 +61 +224 +65 +69 +218 +55 +58 +217 +51 +55 +223 +57 +61 +220 +55 +59 +205 +47 +48 +204 +52 +51 +205 +59 +59 +211 +71 +70 +221 +83 +83 +235 +96 +99 +245 +105 +108 +244 +101 +107 +234 +94 +97 +196 +64 +62 +198 +69 +64 +229 +94 +91 +248 +104 +103 +255 +111 +112 +255 +106 +106 +229 +75 +75 +215 +61 +59 +201 +52 +48 +209 +62 +55 +215 +68 +60 +214 +67 +59 +213 +62 +53 +213 +60 +52 +216 +58 +49 +220 +52 +49 +238 +53 +59 +241 +45 +55 +240 +44 +54 +242 +46 +56 +239 +44 +52 +235 +44 +51 +243 +57 +60 +254 +74 +75 +223 +51 +47 +220 +51 +46 +218 +51 +43 +220 +51 +44 +227 +53 +46 +234 +52 +48 +239 +52 +47 +242 +50 +49 +244 +48 +50 +246 +47 +50 +247 +47 +49 +246 +46 +48 +245 +47 +46 +240 +48 +45 +234 +51 +45 +226 +55 +45 +217 +63 +51 +198 +56 +42 +180 +50 +37 +178 +56 +45 +195 +78 +71 +239 +124 +121 +255 +146 +145 +255 +135 +140 +255 +126 +137 +255 +117 +132 +249 +108 +124 +246 +97 +116 +245 +85 +109 +247 +74 +102 +249 +64 +96 +249 +59 +93 +243 +58 +92 +237 +68 +97 +219 +80 +101 +193 +87 +97 +114 +46 +43 +98 +62 +48 +96 +84 +62 +99 +106 +73 +102 +124 +77 +107 +137 +83 +116 +146 +92 +117 +150 +95 +118 +153 +95 +120 +158 +99 +121 +161 +99 +120 +160 +98 +117 +159 +96 +117 +159 +96 +117 +157 +95 +118 +158 +95 +119 +158 +95 +120 +159 +96 +123 +159 +97 +122 +161 +98 +122 +162 +100 +123 +165 +101 +124 +166 +100 +124 +167 +96 +121 +167 +94 +121 +168 +90 +123 +170 +92 +125 +172 +94 +128 +172 +97 +133 +175 +103 +135 +174 +109 +135 +170 +112 +133 +165 +115 +131 +160 +114 +123 +149 +110 +114 +138 +106 +100 +119 +100 +91 +107 +94 +81 +97 +84 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +60 +95 +78 +58 +94 +76 +52 +95 +78 +52 +96 +78 +56 +94 +79 +58 +91 +78 +62 +89 +79 +69 +90 +83 +77 +90 +84 +84 +95 +90 +97 +104 +98 +112 +114 +109 +129 +122 +117 +140 +123 +117 +145 +123 +113 +147 +122 +112 +147 +118 +112 +148 +113 +116 +149 +114 +119 +157 +116 +124 +170 +119 +128 +183 +122 +131 +196 +126 +134 +207 +132 +138 +216 +139 +141 +218 +150 +144 +218 +153 +139 +201 +155 +133 +180 +162 +131 +162 +170 +132 +145 +171 +126 +123 +159 +107 +93 +153 +82 +64 +186 +78 +66 +210 +82 +73 +225 +88 +82 +233 +88 +85 +239 +84 +82 +241 +75 +77 +236 +63 +67 +229 +52 +58 +235 +56 +60 +231 +57 +59 +226 +58 +57 +218 +61 +56 +211 +64 +56 +203 +65 +54 +195 +63 +48 +188 +62 +47 +179 +57 +44 +186 +65 +54 +171 +53 +43 +163 +46 +36 +190 +73 +63 +217 +103 +92 +217 +100 +90 +203 +85 +73 +184 +60 +50 +184 +54 +41 +192 +51 +41 +206 +58 +48 +217 +59 +48 +218 +54 +44 +222 +51 +41 +228 +54 +45 +223 +49 +42 +228 +55 +49 +227 +59 +50 +221 +57 +47 +222 +62 +48 +227 +70 +53 +228 +66 +51 +223 +57 +43 +222 +48 +39 +233 +52 +45 +240 +51 +49 +239 +45 +46 +236 +41 +45 +242 +47 +53 +255 +66 +71 +255 +82 +87 +255 +93 +98 +255 +92 +97 +226 +57 +60 +227 +57 +60 +213 +43 +44 +244 +74 +75 +226 +56 +57 +215 +47 +47 +217 +51 +53 +203 +39 +40 +202 +37 +41 +247 +87 +89 +220 +61 +65 +213 +57 +61 +209 +54 +58 +186 +31 +35 +196 +40 +43 +219 +61 +62 +229 +66 +69 +219 +53 +57 +215 +44 +50 +220 +49 +55 +217 +48 +53 +204 +41 +46 +208 +52 +55 +226 +76 +78 +244 +98 +101 +250 +105 +110 +247 +100 +108 +246 +96 +105 +248 +96 +108 +248 +98 +107 +214 +76 +76 +213 +78 +74 +234 +92 +90 +234 +86 +84 +231 +77 +77 +227 +72 +70 +207 +52 +50 +206 +51 +47 +217 +65 +60 +224 +75 +68 +228 +79 +72 +223 +74 +67 +217 +64 +56 +215 +58 +51 +215 +54 +46 +220 +46 +45 +245 +50 +58 +251 +45 +58 +248 +42 +55 +245 +39 +52 +245 +41 +52 +248 +48 +58 +255 +62 +67 +255 +74 +74 +224 +49 +46 +222 +51 +44 +220 +51 +44 +221 +53 +44 +225 +52 +45 +231 +52 +47 +237 +52 +47 +240 +51 +47 +244 +48 +50 +247 +47 +50 +249 +46 +49 +248 +45 +48 +246 +46 +46 +241 +47 +45 +235 +50 +45 +226 +55 +45 +217 +61 +49 +201 +59 +45 +179 +49 +36 +177 +55 +44 +186 +67 +61 +236 +121 +118 +255 +141 +141 +255 +136 +141 +255 +123 +135 +255 +113 +129 +246 +104 +120 +243 +96 +114 +243 +83 +107 +244 +69 +98 +249 +58 +92 +249 +55 +90 +243 +58 +92 +235 +72 +99 +205 +80 +96 +160 +74 +77 +102 +52 +43 +89 +66 +48 +95 +87 +64 +99 +106 +73 +102 +124 +78 +107 +136 +82 +116 +145 +91 +119 +149 +95 +120 +153 +96 +123 +158 +100 +122 +160 +99 +118 +158 +96 +115 +155 +93 +114 +156 +92 +115 +155 +92 +116 +156 +93 +118 +157 +94 +119 +158 +95 +123 +159 +97 +122 +161 +98 +121 +161 +98 +122 +164 +98 +124 +167 +98 +123 +166 +95 +120 +166 +91 +120 +167 +89 +122 +169 +89 +123 +170 +90 +126 +170 +95 +131 +173 +101 +133 +172 +107 +135 +169 +109 +137 +167 +115 +137 +165 +117 +132 +157 +115 +124 +148 +114 +117 +137 +112 +111 +128 +109 +103 +120 +102 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +95 +78 +58 +97 +80 +54 +97 +80 +54 +97 +79 +57 +94 +79 +60 +91 +79 +65 +91 +82 +75 +92 +86 +86 +95 +90 +97 +107 +103 +118 +115 +111 +134 +125 +122 +151 +130 +126 +161 +129 +124 +165 +125 +119 +163 +123 +117 +165 +120 +118 +167 +115 +121 +171 +115 +125 +178 +120 +129 +184 +123 +132 +191 +126 +134 +196 +132 +138 +200 +141 +142 +206 +148 +147 +205 +154 +147 +198 +160 +150 +187 +171 +156 +179 +188 +167 +176 +201 +173 +169 +197 +166 +148 +170 +136 +109 +154 +103 +76 +155 +70 +50 +173 +65 +52 +181 +65 +52 +194 +66 +57 +214 +72 +68 +232 +78 +78 +238 +74 +75 +236 +63 +67 +235 +61 +63 +233 +59 +61 +229 +59 +59 +224 +60 +58 +217 +64 +56 +210 +63 +53 +202 +62 +49 +194 +60 +48 +189 +58 +48 +190 +63 +54 +175 +52 +44 +167 +49 +39 +187 +73 +63 +209 +99 +86 +214 +104 +91 +213 +101 +87 +195 +79 +66 +186 +62 +50 +186 +52 +41 +199 +55 +44 +214 +57 +48 +217 +53 +44 +223 +50 +43 +231 +54 +48 +226 +48 +44 +227 +52 +47 +226 +55 +47 +222 +55 +46 +224 +62 +49 +229 +67 +52 +228 +62 +48 +222 +52 +37 +229 +51 +41 +232 +47 +42 +240 +51 +47 +240 +46 +46 +239 +45 +46 +241 +48 +51 +242 +54 +55 +244 +64 +67 +246 +77 +82 +252 +89 +94 +233 +70 +75 +246 +81 +87 +216 +51 +55 +235 +70 +74 +221 +56 +60 +230 +65 +69 +216 +53 +56 +204 +44 +46 +207 +46 +51 +226 +70 +73 +210 +55 +59 +208 +55 +58 +185 +35 +37 +213 +59 +61 +217 +57 +59 +226 +60 +62 +232 +62 +65 +230 +55 +60 +223 +46 +54 +219 +42 +50 +224 +50 +59 +228 +61 +68 +238 +77 +83 +250 +95 +101 +255 +109 +115 +255 +106 +115 +248 +97 +106 +245 +91 +103 +246 +90 +104 +246 +92 +102 +244 +100 +100 +232 +90 +86 +232 +87 +84 +216 +64 +61 +207 +49 +48 +212 +52 +52 +211 +51 +51 +225 +67 +64 +227 +74 +69 +233 +82 +75 +234 +83 +76 +225 +74 +65 +217 +63 +55 +216 +57 +51 +219 +56 +49 +227 +51 +51 +243 +46 +55 +255 +48 +62 +255 +48 +61 +250 +42 +55 +252 +46 +58 +255 +59 +69 +255 +67 +72 +251 +65 +66 +227 +49 +47 +223 +52 +45 +221 +52 +45 +221 +53 +44 +226 +52 +45 +230 +51 +44 +237 +52 +47 +241 +52 +48 +244 +48 +50 +247 +47 +50 +249 +46 +49 +248 +45 +48 +246 +46 +46 +241 +47 +45 +235 +50 +45 +227 +55 +45 +216 +58 +47 +205 +62 +48 +181 +49 +37 +177 +55 +44 +178 +59 +53 +233 +115 +113 +255 +138 +138 +255 +135 +141 +255 +116 +132 +253 +104 +124 +243 +97 +116 +241 +92 +112 +244 +82 +106 +245 +68 +97 +251 +55 +93 +252 +56 +94 +245 +61 +95 +232 +78 +102 +188 +81 +91 +125 +57 +54 +94 +60 +48 +81 +68 +49 +91 +86 +64 +93 +100 +69 +101 +119 +77 +106 +133 +82 +114 +142 +91 +118 +148 +94 +121 +154 +97 +123 +158 +100 +120 +158 +97 +115 +155 +93 +112 +152 +89 +112 +153 +87 +113 +154 +88 +113 +154 +88 +116 +155 +92 +117 +156 +93 +121 +157 +95 +120 +159 +96 +120 +161 +95 +121 +162 +94 +122 +165 +94 +121 +164 +92 +120 +164 +89 +120 +164 +87 +121 +165 +86 +123 +167 +88 +127 +169 +95 +130 +172 +100 +132 +171 +104 +134 +168 +108 +135 +165 +111 +134 +162 +113 +128 +154 +109 +120 +145 +106 +112 +132 +104 +108 +128 +101 +101 +121 +96 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +95 +80 +61 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +94 +79 +60 +95 +78 +58 +99 +81 +57 +99 +81 +57 +97 +80 +60 +93 +80 +64 +90 +80 +71 +92 +84 +82 +95 +90 +97 +97 +95 +109 +116 +114 +138 +121 +120 +152 +129 +128 +168 +131 +129 +176 +126 +126 +176 +121 +121 +175 +121 +117 +176 +119 +119 +181 +119 +124 +190 +120 +127 +195 +125 +133 +196 +130 +136 +196 +133 +138 +193 +141 +143 +191 +151 +150 +190 +160 +157 +188 +172 +167 +187 +182 +172 +180 +190 +179 +175 +200 +184 +169 +208 +190 +166 +214 +193 +162 +209 +187 +150 +208 +172 +136 +175 +111 +84 +174 +92 +71 +164 +71 +53 +168 +62 +48 +194 +71 +63 +224 +87 +81 +239 +87 +86 +241 +78 +79 +233 +64 +67 +234 +61 +63 +230 +60 +61 +226 +61 +59 +223 +61 +58 +215 +61 +53 +207 +59 +49 +201 +57 +48 +193 +56 +48 +193 +60 +53 +185 +58 +51 +184 +61 +53 +193 +79 +69 +199 +88 +77 +199 +93 +79 +209 +101 +88 +211 +99 +85 +194 +76 +62 +188 +58 +45 +197 +56 +46 +210 +57 +49 +215 +52 +45 +223 +50 +44 +231 +54 +48 +230 +52 +48 +225 +50 +45 +224 +53 +46 +227 +60 +51 +231 +67 +55 +230 +67 +52 +226 +58 +45 +223 +51 +37 +233 +52 +43 +229 +45 +37 +240 +48 +45 +240 +48 +45 +241 +52 +50 +242 +54 +53 +232 +46 +47 +226 +50 +52 +231 +66 +70 +247 +88 +93 +246 +87 +92 +255 +111 +117 +229 +68 +74 +235 +72 +77 +224 +60 +67 +254 +91 +96 +255 +109 +115 +220 +59 +64 +255 +123 +128 +255 +108 +112 +234 +81 +84 +211 +61 +63 +198 +48 +50 +215 +59 +62 +241 +72 +75 +235 +59 +62 +237 +56 +63 +246 +62 +70 +240 +56 +66 +230 +46 +56 +241 +64 +74 +255 +95 +103 +255 +110 +119 +255 +107 +114 +254 +100 +110 +245 +94 +103 +247 +95 +107 +253 +99 +111 +253 +95 +110 +246 +90 +101 +241 +93 +93 +227 +80 +73 +226 +74 +71 +213 +55 +52 +210 +47 +48 +217 +53 +52 +210 +48 +46 +216 +57 +53 +223 +68 +63 +227 +74 +68 +226 +73 +65 +217 +64 +56 +211 +54 +47 +214 +52 +47 +220 +55 +49 +232 +54 +54 +234 +39 +47 +252 +48 +60 +254 +50 +61 +247 +43 +54 +249 +48 +58 +255 +62 +69 +253 +63 +65 +236 +52 +52 +226 +51 +46 +224 +53 +46 +222 +54 +45 +223 +52 +44 +225 +51 +42 +232 +51 +44 +239 +52 +47 +244 +52 +49 +246 +48 +49 +247 +47 +50 +249 +46 +49 +248 +45 +48 +248 +46 +46 +242 +47 +45 +235 +50 +45 +227 +55 +45 +215 +57 +46 +209 +63 +50 +182 +48 +37 +178 +54 +44 +176 +54 +49 +232 +112 +111 +255 +135 +136 +255 +134 +142 +255 +110 +128 +252 +99 +120 +241 +94 +113 +242 +90 +111 +245 +81 +106 +246 +67 +97 +253 +57 +95 +253 +59 +96 +242 +67 +98 +225 +84 +103 +174 +82 +87 +98 +48 +39 +89 +68 +51 +74 +69 +47 +85 +83 +60 +88 +93 +63 +99 +115 +76 +105 +129 +81 +113 +139 +91 +118 +146 +95 +122 +152 +98 +124 +157 +100 +120 +156 +95 +114 +153 +90 +110 +151 +85 +110 +151 +85 +110 +151 +85 +111 +152 +86 +114 +153 +90 +116 +155 +92 +119 +155 +93 +119 +158 +93 +119 +158 +91 +120 +161 +91 +121 +163 +91 +119 +163 +88 +118 +162 +87 +118 +162 +85 +119 +163 +84 +121 +165 +88 +122 +164 +90 +126 +166 +95 +129 +166 +99 +127 +161 +100 +126 +156 +102 +123 +151 +102 +114 +140 +93 +105 +130 +88 +95 +117 +81 +92 +113 +82 +86 +107 +76 +92 +76 +60 +94 +78 +62 +96 +80 +64 +96 +80 +64 +95 +79 +63 +95 +79 +63 +95 +79 +63 +97 +81 +65 +98 +82 +66 +95 +79 +63 +93 +77 +61 +93 +77 +61 +97 +81 +65 +99 +83 +67 +98 +82 +66 +96 +81 +62 +100 +83 +63 +97 +80 +62 +93 +80 +64 +94 +81 +73 +91 +81 +80 +90 +83 +90 +101 +97 +112 +115 +113 +137 +121 +120 +154 +122 +124 +165 +126 +128 +177 +128 +129 +185 +125 +127 +186 +120 +122 +183 +114 +115 +180 +108 +111 +182 +116 +119 +198 +118 +124 +202 +128 +131 +202 +139 +141 +198 +150 +151 +195 +164 +164 +190 +178 +176 +187 +188 +185 +180 +203 +197 +181 +211 +204 +176 +217 +207 +172 +219 +207 +165 +220 +207 +163 +221 +209 +161 +217 +203 +156 +217 +194 +152 +209 +168 +136 +184 +128 +103 +161 +93 +70 +203 +122 +103 +216 +116 +101 +189 +72 +63 +216 +81 +78 +247 +99 +99 +233 +75 +76 +229 +63 +65 +225 +57 +57 +227 +59 +58 +226 +58 +57 +219 +55 +53 +216 +54 +49 +214 +59 +54 +203 +56 +49 +192 +53 +46 +199 +66 +59 +187 +60 +51 +191 +73 +63 +198 +88 +75 +185 +79 +65 +206 +100 +86 +209 +99 +84 +204 +88 +73 +197 +71 +57 +196 +58 +47 +205 +54 +45 +216 +55 +47 +225 +54 +47 +227 +52 +47 +223 +48 +45 +223 +50 +44 +224 +55 +48 +228 +61 +52 +224 +60 +48 +221 +55 +41 +223 +53 +40 +229 +55 +44 +228 +47 +36 +234 +47 +38 +236 +47 +41 +238 +49 +45 +238 +50 +48 +235 +52 +48 +232 +53 +49 +226 +54 +52 +215 +55 +57 +230 +74 +78 +245 +89 +93 +237 +78 +83 +215 +56 +61 +215 +54 +60 +249 +88 +96 +255 +126 +132 +255 +120 +128 +255 +107 +113 +255 +99 +107 +255 +102 +109 +255 +101 +107 +245 +92 +97 +242 +89 +92 +252 +91 +96 +255 +87 +90 +255 +70 +75 +249 +58 +66 +248 +57 +65 +243 +51 +62 +235 +45 +57 +234 +50 +62 +238 +62 +72 +252 +85 +95 +255 +97 +105 +255 +104 +114 +254 +103 +112 +251 +100 +109 +254 +100 +110 +255 +97 +111 +251 +94 +103 +237 +83 +83 +223 +70 +64 +214 +56 +53 +214 +52 +49 +215 +49 +49 +215 +47 +46 +216 +51 +49 +219 +57 +52 +225 +68 +61 +220 +66 +58 +217 +63 +55 +214 +60 +52 +215 +57 +48 +219 +56 +49 +224 +57 +51 +230 +54 +54 +240 +55 +60 +243 +52 +59 +243 +52 +59 +246 +52 +60 +245 +54 +59 +242 +53 +57 +235 +51 +51 +227 +49 +47 +222 +51 +44 +222 +53 +46 +223 +55 +46 +224 +53 +43 +228 +51 +43 +233 +50 +44 +239 +50 +44 +245 +50 +48 +247 +49 +50 +248 +48 +51 +250 +47 +50 +249 +46 +49 +249 +47 +47 +243 +48 +46 +236 +51 +46 +229 +55 +46 +224 +63 +53 +204 +56 +44 +191 +54 +44 +175 +47 +38 +184 +59 +55 +210 +88 +87 +255 +152 +154 +254 +123 +131 +255 +109 +128 +255 +102 +124 +246 +93 +114 +239 +81 +104 +241 +72 +101 +249 +68 +101 +253 +61 +100 +245 +59 +96 +242 +79 +108 +209 +84 +100 +137 +61 +63 +80 +44 +32 +69 +58 +38 +68 +70 +46 +77 +77 +53 +90 +94 +67 +91 +105 +69 +99 +120 +77 +113 +136 +90 +120 +146 +98 +120 +150 +96 +116 +149 +92 +114 +150 +89 +113 +152 +89 +108 +149 +83 +109 +150 +82 +110 +151 +83 +111 +152 +84 +114 +153 +88 +116 +155 +90 +117 +156 +93 +117 +156 +91 +116 +155 +88 +116 +157 +87 +118 +160 +88 +119 +161 +87 +118 +162 +87 +118 +162 +85 +117 +161 +84 +116 +160 +83 +123 +165 +91 +123 +163 +93 +122 +158 +94 +117 +151 +91 +109 +139 +85 +98 +126 +77 +88 +114 +67 +83 +106 +62 +63 +85 +46 +63 +85 +47 +62 +84 +46 +91 +75 +59 +94 +78 +62 +96 +80 +64 +96 +80 +64 +96 +80 +64 +95 +79 +63 +96 +80 +64 +97 +81 +65 +98 +82 +66 +96 +80 +64 +95 +79 +63 +96 +80 +64 +98 +82 +66 +99 +83 +67 +98 +82 +66 +96 +80 +64 +102 +86 +71 +95 +81 +70 +92 +79 +71 +94 +84 +83 +97 +90 +97 +100 +96 +111 +109 +107 +131 +118 +119 +150 +119 +121 +162 +123 +125 +174 +125 +127 +184 +120 +124 +185 +113 +117 +181 +107 +112 +180 +108 +111 +182 +110 +113 +190 +117 +119 +206 +124 +126 +211 +137 +137 +209 +152 +152 +206 +168 +167 +199 +184 +182 +193 +201 +197 +186 +211 +206 +177 +219 +214 +172 +226 +219 +167 +231 +222 +167 +230 +221 +164 +228 +219 +164 +226 +216 +163 +219 +209 +158 +212 +199 +154 +212 +188 +154 +189 +155 +128 +170 +124 +100 +199 +138 +119 +202 +125 +109 +182 +86 +74 +211 +96 +91 +246 +114 +112 +236 +90 +91 +231 +75 +76 +226 +63 +64 +228 +62 +62 +233 +63 +64 +229 +59 +59 +224 +54 +54 +219 +54 +52 +214 +61 +56 +201 +56 +51 +202 +63 +56 +185 +54 +46 +184 +62 +51 +189 +75 +64 +182 +72 +59 +200 +93 +77 +221 +111 +96 +212 +96 +81 +198 +72 +58 +189 +53 +41 +196 +48 +38 +212 +54 +45 +220 +53 +45 +219 +48 +41 +226 +53 +49 +229 +57 +53 +228 +61 +55 +224 +60 +51 +220 +56 +46 +219 +53 +41 +223 +52 +42 +227 +53 +42 +236 +55 +46 +237 +53 +43 +237 +50 +43 +235 +48 +43 +231 +48 +44 +227 +50 +44 +225 +52 +46 +221 +53 +50 +214 +56 +55 +216 +62 +64 +228 +74 +76 +243 +87 +91 +250 +94 +98 +252 +92 +100 +254 +93 +101 +255 +97 +105 +240 +79 +87 +235 +74 +82 +238 +78 +86 +252 +92 +100 +255 +104 +111 +255 +101 +107 +244 +89 +95 +242 +79 +84 +236 +53 +58 +239 +45 +53 +241 +44 +54 +244 +47 +57 +238 +40 +53 +228 +34 +45 +227 +41 +54 +234 +57 +67 +251 +81 +90 +253 +92 +100 +255 +100 +108 +255 +101 +109 +255 +102 +110 +255 +101 +109 +252 +92 +104 +242 +82 +90 +229 +69 +69 +222 +60 +55 +219 +54 +52 +222 +54 +51 +223 +53 +53 +220 +51 +48 +218 +50 +47 +219 +54 +50 +224 +62 +57 +219 +62 +55 +216 +59 +52 +215 +58 +51 +219 +56 +49 +223 +56 +50 +229 +57 +53 +231 +58 +54 +233 +57 +59 +234 +55 +58 +235 +55 +58 +238 +55 +57 +238 +55 +57 +236 +54 +53 +229 +51 +49 +223 +50 +44 +220 +51 +44 +221 +54 +45 +223 +55 +44 +226 +54 +44 +229 +50 +43 +234 +49 +44 +242 +49 +44 +245 +50 +48 +247 +49 +50 +247 +48 +51 +250 +47 +50 +249 +46 +49 +247 +47 +47 +243 +48 +46 +236 +51 +46 +229 +55 +46 +223 +60 +51 +212 +61 +50 +194 +56 +46 +182 +49 +42 +183 +55 +52 +216 +90 +91 +255 +144 +147 +251 +115 +125 +254 +103 +122 +254 +94 +118 +247 +87 +111 +244 +80 +105 +246 +71 +102 +246 +65 +98 +250 +61 +99 +241 +66 +99 +227 +81 +104 +183 +76 +86 +119 +60 +56 +76 +50 +35 +62 +57 +35 +61 +65 +40 +71 +71 +47 +80 +83 +56 +88 +99 +65 +96 +114 +74 +110 +131 +88 +117 +143 +95 +118 +147 +93 +116 +147 +88 +113 +147 +86 +112 +148 +84 +107 +146 +79 +107 +148 +80 +108 +149 +81 +109 +150 +82 +112 +151 +86 +114 +153 +88 +115 +154 +91 +115 +154 +89 +116 +155 +88 +117 +157 +87 +117 +159 +87 +117 +159 +87 +116 +158 +84 +114 +158 +81 +113 +157 +82 +112 +156 +81 +110 +152 +80 +108 +148 +78 +104 +140 +76 +98 +129 +70 +88 +117 +63 +78 +105 +54 +70 +93 +47 +64 +87 +43 +64 +87 +45 +64 +87 +45 +64 +87 +45 +89 +76 +60 +91 +78 +62 +94 +81 +65 +94 +81 +65 +94 +81 +65 +94 +81 +65 +95 +82 +66 +96 +83 +67 +97 +84 +68 +96 +83 +67 +95 +82 +66 +96 +83 +67 +97 +84 +68 +97 +84 +68 +96 +83 +67 +94 +80 +67 +98 +85 +77 +92 +81 +77 +91 +81 +82 +99 +89 +98 +107 +100 +116 +113 +109 +132 +118 +117 +149 +121 +123 +164 +121 +123 +172 +121 +126 +182 +120 +124 +187 +110 +115 +181 +101 +105 +176 +96 +103 +175 +106 +110 +184 +114 +117 +196 +125 +125 +213 +135 +133 +217 +151 +148 +217 +169 +167 +216 +187 +185 +209 +203 +201 +202 +220 +215 +193 +229 +224 +184 +233 +228 +173 +237 +231 +169 +240 +232 +167 +237 +229 +166 +231 +225 +167 +226 +219 +165 +215 +207 +160 +203 +196 +154 +185 +174 +144 +170 +154 +129 +156 +130 +107 +171 +130 +112 +168 +110 +96 +158 +81 +71 +187 +93 +85 +222 +109 +105 +247 +117 +117 +238 +96 +95 +227 +74 +76 +226 +66 +68 +234 +65 +68 +235 +62 +64 +231 +57 +58 +224 +54 +54 +223 +61 +58 +212 +59 +54 +212 +65 +58 +194 +55 +48 +183 +55 +44 +183 +62 +51 +174 +61 +47 +182 +70 +56 +219 +106 +92 +223 +105 +91 +217 +91 +77 +202 +66 +54 +197 +50 +40 +209 +52 +43 +217 +54 +45 +217 +50 +44 +222 +53 +50 +233 +65 +62 +236 +71 +67 +224 +61 +54 +213 +50 +41 +213 +49 +39 +218 +50 +39 +222 +48 +37 +230 +52 +42 +232 +49 +41 +231 +46 +41 +230 +47 +41 +227 +50 +44 +226 +55 +47 +225 +61 +52 +224 +66 +57 +198 +45 +40 +202 +52 +51 +220 +68 +67 +240 +86 +88 +250 +94 +98 +247 +90 +97 +243 +83 +91 +241 +81 +91 +231 +69 +80 +232 +70 +81 +237 +77 +87 +251 +91 +101 +255 +107 +116 +255 +109 +115 +242 +87 +93 +225 +60 +66 +232 +47 +53 +242 +45 +52 +250 +50 +60 +251 +51 +62 +244 +44 +57 +236 +40 +52 +243 +55 +69 +255 +76 +87 +245 +74 +83 +244 +80 +87 +247 +87 +95 +252 +95 +102 +255 +100 +107 +255 +97 +105 +246 +82 +89 +232 +67 +73 +222 +57 +55 +222 +55 +49 +227 +55 +53 +233 +60 +56 +235 +59 +59 +230 +57 +53 +225 +53 +49 +221 +54 +48 +221 +58 +51 +217 +59 +50 +215 +57 +48 +215 +57 +48 +220 +55 +49 +225 +56 +51 +231 +58 +54 +233 +60 +56 +227 +57 +57 +227 +57 +57 +229 +57 +55 +231 +57 +56 +232 +56 +56 +230 +55 +52 +225 +52 +48 +219 +50 +43 +218 +54 +45 +219 +55 +45 +222 +56 +44 +226 +54 +44 +231 +50 +41 +235 +48 +41 +243 +48 +44 +247 +49 +48 +245 +49 +50 +245 +49 +51 +248 +48 +50 +247 +47 +49 +247 +47 +47 +242 +48 +46 +238 +51 +46 +231 +54 +46 +221 +57 +48 +220 +68 +57 +199 +56 +48 +187 +52 +46 +181 +47 +46 +228 +95 +98 +255 +131 +136 +248 +108 +119 +252 +99 +120 +251 +88 +115 +248 +81 +109 +251 +78 +108 +250 +69 +102 +243 +59 +93 +239 +61 +95 +233 +74 +102 +210 +85 +103 +155 +68 +74 +107 +60 +52 +79 +62 +44 +62 +60 +39 +59 +63 +40 +70 +68 +47 +72 +72 +48 +81 +92 +60 +89 +107 +69 +103 +124 +81 +114 +137 +91 +116 +143 +90 +113 +144 +85 +109 +143 +82 +107 +143 +79 +105 +144 +77 +105 +145 +75 +105 +146 +76 +107 +148 +80 +109 +150 +84 +110 +151 +85 +112 +151 +88 +113 +152 +87 +117 +156 +89 +117 +157 +87 +116 +156 +85 +114 +156 +84 +112 +154 +82 +109 +151 +77 +107 +149 +77 +106 +148 +76 +101 +141 +71 +97 +136 +69 +91 +127 +65 +85 +116 +59 +76 +105 +51 +69 +96 +45 +65 +88 +42 +62 +85 +39 +67 +93 +48 +68 +94 +49 +69 +95 +50 +87 +74 +58 +90 +77 +61 +92 +79 +63 +94 +81 +65 +93 +80 +64 +94 +81 +65 +95 +82 +66 +97 +84 +68 +96 +83 +67 +96 +83 +67 +96 +83 +67 +97 +84 +68 +97 +84 +68 +96 +83 +67 +95 +82 +66 +92 +80 +68 +90 +79 +77 +90 +81 +86 +98 +88 +99 +106 +99 +115 +113 +109 +134 +118 +117 +149 +120 +122 +163 +122 +124 +173 +119 +124 +180 +115 +121 +183 +109 +114 +180 +98 +105 +175 +93 +100 +172 +97 +103 +177 +108 +114 +190 +120 +123 +202 +137 +138 +221 +149 +146 +225 +164 +162 +225 +182 +181 +225 +199 +196 +217 +213 +209 +208 +225 +220 +198 +231 +227 +189 +235 +229 +179 +238 +233 +175 +238 +232 +174 +233 +226 +171 +227 +219 +170 +218 +211 +167 +203 +195 +158 +188 +182 +150 +166 +164 +139 +157 +152 +132 +150 +134 +118 +155 +127 +113 +155 +113 +99 +156 +98 +87 +181 +104 +96 +208 +113 +109 +251 +139 +137 +243 +118 +116 +232 +92 +93 +229 +76 +78 +229 +69 +71 +234 +65 +68 +234 +61 +63 +232 +60 +60 +223 +58 +56 +219 +60 +56 +222 +69 +63 +211 +67 +59 +195 +58 +48 +186 +58 +47 +176 +54 +41 +167 +49 +35 +191 +73 +59 +219 +97 +82 +234 +107 +92 +219 +83 +69 +201 +58 +44 +204 +52 +39 +212 +54 +43 +215 +52 +45 +217 +52 +50 +241 +77 +75 +254 +90 +88 +237 +75 +70 +217 +56 +48 +214 +51 +42 +219 +52 +43 +222 +50 +40 +223 +46 +38 +225 +44 +37 +225 +44 +37 +222 +45 +37 +220 +49 +41 +218 +54 +44 +217 +59 +48 +215 +63 +52 +194 +47 +39 +196 +52 +44 +206 +58 +54 +217 +67 +66 +223 +70 +72 +224 +69 +73 +228 +71 +78 +234 +77 +86 +241 +81 +93 +246 +86 +98 +247 +87 +97 +248 +91 +100 +255 +102 +111 +255 +107 +115 +241 +86 +94 +219 +56 +61 +233 +50 +55 +240 +47 +52 +241 +46 +54 +240 +43 +52 +235 +37 +50 +235 +41 +52 +249 +62 +73 +255 +83 +95 +237 +63 +73 +232 +65 +73 +234 +71 +76 +242 +81 +86 +255 +90 +96 +255 +88 +93 +244 +71 +77 +227 +54 +56 +225 +53 +51 +228 +55 +51 +234 +59 +56 +242 +64 +62 +244 +64 +63 +239 +61 +59 +230 +57 +53 +224 +55 +50 +221 +56 +50 +218 +57 +49 +217 +56 +48 +217 +56 +48 +220 +55 +49 +227 +55 +51 +232 +57 +54 +233 +58 +55 +226 +58 +55 +224 +59 +57 +227 +58 +55 +230 +58 +56 +231 +58 +54 +229 +56 +52 +224 +53 +46 +218 +51 +43 +218 +54 +44 +219 +55 +45 +222 +56 +44 +226 +54 +44 +231 +50 +41 +235 +48 +41 +242 +47 +43 +246 +48 +47 +244 +50 +50 +244 +50 +51 +247 +49 +50 +246 +48 +49 +246 +48 +47 +242 +48 +46 +238 +51 +46 +231 +54 +46 +220 +56 +47 +224 +70 +60 +201 +57 +49 +190 +51 +46 +182 +44 +44 +238 +102 +106 +255 +121 +128 +248 +103 +116 +253 +100 +121 +250 +86 +113 +251 +76 +107 +255 +72 +106 +252 +64 +99 +239 +55 +89 +232 +63 +94 +224 +82 +104 +195 +89 +101 +135 +67 +66 +101 +67 +55 +90 +79 +59 +72 +70 +49 +65 +67 +45 +76 +71 +51 +70 +68 +45 +76 +85 +54 +83 +99 +62 +98 +116 +76 +108 +131 +85 +112 +139 +88 +110 +141 +82 +107 +141 +80 +105 +142 +75 +103 +143 +73 +104 +144 +74 +104 +145 +75 +106 +147 +77 +107 +148 +80 +109 +150 +84 +111 +150 +87 +112 +151 +86 +116 +155 +88 +115 +155 +85 +113 +153 +83 +111 +151 +80 +106 +147 +77 +103 +144 +74 +101 +142 +72 +100 +141 +71 +96 +135 +68 +93 +129 +65 +87 +121 +61 +82 +113 +56 +77 +105 +54 +76 +102 +54 +78 +101 +55 +79 +102 +56 +77 +103 +56 +78 +104 +56 +79 +105 +58 +85 +72 +56 +87 +74 +58 +91 +78 +62 +92 +79 +63 +93 +80 +64 +93 +80 +64 +95 +82 +66 +97 +84 +68 +95 +82 +66 +96 +83 +67 +97 +84 +68 +97 +84 +68 +96 +83 +67 +95 +82 +66 +95 +82 +66 +94 +81 +73 +86 +77 +82 +95 +88 +104 +110 +102 +123 +116 +112 +137 +120 +116 +151 +120 +119 +161 +120 +122 +171 +121 +123 +180 +115 +121 +183 +106 +114 +179 +96 +103 +173 +91 +99 +171 +95 +103 +176 +106 +114 +187 +118 +124 +198 +128 +132 +206 +147 +149 +223 +158 +159 +224 +173 +174 +228 +187 +189 +228 +203 +201 +225 +212 +211 +217 +221 +218 +209 +225 +223 +202 +229 +224 +194 +230 +226 +191 +228 +222 +188 +224 +215 +182 +218 +208 +181 +206 +198 +175 +190 +182 +163 +174 +167 +151 +155 +153 +140 +143 +141 +128 +140 +132 +121 +141 +123 +113 +147 +117 +107 +157 +114 +105 +169 +109 +101 +188 +111 +105 +230 +137 +132 +237 +129 +126 +240 +116 +114 +240 +102 +100 +238 +88 +89 +237 +79 +78 +235 +69 +69 +233 +65 +64 +227 +58 +55 +224 +59 +55 +228 +66 +61 +222 +69 +63 +204 +60 +51 +198 +61 +51 +196 +66 +53 +175 +49 +35 +174 +48 +34 +199 +73 +59 +220 +88 +75 +214 +78 +64 +204 +61 +47 +206 +56 +42 +208 +54 +42 +209 +51 +42 +214 +52 +50 +245 +85 +85 +255 +107 +104 +250 +93 +88 +227 +68 +62 +220 +59 +51 +223 +59 +50 +227 +56 +48 +226 +52 +45 +227 +50 +44 +226 +49 +43 +221 +48 +41 +212 +48 +39 +205 +47 +36 +198 +47 +36 +194 +48 +35 +197 +57 +44 +192 +52 +39 +193 +51 +41 +203 +58 +53 +215 +67 +65 +219 +69 +71 +219 +66 +71 +218 +64 +72 +225 +69 +80 +236 +80 +91 +242 +86 +97 +242 +86 +97 +249 +93 +104 +255 +101 +109 +241 +87 +95 +222 +63 +68 +233 +59 +60 +237 +53 +55 +237 +51 +56 +239 +50 +56 +242 +50 +61 +247 +57 +67 +255 +72 +83 +255 +86 +95 +229 +53 +63 +222 +51 +59 +223 +54 +59 +234 +65 +68 +249 +74 +79 +253 +72 +77 +244 +59 +65 +233 +49 +51 +232 +53 +49 +235 +57 +53 +239 +60 +56 +242 +60 +57 +243 +59 +57 +240 +58 +55 +233 +55 +51 +226 +55 +48 +223 +59 +50 +220 +59 +49 +219 +58 +48 +220 +57 +48 +223 +56 +50 +228 +55 +51 +232 +54 +52 +233 +55 +53 +230 +58 +56 +228 +59 +56 +230 +58 +56 +232 +58 +57 +232 +59 +55 +230 +57 +53 +225 +54 +47 +220 +51 +44 +219 +55 +45 +220 +56 +46 +223 +57 +45 +225 +55 +42 +229 +51 +41 +233 +49 +41 +241 +48 +41 +244 +49 +45 +243 +51 +50 +241 +51 +51 +244 +50 +50 +244 +48 +49 +244 +49 +47 +242 +48 +46 +238 +51 +46 +231 +54 +46 +222 +55 +47 +224 +67 +58 +202 +55 +48 +192 +49 +45 +192 +49 +51 +247 +106 +112 +255 +113 +122 +249 +103 +116 +248 +95 +116 +246 +82 +109 +252 +68 +102 +255 +63 +100 +255 +59 +99 +242 +58 +94 +228 +71 +100 +216 +91 +109 +171 +86 +91 +119 +69 +62 +100 +74 +61 +97 +89 +70 +84 +79 +59 +75 +73 +52 +80 +73 +54 +71 +69 +46 +71 +80 +51 +76 +92 +56 +90 +108 +70 +102 +124 +78 +109 +133 +83 +109 +138 +82 +108 +140 +77 +104 +141 +74 +102 +142 +72 +103 +143 +72 +103 +145 +73 +105 +146 +76 +106 +147 +79 +108 +149 +83 +110 +149 +86 +111 +150 +85 +116 +153 +86 +115 +152 +85 +110 +149 +82 +106 +146 +76 +102 +143 +75 +99 +140 +72 +97 +138 +70 +95 +136 +70 +90 +129 +66 +88 +124 +63 +83 +116 +59 +80 +110 +56 +79 +107 +58 +82 +108 +61 +87 +110 +64 +90 +113 +67 +85 +111 +63 +85 +112 +61 +85 +111 +63 +82 +69 +53 +85 +72 +56 +88 +75 +59 +90 +77 +61 +91 +78 +62 +92 +79 +63 +94 +81 +65 +96 +83 +67 +96 +83 +67 +97 +84 +68 +97 +84 +68 +97 +84 +68 +96 +83 +67 +96 +83 +67 +98 +85 +69 +97 +86 +80 +94 +86 +99 +106 +101 +124 +121 +117 +144 +125 +121 +154 +122 +121 +161 +120 +121 +169 +118 +121 +176 +115 +119 +180 +106 +114 +179 +99 +106 +176 +91 +99 +171 +93 +101 +174 +104 +112 +185 +118 +126 +199 +129 +135 +209 +136 +141 +209 +153 +157 +220 +163 +166 +221 +175 +179 +226 +187 +191 +228 +198 +199 +227 +207 +206 +224 +212 +211 +219 +215 +213 +214 +217 +214 +209 +217 +213 +204 +215 +208 +198 +210 +201 +192 +204 +195 +190 +197 +186 +184 +180 +168 +168 +163 +155 +153 +141 +137 +134 +124 +121 +116 +124 +116 +113 +120 +107 +101 +130 +107 +101 +143 +110 +103 +144 +97 +91 +157 +96 +91 +192 +115 +109 +215 +122 +117 +237 +128 +123 +249 +126 +121 +253 +115 +112 +250 +100 +99 +243 +85 +84 +237 +73 +71 +237 +68 +63 +234 +62 +58 +225 +60 +54 +224 +65 +59 +209 +58 +49 +211 +67 +58 +221 +84 +74 +194 +62 +50 +184 +54 +41 +189 +57 +44 +194 +61 +46 +200 +63 +47 +207 +66 +49 +215 +67 +53 +214 +64 +49 +209 +55 +45 +208 +50 +47 +234 +76 +77 +250 +95 +93 +242 +87 +83 +223 +68 +63 +217 +58 +52 +219 +56 +49 +224 +55 +48 +230 +57 +51 +231 +57 +50 +231 +57 +50 +226 +58 +49 +218 +57 +47 +209 +57 +44 +202 +56 +43 +196 +56 +41 +176 +40 +24 +184 +51 +34 +200 +64 +50 +211 +73 +62 +210 +68 +64 +203 +59 +58 +204 +55 +59 +207 +58 +64 +211 +57 +67 +227 +73 +83 +237 +86 +95 +240 +89 +98 +244 +93 +102 +246 +95 +104 +232 +83 +89 +218 +63 +67 +229 +64 +62 +236 +63 +59 +243 +64 +67 +253 +70 +74 +255 +76 +84 +255 +81 +89 +255 +84 +93 +255 +85 +94 +226 +51 +58 +221 +46 +53 +221 +46 +51 +231 +55 +58 +245 +60 +65 +249 +58 +63 +248 +52 +56 +244 +48 +50 +237 +52 +50 +239 +57 +53 +240 +56 +54 +237 +52 +50 +235 +50 +48 +234 +50 +48 +231 +52 +48 +225 +52 +46 +227 +60 +52 +224 +61 +52 +223 +60 +51 +222 +59 +50 +225 +56 +51 +228 +55 +51 +232 +52 +51 +232 +52 +51 +232 +56 +56 +231 +57 +56 +232 +56 +56 +235 +57 +57 +235 +57 +55 +233 +55 +53 +226 +53 +47 +222 +51 +44 +219 +55 +45 +220 +56 +44 +221 +58 +43 +223 +55 +42 +227 +50 +40 +231 +48 +40 +239 +48 +40 +242 +49 +44 +241 +52 +50 +240 +52 +51 +243 +51 +50 +243 +49 +49 +243 +49 +47 +241 +49 +46 +236 +51 +46 +231 +54 +46 +224 +57 +49 +217 +60 +51 +204 +55 +49 +193 +48 +45 +209 +64 +67 +255 +110 +117 +253 +107 +117 +247 +99 +113 +237 +84 +105 +241 +74 +102 +250 +62 +97 +255 +55 +94 +255 +55 +98 +248 +64 +100 +227 +79 +105 +200 +92 +105 +139 +71 +70 +106 +70 +58 +93 +76 +60 +93 +86 +67 +88 +81 +62 +81 +74 +55 +79 +71 +52 +73 +68 +46 +68 +74 +46 +71 +85 +50 +83 +99 +62 +94 +115 +72 +103 +127 +77 +106 +135 +79 +106 +138 +75 +103 +140 +71 +103 +140 +70 +102 +142 +71 +102 +144 +72 +103 +144 +74 +105 +146 +78 +107 +148 +82 +109 +148 +85 +109 +148 +85 +113 +149 +85 +111 +148 +81 +106 +145 +78 +103 +142 +75 +99 +140 +72 +96 +137 +69 +95 +136 +70 +94 +134 +71 +92 +130 +69 +91 +126 +68 +87 +120 +65 +86 +114 +63 +85 +111 +64 +89 +112 +66 +93 +114 +71 +94 +117 +71 +90 +114 +66 +88 +115 +64 +88 +115 +64 +78 +66 +50 +81 +69 +53 +85 +73 +57 +87 +75 +59 +88 +76 +60 +90 +78 +62 +92 +80 +64 +94 +82 +66 +97 +85 +69 +98 +86 +70 +98 +86 +70 +97 +85 +69 +95 +83 +67 +97 +85 +69 +102 +90 +74 +104 +93 +89 +110 +103 +119 +117 +112 +142 +124 +120 +153 +123 +121 +160 +119 +120 +166 +118 +119 +173 +112 +117 +175 +106 +111 +175 +97 +104 +172 +94 +102 +174 +95 +103 +176 +101 +109 +182 +112 +120 +192 +125 +133 +205 +137 +144 +216 +143 +151 +214 +153 +161 +210 +161 +168 +210 +170 +178 +217 +180 +186 +222 +186 +191 +223 +192 +193 +224 +195 +195 +223 +199 +197 +221 +198 +194 +217 +197 +192 +212 +193 +186 +204 +188 +179 +196 +187 +176 +193 +181 +168 +186 +166 +153 +170 +150 +139 +153 +139 +132 +139 +117 +111 +113 +119 +110 +111 +115 +101 +101 +122 +102 +101 +137 +109 +106 +133 +94 +89 +150 +99 +95 +155 +90 +84 +183 +103 +96 +214 +117 +110 +237 +124 +118 +252 +125 +119 +255 +120 +115 +254 +106 +102 +249 +92 +87 +252 +83 +78 +245 +72 +66 +230 +61 +54 +231 +68 +61 +216 +59 +52 +219 +71 +61 +234 +92 +82 +197 +59 +48 +196 +60 +48 +189 +55 +43 +190 +54 +40 +199 +62 +46 +209 +68 +51 +212 +66 +51 +212 +65 +49 +215 +65 +51 +210 +56 +54 +216 +62 +62 +221 +67 +67 +220 +66 +64 +214 +61 +55 +213 +56 +49 +216 +55 +47 +222 +55 +47 +229 +58 +51 +230 +57 +51 +229 +58 +51 +226 +59 +51 +219 +62 +53 +213 +65 +53 +209 +69 +56 +204 +71 +54 +174 +45 +24 +188 +59 +37 +205 +74 +56 +209 +76 +61 +198 +61 +53 +187 +48 +43 +192 +48 +48 +202 +57 +62 +215 +65 +74 +226 +76 +85 +236 +86 +97 +240 +90 +101 +239 +92 +100 +236 +89 +97 +223 +76 +82 +212 +62 +64 +209 +52 +47 +218 +53 +47 +227 +57 +57 +237 +63 +64 +245 +66 +72 +247 +68 +74 +244 +64 +73 +239 +62 +70 +228 +51 +59 +225 +48 +54 +230 +49 +54 +240 +55 +60 +247 +54 +57 +249 +49 +52 +254 +45 +50 +253 +49 +52 +239 +50 +48 +240 +57 +53 +240 +55 +52 +236 +48 +46 +232 +44 +42 +231 +48 +44 +230 +51 +46 +224 +51 +44 +228 +61 +53 +224 +61 +52 +224 +61 +52 +224 +60 +51 +227 +58 +53 +230 +57 +53 +234 +54 +53 +236 +54 +53 +236 +53 +55 +236 +53 +55 +237 +53 +55 +238 +54 +56 +238 +54 +54 +235 +53 +52 +228 +50 +46 +222 +49 +43 +222 +55 +46 +221 +57 +45 +221 +58 +43 +223 +55 +42 +225 +52 +38 +230 +49 +38 +237 +49 +40 +241 +49 +44 +240 +52 +50 +238 +53 +51 +241 +52 +50 +242 +50 +49 +243 +49 +47 +241 +49 +46 +236 +51 +46 +231 +54 +46 +226 +59 +51 +210 +52 +43 +210 +58 +53 +198 +50 +48 +231 +85 +88 +255 +112 +120 +249 +99 +110 +241 +90 +105 +227 +75 +96 +239 +72 +102 +253 +58 +98 +255 +49 +93 +255 +54 +98 +253 +67 +104 +219 +77 +101 +177 +80 +89 +106 +53 +47 +94 +71 +55 +88 +75 +58 +85 +78 +59 +89 +81 +62 +85 +74 +56 +76 +64 +48 +73 +68 +48 +64 +70 +44 +65 +79 +46 +75 +91 +54 +88 +106 +64 +98 +120 +71 +102 +129 +74 +104 +136 +73 +102 +139 +70 +101 +138 +68 +99 +139 +66 +99 +141 +69 +101 +142 +72 +103 +144 +76 +104 +145 +79 +105 +145 +82 +107 +146 +83 +110 +146 +82 +108 +144 +80 +104 +143 +78 +100 +139 +74 +97 +138 +72 +95 +136 +70 +95 +135 +72 +95 +135 +72 +95 +133 +72 +95 +130 +72 +93 +126 +71 +93 +121 +70 +93 +119 +72 +96 +119 +75 +99 +120 +79 +99 +122 +78 +92 +116 +66 +90 +117 +64 +90 +117 +64 +74 +67 +51 +77 +70 +54 +81 +72 +57 +84 +75 +60 +87 +75 +61 +89 +77 +63 +92 +79 +63 +94 +81 +65 +100 +87 +70 +101 +88 +71 +100 +88 +72 +98 +86 +70 +95 +85 +73 +97 +87 +77 +103 +94 +85 +108 +99 +102 +119 +114 +137 +121 +117 +154 +120 +118 +158 +116 +115 +159 +114 +114 +164 +116 +117 +173 +108 +112 +175 +98 +103 +169 +90 +97 +169 +95 +101 +175 +102 +108 +184 +109 +115 +191 +118 +124 +200 +129 +135 +211 +143 +147 +221 +151 +156 +222 +155 +161 +211 +160 +167 +209 +169 +174 +216 +174 +179 +221 +177 +180 +223 +178 +179 +223 +180 +179 +223 +182 +179 +222 +181 +176 +217 +179 +172 +213 +174 +166 +203 +171 +161 +196 +170 +159 +193 +164 +153 +185 +153 +140 +170 +136 +126 +150 +126 +120 +132 +102 +97 +103 +108 +99 +102 +100 +88 +90 +108 +90 +88 +124 +99 +95 +123 +86 +80 +147 +98 +93 +140 +77 +70 +162 +85 +77 +187 +97 +88 +212 +108 +99 +238 +121 +114 +255 +129 +122 +255 +124 +119 +255 +112 +106 +254 +97 +92 +247 +84 +79 +233 +71 +66 +238 +79 +73 +221 +66 +61 +222 +71 +64 +234 +87 +79 +186 +44 +34 +190 +49 +39 +190 +52 +39 +199 +62 +46 +209 +69 +54 +203 +62 +45 +193 +50 +34 +202 +55 +39 +219 +69 +55 +222 +69 +63 +211 +57 +55 +204 +51 +46 +205 +53 +48 +212 +59 +53 +215 +61 +53 +221 +60 +52 +225 +61 +52 +228 +59 +52 +228 +57 +50 +222 +53 +46 +215 +52 +43 +207 +53 +41 +202 +56 +43 +197 +60 +44 +194 +63 +45 +212 +83 +62 +200 +71 +50 +189 +60 +41 +190 +58 +45 +195 +61 +50 +196 +59 +53 +194 +55 +52 +194 +52 +51 +220 +75 +78 +221 +76 +81 +225 +80 +85 +229 +84 +89 +232 +89 +93 +229 +86 +88 +220 +77 +79 +212 +67 +64 +203 +52 +43 +212 +54 +43 +218 +53 +47 +224 +52 +50 +228 +49 +52 +232 +49 +54 +233 +48 +56 +231 +46 +54 +238 +51 +62 +237 +50 +59 +244 +52 +63 +253 +56 +66 +255 +51 +62 +253 +41 +53 +255 +40 +51 +255 +46 +57 +248 +45 +51 +249 +53 +55 +249 +53 +57 +240 +46 +47 +235 +42 +43 +233 +48 +46 +232 +53 +49 +226 +53 +47 +227 +60 +52 +224 +61 +52 +224 +61 +52 +225 +61 +52 +228 +59 +54 +231 +58 +54 +235 +55 +54 +238 +54 +54 +236 +52 +54 +235 +51 +53 +236 +50 +53 +237 +51 +52 +237 +53 +53 +234 +52 +49 +227 +49 +45 +219 +48 +40 +222 +56 +44 +221 +58 +43 +221 +58 +43 +222 +56 +40 +224 +52 +38 +227 +51 +36 +233 +51 +38 +236 +52 +42 +238 +53 +48 +238 +53 +50 +240 +52 +50 +240 +51 +47 +242 +50 +47 +239 +50 +44 +235 +52 +44 +231 +54 +46 +228 +61 +52 +205 +47 +38 +215 +62 +57 +202 +52 +53 +249 +98 +103 +255 +112 +121 +246 +91 +105 +237 +80 +99 +228 +70 +93 +243 +72 +104 +255 +61 +101 +255 +50 +93 +255 +55 +97 +245 +71 +104 +201 +74 +93 +148 +66 +70 +83 +43 +35 +88 +72 +56 +84 +75 +58 +79 +72 +54 +89 +80 +63 +83 +74 +57 +69 +64 +45 +71 +70 +49 +61 +67 +39 +64 +74 +40 +73 +85 +49 +83 +100 +58 +95 +114 +69 +101 +125 +73 +103 +132 +74 +101 +136 +72 +99 +136 +67 +97 +137 +66 +98 +138 +67 +99 +141 +69 +101 +142 +72 +102 +143 +77 +104 +143 +80 +105 +144 +81 +108 +144 +80 +107 +144 +77 +102 +141 +74 +99 +138 +73 +97 +136 +71 +96 +135 +70 +96 +135 +72 +96 +134 +73 +94 +129 +71 +94 +127 +70 +95 +125 +71 +96 +124 +73 +97 +123 +75 +100 +123 +77 +102 +124 +78 +102 +126 +78 +93 +120 +67 +92 +121 +63 +93 +122 +66 +68 +66 +54 +70 +68 +56 +74 +70 +59 +80 +71 +62 +82 +72 +62 +87 +73 +62 +93 +77 +62 +95 +79 +63 +96 +81 +62 +97 +82 +63 +96 +83 +66 +95 +86 +71 +98 +89 +82 +103 +98 +95 +111 +106 +110 +115 +111 +126 +119 +113 +147 +122 +116 +160 +124 +121 +168 +121 +119 +169 +112 +112 +166 +103 +103 +163 +96 +97 +162 +92 +95 +164 +96 +98 +173 +102 +104 +181 +111 +112 +192 +121 +122 +204 +132 +130 +214 +141 +139 +223 +150 +146 +231 +156 +153 +232 +160 +158 +223 +161 +160 +218 +163 +162 +219 +164 +163 +220 +166 +163 +220 +165 +162 +219 +165 +160 +216 +164 +159 +213 +165 +158 +210 +163 +156 +207 +162 +154 +201 +162 +153 +198 +159 +150 +193 +153 +142 +184 +142 +131 +171 +131 +124 +155 +113 +111 +124 +104 +103 +108 +99 +95 +96 +102 +90 +90 +108 +89 +85 +115 +86 +80 +128 +85 +78 +143 +86 +79 +150 +82 +73 +169 +89 +80 +181 +88 +80 +192 +91 +83 +216 +107 +100 +235 +122 +114 +246 +131 +124 +255 +139 +134 +249 +117 +113 +255 +117 +115 +237 +95 +93 +223 +80 +76 +217 +69 +65 +239 +90 +84 +204 +55 +49 +197 +50 +42 +196 +54 +42 +195 +55 +40 +192 +55 +39 +195 +55 +38 +198 +57 +40 +202 +59 +43 +208 +60 +46 +213 +63 +49 +210 +56 +46 +214 +60 +50 +215 +63 +52 +211 +59 +48 +205 +53 +40 +205 +51 +39 +216 +58 +47 +226 +64 +53 +224 +57 +48 +225 +57 +48 +222 +55 +46 +215 +55 +43 +207 +55 +41 +201 +58 +42 +198 +63 +44 +196 +65 +47 +194 +61 +46 +198 +64 +52 +203 +69 +58 +205 +71 +60 +204 +67 +59 +197 +60 +52 +187 +50 +44 +182 +43 +38 +199 +60 +55 +208 +69 +66 +217 +79 +76 +224 +86 +83 +227 +89 +86 +225 +88 +82 +216 +79 +73 +208 +67 +58 +205 +58 +42 +213 +58 +40 +220 +56 +44 +227 +53 +46 +232 +46 +47 +237 +42 +50 +240 +40 +51 +244 +39 +54 +251 +44 +62 +250 +43 +63 +251 +42 +63 +253 +41 +63 +255 +39 +63 +255 +38 +63 +255 +36 +60 +255 +35 +60 +255 +35 +55 +255 +38 +56 +255 +42 +59 +254 +44 +57 +244 +44 +54 +237 +46 +53 +233 +53 +54 +232 +60 +58 +221 +56 +52 +221 +58 +51 +222 +59 +52 +224 +59 +53 +227 +58 +53 +230 +57 +53 +233 +55 +51 +235 +53 +52 +235 +51 +53 +236 +52 +54 +235 +53 +52 +233 +53 +52 +231 +53 +51 +226 +53 +47 +221 +53 +44 +219 +53 +41 +220 +56 +44 +219 +57 +42 +220 +57 +40 +222 +57 +38 +223 +56 +38 +226 +55 +37 +227 +54 +37 +230 +52 +38 +236 +53 +45 +237 +52 +47 +240 +53 +48 +241 +52 +46 +241 +53 +44 +237 +53 +43 +232 +54 +42 +228 +56 +44 +222 +58 +48 +212 +55 +46 +211 +58 +53 +215 +62 +64 +255 +109 +117 +255 +98 +113 +248 +85 +106 +241 +75 +99 +247 +79 +105 +236 +58 +90 +249 +57 +94 +255 +63 +103 +245 +64 +99 +230 +80 +107 +178 +73 +87 +97 +36 +35 +71 +43 +32 +65 +56 +39 +75 +68 +52 +82 +76 +60 +79 +73 +57 +66 +67 +49 +59 +68 +47 +60 +73 +47 +65 +72 +38 +69 +75 +37 +75 +83 +46 +83 +93 +56 +91 +107 +68 +97 +118 +75 +100 +126 +78 +100 +131 +74 +98 +134 +70 +96 +136 +66 +97 +137 +64 +99 +139 +66 +101 +141 +70 +104 +144 +74 +108 +144 +80 +109 +145 +81 +108 +145 +76 +105 +142 +72 +103 +140 +71 +102 +139 +72 +102 +138 +74 +101 +137 +73 +99 +133 +72 +97 +131 +71 +100 +131 +74 +100 +129 +73 +98 +127 +71 +99 +126 +71 +100 +127 +74 +100 +127 +72 +101 +126 +71 +97 +125 +67 +91 +123 +60 +92 +127 +61 +95 +130 +66 +61 +63 +52 +63 +65 +54 +70 +67 +60 +74 +69 +63 +80 +69 +63 +84 +71 +62 +91 +75 +62 +93 +77 +61 +96 +79 +59 +96 +81 +60 +94 +83 +65 +94 +86 +73 +99 +91 +88 +104 +99 +105 +110 +108 +121 +115 +111 +134 +116 +112 +149 +118 +112 +158 +116 +112 +162 +112 +109 +162 +103 +102 +159 +97 +97 +159 +93 +94 +161 +92 +92 +164 +101 +100 +176 +107 +106 +186 +116 +114 +197 +125 +123 +207 +134 +130 +217 +141 +137 +224 +148 +142 +230 +152 +147 +229 +155 +149 +221 +156 +151 +217 +157 +152 +218 +158 +153 +219 +158 +151 +218 +157 +150 +217 +156 +150 +214 +155 +149 +211 +158 +150 +210 +156 +148 +205 +156 +147 +200 +155 +147 +198 +154 +145 +192 +147 +138 +183 +136 +127 +170 +128 +121 +154 +115 +109 +123 +107 +101 +105 +100 +94 +94 +101 +91 +89 +107 +90 +83 +113 +86 +77 +124 +84 +74 +141 +84 +75 +157 +84 +75 +178 +91 +82 +187 +88 +82 +195 +88 +82 +211 +102 +97 +221 +114 +106 +224 +120 +111 +235 +126 +119 +251 +136 +133 +255 +135 +133 +247 +117 +115 +238 +103 +100 +227 +85 +83 +235 +90 +85 +199 +50 +44 +194 +47 +37 +197 +55 +41 +195 +55 +38 +192 +55 +37 +193 +56 +38 +196 +56 +39 +200 +59 +42 +207 +59 +45 +211 +61 +47 +213 +57 +44 +213 +57 +44 +211 +58 +44 +210 +58 +44 +209 +57 +43 +209 +57 +43 +212 +56 +43 +216 +56 +44 +223 +59 +49 +224 +57 +48 +220 +56 +46 +214 +56 +44 +207 +57 +42 +200 +57 +40 +193 +58 +38 +190 +57 +38 +190 +54 +42 +193 +56 +48 +198 +61 +53 +201 +64 +56 +202 +65 +57 +200 +63 +55 +197 +60 +52 +194 +57 +49 +191 +52 +45 +199 +62 +54 +209 +72 +64 +216 +79 +71 +218 +81 +73 +215 +78 +70 +204 +67 +59 +195 +55 +42 +202 +55 +37 +211 +56 +36 +221 +55 +41 +229 +52 +44 +237 +47 +47 +244 +43 +51 +249 +41 +55 +253 +40 +58 +255 +43 +64 +255 +42 +65 +255 +41 +65 +255 +38 +65 +255 +35 +64 +255 +33 +60 +255 +30 +61 +255 +29 +58 +255 +30 +57 +255 +31 +56 +255 +36 +58 +255 +41 +59 +247 +45 +57 +241 +50 +58 +234 +55 +58 +230 +60 +60 +220 +57 +52 +220 +58 +53 +222 +59 +52 +224 +59 +53 +227 +58 +53 +230 +57 +53 +233 +55 +51 +235 +53 +50 +235 +51 +53 +236 +52 +54 +235 +53 +52 +232 +54 +52 +228 +55 +49 +223 +54 +47 +220 +53 +44 +217 +53 +41 +219 +57 +42 +219 +57 +42 +220 +57 +40 +220 +57 +38 +222 +57 +38 +223 +56 +37 +225 +56 +37 +227 +54 +37 +231 +53 +43 +234 +51 +43 +235 +52 +44 +235 +53 +42 +235 +53 +42 +232 +54 +40 +228 +55 +41 +223 +55 +42 +221 +61 +49 +209 +52 +43 +207 +53 +51 +239 +84 +88 +255 +102 +114 +255 +91 +111 +241 +73 +98 +249 +76 +104 +248 +69 +99 +247 +64 +95 +244 +56 +91 +243 +62 +97 +239 +78 +109 +205 +76 +98 +139 +56 +64 +89 +41 +37 +69 +51 +39 +60 +54 +40 +62 +59 +44 +67 +64 +49 +67 +66 +48 +61 +64 +45 +56 +68 +46 +58 +73 +44 +60 +68 +29 +75 +80 +39 +92 +98 +60 +101 +111 +74 +104 +118 +82 +101 +122 +81 +100 +126 +79 +100 +130 +76 +97 +131 +70 +97 +134 +65 +97 +137 +64 +99 +140 +64 +103 +141 +68 +105 +142 +72 +107 +144 +77 +108 +145 +78 +108 +145 +75 +106 +144 +71 +104 +141 +72 +102 +139 +70 +103 +138 +74 +102 +137 +73 +102 +133 +74 +100 +131 +72 +102 +131 +75 +100 +129 +73 +100 +127 +72 +100 +128 +70 +101 +129 +71 +101 +129 +71 +102 +127 +69 +98 +126 +65 +93 +128 +62 +95 +132 +63 +98 +135 +66 +54 +57 +46 +58 +60 +49 +63 +63 +55 +68 +65 +58 +75 +66 +59 +79 +69 +60 +86 +72 +61 +89 +76 +60 +94 +79 +60 +92 +79 +60 +92 +83 +66 +94 +87 +77 +99 +93 +93 +104 +101 +108 +111 +109 +123 +115 +113 +137 +115 +111 +148 +113 +107 +153 +106 +102 +152 +99 +96 +149 +92 +91 +148 +90 +90 +152 +92 +93 +160 +92 +95 +166 +104 +106 +181 +110 +111 +191 +119 +120 +202 +127 +128 +210 +134 +132 +216 +138 +136 +220 +143 +139 +224 +145 +142 +221 +147 +144 +215 +147 +144 +211 +147 +144 +211 +147 +144 +211 +148 +142 +212 +147 +141 +211 +147 +140 +208 +146 +139 +206 +149 +140 +205 +147 +139 +199 +148 +139 +194 +148 +140 +191 +147 +139 +186 +140 +133 +175 +131 +123 +162 +126 +115 +145 +121 +103 +119 +115 +96 +102 +103 +91 +91 +100 +91 +86 +100 +91 +82 +104 +88 +75 +117 +85 +72 +135 +83 +72 +166 +89 +81 +190 +95 +89 +203 +91 +89 +208 +88 +87 +218 +100 +98 +222 +109 +105 +220 +113 +107 +226 +119 +113 +251 +138 +132 +255 +138 +134 +255 +133 +129 +255 +125 +121 +247 +110 +104 +238 +97 +88 +196 +52 +43 +192 +50 +38 +196 +56 +41 +193 +58 +39 +192 +57 +38 +192 +57 +37 +194 +57 +38 +198 +59 +40 +204 +58 +43 +208 +58 +44 +214 +58 +45 +211 +53 +41 +206 +53 +39 +208 +56 +42 +212 +62 +47 +212 +62 +47 +206 +54 +40 +203 +47 +34 +218 +58 +46 +218 +56 +45 +217 +55 +44 +214 +56 +44 +208 +58 +43 +201 +58 +41 +194 +57 +38 +190 +55 +36 +189 +53 +41 +192 +54 +44 +194 +56 +46 +196 +58 +48 +199 +61 +51 +202 +64 +54 +203 +65 +55 +204 +66 +56 +199 +58 +49 +202 +64 +54 +207 +69 +59 +208 +70 +60 +210 +72 +62 +209 +71 +61 +202 +64 +54 +197 +55 +43 +204 +54 +37 +214 +54 +38 +223 +55 +44 +231 +52 +47 +241 +48 +51 +246 +45 +53 +251 +43 +57 +255 +42 +60 +252 +39 +59 +252 +39 +61 +251 +37 +61 +249 +35 +59 +251 +33 +58 +250 +30 +55 +252 +28 +55 +254 +27 +54 +255 +29 +55 +255 +30 +53 +254 +35 +55 +253 +42 +59 +247 +50 +60 +242 +55 +62 +236 +57 +60 +229 +59 +59 +220 +57 +52 +220 +58 +53 +222 +59 +52 +224 +59 +53 +229 +57 +53 +231 +56 +53 +233 +55 +51 +235 +53 +50 +237 +51 +54 +238 +52 +55 +237 +53 +53 +234 +54 +53 +229 +54 +49 +225 +54 +47 +220 +53 +44 +216 +52 +40 +218 +56 +41 +217 +57 +41 +218 +57 +39 +219 +56 +37 +221 +56 +37 +222 +55 +36 +224 +55 +36 +225 +54 +37 +225 +53 +39 +226 +52 +41 +227 +53 +42 +227 +54 +40 +227 +54 +40 +225 +55 +40 +221 +55 +41 +218 +56 +43 +219 +61 +50 +204 +50 +42 +211 +56 +54 +255 +108 +112 +255 +93 +108 +249 +81 +104 +237 +62 +91 +255 +75 +108 +247 +59 +92 +255 +66 +100 +240 +56 +90 +233 +65 +98 +227 +87 +113 +171 +64 +82 +101 +34 +41 +81 +46 +42 +65 +52 +43 +52 +53 +39 +53 +54 +38 +58 +59 +41 +63 +62 +42 +62 +61 +40 +60 +64 +41 +62 +69 +38 +62 +70 +29 +88 +97 +52 +115 +126 +84 +128 +140 +100 +119 +135 +96 +104 +127 +83 +97 +125 +76 +97 +128 +71 +96 +131 +67 +96 +133 +63 +97 +137 +64 +99 +140 +64 +104 +142 +69 +106 +143 +74 +107 +144 +77 +108 +145 +78 +110 +147 +77 +107 +145 +72 +104 +141 +72 +103 +140 +71 +104 +139 +75 +104 +139 +75 +102 +136 +76 +100 +134 +74 +101 +132 +75 +100 +131 +74 +99 +128 +70 +100 +129 +71 +102 +130 +72 +102 +130 +71 +101 +129 +70 +98 +128 +66 +99 +134 +68 +101 +138 +69 +104 +141 +72 +50 +53 +42 +53 +56 +45 +59 +60 +52 +65 +62 +55 +71 +64 +58 +75 +66 +59 +82 +69 +60 +86 +74 +60 +88 +76 +60 +89 +77 +61 +89 +81 +68 +94 +87 +79 +99 +94 +98 +105 +103 +114 +111 +110 +128 +114 +111 +140 +114 +109 +149 +106 +103 +148 +96 +94 +143 +87 +87 +139 +84 +85 +142 +87 +88 +152 +92 +95 +162 +97 +99 +173 +108 +110 +187 +114 +115 +195 +123 +124 +206 +130 +131 +213 +136 +134 +217 +138 +136 +219 +140 +136 +220 +141 +138 +217 +143 +142 +212 +143 +140 +209 +143 +140 +209 +142 +139 +210 +143 +137 +211 +142 +136 +210 +142 +134 +209 +141 +133 +206 +143 +133 +202 +142 +133 +196 +143 +134 +191 +144 +136 +187 +143 +136 +180 +137 +131 +169 +128 +121 +154 +126 +112 +137 +127 +96 +112 +121 +90 +96 +107 +89 +89 +99 +92 +84 +96 +94 +81 +98 +91 +73 +109 +86 +70 +128 +82 +69 +161 +84 +76 +193 +91 +89 +209 +89 +91 +217 +88 +92 +228 +99 +103 +228 +108 +107 +224 +112 +108 +228 +121 +115 +236 +125 +118 +237 +122 +115 +254 +131 +126 +255 +134 +129 +255 +129 +123 +245 +107 +97 +201 +60 +50 +196 +56 +41 +194 +59 +40 +191 +58 +39 +191 +59 +38 +190 +58 +37 +193 +58 +38 +197 +58 +39 +200 +57 +41 +206 +56 +42 +216 +58 +46 +212 +54 +42 +206 +53 +39 +206 +56 +41 +209 +62 +46 +209 +62 +46 +203 +56 +40 +199 +47 +33 +210 +54 +41 +211 +53 +41 +210 +52 +40 +210 +54 +41 +209 +57 +43 +205 +60 +43 +200 +61 +42 +196 +59 +41 +196 +58 +45 +196 +58 +47 +198 +57 +48 +198 +57 +47 +199 +58 +49 +200 +59 +49 +201 +60 +51 +203 +61 +51 +211 +68 +60 +211 +69 +59 +208 +65 +57 +203 +61 +51 +203 +60 +52 +207 +65 +55 +207 +64 +56 +206 +59 +49 +206 +53 +39 +217 +53 +41 +226 +53 +46 +235 +51 +49 +242 +47 +53 +247 +43 +54 +249 +41 +55 +252 +41 +58 +249 +38 +57 +247 +38 +59 +247 +38 +59 +248 +39 +60 +251 +38 +60 +253 +37 +58 +255 +36 +58 +255 +35 +58 +255 +33 +54 +253 +34 +54 +250 +37 +55 +249 +44 +59 +247 +53 +62 +242 +57 +63 +233 +57 +59 +225 +57 +56 +220 +57 +52 +220 +58 +53 +222 +59 +52 +224 +59 +53 +229 +57 +53 +231 +56 +53 +233 +55 +51 +235 +53 +52 +238 +52 +55 +238 +52 +55 +238 +54 +54 +234 +54 +53 +230 +55 +50 +225 +54 +47 +220 +53 +44 +215 +53 +42 +216 +56 +42 +216 +56 +40 +216 +56 +40 +217 +56 +38 +218 +55 +38 +220 +55 +36 +221 +54 +36 +221 +54 +36 +219 +53 +37 +220 +54 +40 +221 +55 +39 +220 +57 +40 +220 +57 +40 +218 +59 +40 +215 +58 +41 +214 +58 +43 +213 +59 +49 +206 +51 +46 +231 +73 +74 +255 +111 +119 +254 +85 +104 +243 +69 +94 +243 +62 +95 +255 +67 +102 +251 +55 +91 +252 +60 +97 +240 +66 +99 +228 +79 +108 +196 +80 +101 +129 +47 +61 +78 +29 +33 +72 +48 +46 +54 +47 +39 +50 +52 +39 +56 +58 +44 +62 +65 +46 +65 +64 +43 +63 +61 +36 +65 +64 +36 +69 +70 +36 +84 +93 +48 +112 +126 +77 +143 +159 +114 +151 +168 +124 +131 +152 +109 +106 +132 +87 +95 +123 +74 +93 +126 +69 +95 +131 +67 +97 +134 +64 +98 +138 +65 +102 +143 +67 +107 +144 +74 +108 +145 +76 +109 +146 +79 +109 +146 +79 +111 +148 +78 +108 +146 +73 +105 +142 +73 +104 +141 +72 +105 +140 +76 +105 +140 +76 +104 +138 +78 +103 +137 +77 +102 +133 +76 +100 +131 +74 +100 +129 +71 +101 +130 +72 +103 +131 +72 +104 +132 +73 +102 +130 +71 +100 +130 +68 +103 +138 +72 +105 +142 +73 +108 +145 +76 +45 +51 +39 +51 +54 +43 +56 +57 +49 +60 +59 +54 +66 +61 +57 +71 +64 +58 +77 +68 +61 +81 +71 +61 +83 +73 +61 +83 +75 +62 +85 +78 +68 +90 +85 +81 +97 +94 +101 +105 +103 +117 +109 +107 +129 +108 +107 +138 +106 +104 +144 +98 +96 +143 +88 +86 +136 +80 +80 +134 +81 +81 +141 +88 +89 +154 +96 +99 +170 +102 +106 +180 +111 +114 +193 +117 +120 +201 +124 +127 +208 +130 +133 +214 +134 +135 +217 +135 +136 +216 +138 +137 +217 +139 +138 +214 +139 +139 +209 +139 +138 +206 +138 +136 +209 +137 +135 +210 +137 +133 +210 +136 +131 +211 +138 +131 +211 +137 +130 +207 +140 +132 +205 +139 +132 +199 +141 +133 +192 +141 +134 +185 +141 +134 +175 +135 +130 +162 +126 +120 +146 +127 +110 +129 +131 +90 +104 +125 +84 +90 +108 +87 +84 +99 +92 +82 +92 +96 +79 +91 +95 +72 +102 +90 +68 +122 +83 +66 +149 +74 +68 +187 +83 +82 +209 +83 +87 +219 +82 +89 +230 +93 +100 +231 +102 +106 +224 +108 +108 +227 +118 +113 +228 +117 +110 +226 +111 +104 +247 +126 +118 +255 +130 +123 +255 +135 +126 +244 +108 +96 +201 +63 +50 +193 +56 +40 +192 +59 +40 +191 +61 +39 +191 +61 +39 +192 +60 +39 +194 +59 +39 +197 +58 +39 +199 +56 +40 +205 +55 +41 +216 +58 +47 +217 +56 +46 +210 +56 +44 +207 +57 +43 +204 +58 +43 +201 +58 +42 +200 +57 +41 +201 +55 +40 +207 +57 +43 +209 +55 +43 +210 +56 +44 +209 +55 +43 +207 +55 +42 +204 +56 +42 +203 +60 +44 +203 +62 +45 +202 +60 +48 +201 +61 +48 +202 +60 +50 +201 +59 +47 +200 +58 +48 +198 +56 +44 +197 +55 +45 +197 +53 +42 +208 +64 +55 +208 +64 +53 +205 +61 +52 +201 +57 +46 +203 +56 +48 +206 +59 +49 +205 +58 +50 +204 +53 +44 +208 +47 +37 +217 +48 +41 +228 +50 +48 +236 +50 +53 +244 +47 +56 +249 +45 +57 +251 +43 +59 +252 +44 +60 +252 +45 +63 +251 +46 +63 +252 +47 +64 +252 +47 +64 +254 +47 +65 +255 +47 +63 +255 +45 +63 +255 +46 +64 +255 +40 +56 +251 +40 +55 +247 +43 +55 +245 +48 +58 +241 +54 +61 +237 +56 +61 +228 +56 +56 +221 +53 +52 +220 +57 +52 +220 +58 +53 +222 +59 +54 +226 +58 +55 +229 +57 +53 +231 +56 +53 +234 +54 +53 +236 +52 +52 +241 +52 +56 +241 +52 +56 +239 +53 +54 +237 +55 +54 +230 +55 +50 +225 +54 +47 +218 +54 +44 +215 +53 +42 +216 +56 +42 +214 +57 +40 +214 +57 +40 +216 +57 +38 +216 +57 +38 +217 +56 +38 +218 +55 +38 +217 +56 +38 +213 +56 +37 +213 +58 +38 +214 +59 +39 +213 +61 +40 +212 +61 +40 +211 +62 +42 +211 +61 +44 +211 +61 +46 +208 +55 +47 +215 +60 +56 +255 +93 +100 +255 +96 +111 +255 +80 +103 +240 +60 +89 +255 +66 +104 +250 +55 +95 +255 +55 +95 +242 +52 +88 +237 +78 +108 +215 +92 +113 +148 +64 +79 +91 +38 +46 +71 +40 +45 +63 +49 +48 +49 +46 +41 +52 +54 +43 +58 +62 +47 +60 +65 +43 +58 +61 +34 +62 +61 +30 +80 +74 +40 +94 +92 +53 +121 +133 +83 +144 +163 +108 +170 +190 +139 +168 +190 +141 +142 +165 +119 +111 +139 +91 +97 +127 +75 +94 +127 +70 +96 +132 +68 +99 +136 +66 +101 +141 +68 +106 +147 +71 +111 +148 +78 +112 +149 +80 +111 +147 +83 +111 +147 +83 +111 +148 +78 +108 +146 +73 +105 +142 +73 +103 +140 +71 +105 +140 +76 +105 +140 +76 +105 +139 +79 +104 +138 +78 +102 +133 +74 +101 +132 +73 +100 +131 +72 +101 +132 +73 +103 +133 +73 +104 +134 +72 +103 +133 +71 +101 +133 +68 +105 +142 +73 +105 +145 +75 +108 +148 +78 +43 +49 +37 +46 +52 +42 +52 +55 +48 +56 +57 +51 +62 +58 +55 +66 +61 +58 +72 +65 +59 +75 +68 +60 +78 +72 +60 +78 +71 +61 +79 +74 +68 +87 +83 +82 +95 +94 +102 +102 +101 +117 +103 +103 +127 +103 +102 +134 +98 +97 +137 +91 +89 +138 +81 +81 +133 +78 +79 +135 +82 +83 +147 +91 +94 +163 +101 +105 +179 +108 +111 +190 +117 +119 +202 +122 +124 +209 +127 +129 +214 +131 +133 +216 +134 +135 +217 +134 +135 +215 +136 +135 +213 +137 +136 +212 +135 +135 +205 +134 +134 +204 +134 +132 +205 +133 +130 +207 +133 +128 +210 +133 +128 +210 +135 +127 +212 +135 +128 +208 +141 +133 +210 +140 +133 +201 +141 +133 +192 +140 +134 +182 +139 +133 +169 +132 +128 +155 +123 +118 +138 +124 +106 +120 +129 +87 +97 +126 +81 +86 +109 +85 +81 +100 +94 +80 +92 +100 +77 +89 +97 +73 +99 +93 +69 +118 +87 +67 +146 +78 +69 +183 +85 +82 +209 +84 +90 +219 +82 +90 +231 +92 +99 +231 +98 +103 +228 +104 +106 +231 +113 +111 +236 +121 +114 +230 +113 +104 +247 +124 +116 +243 +115 +106 +254 +120 +109 +230 +92 +81 +196 +59 +43 +190 +53 +35 +194 +59 +39 +193 +61 +40 +193 +61 +40 +195 +60 +40 +196 +59 +40 +200 +59 +41 +203 +57 +42 +207 +55 +42 +214 +53 +43 +216 +55 +45 +212 +58 +46 +206 +58 +44 +199 +58 +41 +196 +56 +39 +198 +58 +41 +202 +61 +44 +207 +61 +46 +214 +64 +50 +217 +65 +52 +214 +62 +49 +206 +56 +42 +200 +52 +38 +202 +56 +41 +203 +60 +44 +201 +58 +44 +200 +58 +44 +201 +59 +47 +201 +59 +45 +202 +58 +47 +200 +57 +43 +200 +53 +43 +199 +53 +40 +202 +54 +44 +207 +59 +47 +210 +62 +52 +211 +63 +51 +214 +63 +54 +213 +62 +51 +206 +55 +46 +201 +44 +35 +210 +43 +37 +220 +45 +42 +231 +48 +50 +240 +51 +57 +246 +49 +59 +250 +48 +60 +253 +48 +63 +253 +48 +63 +249 +48 +64 +247 +49 +64 +247 +49 +64 +246 +48 +61 +247 +47 +60 +247 +45 +57 +250 +44 +57 +250 +42 +55 +252 +46 +59 +248 +46 +58 +245 +48 +58 +240 +51 +58 +237 +54 +59 +231 +55 +58 +224 +54 +54 +218 +53 +51 +220 +57 +52 +221 +58 +53 +223 +58 +54 +226 +58 +55 +229 +57 +53 +231 +56 +53 +234 +54 +53 +236 +52 +52 +242 +53 +57 +242 +53 +57 +240 +54 +55 +237 +55 +54 +230 +55 +52 +223 +54 +47 +218 +54 +45 +214 +54 +42 +213 +55 +43 +212 +56 +41 +212 +56 +41 +212 +57 +39 +213 +56 +39 +213 +56 +37 +215 +55 +39 +212 +57 +37 +208 +57 +36 +206 +60 +37 +207 +61 +38 +207 +63 +39 +206 +64 +40 +206 +64 +42 +206 +63 +46 +208 +60 +48 +208 +55 +49 +232 +72 +72 +255 +103 +113 +254 +78 +98 +255 +72 +100 +246 +56 +90 +255 +66 +108 +246 +49 +92 +255 +57 +96 +234 +55 +87 +221 +83 +106 +185 +87 +102 +107 +50 +57 +71 +41 +43 +71 +55 +58 +59 +50 +51 +56 +51 +48 +58 +55 +48 +57 +59 +45 +53 +58 +35 +51 +56 +24 +66 +68 +29 +102 +99 +58 +129 +131 +84 +159 +174 +119 +169 +193 +135 +181 +206 +151 +175 +199 +147 +146 +174 +125 +118 +148 +98 +101 +134 +81 +96 +130 +70 +96 +133 +66 +99 +136 +66 +103 +143 +70 +109 +150 +74 +114 +152 +79 +114 +151 +82 +113 +149 +85 +112 +148 +84 +111 +148 +78 +108 +145 +75 +104 +141 +72 +102 +139 +70 +104 +139 +75 +105 +140 +76 +105 +139 +78 +105 +139 +79 +103 +134 +75 +102 +133 +74 +101 +132 +73 +102 +133 +73 +104 +136 +73 +105 +137 +72 +105 +135 +71 +102 +134 +67 +106 +143 +74 +107 +147 +77 +110 +150 +80 +40 +48 +35 +43 +49 +39 +47 +52 +45 +51 +53 +48 +55 +54 +52 +60 +56 +53 +64 +61 +56 +67 +62 +56 +73 +69 +60 +72 +69 +60 +75 +72 +67 +82 +80 +81 +91 +91 +101 +97 +98 +116 +98 +98 +124 +96 +96 +130 +95 +94 +136 +90 +88 +138 +84 +84 +138 +84 +84 +144 +92 +93 +160 +103 +105 +179 +112 +115 +196 +118 +120 +205 +123 +127 +216 +126 +130 +219 +131 +132 +222 +132 +134 +221 +132 +133 +216 +131 +132 +214 +133 +132 +212 +134 +133 +209 +131 +134 +203 +130 +133 +202 +131 +131 +205 +130 +129 +207 +131 +127 +211 +133 +128 +212 +136 +128 +214 +136 +128 +211 +141 +133 +210 +139 +132 +200 +139 +131 +188 +139 +132 +176 +137 +130 +163 +129 +124 +146 +119 +113 +127 +117 +102 +109 +125 +86 +91 +121 +81 +81 +107 +87 +78 +101 +95 +79 +93 +101 +77 +91 +100 +73 +100 +96 +71 +116 +91 +69 +140 +82 +70 +176 +91 +84 +202 +89 +91 +214 +85 +90 +226 +91 +97 +230 +93 +100 +231 +98 +101 +237 +109 +108 +245 +122 +115 +237 +114 +106 +247 +120 +111 +222 +89 +80 +229 +91 +80 +210 +68 +56 +195 +53 +39 +199 +58 +41 +197 +58 +39 +196 +60 +38 +197 +61 +39 +200 +61 +40 +202 +59 +42 +205 +58 +42 +208 +56 +42 +212 +54 +42 +211 +48 +39 +212 +51 +41 +210 +56 +44 +205 +59 +44 +199 +59 +42 +194 +59 +40 +192 +59 +40 +195 +60 +41 +200 +59 +42 +213 +67 +52 +225 +75 +61 +222 +72 +58 +211 +61 +47 +202 +52 +38 +201 +53 +39 +205 +59 +44 +200 +57 +41 +200 +57 +41 +200 +57 +43 +200 +57 +41 +202 +56 +43 +202 +56 +41 +203 +55 +43 +203 +55 +41 +205 +54 +43 +210 +60 +46 +215 +63 +52 +216 +64 +51 +218 +64 +54 +219 +65 +53 +215 +58 +49 +210 +49 +41 +220 +48 +46 +229 +49 +52 +238 +52 +57 +245 +54 +62 +249 +52 +62 +249 +49 +62 +250 +48 +64 +248 +47 +63 +242 +46 +60 +239 +47 +60 +237 +47 +57 +237 +48 +55 +239 +45 +53 +239 +44 +50 +242 +43 +50 +241 +42 +49 +244 +49 +57 +244 +50 +58 +242 +53 +59 +236 +53 +57 +229 +53 +55 +225 +53 +53 +223 +55 +54 +221 +56 +54 +220 +56 +54 +221 +57 +55 +223 +58 +54 +227 +58 +55 +230 +56 +55 +233 +55 +55 +234 +54 +55 +236 +52 +54 +244 +53 +58 +244 +53 +58 +241 +55 +58 +238 +56 +55 +230 +55 +52 +224 +55 +48 +218 +54 +45 +212 +54 +42 +211 +55 +42 +209 +56 +42 +208 +56 +42 +208 +57 +40 +208 +57 +40 +208 +57 +38 +209 +56 +40 +208 +57 +38 +203 +57 +34 +200 +58 +34 +200 +62 +36 +199 +63 +37 +200 +64 +40 +200 +64 +42 +203 +62 +45 +206 +59 +49 +213 +58 +54 +250 +85 +91 +255 +94 +111 +255 +71 +97 +253 +62 +95 +254 +58 +96 +255 +56 +102 +250 +53 +98 +244 +58 +95 +230 +71 +99 +192 +80 +96 +135 +64 +72 +84 +50 +51 +67 +53 +52 +68 +57 +61 +62 +51 +55 +66 +51 +54 +64 +53 +49 +58 +56 +43 +54 +60 +34 +57 +67 +30 +80 +92 +46 +125 +132 +80 +159 +168 +113 +176 +197 +138 +175 +203 +142 +176 +204 +146 +166 +195 +141 +146 +174 +125 +123 +153 +101 +103 +136 +81 +95 +129 +69 +94 +131 +64 +99 +137 +64 +105 +143 +68 +111 +149 +74 +115 +153 +80 +115 +152 +83 +113 +149 +85 +111 +147 +83 +110 +147 +78 +107 +144 +74 +103 +140 +71 +101 +138 +69 +103 +138 +74 +104 +139 +75 +105 +139 +78 +105 +139 +78 +102 +136 +75 +100 +134 +73 +100 +134 +73 +101 +136 +72 +103 +138 +74 +104 +139 +73 +105 +137 +72 +102 +137 +69 +106 +146 +76 +108 +150 +78 +111 +153 +81 +38 +46 +33 +40 +48 +37 +45 +50 +43 +49 +51 +46 +51 +51 +49 +55 +54 +52 +58 +57 +53 +60 +59 +54 +71 +68 +61 +68 +68 +60 +71 +70 +66 +79 +79 +81 +90 +90 +100 +95 +97 +112 +94 +96 +121 +92 +92 +126 +96 +95 +137 +92 +90 +140 +89 +88 +145 +92 +92 +154 +103 +103 +173 +113 +115 +192 +122 +124 +209 +127 +128 +220 +129 +132 +225 +130 +133 +228 +133 +134 +227 +132 +133 +225 +131 +131 +219 +129 +130 +213 +131 +130 +210 +131 +130 +206 +132 +135 +204 +131 +134 +201 +132 +132 +204 +131 +130 +206 +133 +130 +211 +135 +130 +214 +138 +130 +215 +140 +131 +212 +141 +133 +208 +140 +131 +196 +139 +130 +183 +138 +130 +171 +133 +127 +155 +127 +120 +136 +115 +110 +117 +111 +99 +99 +117 +87 +85 +114 +84 +76 +105 +87 +75 +102 +95 +77 +99 +101 +77 +97 +100 +73 +102 +96 +70 +115 +93 +70 +125 +79 +63 +159 +89 +77 +184 +89 +83 +197 +83 +82 +215 +86 +90 +226 +87 +92 +233 +90 +96 +240 +100 +101 +247 +114 +109 +241 +110 +102 +247 +113 +104 +209 +68 +59 +212 +65 +55 +197 +49 +37 +200 +52 +38 +212 +67 +50 +199 +57 +37 +199 +58 +38 +201 +59 +39 +205 +60 +41 +208 +58 +43 +211 +58 +44 +216 +56 +44 +217 +55 +44 +207 +44 +35 +206 +48 +37 +206 +54 +41 +203 +60 +44 +199 +64 +45 +193 +62 +42 +190 +59 +39 +188 +55 +36 +192 +52 +35 +209 +66 +50 +227 +79 +65 +228 +78 +64 +216 +66 +52 +203 +55 +41 +203 +55 +41 +208 +62 +47 +202 +59 +43 +201 +58 +42 +199 +56 +40 +198 +55 +39 +200 +54 +39 +202 +54 +40 +206 +56 +42 +208 +56 +43 +211 +59 +46 +213 +59 +47 +213 +57 +45 +210 +54 +42 +213 +55 +44 +218 +60 +49 +221 +60 +50 +220 +55 +49 +232 +56 +56 +241 +56 +61 +247 +58 +65 +251 +57 +66 +250 +52 +65 +245 +47 +60 +242 +44 +59 +239 +44 +58 +237 +47 +59 +234 +49 +57 +234 +51 +56 +235 +52 +56 +237 +53 +55 +241 +53 +54 +244 +51 +54 +243 +53 +55 +239 +50 +54 +238 +53 +58 +236 +56 +59 +233 +54 +57 +226 +52 +53 +222 +52 +52 +223 +55 +54 +225 +60 +58 +221 +56 +54 +222 +57 +55 +225 +57 +54 +227 +58 +55 +230 +56 +55 +233 +55 +55 +234 +54 +55 +236 +52 +54 +244 +53 +58 +244 +53 +58 +241 +55 +58 +236 +56 +57 +230 +57 +53 +223 +56 +50 +216 +55 +47 +211 +55 +43 +208 +56 +43 +205 +58 +42 +205 +57 +43 +204 +59 +42 +205 +58 +42 +205 +58 +40 +205 +58 +42 +204 +59 +40 +197 +57 +34 +194 +58 +34 +195 +61 +36 +194 +62 +37 +195 +63 +40 +198 +63 +43 +201 +61 +46 +205 +56 +49 +220 +60 +62 +255 +93 +102 +255 +81 +103 +255 +72 +100 +250 +56 +91 +255 +63 +103 +246 +46 +92 +251 +62 +104 +228 +61 +91 +224 +93 +111 +162 +76 +85 +91 +45 +45 +71 +56 +51 +70 +66 +63 +64 +55 +58 +67 +52 +57 +71 +48 +54 +70 +50 +49 +64 +57 +41 +63 +68 +38 +69 +86 +42 +96 +116 +63 +139 +157 +97 +170 +190 +127 +177 +203 +140 +171 +201 +139 +166 +195 +139 +157 +186 +132 +142 +172 +122 +123 +153 +101 +102 +135 +80 +90 +124 +64 +94 +129 +63 +97 +135 +62 +104 +142 +67 +111 +149 +74 +114 +152 +79 +114 +151 +82 +112 +148 +84 +110 +146 +82 +110 +147 +78 +106 +143 +73 +102 +139 +70 +100 +137 +68 +102 +137 +73 +104 +139 +75 +105 +139 +78 +105 +139 +78 +102 +136 +75 +101 +135 +74 +100 +135 +71 +101 +136 +70 +103 +138 +72 +104 +139 +71 +104 +139 +71 +101 +138 +68 +107 +147 +76 +109 +151 +79 +112 +154 +82 +40 +48 +33 +39 +47 +34 +40 +45 +38 +41 +46 +40 +46 +48 +45 +51 +51 +49 +55 +56 +51 +57 +58 +52 +61 +61 +53 +63 +64 +56 +68 +69 +64 +74 +76 +75 +79 +82 +89 +86 +88 +101 +90 +92 +115 +93 +94 +125 +89 +88 +130 +91 +89 +139 +94 +93 +150 +101 +101 +163 +110 +110 +182 +119 +120 +200 +127 +129 +216 +132 +133 +226 +140 +140 +238 +140 +140 +240 +138 +138 +236 +134 +135 +228 +130 +130 +220 +128 +128 +214 +130 +128 +211 +131 +130 +206 +128 +131 +198 +129 +133 +197 +131 +131 +201 +132 +132 +206 +134 +131 +208 +136 +131 +211 +139 +132 +210 +140 +132 +207 +138 +128 +197 +138 +128 +188 +137 +128 +175 +135 +125 +160 +128 +120 +143 +119 +111 +122 +107 +101 +103 +102 +93 +88 +106 +92 +81 +108 +92 +77 +104 +92 +76 +102 +94 +75 +101 +95 +73 +102 +96 +72 +106 +96 +71 +114 +94 +70 +114 +79 +59 +135 +84 +65 +166 +92 +79 +193 +96 +89 +209 +89 +88 +220 +81 +84 +237 +83 +91 +247 +92 +96 +249 +104 +101 +230 +89 +80 +212 +68 +60 +206 +55 +48 +209 +55 +47 +215 +58 +49 +214 +61 +47 +212 +59 +43 +207 +57 +40 +205 +58 +38 +207 +57 +40 +209 +58 +41 +212 +56 +41 +216 +56 +42 +220 +53 +44 +220 +53 +44 +208 +47 +37 +205 +51 +41 +204 +56 +44 +202 +62 +47 +197 +64 +47 +193 +64 +45 +190 +61 +42 +188 +57 +39 +194 +57 +41 +190 +48 +34 +233 +87 +74 +223 +75 +63 +195 +47 +35 +209 +61 +49 +206 +60 +47 +199 +56 +40 +202 +59 +43 +201 +58 +41 +200 +57 +40 +199 +56 +39 +200 +55 +38 +201 +54 +38 +203 +53 +38 +204 +52 +38 +208 +55 +41 +215 +59 +46 +220 +62 +50 +220 +60 +48 +217 +55 +44 +218 +56 +45 +226 +62 +52 +236 +67 +60 +245 +66 +69 +242 +57 +63 +240 +50 +60 +246 +52 +63 +246 +50 +64 +241 +45 +59 +237 +45 +58 +237 +50 +61 +236 +55 +62 +230 +53 +59 +228 +54 +56 +229 +55 +56 +235 +57 +57 +240 +58 +57 +241 +55 +56 +239 +55 +55 +242 +59 +61 +238 +60 +60 +234 +58 +58 +230 +56 +55 +225 +56 +53 +223 +55 +52 +220 +55 +53 +220 +55 +53 +222 +57 +55 +225 +57 +56 +227 +57 +57 +230 +58 +58 +233 +57 +59 +236 +57 +60 +237 +57 +60 +239 +56 +60 +244 +55 +59 +243 +54 +58 +240 +56 +58 +237 +57 +58 +231 +59 +57 +224 +59 +53 +215 +57 +48 +207 +55 +44 +202 +56 +43 +200 +57 +41 +199 +57 +43 +198 +58 +41 +199 +58 +41 +199 +58 +40 +200 +59 +42 +199 +60 +41 +193 +57 +35 +196 +61 +39 +190 +58 +35 +182 +52 +30 +188 +57 +37 +201 +68 +51 +206 +64 +54 +201 +49 +44 +255 +95 +101 +255 +87 +103 +255 +75 +98 +252 +61 +92 +245 +51 +88 +242 +50 +89 +247 +56 +99 +240 +69 +105 +228 +91 +111 +171 +71 +81 +110 +52 +51 +78 +51 +44 +67 +63 +54 +65 +66 +60 +66 +54 +56 +66 +43 +49 +77 +46 +51 +77 +49 +46 +67 +56 +38 +68 +74 +40 +88 +110 +61 +125 +155 +95 +155 +186 +119 +167 +198 +130 +171 +203 +140 +159 +190 +130 +152 +182 +128 +148 +178 +126 +130 +160 +110 +102 +132 +82 +88 +118 +66 +89 +123 +63 +93 +128 +62 +99 +135 +65 +105 +143 +68 +110 +148 +73 +109 +149 +76 +108 +148 +78 +107 +146 +79 +108 +145 +78 +105 +142 +73 +102 +138 +68 +99 +134 +66 +99 +134 +66 +102 +137 +73 +104 +139 +75 +102 +138 +76 +100 +136 +74 +103 +139 +77 +104 +140 +78 +103 +139 +75 +102 +139 +72 +101 +138 +69 +102 +139 +69 +106 +143 +73 +107 +147 +74 +113 +155 +81 +113 +157 +82 +114 +158 +83 +42 +48 +34 +41 +47 +35 +41 +46 +39 +41 +46 +40 +45 +47 +44 +49 +51 +48 +53 +54 +49 +55 +56 +50 +59 +60 +52 +62 +63 +55 +65 +68 +61 +72 +74 +71 +79 +80 +84 +83 +85 +97 +88 +89 +107 +90 +92 +117 +92 +90 +127 +94 +93 +137 +100 +98 +148 +107 +106 +164 +117 +116 +186 +127 +126 +206 +135 +135 +223 +139 +140 +233 +141 +141 +239 +140 +140 +240 +137 +137 +235 +133 +132 +226 +128 +128 +216 +128 +126 +210 +128 +127 +207 +130 +130 +204 +133 +134 +199 +134 +135 +199 +135 +136 +201 +137 +136 +204 +139 +136 +207 +140 +134 +206 +141 +134 +204 +142 +133 +200 +138 +128 +188 +137 +127 +177 +134 +124 +161 +130 +120 +147 +123 +115 +130 +116 +107 +112 +108 +98 +96 +100 +93 +83 +99 +96 +79 +98 +96 +75 +101 +94 +75 +102 +94 +75 +105 +92 +73 +108 +93 +72 +110 +94 +71 +113 +93 +69 +121 +93 +71 +130 +89 +67 +149 +88 +70 +173 +90 +76 +199 +86 +80 +221 +83 +83 +243 +82 +88 +254 +89 +95 +240 +85 +83 +227 +76 +69 +217 +62 +57 +213 +54 +48 +217 +54 +47 +220 +57 +48 +219 +57 +44 +214 +57 +40 +211 +56 +38 +209 +56 +38 +209 +56 +40 +212 +56 +41 +215 +55 +41 +220 +54 +42 +223 +52 +44 +221 +53 +44 +206 +48 +39 +201 +53 +41 +200 +57 +43 +198 +61 +45 +196 +65 +47 +193 +64 +45 +191 +60 +42 +190 +57 +40 +196 +56 +41 +203 +60 +46 +228 +82 +69 +220 +72 +60 +200 +52 +40 +204 +58 +45 +200 +58 +44 +194 +52 +38 +202 +61 +44 +203 +60 +43 +202 +59 +42 +202 +59 +42 +203 +58 +41 +204 +57 +41 +206 +56 +41 +207 +54 +40 +211 +55 +42 +214 +56 +44 +217 +55 +44 +215 +51 +41 +213 +49 +39 +216 +49 +40 +222 +55 +46 +231 +60 +53 +248 +68 +71 +241 +56 +62 +237 +47 +57 +239 +47 +58 +240 +48 +61 +238 +46 +59 +235 +49 +60 +235 +54 +63 +228 +53 +58 +220 +51 +54 +216 +50 +50 +223 +58 +56 +238 +69 +66 +248 +73 +70 +248 +68 +67 +243 +63 +62 +233 +58 +55 +231 +57 +56 +229 +57 +55 +226 +57 +54 +225 +56 +53 +224 +56 +53 +225 +57 +56 +225 +57 +56 +224 +56 +55 +226 +56 +56 +229 +57 +57 +231 +57 +58 +233 +57 +59 +236 +57 +60 +237 +57 +60 +238 +55 +59 +243 +54 +58 +242 +53 +57 +238 +54 +56 +234 +56 +56 +228 +59 +56 +220 +58 +53 +211 +57 +47 +203 +55 +43 +198 +56 +42 +195 +58 +42 +194 +58 +42 +192 +59 +42 +192 +59 +42 +193 +60 +41 +193 +60 +43 +193 +60 +41 +189 +57 +36 +193 +63 +41 +187 +58 +37 +179 +53 +31 +185 +58 +39 +192 +60 +47 +201 +58 +50 +215 +61 +61 +255 +95 +103 +255 +81 +100 +253 +67 +91 +246 +57 +87 +242 +57 +91 +242 +61 +96 +240 +64 +100 +224 +74 +101 +170 +64 +76 +131 +63 +62 +95 +58 +50 +72 +58 +47 +59 +61 +48 +59 +61 +50 +73 +59 +58 +85 +61 +61 +81 +47 +46 +84 +55 +47 +87 +75 +53 +100 +104 +69 +119 +143 +91 +140 +176 +112 +154 +195 +125 +159 +199 +129 +152 +186 +125 +154 +185 +128 +154 +182 +131 +141 +169 +120 +114 +142 +94 +89 +117 +69 +84 +112 +61 +92 +123 +66 +95 +127 +64 +98 +134 +64 +105 +141 +67 +109 +147 +72 +108 +148 +75 +107 +147 +76 +105 +144 +77 +105 +144 +77 +103 +140 +71 +101 +137 +67 +99 +134 +66 +99 +134 +68 +103 +138 +74 +105 +140 +76 +104 +140 +78 +103 +139 +77 +105 +141 +79 +105 +141 +77 +105 +142 +75 +103 +140 +71 +103 +140 +70 +102 +142 +69 +108 +146 +73 +109 +149 +76 +112 +156 +81 +111 +157 +82 +114 +158 +83 +45 +49 +34 +45 +49 +35 +44 +47 +38 +44 +46 +41 +47 +47 +45 +49 +49 +47 +51 +52 +47 +52 +53 +45 +57 +59 +48 +60 +62 +49 +64 +66 +55 +69 +72 +65 +75 +77 +76 +81 +82 +87 +85 +85 +97 +86 +87 +105 +92 +89 +116 +94 +93 +127 +102 +100 +140 +112 +110 +160 +122 +120 +183 +133 +131 +206 +141 +139 +223 +144 +144 +234 +144 +142 +239 +142 +140 +237 +138 +137 +231 +135 +132 +223 +129 +127 +211 +127 +124 +203 +127 +125 +200 +128 +127 +195 +134 +134 +196 +136 +136 +196 +138 +138 +198 +140 +139 +199 +140 +138 +201 +140 +136 +197 +140 +132 +191 +139 +130 +183 +137 +128 +175 +134 +124 +161 +128 +118 +145 +123 +112 +129 +117 +106 +114 +110 +100 +99 +105 +94 +88 +99 +93 +81 +93 +98 +76 +93 +98 +75 +97 +95 +74 +103 +92 +74 +109 +90 +73 +112 +91 +72 +114 +92 +71 +114 +92 +69 +122 +96 +73 +123 +87 +63 +137 +82 +61 +164 +85 +68 +199 +88 +79 +224 +86 +83 +245 +80 +84 +252 +79 +83 +226 +62 +60 +222 +60 +55 +221 +56 +52 +222 +55 +49 +225 +54 +47 +225 +54 +46 +221 +55 +43 +218 +55 +40 +212 +55 +38 +211 +56 +36 +211 +56 +38 +213 +56 +39 +216 +54 +41 +221 +53 +42 +224 +51 +44 +221 +53 +44 +203 +51 +40 +196 +54 +40 +194 +57 +41 +193 +60 +43 +194 +63 +45 +194 +63 +45 +193 +60 +43 +192 +56 +40 +195 +53 +39 +220 +74 +61 +218 +70 +58 +213 +65 +53 +206 +60 +47 +196 +54 +40 +196 +59 +43 +190 +54 +38 +198 +58 +41 +199 +58 +41 +199 +58 +41 +201 +58 +42 +202 +56 +41 +203 +55 +41 +204 +54 +40 +205 +51 +39 +213 +57 +45 +213 +55 +44 +214 +51 +42 +215 +51 +42 +218 +51 +43 +223 +54 +47 +229 +58 +51 +233 +60 +56 +240 +60 +61 +237 +52 +57 +235 +48 +55 +236 +49 +56 +238 +51 +60 +237 +52 +60 +235 +55 +64 +234 +61 +67 +221 +55 +59 +225 +65 +65 +236 +78 +75 +248 +89 +85 +253 +90 +85 +250 +81 +76 +239 +66 +62 +229 +56 +52 +226 +54 +50 +224 +55 +50 +224 +55 +50 +224 +55 +50 +225 +56 +53 +226 +57 +54 +228 +59 +56 +228 +59 +56 +225 +55 +55 +228 +56 +56 +230 +56 +58 +232 +56 +59 +235 +56 +60 +235 +56 +60 +235 +56 +60 +236 +56 +59 +239 +53 +56 +238 +52 +55 +236 +53 +55 +231 +55 +55 +226 +58 +55 +217 +58 +52 +207 +56 +47 +199 +55 +44 +194 +56 +43 +191 +58 +43 +189 +59 +43 +187 +60 +43 +187 +60 +43 +187 +60 +41 +187 +60 +43 +187 +60 +41 +184 +57 +38 +189 +64 +42 +179 +57 +36 +177 +54 +36 +182 +59 +43 +180 +49 +39 +194 +52 +48 +235 +80 +84 +255 +92 +105 +254 +75 +96 +243 +59 +85 +237 +57 +86 +238 +65 +93 +236 +73 +102 +227 +75 +100 +202 +79 +97 +130 +56 +57 +102 +62 +54 +85 +63 +50 +71 +64 +48 +59 +60 +44 +56 +54 +41 +65 +52 +43 +78 +55 +47 +72 +43 +35 +83 +60 +44 +103 +93 +66 +129 +136 +95 +146 +171 +116 +149 +188 +123 +148 +194 +122 +149 +192 +123 +146 +180 +120 +156 +184 +133 +154 +180 +133 +128 +154 +109 +92 +117 +75 +72 +98 +53 +78 +104 +56 +91 +120 +66 +95 +125 +63 +99 +131 +64 +104 +140 +68 +108 +146 +71 +106 +146 +73 +104 +146 +74 +103 +144 +76 +102 +143 +75 +100 +137 +68 +100 +135 +67 +99 +134 +68 +101 +136 +70 +104 +139 +75 +107 +142 +78 +107 +143 +79 +106 +142 +78 +105 +144 +79 +105 +144 +79 +105 +144 +77 +104 +144 +74 +103 +143 +72 +104 +146 +72 +108 +148 +75 +111 +153 +77 +115 +161 +86 +115 +163 +87 +117 +163 +88 +50 +52 +38 +48 +52 +38 +48 +49 +41 +48 +49 +43 +49 +50 +45 +50 +51 +46 +51 +52 +46 +52 +54 +43 +57 +59 +45 +59 +62 +45 +63 +65 +51 +68 +70 +57 +73 +74 +68 +77 +79 +78 +82 +81 +87 +83 +83 +93 +88 +86 +100 +92 +90 +111 +100 +97 +126 +110 +108 +148 +122 +119 +172 +132 +130 +195 +140 +137 +214 +145 +143 +227 +148 +145 +234 +147 +144 +235 +142 +139 +226 +137 +133 +217 +130 +127 +204 +127 +124 +195 +127 +124 +191 +128 +126 +189 +132 +131 +189 +134 +133 +190 +137 +136 +193 +141 +138 +193 +139 +136 +189 +137 +133 +183 +135 +127 +174 +133 +125 +166 +133 +123 +157 +128 +118 +143 +121 +110 +127 +114 +102 +112 +109 +97 +99 +107 +93 +90 +105 +90 +83 +99 +91 +78 +92 +97 +75 +90 +98 +74 +97 +95 +74 +103 +92 +74 +111 +89 +75 +115 +89 +74 +117 +90 +73 +119 +91 +70 +118 +86 +65 +123 +81 +59 +139 +81 +61 +171 +88 +70 +205 +91 +80 +226 +84 +80 +237 +71 +73 +239 +63 +65 +219 +50 +47 +220 +53 +47 +225 +53 +49 +227 +54 +48 +227 +53 +46 +225 +53 +43 +224 +54 +41 +219 +56 +41 +214 +55 +36 +211 +56 +36 +209 +56 +38 +212 +57 +39 +216 +54 +41 +220 +54 +42 +224 +51 +44 +218 +54 +45 +200 +54 +41 +189 +56 +39 +188 +55 +38 +189 +58 +40 +191 +62 +43 +194 +63 +45 +195 +59 +43 +196 +56 +41 +198 +52 +39 +233 +85 +73 +211 +60 +49 +204 +56 +44 +209 +66 +52 +190 +53 +37 +192 +61 +43 +192 +61 +43 +192 +56 +40 +196 +56 +39 +197 +57 +40 +199 +58 +41 +200 +57 +41 +203 +55 +41 +204 +54 +40 +205 +51 +39 +210 +54 +42 +212 +51 +41 +213 +50 +41 +219 +52 +44 +227 +58 +51 +233 +62 +55 +236 +63 +57 +236 +61 +58 +232 +52 +53 +236 +53 +57 +239 +54 +59 +238 +53 +59 +234 +50 +58 +230 +51 +57 +228 +55 +61 +226 +60 +64 +243 +85 +86 +252 +98 +98 +255 +109 +106 +255 +105 +100 +243 +86 +81 +228 +65 +60 +223 +54 +51 +221 +52 +47 +223 +54 +49 +222 +55 +49 +222 +55 +49 +223 +56 +50 +225 +56 +53 +226 +57 +54 +229 +57 +55 +230 +58 +56 +229 +55 +56 +230 +56 +57 +232 +56 +59 +233 +57 +60 +235 +56 +60 +235 +56 +60 +235 +56 +60 +236 +55 +60 +238 +53 +58 +238 +54 +56 +234 +54 +55 +229 +57 +55 +223 +60 +55 +214 +60 +52 +204 +57 +47 +197 +57 +44 +190 +57 +42 +186 +59 +42 +182 +59 +41 +181 +60 +41 +181 +60 +43 +180 +61 +41 +179 +59 +42 +179 +60 +40 +179 +58 +39 +183 +64 +44 +173 +56 +38 +173 +56 +39 +179 +59 +45 +171 +43 +34 +193 +53 +52 +252 +97 +103 +253 +85 +100 +249 +72 +92 +238 +62 +85 +232 +62 +88 +229 +73 +95 +220 +81 +100 +206 +81 +95 +177 +85 +90 +119 +70 +65 +92 +70 +57 +79 +66 +50 +74 +67 +49 +70 +67 +48 +64 +61 +42 +61 +54 +35 +61 +50 +30 +65 +50 +29 +81 +70 +42 +110 +107 +72 +138 +147 +102 +149 +172 +116 +145 +180 +116 +141 +184 +115 +144 +186 +120 +157 +187 +133 +161 +184 +138 +144 +167 +125 +108 +130 +91 +75 +95 +58 +65 +87 +48 +76 +99 +55 +87 +114 +63 +95 +123 +64 +100 +131 +64 +105 +138 +67 +107 +145 +70 +105 +145 +72 +103 +145 +71 +100 +143 +72 +101 +142 +74 +98 +135 +66 +99 +134 +66 +100 +135 +69 +103 +138 +72 +106 +141 +77 +108 +143 +79 +109 +145 +81 +110 +146 +82 +106 +145 +80 +106 +145 +78 +106 +146 +76 +104 +146 +74 +103 +145 +71 +105 +147 +71 +109 +151 +75 +112 +156 +79 +119 +166 +88 +118 +166 +90 +118 +166 +90 +55 +56 +40 +54 +56 +42 +54 +54 +44 +53 +54 +46 +53 +54 +48 +53 +54 +48 +54 +55 +47 +54 +56 +43 +59 +62 +45 +61 +64 +45 +64 +67 +46 +68 +71 +52 +73 +75 +62 +77 +78 +70 +81 +80 +78 +82 +82 +82 +86 +85 +83 +89 +88 +93 +97 +95 +108 +107 +105 +129 +117 +115 +155 +128 +125 +178 +136 +134 +199 +140 +138 +211 +149 +146 +225 +148 +145 +226 +144 +141 +220 +139 +135 +211 +132 +129 +196 +129 +125 +186 +127 +124 +181 +127 +124 +179 +129 +126 +181 +132 +129 +182 +135 +133 +183 +137 +134 +181 +138 +132 +176 +134 +128 +166 +129 +122 +155 +128 +119 +146 +127 +115 +135 +122 +110 +124 +114 +101 +108 +109 +95 +95 +106 +91 +88 +105 +90 +83 +106 +89 +79 +102 +90 +76 +97 +96 +76 +95 +97 +76 +100 +95 +76 +105 +92 +75 +110 +91 +76 +116 +90 +75 +122 +90 +75 +125 +90 +71 +127 +84 +65 +136 +81 +61 +157 +81 +65 +182 +86 +70 +205 +83 +72 +216 +72 +64 +223 +58 +56 +226 +52 +51 +221 +49 +45 +223 +51 +47 +226 +53 +47 +227 +53 +46 +225 +51 +44 +223 +51 +41 +221 +53 +40 +220 +57 +40 +211 +56 +36 +208 +57 +36 +207 +58 +38 +209 +58 +39 +212 +56 +41 +217 +55 +42 +221 +53 +44 +216 +55 +45 +196 +59 +43 +185 +58 +41 +181 +54 +37 +183 +56 +39 +189 +59 +43 +194 +61 +46 +199 +59 +46 +199 +55 +44 +208 +57 +48 +245 +92 +84 +214 +61 +53 +201 +53 +43 +207 +65 +53 +184 +51 +36 +183 +58 +40 +188 +63 +43 +191 +58 +41 +195 +58 +42 +198 +58 +43 +200 +58 +44 +202 +59 +45 +204 +58 +45 +207 +56 +45 +209 +55 +45 +208 +51 +42 +210 +49 +41 +214 +49 +43 +222 +55 +49 +229 +60 +55 +234 +62 +58 +232 +59 +55 +230 +55 +52 +233 +55 +53 +239 +59 +60 +240 +60 +63 +234 +54 +57 +228 +49 +53 +228 +53 +58 +232 +66 +70 +237 +77 +79 +255 +120 +119 +255 +113 +110 +241 +96 +91 +221 +74 +67 +209 +56 +51 +209 +50 +46 +220 +55 +51 +231 +64 +58 +224 +57 +51 +224 +57 +49 +224 +55 +50 +224 +55 +50 +226 +54 +50 +227 +55 +51 +229 +55 +54 +229 +55 +54 +230 +54 +56 +231 +55 +57 +234 +55 +59 +235 +56 +60 +235 +56 +62 +235 +56 +62 +232 +55 +61 +234 +55 +59 +238 +55 +59 +238 +55 +57 +234 +55 +58 +228 +58 +58 +223 +61 +58 +214 +61 +55 +203 +59 +50 +195 +59 +47 +186 +56 +42 +181 +58 +42 +179 +59 +42 +175 +60 +41 +175 +60 +42 +172 +60 +40 +172 +59 +41 +172 +59 +41 +170 +59 +40 +172 +61 +42 +166 +56 +39 +167 +57 +42 +170 +56 +45 +171 +48 +41 +203 +64 +67 +255 +105 +114 +243 +78 +94 +241 +72 +91 +235 +69 +89 +226 +73 +91 +215 +80 +94 +199 +85 +93 +178 +86 +87 +153 +90 +85 +103 +75 +63 +83 +74 +57 +80 +68 +52 +78 +67 +49 +73 +67 +45 +66 +64 +39 +63 +66 +35 +65 +71 +35 +77 +85 +46 +94 +103 +60 +120 +129 +84 +139 +153 +102 +145 +164 +109 +141 +169 +110 +143 +178 +114 +151 +185 +125 +157 +183 +136 +146 +167 +128 +117 +134 +100 +82 +99 +67 +63 +80 +48 +66 +83 +49 +79 +97 +57 +86 +108 +61 +98 +123 +66 +101 +130 +66 +105 +138 +67 +106 +144 +69 +105 +146 +70 +101 +145 +70 +98 +144 +72 +99 +142 +71 +98 +135 +66 +102 +134 +67 +103 +138 +72 +105 +140 +74 +107 +142 +78 +109 +144 +80 +110 +146 +82 +111 +147 +83 +106 +145 +78 +107 +146 +79 +106 +147 +77 +105 +147 +75 +105 +147 +73 +106 +150 +73 +110 +154 +75 +114 +158 +79 +120 +167 +89 +118 +167 +88 +118 +167 +88 +63 +61 +46 +61 +62 +46 +61 +61 +49 +61 +61 +51 +61 +61 +53 +59 +60 +52 +59 +61 +50 +59 +61 +47 +63 +66 +47 +64 +68 +45 +67 +71 +46 +70 +74 +51 +75 +76 +58 +78 +79 +65 +81 +81 +73 +82 +82 +72 +89 +87 +74 +90 +90 +78 +95 +94 +92 +103 +101 +114 +113 +110 +137 +123 +121 +161 +131 +128 +183 +135 +133 +196 +143 +140 +209 +143 +140 +211 +141 +138 +207 +138 +133 +199 +131 +127 +186 +126 +121 +175 +122 +119 +166 +121 +118 +165 +123 +119 +169 +124 +122 +171 +128 +125 +170 +131 +126 +166 +131 +125 +161 +127 +121 +149 +124 +116 +137 +122 +114 +129 +118 +107 +115 +114 +102 +104 +109 +95 +94 +106 +91 +86 +107 +90 +82 +108 +90 +80 +108 +90 +78 +107 +91 +78 +103 +94 +77 +102 +95 +77 +103 +94 +77 +106 +93 +77 +110 +93 +77 +118 +92 +77 +124 +92 +77 +131 +89 +73 +150 +94 +79 +157 +85 +71 +169 +77 +64 +185 +73 +61 +197 +64 +55 +204 +56 +46 +213 +50 +43 +221 +50 +43 +225 +53 +49 +225 +54 +47 +226 +53 +46 +226 +52 +45 +224 +50 +41 +222 +52 +39 +220 +54 +38 +218 +59 +40 +209 +57 +36 +205 +59 +36 +204 +59 +38 +206 +59 +39 +209 +58 +41 +213 +57 +42 +217 +55 +44 +211 +57 +45 +193 +62 +44 +180 +59 +40 +176 +53 +35 +178 +53 +35 +187 +57 +41 +196 +60 +46 +201 +59 +47 +203 +55 +45 +217 +63 +55 +248 +91 +84 +227 +73 +65 +206 +58 +48 +204 +64 +51 +184 +54 +38 +172 +51 +32 +181 +60 +41 +188 +57 +39 +191 +55 +39 +192 +55 +39 +195 +55 +40 +197 +55 +41 +201 +55 +42 +206 +55 +44 +209 +55 +45 +217 +60 +51 +219 +58 +50 +222 +57 +51 +229 +60 +55 +234 +62 +58 +234 +61 +57 +231 +56 +53 +227 +52 +49 +232 +57 +54 +235 +60 +57 +236 +58 +58 +232 +56 +58 +236 +62 +64 +248 +80 +80 +255 +98 +99 +255 +112 +112 +249 +104 +101 +226 +84 +80 +202 +61 +54 +192 +49 +43 +201 +52 +48 +214 +59 +55 +223 +61 +58 +224 +59 +55 +226 +59 +53 +225 +58 +50 +226 +57 +52 +225 +56 +51 +227 +55 +51 +228 +55 +51 +229 +53 +53 +230 +54 +54 +233 +54 +57 +233 +54 +57 +234 +55 +59 +235 +56 +60 +235 +56 +62 +234 +55 +61 +232 +55 +61 +233 +54 +58 +239 +56 +60 +236 +56 +57 +232 +56 +58 +227 +59 +58 +221 +62 +58 +211 +62 +55 +201 +60 +50 +192 +60 +47 +182 +56 +41 +178 +58 +41 +174 +59 +41 +170 +59 +40 +169 +60 +40 +168 +59 +39 +165 +58 +38 +165 +58 +40 +165 +60 +41 +160 +57 +40 +160 +59 +41 +160 +57 +42 +162 +54 +42 +181 +62 +56 +219 +84 +88 +249 +102 +112 +237 +76 +92 +237 +74 +93 +231 +76 +92 +216 +78 +91 +198 +83 +90 +177 +87 +86 +156 +92 +82 +136 +97 +82 +84 +71 +55 +77 +74 +57 +83 +70 +53 +77 +62 +43 +63 +51 +27 +57 +54 +23 +65 +77 +37 +78 +102 +54 +108 +138 +84 +119 +148 +92 +132 +155 +101 +137 +154 +100 +141 +155 +102 +144 +163 +107 +148 +173 +116 +152 +176 +124 +131 +149 +109 +110 +125 +92 +81 +96 +67 +60 +74 +48 +57 +70 +44 +65 +80 +49 +79 +95 +59 +87 +106 +61 +99 +122 +68 +101 +130 +66 +106 +139 +68 +107 +145 +70 +105 +146 +70 +101 +145 +70 +97 +143 +70 +99 +142 +71 +99 +136 +67 +105 +137 +70 +106 +141 +75 +108 +143 +77 +108 +143 +79 +108 +143 +79 +109 +145 +81 +110 +146 +82 +109 +148 +81 +109 +149 +79 +109 +150 +80 +108 +150 +76 +107 +151 +74 +109 +153 +74 +114 +159 +78 +115 +162 +81 +124 +173 +94 +123 +172 +93 +122 +171 +92 +68 +65 +48 +68 +66 +51 +68 +66 +54 +67 +67 +57 +67 +67 +59 +67 +67 +59 +66 +66 +54 +66 +67 +51 +68 +70 +48 +69 +72 +45 +71 +74 +45 +74 +77 +50 +79 +78 +57 +82 +81 +63 +84 +82 +69 +85 +83 +68 +92 +90 +67 +92 +92 +68 +92 +93 +79 +97 +97 +97 +105 +104 +120 +114 +113 +144 +123 +122 +166 +129 +126 +181 +134 +130 +191 +136 +131 +195 +136 +132 +193 +132 +129 +186 +127 +123 +174 +121 +115 +161 +116 +111 +151 +111 +109 +148 +112 +109 +154 +114 +111 +158 +118 +113 +154 +119 +115 +150 +119 +115 +142 +116 +111 +131 +115 +107 +120 +114 +105 +110 +109 +97 +97 +108 +95 +89 +106 +92 +83 +107 +90 +80 +109 +91 +79 +111 +91 +80 +111 +92 +78 +111 +92 +78 +110 +92 +78 +109 +93 +78 +107 +94 +78 +108 +95 +79 +111 +95 +79 +117 +96 +79 +125 +93 +78 +137 +89 +77 +161 +95 +83 +167 +79 +69 +174 +66 +56 +186 +59 +50 +197 +55 +45 +204 +50 +40 +212 +51 +41 +220 +53 +44 +224 +55 +48 +225 +54 +47 +225 +52 +45 +224 +51 +44 +224 +52 +42 +221 +53 +40 +216 +55 +37 +212 +57 +37 +207 +58 +34 +202 +61 +34 +201 +61 +36 +202 +62 +39 +205 +60 +41 +210 +59 +42 +213 +57 +44 +207 +59 +45 +191 +64 +45 +177 +60 +40 +172 +53 +33 +174 +51 +33 +186 +56 +40 +196 +60 +46 +202 +58 +47 +206 +53 +45 +216 +57 +51 +240 +78 +73 +241 +84 +77 +217 +66 +57 +204 +66 +53 +190 +63 +46 +166 +49 +29 +179 +60 +40 +190 +60 +44 +193 +57 +43 +193 +55 +42 +194 +54 +41 +197 +55 +43 +201 +57 +46 +207 +59 +49 +212 +59 +51 +225 +68 +61 +227 +65 +60 +228 +63 +59 +231 +62 +59 +233 +61 +59 +233 +59 +58 +232 +56 +56 +231 +56 +53 +231 +56 +53 +230 +57 +53 +230 +55 +52 +233 +59 +58 +244 +74 +74 +255 +92 +91 +255 +100 +99 +248 +99 +95 +204 +61 +57 +193 +56 +50 +189 +52 +46 +195 +56 +49 +213 +65 +61 +222 +69 +64 +223 +61 +59 +217 +52 +50 +226 +59 +53 +226 +59 +51 +226 +57 +52 +226 +57 +52 +228 +56 +52 +229 +56 +52 +231 +55 +55 +233 +55 +55 +234 +54 +57 +235 +55 +58 +235 +54 +59 +235 +56 +60 +235 +56 +62 +232 +55 +61 +232 +55 +61 +233 +54 +58 +235 +55 +58 +233 +54 +57 +230 +56 +57 +224 +59 +57 +219 +62 +57 +209 +62 +54 +198 +60 +49 +190 +60 +46 +179 +56 +41 +174 +59 +41 +170 +59 +40 +166 +59 +39 +164 +59 +40 +163 +58 +39 +163 +58 +39 +160 +57 +38 +161 +62 +43 +150 +55 +37 +156 +61 +43 +154 +57 +41 +154 +50 +39 +195 +80 +75 +237 +107 +109 +237 +93 +102 +235 +80 +94 +232 +75 +92 +220 +74 +87 +202 +77 +83 +182 +84 +83 +161 +93 +82 +142 +101 +81 +127 +106 +85 +78 +75 +56 +75 +72 +55 +80 +63 +47 +76 +55 +36 +69 +53 +27 +71 +71 +35 +87 +111 +61 +105 +146 +86 +127 +178 +111 +130 +179 +113 +131 +165 +104 +125 +146 +89 +131 +141 +89 +142 +150 +99 +137 +151 +100 +124 +140 +95 +88 +102 +67 +71 +84 +56 +57 +69 +45 +54 +66 +42 +58 +68 +44 +61 +74 +48 +74 +88 +55 +87 +104 +62 +101 +124 +70 +104 +130 +67 +108 +139 +69 +108 +144 +70 +105 +147 +71 +99 +145 +70 +97 +145 +71 +97 +143 +71 +102 +139 +70 +108 +140 +73 +109 +144 +78 +110 +145 +79 +108 +143 +79 +107 +142 +78 +107 +143 +79 +109 +145 +81 +112 +151 +84 +113 +153 +83 +112 +153 +83 +112 +154 +80 +111 +155 +78 +113 +157 +78 +116 +163 +82 +119 +166 +85 +126 +175 +96 +123 +174 +95 +121 +172 +93 +73 +67 +51 +74 +68 +54 +73 +69 +57 +73 +69 +58 +73 +71 +59 +73 +71 +59 +72 +70 +57 +72 +71 +53 +73 +72 +51 +74 +74 +50 +76 +76 +50 +78 +78 +52 +82 +80 +59 +84 +81 +62 +88 +82 +68 +89 +84 +65 +93 +89 +62 +91 +90 +62 +92 +89 +72 +94 +91 +84 +100 +97 +104 +110 +107 +126 +120 +115 +147 +125 +120 +160 +129 +123 +167 +131 +125 +171 +133 +127 +173 +131 +124 +166 +125 +119 +157 +117 +110 +143 +111 +105 +133 +107 +103 +130 +105 +102 +133 +106 +103 +134 +109 +104 +134 +109 +105 +128 +109 +105 +120 +108 +103 +110 +107 +98 +101 +106 +96 +94 +103 +93 +84 +104 +92 +80 +104 +90 +77 +107 +91 +76 +110 +93 +77 +113 +94 +79 +113 +94 +79 +112 +93 +78 +112 +93 +79 +111 +93 +79 +112 +93 +78 +115 +93 +79 +119 +93 +78 +126 +93 +78 +137 +91 +76 +147 +87 +76 +162 +84 +72 +166 +69 +60 +171 +57 +47 +186 +55 +45 +200 +56 +47 +211 +54 +45 +217 +54 +45 +221 +54 +45 +223 +54 +47 +223 +52 +45 +223 +52 +44 +223 +52 +44 +223 +55 +44 +221 +55 +41 +216 +54 +39 +209 +54 +36 +207 +58 +36 +204 +60 +36 +202 +60 +38 +203 +61 +39 +206 +59 +41 +209 +59 +42 +211 +58 +44 +206 +60 +45 +190 +65 +47 +175 +60 +39 +168 +51 +33 +172 +51 +32 +182 +57 +39 +193 +61 +46 +201 +59 +47 +204 +56 +46 +204 +50 +42 +224 +65 +59 +248 +91 +84 +224 +73 +64 +208 +68 +55 +202 +70 +55 +171 +50 +31 +184 +63 +44 +202 +70 +55 +204 +66 +53 +202 +64 +51 +203 +63 +50 +205 +63 +51 +210 +66 +55 +220 +69 +60 +225 +71 +63 +226 +64 +59 +226 +61 +57 +227 +58 +55 +226 +54 +52 +226 +54 +52 +227 +55 +53 +229 +57 +55 +229 +60 +57 +228 +63 +57 +224 +61 +54 +221 +58 +53 +225 +63 +58 +234 +77 +72 +234 +81 +76 +211 +64 +57 +184 +41 +35 +184 +45 +38 +190 +53 +45 +201 +62 +55 +208 +65 +59 +214 +62 +57 +217 +59 +56 +225 +59 +59 +231 +61 +61 +226 +57 +54 +226 +57 +54 +226 +57 +54 +228 +56 +54 +229 +57 +53 +231 +58 +54 +233 +57 +57 +234 +58 +58 +234 +56 +56 +234 +56 +56 +235 +56 +59 +235 +56 +59 +233 +57 +60 +232 +56 +59 +231 +55 +58 +231 +55 +58 +233 +54 +58 +230 +54 +56 +226 +56 +56 +222 +58 +56 +214 +61 +56 +204 +61 +53 +194 +60 +49 +185 +59 +45 +174 +57 +40 +170 +59 +42 +166 +59 +41 +162 +59 +40 +160 +59 +39 +158 +59 +38 +159 +58 +40 +155 +58 +39 +152 +63 +45 +140 +53 +34 +153 +61 +46 +152 +56 +42 +151 +47 +38 +205 +92 +88 +246 +122 +124 +222 +88 +95 +229 +89 +100 +217 +81 +91 +200 +77 +82 +183 +77 +79 +167 +87 +80 +155 +97 +85 +141 +104 +85 +128 +110 +86 +84 +84 +56 +67 +72 +42 +66 +57 +28 +72 +59 +27 +88 +80 +43 +110 +116 +68 +132 +162 +102 +148 +193 +126 +135 +188 +118 +134 +184 +115 +124 +158 +97 +110 +130 +77 +117 +126 +81 +130 +135 +94 +117 +125 +86 +91 +98 +64 +59 +68 +41 +52 +60 +37 +53 +61 +40 +61 +68 +50 +60 +69 +50 +57 +67 +43 +67 +80 +50 +85 +101 +62 +103 +123 +72 +105 +131 +70 +108 +139 +71 +109 +145 +71 +106 +147 +71 +102 +146 +71 +98 +144 +71 +99 +142 +71 +104 +141 +74 +108 +143 +77 +111 +146 +80 +110 +147 +80 +108 +143 +77 +105 +142 +75 +106 +143 +74 +106 +146 +76 +115 +155 +84 +115 +157 +85 +115 +157 +83 +114 +158 +81 +114 +158 +79 +115 +162 +82 +119 +166 +85 +122 +171 +90 +119 +167 +91 +117 +165 +91 +116 +164 +90 +82 +75 +59 +82 +75 +59 +82 +74 +61 +82 +74 +61 +82 +74 +61 +82 +74 +61 +82 +74 +61 +82 +75 +59 +85 +78 +60 +86 +79 +61 +87 +80 +62 +88 +81 +63 +89 +82 +64 +91 +84 +68 +92 +85 +69 +92 +85 +69 +98 +91 +72 +97 +90 +72 +97 +89 +76 +98 +89 +82 +101 +93 +91 +107 +97 +105 +113 +102 +116 +117 +106 +123 +122 +110 +132 +124 +112 +136 +127 +115 +139 +127 +115 +137 +124 +112 +132 +117 +106 +123 +109 +98 +114 +101 +93 +106 +99 +96 +105 +96 +95 +101 +95 +93 +98 +95 +90 +94 +94 +90 +89 +94 +89 +85 +97 +90 +82 +98 +90 +79 +101 +91 +79 +103 +91 +75 +105 +92 +75 +107 +92 +73 +107 +92 +71 +109 +92 +72 +109 +93 +70 +106 +94 +72 +106 +98 +79 +114 +101 +84 +113 +90 +74 +117 +79 +66 +139 +87 +74 +156 +92 +80 +162 +90 +76 +170 +91 +76 +164 +78 +61 +165 +70 +52 +166 +60 +44 +176 +56 +40 +194 +56 +45 +210 +56 +48 +221 +52 +49 +222 +49 +45 +223 +54 +47 +222 +55 +46 +222 +55 +46 +222 +55 +46 +222 +55 +46 +219 +55 +43 +216 +54 +41 +215 +55 +41 +213 +56 +41 +212 +56 +41 +210 +57 +41 +210 +57 +41 +210 +57 +43 +210 +57 +43 +212 +56 +43 +205 +59 +44 +189 +59 +43 +182 +62 +45 +174 +57 +40 +169 +49 +32 +171 +50 +33 +183 +57 +42 +192 +60 +47 +195 +57 +46 +200 +53 +43 +206 +53 +45 +212 +58 +48 +219 +67 +56 +221 +75 +62 +212 +72 +57 +194 +61 +44 +183 +50 +35 +221 +80 +70 +216 +74 +64 +212 +70 +60 +211 +69 +59 +215 +73 +63 +219 +72 +64 +221 +68 +62 +223 +61 +58 +223 +55 +52 +230 +56 +55 +234 +58 +58 +234 +58 +58 +229 +57 +55 +224 +55 +52 +222 +57 +51 +220 +61 +55 +220 +69 +62 +209 +65 +57 +199 +57 +47 +191 +50 +40 +185 +48 +38 +186 +52 +41 +191 +59 +47 +195 +63 +51 +195 +58 +48 +199 +61 +51 +208 +64 +55 +217 +64 +58 +224 +62 +59 +229 +60 +57 +233 +57 +57 +236 +58 +58 +230 +56 +58 +229 +56 +58 +229 +56 +58 +229 +57 +57 +229 +57 +55 +229 +57 +55 +229 +57 +53 +229 +57 +53 +224 +52 +48 +225 +53 +49 +228 +54 +53 +229 +55 +54 +230 +56 +57 +231 +57 +58 +231 +57 +58 +231 +57 +59 +235 +59 +62 +230 +57 +59 +223 +57 +57 +220 +61 +58 +214 +65 +61 +205 +66 +59 +193 +65 +54 +183 +63 +49 +169 +58 +41 +163 +60 +43 +160 +61 +42 +155 +60 +40 +153 +58 +38 +150 +58 +37 +151 +56 +38 +145 +56 +38 +144 +65 +48 +139 +60 +45 +135 +47 +35 +145 +47 +38 +188 +76 +74 +228 +109 +111 +229 +109 +111 +205 +86 +90 +189 +76 +78 +181 +78 +79 +170 +81 +77 +162 +85 +79 +155 +88 +79 +150 +93 +82 +149 +97 +84 +138 +106 +83 +88 +89 +47 +61 +75 +22 +56 +69 +15 +86 +97 +41 +127 +141 +80 +155 +176 +111 +161 +188 +121 +156 +189 +120 +146 +181 +115 +126 +157 +97 +104 +128 +76 +92 +109 +67 +89 +100 +66 +84 +93 +66 +72 +80 +57 +63 +68 +48 +58 +61 +44 +64 +67 +50 +60 +64 +49 +58 +62 +48 +60 +67 +51 +58 +67 +48 +65 +78 +50 +82 +100 +62 +93 +115 +66 +103 +131 +72 +112 +143 +75 +111 +147 +75 +108 +146 +71 +106 +146 +73 +105 +147 +75 +103 +144 +74 +108 +144 +80 +109 +145 +83 +111 +147 +83 +108 +147 +80 +109 +146 +77 +107 +147 +74 +109 +150 +74 +109 +152 +73 +113 +156 +76 +113 +158 +77 +114 +159 +78 +114 +161 +80 +116 +163 +82 +118 +167 +85 +121 +170 +89 +122 +170 +94 +123 +168 +101 +111 +155 +92 +101 +145 +82 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +87 +78 +63 +88 +79 +64 +89 +80 +65 +89 +80 +65 +91 +82 +67 +92 +83 +68 +93 +84 +69 +94 +85 +70 +95 +86 +71 +100 +91 +74 +99 +90 +73 +99 +89 +77 +99 +89 +79 +102 +91 +85 +106 +95 +93 +110 +98 +100 +112 +100 +104 +114 +101 +108 +116 +103 +112 +118 +105 +114 +118 +105 +114 +115 +102 +109 +109 +96 +103 +103 +91 +95 +98 +88 +89 +94 +91 +86 +90 +90 +82 +89 +86 +79 +87 +84 +75 +88 +84 +73 +88 +84 +72 +92 +86 +72 +94 +87 +71 +99 +90 +75 +99 +90 +73 +102 +91 +73 +103 +92 +72 +105 +93 +71 +106 +94 +70 +107 +95 +71 +106 +95 +73 +102 +97 +77 +111 +103 +84 +119 +91 +77 +129 +83 +70 +153 +86 +77 +168 +88 +79 +175 +82 +74 +180 +82 +69 +173 +73 +57 +170 +67 +48 +171 +61 +44 +177 +57 +41 +190 +56 +44 +204 +55 +48 +216 +52 +50 +220 +51 +48 +221 +54 +46 +220 +56 +46 +220 +56 +46 +220 +56 +46 +219 +55 +45 +218 +56 +45 +217 +55 +44 +215 +55 +43 +215 +55 +43 +213 +55 +43 +213 +55 +43 +213 +55 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +206 +58 +44 +190 +60 +46 +182 +62 +46 +174 +57 +40 +166 +49 +32 +167 +50 +32 +178 +58 +41 +185 +62 +46 +190 +60 +46 +198 +58 +45 +199 +52 +42 +203 +52 +41 +210 +59 +48 +220 +69 +58 +225 +79 +66 +223 +81 +67 +221 +79 +67 +219 +70 +63 +214 +65 +59 +209 +60 +53 +208 +59 +52 +211 +62 +55 +215 +62 +56 +217 +58 +54 +218 +53 +51 +230 +56 +55 +234 +56 +56 +236 +56 +57 +234 +56 +56 +230 +56 +55 +226 +58 +55 +225 +62 +57 +219 +66 +58 +205 +64 +55 +194 +61 +52 +187 +57 +44 +180 +52 +39 +178 +52 +38 +181 +55 +41 +186 +60 +45 +191 +64 +49 +198 +64 +52 +205 +64 +54 +213 +65 +55 +220 +63 +56 +226 +58 +55 +230 +56 +55 +235 +55 +54 +239 +56 +58 +233 +54 +58 +231 +54 +60 +231 +55 +58 +230 +56 +57 +230 +56 +55 +229 +57 +53 +229 +57 +53 +227 +58 +53 +226 +57 +50 +227 +58 +51 +227 +58 +53 +228 +59 +54 +228 +59 +56 +228 +59 +56 +229 +57 +57 +229 +57 +57 +228 +58 +59 +227 +59 +59 +223 +60 +61 +217 +63 +61 +208 +65 +59 +196 +63 +54 +183 +61 +50 +172 +59 +45 +165 +59 +43 +160 +61 +42 +156 +61 +43 +151 +60 +41 +150 +59 +40 +146 +58 +38 +147 +56 +37 +140 +58 +37 +128 +57 +39 +128 +56 +41 +137 +53 +42 +157 +60 +53 +191 +81 +80 +215 +101 +101 +209 +94 +97 +183 +77 +77 +172 +78 +76 +164 +84 +77 +157 +89 +80 +152 +92 +81 +151 +94 +83 +151 +94 +83 +152 +95 +86 +140 +102 +81 +96 +95 +47 +83 +103 +42 +94 +114 +51 +122 +144 +79 +153 +175 +110 +165 +190 +124 +153 +178 +112 +136 +160 +98 +106 +130 +72 +97 +117 +66 +84 +101 +59 +74 +88 +55 +70 +80 +55 +63 +72 +53 +57 +63 +49 +53 +56 +45 +58 +60 +47 +65 +66 +52 +61 +63 +52 +58 +61 +50 +61 +65 +51 +58 +67 +48 +64 +77 +51 +82 +100 +62 +94 +116 +69 +103 +131 +72 +113 +144 +77 +112 +148 +76 +110 +146 +72 +107 +148 +72 +107 +147 +76 +104 +145 +75 +109 +145 +81 +110 +146 +84 +109 +148 +83 +109 +148 +81 +107 +147 +76 +107 +148 +72 +108 +151 +72 +109 +152 +72 +112 +157 +74 +112 +157 +74 +112 +160 +76 +115 +162 +81 +117 +166 +84 +120 +169 +88 +120 +169 +88 +120 +168 +94 +110 +152 +89 +100 +141 +83 +90 +131 +73 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +93 +84 +69 +91 +82 +67 +92 +83 +68 +93 +84 +69 +94 +85 +70 +95 +86 +71 +96 +87 +72 +97 +88 +73 +97 +88 +71 +101 +93 +74 +101 +93 +72 +100 +91 +74 +100 +91 +76 +101 +91 +81 +102 +91 +85 +104 +93 +89 +104 +93 +91 +105 +93 +93 +106 +94 +94 +107 +95 +95 +107 +95 +95 +105 +94 +92 +102 +91 +89 +98 +87 +83 +95 +86 +81 +90 +86 +77 +87 +84 +75 +85 +81 +72 +82 +78 +67 +81 +77 +66 +83 +79 +67 +87 +81 +67 +88 +82 +66 +94 +87 +71 +94 +87 +69 +97 +89 +70 +99 +91 +70 +103 +92 +72 +105 +94 +72 +107 +96 +74 +105 +97 +76 +101 +96 +77 +113 +101 +85 +123 +94 +80 +136 +88 +78 +162 +91 +85 +175 +88 +81 +177 +74 +69 +182 +71 +64 +182 +65 +55 +183 +63 +49 +182 +60 +47 +184 +56 +43 +189 +55 +43 +197 +57 +44 +204 +57 +47 +211 +57 +47 +217 +56 +46 +219 +55 +45 +219 +55 +45 +219 +57 +46 +218 +56 +45 +217 +55 +44 +217 +55 +44 +215 +55 +43 +215 +55 +43 +213 +55 +43 +213 +55 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +210 +57 +43 +205 +59 +44 +192 +62 +48 +182 +62 +46 +173 +58 +40 +163 +50 +32 +163 +51 +31 +170 +58 +38 +179 +62 +44 +185 +62 +46 +196 +63 +48 +196 +56 +43 +197 +50 +40 +200 +52 +42 +208 +60 +48 +216 +70 +57 +220 +77 +63 +225 +78 +68 +216 +59 +54 +215 +53 +51 +210 +51 +48 +211 +53 +50 +216 +58 +55 +222 +63 +60 +227 +62 +60 +232 +60 +60 +236 +57 +60 +237 +54 +58 +234 +51 +55 +231 +51 +54 +230 +54 +56 +227 +57 +57 +224 +60 +58 +217 +64 +58 +193 +55 +45 +184 +56 +43 +179 +53 +39 +175 +52 +37 +175 +52 +37 +178 +55 +40 +182 +59 +43 +187 +61 +46 +200 +68 +53 +205 +67 +54 +213 +66 +56 +217 +63 +55 +223 +58 +52 +229 +56 +52 +234 +54 +53 +238 +55 +57 +234 +54 +57 +233 +54 +57 +233 +54 +57 +231 +55 +55 +231 +55 +55 +230 +57 +53 +229 +57 +53 +229 +58 +51 +227 +58 +51 +228 +59 +52 +228 +59 +54 +227 +60 +54 +227 +59 +56 +226 +58 +57 +225 +57 +57 +222 +56 +56 +221 +57 +58 +220 +60 +60 +218 +64 +62 +211 +66 +61 +200 +63 +57 +185 +58 +49 +173 +55 +43 +165 +55 +40 +161 +59 +44 +157 +60 +43 +153 +60 +43 +148 +59 +41 +147 +58 +40 +144 +57 +38 +144 +55 +37 +138 +57 +38 +122 +54 +35 +121 +54 +37 +136 +57 +44 +160 +70 +61 +185 +83 +79 +192 +87 +84 +184 +80 +79 +171 +73 +70 +162 +77 +72 +156 +83 +76 +153 +89 +80 +151 +94 +83 +151 +97 +87 +151 +97 +87 +152 +95 +86 +139 +101 +80 +115 +114 +70 +122 +141 +86 +147 +166 +110 +164 +185 +128 +171 +192 +135 +158 +179 +123 +124 +144 +91 +91 +111 +60 +63 +82 +36 +65 +83 +43 +65 +80 +47 +63 +76 +50 +58 +67 +48 +54 +60 +46 +54 +57 +48 +53 +56 +47 +57 +59 +46 +64 +65 +51 +61 +63 +52 +57 +60 +49 +61 +65 +51 +57 +66 +47 +64 +77 +51 +81 +99 +61 +96 +118 +71 +105 +133 +74 +115 +146 +79 +114 +150 +78 +112 +148 +74 +109 +150 +74 +109 +149 +78 +107 +148 +78 +112 +148 +84 +113 +149 +85 +111 +150 +83 +110 +150 +80 +108 +148 +75 +108 +149 +73 +108 +151 +72 +110 +153 +73 +112 +157 +76 +112 +157 +76 +112 +159 +78 +117 +164 +83 +120 +169 +88 +121 +170 +91 +117 +166 +87 +113 +160 +88 +95 +137 +74 +86 +127 +69 +79 +120 +62 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +97 +88 +73 +95 +86 +71 +96 +87 +72 +96 +87 +72 +97 +88 +73 +98 +89 +74 +99 +90 +75 +100 +91 +76 +100 +91 +74 +101 +93 +72 +102 +94 +71 +102 +94 +73 +103 +95 +76 +103 +94 +79 +102 +92 +80 +102 +92 +82 +102 +92 +83 +104 +93 +87 +104 +93 +87 +104 +93 +87 +104 +94 +85 +103 +93 +84 +101 +91 +81 +100 +90 +80 +99 +91 +78 +93 +89 +77 +90 +86 +74 +86 +82 +70 +82 +78 +66 +80 +76 +64 +80 +77 +62 +84 +78 +64 +85 +79 +63 +87 +81 +65 +89 +84 +65 +91 +86 +67 +93 +88 +68 +97 +90 +71 +100 +93 +74 +102 +95 +76 +102 +97 +77 +103 +97 +81 +111 +99 +85 +119 +91 +79 +138 +91 +81 +169 +98 +92 +182 +91 +88 +180 +71 +68 +183 +61 +58 +193 +61 +56 +195 +60 +54 +195 +58 +48 +193 +57 +45 +189 +56 +41 +189 +57 +42 +193 +61 +46 +202 +62 +47 +213 +57 +45 +217 +55 +44 +218 +56 +45 +217 +57 +45 +218 +56 +45 +216 +56 +44 +216 +56 +44 +213 +55 +43 +213 +55 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +212 +56 +43 +210 +57 +43 +205 +59 +44 +193 +63 +49 +182 +62 +46 +172 +57 +39 +162 +51 +32 +157 +51 +29 +162 +56 +34 +172 +61 +41 +181 +64 +46 +188 +63 +45 +191 +58 +43 +195 +55 +42 +197 +53 +42 +203 +55 +43 +206 +58 +46 +206 +60 +47 +211 +58 +50 +220 +55 +53 +223 +50 +52 +218 +50 +50 +218 +52 +52 +222 +56 +56 +226 +60 +60 +232 +62 +63 +235 +61 +62 +235 +56 +60 +235 +52 +56 +232 +49 +54 +229 +50 +53 +228 +54 +56 +224 +56 +55 +217 +55 +53 +204 +55 +49 +185 +51 +40 +177 +54 +39 +175 +53 +38 +174 +54 +38 +174 +54 +38 +176 +56 +40 +179 +58 +41 +181 +58 +42 +195 +65 +49 +202 +66 +52 +210 +66 +55 +217 +64 +56 +223 +60 +53 +227 +58 +53 +234 +56 +54 +236 +56 +55 +237 +54 +56 +235 +55 +56 +235 +55 +56 +234 +56 +54 +234 +56 +54 +232 +57 +52 +231 +58 +52 +230 +59 +52 +226 +57 +50 +225 +58 +50 +223 +58 +52 +224 +59 +55 +222 +58 +56 +220 +58 +56 +219 +57 +55 +217 +57 +57 +214 +60 +58 +213 +64 +60 +210 +67 +61 +202 +65 +59 +187 +59 +50 +175 +54 +43 +164 +54 +39 +158 +55 +40 +156 +59 +42 +152 +59 +41 +148 +59 +41 +146 +59 +40 +143 +58 +38 +141 +56 +36 +140 +55 +35 +135 +57 +37 +128 +61 +42 +118 +53 +35 +129 +53 +39 +153 +69 +58 +170 +80 +72 +172 +77 +71 +169 +76 +71 +166 +81 +76 +157 +80 +74 +152 +85 +76 +148 +90 +79 +148 +94 +82 +149 +97 +86 +149 +97 +86 +151 +97 +87 +141 +103 +84 +137 +133 +95 +153 +169 +120 +173 +189 +142 +166 +184 +136 +144 +161 +116 +115 +134 +89 +78 +96 +56 +47 +65 +27 +45 +62 +28 +51 +66 +37 +58 +70 +46 +61 +70 +51 +59 +65 +51 +58 +61 +50 +58 +61 +52 +60 +61 +53 +57 +57 +45 +63 +64 +50 +60 +62 +51 +57 +60 +49 +60 +64 +50 +57 +66 +47 +63 +76 +50 +80 +98 +60 +97 +119 +72 +106 +134 +75 +116 +147 +80 +115 +151 +79 +114 +150 +76 +111 +152 +76 +111 +151 +80 +109 +151 +79 +112 +151 +84 +115 +152 +85 +112 +152 +82 +111 +151 +80 +109 +150 +74 +109 +150 +72 +110 +153 +74 +112 +155 +75 +113 +158 +77 +114 +159 +78 +116 +163 +83 +121 +168 +88 +123 +172 +93 +119 +167 +91 +109 +157 +83 +101 +146 +77 +90 +132 +69 +82 +123 +65 +77 +118 +60 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +99 +90 +75 +100 +91 +76 +100 +91 +76 +101 +92 +77 +102 +93 +78 +102 +93 +78 +102 +93 +76 +102 +94 +71 +103 +95 +72 +104 +96 +73 +105 +97 +76 +105 +97 +78 +105 +96 +79 +104 +95 +80 +103 +94 +79 +106 +96 +84 +105 +96 +81 +105 +96 +81 +104 +95 +78 +104 +95 +78 +104 +96 +77 +104 +96 +77 +104 +97 +78 +100 +94 +78 +96 +90 +76 +91 +85 +71 +86 +80 +66 +80 +77 +62 +78 +75 +58 +78 +75 +58 +78 +75 +58 +80 +77 +60 +82 +79 +62 +84 +81 +64 +86 +83 +64 +88 +87 +67 +91 +90 +70 +93 +92 +72 +95 +92 +75 +99 +96 +81 +105 +93 +81 +112 +85 +74 +134 +91 +82 +172 +105 +99 +189 +100 +96 +191 +79 +77 +197 +67 +67 +205 +61 +61 +210 +58 +57 +209 +57 +52 +203 +56 +48 +194 +56 +43 +187 +60 +41 +184 +65 +43 +190 +65 +43 +208 +58 +43 +215 +55 +41 +216 +56 +42 +215 +58 +43 +217 +57 +43 +214 +57 +42 +214 +57 +42 +212 +56 +41 +212 +56 +41 +212 +56 +41 +212 +56 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +205 +59 +44 +193 +63 +49 +182 +62 +48 +171 +58 +40 +161 +54 +34 +154 +52 +30 +155 +55 +32 +163 +61 +38 +175 +66 +45 +179 +59 +42 +186 +59 +44 +194 +58 +44 +199 +57 +45 +203 +56 +46 +206 +58 +48 +208 +60 +48 +216 +59 +52 +232 +58 +60 +234 +53 +60 +228 +51 +57 +226 +51 +56 +223 +53 +56 +223 +53 +56 +225 +52 +56 +225 +51 +53 +233 +54 +60 +232 +53 +57 +231 +52 +58 +230 +56 +58 +226 +57 +60 +218 +56 +54 +206 +51 +49 +191 +48 +40 +181 +53 +40 +174 +57 +40 +174 +57 +40 +173 +58 +40 +173 +58 +40 +173 +58 +40 +173 +56 +38 +175 +55 +38 +184 +58 +43 +193 +59 +47 +205 +63 +51 +215 +64 +55 +221 +62 +56 +225 +60 +56 +231 +58 +54 +235 +57 +55 +237 +55 +54 +238 +54 +54 +238 +54 +54 +237 +55 +52 +234 +56 +52 +232 +58 +51 +231 +58 +51 +228 +60 +51 +225 +58 +50 +223 +59 +50 +223 +60 +53 +220 +61 +55 +219 +61 +58 +217 +62 +60 +215 +61 +59 +212 +62 +61 +207 +64 +60 +203 +66 +60 +197 +66 +58 +185 +61 +53 +173 +55 +45 +163 +53 +40 +158 +55 +40 +154 +58 +42 +150 +59 +41 +147 +60 +41 +145 +59 +42 +141 +58 +40 +138 +57 +38 +137 +56 +37 +136 +55 +36 +131 +56 +37 +131 +64 +45 +117 +52 +34 +123 +51 +37 +147 +71 +58 +164 +81 +73 +161 +78 +70 +158 +78 +71 +161 +87 +78 +152 +85 +76 +146 +88 +76 +144 +90 +78 +141 +92 +78 +143 +93 +82 +148 +96 +85 +151 +97 +87 +143 +104 +87 +141 +137 +102 +152 +165 +122 +157 +169 +129 +128 +142 +106 +93 +107 +72 +68 +83 +52 +50 +64 +38 +36 +50 +25 +45 +58 +38 +48 +59 +42 +53 +61 +46 +57 +63 +51 +60 +63 +52 +61 +63 +52 +58 +59 +51 +58 +58 +48 +57 +57 +45 +62 +63 +49 +59 +61 +50 +56 +59 +48 +59 +63 +49 +56 +65 +46 +62 +75 +49 +80 +98 +60 +98 +120 +73 +107 +135 +76 +117 +148 +81 +116 +152 +80 +115 +151 +77 +113 +154 +78 +113 +153 +82 +111 +153 +81 +114 +154 +83 +114 +154 +83 +114 +154 +81 +112 +153 +77 +109 +151 +75 +109 +152 +73 +112 +155 +76 +115 +158 +79 +116 +160 +81 +118 +162 +83 +120 +167 +89 +123 +169 +94 +122 +168 +95 +113 +159 +86 +100 +146 +74 +89 +134 +67 +92 +133 +73 +85 +124 +69 +81 +120 +65 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +101 +92 +77 +102 +93 +78 +102 +93 +78 +102 +93 +78 +103 +94 +79 +103 +94 +79 +104 +95 +80 +104 +95 +78 +103 +95 +74 +104 +96 +73 +105 +97 +76 +106 +98 +77 +106 +98 +79 +106 +98 +79 +106 +97 +80 +106 +97 +80 +106 +97 +80 +105 +97 +78 +104 +96 +77 +104 +96 +75 +104 +96 +75 +104 +96 +73 +105 +97 +74 +106 +98 +75 +102 +95 +77 +98 +93 +74 +94 +88 +72 +88 +82 +66 +83 +77 +61 +77 +74 +57 +75 +72 +55 +73 +72 +54 +75 +74 +56 +76 +75 +57 +76 +77 +59 +78 +79 +61 +80 +81 +63 +81 +84 +65 +83 +86 +69 +84 +85 +69 +92 +88 +76 +95 +85 +73 +100 +80 +69 +124 +87 +78 +161 +104 +97 +181 +102 +97 +193 +88 +85 +211 +83 +82 +214 +65 +67 +220 +60 +62 +219 +57 +55 +210 +56 +48 +200 +58 +46 +189 +62 +43 +178 +66 +42 +183 +64 +40 +204 +59 +42 +212 +55 +40 +213 +56 +41 +213 +57 +42 +214 +57 +42 +213 +57 +42 +213 +57 +42 +212 +56 +41 +212 +56 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +210 +57 +41 +205 +59 +44 +193 +63 +49 +181 +61 +47 +171 +60 +41 +162 +57 +36 +153 +54 +31 +149 +53 +29 +155 +59 +34 +167 +65 +42 +178 +66 +46 +185 +64 +47 +191 +59 +44 +195 +55 +42 +197 +50 +40 +203 +52 +43 +210 +59 +48 +223 +61 +56 +233 +54 +58 +237 +52 +60 +234 +55 +61 +232 +57 +62 +229 +59 +62 +228 +59 +62 +225 +59 +61 +224 +58 +60 +223 +53 +56 +224 +55 +58 +226 +57 +62 +224 +61 +62 +217 +61 +62 +207 +58 +54 +194 +51 +47 +181 +48 +39 +177 +57 +43 +172 +61 +42 +172 +61 +42 +171 +62 +42 +170 +61 +41 +169 +60 +40 +169 +58 +39 +171 +56 +37 +175 +54 +37 +183 +56 +41 +197 +59 +48 +206 +62 +51 +214 +61 +53 +222 +60 +55 +227 +59 +56 +232 +59 +55 +236 +56 +55 +239 +55 +53 +239 +55 +53 +238 +56 +53 +235 +58 +52 +233 +59 +52 +231 +60 +52 +228 +61 +52 +226 +62 +53 +224 +63 +55 +222 +65 +58 +218 +65 +59 +217 +65 +62 +213 +65 +63 +209 +64 +61 +205 +66 +63 +195 +63 +58 +187 +64 +56 +179 +61 +51 +170 +56 +45 +161 +53 +40 +155 +53 +39 +152 +56 +40 +149 +60 +42 +145 +60 +40 +141 +60 +41 +138 +60 +40 +136 +58 +38 +134 +57 +39 +132 +55 +37 +131 +54 +36 +127 +54 +37 +125 +58 +41 +116 +51 +33 +126 +57 +42 +151 +79 +65 +163 +89 +78 +156 +82 +71 +149 +79 +69 +152 +86 +74 +149 +89 +78 +144 +91 +77 +142 +90 +77 +140 +91 +77 +142 +92 +81 +147 +95 +84 +153 +96 +87 +145 +103 +87 +126 +120 +88 +121 +131 +94 +114 +124 +90 +85 +96 +66 +59 +69 +44 +47 +59 +37 +48 +59 +42 +48 +60 +46 +51 +61 +50 +52 +60 +49 +54 +60 +50 +60 +63 +54 +64 +65 +57 +63 +65 +54 +60 +60 +48 +55 +55 +43 +56 +57 +43 +62 +63 +49 +58 +60 +49 +55 +58 +47 +58 +62 +48 +55 +64 +45 +61 +74 +48 +79 +97 +59 +98 +120 +73 +107 +135 +76 +117 +148 +81 +117 +153 +81 +116 +152 +78 +113 +154 +78 +114 +154 +83 +112 +154 +82 +114 +154 +81 +115 +156 +80 +114 +155 +79 +112 +153 +75 +110 +153 +74 +112 +155 +76 +115 +158 +79 +118 +161 +82 +121 +165 +88 +123 +167 +90 +122 +168 +93 +120 +166 +93 +113 +159 +87 +103 +148 +79 +93 +138 +69 +88 +130 +66 +95 +134 +77 +87 +126 +71 +82 +121 +66 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +103 +94 +79 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +105 +96 +79 +106 +97 +80 +106 +98 +79 +106 +98 +79 +106 +98 +79 +105 +96 +79 +105 +96 +79 +105 +97 +78 +105 +97 +78 +105 +97 +78 +104 +96 +75 +104 +96 +75 +104 +96 +73 +104 +96 +73 +104 +97 +71 +104 +97 +71 +104 +97 +71 +102 +95 +76 +101 +94 +75 +98 +91 +73 +92 +87 +68 +87 +82 +63 +80 +77 +58 +76 +73 +56 +73 +72 +54 +73 +72 +54 +71 +72 +54 +71 +74 +57 +71 +75 +58 +72 +76 +59 +73 +77 +60 +72 +79 +63 +74 +78 +63 +82 +80 +67 +89 +81 +70 +92 +78 +67 +105 +82 +68 +129 +89 +77 +149 +87 +76 +174 +84 +76 +209 +91 +89 +217 +75 +74 +223 +65 +66 +223 +57 +57 +217 +55 +50 +207 +59 +49 +195 +62 +45 +183 +64 +42 +180 +60 +36 +201 +58 +41 +211 +55 +40 +212 +56 +41 +211 +58 +42 +213 +57 +42 +211 +58 +42 +211 +58 +42 +211 +58 +42 +210 +57 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +205 +59 +44 +193 +61 +48 +181 +61 +47 +172 +61 +44 +163 +60 +41 +152 +56 +32 +144 +52 +27 +149 +57 +32 +161 +65 +41 +173 +67 +45 +182 +65 +47 +191 +61 +47 +192 +54 +43 +194 +47 +37 +199 +48 +39 +208 +54 +46 +222 +58 +56 +232 +53 +57 +238 +54 +62 +236 +59 +65 +233 +64 +67 +229 +66 +69 +224 +66 +67 +220 +64 +65 +217 +63 +63 +204 +50 +50 +207 +55 +54 +211 +58 +60 +207 +62 +59 +199 +60 +57 +189 +56 +49 +180 +53 +46 +171 +53 +41 +170 +60 +45 +167 +62 +43 +167 +62 +43 +166 +63 +44 +165 +62 +43 +166 +61 +40 +166 +59 +39 +169 +58 +39 +170 +55 +37 +177 +56 +39 +188 +56 +43 +195 +57 +46 +203 +56 +48 +211 +58 +52 +220 +61 +57 +228 +63 +59 +233 +58 +55 +236 +57 +53 +236 +57 +53 +235 +58 +52 +233 +59 +52 +232 +59 +52 +229 +61 +52 +226 +62 +52 +224 +66 +55 +221 +67 +57 +218 +67 +60 +213 +66 +59 +207 +65 +61 +202 +63 +60 +199 +61 +59 +191 +62 +57 +177 +60 +51 +169 +58 +47 +162 +56 +43 +156 +54 +40 +152 +55 +39 +148 +56 +41 +145 +58 +41 +141 +58 +40 +139 +61 +41 +137 +60 +42 +135 +60 +41 +131 +58 +39 +130 +57 +40 +128 +55 +38 +127 +54 +37 +125 +54 +36 +120 +51 +35 +120 +53 +37 +133 +66 +50 +152 +85 +69 +157 +87 +75 +148 +80 +67 +144 +80 +68 +149 +90 +76 +147 +89 +77 +144 +90 +78 +144 +92 +81 +144 +92 +81 +146 +91 +84 +149 +92 +85 +152 +91 +86 +142 +98 +85 +107 +98 +69 +86 +96 +61 +74 +83 +52 +61 +71 +44 +54 +63 +42 +50 +61 +44 +52 +62 +51 +53 +63 +54 +54 +61 +54 +56 +63 +56 +61 +66 +59 +67 +70 +61 +69 +71 +60 +67 +68 +54 +64 +62 +47 +59 +57 +42 +55 +56 +42 +61 +62 +48 +58 +60 +49 +55 +58 +47 +58 +62 +48 +54 +63 +44 +61 +74 +48 +78 +96 +58 +97 +119 +72 +107 +135 +76 +117 +148 +81 +117 +153 +81 +116 +152 +78 +114 +155 +79 +114 +154 +83 +112 +154 +80 +113 +155 +79 +114 +157 +78 +113 +156 +77 +112 +155 +76 +111 +154 +75 +114 +157 +78 +117 +161 +84 +121 +165 +88 +127 +171 +96 +126 +169 +97 +122 +165 +93 +113 +156 +85 +102 +145 +76 +95 +137 +71 +93 +135 +69 +94 +136 +73 +97 +136 +79 +89 +128 +73 +82 +121 +66 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +103 +94 +79 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +104 +95 +80 +105 +96 +81 +105 +96 +81 +109 +100 +85 +108 +99 +84 +106 +97 +82 +105 +96 +81 +104 +95 +80 +103 +94 +79 +103 +94 +77 +104 +96 +77 +105 +97 +78 +105 +97 +76 +105 +97 +76 +105 +97 +76 +104 +96 +73 +104 +96 +73 +104 +97 +71 +104 +96 +73 +103 +97 +75 +102 +95 +76 +101 +94 +75 +98 +91 +72 +92 +87 +68 +85 +82 +63 +80 +77 +60 +77 +76 +58 +69 +70 +52 +68 +71 +52 +68 +72 +55 +68 +72 +55 +66 +73 +57 +66 +75 +58 +66 +75 +58 +67 +74 +58 +74 +74 +62 +84 +80 +68 +85 +79 +65 +89 +76 +60 +101 +75 +58 +115 +69 +53 +146 +74 +62 +192 +91 +83 +215 +83 +79 +222 +70 +69 +223 +59 +58 +220 +55 +53 +213 +59 +51 +204 +61 +47 +189 +60 +41 +184 +55 +34 +203 +58 +41 +207 +56 +39 +208 +57 +40 +210 +59 +42 +210 +59 +42 +210 +59 +42 +210 +59 +42 +210 +59 +42 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +209 +58 +41 +205 +59 +44 +193 +59 +48 +182 +58 +46 +173 +60 +44 +167 +62 +43 +153 +57 +35 +143 +51 +26 +147 +55 +30 +159 +63 +39 +163 +57 +35 +176 +59 +41 +192 +62 +48 +198 +60 +49 +204 +56 +46 +208 +55 +47 +217 +60 +53 +227 +63 +61 +236 +61 +66 +238 +63 +68 +233 +67 +69 +226 +68 +67 +214 +64 +63 +202 +59 +55 +192 +53 +48 +187 +49 +46 +183 +48 +44 +187 +54 +49 +190 +58 +54 +187 +60 +54 +179 +58 +50 +169 +57 +46 +164 +56 +44 +160 +58 +43 +161 +61 +45 +159 +62 +43 +160 +63 +44 +161 +64 +45 +161 +64 +45 +163 +64 +43 +163 +62 +42 +164 +61 +42 +169 +59 +42 +173 +58 +40 +178 +55 +40 +184 +54 +41 +191 +53 +43 +201 +57 +48 +212 +63 +57 +224 +67 +62 +229 +60 +55 +232 +59 +53 +232 +59 +53 +231 +60 +52 +229 +60 +53 +228 +61 +52 +225 +62 +53 +222 +64 +53 +220 +68 +57 +216 +68 +58 +210 +67 +59 +202 +65 +57 +196 +63 +58 +188 +59 +54 +184 +56 +53 +176 +57 +51 +162 +55 +45 +153 +56 +40 +149 +53 +39 +147 +54 +39 +145 +58 +41 +143 +60 +42 +139 +58 +41 +133 +56 +38 +136 +61 +42 +133 +60 +43 +131 +60 +42 +128 +60 +41 +126 +58 +39 +124 +56 +37 +123 +54 +38 +123 +54 +38 +121 +49 +35 +128 +56 +42 +140 +71 +56 +150 +83 +67 +146 +80 +66 +139 +76 +61 +144 +82 +69 +153 +95 +83 +145 +87 +76 +146 +89 +78 +148 +91 +82 +150 +93 +84 +150 +93 +86 +151 +92 +86 +150 +89 +84 +140 +94 +81 +97 +88 +59 +69 +77 +40 +54 +64 +30 +56 +65 +38 +62 +71 +50 +60 +69 +52 +51 +61 +50 +45 +55 +46 +49 +56 +49 +55 +62 +54 +66 +69 +60 +71 +74 +63 +72 +73 +59 +66 +67 +49 +63 +62 +42 +59 +58 +38 +55 +56 +40 +61 +62 +48 +57 +59 +48 +54 +57 +46 +58 +62 +48 +54 +63 +44 +60 +73 +47 +78 +96 +58 +97 +119 +72 +106 +134 +75 +117 +148 +81 +116 +152 +80 +116 +152 +78 +114 +155 +79 +114 +154 +83 +112 +154 +80 +113 +156 +77 +113 +156 +76 +113 +156 +76 +112 +155 +75 +112 +155 +76 +115 +158 +79 +119 +163 +86 +123 +167 +92 +130 +173 +101 +128 +171 +100 +120 +163 +92 +106 +149 +80 +93 +135 +69 +89 +131 +65 +94 +136 +72 +101 +143 +80 +99 +138 +81 +90 +129 +74 +83 +122 +67 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +95 +83 +106 +96 +87 +106 +96 +87 +106 +96 +87 +106 +96 +87 +106 +96 +86 +106 +96 +86 +106 +96 +84 +106 +97 +82 +106 +97 +82 +106 +97 +80 +106 +97 +80 +106 +98 +79 +106 +98 +79 +106 +98 +79 +106 +98 +77 +106 +98 +77 +103 +95 +74 +103 +95 +74 +102 +94 +73 +101 +95 +73 +98 +93 +73 +90 +88 +67 +83 +80 +61 +77 +76 +58 +72 +73 +55 +69 +72 +55 +65 +69 +54 +64 +68 +53 +63 +69 +55 +63 +71 +56 +63 +71 +56 +63 +69 +55 +72 +74 +61 +74 +75 +61 +67 +68 +52 +75 +74 +54 +92 +81 +59 +96 +70 +47 +128 +75 +57 +189 +107 +93 +217 +104 +96 +224 +86 +83 +226 +71 +69 +229 +65 +64 +226 +64 +61 +215 +61 +53 +203 +59 +48 +201 +59 +45 +199 +51 +37 +203 +53 +38 +204 +54 +39 +205 +55 +40 +205 +55 +40 +206 +56 +41 +209 +59 +44 +211 +61 +46 +210 +60 +45 +210 +60 +45 +210 +60 +45 +210 +60 +45 +209 +59 +44 +209 +59 +44 +209 +59 +44 +206 +60 +45 +187 +50 +40 +182 +55 +46 +177 +59 +47 +168 +58 +41 +154 +55 +34 +148 +53 +31 +149 +55 +30 +156 +57 +34 +174 +65 +45 +179 +59 +43 +186 +54 +41 +193 +52 +42 +205 +54 +47 +215 +60 +55 +226 +67 +63 +234 +72 +69 +232 +68 +69 +232 +69 +72 +221 +67 +67 +201 +58 +54 +187 +54 +49 +180 +56 +48 +176 +55 +46 +169 +52 +43 +171 +57 +47 +169 +57 +46 +164 +56 +46 +160 +56 +45 +155 +57 +44 +150 +58 +43 +147 +60 +43 +146 +60 +43 +150 +61 +43 +152 +61 +42 +153 +62 +43 +154 +63 +44 +155 +64 +45 +156 +65 +44 +158 +66 +45 +161 +64 +45 +162 +59 +42 +165 +58 +40 +171 +55 +40 +176 +54 +41 +182 +54 +43 +190 +56 +45 +197 +58 +51 +204 +60 +52 +218 +61 +54 +224 +61 +54 +226 +63 +56 +226 +65 +55 +226 +65 +57 +222 +66 +54 +218 +64 +54 +215 +64 +53 +216 +72 +61 +210 +69 +59 +199 +65 +56 +187 +59 +50 +178 +53 +47 +170 +51 +45 +166 +49 +42 +159 +50 +43 +153 +57 +45 +146 +59 +42 +145 +57 +43 +141 +58 +42 +139 +58 +41 +136 +59 +41 +135 +59 +43 +133 +60 +43 +128 +57 +39 +125 +56 +40 +124 +57 +40 +124 +57 +40 +124 +57 +40 +123 +56 +39 +121 +54 +38 +120 +51 +36 +119 +45 +32 +139 +65 +52 +151 +79 +67 +147 +77 +65 +142 +76 +64 +145 +81 +69 +147 +85 +74 +142 +82 +71 +152 +92 +82 +152 +92 +82 +145 +85 +77 +144 +84 +76 +151 +90 +85 +149 +88 +83 +148 +87 +84 +147 +103 +90 +93 +84 +53 +73 +81 +42 +65 +75 +40 +66 +75 +44 +62 +72 +47 +55 +64 +43 +50 +61 +45 +52 +63 +49 +52 +60 +49 +72 +80 +67 +90 +94 +80 +87 +91 +74 +77 +79 +58 +68 +70 +46 +65 +65 +39 +61 +61 +37 +58 +59 +41 +62 +63 +49 +59 +61 +50 +58 +61 +50 +59 +63 +49 +52 +61 +42 +59 +72 +46 +80 +98 +60 +99 +121 +74 +108 +136 +77 +117 +148 +81 +115 +151 +79 +114 +150 +76 +112 +153 +77 +114 +154 +83 +113 +155 +81 +112 +157 +76 +113 +158 +75 +114 +159 +78 +114 +159 +78 +115 +159 +80 +118 +162 +85 +123 +167 +92 +127 +170 +98 +130 +173 +102 +120 +163 +94 +106 +147 +79 +96 +137 +71 +94 +135 +69 +97 +137 +74 +102 +142 +80 +104 +144 +84 +100 +137 +83 +91 +128 +76 +84 +121 +69 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +95 +83 +106 +95 +89 +106 +95 +91 +106 +95 +91 +106 +95 +89 +106 +95 +89 +106 +96 +87 +106 +96 +86 +106 +96 +84 +106 +96 +84 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +80 +106 +97 +80 +104 +96 +77 +104 +96 +75 +103 +95 +74 +103 +95 +74 +100 +93 +74 +94 +89 +69 +85 +82 +63 +79 +78 +58 +73 +74 +58 +69 +72 +55 +66 +68 +54 +64 +68 +53 +63 +69 +55 +62 +70 +55 +62 +70 +55 +61 +69 +54 +66 +70 +56 +65 +67 +53 +64 +69 +49 +72 +76 +53 +77 +73 +48 +82 +65 +39 +124 +82 +58 +185 +117 +98 +201 +100 +88 +221 +96 +90 +234 +86 +84 +230 +72 +71 +226 +64 +62 +226 +64 +61 +219 +62 +57 +209 +56 +48 +205 +57 +43 +206 +61 +44 +207 +61 +46 +207 +62 +45 +207 +59 +45 +206 +59 +43 +205 +57 +43 +205 +58 +42 +206 +58 +44 +208 +58 +43 +208 +58 +44 +208 +58 +43 +208 +58 +44 +208 +58 +43 +208 +58 +44 +205 +59 +46 +201 +63 +53 +197 +66 +58 +188 +66 +55 +174 +61 +47 +159 +54 +35 +150 +49 +29 +150 +49 +29 +155 +50 +29 +168 +53 +35 +180 +54 +40 +195 +59 +47 +209 +65 +56 +222 +69 +63 +230 +73 +68 +233 +74 +70 +234 +75 +72 +224 +66 +65 +219 +69 +68 +208 +66 +62 +190 +59 +51 +175 +57 +47 +171 +61 +48 +165 +63 +49 +159 +61 +48 +159 +63 +49 +156 +62 +50 +151 +62 +48 +149 +61 +47 +143 +61 +47 +139 +62 +46 +135 +64 +46 +136 +63 +44 +142 +61 +42 +143 +60 +42 +146 +60 +43 +145 +62 +44 +148 +63 +43 +148 +63 +43 +150 +63 +44 +153 +62 +44 +159 +64 +46 +161 +61 +45 +164 +58 +44 +168 +56 +44 +173 +55 +43 +178 +56 +45 +184 +57 +48 +189 +56 +47 +202 +60 +50 +208 +60 +50 +211 +63 +53 +213 +65 +55 +215 +67 +57 +214 +67 +57 +212 +68 +57 +209 +69 +56 +202 +66 +54 +195 +65 +52 +185 +61 +51 +176 +58 +48 +169 +54 +47 +164 +53 +46 +159 +52 +44 +153 +55 +44 +146 +58 +46 +140 +61 +44 +138 +59 +44 +136 +59 +43 +134 +58 +42 +132 +59 +42 +131 +60 +42 +129 +60 +44 +126 +59 +42 +124 +59 +41 +123 +57 +41 +121 +58 +41 +120 +57 +40 +119 +56 +39 +117 +54 +39 +119 +52 +36 +128 +52 +39 +144 +68 +55 +152 +78 +67 +145 +75 +63 +140 +74 +62 +143 +81 +68 +146 +84 +73 +144 +82 +71 +147 +83 +74 +152 +88 +79 +152 +85 +79 +151 +86 +80 +156 +93 +88 +148 +87 +82 +142 +83 +79 +138 +99 +84 +93 +87 +53 +88 +99 +57 +95 +106 +66 +90 +102 +66 +73 +84 +54 +54 +67 +41 +52 +64 +42 +60 +72 +52 +79 +88 +71 +89 +98 +81 +95 +102 +84 +87 +92 +70 +74 +78 +55 +66 +69 +42 +63 +63 +35 +60 +60 +34 +57 +58 +40 +61 +62 +48 +58 +60 +49 +57 +60 +49 +60 +64 +50 +53 +62 +43 +59 +72 +46 +80 +98 +60 +100 +122 +75 +108 +136 +77 +117 +148 +81 +116 +152 +80 +114 +150 +76 +113 +154 +78 +114 +154 +83 +113 +155 +81 +115 +160 +79 +114 +159 +76 +112 +157 +76 +113 +158 +77 +116 +160 +81 +120 +164 +87 +124 +167 +95 +127 +170 +99 +123 +166 +97 +111 +154 +85 +99 +140 +74 +93 +134 +68 +97 +137 +74 +101 +141 +78 +101 +141 +78 +99 +139 +79 +100 +137 +83 +91 +128 +76 +84 +121 +69 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +95 +85 +106 +95 +91 +106 +94 +94 +106 +94 +94 +106 +95 +93 +106 +95 +89 +106 +96 +87 +106 +96 +86 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +84 +106 +96 +86 +106 +96 +84 +108 +97 +79 +107 +96 +76 +105 +97 +78 +105 +97 +78 +102 +95 +76 +97 +92 +72 +89 +86 +67 +83 +82 +62 +77 +75 +60 +72 +73 +57 +68 +70 +56 +65 +69 +54 +65 +69 +54 +63 +70 +54 +62 +68 +54 +61 +67 +53 +62 +69 +53 +58 +62 +45 +66 +71 +49 +73 +75 +51 +69 +63 +37 +84 +64 +39 +132 +92 +67 +181 +116 +96 +179 +87 +74 +214 +100 +90 +239 +101 +98 +236 +84 +83 +230 +70 +72 +235 +71 +72 +232 +66 +68 +219 +57 +54 +203 +55 +43 +201 +58 +42 +201 +58 +44 +201 +58 +42 +203 +57 +44 +202 +56 +41 +200 +54 +41 +200 +54 +39 +202 +56 +43 +203 +55 +41 +203 +55 +43 +203 +55 +41 +203 +55 +43 +204 +56 +42 +204 +56 +44 +203 +56 +46 +194 +51 +45 +190 +53 +47 +182 +54 +45 +173 +51 +40 +161 +48 +34 +158 +47 +30 +160 +49 +32 +167 +51 +36 +188 +65 +50 +199 +67 +55 +214 +71 +63 +225 +76 +70 +231 +76 +71 +233 +74 +70 +229 +70 +66 +223 +68 +64 +216 +66 +65 +209 +67 +65 +195 +63 +58 +177 +59 +49 +166 +60 +47 +161 +65 +49 +156 +69 +52 +152 +69 +51 +149 +68 +51 +146 +67 +52 +143 +66 +50 +138 +65 +48 +133 +64 +48 +130 +65 +47 +126 +65 +46 +129 +64 +46 +132 +59 +42 +136 +59 +43 +137 +58 +41 +137 +60 +42 +139 +60 +43 +139 +60 +43 +142 +61 +42 +143 +60 +42 +150 +63 +46 +152 +60 +45 +155 +59 +43 +158 +56 +42 +162 +56 +43 +167 +56 +45 +170 +58 +46 +175 +57 +47 +185 +57 +46 +190 +57 +48 +193 +59 +48 +196 +62 +51 +197 +63 +51 +197 +65 +52 +195 +65 +51 +193 +65 +52 +182 +59 +44 +178 +58 +44 +170 +56 +45 +163 +55 +43 +158 +54 +43 +155 +54 +44 +152 +55 +46 +148 +58 +47 +141 +59 +47 +136 +60 +44 +135 +59 +45 +132 +59 +44 +130 +58 +43 +128 +59 +43 +128 +59 +43 +127 +60 +44 +125 +59 +43 +122 +59 +42 +122 +59 +44 +119 +57 +42 +118 +56 +41 +117 +55 +40 +116 +54 +41 +118 +52 +38 +136 +59 +49 +148 +70 +60 +150 +78 +66 +142 +74 +61 +136 +72 +60 +141 +79 +66 +145 +83 +72 +146 +82 +73 +146 +79 +73 +153 +84 +79 +153 +83 +81 +154 +86 +83 +154 +93 +90 +147 +89 +85 +141 +91 +84 +141 +108 +91 +129 +125 +88 +126 +137 +94 +128 +139 +97 +108 +120 +82 +76 +88 +52 +54 +68 +35 +61 +74 +46 +76 +90 +64 +101 +113 +89 +101 +111 +87 +93 +101 +77 +80 +85 +62 +69 +73 +48 +63 +67 +40 +61 +64 +35 +58 +60 +36 +56 +57 +39 +59 +60 +46 +56 +58 +47 +57 +60 +49 +61 +65 +51 +54 +63 +44 +60 +73 +47 +80 +98 +60 +100 +122 +75 +109 +137 +78 +118 +149 +82 +116 +152 +80 +115 +151 +77 +113 +154 +78 +114 +154 +83 +112 +154 +80 +117 +162 +81 +112 +160 +76 +110 +157 +76 +112 +159 +79 +117 +164 +86 +121 +167 +92 +125 +168 +96 +124 +167 +96 +112 +153 +85 +102 +143 +77 +92 +132 +69 +92 +132 +69 +101 +140 +77 +105 +144 +81 +102 +141 +78 +95 +133 +72 +99 +136 +82 +90 +127 +76 +83 +120 +69 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +96 +86 +107 +96 +92 +107 +95 +95 +107 +96 +94 +107 +96 +92 +107 +96 +90 +107 +97 +88 +107 +97 +87 +107 +97 +85 +107 +97 +85 +107 +97 +85 +107 +97 +85 +107 +97 +85 +107 +97 +87 +107 +97 +87 +107 +97 +88 +107 +97 +87 +110 +98 +82 +109 +98 +80 +106 +98 +79 +106 +98 +79 +104 +97 +78 +101 +94 +75 +95 +90 +71 +89 +86 +69 +82 +79 +62 +77 +75 +60 +71 +72 +58 +68 +70 +56 +67 +69 +55 +66 +68 +54 +64 +68 +53 +62 +66 +51 +63 +70 +52 +60 +65 +45 +71 +73 +51 +76 +70 +48 +77 +59 +37 +110 +78 +57 +152 +100 +79 +167 +96 +78 +158 +66 +53 +197 +84 +76 +229 +100 +95 +239 +95 +94 +237 +83 +85 +237 +74 +79 +234 +68 +72 +227 +64 +65 +205 +56 +49 +199 +57 +45 +197 +55 +43 +197 +55 +43 +200 +56 +45 +202 +58 +47 +203 +59 +48 +205 +58 +48 +209 +62 +52 +209 +62 +52 +210 +62 +52 +210 +62 +52 +211 +63 +53 +211 +63 +53 +211 +63 +53 +211 +62 +55 +211 +63 +59 +209 +66 +62 +203 +68 +62 +198 +70 +61 +194 +70 +60 +195 +73 +62 +199 +77 +64 +206 +80 +68 +217 +83 +72 +221 +80 +71 +226 +77 +71 +228 +73 +69 +228 +71 +66 +226 +67 +63 +224 +65 +61 +220 +65 +61 +214 +69 +66 +202 +67 +63 +189 +62 +55 +173 +59 +48 +161 +61 +46 +155 +66 +48 +151 +70 +51 +148 +73 +54 +142 +69 +52 +140 +69 +51 +138 +66 +51 +133 +66 +49 +130 +64 +48 +125 +64 +46 +123 +64 +46 +124 +63 +45 +128 +59 +44 +131 +57 +44 +131 +58 +43 +132 +59 +44 +132 +59 +44 +133 +60 +45 +135 +59 +43 +136 +59 +43 +137 +58 +43 +140 +57 +41 +143 +55 +41 +147 +55 +42 +150 +56 +44 +156 +58 +47 +160 +59 +47 +163 +59 +48 +170 +58 +47 +173 +56 +46 +175 +57 +47 +176 +58 +46 +176 +58 +46 +176 +58 +44 +175 +57 +43 +174 +56 +42 +168 +55 +41 +165 +55 +40 +158 +54 +41 +155 +54 +42 +149 +55 +43 +146 +56 +45 +145 +57 +47 +142 +60 +48 +136 +60 +46 +133 +60 +45 +131 +59 +44 +129 +57 +42 +127 +58 +42 +126 +57 +42 +125 +58 +42 +125 +59 +43 +124 +58 +44 +122 +59 +44 +121 +59 +44 +119 +57 +42 +115 +56 +42 +113 +54 +40 +114 +55 +41 +117 +53 +41 +140 +68 +56 +146 +72 +61 +145 +75 +63 +138 +72 +58 +135 +73 +60 +139 +79 +68 +147 +84 +75 +151 +84 +76 +150 +81 +76 +155 +84 +80 +152 +81 +79 +148 +83 +79 +150 +92 +88 +144 +95 +88 +144 +104 +94 +151 +126 +106 +148 +148 +112 +133 +146 +102 +117 +130 +87 +89 +104 +63 +67 +82 +43 +63 +79 +42 +80 +96 +60 +99 +114 +81 +101 +116 +85 +92 +105 +75 +78 +88 +61 +67 +76 +49 +63 +69 +43 +62 +66 +41 +61 +65 +40 +59 +61 +39 +55 +56 +40 +58 +59 +45 +55 +57 +46 +57 +60 +49 +61 +65 +51 +55 +64 +45 +60 +73 +47 +79 +97 +59 +98 +120 +73 +108 +136 +77 +118 +149 +82 +117 +153 +81 +116 +152 +78 +114 +155 +79 +114 +154 +83 +111 +155 +80 +113 +160 +79 +111 +158 +77 +111 +158 +77 +115 +162 +82 +122 +168 +93 +124 +170 +97 +122 +165 +94 +117 +160 +91 +99 +140 +74 +94 +135 +69 +91 +131 +68 +95 +135 +72 +103 +142 +79 +106 +145 +80 +102 +141 +76 +96 +135 +72 +98 +135 +81 +89 +126 +75 +82 +119 +68 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +96 +84 +107 +96 +90 +107 +96 +92 +107 +96 +90 +107 +97 +88 +107 +97 +87 +107 +97 +85 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +97 +85 +107 +97 +87 +107 +97 +87 +107 +97 +88 +107 +97 +87 +111 +99 +85 +110 +98 +82 +107 +98 +81 +107 +98 +81 +107 +98 +81 +104 +97 +79 +100 +93 +77 +96 +90 +74 +88 +82 +66 +82 +79 +62 +78 +75 +60 +73 +71 +56 +71 +69 +54 +68 +69 +53 +66 +67 +51 +63 +66 +49 +64 +72 +49 +65 +70 +47 +77 +71 +49 +83 +62 +43 +101 +62 +45 +148 +90 +76 +170 +96 +83 +153 +63 +52 +155 +52 +43 +179 +64 +57 +214 +89 +85 +241 +106 +103 +245 +101 +101 +235 +82 +85 +232 +73 +78 +233 +77 +80 +217 +73 +65 +211 +70 +60 +205 +64 +54 +203 +62 +52 +206 +64 +54 +210 +68 +58 +213 +71 +61 +215 +71 +62 +218 +74 +65 +218 +74 +65 +221 +74 +66 +221 +74 +66 +222 +75 +67 +222 +75 +67 +224 +75 +68 +224 +75 +69 +235 +83 +82 +232 +84 +84 +227 +83 +82 +220 +82 +79 +216 +83 +76 +216 +83 +76 +219 +85 +76 +224 +85 +78 +224 +76 +72 +225 +73 +70 +227 +69 +66 +226 +67 +64 +228 +66 +64 +226 +67 +64 +228 +69 +66 +224 +70 +68 +218 +73 +70 +203 +68 +64 +188 +61 +55 +174 +60 +50 +163 +62 +50 +153 +66 +49 +147 +68 +51 +146 +71 +52 +141 +68 +51 +138 +66 +51 +137 +65 +51 +132 +63 +48 +130 +62 +49 +128 +62 +48 +125 +62 +47 +125 +62 +47 +127 +59 +46 +128 +58 +46 +128 +58 +46 +128 +58 +46 +128 +61 +45 +129 +60 +45 +129 +60 +45 +131 +59 +45 +130 +57 +42 +132 +56 +42 +134 +56 +43 +138 +56 +42 +140 +57 +43 +144 +58 +45 +146 +58 +46 +148 +58 +47 +155 +59 +47 +158 +57 +45 +159 +57 +45 +160 +58 +44 +161 +57 +44 +162 +56 +43 +162 +56 +42 +162 +56 +42 +159 +56 +41 +156 +56 +41 +152 +56 +40 +148 +56 +41 +143 +57 +42 +140 +58 +44 +137 +58 +45 +135 +59 +45 +132 +58 +45 +130 +58 +44 +129 +57 +43 +128 +56 +42 +125 +56 +41 +125 +55 +43 +124 +56 +43 +123 +57 +43 +122 +56 +44 +121 +57 +45 +120 +58 +45 +118 +56 +43 +113 +53 +42 +111 +53 +41 +113 +55 +43 +116 +57 +43 +140 +72 +59 +141 +73 +60 +137 +73 +61 +132 +73 +59 +133 +75 +63 +140 +82 +70 +147 +87 +77 +152 +88 +79 +152 +81 +77 +156 +85 +81 +152 +82 +80 +147 +86 +81 +146 +96 +89 +136 +98 +87 +131 +103 +91 +134 +122 +100 +110 +114 +81 +90 +105 +64 +74 +89 +48 +65 +82 +40 +73 +90 +48 +87 +105 +63 +100 +118 +78 +106 +124 +86 +88 +105 +69 +76 +91 +58 +63 +76 +46 +58 +68 +41 +60 +68 +44 +62 +67 +45 +60 +65 +45 +58 +61 +44 +56 +57 +43 +58 +59 +45 +54 +56 +45 +56 +59 +48 +62 +66 +52 +55 +64 +45 +59 +72 +46 +76 +94 +56 +95 +117 +70 +105 +133 +74 +116 +147 +80 +116 +152 +80 +116 +152 +78 +114 +155 +79 +115 +155 +84 +112 +156 +81 +110 +157 +77 +109 +158 +76 +112 +161 +80 +119 +168 +89 +124 +170 +97 +122 +168 +96 +114 +157 +88 +105 +147 +81 +90 +131 +65 +92 +132 +69 +97 +136 +73 +101 +140 +77 +103 +142 +77 +103 +142 +75 +104 +141 +74 +102 +138 +76 +99 +134 +80 +89 +123 +73 +82 +116 +66 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +97 +85 +108 +98 +89 +108 +98 +89 +108 +98 +89 +108 +98 +86 +108 +98 +86 +108 +99 +82 +108 +99 +82 +108 +100 +81 +108 +100 +81 +108 +100 +81 +108 +99 +82 +108 +99 +84 +108 +98 +86 +108 +98 +88 +108 +98 +88 +108 +98 +88 +111 +99 +85 +110 +98 +82 +107 +98 +81 +108 +99 +82 +108 +99 +82 +107 +98 +81 +103 +96 +80 +100 +93 +77 +94 +87 +71 +89 +83 +67 +83 +77 +63 +77 +74 +59 +75 +72 +57 +71 +69 +54 +69 +66 +51 +64 +65 +47 +61 +71 +46 +66 +70 +45 +81 +66 +45 +98 +61 +45 +129 +69 +58 +169 +89 +82 +178 +79 +74 +155 +46 +43 +175 +60 +57 +184 +62 +59 +208 +84 +82 +242 +112 +110 +254 +118 +118 +243 +100 +104 +237 +88 +94 +242 +93 +95 +227 +85 +81 +218 +80 +70 +212 +71 +64 +208 +67 +58 +209 +68 +61 +212 +71 +62 +214 +71 +65 +214 +71 +63 +217 +72 +67 +218 +74 +66 +220 +72 +68 +221 +74 +67 +222 +74 +70 +222 +75 +68 +224 +75 +71 +224 +75 +71 +226 +72 +72 +225 +71 +73 +220 +72 +72 +217 +71 +71 +214 +72 +68 +215 +72 +68 +216 +71 +66 +219 +70 +66 +224 +66 +65 +228 +65 +66 +230 +66 +65 +232 +66 +66 +231 +67 +66 +228 +66 +64 +223 +65 +62 +219 +65 +63 +221 +73 +71 +205 +66 +63 +188 +59 +54 +175 +61 +51 +165 +63 +51 +153 +64 +48 +146 +65 +48 +144 +67 +51 +140 +64 +50 +137 +64 +49 +136 +62 +49 +134 +60 +49 +132 +60 +48 +129 +59 +49 +129 +59 +49 +128 +60 +49 +128 +60 +49 +127 +61 +49 +127 +60 +51 +127 +61 +49 +127 +61 +49 +127 +61 +47 +127 +61 +49 +127 +61 +47 +128 +60 +47 +129 +60 +45 +131 +59 +45 +131 +57 +44 +133 +57 +44 +132 +56 +42 +133 +55 +43 +133 +54 +41 +141 +57 +46 +143 +56 +46 +145 +57 +45 +148 +58 +47 +151 +59 +46 +154 +61 +46 +158 +60 +47 +159 +62 +46 +153 +57 +41 +150 +57 +40 +147 +58 +42 +144 +58 +43 +138 +59 +44 +135 +59 +43 +132 +59 +44 +130 +58 +43 +130 +58 +44 +129 +57 +43 +127 +55 +41 +126 +54 +40 +123 +53 +41 +123 +53 +41 +123 +53 +41 +122 +54 +41 +120 +54 +42 +120 +56 +44 +119 +57 +44 +115 +56 +42 +112 +52 +41 +111 +53 +41 +114 +58 +45 +118 +60 +48 +139 +77 +64 +137 +75 +60 +132 +74 +60 +130 +77 +61 +133 +81 +67 +139 +86 +72 +146 +88 +77 +151 +87 +78 +147 +78 +73 +153 +84 +79 +151 +86 +82 +149 +92 +85 +144 +101 +92 +123 +94 +80 +102 +86 +70 +96 +94 +71 +69 +79 +45 +62 +78 +41 +63 +79 +40 +74 +92 +50 +95 +114 +69 +107 +126 +81 +101 +120 +75 +88 +106 +64 +77 +95 +55 +64 +81 +45 +54 +69 +38 +55 +68 +42 +61 +70 +49 +61 +68 +52 +58 +62 +48 +55 +59 +45 +56 +58 +44 +58 +59 +45 +54 +56 +45 +56 +59 +48 +62 +66 +52 +55 +64 +45 +57 +70 +44 +73 +91 +53 +91 +113 +66 +101 +129 +70 +114 +145 +78 +115 +151 +79 +115 +151 +77 +114 +155 +79 +115 +155 +84 +112 +156 +81 +109 +156 +76 +111 +160 +79 +115 +164 +85 +120 +168 +92 +122 +168 +96 +115 +160 +91 +105 +147 +81 +96 +138 +72 +89 +129 +66 +94 +134 +71 +101 +140 +77 +103 +142 +77 +102 +141 +74 +101 +141 +71 +103 +140 +71 +104 +140 +76 +97 +132 +78 +88 +122 +72 +81 +115 +65 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +98 +88 +108 +98 +86 +108 +98 +86 +108 +99 +82 +108 +99 +82 +108 +100 +79 +108 +100 +79 +108 +100 +77 +108 +100 +77 +108 +100 +77 +108 +100 +79 +108 +100 +81 +108 +99 +82 +108 +99 +84 +108 +98 +86 +108 +98 +86 +111 +99 +85 +109 +97 +83 +107 +98 +83 +108 +99 +84 +109 +100 +85 +108 +99 +84 +105 +96 +81 +102 +95 +79 +98 +91 +75 +94 +87 +71 +88 +81 +65 +82 +76 +60 +79 +73 +57 +74 +71 +54 +73 +67 +51 +65 +67 +46 +60 +70 +43 +66 +69 +42 +86 +64 +43 +122 +70 +57 +163 +80 +76 +178 +72 +72 +180 +57 +60 +183 +52 +57 +197 +67 +69 +193 +65 +64 +200 +75 +73 +222 +98 +96 +241 +113 +112 +242 +109 +112 +233 +97 +101 +228 +89 +92 +219 +81 +78 +213 +76 +68 +207 +68 +63 +205 +66 +59 +207 +68 +63 +208 +69 +62 +208 +66 +62 +205 +64 +57 +210 +67 +63 +210 +67 +61 +212 +67 +64 +213 +68 +63 +215 +67 +65 +216 +68 +64 +217 +69 +67 +218 +68 +67 +221 +65 +68 +221 +65 +68 +222 +68 +70 +221 +71 +72 +223 +73 +72 +224 +74 +73 +227 +73 +73 +229 +71 +72 +231 +65 +67 +234 +65 +68 +236 +66 +69 +236 +66 +69 +231 +65 +65 +226 +64 +62 +219 +61 +58 +214 +60 +58 +219 +69 +70 +204 +60 +60 +188 +54 +51 +177 +58 +50 +169 +62 +52 +155 +61 +49 +147 +61 +48 +145 +63 +49 +139 +60 +47 +139 +59 +48 +138 +58 +49 +137 +57 +48 +136 +56 +49 +135 +56 +51 +136 +57 +52 +133 +58 +52 +128 +60 +51 +125 +61 +51 +125 +61 +52 +125 +61 +51 +125 +61 +51 +125 +61 +49 +125 +61 +51 +124 +60 +48 +124 +60 +48 +124 +61 +46 +126 +60 +46 +126 +58 +45 +125 +57 +44 +125 +56 +41 +126 +54 +42 +126 +54 +42 +131 +57 +46 +131 +57 +46 +135 +57 +45 +137 +57 +46 +141 +57 +46 +145 +59 +46 +149 +60 +46 +150 +61 +45 +146 +57 +41 +145 +58 +41 +141 +58 +42 +138 +59 +42 +135 +59 +43 +131 +60 +42 +128 +59 +43 +126 +59 +42 +128 +56 +42 +128 +56 +44 +126 +54 +42 +125 +53 +41 +124 +52 +40 +122 +52 +40 +122 +52 +42 +121 +53 +42 +117 +50 +41 +118 +54 +44 +118 +56 +45 +114 +54 +43 +111 +51 +41 +111 +53 +42 +115 +58 +47 +120 +64 +51 +138 +80 +66 +134 +78 +63 +129 +78 +61 +130 +81 +64 +133 +86 +70 +137 +88 +73 +142 +85 +74 +145 +82 +73 +146 +79 +73 +151 +84 +78 +147 +84 +79 +145 +92 +86 +138 +102 +90 +110 +91 +74 +80 +75 +55 +69 +75 +49 +65 +78 +48 +75 +90 +57 +87 +103 +67 +96 +114 +74 +103 +121 +79 +100 +122 +76 +86 +108 +62 +71 +93 +47 +65 +86 +45 +55 +72 +36 +49 +64 +33 +54 +66 +42 +61 +70 +53 +60 +68 +57 +56 +61 +54 +55 +58 +51 +57 +59 +46 +59 +60 +46 +54 +56 +45 +57 +60 +49 +63 +67 +53 +55 +64 +45 +55 +68 +42 +70 +88 +50 +86 +108 +61 +97 +125 +66 +111 +142 +75 +113 +149 +77 +115 +151 +77 +114 +155 +79 +116 +156 +85 +113 +157 +82 +111 +158 +80 +113 +162 +81 +117 +166 +87 +118 +166 +90 +115 +161 +89 +106 +151 +82 +98 +140 +74 +91 +133 +69 +94 +134 +72 +96 +136 +73 +99 +138 +75 +101 +140 +75 +102 +141 +74 +102 +142 +72 +102 +139 +70 +101 +137 +73 +96 +131 +77 +87 +121 +71 +80 +114 +64 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +105 +96 +81 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +98 +86 +108 +99 +84 +108 +99 +84 +108 +99 +82 +108 +100 +81 +108 +100 +79 +108 +100 +79 +108 +100 +77 +108 +100 +77 +108 +100 +79 +108 +100 +79 +108 +100 +81 +108 +99 +82 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +109 +97 +83 +109 +97 +83 +109 +97 +83 +109 +100 +85 +108 +99 +84 +106 +97 +82 +103 +96 +80 +100 +93 +77 +96 +89 +73 +90 +83 +67 +85 +78 +62 +80 +75 +56 +77 +72 +53 +73 +68 +49 +69 +67 +46 +65 +69 +42 +71 +67 +40 +92 +65 +44 +137 +83 +71 +175 +92 +88 +169 +63 +65 +169 +49 +51 +203 +74 +78 +195 +64 +69 +189 +61 +62 +185 +59 +60 +195 +71 +71 +216 +90 +91 +229 +101 +102 +221 +88 +91 +205 +71 +72 +209 +74 +71 +207 +69 +66 +205 +66 +63 +206 +67 +62 +210 +71 +66 +210 +71 +66 +206 +67 +62 +201 +62 +55 +207 +68 +61 +209 +68 +61 +210 +68 +64 +212 +69 +65 +214 +69 +66 +217 +69 +67 +220 +67 +69 +222 +68 +70 +222 +63 +67 +223 +64 +68 +222 +66 +69 +223 +69 +69 +225 +71 +71 +224 +70 +70 +224 +66 +67 +225 +62 +63 +232 +66 +68 +234 +64 +67 +232 +62 +65 +231 +61 +62 +228 +62 +62 +228 +64 +63 +226 +67 +64 +223 +69 +67 +215 +65 +66 +200 +56 +56 +184 +52 +48 +177 +58 +52 +169 +62 +54 +155 +61 +51 +146 +60 +47 +142 +63 +50 +137 +59 +47 +136 +58 +48 +136 +58 +48 +136 +56 +49 +136 +55 +51 +138 +55 +51 +137 +56 +52 +136 +59 +53 +128 +58 +50 +126 +59 +50 +126 +59 +50 +124 +60 +50 +124 +60 +48 +124 +60 +48 +124 +60 +48 +124 +60 +48 +120 +56 +44 +121 +57 +45 +124 +58 +46 +124 +58 +46 +125 +59 +45 +125 +59 +45 +125 +57 +44 +125 +57 +44 +126 +58 +47 +127 +57 +47 +128 +55 +46 +129 +55 +44 +132 +54 +42 +133 +53 +42 +134 +55 +42 +134 +55 +40 +138 +56 +42 +136 +57 +42 +136 +59 +43 +133 +60 +45 +132 +60 +45 +128 +61 +44 +126 +60 +44 +125 +59 +43 +125 +57 +44 +125 +55 +45 +124 +54 +44 +121 +53 +42 +122 +52 +42 +120 +52 +41 +120 +52 +41 +120 +53 +44 +114 +50 +40 +117 +53 +43 +118 +56 +45 +114 +54 +43 +110 +52 +41 +110 +53 +42 +116 +59 +48 +120 +66 +54 +138 +85 +71 +132 +80 +66 +128 +79 +64 +132 +83 +68 +136 +87 +73 +140 +86 +74 +140 +82 +71 +141 +78 +71 +149 +84 +78 +148 +85 +78 +139 +82 +75 +132 +88 +77 +127 +100 +83 +101 +90 +68 +71 +75 +50 +61 +74 +44 +73 +88 +57 +90 +107 +73 +103 +120 +84 +99 +120 +81 +89 +110 +69 +83 +104 +61 +78 +99 +56 +74 +95 +52 +58 +76 +38 +48 +63 +30 +44 +57 +29 +53 +62 +41 +61 +67 +53 +60 +66 +56 +58 +60 +55 +57 +60 +53 +59 +61 +50 +59 +61 +48 +55 +57 +46 +57 +60 +49 +63 +67 +53 +56 +63 +45 +56 +66 +41 +69 +85 +49 +85 +104 +59 +97 +122 +67 +110 +138 +77 +114 +147 +78 +114 +150 +78 +114 +154 +81 +115 +157 +83 +113 +157 +82 +114 +160 +85 +117 +163 +88 +118 +164 +91 +116 +162 +90 +111 +154 +85 +102 +144 +78 +94 +136 +72 +91 +131 +68 +100 +140 +78 +97 +137 +75 +96 +135 +72 +99 +138 +73 +102 +141 +74 +103 +142 +75 +101 +138 +69 +97 +133 +69 +96 +131 +77 +87 +121 +71 +80 +114 +64 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +81 +107 +98 +81 +107 +98 +81 +107 +98 +81 +108 +99 +82 +108 +99 +82 +108 +99 +82 +108 +99 +82 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +107 +93 +80 +112 +96 +81 +116 +100 +87 +114 +100 +87 +110 +98 +86 +106 +96 +84 +104 +96 +83 +104 +98 +84 +103 +97 +83 +103 +97 +81 +99 +93 +77 +91 +86 +67 +86 +81 +61 +83 +78 +56 +78 +72 +50 +71 +65 +41 +76 +70 +44 +74 +62 +36 +98 +73 +51 +145 +103 +87 +182 +120 +109 +187 +108 +101 +183 +89 +87 +185 +79 +79 +182 +66 +69 +189 +66 +69 +194 +68 +71 +200 +70 +72 +205 +72 +75 +208 +74 +75 +211 +75 +77 +211 +75 +77 +205 +69 +69 +205 +69 +69 +208 +70 +68 +211 +72 +69 +212 +70 +66 +207 +68 +61 +206 +67 +60 +207 +70 +60 +200 +68 +56 +201 +69 +57 +203 +69 +60 +207 +68 +63 +212 +67 +64 +216 +66 +67 +222 +63 +68 +222 +61 +67 +225 +66 +70 +223 +67 +68 +223 +67 +68 +224 +68 +69 +224 +68 +69 +225 +70 +68 +225 +70 +68 +227 +69 +68 +227 +67 +67 +228 +66 +64 +228 +64 +63 +227 +63 +62 +227 +63 +62 +227 +63 +61 +227 +63 +61 +224 +66 +63 +211 +66 +63 +197 +62 +58 +184 +57 +51 +170 +55 +48 +160 +57 +48 +151 +61 +50 +142 +62 +51 +134 +62 +50 +131 +63 +50 +129 +63 +51 +129 +61 +50 +129 +59 +51 +132 +57 +51 +135 +56 +51 +136 +56 +49 +136 +57 +50 +133 +59 +48 +132 +60 +46 +132 +60 +46 +129 +60 +45 +129 +59 +47 +128 +58 +46 +128 +58 +46 +128 +58 +46 +126 +58 +45 +126 +58 +45 +126 +58 +45 +126 +58 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +125 +57 +48 +126 +56 +48 +126 +56 +46 +128 +55 +46 +128 +55 +46 +128 +55 +46 +126 +56 +44 +128 +56 +44 +126 +56 +44 +125 +57 +44 +124 +56 +45 +123 +57 +45 +122 +56 +44 +120 +56 +44 +120 +56 +44 +120 +56 +46 +120 +56 +46 +119 +55 +45 +118 +56 +45 +118 +54 +44 +116 +54 +43 +115 +53 +42 +113 +53 +43 +109 +49 +39 +114 +54 +44 +110 +52 +41 +109 +51 +40 +111 +54 +43 +109 +52 +41 +113 +56 +45 +127 +73 +61 +133 +83 +72 +133 +83 +74 +134 +82 +71 +136 +82 +72 +139 +80 +72 +144 +81 +74 +148 +81 +75 +149 +82 +76 +147 +84 +77 +141 +84 +75 +137 +91 +78 +130 +99 +81 +111 +95 +72 +89 +85 +58 +77 +86 +55 +79 +95 +59 +106 +126 +89 +98 +120 +81 +89 +111 +72 +85 +106 +67 +82 +103 +64 +77 +98 +59 +73 +89 +53 +67 +82 +49 +55 +68 +38 +52 +62 +35 +50 +58 +35 +54 +59 +39 +60 +62 +48 +64 +66 +53 +64 +64 +54 +60 +62 +51 +53 +56 +45 +51 +57 +45 +52 +58 +46 +55 +58 +47 +57 +61 +47 +59 +63 +46 +61 +66 +44 +60 +69 +40 +83 +95 +59 +97 +114 +70 +110 +134 +82 +115 +145 +85 +114 +149 +81 +114 +154 +83 +115 +157 +83 +114 +157 +85 +117 +158 +90 +126 +167 +101 +126 +167 +101 +112 +152 +89 +98 +138 +75 +94 +134 +71 +94 +134 +72 +94 +132 +71 +96 +134 +73 +98 +136 +75 +100 +138 +77 +102 +141 +78 +101 +140 +77 +99 +138 +75 +96 +135 +72 +94 +132 +71 +95 +130 +76 +84 +118 +68 +75 +109 +59 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +114 +98 +83 +113 +97 +82 +114 +98 +85 +113 +99 +86 +114 +102 +90 +111 +103 +90 +109 +101 +88 +106 +100 +86 +103 +99 +87 +107 +104 +89 +111 +105 +89 +108 +103 +84 +104 +99 +79 +99 +94 +72 +91 +85 +61 +82 +76 +52 +80 +74 +48 +72 +62 +37 +81 +63 +41 +107 +80 +61 +127 +88 +71 +132 +78 +66 +136 +69 +61 +147 +68 +63 +177 +87 +86 +184 +84 +84 +187 +81 +81 +192 +80 +79 +192 +78 +77 +193 +77 +77 +194 +76 +74 +194 +76 +74 +205 +85 +84 +197 +73 +71 +192 +62 +62 +195 +61 +58 +205 +67 +64 +209 +70 +65 +205 +66 +59 +199 +62 +52 +202 +68 +57 +202 +68 +57 +204 +70 +61 +208 +69 +62 +214 +69 +66 +219 +66 +68 +223 +64 +69 +224 +63 +69 +223 +67 +70 +223 +67 +68 +223 +67 +68 +223 +69 +69 +224 +69 +67 +224 +70 +68 +225 +70 +68 +225 +70 +68 +224 +69 +65 +225 +67 +64 +224 +66 +63 +224 +65 +62 +226 +64 +61 +226 +64 +61 +226 +64 +61 +224 +66 +63 +213 +68 +63 +200 +67 +60 +186 +62 +54 +172 +58 +48 +160 +57 +48 +148 +58 +47 +138 +60 +48 +130 +60 +48 +128 +65 +50 +126 +64 +51 +126 +62 +52 +127 +60 +51 +131 +58 +51 +134 +57 +49 +136 +56 +49 +137 +57 +48 +135 +59 +46 +133 +60 +45 +132 +59 +44 +132 +59 +44 +131 +59 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +127 +57 +45 +127 +57 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +124 +57 +48 +124 +57 +48 +124 +57 +48 +122 +58 +48 +122 +58 +48 +121 +57 +47 +121 +57 +47 +121 +57 +47 +119 +57 +46 +119 +57 +46 +119 +56 +47 +119 +56 +47 +116 +56 +46 +115 +55 +45 +114 +54 +44 +114 +54 +44 +112 +54 +43 +112 +54 +43 +107 +49 +38 +113 +55 +44 +109 +52 +41 +108 +51 +40 +111 +54 +43 +108 +51 +40 +112 +55 +44 +126 +72 +62 +132 +82 +73 +133 +83 +76 +136 +81 +74 +139 +80 +74 +144 +81 +76 +148 +80 +77 +149 +81 +78 +148 +83 +79 +138 +79 +71 +133 +83 +72 +128 +91 +75 +123 +101 +80 +115 +105 +80 +104 +107 +76 +102 +113 +81 +103 +120 +84 +94 +116 +77 +88 +110 +71 +80 +102 +63 +76 +97 +58 +75 +95 +58 +75 +92 +58 +71 +86 +55 +67 +80 +52 +60 +70 +45 +56 +64 +41 +54 +59 +39 +55 +58 +41 +60 +61 +47 +63 +64 +50 +62 +62 +50 +59 +61 +48 +52 +58 +48 +51 +59 +48 +53 +59 +49 +54 +60 +48 +58 +60 +47 +60 +63 +46 +62 +65 +44 +62 +68 +42 +81 +91 +57 +94 +109 +68 +107 +129 +82 +112 +140 +82 +112 +147 +83 +113 +153 +82 +115 +157 +83 +115 +158 +86 +120 +159 +94 +124 +162 +101 +120 +158 +97 +107 +145 +84 +96 +134 +73 +93 +131 +70 +93 +131 +70 +92 +130 +69 +96 +134 +73 +97 +135 +74 +99 +137 +76 +101 +139 +78 +100 +138 +77 +98 +136 +75 +96 +134 +73 +94 +132 +73 +93 +127 +76 +82 +116 +66 +73 +107 +57 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +113 +100 +84 +111 +95 +80 +109 +93 +80 +109 +95 +82 +113 +101 +89 +111 +103 +92 +108 +100 +89 +104 +98 +86 +102 +98 +87 +112 +108 +96 +123 +120 +105 +126 +123 +106 +127 +121 +105 +122 +117 +98 +112 +105 +86 +101 +96 +74 +84 +84 +60 +70 +70 +46 +67 +62 +40 +77 +66 +46 +83 +64 +47 +85 +56 +40 +93 +55 +42 +108 +61 +51 +110 +55 +48 +117 +57 +49 +126 +59 +53 +135 +64 +58 +146 +73 +66 +155 +80 +74 +165 +88 +80 +171 +91 +82 +185 +94 +89 +183 +84 +78 +181 +72 +69 +186 +67 +63 +198 +68 +66 +206 +71 +67 +210 +68 +64 +207 +64 +58 +208 +65 +59 +209 +66 +60 +211 +68 +62 +213 +70 +64 +215 +70 +67 +219 +69 +70 +222 +68 +70 +222 +68 +70 +222 +68 +68 +222 +68 +68 +222 +68 +68 +221 +69 +68 +223 +69 +69 +222 +70 +69 +223 +69 +67 +223 +69 +67 +222 +68 +66 +222 +68 +66 +221 +68 +63 +220 +67 +62 +221 +66 +61 +221 +66 +61 +221 +66 +61 +220 +67 +62 +214 +69 +64 +206 +69 +63 +195 +66 +60 +179 +62 +53 +162 +58 +49 +148 +56 +45 +136 +57 +44 +131 +59 +45 +130 +64 +50 +127 +64 +49 +126 +62 +50 +127 +61 +49 +131 +58 +49 +134 +57 +49 +135 +56 +49 +136 +58 +48 +135 +59 +46 +132 +59 +44 +132 +59 +44 +132 +59 +44 +130 +58 +44 +130 +58 +44 +128 +58 +46 +128 +58 +46 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +125 +57 +48 +125 +57 +48 +125 +57 +48 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +123 +59 +49 +123 +59 +49 +122 +58 +48 +121 +59 +48 +120 +58 +47 +120 +58 +47 +120 +58 +47 +120 +58 +47 +116 +56 +46 +116 +56 +46 +115 +55 +45 +115 +55 +45 +114 +54 +44 +113 +53 +43 +111 +53 +42 +111 +53 +42 +106 +49 +38 +111 +54 +43 +109 +52 +41 +107 +50 +39 +108 +54 +42 +105 +51 +39 +109 +55 +43 +125 +71 +61 +135 +80 +73 +135 +80 +73 +139 +80 +74 +142 +81 +76 +145 +82 +77 +146 +83 +78 +148 +85 +80 +145 +86 +80 +140 +87 +79 +135 +91 +80 +126 +94 +79 +116 +98 +78 +111 +105 +81 +111 +114 +85 +108 +119 +89 +102 +119 +85 +81 +101 +66 +75 +95 +58 +69 +89 +54 +68 +85 +51 +69 +86 +54 +71 +86 +57 +71 +84 +56 +69 +82 +56 +63 +73 +48 +60 +68 +45 +57 +62 +42 +55 +59 +42 +58 +60 +46 +60 +62 +48 +59 +61 +47 +57 +59 +46 +54 +60 +50 +53 +61 +50 +54 +60 +50 +54 +60 +48 +58 +60 +47 +60 +62 +48 +61 +64 +45 +61 +67 +41 +77 +87 +53 +90 +105 +64 +102 +124 +77 +108 +136 +78 +110 +145 +81 +113 +153 +82 +117 +159 +85 +116 +159 +87 +122 +161 +96 +119 +157 +96 +110 +148 +87 +99 +137 +76 +92 +130 +69 +92 +130 +69 +92 +130 +69 +90 +128 +67 +95 +133 +72 +97 +135 +74 +98 +136 +75 +100 +138 +77 +99 +137 +76 +97 +135 +74 +95 +133 +72 +93 +131 +72 +91 +125 +74 +80 +113 +66 +70 +103 +56 +105 +96 +81 +105 +96 +81 +105 +96 +81 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +106 +97 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +110 +98 +84 +114 +100 +87 +111 +97 +84 +109 +95 +82 +107 +95 +83 +107 +97 +87 +108 +99 +90 +108 +101 +91 +106 +102 +93 +106 +102 +93 +120 +116 +105 +136 +132 +120 +145 +141 +129 +149 +143 +129 +146 +140 +126 +137 +130 +114 +125 +122 +103 +96 +99 +78 +79 +84 +62 +68 +71 +50 +70 +69 +49 +72 +67 +48 +70 +61 +44 +76 +60 +44 +86 +67 +52 +80 +57 +43 +82 +54 +42 +86 +52 +42 +89 +53 +41 +92 +54 +43 +97 +57 +47 +101 +61 +49 +109 +61 +49 +136 +76 +66 +157 +83 +74 +173 +86 +79 +181 +79 +75 +188 +70 +68 +196 +66 +66 +208 +68 +67 +216 +70 +70 +212 +64 +62 +213 +65 +63 +214 +66 +62 +216 +68 +64 +217 +69 +67 +219 +69 +68 +219 +69 +68 +221 +69 +68 +222 +68 +68 +221 +69 +68 +221 +69 +68 +221 +69 +68 +221 +69 +68 +221 +69 +68 +221 +69 +66 +220 +71 +67 +219 +70 +66 +218 +69 +65 +217 +68 +62 +217 +68 +62 +218 +67 +60 +218 +67 +60 +219 +68 +61 +217 +68 +62 +214 +67 +60 +211 +70 +63 +201 +70 +62 +186 +65 +56 +167 +59 +49 +152 +56 +44 +140 +57 +43 +133 +60 +45 +131 +64 +48 +127 +64 +49 +126 +63 +48 +127 +61 +47 +131 +58 +49 +132 +58 +47 +135 +57 +47 +136 +58 +46 +132 +58 +45 +132 +59 +44 +132 +59 +44 +131 +58 +43 +130 +58 +44 +130 +58 +44 +127 +57 +45 +127 +57 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +48 +124 +57 +48 +125 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +123 +56 +47 +120 +56 +46 +123 +59 +49 +121 +59 +48 +121 +59 +48 +121 +59 +48 +120 +58 +47 +120 +58 +47 +120 +58 +47 +118 +58 +47 +115 +55 +45 +115 +55 +45 +115 +55 +45 +114 +54 +44 +113 +53 +43 +111 +53 +42 +111 +53 +42 +109 +52 +41 +106 +49 +38 +111 +54 +43 +108 +51 +40 +104 +50 +38 +107 +53 +41 +104 +50 +38 +108 +54 +42 +124 +70 +60 +138 +79 +71 +140 +79 +74 +141 +80 +75 +143 +82 +77 +144 +83 +78 +145 +86 +80 +144 +87 +80 +140 +90 +81 +137 +93 +82 +133 +97 +85 +121 +95 +80 +105 +90 +71 +100 +95 +73 +100 +104 +79 +92 +102 +75 +78 +93 +64 +69 +85 +56 +65 +81 +52 +61 +77 +48 +60 +75 +46 +63 +77 +51 +67 +81 +55 +70 +82 +58 +71 +83 +59 +66 +76 +52 +62 +71 +50 +58 +65 +47 +57 +61 +44 +57 +61 +46 +57 +61 +46 +56 +60 +45 +55 +59 +45 +55 +61 +51 +54 +61 +53 +54 +59 +52 +54 +60 +50 +58 +60 +49 +59 +61 +47 +60 +63 +44 +60 +65 +42 +74 +83 +52 +86 +101 +62 +98 +120 +73 +106 +134 +76 +110 +145 +81 +115 +155 +84 +119 +161 +87 +120 +162 +90 +123 +162 +97 +114 +152 +91 +101 +139 +78 +92 +130 +69 +90 +128 +67 +92 +130 +69 +92 +130 +69 +90 +128 +67 +95 +133 +72 +96 +134 +73 +97 +135 +74 +98 +136 +75 +97 +135 +74 +96 +134 +73 +94 +132 +71 +93 +131 +74 +90 +124 +74 +78 +111 +64 +69 +102 +55 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +114 +102 +88 +116 +104 +92 +115 +103 +91 +109 +99 +89 +106 +97 +88 +108 +101 +93 +115 +110 +104 +122 +119 +112 +129 +126 +119 +144 +141 +134 +160 +157 +148 +168 +165 +156 +171 +167 +156 +168 +164 +153 +163 +157 +145 +153 +150 +135 +122 +123 +107 +99 +102 +83 +79 +82 +63 +71 +74 +55 +69 +72 +53 +66 +69 +50 +66 +69 +50 +69 +72 +53 +75 +76 +60 +74 +72 +57 +71 +68 +53 +68 +62 +48 +65 +57 +44 +65 +55 +43 +64 +54 +42 +70 +52 +40 +85 +53 +42 +113 +66 +56 +142 +79 +72 +160 +79 +75 +175 +73 +71 +191 +71 +73 +204 +69 +73 +211 +66 +69 +213 +64 +66 +215 +65 +66 +216 +66 +65 +217 +67 +66 +218 +69 +65 +218 +69 +65 +218 +69 +65 +218 +69 +65 +221 +69 +68 +221 +68 +70 +221 +68 +70 +219 +69 +70 +219 +69 +68 +219 +69 +68 +219 +69 +68 +217 +69 +67 +218 +70 +66 +217 +69 +65 +214 +70 +62 +213 +69 +61 +213 +69 +61 +213 +69 +61 +213 +69 +61 +214 +70 +62 +212 +65 +58 +211 +67 +59 +206 +69 +61 +193 +66 +57 +174 +62 +51 +158 +57 +45 +145 +59 +46 +138 +60 +47 +132 +63 +48 +129 +63 +47 +128 +62 +46 +128 +61 +45 +129 +59 +47 +132 +58 +45 +134 +58 +45 +135 +59 +46 +132 +58 +45 +131 +59 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +129 +57 +43 +127 +57 +45 +127 +57 +45 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +124 +57 +49 +122 +58 +49 +124 +57 +49 +121 +57 +48 +121 +57 +48 +120 +56 +47 +120 +56 +47 +118 +55 +46 +121 +58 +49 +121 +58 +49 +120 +57 +48 +118 +58 +48 +118 +58 +48 +117 +57 +47 +117 +57 +47 +116 +58 +47 +114 +55 +47 +113 +54 +46 +113 +54 +46 +112 +53 +45 +111 +52 +44 +110 +51 +43 +110 +51 +43 +109 +52 +43 +106 +49 +40 +109 +55 +45 +106 +52 +42 +104 +50 +40 +106 +52 +42 +102 +50 +39 +106 +54 +43 +125 +68 +59 +141 +78 +71 +143 +78 +72 +144 +81 +74 +144 +84 +76 +144 +85 +79 +142 +87 +80 +138 +89 +82 +131 +91 +81 +123 +89 +77 +118 +92 +79 +107 +90 +74 +93 +85 +66 +89 +88 +68 +89 +94 +72 +79 +89 +65 +63 +75 +51 +58 +72 +47 +55 +69 +46 +52 +66 +43 +53 +65 +43 +56 +68 +46 +61 +73 +51 +67 +76 +55 +69 +78 +57 +66 +75 +54 +63 +72 +53 +60 +69 +50 +58 +65 +47 +56 +63 +47 +55 +62 +46 +53 +60 +44 +52 +58 +44 +53 +60 +52 +53 +60 +53 +54 +59 +53 +54 +59 +52 +57 +59 +48 +58 +60 +47 +59 +62 +45 +59 +64 +41 +71 +80 +49 +82 +97 +58 +96 +118 +71 +105 +133 +75 +111 +146 +82 +117 +157 +86 +121 +163 +89 +121 +163 +91 +120 +159 +96 +110 +145 +87 +96 +131 +73 +90 +125 +67 +91 +126 +68 +94 +129 +71 +94 +129 +71 +93 +128 +70 +96 +131 +73 +97 +132 +74 +98 +133 +75 +98 +133 +75 +97 +132 +74 +96 +131 +73 +95 +130 +72 +94 +129 +73 +87 +124 +73 +76 +112 +66 +66 +102 +56 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +107 +97 +85 +110 +100 +90 +112 +102 +92 +108 +99 +90 +107 +100 +92 +114 +109 +103 +132 +129 +124 +145 +144 +140 +167 +163 +160 +181 +177 +174 +196 +193 +188 +201 +198 +193 +201 +196 +190 +197 +192 +186 +192 +185 +177 +185 +178 +168 +164 +156 +143 +136 +130 +114 +102 +99 +84 +80 +81 +63 +70 +73 +56 +62 +69 +51 +59 +68 +49 +58 +70 +50 +56 +69 +51 +56 +69 +51 +56 +67 +50 +58 +66 +51 +60 +66 +52 +64 +67 +56 +67 +69 +58 +71 +69 +57 +64 +52 +40 +83 +56 +47 +104 +61 +54 +129 +68 +65 +163 +79 +79 +192 +87 +91 +204 +81 +86 +202 +67 +73 +211 +71 +74 +214 +70 +70 +216 +70 +70 +218 +70 +68 +219 +70 +66 +219 +70 +66 +220 +68 +63 +220 +68 +65 +221 +69 +68 +221 +68 +70 +219 +69 +70 +219 +69 +70 +218 +68 +67 +218 +68 +67 +218 +68 +67 +217 +69 +67 +217 +69 +65 +215 +70 +65 +214 +69 +64 +212 +69 +61 +211 +68 +60 +210 +69 +60 +211 +70 +61 +212 +69 +61 +212 +63 +56 +213 +64 +57 +208 +67 +58 +198 +67 +57 +182 +65 +55 +165 +61 +48 +150 +61 +47 +140 +61 +46 +134 +62 +47 +130 +63 +47 +129 +62 +46 +128 +61 +45 +129 +60 +45 +131 +59 +45 +132 +58 +45 +133 +59 +46 +130 +58 +44 +130 +58 +44 +130 +58 +44 +130 +58 +44 +129 +57 +43 +127 +58 +43 +127 +57 +45 +126 +56 +44 +126 +58 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +122 +58 +49 +122 +58 +49 +121 +57 +48 +121 +57 +48 +120 +56 +47 +118 +55 +46 +118 +55 +46 +116 +56 +46 +119 +56 +47 +117 +57 +47 +117 +57 +47 +115 +57 +46 +116 +56 +46 +115 +57 +46 +114 +56 +45 +114 +56 +45 +113 +54 +46 +113 +54 +46 +112 +53 +45 +111 +52 +44 +110 +51 +43 +109 +52 +43 +108 +51 +42 +106 +52 +42 +104 +50 +40 +108 +54 +44 +105 +51 +41 +102 +50 +39 +104 +52 +41 +101 +49 +38 +105 +53 +42 +123 +66 +57 +142 +77 +71 +146 +77 +72 +145 +80 +74 +143 +84 +76 +141 +86 +79 +135 +88 +78 +129 +89 +79 +124 +92 +81 +115 +92 +78 +107 +91 +76 +96 +87 +70 +86 +83 +66 +80 +83 +66 +74 +81 +63 +64 +73 +54 +52 +64 +44 +51 +60 +43 +50 +59 +42 +48 +57 +40 +48 +57 +40 +50 +59 +42 +53 +62 +45 +57 +66 +49 +60 +69 +52 +63 +72 +55 +63 +72 +53 +62 +71 +52 +58 +70 +50 +58 +67 +50 +53 +64 +47 +51 +62 +45 +49 +60 +44 +51 +58 +51 +51 +57 +53 +52 +57 +53 +52 +57 +50 +56 +57 +49 +57 +59 +46 +59 +62 +45 +59 +64 +42 +67 +76 +47 +79 +94 +55 +93 +115 +68 +105 +132 +77 +112 +147 +83 +119 +159 +89 +121 +163 +89 +119 +161 +89 +113 +152 +89 +102 +137 +79 +90 +125 +67 +88 +123 +65 +92 +127 +69 +93 +128 +70 +93 +128 +70 +94 +129 +71 +96 +131 +73 +96 +131 +73 +96 +131 +73 +96 +131 +73 +96 +131 +73 +95 +130 +72 +94 +129 +71 +93 +128 +74 +85 +121 +73 +74 +110 +64 +65 +101 +57 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +98 +86 +106 +96 +86 +106 +97 +88 +107 +100 +90 +107 +103 +94 +117 +112 +106 +136 +133 +128 +159 +158 +154 +176 +176 +174 +195 +194 +192 +211 +210 +208 +226 +225 +223 +231 +230 +228 +231 +227 +224 +227 +222 +218 +222 +214 +211 +217 +206 +200 +206 +188 +178 +184 +165 +151 +151 +135 +122 +121 +109 +93 +95 +89 +73 +75 +76 +58 +64 +69 +49 +59 +68 +47 +62 +74 +54 +61 +72 +55 +61 +70 +53 +59 +67 +52 +59 +62 +53 +58 +59 +51 +57 +56 +51 +58 +55 +48 +63 +60 +51 +69 +59 +50 +81 +53 +49 +99 +55 +52 +137 +71 +72 +177 +92 +95 +199 +96 +100 +202 +87 +90 +205 +81 +83 +209 +79 +79 +213 +78 +75 +216 +77 +74 +219 +74 +71 +221 +72 +68 +224 +69 +65 +223 +68 +66 +222 +68 +68 +221 +68 +70 +221 +68 +70 +220 +67 +69 +220 +67 +69 +219 +66 +68 +219 +67 +66 +217 +67 +66 +218 +68 +67 +216 +68 +64 +213 +68 +63 +212 +69 +63 +211 +68 +60 +210 +69 +60 +211 +70 +61 +212 +69 +61 +217 +64 +58 +217 +64 +58 +209 +66 +58 +200 +67 +58 +188 +67 +58 +172 +64 +52 +153 +59 +47 +140 +57 +43 +137 +61 +47 +131 +62 +46 +129 +62 +45 +128 +61 +44 +129 +60 +44 +131 +59 +44 +131 +59 +44 +132 +60 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +129 +57 +43 +127 +57 +45 +127 +57 +45 +126 +56 +46 +125 +57 +46 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +122 +58 +49 +121 +58 +49 +120 +57 +48 +120 +57 +48 +119 +56 +47 +116 +56 +46 +115 +55 +45 +114 +56 +45 +116 +56 +46 +115 +57 +46 +114 +56 +45 +113 +56 +45 +114 +56 +45 +112 +55 +44 +112 +55 +44 +112 +55 +44 +111 +54 +45 +111 +54 +45 +110 +53 +44 +110 +53 +44 +109 +52 +43 +108 +51 +42 +107 +50 +41 +105 +51 +41 +103 +49 +39 +107 +55 +44 +104 +52 +41 +101 +49 +38 +104 +52 +41 +98 +48 +37 +102 +52 +41 +122 +65 +56 +144 +77 +71 +146 +77 +72 +145 +80 +74 +142 +85 +76 +136 +88 +78 +129 +89 +79 +120 +90 +79 +114 +92 +78 +107 +94 +78 +94 +87 +71 +82 +80 +65 +75 +78 +61 +67 +74 +58 +57 +66 +49 +50 +58 +43 +48 +56 +41 +49 +55 +43 +49 +55 +45 +48 +54 +44 +47 +53 +43 +47 +53 +41 +48 +56 +43 +50 +58 +43 +52 +60 +45 +57 +68 +52 +59 +70 +53 +61 +72 +55 +60 +73 +55 +59 +70 +53 +54 +67 +49 +51 +64 +44 +49 +62 +45 +46 +56 +48 +48 +54 +50 +49 +54 +50 +50 +55 +49 +55 +56 +50 +57 +59 +48 +58 +60 +46 +58 +63 +41 +63 +72 +43 +75 +89 +53 +91 +113 +67 +104 +131 +76 +113 +147 +86 +119 +158 +91 +119 +161 +89 +115 +156 +86 +103 +141 +80 +94 +129 +73 +85 +120 +64 +87 +122 +66 +91 +126 +70 +91 +126 +70 +91 +126 +70 +93 +128 +72 +95 +130 +74 +95 +130 +74 +95 +130 +74 +95 +130 +74 +94 +129 +73 +94 +129 +73 +93 +128 +72 +93 +128 +74 +85 +118 +73 +74 +107 +64 +64 +96 +55 +104 +97 +81 +104 +97 +81 +104 +97 +81 +105 +98 +82 +105 +98 +82 +106 +99 +83 +106 +99 +83 +106 +99 +83 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +105 +98 +82 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +99 +84 +108 +98 +86 +112 +103 +94 +110 +103 +95 +108 +103 +97 +116 +113 +106 +135 +132 +127 +161 +160 +156 +188 +188 +186 +206 +208 +207 +207 +207 +207 +224 +224 +224 +242 +242 +242 +250 +248 +249 +251 +247 +246 +247 +243 +240 +241 +236 +233 +240 +226 +223 +232 +208 +198 +221 +193 +181 +193 +171 +157 +162 +145 +129 +125 +117 +98 +94 +92 +71 +75 +77 +55 +67 +72 +50 +65 +73 +50 +65 +73 +52 +64 +71 +53 +66 +68 +55 +65 +65 +55 +66 +61 +57 +67 +57 +55 +65 +57 +54 +59 +58 +53 +66 +61 +55 +71 +53 +49 +76 +45 +43 +102 +54 +54 +145 +81 +82 +181 +102 +105 +199 +109 +109 +192 +92 +92 +199 +90 +87 +206 +87 +83 +211 +84 +78 +216 +78 +75 +222 +74 +72 +225 +70 +68 +226 +68 +67 +221 +68 +70 +219 +69 +70 +219 +69 +70 +220 +67 +69 +220 +67 +69 +219 +66 +68 +219 +67 +66 +219 +67 +66 +220 +68 +67 +217 +67 +66 +215 +67 +63 +212 +67 +62 +212 +67 +62 +211 +68 +60 +210 +69 +60 +213 +69 +61 +221 +66 +61 +219 +65 +57 +210 +66 +58 +202 +68 +59 +191 +69 +58 +176 +65 +54 +156 +58 +45 +139 +53 +38 +138 +60 +47 +133 +61 +46 +130 +61 +45 +128 +61 +44 +129 +60 +44 +129 +60 +44 +131 +60 +42 +132 +60 +45 +130 +58 +44 +130 +58 +44 +130 +58 +44 +127 +58 +43 +127 +57 +45 +126 +56 +44 +125 +57 +46 +125 +57 +46 +126 +58 +47 +126 +58 +47 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +125 +58 +49 +123 +59 +49 +121 +58 +49 +119 +59 +49 +120 +57 +48 +117 +57 +47 +116 +56 +46 +115 +57 +46 +114 +56 +45 +113 +55 +44 +114 +56 +45 +113 +56 +45 +112 +55 +44 +110 +56 +44 +112 +55 +44 +109 +55 +43 +111 +54 +43 +111 +54 +43 +111 +54 +45 +111 +54 +45 +110 +53 +44 +109 +52 +43 +108 +51 +42 +106 +52 +42 +105 +51 +41 +104 +52 +41 +102 +50 +39 +107 +55 +44 +104 +52 +41 +99 +49 +38 +101 +51 +40 +98 +48 +37 +101 +51 +40 +120 +66 +56 +142 +77 +71 +146 +79 +73 +142 +82 +74 +138 +85 +77 +131 +88 +79 +122 +90 +79 +113 +91 +77 +104 +92 +76 +90 +84 +68 +73 +74 +58 +63 +67 +52 +62 +68 +54 +57 +65 +50 +48 +56 +43 +47 +55 +42 +54 +60 +50 +52 +55 +48 +53 +56 +49 +53 +55 +50 +52 +55 +48 +50 +53 +46 +48 +54 +44 +48 +56 +45 +49 +57 +44 +54 +65 +51 +58 +69 +53 +61 +74 +57 +62 +75 +57 +60 +73 +55 +55 +70 +51 +50 +65 +44 +49 +62 +45 +44 +54 +46 +46 +52 +48 +48 +53 +49 +49 +54 +48 +54 +55 +49 +56 +58 +47 +58 +60 +46 +58 +63 +43 +60 +69 +42 +73 +87 +52 +89 +111 +65 +103 +130 +77 +112 +146 +86 +118 +157 +92 +117 +158 +88 +112 +153 +85 +96 +134 +73 +88 +123 +67 +83 +118 +62 +87 +122 +66 +91 +126 +70 +89 +124 +68 +89 +124 +68 +92 +127 +71 +95 +130 +74 +95 +130 +74 +94 +129 +73 +94 +129 +73 +94 +129 +73 +93 +128 +72 +93 +128 +72 +93 +127 +76 +83 +116 +73 +72 +104 +65 +63 +93 +55 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +108 +100 +87 +105 +98 +90 +103 +100 +93 +118 +115 +110 +147 +146 +142 +175 +175 +173 +196 +198 +197 +218 +220 +219 +234 +238 +239 +243 +244 +246 +246 +247 +249 +252 +252 +254 +255 +255 +255 +255 +255 +253 +255 +251 +250 +252 +247 +244 +253 +242 +236 +247 +225 +212 +242 +216 +199 +224 +202 +181 +198 +182 +159 +170 +160 +135 +136 +132 +105 +98 +98 +70 +69 +72 +45 +68 +72 +47 +67 +71 +48 +70 +69 +49 +71 +68 +53 +70 +60 +51 +67 +54 +48 +70 +52 +50 +73 +57 +57 +65 +60 +57 +66 +61 +58 +70 +56 +55 +75 +54 +53 +101 +69 +70 +147 +105 +106 +198 +147 +146 +233 +172 +169 +211 +140 +136 +199 +119 +112 +191 +96 +90 +195 +86 +81 +210 +82 +79 +219 +77 +76 +225 +71 +73 +225 +69 +72 +220 +70 +71 +220 +74 +75 +217 +68 +70 +210 +60 +62 +215 +62 +64 +225 +72 +74 +225 +71 +73 +216 +62 +64 +218 +64 +64 +218 +64 +64 +217 +65 +64 +215 +66 +62 +215 +66 +62 +212 +64 +60 +209 +64 +59 +211 +64 +57 +222 +67 +62 +219 +65 +57 +211 +64 +57 +202 +65 +57 +190 +66 +56 +176 +64 +53 +159 +58 +46 +144 +56 +42 +140 +61 +48 +135 +62 +47 +131 +62 +46 +129 +62 +45 +128 +61 +44 +127 +60 +43 +129 +61 +42 +129 +60 +44 +127 +58 +43 +127 +57 +45 +127 +57 +45 +126 +56 +44 +126 +56 +46 +124 +56 +45 +124 +56 +45 +124 +56 +45 +124 +57 +48 +124 +57 +48 +124 +57 +48 +124 +57 +48 +122 +58 +49 +122 +58 +49 +122 +58 +49 +122 +58 +49 +121 +61 +53 +119 +60 +52 +119 +59 +51 +117 +58 +50 +116 +57 +49 +113 +56 +47 +112 +55 +46 +112 +55 +46 +111 +54 +45 +109 +55 +45 +109 +55 +45 +108 +56 +45 +109 +55 +45 +108 +56 +45 +109 +55 +45 +109 +55 +45 +105 +50 +43 +109 +54 +47 +112 +57 +50 +111 +56 +49 +107 +52 +45 +103 +50 +42 +103 +50 +42 +104 +51 +43 +101 +48 +40 +105 +55 +46 +100 +50 +41 +93 +45 +35 +96 +48 +38 +95 +47 +37 +98 +50 +40 +115 +62 +54 +140 +79 +74 +143 +80 +75 +136 +81 +74 +129 +82 +74 +125 +89 +77 +118 +95 +81 +102 +89 +73 +84 +78 +62 +68 +69 +53 +62 +69 +53 +58 +67 +50 +53 +64 +48 +52 +60 +47 +51 +59 +48 +52 +58 +48 +52 +58 +48 +54 +56 +51 +55 +56 +51 +54 +54 +52 +52 +54 +49 +51 +53 +48 +49 +54 +47 +47 +54 +46 +46 +54 +43 +46 +57 +43 +50 +61 +45 +54 +67 +50 +58 +71 +54 +58 +73 +54 +56 +71 +52 +52 +67 +46 +49 +63 +46 +42 +52 +43 +44 +50 +46 +45 +50 +46 +46 +51 +45 +52 +53 +47 +55 +57 +46 +58 +60 +47 +58 +63 +43 +54 +62 +38 +68 +82 +49 +87 +108 +67 +104 +130 +82 +115 +148 +93 +119 +158 +95 +114 +155 +87 +107 +148 +82 +91 +126 +68 +88 +121 +68 +84 +117 +64 +84 +117 +64 +87 +120 +67 +90 +123 +70 +91 +124 +71 +90 +123 +70 +94 +127 +74 +98 +131 +78 +98 +131 +78 +94 +127 +74 +92 +125 +72 +95 +128 +75 +96 +129 +76 +94 +126 +77 +83 +113 +75 +70 +100 +66 +61 +88 +55 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +108 +100 +89 +103 +100 +93 +111 +110 +106 +134 +133 +131 +164 +164 +162 +193 +195 +194 +214 +218 +219 +234 +238 +239 +247 +251 +252 +247 +251 +254 +248 +252 +255 +252 +253 +255 +254 +254 +254 +255 +255 +253 +255 +254 +250 +255 +252 +249 +255 +250 +243 +255 +240 +224 +251 +235 +212 +237 +223 +197 +215 +205 +178 +192 +187 +157 +164 +163 +132 +130 +131 +99 +103 +106 +75 +76 +81 +51 +71 +74 +47 +69 +67 +46 +71 +66 +47 +72 +62 +50 +73 +58 +51 +76 +57 +53 +75 +60 +57 +66 +56 +55 +71 +62 +63 +81 +69 +69 +96 +80 +80 +124 +104 +103 +166 +140 +139 +207 +178 +174 +232 +197 +191 +255 +213 +207 +234 +177 +168 +201 +131 +123 +188 +99 +93 +199 +87 +85 +213 +83 +83 +219 +74 +77 +216 +67 +69 +213 +71 +70 +210 +70 +69 +215 +73 +72 +219 +75 +75 +218 +70 +70 +212 +62 +63 +214 +61 +63 +221 +67 +69 +217 +63 +63 +217 +63 +63 +218 +64 +64 +218 +64 +64 +217 +65 +62 +214 +65 +61 +212 +64 +60 +212 +63 +57 +220 +65 +60 +219 +64 +59 +211 +64 +57 +203 +66 +58 +191 +67 +59 +177 +65 +54 +160 +59 +49 +146 +56 +45 +140 +61 +48 +135 +62 +47 +131 +62 +46 +129 +62 +45 +128 +61 +44 +127 +60 +43 +129 +60 +44 +129 +60 +44 +127 +58 +43 +127 +57 +45 +127 +57 +45 +126 +56 +44 +125 +57 +46 +124 +56 +45 +124 +56 +45 +124 +56 +45 +124 +57 +48 +124 +57 +48 +124 +57 +48 +124 +57 +48 +122 +58 +49 +123 +59 +50 +123 +59 +50 +122 +59 +50 +119 +60 +52 +117 +60 +51 +117 +58 +50 +115 +58 +49 +114 +57 +48 +110 +56 +46 +111 +54 +45 +109 +55 +45 +109 +55 +45 +108 +56 +45 +108 +56 +45 +108 +56 +45 +108 +56 +45 +106 +56 +45 +108 +56 +45 +108 +56 +45 +107 +54 +46 +110 +55 +48 +111 +56 +49 +110 +57 +49 +108 +55 +47 +105 +52 +44 +103 +50 +42 +101 +51 +42 +99 +49 +40 +100 +52 +42 +95 +47 +37 +94 +46 +36 +98 +50 +40 +94 +46 +36 +96 +48 +38 +112 +62 +53 +129 +74 +69 +135 +82 +76 +135 +88 +82 +126 +88 +79 +114 +86 +75 +100 +82 +68 +81 +74 +58 +62 +63 +47 +58 +65 +49 +54 +65 +48 +53 +64 +48 +51 +62 +48 +52 +60 +49 +52 +60 +49 +53 +59 +49 +55 +58 +51 +55 +57 +52 +55 +55 +53 +55 +55 +53 +53 +55 +50 +52 +54 +49 +49 +54 +47 +47 +54 +46 +47 +55 +44 +46 +57 +43 +49 +60 +46 +52 +65 +48 +56 +69 +52 +57 +72 +53 +56 +71 +52 +52 +69 +50 +52 +66 +49 +46 +56 +47 +46 +53 +46 +46 +51 +45 +45 +50 +43 +50 +51 +43 +52 +54 +43 +56 +58 +45 +57 +61 +44 +55 +63 +40 +68 +81 +51 +87 +108 +69 +104 +130 +85 +116 +149 +96 +119 +157 +98 +112 +152 +89 +103 +143 +80 +89 +124 +68 +87 +120 +67 +84 +117 +64 +84 +117 +64 +86 +119 +66 +89 +122 +69 +89 +122 +69 +89 +122 +69 +91 +124 +71 +95 +128 +75 +95 +128 +75 +92 +125 +72 +91 +124 +71 +94 +127 +74 +94 +127 +74 +94 +123 +77 +82 +109 +74 +70 +95 +66 +59 +84 +55 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +107 +98 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +108 +102 +90 +101 +100 +95 +121 +123 +120 +151 +153 +152 +178 +182 +183 +205 +209 +210 +228 +233 +236 +244 +249 +252 +250 +255 +255 +251 +255 +255 +252 +255 +255 +253 +254 +255 +254 +254 +254 +255 +254 +252 +255 +255 +251 +255 +255 +250 +255 +255 +244 +254 +252 +231 +250 +249 +221 +239 +240 +209 +225 +229 +196 +210 +216 +180 +188 +196 +159 +160 +168 +131 +135 +145 +108 +96 +103 +69 +81 +88 +55 +68 +71 +44 +68 +67 +46 +74 +68 +52 +76 +68 +55 +75 +65 +56 +73 +62 +58 +68 +58 +57 +84 +74 +75 +107 +95 +95 +130 +118 +118 +157 +146 +144 +192 +178 +175 +219 +206 +200 +234 +220 +211 +248 +228 +217 +255 +240 +229 +255 +224 +214 +234 +167 +159 +190 +101 +97 +177 +67 +68 +198 +72 +75 +219 +86 +89 +216 +88 +85 +207 +79 +76 +202 +70 +66 +204 +69 +66 +210 +70 +69 +214 +70 +70 +216 +68 +68 +217 +67 +68 +214 +61 +63 +216 +62 +64 +217 +63 +63 +217 +63 +63 +217 +65 +64 +214 +64 +63 +213 +65 +61 +213 +64 +58 +217 +64 +58 +217 +64 +58 +210 +66 +58 +203 +69 +60 +192 +68 +60 +178 +66 +55 +161 +60 +50 +147 +57 +46 +142 +60 +48 +137 +61 +48 +131 +62 +47 +129 +62 +46 +127 +61 +45 +126 +60 +44 +128 +61 +45 +128 +61 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +125 +57 +46 +125 +57 +46 +124 +56 +45 +123 +56 +47 +123 +56 +47 +125 +58 +49 +125 +58 +49 +123 +59 +50 +123 +59 +50 +123 +59 +50 +123 +59 +50 +122 +59 +52 +120 +60 +52 +116 +59 +50 +113 +59 +49 +114 +57 +48 +111 +57 +47 +110 +56 +46 +108 +56 +45 +108 +54 +44 +107 +55 +44 +108 +56 +45 +106 +56 +45 +106 +56 +45 +106 +56 +45 +106 +56 +45 +105 +57 +45 +106 +56 +45 +106 +56 +45 +110 +57 +49 +109 +56 +48 +109 +56 +48 +109 +56 +48 +109 +56 +48 +105 +55 +46 +102 +52 +43 +99 +49 +40 +100 +50 +41 +97 +49 +39 +93 +45 +35 +95 +48 +38 +99 +52 +42 +92 +45 +35 +95 +48 +38 +115 +68 +60 +125 +80 +74 +129 +86 +80 +126 +89 +81 +112 +84 +73 +94 +74 +63 +79 +67 +55 +63 +60 +45 +52 +54 +40 +50 +59 +42 +48 +59 +43 +49 +60 +46 +50 +61 +47 +52 +60 +49 +52 +60 +49 +53 +59 +49 +55 +58 +51 +55 +57 +52 +55 +57 +54 +54 +56 +51 +53 +55 +50 +53 +55 +50 +50 +55 +48 +48 +55 +47 +48 +56 +45 +46 +57 +43 +48 +59 +45 +50 +63 +46 +54 +67 +50 +55 +69 +52 +56 +71 +52 +56 +71 +52 +57 +70 +53 +52 +62 +51 +51 +58 +50 +47 +52 +45 +44 +50 +40 +47 +48 +40 +49 +51 +40 +53 +55 +42 +54 +58 +41 +54 +62 +39 +68 +81 +53 +89 +109 +74 +107 +132 +90 +119 +151 +102 +119 +156 +102 +108 +147 +90 +95 +135 +75 +87 +120 +67 +87 +117 +67 +84 +114 +64 +84 +114 +64 +86 +116 +66 +88 +118 +68 +89 +119 +69 +89 +119 +69 +90 +120 +70 +93 +123 +73 +95 +125 +75 +93 +123 +73 +93 +123 +73 +95 +125 +75 +94 +124 +74 +90 +119 +75 +78 +101 +72 +65 +87 +64 +54 +76 +53 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +110 +101 +86 +110 +101 +86 +109 +103 +91 +106 +107 +102 +131 +135 +136 +163 +167 +168 +185 +190 +193 +208 +213 +216 +229 +237 +239 +243 +251 +253 +245 +253 +255 +251 +255 +255 +251 +255 +255 +252 +255 +255 +252 +254 +251 +253 +254 +249 +254 +253 +248 +255 +254 +247 +255 +255 +243 +248 +253 +230 +244 +253 +222 +238 +247 +216 +230 +242 +206 +221 +233 +195 +206 +218 +180 +182 +193 +153 +161 +171 +134 +128 +135 +101 +102 +109 +76 +77 +81 +54 +70 +72 +48 +72 +74 +53 +75 +73 +58 +72 +68 +57 +68 +64 +55 +80 +70 +68 +106 +96 +95 +139 +129 +128 +164 +154 +153 +183 +175 +172 +203 +198 +194 +223 +218 +212 +234 +230 +221 +247 +238 +229 +255 +249 +239 +255 +246 +235 +255 +215 +207 +245 +178 +172 +227 +141 +140 +200 +100 +100 +176 +68 +66 +194 +83 +76 +200 +85 +78 +199 +82 +73 +195 +72 +65 +199 +72 +66 +211 +77 +74 +213 +74 +71 +207 +63 +62 +210 +62 +62 +212 +62 +63 +213 +63 +62 +216 +64 +63 +214 +64 +63 +214 +64 +63 +213 +65 +61 +213 +65 +61 +214 +62 +57 +213 +64 +58 +210 +67 +61 +204 +69 +63 +192 +69 +62 +178 +65 +57 +162 +61 +53 +149 +59 +50 +142 +60 +49 +137 +61 +48 +131 +62 +47 +129 +62 +46 +127 +61 +47 +126 +60 +44 +128 +61 +45 +128 +61 +45 +127 +57 +45 +127 +57 +45 +126 +58 +47 +125 +57 +46 +125 +57 +46 +124 +56 +45 +123 +56 +47 +123 +56 +47 +126 +59 +50 +126 +59 +50 +124 +60 +51 +123 +59 +50 +123 +59 +50 +123 +59 +50 +122 +59 +52 +120 +60 +52 +114 +57 +48 +111 +57 +47 +111 +57 +47 +109 +57 +46 +108 +56 +45 +107 +55 +44 +106 +54 +43 +104 +54 +43 +105 +55 +44 +105 +55 +44 +105 +55 +44 +104 +56 +44 +104 +56 +44 +104 +56 +44 +104 +56 +44 +104 +56 +44 +109 +59 +50 +108 +55 +47 +106 +53 +45 +105 +55 +46 +106 +56 +47 +106 +56 +47 +102 +52 +43 +97 +49 +39 +101 +53 +43 +97 +50 +40 +93 +46 +36 +97 +50 +40 +98 +51 +41 +89 +42 +32 +97 +50 +40 +121 +78 +69 +129 +92 +86 +118 +87 +82 +105 +78 +71 +87 +67 +58 +73 +60 +51 +64 +58 +46 +58 +59 +45 +56 +60 +46 +48 +56 +41 +47 +58 +42 +51 +59 +46 +52 +60 +47 +53 +61 +50 +53 +59 +49 +54 +57 +48 +54 +57 +48 +55 +57 +52 +54 +56 +51 +54 +56 +51 +52 +57 +50 +51 +56 +49 +51 +57 +47 +49 +57 +46 +49 +57 +46 +46 +57 +43 +47 +58 +44 +48 +61 +44 +50 +63 +46 +53 +66 +49 +55 +69 +52 +59 +72 +54 +60 +73 +56 +57 +67 +56 +55 +63 +52 +50 +56 +46 +45 +51 +39 +46 +48 +37 +47 +49 +36 +50 +52 +38 +52 +56 +39 +52 +60 +39 +69 +82 +56 +93 +112 +80 +114 +139 +100 +123 +154 +110 +119 +156 +105 +102 +141 +88 +85 +124 +69 +83 +115 +65 +84 +114 +64 +83 +113 +63 +83 +113 +63 +84 +114 +64 +85 +115 +65 +86 +116 +66 +86 +116 +66 +87 +117 +67 +91 +121 +71 +93 +123 +73 +92 +122 +72 +94 +124 +74 +95 +125 +75 +92 +122 +72 +87 +114 +73 +73 +93 +68 +61 +78 +60 +49 +66 +48 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +111 +102 +87 +111 +102 +87 +110 +103 +93 +113 +113 +111 +135 +140 +143 +164 +169 +172 +183 +191 +194 +205 +213 +216 +227 +237 +239 +242 +252 +254 +244 +254 +255 +248 +255 +255 +250 +255 +255 +251 +255 +252 +253 +255 +250 +252 +253 +245 +250 +252 +241 +249 +249 +237 +246 +248 +234 +246 +255 +232 +243 +255 +228 +240 +253 +225 +238 +249 +217 +233 +244 +210 +222 +232 +197 +202 +210 +173 +182 +190 +153 +157 +163 +129 +125 +130 +98 +89 +93 +66 +71 +76 +53 +70 +75 +55 +70 +74 +57 +67 +71 +57 +65 +67 +56 +98 +95 +88 +133 +125 +122 +170 +162 +159 +192 +184 +181 +203 +195 +193 +213 +208 +205 +230 +225 +221 +241 +238 +233 +249 +246 +239 +250 +243 +233 +251 +237 +226 +255 +236 +227 +255 +242 +234 +255 +224 +219 +233 +165 +162 +182 +105 +99 +164 +76 +64 +178 +82 +68 +192 +90 +78 +199 +92 +82 +197 +83 +73 +190 +69 +61 +193 +64 +59 +202 +67 +64 +203 +64 +61 +206 +64 +62 +209 +63 +63 +210 +64 +64 +211 +66 +63 +211 +66 +63 +211 +66 +63 +211 +66 +61 +211 +63 +59 +210 +65 +60 +208 +69 +64 +201 +69 +64 +189 +67 +62 +175 +64 +57 +160 +62 +53 +149 +61 +51 +142 +60 +49 +137 +60 +50 +131 +61 +49 +129 +61 +48 +127 +61 +49 +126 +60 +46 +127 +61 +47 +127 +61 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +46 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +124 +60 +51 +124 +60 +51 +124 +60 +51 +123 +59 +50 +122 +59 +52 +121 +58 +51 +121 +58 +51 +119 +59 +51 +110 +55 +48 +109 +56 +48 +108 +55 +47 +108 +55 +47 +107 +54 +46 +104 +54 +45 +104 +54 +45 +104 +54 +45 +105 +55 +46 +104 +56 +46 +104 +56 +46 +103 +56 +46 +103 +56 +46 +103 +56 +46 +103 +56 +46 +104 +56 +46 +107 +57 +50 +104 +54 +47 +102 +52 +45 +103 +53 +46 +105 +55 +48 +104 +55 +48 +101 +52 +45 +98 +49 +42 +99 +50 +43 +98 +51 +43 +95 +48 +40 +93 +49 +40 +93 +49 +40 +86 +42 +33 +98 +54 +45 +123 +85 +76 +116 +89 +82 +97 +78 +72 +78 +63 +56 +65 +55 +46 +61 +54 +44 +59 +57 +45 +57 +59 +46 +57 +60 +49 +51 +57 +45 +51 +59 +46 +53 +59 +47 +54 +60 +48 +54 +60 +48 +55 +58 +47 +53 +56 +45 +52 +55 +46 +54 +57 +48 +52 +57 +50 +51 +56 +49 +51 +57 +47 +51 +57 +47 +50 +58 +47 +49 +57 +46 +49 +57 +44 +46 +57 +43 +46 +57 +43 +47 +58 +44 +48 +59 +45 +51 +62 +46 +54 +67 +50 +58 +69 +53 +60 +71 +55 +61 +69 +56 +58 +66 +53 +53 +59 +47 +48 +54 +40 +48 +50 +37 +47 +49 +36 +49 +51 +37 +49 +53 +36 +50 +58 +37 +71 +83 +59 +98 +117 +87 +119 +143 +107 +124 +155 +114 +113 +149 +103 +92 +130 +81 +74 +112 +61 +79 +111 +62 +81 +110 +62 +81 +110 +62 +81 +110 +62 +81 +110 +62 +81 +110 +62 +83 +112 +64 +83 +112 +64 +87 +116 +68 +91 +120 +72 +93 +122 +74 +93 +122 +74 +95 +124 +76 +95 +124 +76 +90 +119 +71 +82 +108 +69 +65 +82 +63 +54 +67 +57 +43 +56 +46 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +111 +102 +87 +112 +103 +88 +112 +103 +88 +110 +103 +93 +108 +110 +109 +122 +130 +133 +147 +154 +160 +171 +181 +183 +196 +206 +208 +220 +230 +232 +237 +247 +249 +244 +254 +255 +245 +254 +253 +246 +255 +252 +250 +255 +250 +251 +255 +249 +251 +254 +243 +248 +250 +237 +245 +246 +232 +241 +244 +227 +244 +253 +234 +244 +253 +232 +244 +252 +229 +243 +249 +223 +242 +246 +219 +233 +236 +205 +216 +215 +185 +197 +196 +165 +177 +176 +146 +143 +142 +114 +101 +103 +79 +77 +80 +59 +71 +75 +58 +70 +77 +61 +71 +79 +66 +74 +82 +71 +122 +123 +115 +158 +155 +148 +195 +190 +184 +215 +207 +204 +222 +212 +211 +230 +220 +219 +243 +235 +233 +252 +247 +244 +243 +240 +235 +254 +251 +244 +255 +255 +246 +255 +251 +241 +255 +243 +234 +255 +237 +229 +255 +226 +218 +255 +210 +199 +212 +143 +127 +181 +100 +81 +162 +75 +58 +178 +85 +70 +190 +88 +74 +182 +71 +60 +182 +63 +55 +199 +74 +68 +199 +67 +62 +202 +67 +63 +205 +66 +63 +208 +66 +64 +208 +66 +62 +208 +66 +62 +208 +66 +62 +208 +65 +61 +210 +65 +60 +210 +67 +63 +206 +68 +65 +197 +68 +63 +184 +65 +61 +170 +61 +56 +158 +59 +53 +149 +60 +52 +142 +59 +51 +137 +60 +50 +131 +61 +51 +129 +61 +50 +127 +61 +49 +126 +60 +48 +127 +61 +49 +127 +61 +47 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +46 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +124 +60 +51 +123 +59 +50 +123 +59 +50 +122 +58 +49 +121 +58 +51 +120 +57 +50 +119 +56 +49 +117 +57 +49 +110 +55 +48 +108 +55 +47 +108 +55 +47 +106 +56 +47 +105 +55 +46 +105 +55 +46 +104 +54 +45 +103 +55 +45 +103 +55 +45 +103 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +104 +55 +48 +104 +54 +47 +103 +53 +46 +103 +53 +46 +103 +54 +47 +104 +55 +48 +103 +54 +47 +102 +53 +46 +97 +50 +42 +101 +54 +46 +94 +50 +41 +92 +48 +39 +96 +52 +43 +97 +53 +44 +105 +61 +52 +117 +83 +74 +88 +71 +64 +69 +62 +54 +60 +53 +47 +57 +53 +44 +59 +56 +47 +56 +58 +47 +53 +55 +44 +51 +54 +43 +54 +57 +46 +53 +59 +47 +55 +58 +47 +54 +57 +46 +54 +57 +46 +53 +56 +45 +53 +55 +44 +51 +54 +43 +50 +56 +44 +49 +57 +44 +50 +56 +46 +49 +57 +44 +49 +57 +46 +49 +57 +44 +49 +57 +44 +49 +57 +44 +46 +57 +43 +46 +57 +43 +46 +57 +43 +47 +58 +44 +48 +59 +43 +51 +62 +46 +54 +65 +49 +55 +66 +50 +60 +68 +53 +58 +67 +50 +56 +63 +47 +53 +59 +45 +52 +54 +41 +50 +52 +39 +49 +51 +37 +48 +52 +37 +48 +55 +37 +72 +84 +62 +101 +120 +92 +117 +141 +109 +116 +146 +108 +102 +137 +95 +82 +119 +75 +66 +104 +57 +75 +107 +60 +78 +107 +59 +80 +109 +61 +80 +109 +61 +78 +107 +59 +78 +107 +59 +79 +108 +60 +81 +110 +62 +86 +115 +67 +90 +119 +71 +93 +122 +74 +94 +123 +75 +95 +124 +76 +95 +124 +76 +86 +115 +67 +78 +102 +66 +59 +73 +56 +48 +59 +51 +38 +47 +42 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +107 +98 +83 +107 +98 +83 +108 +99 +84 +108 +99 +84 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +109 +100 +85 +110 +101 +86 +110 +101 +86 +111 +102 +87 +112 +103 +88 +113 +104 +89 +111 +104 +94 +104 +105 +107 +109 +116 +122 +133 +140 +148 +163 +172 +177 +191 +200 +205 +211 +222 +226 +229 +240 +242 +240 +252 +252 +242 +252 +251 +245 +254 +249 +248 +255 +247 +250 +255 +246 +252 +255 +242 +250 +253 +236 +248 +249 +231 +246 +247 +231 +246 +246 +234 +247 +247 +235 +250 +247 +232 +252 +246 +230 +253 +245 +226 +247 +236 +214 +231 +216 +195 +213 +198 +175 +192 +177 +154 +158 +147 +125 +117 +110 +91 +90 +87 +70 +80 +81 +67 +83 +86 +75 +91 +98 +90 +99 +109 +100 +146 +154 +141 +176 +179 +168 +210 +207 +198 +230 +223 +217 +242 +228 +227 +249 +235 +235 +255 +241 +244 +255 +248 +249 +255 +253 +251 +255 +251 +248 +249 +248 +243 +247 +247 +237 +251 +249 +237 +255 +252 +240 +255 +253 +241 +255 +249 +234 +255 +224 +203 +234 +168 +144 +183 +111 +89 +168 +87 +68 +174 +85 +69 +183 +82 +70 +185 +77 +65 +191 +74 +65 +195 +71 +63 +198 +69 +63 +202 +69 +64 +203 +68 +64 +205 +68 +62 +204 +67 +61 +203 +66 +60 +204 +65 +60 +209 +67 +63 +208 +69 +64 +204 +69 +65 +194 +67 +61 +179 +61 +57 +166 +59 +53 +156 +59 +53 +149 +60 +54 +140 +60 +51 +135 +61 +52 +133 +60 +53 +129 +61 +52 +127 +60 +51 +126 +60 +48 +127 +61 +49 +127 +61 +49 +126 +58 +47 +126 +58 +47 +126 +58 +47 +125 +57 +46 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +123 +59 +50 +123 +59 +50 +121 +58 +51 +120 +57 +50 +119 +56 +49 +118 +55 +48 +118 +55 +48 +115 +55 +47 +110 +55 +48 +106 +56 +47 +106 +56 +47 +106 +56 +47 +106 +56 +47 +104 +56 +46 +104 +56 +46 +104 +56 +46 +103 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +100 +56 +45 +100 +56 +45 +100 +56 +45 +102 +55 +45 +103 +54 +47 +104 +55 +48 +105 +56 +49 +105 +56 +49 +104 +55 +48 +105 +56 +49 +106 +59 +51 +108 +61 +53 +103 +56 +48 +107 +60 +52 +98 +54 +45 +97 +53 +44 +111 +67 +58 +120 +76 +67 +116 +73 +64 +110 +77 +68 +67 +57 +48 +53 +54 +46 +52 +53 +47 +56 +57 +49 +56 +59 +50 +52 +55 +46 +49 +52 +43 +50 +53 +44 +53 +56 +45 +53 +56 +45 +53 +55 +44 +52 +54 +43 +52 +54 +43 +52 +54 +43 +52 +54 +41 +51 +55 +41 +47 +55 +40 +46 +57 +41 +48 +56 +43 +46 +57 +41 +46 +57 +43 +46 +57 +41 +48 +56 +41 +48 +56 +41 +49 +57 +42 +48 +56 +41 +48 +56 +43 +47 +55 +42 +48 +56 +43 +49 +57 +44 +51 +59 +46 +52 +60 +45 +57 +66 +49 +58 +67 +48 +59 +66 +48 +58 +65 +49 +58 +60 +46 +54 +56 +42 +50 +52 +38 +47 +51 +36 +50 +57 +39 +73 +85 +63 +99 +117 +91 +109 +132 +103 +102 +132 +98 +87 +121 +84 +73 +110 +69 +63 +100 +56 +72 +103 +59 +76 +105 +59 +78 +107 +61 +78 +107 +61 +76 +105 +59 +76 +105 +59 +77 +106 +60 +79 +108 +62 +85 +114 +68 +89 +118 +72 +91 +120 +74 +93 +122 +76 +94 +123 +77 +92 +121 +75 +81 +110 +64 +71 +95 +59 +54 +66 +52 +43 +52 +47 +34 +40 +38 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +103 +100 +83 +105 +99 +83 +106 +99 +83 +106 +99 +83 +106 +98 +85 +108 +98 +86 +108 +98 +86 +109 +99 +87 +109 +100 +85 +109 +100 +85 +109 +100 +85 +108 +101 +85 +109 +102 +86 +110 +103 +87 +111 +103 +90 +110 +104 +92 +111 +104 +94 +109 +106 +101 +107 +111 +114 +109 +116 +122 +131 +138 +144 +165 +174 +179 +195 +204 +209 +213 +223 +225 +230 +238 +241 +244 +252 +254 +244 +253 +250 +247 +253 +249 +249 +254 +247 +250 +255 +244 +252 +255 +242 +252 +255 +241 +252 +255 +238 +253 +254 +240 +251 +248 +239 +254 +250 +241 +255 +249 +239 +255 +250 +237 +255 +249 +233 +255 +242 +223 +239 +224 +203 +221 +206 +183 +193 +178 +155 +162 +151 +129 +124 +117 +98 +98 +95 +78 +88 +90 +76 +93 +99 +87 +109 +119 +110 +124 +134 +125 +165 +173 +162 +187 +193 +181 +215 +215 +207 +235 +230 +226 +250 +238 +238 +255 +244 +244 +255 +245 +247 +254 +244 +245 +253 +247 +247 +250 +249 +247 +250 +252 +247 +251 +255 +249 +250 +253 +244 +244 +247 +238 +247 +249 +238 +255 +252 +239 +255 +242 +225 +255 +242 +224 +250 +201 +184 +188 +129 +113 +157 +85 +71 +171 +85 +72 +183 +85 +74 +177 +69 +59 +192 +74 +64 +198 +71 +64 +201 +70 +62 +202 +69 +62 +202 +67 +61 +201 +66 +60 +199 +66 +59 +200 +65 +59 +207 +70 +62 +205 +71 +62 +199 +71 +62 +188 +67 +59 +173 +62 +53 +159 +58 +50 +149 +59 +51 +145 +62 +54 +138 +61 +53 +132 +62 +52 +130 +62 +53 +129 +61 +52 +127 +60 +51 +126 +60 +48 +128 +60 +49 +128 +60 +49 +126 +58 +47 +126 +58 +47 +126 +58 +49 +125 +57 +48 +124 +57 +48 +123 +56 +47 +123 +56 +47 +123 +56 +47 +122 +58 +49 +122 +58 +49 +120 +57 +50 +119 +56 +49 +118 +55 +48 +117 +54 +47 +117 +54 +47 +113 +54 +46 +109 +56 +48 +107 +57 +48 +106 +56 +47 +106 +56 +47 +105 +57 +47 +105 +57 +47 +105 +57 +47 +104 +56 +46 +103 +55 +45 +102 +55 +45 +103 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +55 +45 +102 +53 +46 +106 +56 +49 +109 +59 +52 +107 +58 +51 +106 +57 +50 +106 +58 +48 +109 +62 +52 +111 +67 +56 +108 +64 +53 +111 +68 +59 +100 +60 +50 +99 +61 +50 +122 +86 +74 +134 +100 +90 +121 +87 +77 +98 +76 +65 +62 +58 +49 +51 +56 +49 +52 +57 +50 +55 +60 +53 +52 +58 +48 +47 +53 +43 +50 +53 +44 +57 +60 +51 +51 +54 +43 +50 +53 +42 +50 +52 +41 +48 +51 +40 +49 +51 +40 +50 +53 +42 +52 +54 +43 +52 +55 +44 +46 +54 +41 +44 +55 +41 +47 +55 +42 +45 +56 +42 +47 +55 +42 +47 +55 +42 +47 +55 +42 +47 +55 +42 +49 +57 +44 +48 +56 +43 +48 +56 +45 +47 +55 +44 +47 +55 +44 +47 +55 +44 +48 +56 +45 +48 +56 +43 +55 +63 +48 +57 +66 +49 +60 +69 +52 +61 +68 +52 +59 +65 +51 +56 +60 +46 +50 +54 +39 +45 +52 +36 +50 +59 +42 +74 +86 +66 +99 +114 +91 +104 +124 +97 +93 +118 +88 +79 +109 +75 +70 +102 +65 +65 +97 +58 +72 +100 +59 +75 +104 +60 +78 +107 +63 +78 +107 +63 +75 +104 +60 +74 +103 +57 +76 +105 +61 +78 +107 +61 +84 +113 +69 +87 +116 +72 +90 +119 +75 +91 +120 +76 +93 +122 +78 +90 +118 +77 +78 +106 +65 +67 +91 +59 +50 +62 +52 +41 +47 +47 +31 +37 +37 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +100 +86 +106 +100 +86 +106 +100 +88 +108 +100 +89 +108 +99 +90 +109 +101 +90 +109 +101 +88 +109 +102 +86 +103 +96 +78 +106 +101 +82 +110 +107 +88 +111 +108 +93 +104 +101 +92 +102 +101 +97 +115 +113 +114 +129 +130 +134 +137 +142 +146 +149 +157 +160 +170 +178 +181 +194 +199 +202 +215 +220 +223 +233 +237 +238 +245 +246 +248 +248 +250 +249 +252 +254 +253 +254 +254 +252 +255 +255 +250 +253 +254 +246 +250 +253 +242 +249 +252 +241 +250 +253 +242 +251 +254 +243 +249 +250 +242 +250 +250 +242 +249 +249 +237 +252 +250 +235 +254 +252 +231 +249 +247 +222 +233 +229 +202 +213 +212 +182 +186 +185 +155 +152 +152 +124 +113 +116 +89 +95 +100 +77 +98 +107 +88 +114 +125 +108 +132 +144 +130 +145 +155 +144 +180 +185 +178 +202 +204 +199 +226 +227 +222 +240 +239 +235 +247 +243 +242 +251 +247 +246 +253 +249 +248 +252 +248 +247 +255 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +250 +254 +255 +250 +254 +255 +250 +254 +255 +250 +254 +255 +250 +251 +253 +248 +255 +253 +248 +255 +251 +246 +255 +229 +223 +215 +166 +159 +163 +96 +88 +155 +68 +61 +178 +75 +66 +193 +79 +69 +195 +71 +61 +198 +67 +57 +201 +68 +59 +205 +72 +63 +206 +73 +64 +203 +72 +64 +202 +71 +61 +198 +71 +56 +195 +72 +56 +190 +73 +56 +181 +71 +56 +166 +69 +53 +154 +66 +52 +144 +66 +53 +139 +67 +53 +133 +67 +53 +129 +67 +54 +127 +65 +52 +127 +63 +51 +128 +62 +50 +128 +60 +49 +129 +59 +49 +129 +59 +49 +127 +57 +49 +126 +58 +49 +124 +57 +49 +123 +56 +48 +122 +55 +47 +122 +55 +47 +119 +55 +46 +118 +54 +45 +119 +55 +46 +119 +55 +46 +119 +56 +47 +119 +56 +47 +118 +55 +46 +117 +54 +45 +113 +53 +43 +110 +51 +43 +108 +55 +47 +105 +56 +49 +105 +56 +49 +104 +55 +48 +104 +55 +48 +103 +54 +47 +103 +54 +47 +103 +54 +47 +102 +53 +46 +103 +54 +47 +105 +55 +48 +105 +56 +49 +104 +55 +48 +103 +54 +47 +101 +52 +45 +101 +51 +44 +104 +51 +45 +106 +53 +47 +109 +56 +48 +107 +57 +48 +106 +58 +48 +105 +59 +46 +105 +61 +48 +107 +65 +51 +103 +66 +50 +106 +73 +58 +100 +72 +58 +118 +95 +79 +126 +107 +92 +138 +120 +106 +140 +127 +111 +82 +74 +61 +55 +57 +46 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +51 +54 +45 +48 +54 +44 +50 +53 +44 +47 +53 +43 +49 +52 +43 +47 +53 +43 +47 +52 +45 +46 +53 +45 +47 +52 +45 +46 +53 +45 +47 +52 +45 +47 +52 +45 +47 +52 +45 +47 +52 +45 +48 +53 +46 +47 +52 +45 +47 +52 +45 +46 +51 +44 +46 +51 +44 +47 +52 +45 +47 +52 +45 +47 +54 +46 +49 +59 +50 +51 +61 +50 +54 +64 +53 +56 +66 +55 +57 +68 +54 +55 +66 +52 +53 +64 +48 +51 +62 +45 +52 +63 +46 +68 +81 +61 +87 +101 +78 +91 +107 +81 +80 +98 +72 +69 +88 +60 +64 +84 +56 +66 +87 +54 +73 +99 +62 +75 +101 +62 +75 +102 +61 +75 +102 +61 +74 +101 +60 +74 +101 +58 +76 +103 +62 +79 +106 +63 +85 +112 +71 +89 +116 +75 +92 +118 +79 +93 +119 +80 +93 +119 +82 +87 +113 +78 +72 +98 +63 +59 +79 +54 +37 +48 +42 +38 +43 +46 +36 +41 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +105 +100 +81 +106 +104 +83 +109 +106 +87 +106 +107 +91 +103 +103 +95 +108 +108 +108 +126 +127 +132 +144 +147 +154 +167 +174 +180 +183 +193 +195 +208 +213 +216 +225 +230 +233 +241 +242 +244 +250 +251 +253 +255 +254 +255 +255 +254 +255 +254 +253 +251 +255 +254 +250 +255 +255 +250 +254 +255 +249 +251 +252 +244 +248 +251 +242 +246 +252 +242 +247 +253 +243 +247 +250 +241 +248 +250 +239 +248 +250 +237 +247 +250 +233 +249 +251 +229 +242 +245 +218 +223 +226 +195 +204 +208 +175 +180 +184 +151 +145 +150 +118 +107 +113 +85 +89 +97 +73 +95 +107 +85 +116 +129 +111 +140 +152 +138 +157 +167 +156 +191 +193 +188 +211 +211 +209 +231 +231 +229 +243 +243 +241 +247 +247 +245 +251 +251 +249 +252 +252 +250 +251 +251 +249 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +251 +255 +254 +241 +255 +255 +237 +251 +252 +247 +249 +248 +255 +248 +247 +255 +233 +230 +239 +190 +185 +196 +128 +119 +164 +80 +70 +176 +78 +65 +186 +76 +63 +193 +75 +63 +196 +74 +61 +194 +68 +56 +188 +61 +52 +190 +63 +54 +196 +70 +58 +196 +70 +55 +195 +74 +55 +191 +76 +58 +180 +73 +55 +166 +70 +54 +153 +67 +50 +144 +68 +54 +138 +71 +55 +130 +68 +55 +127 +67 +56 +126 +66 +55 +124 +64 +53 +126 +62 +52 +127 +60 +51 +128 +60 +49 +128 +60 +51 +125 +58 +50 +125 +58 +50 +122 +58 +49 +122 +58 +49 +121 +57 +48 +120 +56 +47 +118 +55 +46 +118 +55 +46 +117 +54 +45 +118 +55 +46 +116 +56 +46 +116 +56 +46 +116 +56 +46 +114 +54 +44 +111 +53 +42 +109 +52 +43 +108 +55 +47 +105 +56 +49 +106 +56 +49 +104 +55 +48 +105 +55 +48 +104 +55 +48 +103 +54 +47 +103 +54 +47 +101 +51 +44 +101 +51 +44 +103 +53 +46 +104 +54 +47 +106 +56 +49 +106 +56 +49 +106 +56 +49 +107 +57 +50 +107 +54 +48 +108 +55 +49 +107 +57 +48 +107 +59 +49 +107 +59 +47 +106 +62 +49 +106 +64 +48 +105 +68 +50 +103 +72 +54 +107 +80 +61 +103 +82 +65 +117 +102 +83 +129 +117 +101 +140 +133 +115 +134 +131 +114 +75 +76 +60 +54 +57 +46 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +48 +53 +47 +47 +52 +46 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +47 +52 +46 +47 +54 +47 +46 +56 +48 +47 +58 +50 +49 +61 +51 +52 +64 +54 +54 +66 +54 +54 +66 +54 +54 +66 +52 +53 +66 +49 +54 +67 +49 +67 +80 +62 +80 +93 +73 +82 +96 +73 +73 +87 +64 +65 +79 +54 +66 +80 +55 +69 +85 +58 +74 +98 +64 +74 +100 +63 +75 +101 +64 +75 +101 +62 +73 +99 +60 +72 +99 +58 +73 +100 +59 +74 +101 +60 +83 +110 +69 +88 +114 +75 +92 +118 +81 +93 +119 +84 +91 +116 +84 +84 +109 +79 +67 +92 +62 +54 +73 +53 +38 +49 +45 +39 +44 +48 +37 +42 +46 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +109 +104 +85 +107 +105 +84 +109 +106 +87 +106 +107 +91 +107 +107 +99 +119 +119 +119 +145 +146 +151 +167 +172 +178 +190 +197 +203 +209 +219 +221 +235 +240 +243 +246 +251 +254 +253 +254 +255 +254 +255 +255 +255 +254 +255 +255 +253 +254 +254 +253 +251 +255 +254 +250 +255 +255 +250 +253 +254 +248 +250 +251 +243 +245 +248 +239 +241 +247 +235 +241 +247 +235 +244 +247 +236 +245 +249 +235 +246 +248 +234 +245 +248 +229 +245 +247 +225 +238 +238 +212 +219 +219 +191 +201 +202 +171 +176 +177 +146 +147 +150 +121 +117 +121 +96 +107 +112 +90 +116 +123 +105 +136 +144 +129 +159 +167 +156 +174 +181 +173 +205 +207 +202 +222 +222 +220 +239 +239 +237 +248 +248 +246 +251 +251 +249 +254 +254 +252 +254 +254 +252 +253 +253 +251 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +254 +245 +250 +253 +251 +255 +255 +254 +254 +254 +255 +248 +246 +255 +250 +244 +255 +245 +235 +248 +204 +193 +215 +157 +143 +147 +75 +60 +164 +81 +65 +168 +75 +58 +167 +64 +49 +183 +71 +59 +207 +89 +77 +206 +84 +73 +189 +63 +51 +196 +68 +55 +198 +72 +58 +195 +75 +61 +185 +73 +59 +170 +66 +55 +157 +63 +51 +149 +65 +55 +144 +70 +59 +134 +66 +57 +129 +66 +57 +126 +66 +56 +123 +65 +54 +122 +64 +53 +122 +62 +52 +122 +62 +52 +122 +62 +52 +120 +60 +52 +120 +60 +52 +119 +59 +51 +119 +59 +51 +117 +58 +50 +116 +57 +49 +116 +57 +49 +116 +57 +49 +114 +57 +48 +114 +57 +48 +114 +57 +48 +114 +57 +48 +111 +57 +47 +110 +56 +46 +108 +54 +44 +107 +53 +43 +108 +55 +47 +106 +56 +49 +108 +55 +49 +106 +56 +49 +107 +54 +48 +105 +55 +48 +105 +55 +48 +104 +54 +47 +103 +53 +46 +103 +53 +46 +102 +53 +46 +103 +54 +47 +104 +55 +48 +105 +56 +49 +107 +58 +51 +107 +58 +51 +108 +59 +52 +106 +59 +51 +105 +58 +48 +104 +60 +49 +107 +63 +50 +106 +67 +52 +105 +68 +50 +102 +69 +50 +102 +73 +55 +108 +86 +65 +106 +89 +71 +117 +106 +86 +134 +127 +109 +145 +142 +123 +128 +127 +109 +69 +70 +54 +53 +56 +45 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +46 +51 +45 +45 +50 +44 +45 +50 +44 +46 +51 +45 +47 +52 +46 +46 +53 +46 +43 +53 +45 +43 +54 +46 +45 +57 +47 +47 +59 +49 +50 +62 +50 +52 +64 +52 +54 +66 +52 +55 +68 +51 +56 +69 +51 +63 +76 +58 +69 +82 +62 +67 +81 +58 +59 +73 +50 +56 +70 +45 +62 +76 +51 +68 +84 +57 +74 +95 +64 +74 +98 +64 +76 +100 +66 +75 +99 +63 +73 +97 +61 +71 +96 +57 +70 +95 +56 +71 +96 +57 +82 +107 +68 +88 +112 +76 +93 +117 +83 +94 +118 +86 +90 +113 +84 +80 +103 +75 +61 +84 +56 +46 +65 +46 +38 +49 +45 +39 +44 +48 +37 +42 +46 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +110 +105 +86 +108 +106 +85 +108 +107 +87 +108 +109 +93 +112 +113 +105 +128 +130 +129 +158 +161 +166 +185 +190 +196 +195 +202 +208 +218 +228 +230 +244 +249 +252 +250 +255 +255 +251 +252 +254 +251 +252 +254 +253 +251 +252 +251 +250 +248 +255 +254 +252 +255 +255 +251 +255 +254 +249 +251 +252 +244 +245 +246 +238 +238 +241 +230 +233 +239 +227 +231 +237 +223 +237 +241 +226 +240 +244 +229 +241 +244 +227 +241 +244 +223 +242 +241 +220 +234 +234 +208 +216 +216 +188 +199 +199 +171 +178 +177 +149 +161 +161 +137 +145 +147 +125 +144 +147 +128 +156 +158 +145 +170 +173 +162 +182 +187 +180 +192 +197 +191 +220 +220 +218 +233 +233 +231 +246 +246 +244 +251 +251 +249 +253 +253 +251 +255 +255 +253 +255 +255 +253 +253 +253 +251 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +254 +251 +251 +253 +255 +254 +255 +255 +254 +255 +245 +240 +237 +246 +237 +230 +255 +249 +240 +255 +250 +236 +255 +238 +222 +232 +191 +173 +183 +127 +110 +148 +79 +63 +163 +80 +64 +185 +89 +75 +184 +78 +64 +180 +68 +56 +190 +69 +58 +193 +65 +54 +198 +70 +59 +197 +73 +63 +188 +71 +61 +173 +64 +57 +161 +60 +52 +152 +62 +54 +149 +66 +60 +139 +64 +59 +133 +66 +60 +128 +65 +58 +124 +65 +59 +121 +64 +57 +119 +64 +57 +117 +64 +56 +118 +63 +56 +118 +61 +52 +118 +61 +52 +118 +61 +52 +117 +60 +51 +115 +61 +51 +114 +60 +50 +114 +60 +50 +113 +59 +49 +111 +59 +48 +111 +59 +48 +111 +59 +48 +110 +58 +47 +107 +57 +46 +106 +56 +45 +106 +56 +45 +105 +55 +46 +109 +56 +50 +110 +55 +50 +109 +54 +49 +108 +55 +49 +108 +55 +49 +107 +54 +48 +105 +55 +48 +105 +55 +48 +108 +58 +51 +106 +57 +50 +104 +55 +48 +102 +55 +47 +102 +55 +47 +102 +55 +47 +104 +57 +49 +102 +58 +49 +106 +63 +54 +102 +62 +52 +101 +61 +49 +102 +62 +50 +104 +67 +51 +105 +69 +53 +102 +71 +51 +99 +71 +50 +99 +74 +54 +104 +86 +64 +105 +92 +73 +115 +107 +86 +133 +130 +111 +143 +142 +122 +112 +113 +95 +57 +61 +44 +52 +55 +44 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +46 +51 +45 +45 +52 +45 +42 +52 +44 +41 +52 +44 +42 +54 +44 +43 +55 +45 +46 +58 +46 +49 +61 +49 +52 +64 +50 +53 +65 +51 +54 +67 +50 +58 +71 +53 +60 +73 +55 +56 +69 +49 +50 +63 +43 +50 +64 +41 +56 +70 +47 +62 +78 +52 +68 +88 +60 +69 +93 +61 +75 +96 +65 +74 +98 +64 +75 +96 +63 +71 +95 +59 +72 +94 +58 +70 +94 +58 +83 +105 +69 +88 +112 +78 +96 +117 +86 +94 +117 +88 +90 +110 +83 +76 +99 +73 +57 +77 +52 +41 +58 +40 +38 +47 +44 +37 +42 +46 +35 +40 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +109 +102 +86 +108 +103 +84 +107 +105 +84 +110 +109 +89 +111 +112 +96 +116 +117 +109 +133 +135 +134 +164 +167 +172 +191 +196 +202 +205 +212 +218 +229 +239 +241 +251 +255 +255 +251 +255 +255 +250 +251 +253 +252 +253 +255 +255 +253 +254 +253 +252 +250 +255 +255 +253 +255 +255 +251 +254 +253 +248 +247 +248 +240 +239 +240 +232 +231 +234 +223 +224 +230 +218 +222 +229 +213 +231 +235 +218 +234 +239 +219 +237 +240 +219 +236 +240 +217 +238 +238 +214 +232 +232 +208 +218 +216 +191 +204 +202 +177 +194 +189 +167 +183 +181 +160 +177 +174 +157 +182 +180 +167 +193 +190 +181 +201 +200 +195 +210 +211 +206 +217 +217 +215 +232 +232 +230 +242 +242 +240 +250 +250 +248 +252 +252 +250 +253 +253 +251 +255 +255 +253 +255 +255 +253 +252 +252 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +254 +252 +255 +251 +254 +255 +247 +250 +250 +246 +245 +248 +247 +243 +252 +255 +248 +254 +255 +248 +254 +255 +244 +253 +252 +234 +255 +254 +236 +245 +220 +200 +196 +155 +137 +157 +98 +80 +151 +75 +59 +165 +76 +60 +180 +80 +64 +186 +74 +60 +189 +65 +55 +196 +68 +59 +195 +71 +63 +188 +69 +61 +176 +63 +59 +166 +58 +55 +157 +59 +56 +152 +63 +59 +143 +62 +59 +137 +63 +60 +130 +65 +61 +124 +65 +61 +119 +66 +60 +115 +66 +59 +114 +67 +59 +115 +66 +59 +113 +63 +54 +115 +62 +54 +115 +62 +54 +114 +61 +53 +114 +61 +53 +114 +61 +53 +112 +62 +53 +111 +61 +52 +110 +62 +52 +109 +61 +51 +108 +60 +50 +107 +59 +49 +106 +59 +49 +105 +58 +48 +105 +58 +48 +106 +58 +48 +110 +55 +50 +112 +54 +50 +112 +54 +50 +109 +54 +49 +109 +54 +49 +108 +55 +49 +105 +55 +48 +105 +55 +48 +108 +59 +52 +107 +58 +51 +104 +57 +49 +101 +57 +48 +101 +57 +48 +101 +57 +48 +101 +58 +49 +100 +60 +50 +102 +66 +54 +99 +65 +53 +99 +67 +52 +100 +68 +53 +100 +71 +53 +100 +73 +54 +98 +73 +51 +95 +73 +50 +94 +76 +54 +101 +86 +63 +106 +98 +77 +114 +109 +87 +132 +131 +111 +132 +135 +114 +91 +96 +76 +51 +58 +40 +50 +56 +44 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +46 +51 +45 +45 +50 +44 +45 +50 +44 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +45 +50 +44 +44 +51 +44 +44 +54 +46 +43 +53 +45 +42 +52 +43 +42 +52 +43 +43 +53 +44 +46 +56 +45 +48 +59 +45 +50 +61 +47 +50 +61 +45 +53 +64 +47 +54 +65 +48 +53 +65 +45 +49 +61 +41 +49 +61 +41 +53 +65 +45 +56 +70 +47 +61 +79 +53 +64 +84 +56 +70 +89 +61 +72 +92 +64 +74 +93 +63 +73 +94 +61 +75 +94 +62 +75 +96 +63 +84 +103 +71 +91 +112 +81 +99 +118 +90 +97 +117 +90 +89 +107 +83 +74 +93 +71 +54 +71 +52 +38 +52 +37 +36 +45 +42 +36 +41 +44 +34 +39 +42 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +109 +101 +90 +108 +102 +86 +106 +103 +84 +107 +106 +85 +108 +110 +89 +111 +114 +97 +115 +118 +109 +129 +133 +132 +159 +164 +168 +184 +191 +199 +213 +222 +227 +236 +246 +248 +251 +255 +255 +251 +255 +255 +250 +251 +255 +253 +254 +255 +255 +254 +255 +253 +252 +250 +255 +255 +251 +255 +255 +250 +252 +252 +244 +243 +245 +234 +235 +237 +226 +227 +231 +217 +221 +227 +213 +220 +227 +209 +228 +233 +211 +231 +236 +213 +233 +237 +214 +234 +236 +212 +235 +235 +211 +232 +230 +207 +223 +218 +196 +211 +206 +184 +211 +206 +186 +204 +198 +182 +203 +195 +184 +208 +201 +193 +215 +210 +206 +224 +219 +216 +234 +230 +229 +240 +239 +237 +243 +242 +240 +249 +249 +247 +253 +253 +251 +253 +253 +251 +253 +253 +251 +255 +255 +253 +254 +254 +252 +252 +252 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +253 +252 +255 +252 +253 +255 +246 +247 +253 +249 +248 +254 +255 +253 +249 +255 +253 +246 +255 +250 +237 +255 +243 +240 +254 +239 +235 +242 +226 +255 +255 +237 +255 +236 +217 +204 +166 +147 +163 +106 +87 +161 +90 +70 +170 +87 +69 +173 +76 +59 +182 +70 +58 +188 +70 +60 +189 +70 +62 +185 +70 +63 +178 +66 +62 +169 +61 +58 +161 +59 +57 +153 +59 +57 +149 +61 +60 +142 +62 +61 +133 +63 +61 +125 +64 +59 +120 +65 +60 +115 +66 +59 +112 +68 +59 +112 +68 +59 +112 +63 +56 +113 +63 +54 +113 +63 +54 +113 +63 +54 +113 +63 +54 +112 +62 +53 +111 +63 +53 +111 +63 +53 +111 +64 +54 +110 +63 +53 +109 +62 +52 +107 +60 +50 +104 +60 +49 +104 +60 +49 +104 +60 +49 +108 +60 +50 +111 +56 +51 +113 +54 +50 +112 +54 +50 +112 +54 +50 +109 +54 +49 +108 +55 +49 +106 +56 +49 +105 +56 +49 +104 +55 +48 +103 +56 +48 +101 +57 +48 +101 +58 +49 +100 +60 +50 +101 +63 +52 +102 +64 +53 +100 +66 +54 +94 +66 +52 +97 +71 +56 +99 +76 +58 +100 +77 +59 +99 +77 +56 +96 +75 +54 +93 +75 +51 +93 +77 +52 +93 +81 +57 +98 +88 +63 +109 +104 +82 +115 +115 +91 +128 +131 +110 +118 +123 +101 +70 +79 +58 +52 +61 +42 +51 +57 +45 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +44 +49 +43 +43 +48 +42 +43 +48 +42 +43 +48 +42 +43 +48 +42 +44 +49 +43 +44 +51 +44 +46 +53 +46 +44 +54 +46 +42 +52 +43 +42 +52 +43 +42 +52 +43 +43 +53 +44 +45 +55 +44 +46 +57 +43 +45 +56 +42 +48 +59 +43 +52 +63 +47 +53 +64 +47 +52 +63 +46 +51 +63 +43 +51 +62 +45 +51 +64 +44 +55 +70 +47 +57 +75 +51 +64 +79 +56 +66 +84 +58 +71 +87 +60 +72 +91 +63 +77 +93 +66 +77 +96 +68 +85 +101 +74 +92 +111 +83 +100 +116 +90 +96 +114 +90 +88 +103 +82 +71 +88 +69 +52 +66 +49 +36 +50 +37 +36 +45 +42 +36 +41 +44 +34 +39 +42 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +100 +86 +106 +100 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +108 +102 +90 +108 +102 +86 +108 +105 +86 +108 +107 +86 +107 +109 +88 +107 +110 +93 +108 +114 +104 +121 +127 +125 +149 +157 +160 +174 +183 +190 +209 +218 +223 +233 +242 +247 +251 +255 +255 +248 +253 +255 +248 +249 +253 +254 +255 +255 +255 +254 +255 +249 +248 +246 +255 +255 +251 +254 +253 +248 +249 +249 +241 +241 +243 +232 +233 +235 +222 +227 +231 +216 +223 +230 +214 +224 +232 +211 +228 +233 +210 +231 +237 +211 +232 +236 +211 +231 +233 +209 +232 +232 +208 +231 +229 +206 +224 +219 +199 +215 +208 +190 +218 +211 +195 +217 +209 +198 +222 +212 +203 +230 +221 +216 +238 +228 +227 +243 +233 +234 +250 +241 +244 +255 +249 +251 +250 +249 +247 +254 +254 +252 +255 +255 +253 +253 +253 +251 +253 +253 +251 +255 +255 +253 +255 +255 +253 +252 +252 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +253 +252 +255 +250 +249 +255 +251 +250 +255 +254 +253 +252 +255 +253 +245 +255 +252 +234 +251 +245 +234 +255 +248 +242 +255 +253 +245 +255 +250 +239 +245 +231 +255 +250 +234 +255 +250 +232 +242 +204 +185 +171 +119 +98 +143 +81 +58 +170 +93 +73 +175 +80 +62 +179 +76 +61 +179 +75 +62 +179 +75 +64 +177 +73 +64 +172 +69 +62 +162 +63 +58 +154 +59 +55 +150 +61 +57 +143 +62 +58 +136 +63 +57 +129 +64 +58 +122 +65 +58 +117 +67 +58 +113 +69 +58 +113 +69 +60 +112 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +112 +63 +56 +112 +63 +56 +113 +66 +58 +112 +65 +57 +110 +63 +55 +108 +61 +53 +105 +61 +52 +106 +62 +53 +106 +62 +53 +110 +61 +54 +111 +56 +51 +114 +55 +51 +112 +54 +50 +112 +54 +50 +110 +55 +50 +108 +55 +49 +106 +56 +49 +105 +56 +49 +100 +56 +47 +100 +57 +48 +99 +59 +49 +100 +62 +51 +100 +64 +52 +99 +65 +53 +99 +65 +53 +95 +67 +53 +90 +69 +52 +95 +78 +60 +103 +86 +66 +104 +87 +67 +99 +83 +60 +94 +79 +56 +91 +79 +53 +92 +82 +55 +93 +86 +60 +93 +89 +62 +110 +108 +85 +116 +118 +94 +124 +129 +107 +99 +109 +85 +50 +62 +40 +54 +66 +46 +51 +59 +46 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +44 +49 +43 +44 +49 +43 +43 +48 +42 +42 +47 +41 +42 +47 +41 +43 +48 +42 +44 +49 +43 +43 +50 +43 +45 +52 +45 +43 +53 +45 +42 +52 +44 +42 +52 +44 +43 +53 +44 +43 +53 +44 +44 +54 +43 +45 +55 +44 +44 +54 +43 +47 +58 +44 +50 +61 +47 +54 +65 +49 +55 +66 +50 +55 +66 +49 +53 +64 +48 +52 +63 +46 +50 +63 +45 +52 +67 +46 +58 +71 +51 +61 +76 +53 +65 +79 +56 +68 +84 +58 +74 +88 +63 +76 +92 +66 +84 +98 +73 +92 +107 +84 +99 +113 +90 +94 +109 +88 +85 +98 +80 +68 +82 +65 +50 +62 +48 +35 +47 +37 +38 +47 +44 +38 +44 +44 +36 +42 +42 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +106 +100 +86 +106 +100 +86 +106 +99 +89 +107 +100 +90 +108 +99 +92 +109 +100 +91 +108 +102 +90 +108 +102 +86 +111 +108 +89 +109 +108 +87 +106 +108 +87 +103 +107 +90 +102 +108 +98 +114 +123 +120 +142 +152 +154 +168 +177 +184 +201 +210 +215 +226 +235 +240 +247 +252 +255 +246 +251 +254 +249 +250 +254 +254 +255 +255 +255 +254 +255 +249 +248 +244 +255 +255 +250 +253 +253 +245 +248 +248 +238 +240 +242 +229 +233 +235 +221 +229 +233 +216 +227 +234 +216 +229 +237 +214 +230 +236 +210 +233 +237 +210 +234 +237 +210 +232 +232 +206 +232 +230 +207 +232 +227 +207 +225 +218 +200 +216 +208 +195 +216 +206 +196 +221 +210 +204 +234 +223 +219 +248 +237 +235 +255 +244 +246 +255 +245 +249 +255 +245 +251 +255 +249 +252 +254 +252 +253 +255 +255 +253 +255 +255 +253 +254 +254 +252 +254 +254 +252 +255 +255 +253 +255 +255 +253 +253 +253 +251 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +254 +250 +255 +249 +247 +255 +249 +247 +251 +250 +248 +247 +251 +250 +245 +255 +254 +243 +255 +255 +240 +255 +255 +237 +253 +250 +240 +252 +248 +251 +255 +250 +255 +253 +241 +255 +242 +226 +255 +239 +219 +255 +225 +203 +216 +174 +150 +170 +114 +91 +164 +89 +68 +169 +84 +64 +168 +81 +62 +169 +82 +65 +173 +81 +66 +169 +77 +64 +161 +68 +60 +151 +61 +53 +149 +62 +55 +143 +63 +54 +137 +62 +56 +131 +64 +55 +125 +65 +55 +119 +67 +54 +116 +68 +56 +115 +69 +56 +113 +63 +56 +113 +63 +56 +115 +62 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +113 +63 +56 +112 +63 +56 +115 +66 +59 +113 +66 +58 +111 +64 +56 +109 +62 +54 +108 +61 +53 +106 +62 +53 +109 +62 +54 +111 +62 +55 +111 +56 +51 +113 +55 +51 +111 +56 +51 +109 +56 +50 +109 +56 +50 +105 +56 +49 +104 +57 +49 +102 +58 +49 +102 +59 +50 +100 +62 +51 +100 +64 +52 +98 +66 +53 +96 +67 +53 +93 +65 +51 +92 +64 +50 +87 +66 +49 +84 +71 +52 +91 +83 +62 +102 +94 +71 +105 +94 +72 +98 +88 +63 +90 +83 +57 +90 +83 +55 +92 +87 +58 +90 +86 +59 +88 +87 +59 +107 +109 +85 +115 +119 +94 +117 +125 +102 +85 +97 +73 +38 +50 +28 +56 +68 +48 +51 +59 +46 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +48 +54 +44 +47 +53 +43 +47 +53 +43 +47 +53 +43 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +45 +50 +44 +44 +49 +43 +43 +48 +42 +43 +48 +42 +42 +47 +41 +42 +47 +41 +43 +48 +42 +43 +48 +42 +44 +49 +43 +43 +50 +43 +41 +51 +43 +42 +52 +44 +43 +53 +45 +43 +53 +44 +44 +54 +45 +45 +55 +46 +45 +55 +44 +44 +54 +43 +46 +56 +45 +50 +60 +49 +54 +65 +51 +57 +68 +54 +57 +68 +52 +55 +66 +52 +54 +65 +49 +48 +59 +43 +50 +63 +45 +53 +66 +48 +57 +70 +50 +60 +73 +53 +64 +78 +55 +70 +84 +61 +74 +88 +63 +82 +96 +73 +91 +104 +84 +97 +110 +90 +92 +105 +87 +81 +94 +77 +66 +78 +64 +47 +59 +47 +34 +44 +35 +42 +48 +44 +40 +46 +44 +38 +44 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +107 +100 +90 +108 +101 +91 +109 +100 +93 +110 +101 +92 +109 +103 +91 +109 +103 +87 +113 +110 +91 +107 +109 +87 +107 +110 +89 +107 +114 +96 +106 +114 +103 +112 +121 +118 +135 +145 +147 +159 +170 +176 +187 +196 +201 +208 +217 +222 +234 +239 +243 +246 +251 +254 +252 +253 +255 +254 +255 +255 +255 +254 +255 +254 +253 +249 +255 +255 +250 +254 +254 +246 +250 +250 +240 +246 +248 +235 +244 +246 +232 +240 +244 +227 +234 +241 +223 +231 +239 +216 +240 +246 +218 +237 +242 +212 +235 +238 +209 +236 +236 +210 +232 +230 +209 +225 +220 +201 +221 +213 +200 +222 +212 +202 +224 +211 +205 +231 +217 +216 +241 +227 +227 +249 +234 +237 +253 +241 +243 +255 +246 +250 +255 +248 +255 +255 +252 +255 +255 +253 +254 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +255 +250 +255 +254 +250 +255 +255 +251 +255 +255 +253 +254 +255 +255 +252 +255 +255 +250 +255 +255 +249 +254 +255 +249 +253 +255 +254 +255 +255 +254 +253 +251 +254 +249 +243 +255 +248 +238 +255 +249 +233 +255 +248 +226 +255 +241 +217 +255 +232 +207 +182 +132 +105 +162 +100 +75 +147 +83 +58 +155 +87 +64 +165 +93 +71 +160 +83 +65 +154 +75 +58 +155 +76 +61 +142 +63 +50 +141 +63 +50 +135 +63 +51 +128 +60 +47 +121 +59 +46 +116 +60 +45 +115 +63 +49 +115 +66 +52 +114 +61 +53 +114 +61 +55 +116 +61 +56 +115 +62 +56 +117 +64 +58 +117 +64 +58 +116 +63 +57 +113 +63 +56 +115 +65 +58 +113 +64 +57 +113 +64 +57 +113 +64 +57 +112 +63 +56 +110 +63 +55 +111 +62 +55 +111 +62 +55 +107 +57 +50 +109 +56 +50 +108 +58 +51 +108 +59 +52 +108 +59 +52 +104 +60 +51 +103 +60 +51 +99 +61 +50 +99 +63 +51 +94 +62 +49 +100 +71 +57 +99 +71 +57 +84 +61 +45 +78 +57 +40 +77 +56 +39 +64 +49 +30 +87 +81 +59 +80 +78 +55 +75 +73 +48 +79 +75 +50 +93 +89 +62 +105 +101 +74 +101 +97 +68 +86 +85 +55 +88 +88 +60 +93 +96 +67 +111 +115 +90 +122 +128 +102 +100 +108 +85 +61 +73 +49 +45 +57 +35 +50 +62 +42 +52 +60 +47 +53 +59 +49 +52 +58 +48 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +56 +46 +49 +55 +45 +49 +55 +45 +49 +55 +45 +48 +54 +44 +49 +54 +48 +49 +54 +48 +48 +53 +47 +48 +53 +47 +47 +52 +46 +47 +52 +46 +47 +52 +46 +47 +52 +46 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +44 +49 +43 +43 +48 +42 +43 +48 +42 +46 +53 +46 +45 +52 +45 +45 +52 +45 +44 +51 +44 +45 +52 +45 +45 +52 +44 +46 +53 +45 +46 +53 +45 +43 +50 +42 +45 +52 +44 +48 +55 +47 +53 +61 +50 +57 +65 +54 +61 +69 +56 +63 +71 +60 +63 +74 +60 +55 +66 +50 +53 +64 +47 +51 +62 +45 +49 +61 +41 +50 +62 +42 +57 +69 +47 +66 +78 +56 +73 +85 +63 +79 +91 +71 +86 +98 +78 +93 +104 +87 +89 +100 +84 +76 +87 +73 +60 +70 +59 +47 +57 +46 +41 +51 +42 +42 +48 +44 +41 +47 +43 +40 +46 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +107 +100 +90 +108 +101 +91 +109 +100 +93 +110 +101 +92 +109 +103 +91 +107 +104 +87 +111 +110 +90 +106 +108 +86 +107 +110 +89 +107 +114 +96 +106 +116 +105 +113 +124 +120 +137 +148 +150 +163 +174 +180 +190 +199 +204 +210 +219 +224 +235 +240 +244 +247 +252 +255 +253 +254 +255 +254 +255 +255 +255 +254 +252 +254 +253 +249 +255 +255 +250 +254 +254 +244 +251 +251 +239 +247 +249 +235 +244 +247 +230 +240 +245 +225 +234 +242 +221 +232 +237 +214 +234 +239 +209 +230 +235 +203 +228 +231 +202 +230 +230 +204 +227 +225 +204 +223 +217 +201 +222 +212 +202 +223 +212 +206 +230 +216 +215 +236 +222 +222 +245 +230 +233 +250 +238 +242 +255 +243 +247 +255 +246 +250 +255 +249 +253 +255 +251 +254 +255 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +252 +250 +255 +249 +250 +255 +249 +253 +255 +252 +253 +254 +255 +253 +252 +255 +253 +250 +255 +255 +250 +255 +255 +248 +255 +255 +252 +255 +255 +250 +253 +255 +248 +246 +255 +249 +242 +255 +252 +239 +255 +252 +234 +254 +248 +226 +255 +241 +215 +255 +234 +206 +217 +178 +149 +163 +117 +91 +142 +92 +67 +146 +92 +66 +152 +92 +68 +152 +87 +67 +150 +83 +64 +138 +70 +51 +137 +68 +52 +135 +68 +51 +131 +68 +51 +126 +67 +51 +122 +66 +49 +118 +65 +49 +115 +63 +49 +117 +64 +56 +115 +62 +56 +117 +62 +57 +117 +64 +58 +116 +63 +57 +111 +61 +54 +112 +62 +55 +115 +65 +58 +113 +63 +56 +112 +63 +56 +112 +63 +56 +110 +63 +55 +111 +62 +55 +109 +62 +54 +110 +61 +54 +109 +62 +54 +107 +60 +52 +108 +61 +53 +109 +62 +54 +107 +63 +54 +106 +63 +54 +103 +65 +54 +101 +65 +53 +98 +66 +53 +100 +71 +57 +91 +65 +50 +94 +71 +55 +94 +73 +56 +78 +61 +43 +70 +55 +36 +71 +56 +37 +62 +54 +33 +76 +76 +52 +71 +75 +50 +68 +71 +44 +68 +68 +42 +77 +77 +49 +92 +91 +63 +98 +97 +67 +96 +97 +66 +89 +89 +61 +100 +103 +74 +115 +119 +94 +115 +121 +95 +88 +96 +73 +58 +68 +44 +47 +59 +37 +55 +67 +47 +54 +62 +49 +54 +60 +50 +54 +60 +50 +54 +60 +50 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +53 +59 +49 +52 +58 +48 +52 +58 +48 +51 +57 +47 +51 +57 +47 +51 +57 +47 +50 +55 +49 +50 +55 +49 +50 +55 +49 +49 +54 +48 +49 +54 +48 +49 +54 +48 +48 +53 +47 +48 +53 +47 +46 +51 +45 +46 +51 +45 +45 +50 +44 +45 +50 +44 +44 +49 +43 +44 +49 +43 +43 +48 +42 +43 +48 +42 +42 +49 +42 +42 +49 +42 +41 +48 +41 +41 +48 +41 +41 +48 +41 +42 +49 +42 +43 +50 +42 +44 +51 +43 +46 +53 +45 +45 +52 +44 +46 +53 +45 +48 +55 +47 +52 +59 +51 +57 +65 +54 +63 +70 +62 +66 +74 +63 +59 +70 +56 +58 +69 +53 +55 +66 +49 +52 +63 +46 +51 +63 +43 +54 +66 +46 +60 +72 +50 +64 +76 +54 +76 +88 +68 +83 +95 +75 +89 +100 +84 +87 +98 +82 +76 +86 +75 +61 +71 +60 +49 +59 +50 +43 +53 +44 +44 +51 +44 +43 +49 +45 +42 +48 +44 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +110 +101 +92 +109 +103 +91 +107 +104 +87 +109 +108 +88 +105 +109 +86 +106 +111 +89 +107 +116 +97 +105 +117 +105 +113 +125 +121 +138 +152 +153 +165 +178 +184 +191 +202 +208 +212 +221 +226 +237 +242 +246 +247 +252 +255 +252 +253 +255 +253 +255 +254 +255 +254 +252 +254 +253 +248 +255 +255 +247 +253 +253 +243 +250 +251 +237 +247 +250 +233 +244 +247 +228 +239 +244 +222 +231 +239 +216 +229 +235 +209 +226 +231 +201 +222 +225 +194 +221 +221 +193 +222 +222 +198 +222 +219 +200 +221 +215 +203 +224 +213 +207 +228 +217 +215 +237 +225 +225 +242 +230 +234 +249 +237 +241 +254 +243 +247 +255 +246 +250 +255 +248 +251 +255 +249 +252 +255 +252 +252 +255 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +252 +246 +255 +250 +246 +255 +250 +250 +254 +253 +253 +253 +253 +255 +250 +254 +255 +248 +255 +255 +246 +255 +255 +244 +254 +255 +249 +255 +255 +247 +252 +255 +247 +247 +255 +250 +245 +255 +255 +246 +255 +255 +242 +250 +253 +236 +250 +248 +227 +254 +240 +214 +255 +246 +219 +255 +235 +208 +223 +191 +166 +168 +131 +105 +132 +90 +66 +131 +83 +60 +145 +93 +71 +148 +93 +72 +139 +82 +62 +127 +70 +50 +118 +63 +42 +117 +62 +42 +118 +66 +45 +121 +70 +51 +120 +71 +54 +113 +63 +52 +110 +60 +51 +113 +60 +52 +116 +66 +57 +115 +65 +56 +111 +63 +53 +113 +65 +55 +120 +72 +62 +110 +62 +52 +109 +62 +52 +109 +62 +52 +107 +63 +52 +108 +61 +51 +106 +62 +51 +108 +61 +51 +106 +62 +51 +103 +63 +53 +103 +65 +54 +103 +65 +54 +103 +67 +55 +101 +67 +55 +99 +67 +54 +96 +67 +53 +94 +68 +53 +98 +75 +59 +85 +66 +49 +90 +73 +55 +96 +83 +64 +82 +71 +51 +67 +59 +38 +69 +61 +40 +70 +65 +43 +65 +69 +44 +66 +72 +46 +65 +69 +42 +60 +64 +37 +63 +66 +37 +78 +78 +50 +95 +96 +65 +105 +106 +75 +97 +97 +69 +110 +113 +84 +118 +122 +97 +103 +109 +83 +74 +79 +57 +52 +60 +37 +52 +61 +40 +61 +70 +51 +56 +62 +50 +56 +62 +52 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +54 +60 +50 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +54 +60 +50 +54 +60 +50 +54 +60 +50 +53 +58 +52 +52 +57 +51 +52 +57 +51 +52 +57 +51 +51 +56 +50 +51 +56 +50 +51 +56 +50 +50 +55 +49 +48 +53 +47 +48 +53 +47 +47 +52 +46 +46 +51 +45 +45 +50 +44 +44 +49 +43 +43 +48 +42 +43 +48 +42 +41 +46 +40 +41 +46 +40 +41 +46 +40 +41 +46 +40 +41 +46 +40 +42 +47 +41 +43 +48 +42 +44 +49 +43 +49 +54 +48 +47 +52 +46 +44 +49 +43 +44 +49 +43 +47 +52 +46 +54 +59 +52 +61 +66 +60 +65 +72 +64 +64 +75 +61 +62 +75 +58 +60 +73 +55 +56 +69 +51 +52 +65 +45 +50 +63 +43 +51 +65 +42 +53 +67 +44 +68 +81 +61 +75 +88 +68 +81 +94 +77 +81 +94 +77 +72 +84 +72 +60 +72 +60 +50 +62 +52 +46 +56 +47 +46 +53 +46 +46 +53 +46 +45 +52 +45 +103 +100 +85 +103 +100 +85 +104 +101 +86 +104 +101 +86 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +107 +109 +88 +105 +109 +86 +106 +111 +89 +106 +115 +96 +104 +116 +104 +109 +124 +119 +136 +152 +152 +166 +179 +185 +191 +202 +208 +211 +220 +227 +235 +240 +246 +246 +251 +255 +252 +253 +255 +253 +255 +254 +255 +255 +253 +255 +254 +249 +254 +254 +246 +253 +253 +241 +250 +251 +237 +247 +250 +231 +244 +247 +226 +238 +243 +220 +229 +237 +213 +226 +232 +206 +219 +224 +192 +215 +218 +187 +214 +214 +188 +217 +215 +194 +221 +215 +199 +222 +215 +205 +229 +219 +217 +236 +224 +224 +247 +235 +239 +250 +239 +245 +255 +244 +250 +255 +248 +253 +255 +249 +252 +255 +250 +250 +255 +250 +250 +255 +252 +251 +255 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +252 +247 +255 +253 +247 +255 +253 +250 +254 +253 +253 +253 +253 +255 +251 +253 +255 +248 +254 +255 +246 +253 +255 +244 +250 +255 +248 +251 +255 +247 +250 +255 +248 +248 +255 +252 +249 +255 +255 +248 +255 +255 +248 +250 +255 +244 +250 +252 +238 +255 +255 +237 +255 +248 +228 +253 +238 +219 +255 +239 +219 +255 +239 +217 +238 +210 +188 +176 +144 +121 +118 +82 +60 +117 +76 +54 +117 +75 +53 +119 +74 +53 +123 +78 +57 +125 +80 +59 +120 +75 +54 +107 +64 +45 +98 +55 +38 +123 +77 +64 +115 +68 +58 +113 +66 +56 +115 +68 +58 +111 +67 +56 +103 +59 +48 +100 +56 +45 +103 +61 +49 +105 +63 +51 +105 +63 +51 +105 +63 +51 +103 +63 +51 +102 +62 +50 +102 +62 +50 +102 +62 +50 +101 +63 +50 +98 +64 +52 +98 +66 +53 +96 +67 +53 +95 +67 +53 +95 +67 +53 +91 +68 +52 +90 +69 +52 +87 +68 +51 +88 +73 +54 +79 +66 +47 +92 +84 +63 +111 +105 +83 +99 +94 +72 +77 +75 +52 +73 +71 +48 +73 +75 +51 +62 +68 +42 +63 +72 +45 +64 +70 +42 +60 +66 +38 +60 +65 +35 +70 +73 +44 +88 +89 +58 +100 +101 +70 +109 +109 +81 +120 +120 +92 +116 +118 +94 +91 +95 +70 +64 +67 +46 +54 +59 +37 +56 +64 +43 +60 +67 +49 +57 +63 +51 +57 +63 +53 +57 +63 +53 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +57 +63 +53 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +55 +60 +54 +55 +60 +54 +55 +60 +54 +54 +59 +53 +54 +59 +53 +54 +59 +53 +53 +58 +52 +53 +58 +52 +51 +56 +50 +51 +56 +50 +49 +54 +48 +48 +53 +47 +47 +52 +46 +45 +50 +44 +44 +49 +43 +44 +49 +43 +43 +48 +42 +43 +48 +42 +42 +47 +41 +42 +47 +41 +43 +48 +42 +44 +49 +43 +45 +50 +44 +45 +50 +44 +48 +53 +47 +46 +51 +45 +43 +48 +42 +43 +48 +42 +45 +50 +46 +50 +55 +49 +56 +61 +57 +59 +66 +58 +64 +75 +61 +64 +77 +59 +64 +77 +59 +61 +74 +54 +56 +69 +49 +51 +64 +44 +49 +63 +40 +48 +62 +39 +60 +73 +53 +66 +79 +59 +72 +85 +67 +73 +86 +69 +68 +80 +66 +59 +71 +59 +50 +62 +52 +46 +58 +48 +45 +55 +47 +47 +54 +47 +46 +53 +46 +103 +100 +85 +103 +100 +85 +103 +100 +85 +104 +101 +86 +104 +101 +86 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +108 +100 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +107 +109 +88 +105 +110 +87 +105 +113 +90 +103 +115 +95 +100 +114 +101 +106 +121 +116 +133 +149 +149 +163 +178 +183 +189 +200 +206 +210 +219 +226 +234 +239 +245 +244 +249 +253 +251 +252 +255 +253 +255 +254 +255 +255 +253 +255 +255 +250 +255 +255 +248 +255 +255 +243 +254 +255 +241 +251 +254 +235 +247 +250 +229 +240 +245 +222 +230 +238 +214 +226 +232 +204 +217 +220 +191 +213 +213 +185 +210 +208 +185 +212 +209 +190 +218 +212 +200 +224 +217 +209 +234 +224 +223 +244 +233 +237 +253 +242 +248 +255 +246 +251 +255 +250 +255 +255 +252 +255 +255 +253 +254 +254 +253 +251 +254 +253 +249 +254 +253 +249 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +253 +255 +254 +250 +255 +255 +250 +255 +255 +252 +255 +255 +255 +255 +255 +255 +253 +254 +255 +251 +251 +255 +249 +250 +255 +249 +248 +255 +248 +246 +255 +249 +247 +255 +250 +247 +255 +254 +249 +255 +255 +251 +255 +255 +251 +253 +255 +250 +252 +253 +248 +244 +241 +234 +255 +251 +243 +255 +253 +244 +255 +251 +241 +255 +248 +235 +255 +244 +228 +246 +227 +210 +228 +207 +188 +208 +183 +163 +183 +156 +135 +146 +118 +97 +118 +87 +67 +104 +73 +53 +104 +73 +53 +109 +76 +57 +112 +79 +60 +108 +71 +55 +105 +66 +51 +103 +66 +50 +106 +69 +53 +110 +73 +57 +110 +74 +58 +111 +75 +59 +111 +75 +59 +101 +65 +49 +99 +66 +49 +99 +66 +49 +99 +66 +49 +99 +66 +49 +99 +66 +49 +98 +67 +49 +96 +67 +51 +93 +70 +54 +92 +71 +54 +92 +71 +54 +90 +71 +54 +90 +71 +54 +87 +72 +53 +84 +71 +52 +82 +71 +51 +80 +72 +51 +78 +72 +50 +102 +100 +77 +126 +126 +102 +114 +114 +90 +86 +88 +64 +74 +76 +52 +71 +77 +51 +60 +69 +42 +60 +70 +43 +63 +72 +43 +65 +71 +43 +65 +70 +40 +68 +71 +42 +77 +78 +47 +84 +85 +54 +120 +119 +91 +123 +122 +94 +110 +110 +86 +85 +85 +61 +67 +66 +46 +63 +65 +44 +62 +65 +46 +58 +62 +45 +59 +62 +51 +57 +63 +53 +57 +63 +53 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +55 +61 +51 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +57 +62 +56 +57 +62 +56 +57 +62 +56 +56 +61 +55 +56 +61 +55 +56 +61 +55 +55 +60 +54 +55 +60 +54 +54 +59 +53 +53 +58 +52 +52 +57 +51 +51 +56 +50 +50 +55 +49 +48 +53 +47 +47 +52 +46 +47 +52 +46 +45 +50 +46 +45 +50 +46 +44 +49 +45 +43 +48 +44 +43 +48 +44 +44 +49 +45 +45 +50 +46 +45 +50 +46 +44 +49 +45 +44 +49 +45 +44 +49 +45 +44 +49 +45 +46 +50 +49 +48 +53 +49 +51 +55 +54 +52 +59 +52 +59 +71 +57 +61 +76 +57 +64 +79 +60 +64 +79 +58 +60 +75 +54 +55 +70 +47 +52 +67 +44 +50 +65 +42 +54 +69 +46 +58 +73 +52 +64 +79 +60 +66 +80 +63 +63 +77 +62 +56 +70 +55 +49 +63 +50 +45 +57 +45 +45 +55 +46 +46 +53 +45 +45 +52 +44 +102 +99 +84 +102 +99 +84 +103 +100 +85 +104 +101 +86 +104 +101 +86 +105 +102 +87 +106 +103 +88 +106 +103 +88 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +108 +100 +87 +108 +100 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +107 +109 +88 +105 +110 +87 +105 +113 +90 +103 +115 +95 +98 +112 +99 +103 +120 +114 +130 +148 +148 +163 +178 +183 +192 +203 +209 +212 +221 +228 +235 +240 +246 +245 +250 +254 +251 +252 +255 +253 +255 +254 +255 +255 +253 +255 +255 +250 +255 +255 +248 +255 +255 +244 +255 +255 +243 +255 +255 +239 +250 +253 +232 +242 +247 +224 +231 +240 +213 +226 +232 +204 +215 +218 +189 +209 +209 +181 +205 +203 +180 +206 +203 +186 +214 +207 +197 +222 +215 +209 +236 +226 +227 +247 +238 +243 +255 +245 +253 +255 +249 +255 +255 +252 +255 +255 +254 +255 +255 +254 +252 +253 +254 +249 +253 +254 +248 +253 +255 +249 +254 +255 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +254 +253 +254 +255 +254 +255 +255 +254 +255 +255 +254 +255 +255 +254 +255 +253 +254 +255 +250 +253 +254 +248 +253 +253 +245 +251 +251 +241 +252 +252 +244 +254 +253 +248 +255 +254 +250 +255 +255 +253 +254 +254 +254 +254 +252 +255 +254 +252 +255 +251 +246 +252 +255 +250 +254 +254 +248 +250 +249 +244 +241 +253 +246 +240 +255 +254 +244 +255 +254 +241 +255 +254 +237 +255 +248 +230 +252 +239 +220 +242 +227 +208 +226 +209 +189 +205 +187 +167 +179 +161 +141 +155 +134 +115 +140 +117 +99 +122 +93 +75 +125 +94 +76 +116 +85 +67 +97 +68 +50 +87 +58 +40 +89 +60 +42 +91 +62 +44 +88 +61 +42 +96 +69 +50 +96 +69 +50 +96 +69 +50 +95 +70 +50 +96 +71 +51 +96 +71 +51 +96 +71 +51 +93 +72 +51 +92 +75 +55 +92 +77 +58 +92 +77 +58 +89 +76 +57 +88 +77 +57 +85 +77 +56 +82 +76 +54 +81 +76 +54 +78 +76 +53 +81 +81 +57 +105 +107 +83 +124 +128 +103 +109 +113 +88 +83 +89 +63 +70 +76 +50 +62 +71 +44 +60 +70 +43 +60 +70 +43 +63 +72 +43 +68 +74 +46 +69 +74 +44 +68 +71 +42 +72 +73 +42 +76 +77 +46 +121 +120 +92 +116 +115 +87 +102 +100 +77 +84 +82 +59 +76 +73 +54 +75 +74 +54 +70 +69 +51 +60 +61 +45 +60 +63 +52 +57 +63 +53 +57 +63 +53 +57 +63 +53 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +55 +61 +51 +55 +61 +51 +56 +62 +52 +56 +62 +52 +56 +62 +52 +56 +62 +52 +57 +63 +53 +57 +63 +53 +58 +63 +57 +58 +63 +57 +58 +63 +57 +58 +63 +57 +57 +62 +56 +57 +62 +56 +57 +62 +56 +56 +61 +55 +56 +61 +55 +56 +61 +55 +55 +60 +54 +54 +59 +53 +53 +58 +52 +52 +57 +51 +51 +56 +50 +51 +56 +50 +47 +52 +48 +46 +51 +47 +45 +50 +46 +44 +49 +45 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +43 +48 +44 +44 +49 +45 +45 +49 +48 +46 +50 +49 +47 +51 +50 +47 +51 +50 +47 +51 +50 +45 +52 +45 +51 +63 +49 +55 +70 +51 +61 +76 +55 +64 +79 +58 +63 +78 +55 +60 +75 +52 +57 +72 +49 +56 +71 +48 +53 +68 +45 +56 +71 +48 +60 +75 +54 +62 +77 +58 +60 +74 +57 +55 +69 +54 +49 +63 +50 +45 +57 +45 +44 +54 +45 +46 +53 +45 +45 +52 +44 +102 +99 +84 +102 +99 +84 +103 +100 +85 +104 +101 +86 +104 +101 +86 +105 +102 +87 +106 +103 +88 +106 +103 +88 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +108 +100 +87 +108 +100 +87 +108 +99 +90 +109 +100 +91 +109 +100 +93 +109 +102 +92 +109 +103 +91 +106 +105 +87 +106 +108 +87 +104 +109 +86 +104 +114 +90 +102 +115 +95 +99 +113 +100 +104 +121 +115 +133 +151 +151 +165 +183 +187 +199 +210 +216 +218 +227 +234 +240 +245 +251 +248 +253 +255 +252 +253 +255 +253 +255 +254 +255 +255 +253 +255 +254 +249 +255 +255 +245 +255 +255 +242 +255 +255 +240 +252 +255 +236 +248 +251 +230 +239 +244 +221 +226 +235 +208 +221 +227 +199 +213 +213 +185 +206 +204 +179 +201 +196 +176 +202 +196 +180 +208 +201 +191 +218 +210 +207 +233 +224 +227 +246 +237 +242 +255 +246 +254 +255 +249 +255 +255 +252 +255 +255 +254 +255 +254 +254 +252 +252 +254 +249 +251 +255 +247 +252 +255 +248 +253 +255 +250 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +254 +254 +251 +255 +255 +252 +255 +254 +253 +255 +253 +255 +254 +250 +255 +250 +247 +255 +248 +246 +255 +243 +245 +255 +240 +243 +254 +238 +245 +255 +242 +250 +255 +246 +253 +255 +250 +255 +253 +254 +255 +251 +255 +255 +249 +255 +255 +248 +255 +252 +241 +255 +254 +245 +255 +255 +250 +255 +255 +253 +255 +255 +252 +255 +252 +251 +249 +248 +248 +240 +245 +245 +233 +255 +255 +241 +255 +255 +239 +255 +255 +237 +255 +255 +237 +255 +252 +234 +255 +246 +229 +251 +239 +223 +248 +235 +218 +249 +228 +209 +255 +230 +208 +227 +202 +180 +165 +143 +120 +116 +94 +71 +101 +79 +56 +98 +76 +53 +92 +72 +48 +94 +74 +50 +92 +74 +50 +92 +74 +50 +93 +75 +51 +93 +75 +51 +94 +76 +52 +94 +76 +52 +92 +77 +54 +89 +78 +56 +87 +79 +58 +87 +79 +58 +86 +80 +58 +85 +79 +57 +83 +78 +56 +80 +78 +55 +78 +78 +54 +77 +79 +55 +80 +84 +59 +96 +102 +76 +102 +111 +84 +85 +94 +67 +69 +79 +52 +65 +75 +48 +60 +70 +43 +63 +73 +46 +63 +73 +46 +67 +76 +47 +72 +78 +50 +72 +77 +47 +70 +73 +44 +79 +80 +49 +89 +88 +58 +113 +109 +82 +106 +102 +75 +97 +92 +70 +91 +86 +64 +89 +84 +65 +84 +81 +62 +77 +74 +57 +66 +67 +51 +61 +64 +53 +59 +65 +55 +59 +65 +55 +59 +65 +55 +58 +64 +54 +58 +64 +54 +58 +64 +54 +57 +63 +53 +56 +62 +52 +56 +62 +52 +56 +62 +52 +57 +63 +53 +57 +63 +53 +58 +64 +54 +58 +64 +54 +58 +64 +54 +59 +64 +58 +59 +64 +58 +59 +64 +58 +58 +63 +57 +58 +63 +57 +57 +62 +56 +57 +62 +56 +57 +62 +56 +58 +63 +57 +58 +63 +57 +57 +62 +56 +57 +62 +56 +56 +61 +55 +56 +61 +55 +55 +60 +54 +55 +60 +54 +52 +57 +53 +50 +55 +51 +49 +54 +50 +47 +52 +48 +45 +50 +46 +44 +49 +45 +43 +47 +46 +43 +47 +46 +44 +48 +47 +44 +48 +47 +45 +49 +48 +46 +50 +49 +46 +50 +51 +46 +50 +51 +45 +49 +50 +43 +49 +45 +43 +57 +42 +47 +64 +45 +54 +72 +50 +59 +77 +55 +61 +79 +55 +60 +78 +52 +58 +76 +50 +58 +76 +50 +53 +71 +47 +55 +73 +49 +58 +76 +54 +60 +77 +58 +58 +75 +57 +54 +71 +55 +48 +64 +51 +45 +59 +46 +45 +55 +46 +46 +53 +45 +45 +52 +44 +99 +100 +82 +99 +100 +82 +100 +101 +83 +101 +102 +84 +101 +102 +86 +104 +102 +87 +105 +103 +88 +105 +103 +88 +104 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +105 +102 +87 +107 +101 +87 +107 +101 +87 +107 +101 +87 +108 +100 +89 +108 +101 +91 +109 +100 +93 +109 +102 +92 +107 +103 +91 +106 +105 +87 +105 +107 +86 +104 +109 +87 +104 +114 +90 +103 +116 +96 +100 +113 +103 +106 +123 +117 +137 +155 +157 +170 +187 +194 +205 +216 +222 +223 +232 +239 +242 +249 +255 +250 +255 +255 +251 +255 +255 +253 +255 +254 +254 +255 +250 +254 +254 +246 +250 +250 +238 +250 +251 +237 +250 +251 +233 +248 +250 +229 +244 +246 +225 +234 +238 +215 +223 +227 +202 +217 +219 +195 +211 +209 +184 +204 +199 +177 +197 +190 +172 +198 +190 +177 +204 +195 +188 +214 +206 +204 +230 +221 +224 +244 +234 +242 +253 +246 +254 +254 +249 +255 +255 +253 +255 +254 +254 +255 +253 +253 +251 +252 +254 +249 +251 +255 +249 +252 +255 +250 +253 +255 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +254 +254 +252 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +253 +254 +255 +250 +255 +255 +251 +255 +254 +252 +255 +252 +254 +253 +249 +255 +251 +246 +255 +247 +244 +255 +244 +243 +255 +241 +242 +254 +240 +245 +255 +242 +250 +255 +246 +254 +255 +250 +255 +252 +251 +255 +249 +252 +255 +247 +255 +255 +246 +255 +255 +248 +255 +255 +247 +255 +255 +249 +255 +255 +252 +255 +253 +252 +255 +251 +253 +252 +250 +255 +251 +252 +255 +250 +244 +250 +240 +244 +250 +238 +247 +249 +236 +247 +248 +234 +248 +246 +231 +251 +248 +231 +255 +250 +234 +255 +253 +234 +253 +241 +219 +255 +251 +228 +236 +220 +197 +158 +142 +119 +96 +80 +55 +82 +66 +41 +88 +72 +47 +88 +72 +47 +91 +77 +51 +91 +77 +51 +90 +78 +52 +90 +78 +52 +91 +79 +53 +91 +79 +53 +92 +80 +54 +91 +81 +56 +85 +79 +55 +84 +79 +57 +84 +79 +57 +81 +79 +56 +80 +78 +55 +78 +78 +54 +75 +77 +53 +73 +77 +52 +74 +78 +53 +76 +82 +56 +83 +92 +65 +80 +89 +60 +64 +73 +44 +59 +70 +40 +65 +76 +46 +63 +74 +42 +67 +78 +46 +68 +79 +47 +72 +81 +50 +76 +83 +50 +73 +78 +48 +74 +77 +46 +89 +90 +59 +107 +106 +78 +102 +101 +73 +98 +94 +69 +94 +89 +67 +95 +90 +70 +96 +91 +71 +90 +85 +66 +83 +78 +59 +76 +73 +56 +65 +66 +52 +64 +66 +53 +64 +66 +53 +62 +65 +54 +62 +65 +54 +62 +65 +54 +61 +64 +55 +61 +64 +55 +57 +63 +53 +57 +63 +53 +57 +63 +53 +58 +64 +54 +58 +64 +54 +58 +66 +55 +58 +66 +55 +58 +66 +55 +59 +64 +57 +59 +64 +57 +59 +64 +58 +58 +63 +56 +58 +63 +57 +57 +62 +55 +57 +62 +56 +57 +62 +55 +59 +64 +58 +59 +64 +57 +59 +64 +58 +59 +64 +57 +58 +63 +57 +58 +63 +56 +58 +63 +57 +58 +63 +57 +56 +63 +56 +55 +61 +57 +52 +59 +52 +51 +56 +50 +49 +54 +48 +47 +52 +46 +46 +51 +47 +46 +51 +47 +46 +50 +49 +46 +50 +49 +44 +50 +46 +44 +50 +46 +43 +50 +43 +43 +50 +42 +44 +52 +41 +41 +54 +37 +36 +54 +30 +41 +61 +33 +50 +70 +43 +56 +76 +49 +59 +79 +54 +59 +77 +53 +59 +77 +53 +59 +77 +53 +56 +74 +50 +57 +75 +51 +59 +77 +53 +60 +78 +54 +60 +78 +56 +55 +72 +53 +49 +66 +48 +46 +60 +45 +46 +56 +45 +47 +54 +46 +46 +53 +45 +92 +102 +78 +93 +103 +79 +95 +103 +80 +96 +104 +81 +98 +106 +85 +101 +106 +86 +103 +106 +87 +104 +107 +88 +102 +103 +85 +104 +103 +85 +104 +101 +86 +104 +101 +86 +106 +100 +86 +107 +101 +87 +107 +101 +89 +108 +102 +88 +107 +101 +87 +106 +103 +88 +109 +103 +91 +108 +104 +93 +109 +102 +94 +106 +102 +91 +104 +100 +88 +102 +100 +85 +102 +103 +85 +103 +108 +86 +102 +111 +90 +98 +111 +93 +99 +112 +103 +114 +130 +127 +150 +168 +172 +185 +199 +208 +209 +219 +228 +224 +233 +240 +240 +247 +253 +247 +252 +255 +247 +253 +251 +250 +255 +251 +252 +255 +248 +252 +254 +243 +248 +249 +235 +250 +251 +235 +249 +248 +230 +243 +240 +221 +239 +236 +217 +236 +233 +214 +224 +222 +201 +214 +209 +189 +216 +208 +189 +203 +191 +175 +188 +179 +164 +188 +178 +169 +195 +184 +180 +205 +195 +196 +219 +210 +215 +233 +223 +231 +250 +243 +251 +253 +248 +255 +254 +251 +255 +255 +254 +255 +254 +254 +255 +252 +254 +253 +251 +253 +250 +252 +254 +251 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +255 +253 +255 +255 +253 +255 +255 +251 +255 +254 +250 +255 +253 +250 +255 +252 +249 +255 +252 +249 +255 +252 +249 +255 +254 +255 +255 +253 +254 +253 +253 +253 +253 +253 +253 +254 +255 +255 +254 +255 +253 +251 +255 +252 +249 +254 +248 +253 +255 +250 +251 +252 +246 +253 +252 +247 +255 +255 +250 +255 +254 +248 +255 +249 +244 +255 +247 +243 +255 +250 +249 +255 +251 +255 +255 +252 +255 +254 +253 +255 +254 +255 +255 +254 +255 +255 +251 +255 +252 +251 +255 +252 +250 +254 +253 +252 +255 +255 +252 +255 +255 +255 +255 +253 +255 +254 +249 +255 +254 +242 +255 +254 +237 +255 +254 +234 +255 +254 +232 +251 +245 +223 +255 +252 +230 +233 +225 +202 +145 +137 +114 +86 +79 +53 +88 +78 +51 +85 +76 +47 +83 +74 +45 +87 +78 +49 +87 +78 +49 +85 +78 +49 +85 +78 +49 +84 +79 +50 +84 +79 +50 +84 +78 +52 +83 +79 +52 +81 +77 +50 +82 +78 +53 +80 +78 +53 +80 +80 +54 +77 +79 +55 +75 +79 +54 +72 +77 +54 +71 +76 +53 +74 +80 +54 +70 +79 +52 +65 +74 +45 +61 +70 +39 +62 +72 +38 +68 +75 +42 +70 +77 +43 +68 +78 +41 +77 +88 +48 +75 +87 +47 +70 +81 +41 +67 +77 +40 +79 +86 +52 +94 +99 +67 +96 +99 +68 +90 +90 +62 +89 +89 +63 +91 +89 +66 +95 +90 +68 +95 +90 +70 +95 +88 +69 +92 +85 +66 +88 +81 +62 +85 +78 +59 +75 +70 +51 +71 +68 +49 +68 +65 +48 +65 +63 +48 +64 +62 +49 +62 +62 +50 +63 +63 +53 +63 +65 +54 +60 +63 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +57 +65 +52 +55 +66 +52 +55 +66 +52 +55 +66 +52 +58 +66 +55 +57 +65 +54 +57 +64 +56 +56 +64 +53 +56 +63 +55 +57 +65 +54 +57 +64 +56 +58 +66 +55 +58 +65 +57 +58 +66 +55 +57 +64 +56 +58 +66 +55 +59 +66 +58 +60 +68 +57 +61 +68 +60 +62 +69 +61 +56 +66 +58 +55 +65 +57 +55 +65 +56 +55 +63 +52 +53 +61 +48 +51 +59 +46 +50 +56 +46 +49 +54 +48 +46 +52 +48 +47 +53 +49 +45 +55 +47 +45 +57 +45 +46 +59 +41 +48 +64 +38 +54 +71 +39 +55 +77 +39 +59 +86 +43 +59 +88 +44 +60 +86 +49 +59 +84 +52 +59 +82 +56 +60 +79 +57 +61 +78 +59 +61 +79 +57 +58 +76 +54 +63 +81 +55 +68 +86 +60 +68 +87 +59 +67 +87 +60 +64 +84 +59 +55 +74 +52 +46 +63 +44 +45 +55 +44 +44 +51 +43 +41 +48 +40 +89 +103 +77 +90 +104 +78 +92 +104 +80 +93 +105 +81 +97 +107 +83 +98 +108 +84 +103 +108 +88 +103 +108 +88 +103 +104 +86 +103 +104 +86 +105 +102 +87 +105 +102 +87 +107 +101 +87 +108 +102 +88 +109 +101 +90 +109 +103 +89 +108 +102 +88 +106 +103 +88 +107 +103 +91 +108 +104 +93 +107 +103 +94 +106 +102 +91 +104 +102 +90 +101 +102 +86 +104 +105 +87 +103 +108 +86 +103 +112 +93 +102 +115 +98 +106 +119 +110 +121 +137 +136 +156 +171 +178 +186 +200 +209 +208 +218 +227 +224 +233 +238 +240 +247 +253 +246 +254 +255 +249 +255 +253 +249 +255 +249 +251 +254 +245 +249 +253 +239 +249 +250 +236 +248 +249 +231 +246 +243 +226 +238 +235 +216 +235 +230 +211 +230 +225 +206 +221 +214 +196 +210 +201 +184 +203 +191 +175 +193 +179 +166 +184 +172 +160 +187 +174 +166 +194 +183 +181 +205 +195 +196 +219 +208 +214 +228 +221 +228 +251 +243 +254 +253 +247 +255 +254 +251 +255 +255 +254 +255 +254 +253 +255 +252 +253 +255 +252 +254 +253 +252 +254 +253 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +255 +253 +255 +255 +253 +255 +253 +250 +255 +253 +250 +255 +253 +250 +255 +252 +249 +255 +252 +248 +255 +253 +248 +255 +254 +253 +255 +254 +252 +253 +253 +253 +253 +253 +253 +255 +255 +255 +255 +255 +255 +254 +254 +254 +253 +253 +253 +255 +255 +253 +255 +255 +251 +255 +252 +249 +254 +247 +241 +245 +236 +229 +238 +228 +219 +244 +231 +222 +250 +241 +234 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +252 +255 +255 +252 +255 +255 +255 +254 +255 +254 +254 +252 +255 +253 +244 +255 +254 +236 +255 +253 +231 +255 +254 +229 +248 +246 +223 +254 +252 +231 +229 +224 +202 +141 +137 +112 +83 +77 +51 +84 +79 +50 +82 +75 +46 +81 +74 +45 +85 +79 +47 +85 +79 +47 +84 +79 +49 +84 +79 +49 +83 +79 +50 +83 +79 +50 +81 +80 +52 +81 +80 +52 +81 +77 +50 +79 +78 +50 +80 +78 +53 +78 +81 +54 +77 +79 +55 +74 +80 +54 +72 +77 +54 +69 +77 +53 +71 +80 +53 +69 +78 +49 +65 +74 +45 +63 +73 +39 +66 +73 +40 +70 +77 +43 +74 +80 +44 +74 +82 +43 +75 +86 +43 +75 +88 +42 +82 +93 +51 +89 +100 +60 +93 +101 +64 +87 +94 +60 +83 +88 +58 +83 +86 +57 +85 +85 +61 +86 +86 +62 +90 +85 +65 +91 +86 +66 +92 +85 +66 +92 +84 +65 +90 +82 +61 +89 +81 +60 +82 +76 +54 +80 +74 +52 +75 +70 +51 +72 +67 +48 +67 +64 +49 +65 +63 +50 +66 +64 +52 +63 +65 +54 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +58 +66 +55 +57 +65 +54 +57 +65 +54 +56 +64 +53 +56 +64 +53 +57 +65 +54 +57 +65 +54 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +59 +67 +56 +60 +68 +57 +61 +69 +58 +60 +70 +59 +61 +71 +63 +60 +72 +62 +60 +70 +59 +60 +71 +55 +60 +68 +53 +58 +66 +51 +57 +63 +51 +56 +61 +54 +55 +62 +55 +52 +62 +54 +51 +61 +52 +48 +62 +45 +51 +67 +41 +57 +77 +42 +66 +89 +47 +71 +97 +49 +79 +112 +59 +76 +110 +59 +76 +105 +61 +70 +97 +62 +66 +89 +63 +60 +82 +61 +59 +76 +58 +58 +75 +56 +61 +79 +57 +68 +86 +60 +74 +93 +65 +76 +95 +65 +75 +95 +67 +72 +92 +64 +60 +83 +57 +51 +70 +48 +43 +53 +42 +43 +50 +42 +40 +47 +39 +89 +103 +77 +90 +104 +78 +92 +104 +80 +94 +106 +82 +97 +107 +83 +99 +109 +85 +103 +108 +88 +104 +109 +89 +105 +106 +88 +105 +106 +88 +107 +104 +89 +107 +104 +89 +108 +102 +88 +109 +103 +89 +110 +102 +91 +110 +104 +90 +108 +102 +88 +107 +104 +89 +107 +103 +91 +107 +103 +92 +107 +103 +94 +106 +102 +91 +104 +102 +90 +101 +102 +86 +104 +105 +87 +101 +106 +84 +100 +109 +90 +103 +116 +99 +111 +124 +115 +127 +143 +142 +157 +172 +179 +182 +196 +205 +204 +214 +223 +221 +230 +235 +239 +246 +252 +246 +254 +255 +249 +255 +253 +248 +255 +248 +248 +251 +242 +245 +249 +235 +244 +245 +231 +241 +242 +224 +236 +233 +216 +226 +223 +204 +222 +217 +198 +216 +211 +192 +208 +201 +183 +199 +190 +173 +192 +180 +164 +188 +174 +161 +187 +175 +163 +194 +181 +173 +204 +193 +191 +215 +205 +206 +227 +216 +222 +234 +227 +234 +251 +243 +254 +253 +247 +255 +254 +251 +255 +254 +253 +255 +253 +252 +255 +252 +253 +255 +252 +254 +253 +253 +255 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +255 +253 +255 +254 +252 +255 +253 +250 +255 +253 +250 +255 +252 +249 +255 +252 +249 +255 +252 +248 +255 +253 +248 +255 +254 +253 +254 +253 +251 +252 +252 +252 +253 +253 +253 +254 +254 +254 +255 +255 +255 +254 +254 +254 +253 +253 +253 +255 +255 +253 +255 +255 +251 +255 +253 +250 +249 +242 +236 +232 +223 +216 +223 +213 +204 +234 +221 +212 +246 +237 +230 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +252 +255 +255 +252 +255 +255 +255 +254 +255 +254 +254 +252 +255 +253 +244 +255 +254 +236 +255 +253 +231 +255 +254 +229 +249 +247 +224 +254 +252 +231 +228 +223 +201 +138 +134 +109 +80 +74 +48 +82 +77 +48 +82 +75 +46 +82 +75 +46 +84 +78 +46 +85 +79 +47 +84 +79 +49 +85 +80 +50 +84 +80 +51 +83 +79 +50 +81 +80 +52 +80 +79 +51 +81 +77 +50 +79 +78 +50 +80 +78 +53 +77 +80 +53 +77 +79 +55 +74 +80 +54 +73 +78 +55 +70 +78 +54 +72 +81 +54 +69 +78 +49 +67 +76 +47 +66 +76 +42 +70 +77 +44 +73 +80 +46 +79 +85 +49 +81 +89 +50 +80 +91 +48 +85 +98 +52 +103 +116 +73 +119 +130 +90 +112 +120 +83 +88 +95 +61 +76 +81 +51 +78 +81 +52 +80 +80 +56 +81 +81 +57 +84 +79 +59 +85 +80 +60 +87 +80 +61 +88 +81 +62 +91 +83 +62 +92 +84 +63 +89 +83 +61 +86 +80 +58 +81 +76 +57 +77 +72 +53 +71 +68 +53 +68 +66 +53 +67 +65 +53 +63 +65 +54 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +58 +66 +55 +58 +66 +55 +57 +65 +54 +57 +65 +54 +57 +65 +54 +57 +65 +54 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +58 +66 +55 +59 +67 +56 +60 +68 +57 +62 +70 +59 +60 +70 +59 +64 +74 +66 +63 +75 +65 +64 +74 +63 +64 +75 +59 +65 +73 +58 +63 +71 +56 +63 +69 +57 +62 +67 +60 +62 +69 +62 +57 +67 +59 +54 +64 +55 +52 +66 +49 +57 +73 +47 +66 +86 +51 +80 +103 +61 +88 +114 +66 +94 +127 +74 +91 +125 +74 +87 +116 +72 +77 +104 +69 +67 +90 +64 +57 +79 +58 +54 +71 +53 +52 +69 +50 +60 +78 +56 +69 +87 +61 +77 +96 +68 +82 +101 +71 +82 +102 +74 +78 +98 +70 +65 +88 +62 +56 +75 +53 +47 +57 +46 +47 +54 +46 +44 +51 +43 +89 +103 +77 +90 +104 +78 +92 +104 +80 +94 +106 +82 +98 +108 +84 +100 +110 +86 +104 +109 +89 +105 +110 +90 +107 +108 +90 +107 +108 +90 +109 +106 +91 +108 +105 +90 +110 +104 +90 +110 +104 +90 +111 +103 +92 +111 +105 +91 +109 +103 +89 +107 +104 +89 +107 +103 +91 +107 +103 +92 +106 +102 +93 +106 +102 +91 +104 +102 +90 +102 +103 +87 +102 +103 +85 +97 +102 +80 +95 +104 +85 +100 +113 +96 +112 +125 +116 +127 +143 +142 +151 +166 +173 +171 +185 +194 +199 +209 +218 +217 +226 +231 +237 +244 +250 +245 +253 +255 +248 +254 +252 +245 +252 +245 +243 +246 +237 +238 +242 +228 +234 +235 +221 +228 +229 +211 +221 +218 +201 +212 +209 +190 +208 +203 +184 +202 +197 +178 +195 +188 +170 +189 +180 +163 +196 +184 +168 +198 +184 +171 +203 +191 +179 +213 +200 +192 +224 +213 +211 +234 +224 +225 +244 +233 +239 +248 +241 +248 +252 +244 +255 +253 +247 +255 +254 +251 +255 +254 +253 +255 +253 +252 +255 +251 +252 +254 +252 +254 +253 +253 +255 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +253 +250 +255 +252 +249 +255 +252 +249 +255 +252 +249 +255 +251 +247 +255 +252 +247 +255 +253 +252 +253 +252 +250 +251 +251 +251 +252 +252 +252 +254 +254 +254 +255 +255 +255 +254 +254 +254 +253 +253 +253 +254 +253 +251 +255 +255 +251 +255 +253 +250 +250 +243 +237 +234 +225 +218 +227 +217 +208 +239 +226 +217 +251 +242 +235 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +252 +255 +255 +252 +255 +255 +255 +254 +255 +254 +254 +252 +255 +253 +244 +255 +254 +236 +255 +252 +230 +255 +253 +228 +252 +250 +227 +255 +254 +233 +228 +223 +201 +137 +133 +108 +80 +74 +48 +82 +77 +48 +84 +77 +48 +84 +77 +48 +84 +78 +46 +85 +79 +47 +85 +80 +50 +85 +80 +50 +84 +80 +51 +83 +79 +50 +80 +79 +51 +79 +78 +50 +81 +77 +50 +79 +78 +50 +79 +77 +52 +76 +79 +52 +76 +78 +54 +74 +80 +54 +74 +79 +56 +71 +79 +55 +74 +83 +56 +71 +80 +51 +70 +79 +50 +72 +82 +48 +76 +83 +50 +78 +85 +51 +85 +91 +55 +91 +99 +60 +103 +114 +71 +115 +128 +82 +135 +148 +105 +144 +156 +116 +133 +143 +106 +110 +117 +83 +90 +95 +65 +82 +87 +57 +79 +79 +55 +78 +78 +54 +80 +75 +55 +79 +74 +54 +82 +75 +56 +85 +78 +59 +89 +81 +60 +91 +83 +62 +90 +84 +62 +88 +82 +60 +84 +79 +60 +80 +75 +56 +74 +71 +56 +71 +69 +56 +69 +67 +55 +65 +67 +56 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +59 +67 +56 +58 +66 +55 +57 +65 +54 +57 +65 +54 +57 +65 +54 +57 +65 +54 +58 +66 +55 +59 +67 +56 +59 +67 +56 +58 +66 +55 +58 +66 +55 +59 +67 +56 +59 +67 +56 +61 +69 +58 +62 +70 +59 +61 +71 +60 +61 +71 +63 +60 +72 +62 +62 +72 +61 +62 +73 +57 +64 +72 +57 +63 +71 +56 +63 +69 +57 +63 +68 +61 +61 +68 +61 +57 +67 +59 +54 +64 +55 +52 +66 +49 +57 +73 +47 +68 +88 +53 +82 +105 +63 +91 +117 +69 +89 +122 +69 +87 +121 +70 +84 +113 +69 +73 +100 +65 +62 +85 +59 +51 +73 +52 +48 +65 +47 +46 +63 +44 +54 +72 +50 +64 +82 +56 +75 +94 +66 +82 +101 +71 +83 +103 +75 +79 +99 +71 +65 +88 +62 +54 +73 +51 +49 +59 +48 +48 +55 +47 +45 +52 +44 +89 +103 +77 +90 +104 +78 +92 +104 +80 +94 +106 +82 +98 +108 +84 +100 +110 +86 +105 +110 +90 +106 +111 +91 +109 +110 +92 +108 +109 +91 +110 +107 +92 +109 +106 +91 +110 +104 +90 +110 +104 +90 +112 +104 +93 +111 +105 +91 +109 +103 +89 +107 +104 +89 +106 +102 +90 +106 +102 +91 +105 +101 +92 +105 +101 +90 +104 +102 +90 +102 +103 +87 +103 +104 +86 +97 +102 +80 +94 +103 +84 +100 +113 +96 +112 +125 +116 +125 +141 +140 +145 +160 +167 +161 +175 +184 +194 +204 +213 +214 +223 +228 +234 +241 +247 +243 +251 +253 +245 +251 +249 +242 +249 +242 +239 +242 +233 +233 +237 +223 +227 +228 +214 +218 +219 +201 +211 +208 +191 +204 +201 +182 +201 +196 +177 +195 +190 +171 +190 +183 +165 +187 +178 +161 +202 +190 +174 +209 +195 +182 +218 +206 +194 +229 +216 +208 +238 +227 +225 +248 +238 +239 +255 +245 +251 +255 +249 +255 +252 +244 +255 +253 +247 +255 +253 +250 +255 +253 +252 +255 +252 +251 +255 +251 +252 +254 +252 +254 +253 +254 +255 +255 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +254 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +254 +252 +255 +252 +249 +255 +252 +249 +255 +252 +249 +255 +251 +248 +255 +251 +247 +255 +252 +247 +255 +252 +251 +252 +251 +249 +251 +251 +251 +252 +252 +252 +254 +254 +254 +255 +255 +255 +254 +254 +254 +253 +253 +253 +254 +253 +251 +254 +253 +249 +255 +252 +249 +254 +247 +241 +245 +236 +229 +239 +229 +220 +247 +234 +225 +254 +245 +238 +255 +252 +253 +254 +254 +255 +253 +255 +254 +254 +255 +253 +252 +255 +251 +251 +255 +250 +251 +255 +254 +250 +254 +255 +251 +255 +255 +251 +255 +255 +254 +253 +255 +254 +254 +252 +255 +254 +245 +255 +254 +236 +255 +252 +230 +255 +252 +227 +254 +252 +229 +255 +255 +235 +229 +224 +202 +138 +134 +109 +81 +75 +49 +84 +79 +50 +86 +79 +50 +87 +80 +51 +84 +78 +46 +85 +79 +47 +86 +81 +51 +86 +81 +51 +85 +81 +52 +83 +79 +50 +79 +78 +50 +78 +77 +49 +81 +77 +50 +79 +78 +50 +79 +77 +52 +76 +79 +52 +76 +78 +54 +74 +80 +54 +74 +79 +56 +73 +81 +57 +76 +85 +58 +73 +82 +53 +74 +83 +54 +78 +88 +54 +81 +88 +55 +82 +89 +55 +91 +97 +61 +99 +107 +68 +129 +142 +98 +146 +162 +115 +161 +174 +131 +157 +169 +129 +148 +158 +121 +138 +145 +111 +115 +120 +90 +90 +95 +65 +80 +80 +56 +78 +78 +54 +78 +73 +53 +76 +71 +51 +78 +71 +52 +81 +74 +55 +86 +78 +57 +88 +80 +59 +88 +82 +60 +86 +80 +58 +83 +78 +59 +80 +75 +56 +76 +73 +58 +73 +71 +58 +71 +69 +57 +67 +69 +58 +61 +62 +54 +58 +64 +54 +58 +64 +54 +57 +65 +54 +55 +66 +52 +55 +66 +52 +54 +67 +50 +54 +67 +50 +59 +67 +56 +59 +67 +56 +58 +66 +55 +57 +65 +54 +57 +65 +54 +58 +66 +55 +59 +67 +56 +59 +67 +56 +59 +67 +56 +59 +67 +56 +59 +67 +56 +59 +67 +56 +60 +68 +57 +61 +69 +58 +62 +70 +59 +61 +71 +60 +59 +69 +61 +58 +70 +60 +60 +70 +59 +60 +71 +55 +62 +70 +55 +61 +69 +54 +62 +68 +56 +61 +66 +59 +58 +65 +58 +55 +65 +57 +53 +63 +54 +52 +66 +49 +57 +73 +47 +66 +86 +51 +78 +101 +59 +85 +111 +63 +83 +116 +63 +81 +115 +64 +79 +108 +64 +69 +96 +61 +57 +80 +54 +46 +68 +47 +44 +61 +43 +44 +61 +42 +49 +67 +45 +60 +78 +52 +73 +92 +64 +80 +99 +69 +82 +102 +74 +78 +98 +70 +63 +86 +60 +52 +71 +49 +43 +53 +42 +43 +50 +42 +40 +47 +39 diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/image8.txt b/privatemodules/nc4/share/hdf5_examples/hl/c/image8.txt new file mode 100644 index 0000000000000000000000000000000000000000..4ba59809d5e60dbfeb0238184dd05dc68b70ad42 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/image8.txt @@ -0,0 +1,120006 @@ +components +1 +height +400 +width +300 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +12 +8 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +61 +52 +39 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +86 +77 +65 +48 +16 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +108 +106 +104 +99 +88 +48 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +109 +107 +106 +106 +105 +98 +60 +26 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +107 +105 +104 +104 +105 +105 +100 +73 +37 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +108 +105 +104 +104 +105 +105 +104 +93 +69 +29 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +109 +105 +103 +103 +104 +106 +106 +103 +89 +59 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +111 +105 +103 +103 +104 +106 +107 +106 +100 +86 +29 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +113 +105 +102 +101 +102 +105 +107 +108 +106 +100 +55 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +115 +107 +102 +101 +100 +101 +104 +107 +108 +107 +88 +42 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +118 +109 +103 +100 +99 +100 +102 +105 +108 +108 +99 +63 +30 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +119 +111 +104 +100 +97 +100 +101 +103 +106 +109 +105 +82 +48 +17 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +3 +4 +5 +6 +7 +7 +8 +9 +9 +9 +9 +9 +8 +7 +7 +6 +4 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +119 +113 +106 +100 +97 +100 +101 +102 +104 +108 +108 +95 +65 +30 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +4 +6 +7 +9 +11 +13 +16 +18 +20 +22 +24 +26 +27 +27 +28 +28 +27 +25 +24 +22 +20 +16 +13 +11 +8 +6 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +119 +115 +109 +102 +97 +100 +103 +104 +104 +106 +108 +103 +79 +46 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +4 +6 +9 +12 +17 +21 +25 +30 +34 +40 +44 +48 +52 +55 +58 +60 +61 +62 +62 +60 +58 +56 +52 +48 +41 +35 +29 +23 +18 +11 +7 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +115 +114 +111 +106 +99 +97 +104 +106 +106 +106 +107 +106 +91 +65 +30 +7 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +6 +9 +13 +20 +26 +33 +41 +49 +59 +66 +74 +80 +87 +94 +98 +102 +106 +109 +112 +113 +114 +115 +115 +115 +114 +112 +109 +105 +98 +91 +82 +72 +61 +46 +36 +26 +18 +12 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +109 +111 +110 +107 +103 +97 +104 +107 +108 +107 +107 +107 +97 +77 +44 +16 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +6 +11 +17 +24 +31 +40 +52 +62 +71 +79 +87 +95 +100 +104 +107 +110 +113 +115 +117 +119 +120 +121 +122 +123 +124 +124 +125 +125 +124 +124 +123 +120 +118 +113 +108 +101 +87 +75 +62 +49 +36 +21 +13 +7 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +104 +106 +107 +106 +98 +101 +106 +109 +108 +108 +107 +101 +85 +56 +27 +14 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +6 +10 +15 +22 +33 +43 +53 +64 +74 +85 +93 +99 +104 +109 +113 +115 +117 +119 +120 +121 +122 +123 +124 +124 +125 +126 +126 +127 +128 +128 +129 +129 +129 +129 +129 +129 +127 +125 +122 +115 +106 +96 +84 +70 +50 +37 +25 +16 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +97 +101 +104 +106 +100 +99 +104 +109 +110 +108 +108 +104 +92 +67 +38 +23 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +6 +12 +18 +27 +36 +48 +63 +75 +85 +95 +103 +110 +113 +116 +117 +118 +119 +120 +120 +121 +121 +122 +122 +122 +123 +123 +124 +124 +125 +126 +126 +127 +128 +129 +129 +130 +130 +130 +131 +131 +130 +129 +127 +122 +114 +104 +85 +69 +53 +38 +25 +11 +6 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +90 +92 +95 +99 +105 +105 +98 +102 +108 +111 +110 +109 +106 +98 +79 +48 +33 +19 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +10 +17 +29 +41 +55 +69 +83 +99 +107 +112 +115 +116 +117 +118 +118 +119 +119 +120 +120 +120 +120 +120 +119 +119 +119 +119 +119 +119 +119 +120 +121 +122 +123 +124 +126 +127 +128 +129 +130 +131 +131 +131 +131 +131 +131 +129 +128 +120 +108 +91 +73 +53 +31 +18 +10 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +90 +93 +96 +99 +105 +100 +98 +101 +110 +111 +110 +108 +101 +85 +68 +54 +37 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +16 +26 +38 +52 +74 +88 +100 +109 +114 +115 +116 +117 +117 +118 +118 +117 +117 +115 +113 +111 +110 +109 +108 +108 +108 +109 +109 +110 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +121 +123 +124 +126 +128 +129 +131 +131 +131 +131 +132 +131 +130 +127 +120 +108 +83 +62 +43 +26 +14 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +88 +89 +91 +95 +98 +104 +103 +99 +98 +106 +110 +110 +108 +102 +90 +71 +62 +50 +36 +18 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +8 +15 +29 +42 +58 +73 +88 +102 +108 +111 +114 +116 +116 +116 +116 +115 +113 +110 +108 +107 +106 +105 +105 +105 +106 +106 +107 +107 +108 +109 +109 +110 +111 +112 +113 +114 +115 +116 +117 +118 +119 +120 +121 +123 +124 +125 +126 +128 +129 +130 +131 +132 +132 +132 +131 +129 +126 +115 +101 +83 +63 +44 +21 +11 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +88 +90 +93 +99 +103 +104 +101 +97 +99 +107 +109 +108 +103 +92 +74 +65 +57 +47 +31 +9 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +15 +25 +38 +59 +74 +88 +99 +107 +114 +115 +115 +115 +115 +113 +111 +109 +107 +105 +103 +102 +102 +102 +102 +103 +104 +105 +106 +108 +109 +111 +112 +113 +114 +116 +117 +118 +118 +119 +119 +120 +120 +120 +121 +122 +122 +123 +124 +125 +126 +128 +129 +130 +131 +132 +132 +133 +133 +133 +130 +124 +113 +99 +81 +53 +34 +20 +10 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +87 +88 +92 +100 +103 +104 +103 +99 +93 +101 +104 +105 +101 +93 +75 +66 +60 +54 +44 +18 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +11 +22 +35 +51 +68 +90 +102 +110 +114 +115 +115 +115 +113 +111 +110 +106 +103 +100 +99 +98 +99 +100 +101 +102 +104 +106 +108 +110 +113 +115 +118 +120 +123 +124 +126 +128 +129 +130 +130 +130 +130 +129 +129 +128 +127 +126 +126 +126 +126 +126 +126 +127 +128 +129 +130 +131 +132 +133 +133 +134 +134 +133 +131 +125 +115 +90 +68 +46 +27 +13 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +87 +88 +92 +102 +105 +105 +104 +102 +95 +90 +97 +99 +97 +93 +76 +66 +61 +57 +54 +32 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +12 +28 +46 +66 +86 +104 +113 +114 +115 +115 +115 +114 +112 +107 +102 +98 +95 +95 +96 +96 +98 +99 +101 +103 +106 +109 +114 +119 +124 +129 +133 +138 +142 +145 +148 +150 +152 +153 +153 +153 +152 +150 +149 +147 +144 +142 +138 +136 +133 +131 +129 +128 +128 +128 +129 +129 +130 +131 +132 +133 +134 +134 +135 +135 +134 +133 +125 +108 +84 +58 +33 +11 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +90 +90 +91 +95 +104 +108 +107 +106 +104 +102 +91 +86 +86 +89 +89 +83 +71 +63 +60 +58 +48 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +13 +26 +44 +74 +94 +107 +113 +114 +115 +115 +114 +112 +108 +100 +96 +94 +93 +93 +95 +96 +97 +100 +103 +110 +117 +125 +133 +141 +151 +158 +164 +169 +174 +178 +181 +183 +185 +186 +187 +187 +187 +187 +186 +185 +183 +182 +179 +176 +172 +168 +164 +159 +154 +148 +143 +139 +136 +133 +132 +132 +132 +133 +133 +134 +135 +135 +135 +135 +134 +132 +125 +110 +87 +49 +25 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +93 +96 +102 +107 +108 +107 +106 +105 +104 +96 +88 +83 +81 +82 +80 +75 +69 +64 +61 +55 +35 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +9 +20 +38 +59 +81 +101 +108 +112 +114 +114 +113 +110 +105 +100 +96 +93 +92 +92 +93 +94 +98 +102 +109 +117 +127 +139 +149 +157 +164 +171 +178 +182 +185 +187 +189 +191 +192 +193 +193 +194 +194 +194 +193 +193 +193 +192 +191 +189 +188 +186 +184 +181 +179 +176 +173 +169 +164 +160 +155 +150 +143 +140 +137 +135 +134 +134 +135 +135 +135 +135 +135 +134 +132 +127 +117 +89 +61 +36 +17 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +97 +101 +106 +109 +109 +107 +106 +105 +105 +101 +95 +87 +80 +77 +76 +75 +71 +67 +63 +59 +43 +23 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +9 +27 +47 +69 +88 +103 +112 +113 +113 +113 +111 +105 +100 +96 +92 +90 +91 +92 +94 +98 +103 +114 +123 +134 +145 +155 +167 +174 +179 +184 +188 +192 +193 +195 +195 +196 +196 +196 +196 +196 +195 +195 +194 +194 +193 +193 +192 +192 +191 +190 +189 +188 +186 +185 +183 +182 +179 +177 +174 +170 +166 +160 +155 +150 +145 +141 +138 +136 +136 +135 +135 +135 +135 +135 +134 +131 +117 +96 +71 +44 +22 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +99 +100 +104 +109 +110 +108 +106 +105 +105 +105 +104 +101 +95 +86 +76 +72 +72 +71 +69 +66 +62 +50 +30 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +13 +26 +55 +78 +96 +108 +112 +113 +112 +111 +108 +103 +95 +91 +89 +89 +89 +93 +97 +103 +112 +122 +139 +152 +163 +172 +180 +187 +190 +193 +195 +196 +196 +196 +196 +196 +196 +195 +194 +193 +192 +191 +189 +188 +187 +186 +186 +185 +185 +185 +185 +185 +185 +184 +184 +183 +183 +182 +181 +181 +179 +178 +174 +170 +165 +159 +153 +146 +142 +139 +137 +136 +136 +135 +135 +135 +135 +132 +123 +105 +80 +51 +19 +8 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +103 +107 +110 +110 +104 +103 +103 +104 +105 +105 +105 +101 +94 +81 +70 +69 +69 +68 +67 +64 +56 +36 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +14 +30 +55 +93 +104 +110 +113 +114 +112 +110 +104 +97 +90 +87 +87 +87 +89 +91 +99 +110 +124 +140 +155 +171 +180 +186 +190 +193 +195 +196 +197 +197 +197 +197 +196 +195 +193 +192 +189 +186 +184 +181 +179 +175 +173 +172 +170 +169 +169 +169 +170 +171 +173 +175 +177 +178 +179 +180 +181 +181 +181 +180 +179 +178 +178 +176 +173 +170 +162 +155 +149 +143 +139 +137 +136 +136 +135 +135 +135 +134 +129 +116 +92 +47 +23 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +103 +105 +108 +110 +110 +103 +101 +102 +103 +105 +105 +105 +103 +98 +87 +70 +68 +67 +67 +66 +65 +60 +42 +20 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +23 +47 +75 +100 +109 +112 +113 +113 +111 +104 +95 +89 +86 +84 +86 +88 +92 +100 +111 +135 +151 +165 +177 +185 +191 +194 +195 +196 +197 +197 +196 +195 +194 +192 +189 +185 +181 +177 +172 +165 +159 +154 +149 +144 +138 +134 +130 +127 +125 +123 +123 +124 +125 +127 +132 +136 +141 +146 +151 +158 +164 +169 +173 +176 +177 +177 +177 +176 +175 +174 +172 +168 +163 +156 +146 +141 +138 +136 +136 +135 +135 +135 +132 +128 +104 +68 +37 +14 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +104 +105 +107 +109 +110 +103 +101 +101 +102 +104 +104 +104 +101 +95 +86 +70 +67 +66 +66 +66 +65 +61 +44 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +27 +54 +79 +97 +107 +112 +112 +111 +108 +101 +92 +87 +85 +85 +86 +90 +99 +112 +128 +144 +164 +175 +183 +188 +193 +195 +196 +196 +196 +195 +194 +192 +189 +185 +180 +173 +167 +160 +153 +145 +135 +128 +122 +115 +110 +103 +99 +95 +92 +89 +87 +87 +87 +87 +88 +91 +94 +98 +103 +108 +117 +125 +133 +141 +149 +159 +165 +170 +173 +174 +174 +173 +172 +170 +167 +161 +154 +148 +142 +138 +136 +136 +135 +134 +133 +124 +104 +76 +45 +18 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +103 +105 +107 +109 +110 +105 +102 +101 +102 +104 +104 +102 +97 +91 +84 +71 +66 +65 +65 +65 +65 +62 +46 +24 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +24 +58 +82 +98 +107 +111 +112 +110 +105 +98 +91 +84 +83 +84 +87 +92 +106 +122 +138 +155 +170 +182 +188 +192 +195 +196 +196 +196 +195 +193 +191 +186 +182 +176 +169 +162 +151 +142 +133 +124 +115 +104 +97 +91 +85 +80 +76 +73 +71 +69 +67 +66 +66 +66 +66 +66 +68 +69 +72 +74 +78 +84 +89 +96 +103 +112 +125 +135 +145 +153 +161 +168 +171 +172 +172 +171 +168 +164 +159 +154 +147 +141 +138 +136 +135 +135 +133 +124 +107 +81 +48 +15 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +103 +104 +106 +108 +109 +106 +103 +102 +103 +104 +103 +99 +92 +85 +82 +74 +67 +64 +64 +65 +65 +62 +46 +24 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +10 +26 +51 +88 +101 +108 +111 +112 +109 +103 +96 +88 +84 +81 +84 +88 +95 +107 +130 +150 +165 +177 +187 +192 +195 +196 +196 +196 +195 +193 +190 +187 +182 +174 +166 +157 +148 +137 +123 +112 +103 +93 +85 +76 +71 +67 +63 +61 +59 +58 +57 +57 +57 +57 +57 +57 +57 +57 +57 +58 +58 +59 +60 +62 +64 +67 +72 +78 +88 +98 +110 +121 +134 +150 +158 +164 +168 +170 +171 +170 +168 +165 +159 +150 +144 +140 +137 +136 +135 +133 +127 +112 +85 +39 +18 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +103 +105 +106 +107 +107 +105 +104 +104 +105 +104 +93 +85 +80 +80 +78 +69 +65 +64 +65 +65 +62 +45 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +25 +52 +86 +106 +109 +110 +111 +111 +103 +92 +85 +81 +80 +82 +87 +98 +114 +135 +161 +175 +185 +191 +195 +197 +197 +197 +196 +194 +191 +187 +182 +176 +169 +156 +144 +132 +120 +107 +91 +81 +73 +66 +61 +57 +56 +55 +55 +54 +54 +54 +54 +54 +55 +55 +55 +55 +55 +55 +56 +56 +56 +56 +57 +57 +57 +58 +59 +60 +62 +66 +72 +80 +92 +112 +129 +143 +156 +165 +170 +171 +171 +170 +169 +163 +155 +147 +141 +137 +136 +135 +134 +130 +122 +79 +42 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +100 +101 +102 +103 +104 +107 +106 +106 +107 +108 +97 +85 +80 +80 +81 +80 +73 +67 +64 +65 +65 +61 +42 +19 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +33 +64 +92 +106 +109 +110 +110 +107 +101 +87 +82 +79 +79 +82 +93 +110 +131 +153 +171 +186 +191 +195 +197 +197 +197 +195 +193 +190 +187 +180 +172 +162 +151 +138 +119 +104 +91 +80 +70 +61 +58 +55 +54 +53 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +54 +55 +55 +55 +55 +55 +55 +56 +56 +56 +56 +56 +57 +57 +57 +58 +59 +60 +62 +68 +76 +89 +105 +123 +145 +159 +166 +170 +170 +169 +167 +164 +157 +148 +140 +137 +136 +135 +133 +124 +94 +58 +26 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +99 +99 +99 +100 +102 +103 +105 +106 +107 +109 +91 +82 +80 +81 +82 +80 +72 +67 +65 +65 +65 +57 +36 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +31 +64 +88 +103 +108 +109 +109 +105 +98 +89 +81 +79 +79 +84 +93 +116 +138 +157 +174 +185 +194 +196 +197 +197 +196 +193 +191 +187 +182 +176 +164 +151 +138 +123 +108 +90 +78 +69 +63 +58 +55 +54 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +54 +54 +55 +55 +55 +55 +55 +55 +56 +56 +56 +56 +57 +57 +58 +58 +59 +61 +64 +69 +76 +86 +106 +124 +139 +153 +164 +168 +168 +168 +165 +160 +150 +144 +139 +136 +135 +131 +119 +94 +62 +26 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +98 +97 +97 +99 +100 +103 +105 +107 +109 +88 +81 +80 +81 +81 +78 +70 +66 +65 +65 +64 +52 +30 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +21 +61 +87 +101 +107 +109 +109 +105 +98 +89 +81 +77 +79 +85 +96 +113 +142 +162 +177 +187 +194 +197 +197 +196 +195 +193 +189 +184 +178 +169 +159 +141 +125 +110 +96 +82 +69 +62 +58 +55 +53 +52 +52 +52 +52 +52 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +55 +55 +55 +56 +56 +56 +57 +57 +57 +58 +59 +60 +62 +66 +78 +90 +105 +122 +139 +156 +164 +168 +168 +166 +160 +154 +147 +142 +137 +135 +131 +118 +95 +61 +19 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +97 +96 +95 +96 +98 +100 +103 +106 +109 +90 +82 +81 +81 +78 +74 +68 +66 +65 +66 +63 +44 +22 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +19 +45 +88 +101 +107 +108 +108 +106 +98 +88 +81 +77 +78 +84 +97 +115 +138 +167 +181 +190 +195 +198 +198 +196 +194 +191 +188 +182 +174 +164 +151 +137 +114 +98 +84 +73 +64 +57 +54 +53 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +53 +53 +53 +53 +53 +53 +52 +52 +52 +52 +52 +52 +52 +53 +53 +53 +53 +53 +54 +54 +54 +55 +55 +56 +56 +56 +57 +57 +58 +58 +59 +62 +66 +75 +89 +106 +132 +148 +159 +165 +167 +166 +163 +157 +150 +143 +137 +135 +131 +120 +98 +47 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +97 +96 +95 +95 +96 +96 +99 +104 +109 +98 +83 +80 +80 +73 +70 +67 +66 +66 +66 +60 +33 +14 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +39 +75 +103 +106 +108 +108 +107 +99 +87 +80 +76 +75 +82 +96 +117 +141 +165 +185 +192 +196 +198 +198 +196 +193 +190 +187 +182 +172 +160 +144 +127 +109 +87 +74 +65 +58 +54 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +52 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +53 +53 +54 +54 +55 +55 +56 +57 +57 +57 +58 +58 +59 +61 +65 +71 +94 +116 +136 +153 +164 +167 +168 +166 +162 +153 +141 +138 +135 +132 +126 +88 +46 +18 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +97 +97 +96 +95 +95 +95 +95 +96 +100 +107 +107 +79 +76 +80 +73 +70 +68 +67 +66 +64 +40 +17 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +14 +41 +73 +100 +107 +108 +107 +105 +99 +85 +78 +75 +76 +80 +101 +126 +150 +172 +188 +196 +198 +199 +198 +195 +191 +188 +183 +176 +167 +147 +129 +110 +92 +77 +63 +58 +54 +52 +52 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +52 +52 +52 +52 +52 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +53 +53 +54 +55 +56 +56 +57 +58 +58 +59 +60 +64 +72 +87 +108 +132 +158 +165 +167 +166 +164 +157 +148 +141 +137 +134 +125 +96 +58 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +97 +97 +96 +95 +95 +95 +95 +96 +98 +102 +108 +78 +75 +80 +75 +71 +69 +67 +63 +54 +23 +9 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +32 +64 +91 +104 +107 +107 +105 +99 +90 +77 +75 +76 +82 +94 +125 +150 +171 +186 +194 +198 +199 +197 +195 +191 +186 +181 +173 +162 +147 +122 +104 +87 +74 +63 +56 +54 +52 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +52 +52 +52 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +52 +52 +53 +54 +54 +56 +56 +57 +58 +59 +60 +63 +70 +80 +96 +125 +144 +157 +164 +165 +164 +159 +151 +143 +138 +132 +120 +93 +58 +21 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +97 +97 +96 +96 +96 +96 +95 +95 +96 +99 +108 +80 +75 +78 +76 +72 +69 +64 +55 +38 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +21 +55 +83 +101 +106 +107 +105 +99 +91 +81 +74 +75 +81 +94 +114 +149 +171 +185 +194 +198 +199 +197 +194 +191 +187 +180 +171 +158 +143 +124 +99 +83 +71 +62 +56 +53 +52 +51 +51 +51 +51 +51 +51 +51 +51 +51 +52 +52 +52 +52 +52 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +51 +51 +51 +52 +52 +54 +54 +55 +56 +57 +58 +60 +62 +66 +73 +92 +113 +132 +149 +160 +166 +164 +159 +153 +145 +137 +132 +117 +92 +54 +14 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +97 +96 +96 +96 +97 +96 +95 +95 +96 +107 +87 +77 +74 +77 +72 +67 +58 +43 +22 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +41 +76 +96 +105 +107 +105 +100 +92 +83 +74 +73 +78 +91 +111 +138 +171 +186 +194 +198 +199 +198 +194 +190 +186 +181 +171 +157 +140 +121 +101 +78 +67 +59 +55 +52 +51 +51 +51 +50 +50 +50 +51 +51 +51 +51 +52 +52 +52 +52 +52 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +49 +49 +49 +50 +50 +50 +50 +51 +51 +52 +52 +53 +54 +56 +57 +58 +59 +60 +62 +69 +83 +102 +123 +145 +161 +164 +164 +161 +154 +144 +138 +132 +119 +92 +38 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +96 +96 +96 +96 +97 +98 +97 +95 +95 +103 +101 +83 +69 +75 +69 +61 +47 +29 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +17 +65 +91 +103 +106 +106 +102 +95 +84 +76 +72 +74 +86 +107 +133 +161 +188 +195 +198 +199 +198 +195 +190 +186 +181 +174 +158 +139 +118 +98 +79 +63 +57 +54 +52 +51 +51 +50 +50 +50 +50 +50 +51 +51 +51 +52 +52 +52 +52 +52 +51 +51 +50 +50 +50 +50 +50 +49 +49 +49 +49 +49 +49 +48 +48 +48 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +46 +47 +47 +47 +48 +49 +49 +50 +50 +50 +51 +51 +51 +52 +53 +55 +56 +57 +58 +59 +61 +65 +75 +91 +114 +147 +159 +164 +164 +163 +155 +145 +139 +133 +125 +79 +36 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +96 +96 +96 +96 +97 +99 +99 +98 +95 +96 +103 +90 +72 +66 +65 +53 +36 +19 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +16 +42 +92 +101 +105 +106 +103 +94 +83 +75 +71 +72 +85 +108 +135 +162 +185 +198 +199 +198 +197 +195 +189 +184 +178 +170 +157 +132 +110 +90 +74 +62 +54 +53 +52 +51 +51 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +52 +51 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +45 +45 +45 +45 +45 +45 +45 +46 +46 +47 +48 +49 +50 +50 +51 +51 +51 +52 +53 +54 +56 +57 +59 +60 +62 +66 +74 +101 +126 +146 +160 +165 +164 +159 +150 +142 +136 +124 +88 +48 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +96 +96 +96 +95 +95 +97 +99 +101 +101 +97 +96 +102 +98 +86 +65 +57 +49 +34 +18 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +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 +30 +64 +99 +104 +105 +103 +99 +87 +77 +72 +72 +76 +101 +129 +156 +179 +194 +199 +199 +197 +195 +191 +184 +178 +169 +157 +139 +111 +91 +75 +63 +56 +53 +52 +51 +51 +50 +50 +50 +50 +50 +51 +52 +52 +52 +52 +52 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +47 +47 +47 +47 +47 +47 +47 +47 +46 +46 +46 +46 +46 +45 +45 +45 +45 +45 +45 +45 +45 +46 +46 +48 +49 +50 +50 +51 +51 +52 +52 +53 +54 +57 +58 +60 +62 +65 +77 +95 +117 +138 +156 +164 +163 +159 +152 +143 +133 +117 +85 +47 +13 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +95 +95 +95 +95 +97 +99 +101 +103 +101 +96 +99 +101 +94 +72 +50 +41 +29 +16 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +19 +45 +82 +103 +105 +104 +100 +94 +80 +73 +72 +75 +86 +120 +149 +173 +190 +199 +199 +198 +195 +191 +186 +179 +170 +158 +141 +120 +91 +75 +64 +56 +53 +52 +51 +50 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +47 +47 +47 +47 +46 +46 +45 +45 +44 +44 +44 +44 +45 +45 +46 +47 +49 +50 +51 +51 +51 +52 +53 +54 +56 +58 +59 +61 +66 +75 +91 +111 +134 +156 +162 +162 +159 +152 +141 +132 +113 +83 +42 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +95 +95 +95 +95 +97 +99 +101 +104 +104 +98 +98 +100 +98 +84 +48 +34 +22 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +30 +60 +95 +105 +105 +102 +96 +88 +74 +71 +73 +82 +100 +139 +167 +186 +197 +200 +198 +196 +192 +187 +181 +172 +160 +143 +123 +100 +75 +63 +56 +53 +52 +51 +50 +50 +50 +49 +50 +50 +51 +52 +52 +53 +53 +52 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +47 +47 +46 +45 +45 +44 +44 +44 +44 +44 +45 +46 +48 +49 +50 +51 +51 +51 +52 +53 +55 +57 +59 +61 +64 +72 +85 +105 +137 +153 +161 +162 +160 +149 +141 +132 +114 +80 +25 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +95 +95 +94 +95 +95 +97 +99 +102 +104 +106 +103 +98 +99 +101 +98 +57 +33 +17 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +43 +76 +101 +106 +103 +98 +91 +81 +70 +70 +77 +92 +117 +159 +183 +195 +200 +200 +196 +193 +188 +183 +176 +164 +147 +126 +104 +82 +63 +56 +53 +52 +51 +50 +50 +49 +49 +49 +50 +51 +52 +52 +53 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +51 +51 +50 +50 +49 +47 +46 +45 +44 +44 +44 +44 +44 +44 +45 +47 +48 +50 +51 +51 +51 +52 +53 +54 +56 +59 +61 +63 +68 +77 +106 +134 +152 +162 +163 +160 +150 +140 +131 +119 +59 +22 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +94 +94 +95 +95 +99 +102 +104 +105 +107 +107 +102 +100 +100 +103 +89 +47 +20 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +27 +61 +92 +104 +105 +100 +93 +83 +73 +68 +74 +88 +111 +142 +182 +194 +200 +200 +198 +193 +188 +182 +175 +167 +147 +125 +102 +82 +65 +55 +53 +52 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +53 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +51 +51 +51 +52 +52 +52 +51 +50 +48 +46 +44 +44 +43 +43 +43 +44 +45 +47 +48 +50 +51 +51 +52 +52 +52 +55 +58 +60 +62 +64 +73 +93 +119 +143 +160 +163 +161 +153 +143 +133 +115 +66 +28 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +94 +94 +95 +96 +101 +103 +105 +107 +107 +108 +105 +102 +100 +102 +97 +67 +34 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +39 +72 +97 +104 +104 +96 +87 +78 +70 +69 +79 +99 +127 +160 +191 +198 +200 +198 +195 +190 +183 +177 +168 +157 +131 +108 +87 +70 +58 +53 +52 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +53 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +47 +47 +46 +46 +46 +46 +46 +47 +47 +48 +48 +49 +50 +51 +51 +52 +52 +53 +53 +52 +52 +50 +48 +46 +45 +44 +43 +43 +44 +44 +46 +47 +50 +51 +51 +52 +52 +53 +54 +57 +59 +62 +66 +75 +91 +114 +140 +159 +161 +159 +153 +142 +127 +101 +61 +23 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +94 +94 +95 +97 +102 +104 +106 +107 +108 +109 +108 +104 +101 +102 +101 +84 +51 +18 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +16 +51 +81 +100 +103 +102 +92 +82 +74 +69 +72 +87 +113 +144 +176 +198 +200 +199 +196 +192 +186 +179 +171 +160 +145 +115 +92 +74 +62 +55 +52 +51 +50 +50 +49 +49 +49 +50 +50 +52 +53 +53 +53 +53 +53 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +47 +46 +46 +45 +44 +44 +44 +44 +44 +45 +45 +46 +47 +48 +48 +50 +50 +51 +52 +52 +53 +53 +54 +53 +53 +51 +50 +48 +46 +44 +43 +43 +43 +44 +45 +47 +49 +50 +51 +52 +52 +53 +54 +56 +59 +62 +66 +74 +89 +112 +145 +156 +160 +159 +152 +136 +122 +92 +53 +15 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +94 +94 +96 +98 +103 +105 +107 +107 +108 +109 +109 +106 +103 +101 +102 +96 +68 +32 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +25 +63 +88 +102 +103 +99 +88 +78 +72 +69 +75 +97 +127 +160 +188 +202 +200 +198 +194 +189 +181 +174 +164 +150 +131 +99 +79 +65 +56 +53 +51 +51 +50 +49 +49 +49 +49 +50 +51 +53 +53 +54 +53 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +46 +45 +44 +43 +43 +43 +43 +43 +43 +44 +44 +45 +46 +46 +47 +48 +49 +50 +51 +52 +52 +53 +54 +54 +54 +54 +54 +53 +51 +49 +47 +44 +44 +43 +43 +44 +45 +47 +49 +50 +51 +52 +52 +52 +54 +56 +60 +62 +66 +72 +85 +120 +143 +156 +161 +160 +146 +135 +116 +86 +38 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +93 +94 +96 +100 +105 +106 +107 +108 +108 +109 +109 +108 +106 +101 +102 +101 +83 +52 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +33 +74 +95 +102 +103 +95 +83 +75 +70 +69 +80 +109 +143 +174 +197 +203 +199 +195 +191 +185 +177 +168 +155 +138 +116 +84 +68 +58 +54 +52 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +54 +54 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +49 +48 +47 +45 +43 +42 +42 +42 +42 +42 +43 +43 +43 +44 +44 +45 +46 +47 +47 +48 +49 +50 +51 +52 +52 +53 +54 +54 +54 +55 +55 +55 +54 +53 +51 +47 +45 +44 +43 +43 +43 +44 +46 +48 +50 +52 +52 +52 +52 +53 +56 +60 +62 +65 +69 +88 +119 +143 +158 +162 +158 +144 +132 +112 +77 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +93 +95 +97 +102 +106 +107 +107 +107 +108 +108 +109 +109 +108 +103 +102 +102 +96 +77 +35 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +49 +83 +98 +101 +101 +90 +79 +73 +70 +71 +91 +128 +162 +188 +201 +202 +196 +192 +187 +180 +170 +158 +142 +121 +96 +69 +59 +54 +52 +51 +50 +49 +48 +48 +48 +49 +51 +52 +53 +54 +54 +53 +53 +52 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +49 +47 +44 +43 +42 +41 +42 +42 +42 +43 +43 +44 +45 +46 +47 +47 +48 +49 +49 +49 +50 +50 +51 +51 +52 +52 +53 +54 +54 +54 +55 +55 +55 +55 +55 +54 +52 +50 +47 +45 +43 +43 +43 +44 +45 +47 +50 +51 +52 +52 +52 +53 +55 +58 +62 +64 +69 +83 +109 +137 +157 +161 +157 +145 +131 +118 +57 +20 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +96 +99 +103 +107 +107 +107 +107 +107 +107 +108 +109 +108 +106 +102 +102 +100 +86 +54 +10 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +13 +60 +88 +99 +101 +100 +85 +76 +71 +70 +73 +102 +142 +174 +195 +202 +201 +194 +189 +183 +175 +164 +150 +130 +107 +83 +62 +56 +53 +52 +51 +49 +48 +48 +48 +49 +50 +52 +53 +54 +54 +54 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +49 +48 +46 +43 +42 +41 +41 +41 +42 +43 +44 +45 +46 +47 +48 +48 +49 +49 +50 +50 +50 +50 +50 +51 +51 +52 +52 +53 +53 +54 +54 +55 +55 +55 +55 +55 +55 +55 +54 +52 +50 +48 +46 +44 +43 +43 +44 +45 +48 +50 +51 +52 +52 +53 +54 +55 +58 +62 +66 +72 +86 +108 +138 +159 +159 +154 +143 +127 +94 +46 +16 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +96 +100 +104 +107 +107 +107 +107 +106 +106 +107 +108 +109 +108 +103 +103 +102 +94 +73 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +19 +69 +91 +100 +100 +98 +82 +74 +70 +71 +77 +115 +155 +183 +199 +202 +199 +191 +186 +180 +171 +157 +140 +118 +94 +73 +57 +54 +52 +51 +50 +49 +48 +48 +48 +49 +51 +52 +53 +54 +54 +54 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +49 +48 +46 +43 +41 +41 +41 +41 +42 +44 +45 +46 +47 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +52 +52 +53 +54 +54 +55 +55 +55 +55 +55 +55 +55 +55 +54 +52 +50 +48 +45 +44 +43 +43 +44 +45 +48 +50 +51 +52 +53 +53 +54 +56 +58 +63 +66 +73 +87 +111 +146 +157 +158 +152 +140 +116 +75 +37 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +97 +101 +105 +107 +107 +107 +107 +106 +105 +106 +107 +109 +109 +104 +103 +102 +99 +88 +29 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +25 +77 +94 +100 +99 +95 +78 +72 +69 +72 +82 +128 +167 +190 +201 +202 +196 +188 +182 +176 +166 +150 +129 +106 +83 +64 +54 +53 +51 +50 +49 +48 +48 +48 +49 +50 +51 +53 +53 +54 +54 +53 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +50 +50 +50 +50 +48 +46 +43 +41 +40 +41 +42 +43 +44 +46 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +52 +53 +54 +54 +55 +55 +55 +55 +55 +55 +55 +55 +54 +53 +51 +47 +45 +44 +43 +43 +44 +46 +48 +50 +52 +53 +53 +53 +54 +56 +60 +63 +67 +73 +85 +124 +147 +157 +158 +152 +130 +103 +62 +24 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +98 +102 +106 +107 +107 +107 +106 +105 +104 +105 +106 +108 +109 +105 +103 +103 +101 +97 +46 +16 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +11 +32 +84 +96 +100 +98 +93 +75 +70 +68 +73 +89 +141 +177 +196 +202 +201 +193 +186 +179 +172 +162 +141 +118 +94 +73 +59 +53 +52 +51 +50 +48 +48 +48 +48 +49 +50 +52 +53 +53 +54 +54 +53 +52 +51 +50 +50 +50 +49 +49 +49 +49 +49 +50 +50 +50 +50 +49 +46 +43 +41 +40 +40 +41 +43 +45 +47 +48 +49 +49 +49 +50 +50 +50 +50 +50 +50 +51 +51 +51 +50 +50 +50 +50 +49 +49 +49 +50 +51 +53 +53 +54 +55 +55 +55 +55 +55 +55 +55 +55 +54 +53 +50 +47 +45 +44 +43 +43 +44 +46 +48 +50 +52 +53 +53 +54 +54 +57 +61 +64 +67 +71 +93 +127 +149 +160 +160 +142 +126 +90 +47 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +98 +103 +107 +107 +107 +106 +106 +105 +103 +104 +105 +106 +109 +107 +104 +103 +102 +101 +65 +27 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +15 +42 +90 +97 +100 +97 +88 +72 +69 +69 +78 +100 +157 +186 +199 +202 +201 +189 +182 +175 +166 +154 +128 +103 +81 +64 +55 +52 +51 +50 +49 +48 +48 +48 +49 +49 +51 +53 +53 +53 +53 +53 +53 +51 +50 +50 +50 +50 +50 +49 +49 +50 +50 +50 +50 +50 +50 +46 +42 +40 +40 +40 +42 +44 +46 +48 +48 +49 +49 +49 +50 +50 +51 +52 +53 +54 +55 +56 +56 +55 +54 +53 +51 +50 +49 +49 +48 +47 +47 +48 +50 +51 +53 +54 +54 +55 +55 +55 +55 +55 +55 +54 +52 +50 +48 +46 +44 +43 +44 +44 +46 +48 +51 +52 +53 +53 +54 +55 +58 +61 +64 +67 +73 +92 +122 +149 +161 +159 +140 +120 +88 +35 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +99 +103 +107 +107 +107 +106 +105 +104 +103 +103 +104 +105 +108 +107 +104 +103 +102 +102 +78 +34 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +19 +49 +93 +98 +99 +95 +85 +70 +68 +70 +82 +109 +167 +190 +200 +201 +199 +186 +179 +171 +161 +147 +118 +93 +73 +59 +54 +52 +51 +50 +48 +48 +48 +48 +49 +50 +51 +53 +53 +53 +53 +53 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +48 +42 +40 +40 +40 +41 +44 +46 +47 +48 +48 +49 +49 +50 +51 +53 +58 +62 +67 +71 +74 +77 +77 +76 +74 +71 +65 +60 +56 +52 +49 +47 +47 +47 +47 +48 +50 +51 +53 +54 +54 +55 +55 +55 +55 +54 +53 +52 +50 +47 +45 +44 +44 +44 +45 +46 +49 +51 +52 +53 +54 +55 +57 +59 +62 +65 +69 +78 +99 +126 +154 +161 +153 +136 +108 +68 +15 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +99 +103 +107 +107 +107 +106 +105 +103 +103 +103 +103 +105 +108 +108 +104 +103 +103 +102 +87 +42 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +23 +55 +94 +98 +98 +94 +83 +69 +68 +72 +87 +118 +175 +194 +201 +201 +197 +183 +176 +168 +156 +139 +108 +85 +67 +56 +53 +51 +50 +49 +48 +48 +48 +48 +49 +50 +51 +53 +53 +53 +53 +53 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +45 +40 +39 +39 +40 +42 +46 +47 +48 +48 +48 +49 +51 +53 +58 +64 +73 +80 +86 +91 +96 +100 +101 +101 +100 +97 +91 +84 +76 +69 +61 +54 +50 +48 +46 +47 +48 +49 +51 +52 +53 +54 +54 +54 +54 +54 +54 +53 +51 +49 +47 +45 +44 +44 +44 +45 +48 +50 +52 +53 +53 +54 +56 +58 +60 +63 +67 +71 +82 +103 +134 +160 +159 +147 +127 +99 +34 +12 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +96 +99 +104 +107 +107 +107 +106 +104 +103 +102 +102 +103 +104 +108 +108 +104 +103 +103 +102 +93 +50 +20 +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 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +2 +3 +5 +6 +7 +7 +6 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +26 +61 +95 +98 +98 +93 +81 +69 +68 +73 +91 +126 +183 +196 +201 +200 +195 +181 +173 +164 +151 +131 +99 +77 +62 +55 +53 +51 +50 +49 +48 +48 +48 +49 +49 +50 +51 +52 +53 +53 +53 +53 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +49 +47 +42 +39 +39 +40 +41 +44 +47 +47 +48 +48 +48 +50 +54 +60 +68 +77 +88 +96 +102 +108 +112 +117 +119 +121 +121 +121 +117 +111 +103 +94 +83 +69 +61 +54 +50 +47 +47 +48 +49 +50 +52 +53 +53 +54 +54 +54 +54 +53 +52 +50 +48 +46 +44 +44 +44 +44 +46 +49 +51 +52 +53 +54 +55 +57 +59 +62 +66 +68 +72 +84 +108 +150 +159 +155 +142 +122 +61 +25 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +96 +99 +104 +107 +107 +107 +106 +104 +103 +102 +102 +102 +104 +108 +108 +105 +103 +103 +103 +97 +58 +25 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +4 +5 +6 +6 +6 +6 +5 +5 +4 +4 +4 +6 +8 +14 +18 +21 +21 +19 +14 +9 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +10 +29 +67 +96 +98 +97 +91 +79 +68 +68 +75 +95 +134 +189 +198 +202 +199 +192 +179 +170 +160 +145 +123 +90 +70 +59 +54 +52 +51 +49 +48 +48 +48 +48 +49 +50 +50 +51 +52 +52 +53 +53 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +48 +45 +40 +39 +39 +40 +43 +46 +47 +47 +47 +48 +49 +54 +62 +71 +82 +90 +98 +103 +108 +112 +116 +120 +123 +125 +127 +129 +131 +131 +129 +124 +114 +96 +82 +69 +58 +50 +47 +47 +47 +48 +50 +52 +52 +53 +53 +54 +54 +53 +53 +51 +50 +47 +45 +44 +44 +44 +45 +47 +50 +52 +53 +54 +54 +56 +58 +61 +65 +68 +70 +74 +82 +127 +153 +161 +154 +134 +93 +44 +15 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +96 +99 +103 +107 +107 +107 +106 +104 +102 +102 +102 +102 +104 +108 +108 +105 +103 +103 +103 +100 +65 +30 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +9 +14 +23 +30 +36 +41 +44 +45 +44 +41 +37 +33 +28 +27 +28 +32 +41 +57 +69 +76 +79 +79 +71 +57 +41 +25 +12 +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 +3 +12 +34 +74 +97 +98 +96 +90 +77 +68 +68 +76 +99 +143 +193 +200 +202 +198 +189 +176 +167 +154 +137 +113 +80 +64 +56 +53 +52 +50 +49 +48 +48 +48 +48 +49 +50 +51 +51 +52 +52 +52 +52 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +49 +46 +42 +39 +38 +39 +42 +45 +46 +47 +47 +47 +49 +53 +63 +73 +81 +87 +92 +99 +103 +107 +109 +112 +115 +118 +121 +125 +128 +132 +133 +134 +134 +134 +130 +119 +104 +88 +71 +56 +50 +48 +47 +48 +50 +51 +52 +53 +53 +53 +53 +53 +52 +51 +49 +47 +45 +44 +43 +44 +46 +48 +50 +53 +54 +54 +55 +57 +59 +65 +67 +69 +70 +73 +90 +129 +152 +160 +156 +125 +77 +37 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +99 +103 +107 +107 +107 +106 +105 +103 +102 +102 +103 +105 +108 +108 +104 +102 +102 +103 +101 +69 +33 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +10 +20 +32 +44 +55 +65 +70 +74 +77 +79 +80 +79 +78 +76 +73 +69 +65 +64 +67 +73 +85 +91 +95 +97 +98 +96 +90 +82 +70 +53 +25 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +14 +38 +78 +97 +98 +96 +89 +76 +67 +68 +77 +102 +149 +195 +200 +202 +197 +187 +174 +164 +150 +131 +106 +74 +61 +54 +52 +52 +50 +48 +48 +48 +48 +48 +49 +50 +50 +51 +51 +52 +52 +52 +52 +51 +50 +50 +50 +50 +50 +50 +50 +50 +51 +50 +48 +44 +40 +38 +38 +40 +43 +46 +46 +46 +47 +48 +51 +57 +68 +75 +81 +87 +90 +92 +91 +89 +87 +86 +86 +89 +93 +98 +105 +116 +123 +129 +133 +135 +135 +132 +126 +116 +100 +76 +63 +54 +49 +47 +48 +50 +51 +52 +52 +53 +53 +53 +52 +52 +50 +48 +46 +45 +44 +44 +45 +47 +49 +52 +54 +54 +55 +56 +58 +63 +67 +69 +70 +72 +79 +105 +135 +158 +161 +138 +104 +61 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +95 +98 +103 +107 +107 +107 +107 +105 +103 +103 +102 +104 +106 +109 +108 +103 +102 +102 +104 +102 +72 +35 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +12 +23 +41 +53 +64 +73 +80 +86 +88 +90 +92 +93 +94 +94 +93 +93 +92 +90 +88 +88 +89 +92 +98 +101 +103 +105 +105 +105 +104 +101 +95 +85 +64 +43 +23 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +16 +42 +81 +97 +98 +96 +88 +75 +67 +68 +78 +104 +152 +196 +201 +202 +197 +185 +172 +162 +146 +125 +99 +69 +59 +54 +52 +51 +49 +48 +48 +48 +48 +49 +49 +50 +50 +51 +51 +51 +52 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +51 +51 +50 +47 +43 +39 +38 +38 +41 +44 +46 +46 +46 +46 +49 +53 +60 +70 +75 +79 +81 +80 +75 +70 +67 +64 +62 +62 +64 +66 +70 +75 +86 +96 +106 +117 +127 +135 +137 +136 +132 +124 +103 +84 +68 +57 +50 +48 +49 +50 +51 +52 +53 +53 +53 +52 +52 +50 +49 +47 +45 +44 +44 +44 +46 +48 +51 +53 +54 +54 +55 +57 +61 +67 +70 +71 +72 +74 +87 +115 +145 +162 +152 +125 +85 +42 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +98 +102 +107 +107 +107 +107 +106 +104 +103 +103 +105 +107 +109 +108 +103 +101 +102 +104 +103 +74 +37 +7 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +11 +22 +36 +53 +74 +83 +88 +90 +91 +91 +91 +91 +92 +93 +94 +95 +96 +96 +97 +99 +99 +99 +100 +101 +103 +104 +105 +105 +106 +106 +106 +105 +105 +104 +97 +79 +54 +29 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +19 +45 +84 +98 +98 +95 +88 +74 +67 +68 +79 +106 +155 +197 +202 +202 +196 +183 +170 +159 +142 +120 +93 +65 +57 +53 +52 +51 +49 +48 +48 +48 +48 +49 +49 +50 +50 +51 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +51 +51 +50 +46 +41 +38 +37 +39 +42 +45 +46 +46 +46 +47 +49 +55 +61 +69 +73 +73 +71 +65 +56 +52 +49 +47 +47 +47 +47 +48 +49 +51 +57 +65 +76 +90 +105 +123 +131 +136 +139 +139 +128 +110 +90 +71 +57 +49 +49 +49 +50 +51 +52 +52 +53 +52 +52 +51 +49 +48 +46 +45 +44 +44 +45 +47 +50 +53 +54 +54 +55 +56 +60 +66 +70 +73 +73 +73 +76 +95 +125 +157 +162 +142 +107 +66 +23 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +95 +97 +101 +106 +107 +107 +108 +107 +105 +104 +105 +107 +109 +109 +106 +101 +101 +102 +105 +103 +75 +38 +8 +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 +2 +13 +34 +57 +77 +87 +90 +91 +92 +91 +90 +86 +84 +84 +83 +84 +87 +90 +93 +95 +98 +100 +101 +102 +103 +103 +104 +105 +105 +105 +105 +105 +105 +106 +106 +106 +105 +103 +93 +69 +28 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +21 +48 +85 +98 +98 +95 +88 +74 +67 +67 +79 +107 +156 +198 +202 +201 +195 +182 +168 +157 +138 +115 +88 +62 +56 +53 +52 +51 +49 +48 +48 +48 +48 +49 +49 +50 +50 +50 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +51 +51 +51 +49 +44 +40 +38 +37 +39 +43 +45 +46 +46 +46 +47 +50 +55 +61 +67 +67 +64 +57 +48 +45 +44 +44 +43 +43 +44 +44 +44 +44 +45 +45 +47 +50 +55 +66 +92 +114 +129 +139 +142 +142 +135 +118 +95 +71 +53 +50 +49 +49 +50 +52 +52 +52 +52 +52 +51 +50 +49 +47 +45 +44 +44 +45 +46 +49 +53 +54 +54 +55 +56 +59 +64 +70 +74 +76 +74 +74 +80 +101 +144 +164 +152 +128 +92 +41 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +95 +97 +100 +106 +107 +107 +108 +108 +108 +107 +108 +108 +109 +109 +103 +100 +100 +102 +105 +102 +73 +37 +9 +6 +7 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +13 +31 +68 +82 +88 +90 +91 +88 +82 +75 +70 +65 +62 +61 +61 +62 +64 +68 +73 +79 +86 +93 +100 +102 +103 +104 +104 +104 +103 +103 +103 +102 +102 +102 +102 +103 +104 +105 +105 +104 +100 +90 +30 +10 +2 +1 +1 +3 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +23 +51 +85 +98 +98 +95 +88 +75 +67 +67 +79 +107 +156 +198 +202 +201 +195 +181 +165 +153 +134 +109 +83 +59 +55 +52 +51 +50 +48 +48 +48 +48 +48 +49 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +51 +51 +51 +51 +49 +43 +39 +37 +37 +40 +44 +45 +45 +45 +45 +46 +50 +54 +59 +59 +57 +51 +46 +44 +43 +43 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +45 +46 +51 +64 +85 +110 +133 +143 +145 +142 +131 +108 +73 +59 +52 +49 +50 +51 +52 +52 +52 +52 +52 +51 +49 +48 +46 +45 +44 +44 +45 +47 +51 +53 +54 +55 +55 +58 +62 +69 +75 +80 +79 +76 +76 +83 +103 +158 +163 +151 +121 +75 +20 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +92 +94 +96 +99 +106 +107 +107 +108 +108 +108 +109 +109 +109 +109 +108 +101 +100 +100 +102 +105 +101 +69 +36 +12 +9 +9 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +11 +29 +50 +69 +82 +87 +88 +86 +82 +74 +69 +65 +62 +60 +58 +57 +58 +59 +61 +65 +70 +77 +85 +93 +100 +101 +102 +102 +102 +103 +102 +102 +102 +102 +101 +100 +99 +99 +99 +101 +102 +103 +103 +100 +73 +34 +12 +2 +1 +2 +7 +9 +8 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +24 +52 +85 +98 +98 +95 +88 +75 +67 +68 +78 +106 +156 +198 +202 +201 +194 +180 +164 +151 +131 +105 +79 +58 +54 +52 +51 +50 +48 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +42 +38 +37 +37 +41 +44 +45 +45 +45 +45 +46 +49 +53 +55 +55 +51 +47 +44 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +44 +46 +50 +59 +74 +97 +130 +141 +145 +142 +133 +101 +76 +61 +52 +50 +50 +51 +52 +52 +52 +52 +51 +50 +49 +47 +45 +44 +44 +45 +46 +51 +53 +54 +55 +55 +57 +61 +67 +73 +81 +83 +80 +77 +78 +85 +140 +159 +156 +136 +103 +38 +14 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +91 +94 +96 +98 +105 +107 +107 +107 +108 +109 +109 +109 +109 +108 +106 +100 +99 +100 +102 +104 +99 +65 +35 +15 +13 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +20 +39 +57 +73 +84 +86 +85 +82 +78 +73 +66 +63 +60 +58 +57 +56 +56 +57 +58 +60 +64 +70 +77 +85 +94 +100 +101 +101 +102 +102 +102 +102 +101 +100 +98 +97 +96 +95 +95 +95 +96 +97 +99 +101 +103 +95 +66 +36 +11 +3 +3 +8 +15 +20 +19 +12 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +5 +24 +52 +85 +98 +98 +95 +88 +76 +67 +68 +77 +103 +154 +198 +202 +201 +194 +180 +164 +150 +128 +103 +76 +57 +54 +52 +51 +50 +48 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +41 +38 +37 +37 +41 +44 +45 +45 +45 +45 +45 +48 +50 +51 +51 +47 +45 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +44 +47 +54 +67 +101 +125 +139 +146 +145 +126 +99 +76 +59 +52 +50 +51 +51 +52 +52 +52 +52 +51 +49 +48 +45 +45 +44 +45 +46 +50 +53 +54 +55 +55 +56 +60 +65 +72 +81 +86 +84 +81 +78 +77 +113 +148 +159 +150 +127 +61 +26 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +93 +95 +97 +104 +106 +106 +107 +108 +109 +109 +109 +108 +106 +103 +99 +98 +100 +103 +104 +96 +60 +33 +18 +17 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +19 +47 +69 +79 +82 +83 +82 +79 +74 +70 +67 +63 +61 +59 +58 +57 +56 +56 +56 +58 +60 +65 +71 +78 +87 +95 +101 +101 +102 +102 +103 +102 +100 +97 +95 +93 +91 +90 +90 +91 +92 +93 +93 +95 +97 +101 +102 +93 +66 +34 +11 +5 +7 +17 +29 +36 +29 +17 +8 +3 +1 +1 +1 +1 +1 +1 +1 +5 +23 +52 +85 +98 +98 +95 +89 +76 +67 +68 +76 +100 +151 +198 +202 +202 +194 +180 +163 +149 +126 +100 +74 +56 +53 +52 +51 +50 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +41 +38 +37 +37 +41 +43 +44 +44 +44 +44 +45 +47 +48 +49 +48 +45 +44 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +45 +48 +68 +99 +124 +141 +148 +144 +123 +97 +72 +56 +51 +51 +51 +52 +52 +52 +52 +51 +50 +48 +46 +45 +45 +45 +45 +49 +52 +54 +55 +55 +56 +59 +65 +72 +81 +88 +88 +85 +81 +76 +88 +132 +156 +161 +145 +86 +42 +15 +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 +1 +1 +1 +1 +1 +1 +88 +93 +95 +97 +102 +106 +106 +106 +106 +108 +108 +108 +107 +104 +99 +97 +97 +100 +103 +104 +93 +55 +32 +22 +20 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +24 +56 +77 +81 +82 +81 +78 +72 +70 +68 +66 +64 +63 +61 +59 +58 +57 +56 +56 +57 +59 +62 +67 +72 +79 +88 +96 +103 +105 +105 +104 +103 +99 +94 +90 +87 +85 +84 +84 +85 +87 +90 +92 +92 +93 +93 +95 +101 +102 +97 +76 +32 +10 +11 +15 +26 +50 +53 +40 +22 +7 +2 +1 +1 +1 +1 +1 +1 +4 +22 +50 +83 +98 +98 +96 +89 +77 +67 +67 +74 +97 +146 +198 +203 +202 +195 +180 +163 +148 +125 +99 +73 +56 +53 +52 +51 +50 +48 +48 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +41 +38 +36 +37 +41 +43 +44 +44 +44 +44 +44 +45 +47 +47 +46 +44 +44 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +43 +42 +42 +42 +42 +42 +42 +42 +42 +43 +43 +47 +67 +97 +127 +145 +149 +142 +120 +92 +65 +52 +51 +51 +51 +52 +52 +52 +51 +50 +49 +46 +45 +45 +45 +45 +48 +51 +54 +55 +55 +56 +58 +64 +71 +79 +90 +91 +89 +85 +79 +77 +115 +148 +165 +157 +113 +61 +26 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +92 +94 +96 +100 +106 +106 +106 +105 +105 +106 +106 +104 +100 +96 +96 +97 +100 +103 +103 +84 +50 +32 +25 +22 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +18 +46 +72 +80 +79 +75 +73 +72 +71 +69 +68 +67 +66 +65 +64 +63 +61 +59 +57 +56 +56 +59 +62 +66 +70 +78 +89 +99 +106 +107 +106 +104 +100 +95 +86 +83 +81 +80 +80 +80 +81 +83 +86 +89 +91 +92 +92 +92 +93 +94 +100 +102 +101 +96 +53 +30 +23 +26 +32 +64 +66 +58 +39 +12 +2 +1 +1 +1 +1 +1 +3 +18 +44 +79 +97 +98 +96 +91 +79 +67 +67 +72 +91 +136 +195 +202 +202 +196 +182 +164 +147 +124 +98 +71 +55 +53 +52 +51 +49 +49 +48 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +48 +42 +38 +36 +36 +40 +42 +44 +44 +44 +44 +44 +44 +45 +45 +45 +44 +44 +44 +44 +44 +44 +44 +44 +43 +43 +43 +42 +42 +42 +42 +42 +41 +40 +40 +39 +40 +40 +41 +42 +43 +46 +63 +91 +128 +147 +148 +141 +123 +90 +59 +53 +51 +51 +52 +52 +52 +52 +51 +49 +47 +46 +45 +45 +45 +47 +51 +53 +55 +55 +56 +57 +63 +70 +77 +90 +93 +94 +92 +85 +76 +87 +123 +157 +164 +142 +92 +48 +16 +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 +1 +1 +1 +1 +1 +83 +92 +94 +95 +98 +106 +106 +106 +104 +103 +103 +103 +100 +97 +96 +95 +98 +101 +103 +102 +76 +46 +32 +26 +21 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +24 +52 +69 +76 +76 +74 +73 +72 +72 +73 +71 +69 +68 +67 +67 +66 +64 +61 +59 +57 +57 +58 +62 +66 +70 +80 +92 +100 +105 +107 +106 +103 +97 +91 +85 +80 +78 +76 +75 +74 +75 +77 +80 +83 +87 +91 +92 +92 +92 +93 +94 +96 +99 +101 +101 +89 +71 +51 +36 +37 +51 +65 +67 +59 +40 +9 +3 +1 +1 +1 +1 +2 +15 +39 +75 +97 +98 +97 +92 +81 +68 +67 +70 +87 +127 +191 +202 +203 +197 +183 +165 +148 +125 +98 +71 +55 +53 +52 +51 +49 +49 +48 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +49 +42 +38 +36 +36 +39 +42 +43 +44 +43 +43 +43 +44 +44 +45 +45 +45 +44 +44 +44 +44 +44 +44 +44 +43 +43 +42 +42 +42 +41 +41 +41 +40 +39 +38 +37 +37 +38 +39 +41 +42 +44 +51 +68 +101 +139 +146 +146 +136 +113 +72 +59 +53 +52 +52 +52 +52 +52 +51 +50 +48 +46 +45 +45 +45 +47 +50 +53 +55 +55 +56 +57 +62 +70 +77 +89 +94 +97 +95 +91 +79 +80 +108 +142 +165 +155 +115 +69 +28 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +91 +94 +95 +97 +105 +106 +106 +105 +102 +101 +100 +98 +96 +95 +96 +99 +101 +102 +99 +67 +44 +32 +26 +17 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +18 +52 +70 +75 +75 +73 +74 +77 +77 +76 +75 +73 +70 +69 +69 +68 +66 +64 +61 +59 +58 +59 +62 +67 +72 +78 +90 +100 +105 +107 +106 +102 +96 +89 +83 +78 +73 +71 +69 +68 +68 +70 +72 +76 +80 +84 +90 +91 +92 +92 +93 +94 +95 +96 +99 +101 +101 +93 +79 +64 +51 +50 +61 +68 +68 +60 +28 +11 +3 +1 +1 +1 +2 +11 +32 +69 +95 +97 +97 +93 +83 +68 +67 +69 +83 +117 +186 +200 +204 +198 +185 +166 +149 +126 +99 +72 +55 +53 +51 +51 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +50 +43 +39 +36 +36 +38 +41 +42 +43 +43 +43 +43 +43 +44 +44 +45 +44 +44 +44 +44 +44 +44 +44 +43 +43 +42 +42 +41 +40 +40 +40 +40 +39 +38 +37 +36 +35 +35 +36 +38 +41 +42 +45 +54 +75 +124 +141 +147 +143 +131 +89 +67 +56 +52 +52 +52 +52 +52 +52 +51 +48 +47 +45 +45 +45 +46 +50 +53 +55 +56 +56 +57 +62 +69 +77 +87 +95 +98 +98 +96 +84 +79 +94 +123 +161 +161 +135 +90 +44 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +79 +90 +94 +94 +95 +104 +105 +106 +105 +102 +99 +98 +97 +96 +96 +97 +100 +101 +100 +93 +59 +41 +31 +24 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +18 +42 +74 +75 +74 +72 +75 +80 +84 +85 +82 +76 +73 +71 +70 +69 +68 +66 +64 +61 +60 +60 +63 +67 +72 +78 +86 +99 +104 +106 +105 +103 +95 +87 +81 +75 +71 +66 +63 +62 +62 +63 +65 +68 +72 +76 +81 +88 +90 +92 +92 +93 +95 +95 +95 +96 +98 +100 +100 +98 +90 +71 +60 +60 +66 +71 +72 +51 +25 +9 +3 +1 +1 +1 +8 +26 +61 +94 +97 +97 +94 +86 +70 +67 +68 +79 +107 +179 +198 +204 +199 +187 +167 +150 +127 +100 +73 +55 +53 +51 +51 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +50 +45 +40 +37 +36 +37 +39 +41 +42 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +44 +44 +44 +43 +43 +42 +41 +40 +40 +40 +39 +39 +39 +38 +38 +37 +34 +33 +33 +33 +35 +40 +41 +43 +46 +55 +103 +132 +144 +147 +143 +108 +78 +61 +53 +52 +52 +52 +52 +52 +51 +49 +47 +46 +45 +45 +46 +49 +53 +55 +56 +56 +57 +61 +68 +77 +86 +94 +99 +100 +100 +90 +81 +84 +106 +153 +164 +150 +111 +64 +21 +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 +1 +1 +1 +1 +77 +90 +94 +94 +94 +102 +105 +106 +105 +102 +99 +97 +96 +96 +96 +98 +100 +101 +97 +86 +50 +37 +29 +20 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +16 +39 +71 +76 +72 +70 +74 +84 +92 +92 +90 +86 +77 +73 +71 +70 +70 +68 +66 +64 +63 +62 +62 +66 +70 +77 +85 +94 +104 +105 +105 +103 +96 +84 +78 +72 +67 +61 +58 +58 +59 +60 +61 +62 +64 +67 +72 +77 +85 +89 +91 +92 +93 +95 +96 +96 +95 +94 +94 +95 +95 +94 +93 +77 +69 +67 +71 +76 +73 +46 +22 +6 +2 +1 +1 +5 +19 +52 +91 +96 +97 +95 +89 +72 +67 +67 +75 +96 +170 +196 +205 +201 +190 +170 +152 +129 +102 +75 +55 +53 +51 +51 +49 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +49 +49 +50 +50 +50 +51 +51 +51 +51 +51 +51 +51 +51 +51 +51 +46 +41 +37 +36 +37 +38 +40 +41 +42 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +44 +43 +42 +41 +40 +40 +40 +39 +39 +39 +39 +38 +38 +37 +36 +33 +32 +31 +31 +32 +37 +40 +42 +44 +46 +78 +119 +140 +147 +147 +126 +91 +68 +55 +52 +52 +52 +52 +52 +52 +49 +47 +46 +45 +45 +46 +49 +52 +55 +56 +56 +57 +61 +67 +77 +86 +93 +99 +102 +102 +96 +84 +81 +95 +138 +164 +159 +130 +86 +34 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +75 +89 +93 +93 +94 +99 +103 +105 +106 +105 +100 +98 +97 +97 +97 +100 +100 +99 +92 +74 +43 +30 +22 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +43 +68 +75 +71 +70 +77 +87 +98 +101 +100 +95 +88 +81 +74 +73 +73 +72 +71 +67 +65 +64 +64 +66 +74 +85 +95 +103 +107 +106 +101 +95 +87 +79 +71 +65 +59 +56 +55 +56 +56 +56 +56 +55 +56 +57 +60 +64 +69 +77 +84 +88 +90 +92 +94 +97 +98 +98 +98 +97 +95 +93 +92 +91 +90 +83 +77 +74 +75 +79 +75 +54 +28 +7 +1 +1 +3 +12 +36 +84 +94 +97 +96 +92 +75 +69 +67 +71 +83 +155 +190 +204 +203 +193 +173 +156 +133 +106 +78 +56 +53 +51 +51 +50 +49 +49 +49 +49 +50 +50 +50 +50 +50 +50 +50 +49 +49 +50 +50 +50 +51 +51 +52 +52 +51 +51 +51 +51 +52 +51 +49 +44 +39 +37 +37 +38 +38 +39 +39 +41 +42 +42 +43 +43 +43 +43 +43 +43 +42 +41 +40 +40 +40 +40 +40 +40 +40 +40 +39 +39 +39 +38 +37 +36 +33 +31 +29 +29 +29 +33 +38 +41 +43 +44 +56 +96 +127 +145 +147 +140 +109 +81 +60 +53 +52 +52 +52 +52 +52 +50 +48 +47 +46 +46 +46 +49 +52 +55 +56 +56 +57 +60 +67 +76 +86 +91 +98 +102 +103 +102 +90 +83 +87 +109 +160 +161 +147 +114 +58 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +73 +88 +93 +93 +93 +97 +101 +104 +106 +106 +102 +101 +100 +99 +99 +100 +100 +96 +85 +65 +35 +25 +17 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +37 +59 +72 +73 +70 +74 +85 +96 +104 +106 +104 +99 +93 +87 +81 +79 +77 +75 +72 +68 +67 +69 +74 +84 +93 +99 +101 +102 +102 +95 +88 +83 +77 +70 +59 +56 +53 +52 +51 +51 +50 +51 +51 +53 +54 +55 +57 +59 +63 +70 +77 +82 +86 +89 +92 +95 +97 +98 +99 +99 +99 +98 +97 +95 +93 +90 +84 +78 +76 +78 +77 +69 +51 +23 +3 +1 +2 +8 +24 +74 +91 +96 +96 +94 +79 +70 +67 +69 +77 +139 +182 +202 +204 +196 +177 +160 +137 +110 +81 +57 +53 +51 +51 +50 +49 +49 +49 +49 +50 +50 +51 +50 +50 +50 +50 +49 +49 +49 +50 +50 +51 +51 +52 +52 +52 +51 +51 +51 +52 +52 +50 +46 +41 +38 +37 +38 +38 +38 +38 +39 +40 +40 +41 +41 +42 +42 +41 +41 +40 +39 +39 +39 +40 +40 +40 +41 +41 +42 +42 +42 +42 +41 +40 +38 +34 +31 +29 +28 +28 +31 +36 +40 +42 +44 +51 +82 +116 +141 +147 +143 +120 +91 +66 +54 +53 +53 +53 +52 +52 +51 +49 +47 +46 +46 +46 +49 +52 +55 +56 +57 +57 +60 +66 +76 +85 +90 +96 +101 +104 +103 +95 +86 +84 +94 +151 +159 +154 +130 +80 +21 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +72 +87 +93 +93 +92 +95 +98 +103 +106 +106 +104 +102 +101 +101 +101 +101 +99 +91 +75 +53 +27 +20 +12 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +24 +53 +68 +73 +71 +70 +80 +92 +102 +107 +108 +105 +101 +97 +91 +86 +83 +81 +77 +74 +72 +77 +82 +89 +96 +101 +101 +98 +95 +92 +85 +78 +70 +63 +57 +51 +48 +47 +45 +44 +44 +44 +46 +48 +50 +52 +53 +54 +55 +57 +63 +69 +75 +81 +84 +87 +90 +93 +95 +98 +100 +101 +101 +100 +99 +97 +96 +92 +88 +83 +80 +79 +76 +67 +45 +11 +4 +2 +5 +15 +62 +86 +95 +96 +95 +82 +72 +67 +68 +73 +122 +173 +198 +205 +199 +180 +164 +141 +115 +85 +59 +54 +52 +51 +50 +49 +49 +49 +49 +50 +51 +51 +51 +50 +50 +50 +50 +49 +50 +50 +50 +51 +51 +52 +52 +52 +51 +51 +51 +52 +52 +51 +49 +44 +39 +38 +38 +38 +38 +38 +38 +38 +39 +39 +39 +40 +39 +39 +39 +39 +39 +39 +40 +40 +41 +43 +44 +44 +45 +45 +46 +46 +45 +44 +42 +37 +32 +29 +28 +28 +29 +34 +39 +42 +43 +48 +71 +105 +136 +147 +145 +128 +101 +73 +56 +53 +53 +53 +53 +52 +51 +49 +47 +46 +46 +47 +49 +52 +55 +56 +57 +57 +60 +66 +76 +85 +89 +94 +99 +104 +104 +99 +90 +83 +86 +138 +156 +158 +142 +102 +33 +12 +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 +1 +1 +71 +87 +92 +92 +92 +93 +96 +101 +105 +106 +105 +103 +102 +102 +102 +101 +96 +83 +64 +40 +20 +14 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +44 +65 +73 +72 +69 +73 +87 +98 +106 +109 +108 +106 +103 +100 +95 +90 +87 +84 +82 +80 +81 +89 +95 +100 +101 +100 +96 +90 +85 +79 +72 +65 +57 +51 +46 +44 +42 +40 +38 +37 +37 +39 +41 +43 +46 +48 +50 +51 +52 +53 +56 +61 +67 +73 +78 +82 +85 +87 +91 +94 +98 +100 +101 +102 +101 +101 +100 +99 +97 +92 +84 +82 +80 +76 +66 +26 +10 +3 +4 +8 +48 +79 +93 +96 +96 +86 +74 +68 +67 +70 +107 +161 +192 +205 +202 +185 +168 +146 +120 +90 +61 +55 +52 +51 +50 +49 +49 +49 +49 +50 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +51 +51 +51 +52 +52 +51 +48 +42 +39 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +38 +39 +40 +41 +42 +44 +45 +46 +47 +47 +48 +49 +49 +49 +49 +47 +41 +34 +30 +28 +28 +29 +33 +38 +41 +43 +46 +63 +96 +130 +146 +146 +134 +108 +79 +58 +53 +53 +53 +53 +53 +51 +49 +48 +47 +47 +47 +50 +53 +55 +57 +57 +58 +60 +66 +75 +85 +88 +93 +97 +103 +104 +102 +93 +85 +84 +122 +151 +160 +150 +123 +48 +18 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +70 +86 +92 +92 +91 +91 +92 +98 +104 +106 +105 +104 +103 +103 +102 +101 +88 +71 +50 +28 +13 +9 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +19 +63 +72 +73 +71 +69 +76 +92 +103 +108 +110 +108 +107 +105 +102 +99 +95 +92 +91 +90 +91 +96 +98 +99 +99 +98 +93 +89 +83 +75 +65 +52 +46 +43 +42 +40 +37 +35 +35 +34 +34 +34 +35 +36 +38 +40 +44 +46 +48 +48 +49 +50 +53 +58 +65 +71 +78 +80 +82 +84 +87 +94 +98 +101 +102 +102 +101 +101 +100 +99 +98 +91 +86 +83 +81 +78 +51 +20 +7 +4 +5 +32 +69 +88 +96 +96 +89 +77 +70 +67 +68 +92 +147 +185 +204 +204 +189 +173 +152 +126 +96 +64 +56 +52 +51 +50 +49 +49 +49 +49 +50 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +51 +51 +52 +52 +52 +52 +51 +51 +51 +52 +52 +52 +50 +47 +40 +39 +39 +39 +39 +38 +38 +38 +38 +38 +38 +38 +38 +38 +39 +41 +43 +44 +46 +47 +47 +48 +48 +48 +48 +49 +51 +52 +52 +51 +46 +38 +32 +28 +28 +29 +33 +38 +41 +43 +45 +58 +89 +124 +145 +146 +138 +114 +85 +61 +54 +53 +53 +53 +53 +52 +50 +48 +47 +47 +47 +50 +53 +56 +57 +57 +58 +61 +66 +75 +85 +88 +91 +95 +101 +104 +103 +96 +87 +83 +107 +145 +159 +156 +140 +66 +27 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +69 +86 +91 +91 +91 +89 +88 +92 +98 +105 +106 +105 +105 +103 +101 +89 +71 +50 +30 +14 +7 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +16 +42 +73 +75 +72 +68 +68 +79 +95 +104 +109 +109 +109 +108 +107 +106 +105 +103 +102 +101 +100 +100 +99 +98 +97 +93 +86 +72 +63 +55 +48 +43 +40 +38 +37 +36 +35 +35 +34 +34 +34 +34 +34 +34 +34 +35 +37 +40 +42 +44 +45 +45 +45 +45 +47 +51 +56 +66 +72 +77 +80 +81 +84 +90 +95 +99 +101 +101 +101 +101 +101 +102 +101 +97 +92 +87 +85 +76 +46 +21 +6 +6 +16 +52 +79 +94 +95 +93 +81 +72 +67 +67 +78 +124 +169 +201 +207 +195 +180 +160 +136 +105 +69 +58 +53 +51 +50 +49 +49 +49 +49 +49 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +50 +51 +52 +52 +52 +52 +52 +51 +51 +51 +52 +52 +52 +51 +46 +42 +40 +40 +40 +40 +40 +39 +39 +39 +39 +40 +41 +42 +44 +46 +46 +47 +47 +47 +48 +48 +48 +48 +48 +49 +51 +53 +53 +53 +50 +41 +34 +30 +29 +30 +33 +38 +41 +43 +45 +55 +84 +118 +144 +146 +140 +119 +91 +64 +54 +54 +53 +53 +53 +52 +50 +49 +48 +48 +48 +51 +54 +56 +57 +57 +58 +61 +67 +75 +84 +87 +89 +92 +97 +103 +103 +99 +91 +84 +93 +135 +155 +159 +153 +92 +42 +14 +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 +1 +68 +85 +91 +91 +90 +88 +85 +85 +90 +100 +103 +103 +101 +97 +91 +74 +53 +33 +17 +9 +6 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +27 +59 +75 +74 +70 +67 +67 +80 +95 +104 +108 +109 +109 +108 +108 +107 +106 +104 +102 +101 +100 +99 +96 +91 +82 +72 +62 +51 +46 +43 +40 +38 +37 +37 +37 +38 +38 +38 +38 +38 +38 +37 +36 +35 +35 +35 +36 +38 +40 +41 +43 +43 +43 +43 +43 +44 +46 +52 +58 +64 +71 +75 +80 +83 +89 +94 +98 +99 +100 +100 +100 +100 +101 +99 +96 +93 +89 +84 +66 +39 +15 +7 +12 +38 +67 +89 +95 +94 +85 +75 +68 +67 +72 +107 +153 +193 +207 +199 +185 +167 +143 +114 +75 +61 +54 +51 +50 +49 +49 +49 +49 +49 +50 +51 +51 +51 +51 +51 +51 +50 +50 +50 +50 +50 +51 +52 +53 +53 +52 +52 +52 +51 +51 +52 +52 +52 +52 +50 +46 +43 +42 +41 +41 +42 +42 +42 +42 +43 +43 +44 +45 +46 +47 +47 +47 +47 +48 +48 +48 +48 +49 +49 +50 +52 +54 +55 +55 +51 +42 +35 +31 +30 +31 +35 +39 +42 +43 +45 +54 +83 +117 +143 +146 +141 +121 +93 +66 +55 +54 +53 +53 +53 +52 +51 +49 +48 +48 +49 +51 +54 +57 +57 +58 +58 +61 +67 +76 +83 +85 +87 +89 +94 +102 +103 +100 +94 +84 +89 +126 +150 +161 +157 +110 +55 +21 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +67 +84 +90 +91 +90 +89 +82 +79 +81 +89 +94 +95 +91 +84 +75 +51 +33 +20 +11 +7 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +17 +40 +70 +77 +72 +68 +66 +67 +80 +94 +103 +108 +109 +108 +108 +108 +107 +105 +103 +101 +99 +95 +90 +79 +70 +61 +53 +46 +41 +40 +39 +39 +40 +41 +42 +43 +44 +44 +45 +45 +44 +43 +42 +40 +38 +37 +36 +35 +37 +38 +40 +41 +42 +42 +42 +42 +42 +42 +44 +48 +52 +57 +63 +69 +74 +80 +87 +94 +98 +99 +99 +99 +99 +100 +100 +99 +96 +93 +90 +80 +56 +30 +11 +11 +27 +55 +82 +94 +94 +88 +79 +70 +66 +69 +92 +137 +181 +205 +203 +191 +174 +152 +123 +82 +65 +55 +52 +50 +49 +49 +49 +49 +49 +50 +51 +52 +52 +52 +52 +52 +51 +51 +50 +50 +50 +51 +52 +53 +53 +53 +52 +52 +51 +51 +52 +52 +52 +52 +52 +50 +47 +45 +43 +42 +43 +43 +43 +44 +44 +45 +45 +46 +46 +47 +47 +47 +47 +48 +48 +48 +49 +49 +50 +51 +54 +55 +56 +56 +51 +42 +35 +31 +31 +32 +36 +39 +42 +43 +45 +55 +83 +117 +143 +145 +141 +121 +94 +66 +55 +54 +53 +53 +53 +52 +51 +50 +49 +49 +49 +52 +55 +57 +58 +58 +58 +62 +68 +76 +82 +84 +85 +87 +91 +100 +102 +101 +96 +85 +87 +117 +144 +161 +160 +126 +69 +29 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +67 +84 +90 +90 +90 +89 +81 +74 +71 +75 +80 +80 +74 +65 +53 +28 +17 +11 +8 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +27 +53 +75 +77 +70 +66 +65 +66 +80 +93 +101 +106 +107 +107 +107 +106 +104 +102 +98 +94 +89 +82 +72 +58 +50 +44 +41 +40 +40 +41 +42 +43 +44 +47 +48 +49 +49 +50 +50 +50 +50 +49 +48 +45 +43 +40 +38 +36 +36 +37 +38 +39 +41 +41 +41 +41 +41 +41 +41 +42 +43 +45 +49 +57 +62 +69 +76 +85 +94 +97 +98 +99 +99 +99 +100 +100 +99 +96 +93 +89 +73 +48 +18 +12 +19 +44 +72 +92 +93 +91 +82 +72 +66 +67 +81 +119 +166 +202 +205 +195 +181 +160 +132 +90 +69 +58 +52 +50 +49 +49 +49 +49 +49 +50 +51 +52 +52 +53 +53 +53 +52 +51 +51 +51 +51 +51 +52 +53 +53 +53 +53 +52 +52 +51 +51 +52 +52 +52 +52 +52 +51 +49 +47 +45 +44 +44 +44 +45 +45 +46 +46 +46 +47 +47 +47 +48 +48 +48 +49 +49 +50 +50 +51 +54 +56 +57 +57 +57 +51 +41 +35 +32 +32 +33 +37 +40 +43 +44 +46 +58 +86 +119 +143 +145 +140 +120 +93 +66 +55 +54 +54 +53 +53 +52 +51 +50 +49 +49 +50 +53 +56 +58 +58 +58 +59 +62 +68 +77 +81 +82 +83 +84 +87 +98 +101 +101 +97 +87 +86 +109 +138 +160 +161 +139 +83 +39 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +66 +83 +89 +90 +90 +89 +81 +71 +64 +62 +63 +58 +50 +39 +26 +17 +14 +10 +7 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +12 +37 +63 +78 +77 +68 +65 +64 +65 +78 +90 +98 +103 +105 +105 +103 +102 +99 +95 +86 +76 +66 +56 +48 +43 +42 +41 +41 +41 +45 +46 +48 +49 +49 +49 +50 +50 +50 +51 +51 +52 +52 +52 +52 +50 +48 +45 +42 +39 +36 +36 +37 +38 +40 +40 +41 +41 +41 +41 +41 +41 +41 +41 +42 +44 +47 +53 +60 +69 +84 +92 +96 +98 +98 +99 +99 +100 +99 +99 +96 +94 +87 +68 +32 +15 +17 +33 +59 +87 +93 +92 +85 +76 +67 +66 +73 +103 +146 +195 +205 +200 +188 +169 +143 +99 +75 +61 +53 +51 +50 +49 +49 +49 +49 +50 +51 +52 +53 +54 +54 +54 +53 +52 +51 +51 +51 +51 +52 +53 +53 +53 +53 +53 +52 +51 +51 +51 +52 +52 +53 +53 +52 +52 +50 +48 +47 +46 +46 +46 +46 +46 +46 +47 +47 +48 +48 +48 +48 +49 +50 +50 +51 +52 +53 +56 +58 +58 +58 +57 +48 +39 +34 +32 +32 +34 +38 +41 +43 +44 +47 +61 +91 +122 +143 +144 +138 +118 +91 +66 +55 +54 +54 +53 +53 +53 +51 +50 +50 +50 +51 +54 +57 +58 +58 +58 +59 +62 +69 +77 +80 +80 +81 +82 +84 +95 +100 +101 +98 +89 +86 +102 +132 +158 +162 +149 +97 +49 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +66 +82 +88 +89 +89 +90 +87 +74 +60 +53 +49 +41 +35 +30 +24 +17 +14 +9 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +22 +50 +74 +80 +75 +67 +63 +63 +63 +71 +79 +84 +87 +88 +87 +81 +76 +70 +62 +53 +48 +45 +44 +43 +43 +44 +45 +47 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +51 +52 +52 +53 +54 +54 +54 +54 +52 +49 +46 +41 +38 +36 +36 +37 +39 +39 +40 +40 +40 +40 +40 +40 +40 +41 +41 +42 +43 +45 +48 +60 +75 +87 +95 +98 +99 +99 +99 +100 +99 +98 +97 +95 +85 +64 +23 +20 +25 +42 +74 +92 +92 +89 +82 +70 +66 +68 +85 +119 +175 +206 +204 +195 +180 +158 +114 +86 +67 +56 +51 +50 +49 +49 +49 +48 +49 +51 +52 +53 +54 +55 +55 +55 +54 +53 +52 +52 +52 +52 +53 +54 +54 +54 +53 +53 +52 +51 +51 +51 +51 +52 +52 +53 +53 +53 +53 +52 +51 +50 +49 +49 +48 +48 +48 +48 +49 +49 +49 +50 +51 +52 +52 +53 +54 +56 +59 +59 +59 +57 +53 +43 +37 +34 +34 +34 +37 +41 +43 +45 +45 +50 +70 +101 +129 +144 +144 +134 +112 +85 +63 +55 +54 +54 +54 +54 +53 +52 +51 +51 +51 +52 +56 +58 +58 +59 +59 +59 +63 +70 +77 +78 +78 +78 +78 +80 +91 +98 +100 +98 +91 +85 +95 +124 +154 +162 +156 +114 +65 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +65 +81 +87 +88 +88 +90 +88 +79 +66 +54 +49 +42 +37 +32 +27 +19 +15 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +33 +59 +78 +81 +74 +66 +62 +61 +61 +65 +69 +72 +72 +71 +68 +62 +58 +54 +50 +47 +45 +44 +44 +45 +46 +47 +48 +48 +49 +49 +48 +48 +48 +48 +48 +48 +48 +49 +50 +51 +52 +53 +55 +56 +57 +57 +55 +53 +50 +46 +42 +39 +37 +36 +37 +38 +38 +39 +39 +40 +40 +40 +40 +40 +41 +41 +41 +42 +43 +48 +56 +68 +82 +93 +98 +99 +99 +100 +100 +99 +98 +97 +92 +82 +39 +27 +25 +35 +59 +88 +91 +90 +85 +74 +66 +67 +76 +102 +154 +200 +204 +200 +188 +169 +127 +96 +74 +59 +52 +50 +49 +49 +49 +48 +49 +50 +52 +53 +55 +56 +56 +56 +56 +55 +53 +53 +53 +53 +53 +54 +54 +54 +54 +53 +52 +51 +51 +51 +51 +51 +52 +52 +53 +53 +53 +53 +53 +52 +52 +51 +51 +51 +51 +51 +51 +51 +52 +52 +53 +53 +54 +55 +56 +58 +59 +59 +58 +55 +49 +39 +36 +35 +35 +36 +40 +43 +44 +45 +46 +54 +80 +110 +135 +144 +143 +129 +105 +80 +61 +55 +54 +54 +54 +54 +53 +52 +52 +52 +52 +54 +57 +58 +59 +59 +59 +59 +64 +70 +77 +77 +76 +75 +76 +77 +88 +96 +99 +98 +92 +85 +92 +120 +150 +163 +159 +125 +76 +31 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +65 +80 +86 +87 +87 +89 +89 +84 +73 +59 +52 +47 +41 +36 +32 +22 +16 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +15 +43 +67 +81 +82 +73 +65 +61 +60 +59 +60 +61 +61 +60 +58 +55 +51 +49 +47 +45 +45 +45 +45 +46 +47 +48 +48 +49 +49 +48 +48 +48 +48 +48 +47 +47 +47 +48 +48 +49 +51 +52 +54 +55 +57 +58 +59 +59 +57 +55 +50 +46 +43 +40 +37 +37 +37 +38 +38 +39 +39 +39 +39 +40 +40 +40 +40 +40 +41 +41 +43 +46 +54 +65 +80 +93 +97 +99 +99 +100 +99 +98 +98 +96 +92 +59 +36 +28 +32 +46 +82 +88 +90 +87 +79 +67 +66 +70 +88 +129 +191 +202 +202 +195 +179 +141 +108 +82 +64 +54 +50 +50 +49 +49 +48 +49 +50 +51 +53 +55 +57 +57 +57 +57 +57 +55 +54 +54 +54 +54 +54 +54 +54 +54 +54 +53 +52 +51 +51 +51 +51 +51 +52 +52 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +53 +54 +54 +55 +56 +57 +58 +59 +60 +58 +55 +50 +44 +37 +36 +36 +36 +38 +42 +44 +45 +46 +48 +63 +92 +119 +139 +144 +141 +122 +97 +74 +59 +55 +54 +54 +54 +54 +53 +52 +52 +52 +53 +56 +58 +59 +59 +59 +59 +60 +65 +71 +76 +76 +74 +74 +73 +74 +85 +94 +98 +97 +93 +85 +90 +115 +145 +163 +161 +135 +88 +39 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +64 +79 +85 +86 +86 +89 +89 +87 +80 +66 +57 +53 +48 +43 +39 +27 +17 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +22 +53 +74 +83 +83 +72 +65 +61 +59 +57 +56 +55 +54 +52 +50 +48 +46 +46 +45 +45 +45 +46 +47 +48 +48 +49 +49 +49 +49 +49 +49 +48 +48 +47 +47 +47 +47 +48 +48 +49 +52 +54 +55 +57 +58 +60 +61 +61 +61 +59 +54 +50 +47 +43 +40 +37 +37 +37 +38 +38 +39 +39 +39 +39 +39 +39 +39 +39 +40 +40 +41 +42 +44 +50 +62 +82 +92 +97 +99 +99 +99 +99 +98 +98 +96 +78 +49 +35 +32 +38 +72 +85 +89 +88 +83 +69 +66 +67 +78 +105 +176 +197 +204 +200 +189 +155 +122 +93 +70 +57 +51 +50 +49 +49 +48 +48 +49 +51 +53 +55 +58 +58 +59 +58 +58 +57 +56 +55 +55 +55 +55 +55 +55 +55 +55 +54 +52 +51 +51 +51 +50 +51 +51 +51 +52 +53 +53 +53 +53 +53 +54 +54 +54 +54 +54 +54 +54 +55 +55 +55 +56 +58 +59 +59 +60 +59 +56 +51 +45 +40 +36 +36 +37 +38 +41 +44 +45 +46 +48 +52 +75 +105 +128 +142 +144 +137 +113 +88 +68 +57 +55 +54 +54 +54 +54 +53 +53 +53 +53 +54 +58 +59 +60 +60 +59 +59 +60 +65 +71 +76 +76 +73 +72 +71 +72 +82 +93 +97 +97 +93 +85 +88 +111 +141 +163 +162 +143 +98 +48 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +62 +78 +83 +84 +85 +87 +89 +89 +85 +76 +64 +60 +56 +52 +45 +33 +19 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +30 +62 +79 +85 +84 +71 +65 +61 +59 +56 +52 +51 +49 +47 +46 +46 +45 +45 +45 +45 +47 +48 +48 +49 +49 +50 +51 +51 +51 +51 +49 +49 +48 +47 +47 +47 +47 +48 +49 +50 +54 +57 +59 +60 +61 +62 +62 +63 +63 +62 +60 +55 +50 +46 +44 +40 +38 +38 +38 +38 +39 +39 +38 +38 +37 +37 +37 +38 +38 +39 +40 +41 +42 +43 +45 +63 +81 +92 +97 +99 +99 +99 +99 +98 +98 +91 +63 +44 +34 +35 +60 +80 +88 +89 +87 +73 +67 +66 +71 +85 +156 +190 +203 +203 +197 +169 +136 +105 +79 +61 +52 +50 +49 +49 +48 +48 +49 +50 +52 +54 +58 +59 +60 +60 +59 +58 +57 +57 +56 +56 +55 +55 +55 +55 +55 +54 +53 +52 +51 +51 +50 +50 +50 +50 +51 +52 +52 +53 +53 +53 +54 +54 +54 +55 +55 +55 +55 +55 +56 +57 +58 +59 +59 +59 +59 +56 +51 +45 +41 +38 +37 +37 +39 +41 +44 +46 +46 +47 +51 +59 +90 +119 +136 +144 +143 +130 +102 +79 +62 +55 +55 +54 +54 +54 +54 +54 +54 +54 +54 +56 +59 +60 +60 +60 +59 +59 +61 +66 +72 +75 +75 +72 +70 +70 +70 +80 +91 +96 +97 +94 +85 +87 +108 +136 +163 +163 +150 +108 +57 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +60 +75 +81 +82 +82 +85 +88 +89 +88 +83 +72 +66 +62 +58 +52 +39 +21 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +43 +72 +84 +86 +85 +71 +65 +62 +59 +56 +50 +48 +47 +46 +46 +46 +46 +46 +46 +47 +49 +49 +50 +51 +51 +52 +52 +52 +52 +51 +48 +47 +47 +47 +47 +48 +50 +52 +55 +58 +60 +61 +61 +62 +62 +63 +63 +64 +64 +64 +63 +61 +57 +51 +47 +44 +42 +41 +41 +40 +39 +39 +38 +38 +37 +37 +37 +37 +38 +38 +39 +40 +41 +42 +42 +44 +55 +72 +88 +97 +98 +98 +99 +98 +98 +96 +82 +59 +41 +38 +47 +71 +84 +88 +88 +80 +70 +66 +67 +72 +120 +169 +196 +206 +204 +186 +157 +125 +95 +71 +55 +52 +50 +49 +49 +48 +48 +49 +51 +53 +57 +59 +60 +61 +61 +60 +60 +59 +58 +57 +57 +57 +57 +56 +56 +55 +54 +53 +52 +51 +50 +50 +49 +49 +49 +49 +50 +50 +51 +52 +52 +53 +53 +53 +54 +55 +55 +56 +57 +57 +58 +58 +58 +57 +53 +47 +43 +40 +39 +38 +39 +41 +43 +45 +46 +47 +48 +51 +61 +78 +112 +133 +142 +143 +139 +112 +86 +68 +57 +55 +55 +55 +55 +54 +54 +54 +55 +55 +56 +59 +61 +61 +61 +60 +60 +60 +62 +67 +73 +75 +74 +70 +69 +68 +69 +77 +89 +95 +96 +94 +85 +86 +104 +131 +162 +164 +156 +119 +69 +21 +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 +57 +73 +79 +80 +80 +82 +86 +88 +88 +86 +78 +73 +69 +65 +59 +45 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +14 +52 +77 +86 +87 +85 +71 +65 +62 +60 +56 +50 +48 +46 +46 +45 +46 +46 +47 +48 +49 +50 +50 +51 +51 +52 +52 +51 +51 +49 +48 +47 +46 +47 +48 +49 +53 +55 +57 +58 +59 +60 +61 +61 +62 +62 +63 +63 +63 +63 +63 +63 +63 +60 +57 +52 +46 +44 +43 +42 +41 +40 +40 +39 +38 +37 +37 +37 +38 +38 +38 +39 +40 +41 +41 +42 +42 +46 +55 +69 +88 +97 +98 +98 +98 +98 +97 +90 +70 +50 +40 +44 +63 +78 +87 +88 +83 +73 +67 +66 +68 +98 +149 +184 +202 +206 +196 +172 +142 +110 +82 +60 +54 +51 +49 +49 +48 +48 +49 +50 +52 +56 +58 +60 +61 +62 +62 +61 +60 +60 +59 +58 +58 +58 +58 +57 +57 +55 +54 +52 +51 +50 +49 +49 +49 +48 +48 +49 +49 +50 +50 +51 +51 +52 +52 +53 +54 +54 +55 +56 +56 +56 +55 +52 +49 +46 +43 +41 +40 +40 +40 +42 +44 +45 +46 +47 +48 +51 +60 +76 +97 +127 +138 +142 +138 +129 +96 +75 +62 +56 +55 +55 +55 +55 +55 +55 +55 +56 +57 +58 +60 +62 +62 +61 +60 +60 +60 +62 +68 +73 +74 +73 +70 +68 +68 +68 +76 +88 +94 +95 +93 +84 +86 +102 +128 +161 +165 +159 +126 +79 +27 +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 +55 +71 +77 +78 +77 +78 +85 +88 +88 +87 +81 +77 +74 +70 +65 +48 +26 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +60 +80 +88 +89 +86 +72 +66 +63 +61 +58 +51 +48 +46 +45 +45 +46 +46 +47 +48 +50 +50 +51 +51 +51 +51 +51 +50 +49 +47 +46 +46 +48 +49 +51 +54 +56 +58 +59 +59 +60 +60 +60 +60 +60 +60 +60 +60 +60 +61 +61 +62 +62 +61 +59 +55 +50 +47 +45 +43 +42 +41 +40 +39 +38 +38 +38 +38 +39 +40 +40 +40 +40 +41 +41 +42 +42 +43 +46 +55 +70 +90 +96 +98 +98 +98 +98 +94 +79 +60 +43 +44 +56 +72 +85 +87 +85 +77 +69 +65 +65 +82 +127 +167 +196 +206 +203 +185 +159 +128 +96 +68 +58 +52 +50 +49 +48 +48 +48 +49 +50 +54 +57 +59 +61 +62 +63 +62 +62 +61 +60 +59 +59 +59 +59 +59 +58 +57 +55 +54 +52 +50 +49 +49 +48 +47 +47 +47 +47 +48 +48 +49 +49 +50 +51 +51 +52 +52 +53 +52 +52 +50 +49 +46 +44 +43 +41 +41 +41 +42 +43 +44 +46 +46 +47 +48 +50 +59 +75 +94 +115 +136 +140 +138 +130 +113 +81 +66 +58 +55 +55 +55 +55 +55 +55 +56 +56 +57 +59 +60 +62 +62 +62 +61 +60 +60 +60 +63 +69 +73 +74 +72 +69 +68 +68 +68 +75 +87 +93 +94 +93 +84 +85 +100 +125 +160 +166 +161 +133 +88 +33 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +52 +68 +74 +75 +74 +75 +82 +87 +88 +88 +84 +81 +77 +73 +68 +48 +25 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +23 +66 +83 +90 +90 +87 +73 +66 +63 +62 +60 +53 +48 +46 +46 +45 +46 +46 +47 +48 +49 +50 +50 +51 +50 +50 +49 +47 +47 +46 +47 +48 +51 +53 +56 +57 +58 +58 +58 +58 +58 +57 +56 +55 +55 +54 +54 +54 +55 +55 +56 +58 +59 +59 +59 +57 +53 +49 +46 +44 +43 +42 +41 +40 +39 +39 +39 +40 +41 +42 +42 +42 +42 +42 +42 +43 +43 +42 +43 +45 +52 +77 +90 +96 +98 +98 +98 +97 +86 +69 +48 +45 +52 +67 +81 +87 +86 +80 +72 +66 +64 +71 +104 +147 +185 +204 +207 +196 +175 +146 +113 +78 +64 +55 +51 +50 +49 +48 +48 +48 +49 +52 +55 +58 +61 +62 +63 +63 +63 +62 +62 +61 +60 +60 +60 +60 +59 +58 +57 +55 +54 +51 +50 +49 +48 +47 +46 +46 +45 +45 +46 +46 +47 +47 +48 +48 +48 +48 +48 +47 +46 +45 +43 +42 +42 +42 +41 +42 +43 +44 +45 +46 +47 +47 +48 +50 +58 +75 +94 +113 +130 +140 +138 +131 +117 +95 +68 +59 +56 +55 +55 +55 +56 +56 +56 +57 +58 +59 +61 +62 +63 +63 +62 +61 +60 +60 +60 +64 +69 +73 +73 +71 +69 +68 +68 +68 +75 +86 +92 +94 +92 +84 +84 +98 +123 +159 +167 +163 +138 +96 +40 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +49 +64 +70 +71 +71 +72 +79 +85 +88 +88 +85 +82 +79 +74 +67 +45 +22 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +26 +72 +86 +91 +91 +88 +74 +67 +64 +63 +61 +55 +50 +47 +46 +45 +46 +46 +47 +48 +49 +50 +49 +49 +48 +47 +46 +46 +46 +47 +50 +54 +56 +57 +58 +58 +58 +57 +55 +54 +52 +49 +48 +47 +47 +46 +46 +46 +47 +47 +48 +51 +52 +54 +56 +56 +55 +51 +48 +46 +44 +43 +42 +41 +40 +40 +40 +42 +43 +44 +44 +44 +44 +45 +45 +45 +44 +43 +43 +43 +44 +57 +78 +91 +97 +98 +98 +97 +91 +77 +54 +46 +49 +62 +77 +86 +86 +83 +75 +67 +63 +66 +84 +123 +167 +200 +208 +203 +189 +165 +133 +92 +72 +60 +53 +50 +49 +49 +48 +48 +48 +50 +53 +56 +60 +62 +63 +64 +64 +63 +63 +62 +61 +61 +61 +60 +60 +59 +58 +57 +55 +53 +51 +49 +48 +47 +45 +44 +44 +43 +42 +42 +42 +42 +42 +42 +42 +42 +41 +41 +41 +41 +41 +41 +41 +42 +43 +44 +45 +46 +47 +47 +48 +48 +50 +54 +75 +97 +115 +129 +138 +139 +132 +118 +99 +76 +59 +56 +55 +55 +56 +56 +56 +57 +58 +59 +60 +61 +63 +63 +63 +63 +63 +61 +60 +60 +61 +66 +70 +73 +73 +70 +68 +68 +68 +68 +74 +85 +91 +93 +91 +83 +84 +96 +121 +158 +168 +165 +143 +104 +47 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +46 +58 +64 +65 +65 +66 +74 +81 +86 +87 +85 +81 +77 +69 +58 +35 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +14 +33 +76 +87 +92 +92 +90 +76 +68 +64 +63 +63 +59 +54 +49 +46 +45 +45 +45 +46 +46 +46 +46 +46 +46 +46 +46 +47 +50 +53 +55 +57 +58 +57 +57 +55 +52 +49 +47 +45 +44 +43 +43 +42 +42 +42 +43 +43 +43 +43 +43 +43 +44 +45 +46 +47 +47 +48 +48 +48 +46 +45 +43 +43 +42 +42 +42 +43 +43 +44 +44 +44 +44 +45 +46 +48 +52 +51 +49 +46 +43 +43 +44 +57 +75 +90 +97 +98 +98 +94 +83 +60 +47 +48 +58 +71 +85 +86 +85 +79 +71 +64 +63 +70 +96 +134 +178 +207 +208 +202 +187 +161 +118 +91 +71 +59 +52 +49 +49 +49 +48 +48 +48 +50 +53 +56 +59 +63 +64 +64 +64 +64 +64 +63 +63 +63 +62 +62 +61 +60 +58 +56 +54 +52 +50 +49 +47 +45 +44 +43 +42 +42 +41 +40 +40 +40 +40 +40 +40 +40 +40 +41 +42 +42 +44 +45 +46 +47 +47 +47 +47 +48 +49 +50 +54 +64 +82 +110 +124 +133 +137 +138 +128 +112 +93 +75 +60 +56 +55 +56 +56 +56 +57 +58 +59 +60 +61 +63 +64 +64 +64 +64 +64 +62 +61 +60 +60 +62 +67 +71 +73 +73 +69 +68 +68 +68 +68 +74 +84 +90 +91 +90 +83 +83 +95 +119 +157 +169 +166 +149 +113 +56 +10 +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 +43 +53 +58 +60 +60 +60 +66 +75 +81 +83 +82 +78 +71 +61 +48 +25 +11 +3 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +16 +37 +79 +88 +92 +92 +91 +79 +69 +64 +63 +63 +61 +58 +54 +49 +47 +46 +46 +46 +46 +46 +46 +46 +47 +48 +51 +54 +56 +57 +57 +57 +54 +51 +49 +47 +45 +44 +43 +42 +42 +42 +42 +42 +42 +42 +42 +42 +43 +43 +43 +43 +44 +44 +45 +45 +46 +46 +46 +45 +45 +44 +43 +43 +43 +43 +43 +44 +44 +44 +45 +45 +45 +45 +46 +49 +55 +58 +57 +53 +48 +44 +43 +48 +62 +80 +94 +98 +97 +94 +84 +63 +47 +48 +56 +68 +83 +86 +85 +81 +74 +66 +62 +66 +81 +110 +155 +195 +205 +207 +198 +180 +140 +110 +86 +68 +57 +51 +50 +49 +48 +48 +48 +48 +50 +52 +55 +59 +62 +63 +64 +65 +64 +64 +64 +64 +64 +64 +63 +62 +61 +59 +56 +54 +52 +50 +48 +46 +45 +44 +43 +42 +41 +41 +41 +41 +41 +41 +42 +43 +44 +45 +46 +46 +47 +47 +47 +48 +48 +48 +48 +49 +52 +60 +73 +90 +109 +128 +133 +136 +136 +130 +109 +91 +75 +63 +57 +55 +56 +56 +57 +58 +59 +60 +61 +62 +63 +64 +65 +65 +64 +64 +63 +62 +61 +61 +61 +63 +69 +72 +73 +72 +69 +68 +68 +68 +69 +74 +84 +89 +91 +89 +82 +82 +94 +118 +156 +169 +167 +152 +118 +62 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +41 +48 +52 +53 +53 +51 +56 +63 +70 +73 +72 +67 +59 +48 +35 +14 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +39 +81 +89 +93 +93 +91 +81 +70 +65 +63 +63 +63 +61 +58 +55 +52 +49 +48 +48 +48 +49 +50 +51 +53 +54 +56 +57 +56 +55 +53 +50 +47 +46 +44 +43 +42 +42 +41 +41 +41 +41 +42 +42 +42 +42 +42 +42 +43 +43 +43 +43 +43 +44 +44 +45 +45 +45 +45 +45 +44 +44 +44 +44 +44 +44 +44 +44 +45 +45 +45 +45 +46 +47 +49 +52 +58 +65 +65 +63 +57 +49 +44 +45 +53 +67 +87 +96 +96 +94 +85 +64 +47 +48 +54 +66 +81 +86 +86 +83 +77 +69 +63 +63 +71 +91 +129 +178 +198 +207 +206 +196 +163 +132 +104 +81 +64 +54 +51 +50 +49 +48 +48 +48 +48 +50 +52 +56 +59 +61 +63 +64 +64 +64 +64 +64 +64 +64 +64 +64 +63 +62 +59 +58 +56 +54 +52 +50 +48 +47 +46 +45 +45 +44 +44 +44 +45 +45 +46 +46 +47 +47 +48 +48 +48 +48 +48 +48 +48 +49 +51 +56 +67 +83 +99 +114 +127 +136 +136 +133 +125 +112 +89 +74 +64 +57 +55 +56 +57 +57 +58 +59 +61 +62 +63 +64 +65 +65 +65 +65 +64 +64 +63 +62 +61 +61 +61 +65 +70 +72 +73 +72 +68 +68 +68 +68 +69 +73 +83 +88 +89 +88 +81 +82 +93 +118 +156 +170 +168 +155 +124 +68 +14 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +40 +43 +45 +46 +46 +42 +43 +47 +51 +53 +53 +48 +40 +30 +20 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +19 +42 +83 +90 +93 +93 +91 +83 +72 +65 +62 +62 +63 +63 +62 +60 +58 +54 +53 +53 +53 +53 +55 +57 +58 +58 +57 +55 +52 +49 +46 +44 +42 +42 +41 +41 +41 +41 +41 +41 +41 +41 +42 +42 +42 +42 +43 +43 +43 +43 +43 +43 +44 +44 +44 +44 +45 +45 +45 +45 +45 +44 +44 +44 +44 +45 +45 +45 +45 +46 +47 +48 +49 +53 +56 +60 +65 +73 +73 +72 +68 +59 +46 +45 +47 +56 +74 +92 +93 +92 +83 +63 +47 +47 +53 +64 +80 +86 +86 +84 +79 +72 +64 +62 +65 +77 +103 +156 +184 +202 +209 +206 +184 +156 +126 +99 +76 +59 +54 +51 +50 +49 +48 +48 +48 +48 +49 +52 +55 +57 +60 +62 +63 +64 +64 +64 +64 +64 +64 +64 +64 +63 +62 +60 +59 +57 +56 +54 +52 +51 +50 +50 +49 +49 +49 +49 +49 +50 +49 +49 +49 +49 +49 +49 +48 +49 +49 +49 +52 +55 +62 +72 +92 +109 +122 +132 +136 +137 +132 +122 +107 +90 +70 +62 +58 +56 +56 +57 +58 +59 +60 +61 +63 +64 +65 +66 +66 +66 +65 +65 +64 +64 +63 +61 +61 +61 +61 +67 +71 +72 +72 +71 +68 +68 +68 +69 +69 +73 +82 +87 +88 +87 +81 +81 +93 +117 +156 +170 +169 +157 +128 +74 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +38 +39 +39 +39 +39 +31 +29 +27 +26 +24 +22 +17 +12 +7 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +8 +21 +46 +84 +91 +93 +93 +91 +85 +75 +67 +61 +61 +61 +62 +62 +62 +61 +60 +60 +59 +59 +59 +59 +59 +58 +55 +50 +45 +43 +42 +42 +41 +41 +41 +41 +41 +41 +41 +41 +41 +42 +42 +42 +43 +43 +44 +44 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +45 +46 +46 +46 +46 +46 +46 +47 +47 +48 +50 +52 +56 +62 +68 +75 +79 +82 +83 +82 +80 +74 +52 +47 +46 +49 +57 +82 +87 +86 +78 +59 +45 +46 +52 +63 +79 +86 +86 +85 +81 +75 +67 +63 +63 +68 +81 +129 +165 +191 +206 +212 +202 +179 +151 +121 +93 +68 +59 +54 +51 +50 +49 +48 +48 +48 +48 +49 +50 +52 +55 +58 +61 +62 +63 +64 +64 +64 +64 +64 +64 +63 +62 +61 +61 +60 +59 +57 +56 +56 +55 +54 +53 +53 +52 +52 +51 +51 +50 +50 +49 +49 +49 +49 +49 +49 +50 +52 +59 +70 +84 +101 +123 +131 +135 +136 +137 +133 +119 +102 +84 +68 +59 +57 +56 +57 +57 +59 +60 +61 +62 +63 +65 +66 +67 +67 +67 +66 +65 +65 +64 +64 +62 +61 +61 +61 +62 +69 +72 +73 +72 +70 +68 +68 +68 +69 +70 +73 +81 +86 +87 +86 +80 +81 +93 +117 +156 +171 +169 +160 +132 +79 +20 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +37 +36 +34 +32 +30 +25 +22 +18 +15 +13 +8 +7 +5 +3 +3 +2 +2 +1 +1 +1 +1 +1 +2 +2 +3 +3 +5 +11 +24 +47 +85 +91 +93 +93 +92 +86 +77 +68 +61 +57 +58 +59 +61 +61 +61 +61 +60 +59 +58 +56 +49 +44 +42 +42 +42 +41 +41 +41 +41 +40 +40 +41 +41 +41 +41 +42 +43 +45 +46 +48 +50 +52 +54 +55 +56 +58 +58 +58 +58 +58 +58 +57 +56 +55 +53 +52 +51 +51 +50 +50 +50 +50 +51 +52 +53 +56 +59 +62 +66 +71 +80 +86 +92 +98 +105 +106 +103 +99 +95 +92 +73 +56 +48 +47 +49 +59 +66 +67 +63 +52 +44 +44 +51 +63 +79 +87 +87 +85 +82 +78 +70 +65 +62 +62 +65 +94 +131 +165 +191 +207 +212 +202 +184 +158 +129 +93 +74 +61 +54 +51 +49 +49 +48 +48 +48 +48 +48 +48 +49 +50 +52 +54 +56 +57 +59 +60 +61 +61 +62 +62 +61 +61 +60 +59 +58 +57 +56 +56 +55 +54 +53 +52 +52 +51 +50 +50 +49 +49 +49 +49 +49 +50 +52 +57 +64 +81 +97 +112 +125 +133 +135 +136 +136 +132 +124 +101 +83 +71 +63 +59 +57 +57 +58 +59 +60 +61 +63 +64 +65 +67 +68 +68 +68 +67 +67 +66 +65 +65 +64 +63 +62 +61 +61 +62 +65 +71 +72 +72 +72 +70 +68 +68 +69 +70 +71 +73 +80 +84 +86 +85 +80 +80 +92 +117 +156 +171 +170 +162 +137 +86 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +37 +35 +33 +30 +28 +24 +21 +18 +14 +12 +9 +8 +7 +6 +5 +4 +3 +3 +2 +2 +2 +2 +2 +3 +3 +4 +5 +11 +24 +47 +84 +90 +93 +93 +92 +87 +78 +69 +61 +56 +54 +55 +56 +57 +57 +55 +54 +51 +49 +47 +45 +44 +43 +43 +42 +40 +40 +40 +40 +40 +42 +43 +45 +47 +49 +53 +55 +58 +60 +62 +65 +67 +69 +70 +72 +73 +74 +75 +75 +76 +76 +75 +75 +75 +74 +73 +72 +71 +71 +70 +71 +71 +73 +74 +77 +80 +84 +89 +94 +99 +107 +112 +117 +121 +124 +125 +123 +118 +111 +105 +91 +69 +55 +48 +48 +51 +53 +52 +49 +43 +41 +42 +51 +65 +80 +87 +87 +86 +83 +79 +72 +68 +64 +61 +61 +74 +104 +138 +170 +195 +210 +208 +199 +182 +158 +121 +96 +77 +64 +56 +52 +51 +50 +49 +49 +48 +48 +48 +48 +49 +50 +50 +51 +52 +53 +55 +55 +56 +56 +56 +56 +56 +56 +55 +54 +54 +53 +52 +52 +51 +50 +50 +50 +49 +49 +49 +49 +50 +51 +52 +58 +65 +74 +86 +100 +116 +124 +130 +133 +136 +135 +130 +121 +109 +93 +76 +68 +63 +59 +58 +58 +59 +60 +61 +62 +64 +66 +67 +68 +68 +69 +68 +68 +67 +67 +66 +65 +64 +64 +63 +62 +62 +62 +64 +67 +72 +72 +72 +71 +69 +69 +69 +70 +71 +71 +73 +79 +83 +85 +84 +79 +80 +92 +117 +157 +172 +171 +163 +140 +91 +26 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +37 +35 +32 +29 +27 +23 +21 +19 +17 +16 +14 +13 +12 +11 +10 +7 +6 +5 +4 +3 +3 +3 +3 +3 +3 +4 +6 +13 +26 +49 +83 +90 +93 +93 +92 +88 +80 +71 +62 +55 +52 +51 +51 +52 +52 +52 +51 +51 +50 +49 +47 +44 +41 +40 +39 +39 +40 +41 +43 +46 +49 +53 +56 +59 +61 +65 +67 +70 +72 +74 +77 +78 +80 +82 +83 +85 +86 +87 +88 +89 +90 +90 +91 +92 +92 +92 +93 +93 +93 +94 +95 +97 +99 +101 +104 +109 +113 +117 +122 +127 +133 +136 +139 +141 +143 +142 +141 +136 +129 +121 +109 +86 +66 +52 +49 +48 +47 +44 +40 +38 +38 +41 +52 +67 +81 +87 +88 +86 +84 +80 +74 +70 +66 +63 +59 +64 +82 +110 +143 +175 +202 +208 +207 +198 +183 +150 +124 +101 +82 +67 +56 +53 +52 +51 +50 +49 +49 +49 +49 +49 +49 +49 +49 +50 +50 +51 +51 +51 +51 +52 +52 +51 +51 +51 +51 +51 +50 +50 +50 +50 +49 +49 +49 +50 +51 +53 +56 +60 +66 +73 +86 +96 +106 +116 +125 +133 +135 +135 +134 +130 +120 +109 +96 +84 +73 +64 +61 +59 +59 +59 +60 +61 +62 +64 +65 +67 +68 +69 +69 +69 +69 +68 +68 +67 +66 +65 +65 +64 +63 +63 +62 +62 +64 +66 +70 +72 +72 +72 +71 +69 +69 +70 +71 +72 +72 +74 +78 +82 +83 +83 +79 +80 +92 +118 +158 +172 +171 +164 +142 +95 +29 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +36 +34 +31 +28 +27 +24 +23 +22 +21 +21 +20 +20 +19 +17 +16 +14 +11 +9 +7 +5 +4 +3 +3 +4 +4 +5 +8 +15 +29 +52 +83 +90 +93 +93 +93 +90 +83 +73 +63 +55 +50 +49 +48 +48 +49 +50 +51 +51 +51 +49 +46 +41 +37 +36 +37 +39 +42 +45 +49 +54 +60 +64 +67 +70 +73 +75 +77 +79 +81 +82 +84 +86 +88 +89 +91 +93 +94 +96 +97 +99 +100 +102 +103 +105 +106 +108 +110 +111 +113 +115 +117 +120 +123 +126 +130 +135 +139 +143 +146 +150 +153 +156 +157 +159 +159 +158 +156 +153 +147 +137 +126 +105 +81 +60 +50 +48 +45 +40 +36 +35 +36 +41 +55 +70 +83 +88 +88 +87 +85 +82 +77 +72 +69 +65 +60 +60 +66 +85 +114 +148 +186 +201 +208 +208 +201 +178 +155 +130 +106 +85 +66 +59 +55 +52 +51 +50 +50 +49 +49 +49 +49 +49 +49 +49 +49 +49 +48 +48 +48 +48 +49 +49 +49 +49 +49 +49 +49 +50 +50 +51 +52 +54 +56 +59 +63 +70 +77 +85 +94 +105 +119 +127 +134 +137 +138 +136 +133 +128 +122 +113 +95 +82 +72 +66 +62 +60 +60 +59 +60 +61 +62 +64 +65 +67 +68 +70 +70 +70 +70 +70 +69 +68 +68 +67 +66 +65 +65 +64 +63 +63 +63 +64 +66 +68 +71 +72 +72 +71 +70 +69 +69 +71 +73 +73 +74 +74 +78 +81 +82 +81 +79 +80 +92 +119 +160 +172 +172 +165 +144 +100 +31 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +36 +34 +31 +28 +27 +25 +25 +24 +24 +24 +24 +24 +24 +24 +23 +22 +20 +17 +13 +8 +5 +4 +4 +4 +5 +7 +10 +18 +33 +56 +83 +89 +92 +93 +93 +91 +86 +77 +65 +56 +51 +49 +48 +48 +50 +52 +52 +48 +41 +34 +32 +33 +34 +36 +38 +43 +49 +54 +60 +64 +69 +72 +74 +76 +78 +80 +82 +83 +85 +86 +89 +91 +92 +94 +96 +98 +100 +102 +103 +105 +107 +109 +111 +112 +114 +117 +119 +121 +124 +126 +131 +135 +139 +143 +147 +152 +155 +158 +161 +164 +167 +168 +169 +170 +171 +171 +169 +167 +163 +154 +141 +126 +100 +73 +52 +49 +45 +40 +36 +35 +36 +44 +58 +73 +84 +88 +88 +87 +86 +83 +79 +74 +71 +67 +62 +60 +59 +66 +84 +115 +162 +188 +204 +211 +212 +201 +184 +162 +137 +112 +84 +69 +60 +55 +53 +51 +51 +50 +50 +49 +49 +49 +48 +48 +48 +48 +48 +48 +48 +48 +48 +49 +49 +49 +50 +50 +51 +52 +53 +55 +60 +66 +74 +84 +95 +110 +121 +130 +136 +140 +141 +142 +141 +140 +137 +131 +120 +106 +92 +78 +67 +64 +62 +61 +60 +60 +60 +61 +62 +63 +66 +68 +69 +70 +71 +71 +71 +71 +70 +70 +69 +68 +68 +67 +66 +65 +65 +64 +64 +64 +64 +66 +68 +71 +72 +72 +72 +71 +70 +70 +70 +73 +74 +75 +75 +75 +77 +79 +81 +80 +78 +79 +93 +120 +161 +173 +172 +166 +146 +103 +34 +12 +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 +36 +33 +30 +27 +27 +25 +25 +25 +25 +25 +25 +26 +25 +25 +25 +24 +24 +24 +24 +23 +17 +12 +9 +8 +12 +20 +27 +35 +44 +58 +79 +87 +91 +91 +91 +91 +89 +84 +75 +63 +54 +53 +53 +54 +54 +51 +43 +36 +31 +31 +33 +35 +36 +37 +40 +46 +52 +58 +64 +69 +74 +77 +80 +82 +85 +88 +91 +93 +96 +99 +102 +105 +107 +110 +112 +115 +117 +119 +121 +123 +125 +127 +129 +131 +133 +136 +139 +142 +145 +149 +155 +159 +162 +165 +168 +171 +172 +174 +175 +176 +177 +178 +178 +179 +179 +179 +178 +178 +176 +173 +161 +150 +130 +102 +68 +52 +48 +42 +37 +35 +37 +47 +61 +75 +85 +89 +90 +89 +87 +84 +80 +77 +74 +71 +67 +62 +60 +59 +62 +72 +113 +148 +178 +200 +210 +212 +207 +198 +184 +164 +134 +112 +92 +75 +64 +57 +55 +53 +52 +51 +51 +50 +50 +50 +50 +50 +51 +51 +52 +53 +55 +58 +61 +65 +71 +80 +89 +98 +107 +117 +129 +135 +140 +142 +144 +145 +146 +146 +145 +143 +139 +133 +123 +111 +98 +81 +73 +68 +64 +63 +62 +61 +61 +61 +61 +62 +63 +65 +67 +69 +71 +72 +72 +72 +72 +72 +71 +71 +70 +70 +69 +68 +68 +67 +66 +65 +65 +65 +65 +65 +67 +69 +71 +72 +72 +72 +71 +71 +70 +70 +72 +76 +77 +78 +77 +76 +77 +78 +79 +79 +78 +79 +93 +121 +163 +174 +173 +167 +148 +107 +37 +14 +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 +37 +33 +30 +27 +26 +25 +25 +26 +26 +26 +27 +27 +28 +27 +27 +25 +24 +24 +24 +24 +23 +22 +21 +20 +22 +35 +45 +52 +57 +63 +77 +84 +89 +90 +90 +90 +89 +86 +81 +72 +63 +60 +58 +57 +54 +44 +36 +32 +32 +33 +35 +36 +37 +38 +40 +48 +55 +63 +69 +75 +81 +84 +88 +91 +94 +98 +101 +104 +107 +110 +114 +116 +119 +121 +124 +127 +129 +131 +134 +136 +139 +142 +145 +148 +152 +157 +161 +165 +168 +171 +174 +175 +176 +177 +177 +178 +179 +179 +179 +180 +180 +180 +180 +180 +180 +180 +180 +180 +180 +179 +173 +164 +150 +126 +92 +59 +51 +45 +41 +38 +39 +47 +61 +75 +86 +91 +91 +91 +89 +86 +81 +77 +75 +73 +70 +66 +62 +60 +59 +62 +80 +109 +140 +170 +195 +209 +210 +207 +201 +193 +175 +157 +139 +121 +104 +87 +78 +71 +67 +64 +62 +62 +63 +64 +66 +70 +74 +79 +85 +91 +99 +106 +112 +118 +123 +128 +131 +135 +138 +141 +143 +144 +144 +144 +143 +139 +134 +127 +120 +112 +100 +92 +85 +79 +74 +68 +65 +63 +62 +62 +61 +61 +62 +63 +64 +66 +68 +70 +71 +72 +73 +73 +73 +73 +73 +72 +72 +71 +71 +70 +69 +68 +68 +67 +67 +66 +66 +67 +67 +68 +70 +71 +72 +72 +72 +72 +71 +71 +71 +71 +74 +79 +80 +80 +79 +77 +77 +78 +78 +78 +77 +79 +94 +123 +165 +174 +173 +168 +150 +110 +39 +14 +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 +38 +34 +30 +27 +26 +25 +25 +26 +26 +27 +27 +27 +28 +29 +29 +27 +25 +24 +24 +24 +24 +25 +27 +31 +35 +46 +57 +66 +72 +75 +81 +85 +87 +88 +89 +89 +89 +88 +85 +79 +70 +66 +62 +56 +49 +36 +32 +31 +32 +34 +36 +37 +38 +39 +41 +50 +59 +67 +75 +81 +87 +90 +94 +98 +101 +105 +109 +112 +115 +118 +121 +124 +126 +129 +131 +135 +137 +140 +143 +146 +150 +154 +158 +163 +167 +172 +175 +178 +179 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +181 +179 +174 +165 +148 +118 +75 +59 +49 +43 +41 +41 +48 +60 +74 +85 +92 +93 +92 +90 +87 +82 +78 +76 +74 +72 +69 +65 +62 +59 +58 +64 +80 +103 +131 +162 +191 +202 +207 +207 +205 +196 +187 +175 +163 +149 +132 +122 +114 +108 +104 +101 +101 +103 +104 +107 +112 +116 +120 +124 +128 +133 +136 +139 +141 +143 +144 +144 +144 +142 +140 +135 +130 +126 +121 +116 +108 +102 +96 +90 +84 +76 +71 +68 +66 +64 +63 +62 +62 +62 +62 +63 +64 +65 +67 +69 +71 +72 +73 +74 +74 +74 +74 +74 +74 +74 +73 +72 +72 +71 +71 +70 +69 +69 +68 +68 +68 +68 +69 +69 +70 +71 +72 +72 +72 +72 +72 +71 +71 +71 +72 +77 +82 +84 +84 +82 +77 +77 +77 +77 +77 +77 +78 +95 +125 +166 +175 +174 +168 +151 +113 +41 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +40 +36 +32 +28 +26 +25 +25 +25 +26 +26 +26 +26 +27 +29 +30 +29 +26 +24 +23 +23 +23 +24 +28 +34 +39 +47 +59 +71 +81 +85 +86 +86 +87 +87 +88 +88 +88 +87 +86 +83 +76 +69 +62 +53 +42 +32 +31 +31 +32 +35 +37 +38 +39 +40 +43 +54 +64 +72 +79 +85 +91 +95 +99 +103 +107 +112 +115 +118 +121 +124 +128 +131 +133 +136 +139 +143 +146 +149 +152 +155 +161 +166 +171 +175 +178 +182 +183 +183 +183 +183 +182 +182 +182 +181 +181 +181 +181 +182 +182 +182 +182 +182 +182 +182 +182 +181 +181 +181 +181 +181 +181 +180 +176 +165 +145 +98 +72 +55 +47 +44 +44 +49 +59 +73 +85 +93 +94 +94 +92 +89 +84 +80 +77 +75 +73 +71 +69 +65 +61 +58 +59 +63 +75 +94 +120 +158 +181 +195 +203 +205 +204 +201 +197 +191 +184 +173 +165 +158 +153 +148 +145 +145 +145 +147 +148 +150 +151 +152 +151 +151 +149 +146 +144 +140 +137 +133 +130 +126 +121 +116 +108 +102 +96 +89 +83 +76 +72 +69 +67 +65 +64 +64 +63 +63 +63 +63 +63 +64 +64 +65 +67 +69 +70 +72 +73 +75 +75 +76 +76 +76 +75 +75 +75 +75 +74 +74 +73 +72 +72 +72 +71 +70 +70 +70 +70 +70 +70 +71 +71 +72 +72 +72 +72 +72 +72 +72 +71 +71 +72 +73 +81 +86 +88 +87 +86 +78 +77 +76 +76 +76 +76 +78 +96 +127 +168 +176 +174 +169 +152 +115 +43 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +45 +42 +36 +30 +26 +24 +24 +24 +24 +25 +24 +24 +26 +28 +29 +29 +26 +24 +23 +23 +24 +24 +23 +23 +24 +32 +48 +64 +77 +85 +89 +89 +89 +88 +88 +87 +86 +86 +85 +83 +77 +69 +59 +48 +36 +31 +31 +31 +33 +36 +39 +40 +41 +42 +44 +57 +67 +76 +83 +89 +95 +100 +105 +109 +113 +118 +122 +125 +128 +132 +136 +139 +142 +145 +148 +153 +157 +160 +165 +169 +177 +181 +184 +186 +186 +185 +184 +184 +183 +182 +181 +181 +181 +181 +181 +182 +182 +183 +183 +184 +185 +185 +184 +184 +183 +182 +181 +181 +181 +181 +182 +182 +181 +178 +168 +127 +91 +66 +51 +46 +46 +49 +58 +71 +84 +93 +95 +95 +94 +91 +86 +82 +79 +76 +73 +72 +71 +68 +65 +60 +59 +59 +62 +68 +81 +112 +141 +167 +188 +199 +203 +201 +199 +197 +194 +190 +187 +183 +180 +176 +173 +170 +167 +165 +162 +159 +157 +154 +151 +148 +142 +135 +127 +119 +110 +98 +90 +83 +78 +73 +69 +68 +66 +65 +65 +64 +64 +64 +64 +63 +63 +63 +63 +63 +64 +65 +66 +68 +69 +71 +73 +74 +75 +76 +77 +77 +77 +77 +77 +77 +76 +76 +75 +75 +75 +74 +73 +73 +73 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +73 +75 +86 +90 +92 +92 +90 +80 +77 +76 +76 +76 +76 +78 +97 +129 +170 +176 +174 +169 +152 +117 +45 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +26 +33 +36 +37 +36 +34 +32 +30 +30 +30 +32 +32 +32 +30 +29 +23 +22 +22 +22 +23 +26 +28 +28 +28 +26 +25 +27 +33 +44 +59 +77 +83 +87 +89 +89 +88 +87 +86 +84 +82 +77 +69 +59 +48 +37 +32 +32 +33 +36 +41 +42 +42 +42 +44 +49 +65 +76 +85 +92 +98 +106 +111 +116 +120 +125 +130 +134 +137 +141 +144 +149 +153 +156 +160 +163 +169 +173 +179 +184 +189 +191 +190 +190 +188 +187 +183 +181 +180 +180 +180 +180 +181 +182 +184 +186 +189 +191 +194 +196 +198 +199 +199 +199 +198 +196 +192 +188 +184 +182 +181 +181 +181 +182 +182 +181 +166 +131 +95 +66 +50 +47 +48 +54 +65 +80 +93 +96 +97 +97 +94 +89 +85 +81 +78 +75 +72 +72 +71 +69 +66 +61 +60 +59 +60 +61 +68 +84 +105 +128 +151 +175 +185 +191 +192 +192 +189 +186 +183 +179 +176 +171 +167 +163 +158 +152 +141 +131 +120 +108 +97 +84 +78 +73 +70 +67 +66 +65 +65 +64 +64 +64 +64 +64 +64 +65 +65 +65 +65 +66 +66 +67 +69 +70 +71 +73 +74 +75 +76 +77 +77 +78 +79 +79 +79 +79 +79 +78 +78 +77 +77 +76 +76 +75 +75 +75 +74 +74 +74 +74 +74 +73 +73 +73 +73 +73 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +72 +73 +74 +77 +81 +92 +97 +99 +98 +96 +84 +78 +76 +75 +75 +75 +78 +99 +132 +172 +177 +175 +169 +153 +119 +47 +18 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +16 +18 +19 +20 +21 +21 +21 +21 +22 +22 +22 +22 +22 +22 +21 +21 +21 +23 +25 +29 +34 +36 +36 +36 +35 +30 +29 +29 +33 +37 +46 +53 +61 +70 +79 +86 +87 +86 +85 +83 +78 +72 +63 +52 +41 +37 +38 +41 +44 +45 +43 +42 +43 +47 +56 +73 +83 +91 +98 +104 +112 +117 +121 +126 +130 +136 +140 +144 +148 +151 +156 +160 +163 +168 +172 +179 +184 +188 +191 +192 +192 +189 +186 +183 +180 +179 +179 +179 +180 +182 +185 +188 +190 +193 +196 +200 +203 +205 +207 +209 +210 +211 +211 +210 +209 +206 +202 +197 +192 +186 +182 +181 +182 +182 +182 +177 +157 +126 +92 +62 +49 +49 +52 +60 +74 +90 +96 +99 +99 +98 +92 +87 +83 +79 +76 +73 +72 +72 +71 +69 +65 +63 +61 +59 +59 +61 +67 +76 +89 +104 +125 +138 +149 +158 +164 +166 +166 +163 +159 +154 +145 +136 +127 +117 +107 +96 +89 +83 +79 +75 +71 +70 +68 +68 +67 +67 +68 +69 +69 +70 +71 +72 +72 +73 +74 +74 +75 +75 +76 +77 +77 +78 +78 +79 +79 +80 +80 +80 +80 +81 +80 +80 +80 +80 +79 +79 +78 +78 +77 +77 +76 +76 +75 +75 +75 +75 +74 +74 +74 +74 +74 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +72 +72 +72 +73 +73 +75 +78 +81 +86 +97 +103 +104 +104 +101 +87 +80 +76 +75 +74 +75 +78 +100 +134 +173 +178 +175 +170 +154 +120 +48 +18 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +19 +19 +19 +19 +19 +20 +20 +20 +20 +20 +20 +20 +21 +22 +23 +25 +27 +30 +34 +37 +41 +42 +43 +42 +42 +38 +35 +33 +32 +31 +34 +37 +42 +49 +57 +65 +72 +78 +82 +82 +80 +76 +70 +63 +53 +50 +51 +52 +51 +47 +43 +42 +46 +53 +66 +81 +89 +97 +104 +110 +117 +122 +127 +132 +136 +143 +147 +151 +155 +159 +164 +167 +172 +178 +183 +189 +192 +193 +194 +192 +187 +182 +179 +178 +176 +178 +180 +183 +185 +188 +191 +194 +197 +200 +203 +207 +210 +212 +214 +215 +217 +217 +217 +217 +216 +215 +212 +208 +203 +197 +188 +184 +182 +182 +182 +181 +173 +153 +122 +86 +56 +51 +50 +55 +65 +85 +93 +98 +100 +100 +96 +90 +85 +81 +77 +74 +73 +72 +71 +70 +68 +66 +64 +61 +59 +58 +60 +63 +68 +75 +87 +97 +106 +115 +122 +127 +127 +125 +121 +116 +107 +99 +92 +86 +80 +74 +72 +70 +70 +70 +71 +72 +73 +74 +75 +76 +77 +77 +78 +79 +79 +80 +80 +81 +81 +81 +82 +82 +82 +82 +83 +83 +83 +83 +83 +82 +82 +82 +82 +82 +81 +81 +80 +80 +79 +78 +78 +78 +77 +77 +76 +76 +76 +75 +75 +75 +75 +75 +74 +74 +74 +74 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +73 +74 +75 +78 +82 +87 +92 +103 +108 +110 +110 +107 +91 +82 +77 +75 +74 +74 +78 +101 +136 +175 +179 +175 +170 +154 +121 +49 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +29 +28 +28 +27 +26 +26 +25 +25 +25 +25 +25 +26 +27 +28 +30 +33 +37 +40 +42 +45 +46 +47 +47 +47 +47 +46 +43 +40 +38 +35 +34 +34 +33 +34 +37 +42 +51 +62 +70 +73 +75 +76 +74 +70 +64 +61 +59 +57 +52 +46 +42 +45 +52 +63 +76 +89 +96 +103 +110 +116 +123 +129 +134 +139 +144 +150 +154 +159 +163 +167 +172 +177 +183 +189 +193 +196 +196 +194 +191 +186 +179 +175 +174 +175 +177 +181 +184 +188 +191 +193 +196 +199 +202 +205 +209 +213 +215 +216 +218 +219 +219 +220 +220 +220 +220 +220 +219 +216 +213 +209 +199 +190 +185 +183 +182 +182 +181 +171 +151 +118 +72 +58 +51 +52 +57 +76 +88 +96 +101 +102 +100 +95 +89 +83 +78 +75 +74 +73 +72 +71 +70 +69 +67 +64 +61 +59 +59 +59 +60 +61 +64 +68 +73 +78 +84 +88 +88 +86 +84 +80 +74 +71 +70 +69 +69 +70 +71 +72 +73 +75 +77 +79 +81 +82 +83 +84 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +85 +84 +84 +84 +83 +83 +82 +82 +81 +81 +80 +80 +79 +79 +78 +78 +77 +77 +77 +76 +76 +76 +76 +75 +75 +75 +75 +75 +75 +74 +74 +74 +74 +73 +73 +73 +73 +73 +73 +74 +74 +74 +75 +76 +78 +82 +87 +93 +98 +109 +114 +116 +116 +113 +96 +84 +78 +75 +74 +74 +78 +103 +139 +176 +179 +175 +170 +154 +122 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +38 +38 +38 +37 +37 +36 +36 +35 +35 +35 +35 +36 +37 +39 +40 +43 +45 +46 +47 +48 +50 +50 +50 +50 +50 +49 +48 +46 +44 +42 +39 +37 +35 +34 +34 +34 +35 +37 +42 +48 +59 +65 +66 +65 +63 +58 +52 +46 +42 +40 +42 +51 +64 +76 +86 +96 +103 +110 +117 +123 +130 +136 +141 +147 +152 +158 +163 +167 +171 +175 +182 +188 +194 +198 +199 +198 +195 +189 +182 +173 +172 +172 +174 +177 +183 +189 +190 +192 +193 +194 +198 +201 +205 +210 +213 +217 +219 +220 +220 +221 +221 +221 +221 +221 +221 +221 +222 +221 +219 +216 +210 +202 +193 +185 +183 +183 +182 +181 +172 +153 +101 +72 +56 +50 +51 +63 +80 +92 +99 +103 +103 +100 +94 +87 +80 +76 +74 +73 +72 +71 +71 +71 +70 +68 +65 +61 +59 +59 +59 +60 +60 +61 +62 +63 +64 +65 +65 +65 +65 +65 +65 +66 +67 +69 +71 +74 +77 +79 +81 +83 +84 +85 +85 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +86 +85 +85 +85 +85 +85 +85 +85 +84 +84 +84 +83 +82 +82 +81 +80 +80 +79 +79 +78 +78 +78 +77 +77 +77 +77 +76 +76 +76 +76 +76 +76 +76 +76 +76 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +75 +76 +77 +78 +79 +83 +88 +94 +100 +105 +114 +120 +122 +122 +120 +101 +87 +79 +75 +73 +74 +78 +104 +141 +177 +180 +176 +170 +155 +122 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +51 +51 +50 +50 +50 +49 +49 +49 +49 +49 +49 +49 +50 +51 +52 +54 +55 +56 +57 +58 +60 +60 +60 +60 +60 +59 +57 +56 +54 +52 +50 +48 +46 +44 +42 +39 +38 +37 +37 +37 +38 +39 +39 +39 +39 +39 +39 +40 +42 +46 +61 +72 +81 +89 +95 +106 +113 +120 +126 +131 +139 +145 +150 +155 +161 +167 +171 +176 +180 +186 +195 +200 +201 +201 +199 +190 +177 +170 +167 +168 +172 +179 +184 +188 +190 +191 +191 +192 +193 +196 +203 +209 +213 +216 +218 +219 +219 +219 +218 +216 +213 +213 +213 +214 +216 +219 +221 +222 +223 +223 +219 +215 +207 +198 +188 +183 +183 +183 +181 +177 +147 +110 +79 +58 +50 +51 +62 +77 +91 +100 +104 +104 +102 +97 +90 +80 +76 +74 +72 +72 +71 +71 +71 +70 +69 +67 +64 +63 +61 +61 +61 +60 +60 +60 +61 +61 +62 +63 +64 +65 +68 +71 +73 +75 +76 +77 +76 +75 +73 +70 +67 +66 +66 +67 +68 +69 +71 +74 +77 +79 +81 +81 +82 +82 +83 +83 +83 +83 +83 +83 +82 +82 +82 +82 +81 +81 +80 +80 +80 +79 +79 +79 +78 +78 +78 +78 +78 +78 +78 +79 +79 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +80 +79 +80 +80 +80 +81 +82 +83 +84 +87 +92 +97 +103 +109 +113 +121 +127 +129 +130 +128 +110 +93 +82 +76 +73 +74 +79 +106 +144 +178 +180 +176 +170 +155 +123 +51 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +60 +60 +60 +60 +59 +59 +59 +59 +58 +58 +59 +59 +59 +60 +61 +62 +63 +64 +65 +65 +66 +67 +67 +67 +66 +65 +64 +63 +61 +60 +58 +56 +55 +53 +51 +49 +48 +46 +45 +43 +43 +43 +43 +43 +44 +46 +48 +52 +58 +65 +76 +83 +90 +97 +104 +114 +121 +127 +132 +138 +146 +152 +157 +162 +168 +174 +179 +184 +190 +197 +201 +202 +201 +196 +186 +171 +168 +167 +168 +173 +183 +186 +188 +189 +190 +189 +189 +191 +194 +200 +207 +211 +214 +216 +217 +215 +212 +208 +203 +199 +196 +194 +195 +196 +198 +203 +209 +215 +219 +222 +222 +220 +216 +208 +199 +187 +184 +183 +182 +181 +169 +141 +109 +80 +58 +50 +54 +63 +76 +92 +102 +103 +103 +101 +97 +88 +82 +77 +74 +72 +71 +71 +71 +70 +70 +69 +68 +66 +65 +64 +62 +61 +61 +61 +61 +62 +63 +65 +67 +70 +73 +74 +74 +73 +70 +65 +61 +57 +54 +52 +50 +49 +48 +47 +47 +49 +50 +52 +54 +56 +62 +66 +71 +74 +77 +79 +80 +81 +81 +81 +81 +81 +81 +81 +81 +80 +80 +80 +80 +79 +79 +79 +80 +80 +81 +82 +82 +83 +84 +85 +86 +86 +86 +87 +87 +87 +87 +88 +88 +87 +87 +87 +87 +86 +86 +86 +86 +86 +86 +86 +87 +88 +89 +91 +95 +99 +105 +110 +115 +118 +124 +131 +134 +135 +134 +117 +98 +84 +77 +73 +74 +79 +108 +145 +179 +180 +176 +170 +155 +123 +51 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +70 +70 +69 +69 +69 +69 +68 +68 +68 +68 +68 +68 +69 +69 +70 +71 +71 +72 +72 +73 +73 +73 +73 +73 +73 +72 +71 +70 +69 +67 +65 +64 +63 +61 +60 +58 +57 +56 +55 +53 +52 +52 +52 +53 +55 +58 +62 +66 +72 +78 +86 +92 +99 +106 +113 +122 +128 +134 +139 +145 +153 +159 +164 +170 +174 +181 +187 +193 +198 +203 +203 +200 +191 +181 +171 +163 +165 +170 +176 +182 +188 +189 +189 +188 +186 +186 +187 +191 +196 +202 +209 +211 +213 +213 +211 +206 +200 +195 +190 +186 +184 +184 +185 +186 +189 +194 +198 +204 +210 +216 +222 +223 +221 +217 +209 +196 +188 +185 +183 +183 +179 +163 +138 +107 +77 +55 +52 +54 +63 +77 +95 +100 +102 +102 +100 +95 +89 +84 +79 +75 +72 +72 +71 +71 +70 +70 +69 +68 +67 +66 +64 +63 +62 +62 +63 +65 +67 +69 +71 +73 +74 +72 +69 +65 +61 +57 +55 +53 +53 +52 +52 +53 +53 +52 +51 +49 +47 +45 +44 +44 +47 +50 +54 +57 +61 +67 +70 +74 +76 +78 +79 +80 +80 +80 +80 +80 +80 +80 +80 +81 +81 +82 +83 +84 +86 +88 +89 +90 +91 +92 +93 +94 +94 +94 +95 +95 +95 +95 +95 +95 +95 +95 +94 +94 +94 +93 +93 +93 +93 +93 +94 +95 +97 +99 +102 +106 +111 +115 +119 +122 +127 +134 +138 +140 +139 +125 +103 +88 +78 +74 +74 +80 +109 +147 +180 +181 +176 +170 +154 +123 +51 +20 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +79 +79 +79 +79 +79 +78 +78 +78 +78 +78 +78 +78 +78 +78 +79 +79 +79 +80 +80 +80 +81 +81 +80 +80 +80 +79 +78 +77 +76 +75 +73 +72 +71 +70 +69 +68 +67 +66 +65 +64 +64 +64 +65 +66 +68 +72 +75 +80 +84 +89 +95 +102 +109 +115 +122 +129 +135 +141 +146 +152 +160 +166 +171 +177 +181 +189 +195 +201 +205 +205 +200 +190 +177 +165 +160 +163 +170 +178 +185 +189 +189 +188 +186 +184 +183 +183 +186 +191 +198 +204 +208 +210 +210 +208 +203 +195 +189 +184 +180 +178 +178 +180 +181 +183 +186 +189 +192 +195 +200 +207 +218 +222 +223 +222 +218 +206 +195 +188 +185 +184 +183 +178 +162 +137 +105 +69 +57 +51 +53 +61 +83 +94 +99 +101 +101 +99 +95 +91 +86 +81 +76 +74 +73 +72 +71 +71 +70 +70 +69 +68 +66 +66 +66 +66 +67 +70 +72 +74 +74 +74 +71 +66 +61 +57 +54 +53 +54 +55 +57 +59 +62 +64 +66 +67 +66 +62 +58 +53 +48 +44 +41 +40 +40 +42 +45 +51 +56 +61 +65 +69 +72 +74 +76 +77 +78 +79 +80 +80 +81 +82 +83 +85 +87 +89 +91 +94 +95 +97 +98 +99 +100 +101 +101 +102 +102 +103 +103 +103 +103 +103 +102 +102 +102 +102 +101 +101 +101 +100 +101 +101 +101 +102 +104 +106 +109 +113 +116 +120 +123 +125 +129 +137 +142 +144 +144 +133 +110 +92 +79 +74 +74 +80 +110 +149 +180 +181 +176 +169 +154 +123 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +89 +88 +88 +88 +88 +88 +87 +87 +87 +87 +87 +87 +87 +87 +88 +88 +88 +88 +88 +88 +88 +88 +87 +87 +86 +85 +84 +83 +82 +81 +80 +79 +78 +77 +76 +76 +75 +75 +75 +75 +75 +76 +78 +80 +83 +86 +90 +94 +99 +107 +113 +119 +124 +129 +137 +142 +148 +153 +159 +167 +173 +178 +183 +188 +198 +204 +206 +206 +204 +188 +168 +159 +157 +159 +171 +182 +188 +190 +189 +187 +183 +181 +180 +180 +181 +185 +192 +198 +204 +206 +206 +205 +201 +196 +187 +182 +178 +176 +176 +177 +179 +181 +183 +186 +189 +192 +195 +198 +200 +209 +217 +222 +224 +223 +216 +205 +195 +187 +184 +184 +183 +177 +163 +137 +93 +70 +55 +49 +51 +64 +82 +94 +99 +99 +98 +96 +94 +92 +88 +83 +80 +76 +74 +73 +72 +71 +71 +71 +70 +70 +71 +72 +73 +75 +76 +76 +75 +74 +71 +62 +56 +53 +52 +52 +53 +53 +55 +56 +59 +63 +67 +72 +76 +80 +82 +80 +75 +68 +59 +48 +42 +39 +37 +37 +38 +39 +42 +45 +50 +57 +62 +66 +70 +73 +76 +78 +80 +81 +82 +84 +87 +89 +92 +95 +98 +99 +101 +102 +103 +104 +105 +106 +107 +108 +108 +109 +109 +109 +109 +109 +109 +108 +108 +108 +108 +107 +107 +107 +108 +108 +109 +110 +112 +114 +117 +119 +122 +125 +128 +131 +139 +145 +149 +149 +141 +117 +97 +81 +75 +75 +81 +111 +150 +181 +181 +176 +170 +154 +122 +50 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +101 +101 +101 +101 +101 +101 +100 +100 +100 +100 +100 +99 +99 +99 +99 +99 +99 +99 +99 +99 +98 +98 +98 +97 +97 +96 +95 +94 +93 +92 +91 +90 +90 +89 +88 +88 +87 +87 +87 +87 +88 +89 +90 +92 +94 +98 +101 +105 +109 +113 +119 +124 +129 +134 +140 +147 +152 +157 +163 +169 +177 +182 +187 +193 +200 +207 +208 +206 +198 +182 +154 +153 +155 +161 +176 +189 +190 +190 +188 +183 +178 +178 +179 +179 +179 +181 +186 +192 +199 +202 +203 +203 +200 +195 +187 +178 +174 +172 +172 +174 +178 +182 +187 +192 +195 +198 +199 +199 +200 +201 +204 +209 +216 +222 +224 +223 +217 +207 +197 +187 +184 +184 +183 +179 +170 +135 +104 +78 +59 +49 +50 +59 +74 +88 +96 +95 +94 +94 +92 +91 +89 +87 +85 +83 +81 +79 +78 +78 +77 +77 +77 +78 +78 +78 +78 +77 +75 +71 +65 +57 +52 +51 +51 +52 +52 +52 +53 +53 +53 +53 +57 +63 +71 +78 +85 +91 +92 +91 +87 +81 +71 +63 +56 +49 +44 +39 +38 +38 +38 +39 +40 +42 +45 +49 +53 +60 +66 +71 +75 +79 +83 +86 +89 +92 +95 +99 +100 +102 +103 +104 +106 +107 +108 +109 +110 +111 +112 +112 +112 +113 +113 +113 +113 +113 +113 +112 +112 +113 +113 +113 +114 +115 +115 +116 +118 +120 +121 +124 +127 +130 +133 +141 +148 +153 +154 +149 +128 +105 +85 +76 +75 +82 +113 +152 +182 +182 +176 +170 +154 +121 +48 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +111 +111 +111 +110 +110 +110 +110 +110 +109 +109 +109 +109 +108 +108 +108 +108 +107 +107 +107 +107 +106 +106 +105 +105 +104 +103 +103 +102 +101 +100 +99 +98 +98 +97 +96 +96 +96 +96 +96 +97 +98 +99 +100 +102 +104 +108 +111 +114 +118 +122 +128 +133 +138 +143 +147 +154 +159 +164 +170 +176 +183 +188 +194 +201 +207 +208 +206 +193 +176 +157 +150 +154 +165 +178 +187 +190 +189 +186 +181 +178 +177 +177 +177 +178 +178 +180 +187 +193 +198 +201 +202 +201 +196 +189 +180 +173 +171 +171 +174 +178 +188 +196 +202 +207 +211 +213 +213 +212 +210 +207 +206 +209 +213 +218 +223 +225 +222 +215 +206 +195 +186 +185 +184 +183 +179 +160 +133 +105 +80 +61 +49 +52 +59 +71 +84 +92 +92 +91 +90 +88 +88 +87 +86 +85 +83 +82 +81 +81 +80 +80 +80 +80 +79 +79 +78 +74 +69 +63 +57 +52 +51 +51 +51 +52 +52 +52 +52 +53 +53 +53 +56 +61 +68 +77 +87 +96 +100 +100 +98 +93 +84 +76 +68 +61 +54 +48 +45 +42 +41 +39 +40 +41 +43 +46 +49 +55 +61 +66 +71 +76 +81 +85 +89 +92 +95 +99 +101 +102 +104 +105 +107 +108 +110 +111 +112 +113 +113 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +114 +115 +115 +116 +117 +118 +119 +121 +122 +125 +129 +132 +136 +142 +150 +156 +158 +155 +136 +112 +89 +77 +76 +82 +114 +153 +182 +182 +176 +170 +153 +119 +47 +18 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +120 +120 +120 +120 +120 +120 +119 +119 +119 +119 +118 +118 +118 +117 +117 +116 +116 +116 +115 +115 +114 +114 +113 +112 +112 +111 +110 +109 +108 +108 +107 +106 +105 +105 +105 +104 +104 +105 +105 +106 +107 +108 +110 +112 +114 +117 +121 +124 +128 +132 +137 +141 +146 +150 +155 +161 +166 +171 +177 +182 +189 +196 +202 +207 +209 +206 +191 +173 +157 +147 +153 +166 +178 +187 +191 +189 +185 +180 +177 +176 +176 +176 +177 +178 +178 +181 +188 +194 +198 +200 +200 +197 +191 +183 +175 +171 +171 +173 +179 +187 +200 +208 +214 +219 +222 +223 +223 +221 +220 +217 +212 +211 +213 +216 +221 +225 +224 +220 +214 +204 +191 +187 +185 +184 +183 +175 +157 +133 +106 +81 +58 +52 +52 +58 +69 +82 +87 +87 +86 +85 +84 +84 +84 +84 +84 +83 +82 +82 +81 +81 +81 +80 +78 +77 +74 +67 +61 +56 +52 +50 +50 +50 +51 +51 +51 +51 +51 +52 +53 +53 +55 +60 +67 +77 +87 +100 +105 +107 +106 +103 +94 +86 +78 +70 +63 +56 +52 +48 +46 +44 +43 +43 +43 +45 +48 +54 +59 +64 +69 +74 +80 +85 +89 +92 +96 +99 +102 +104 +106 +107 +110 +111 +113 +114 +115 +116 +117 +117 +117 +117 +117 +117 +116 +116 +116 +116 +116 +116 +116 +116 +117 +118 +118 +119 +120 +123 +124 +127 +131 +135 +139 +144 +152 +159 +162 +159 +145 +120 +94 +78 +77 +83 +115 +153 +182 +182 +177 +170 +153 +118 +46 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +130 +130 +129 +129 +129 +129 +129 +128 +128 +127 +127 +127 +126 +126 +125 +125 +124 +123 +123 +122 +121 +121 +120 +119 +118 +117 +117 +116 +115 +114 +114 +113 +113 +113 +113 +113 +113 +114 +114 +116 +117 +119 +121 +123 +127 +130 +133 +137 +140 +145 +149 +153 +157 +162 +168 +173 +178 +184 +188 +196 +203 +208 +210 +208 +194 +169 +153 +145 +149 +164 +180 +188 +190 +189 +184 +179 +176 +175 +175 +176 +177 +177 +178 +179 +182 +188 +194 +197 +198 +197 +193 +186 +178 +171 +170 +172 +178 +187 +199 +212 +219 +224 +226 +228 +228 +228 +228 +227 +225 +220 +216 +215 +216 +219 +224 +225 +224 +220 +212 +198 +190 +187 +185 +185 +183 +174 +157 +134 +107 +76 +60 +53 +52 +55 +69 +77 +81 +82 +81 +79 +79 +79 +80 +80 +81 +81 +81 +81 +80 +79 +77 +75 +71 +67 +58 +53 +51 +49 +49 +50 +50 +49 +49 +48 +49 +50 +52 +53 +53 +55 +59 +67 +77 +88 +102 +109 +113 +113 +111 +102 +94 +86 +78 +71 +63 +58 +55 +52 +50 +48 +47 +47 +48 +50 +55 +60 +65 +69 +74 +80 +85 +89 +93 +97 +101 +103 +106 +108 +110 +113 +115 +116 +118 +119 +120 +121 +121 +121 +121 +120 +120 +120 +119 +119 +118 +118 +118 +118 +118 +119 +120 +120 +121 +123 +126 +127 +130 +133 +138 +143 +147 +154 +161 +165 +164 +152 +128 +100 +80 +78 +84 +115 +154 +183 +182 +177 +170 +152 +116 +44 +17 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +139 +139 +139 +139 +139 +139 +138 +138 +138 +137 +137 +136 +136 +135 +135 +134 +133 +132 +132 +131 +130 +129 +128 +128 +127 +126 +125 +124 +123 +123 +122 +122 +121 +121 +121 +121 +121 +121 +122 +123 +125 +126 +128 +130 +132 +136 +139 +142 +145 +149 +153 +157 +161 +165 +168 +174 +180 +185 +190 +194 +205 +210 +211 +209 +204 +164 +147 +142 +146 +158 +185 +190 +191 +189 +185 +177 +175 +175 +175 +175 +176 +178 +179 +180 +181 +183 +188 +193 +196 +196 +195 +190 +182 +174 +169 +170 +174 +184 +197 +210 +222 +226 +228 +229 +229 +230 +230 +229 +229 +229 +228 +223 +220 +218 +219 +223 +225 +225 +224 +219 +206 +196 +189 +186 +185 +185 +183 +175 +159 +136 +101 +78 +62 +53 +50 +55 +62 +70 +75 +75 +73 +71 +70 +70 +72 +75 +77 +78 +78 +78 +75 +72 +67 +62 +56 +50 +49 +48 +48 +49 +49 +48 +47 +46 +46 +46 +49 +51 +52 +53 +55 +59 +67 +78 +90 +105 +113 +118 +119 +117 +109 +102 +94 +86 +78 +69 +64 +60 +57 +55 +54 +54 +55 +56 +57 +60 +63 +67 +71 +75 +81 +86 +90 +94 +98 +103 +105 +108 +111 +113 +116 +118 +120 +121 +123 +124 +125 +125 +125 +125 +125 +125 +124 +124 +123 +123 +122 +122 +122 +122 +122 +123 +124 +125 +126 +129 +131 +134 +137 +142 +147 +150 +156 +163 +167 +167 +160 +136 +106 +82 +80 +85 +116 +155 +183 +182 +177 +170 +152 +114 +43 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +152 +152 +152 +152 +151 +151 +151 +151 +150 +150 +149 +149 +148 +147 +147 +145 +145 +144 +143 +142 +141 +140 +139 +138 +137 +136 +135 +134 +133 +133 +132 +132 +131 +131 +131 +131 +132 +132 +133 +134 +136 +138 +140 +142 +144 +147 +150 +153 +156 +159 +163 +167 +170 +173 +177 +184 +188 +193 +198 +206 +212 +212 +208 +194 +162 +138 +138 +148 +165 +186 +191 +190 +187 +182 +176 +174 +174 +175 +176 +179 +182 +183 +183 +183 +183 +184 +188 +192 +194 +195 +193 +185 +176 +170 +169 +171 +182 +197 +211 +223 +229 +229 +229 +230 +230 +230 +230 +230 +230 +230 +229 +228 +226 +223 +221 +223 +225 +226 +226 +224 +216 +206 +196 +189 +186 +186 +186 +184 +179 +168 +141 +116 +92 +72 +57 +49 +50 +53 +57 +64 +68 +67 +65 +62 +60 +57 +58 +59 +60 +60 +59 +58 +55 +52 +49 +47 +47 +47 +47 +47 +46 +44 +43 +43 +43 +45 +48 +51 +53 +53 +55 +61 +70 +81 +93 +109 +117 +123 +125 +124 +117 +109 +101 +93 +85 +76 +70 +66 +63 +62 +61 +62 +63 +64 +66 +69 +71 +73 +76 +79 +84 +89 +94 +98 +102 +106 +109 +112 +114 +117 +120 +122 +123 +125 +126 +127 +128 +128 +129 +129 +130 +130 +130 +130 +129 +129 +129 +129 +129 +129 +130 +130 +131 +132 +134 +137 +139 +142 +144 +149 +154 +156 +160 +165 +170 +170 +166 +146 +116 +86 +82 +88 +118 +155 +183 +182 +177 +169 +150 +111 +40 +15 +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 +161 +161 +161 +161 +161 +161 +160 +160 +160 +159 +159 +158 +157 +156 +156 +154 +153 +152 +151 +150 +149 +148 +147 +146 +144 +143 +142 +141 +141 +140 +139 +139 +139 +139 +139 +139 +139 +140 +141 +142 +144 +146 +148 +150 +152 +156 +158 +161 +164 +166 +170 +173 +176 +180 +184 +190 +194 +199 +206 +212 +213 +209 +191 +165 +141 +136 +148 +165 +181 +190 +190 +186 +181 +177 +175 +174 +175 +178 +182 +186 +187 +187 +185 +184 +183 +184 +188 +191 +193 +193 +191 +181 +173 +169 +168 +174 +190 +206 +219 +226 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +229 +229 +228 +226 +224 +224 +225 +226 +226 +225 +220 +212 +203 +194 +188 +186 +186 +186 +184 +180 +163 +144 +122 +100 +79 +60 +54 +52 +53 +56 +59 +60 +60 +59 +58 +55 +53 +52 +50 +49 +48 +48 +47 +46 +45 +45 +46 +46 +46 +45 +43 +42 +41 +41 +42 +46 +49 +51 +53 +54 +56 +63 +73 +85 +97 +113 +121 +127 +130 +129 +121 +113 +105 +96 +87 +78 +73 +69 +67 +66 +66 +67 +68 +70 +71 +73 +74 +76 +79 +82 +88 +93 +97 +101 +105 +109 +112 +114 +117 +120 +122 +124 +126 +127 +128 +130 +130 +131 +131 +131 +132 +132 +132 +132 +132 +133 +133 +134 +134 +135 +135 +137 +138 +139 +140 +143 +146 +149 +151 +155 +160 +162 +164 +168 +172 +172 +170 +152 +124 +91 +85 +90 +119 +156 +183 +182 +177 +169 +149 +108 +38 +14 +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 +171 +171 +171 +171 +170 +170 +170 +170 +169 +169 +168 +167 +166 +166 +165 +163 +162 +161 +160 +158 +157 +156 +154 +153 +152 +151 +150 +149 +148 +148 +147 +147 +146 +146 +146 +147 +147 +148 +149 +150 +152 +154 +156 +158 +161 +164 +166 +169 +171 +173 +177 +180 +183 +186 +191 +195 +200 +206 +212 +214 +211 +193 +167 +144 +133 +144 +164 +180 +189 +190 +186 +181 +177 +175 +174 +175 +179 +185 +190 +193 +193 +192 +188 +185 +184 +184 +188 +190 +192 +192 +189 +178 +171 +168 +168 +178 +198 +213 +224 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +226 +225 +226 +226 +226 +226 +223 +218 +209 +200 +192 +187 +187 +187 +186 +185 +178 +165 +148 +128 +107 +82 +68 +59 +54 +53 +54 +56 +56 +57 +56 +54 +52 +49 +47 +46 +44 +43 +43 +42 +42 +43 +43 +43 +43 +42 +41 +41 +41 +41 +43 +47 +50 +52 +53 +54 +58 +67 +77 +89 +102 +117 +127 +133 +135 +134 +125 +116 +107 +98 +89 +80 +75 +72 +70 +70 +70 +71 +72 +74 +75 +76 +77 +79 +82 +86 +92 +97 +101 +104 +107 +112 +115 +117 +120 +123 +125 +127 +129 +130 +132 +133 +133 +134 +134 +134 +135 +135 +135 +135 +135 +136 +137 +138 +138 +139 +141 +142 +143 +145 +147 +150 +153 +155 +158 +161 +166 +167 +169 +171 +174 +174 +172 +158 +132 +96 +87 +92 +121 +157 +183 +182 +177 +169 +147 +105 +36 +13 +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 +180 +180 +180 +180 +180 +180 +180 +179 +179 +178 +177 +177 +176 +175 +174 +172 +171 +169 +168 +167 +165 +163 +162 +161 +159 +158 +157 +156 +155 +155 +154 +154 +154 +154 +154 +154 +155 +155 +157 +158 +160 +162 +164 +166 +168 +171 +174 +176 +178 +180 +184 +186 +189 +193 +196 +201 +207 +212 +215 +214 +201 +169 +145 +133 +136 +161 +180 +189 +190 +188 +180 +177 +175 +174 +175 +179 +186 +193 +199 +200 +200 +197 +191 +185 +183 +184 +187 +190 +191 +191 +186 +175 +169 +167 +168 +184 +205 +219 +227 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +227 +227 +227 +227 +227 +225 +221 +215 +207 +198 +189 +188 +187 +187 +187 +186 +180 +169 +155 +136 +109 +91 +75 +64 +57 +54 +53 +54 +54 +54 +54 +52 +50 +48 +46 +44 +42 +41 +40 +40 +40 +41 +41 +41 +41 +40 +41 +41 +42 +45 +49 +52 +53 +54 +55 +61 +72 +83 +94 +106 +123 +133 +139 +141 +138 +129 +118 +108 +98 +89 +80 +76 +74 +73 +73 +73 +74 +75 +76 +77 +78 +80 +83 +86 +91 +96 +100 +104 +107 +110 +115 +118 +121 +123 +126 +129 +131 +132 +134 +135 +136 +137 +137 +138 +138 +138 +138 +138 +138 +139 +140 +140 +141 +142 +144 +145 +147 +149 +150 +152 +156 +159 +161 +164 +167 +171 +173 +174 +175 +176 +176 +175 +163 +140 +102 +91 +95 +123 +158 +183 +182 +177 +168 +146 +101 +33 +12 +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 +190 +190 +190 +190 +190 +189 +189 +189 +188 +188 +187 +186 +185 +184 +183 +181 +180 +178 +177 +175 +173 +171 +169 +168 +166 +164 +163 +162 +161 +161 +160 +160 +160 +160 +160 +160 +161 +162 +163 +165 +167 +170 +172 +174 +176 +179 +181 +183 +185 +187 +189 +192 +195 +199 +201 +208 +214 +216 +215 +213 +174 +142 +131 +135 +149 +184 +189 +190 +188 +182 +176 +174 +173 +174 +177 +187 +196 +203 +207 +208 +207 +201 +193 +185 +183 +183 +187 +189 +190 +189 +184 +173 +167 +167 +169 +191 +212 +223 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +228 +228 +227 +227 +226 +224 +219 +213 +204 +192 +189 +187 +187 +187 +188 +187 +183 +175 +163 +140 +121 +102 +85 +70 +59 +53 +51 +51 +52 +52 +52 +51 +50 +48 +45 +43 +42 +41 +40 +40 +40 +40 +40 +40 +41 +41 +43 +45 +48 +51 +53 +54 +55 +56 +66 +78 +89 +100 +112 +130 +141 +146 +146 +143 +131 +119 +108 +97 +88 +80 +77 +76 +75 +75 +76 +76 +77 +77 +78 +80 +83 +87 +91 +96 +101 +104 +107 +111 +114 +118 +121 +124 +127 +129 +132 +134 +135 +137 +138 +139 +140 +140 +141 +141 +142 +142 +143 +143 +144 +145 +145 +146 +147 +148 +150 +151 +153 +155 +157 +160 +163 +166 +169 +172 +176 +178 +178 +178 +178 +178 +177 +168 +146 +108 +94 +99 +126 +160 +184 +182 +177 +167 +144 +97 +30 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +202 +202 +202 +202 +202 +202 +202 +202 +201 +201 +200 +199 +198 +196 +195 +193 +191 +189 +188 +186 +184 +182 +180 +179 +177 +176 +175 +174 +173 +172 +172 +171 +171 +171 +171 +172 +173 +174 +175 +177 +179 +181 +183 +185 +186 +189 +190 +192 +193 +195 +197 +200 +203 +206 +210 +217 +217 +216 +208 +185 +133 +129 +136 +154 +183 +191 +190 +186 +181 +175 +172 +172 +175 +181 +190 +202 +208 +212 +215 +215 +214 +205 +194 +185 +182 +183 +185 +187 +188 +188 +181 +171 +166 +166 +170 +199 +217 +226 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +228 +228 +227 +225 +223 +219 +213 +201 +193 +189 +188 +188 +188 +188 +188 +187 +183 +172 +158 +143 +126 +108 +87 +75 +64 +57 +53 +53 +52 +52 +51 +51 +50 +48 +47 +46 +44 +43 +43 +43 +43 +43 +45 +46 +48 +50 +51 +53 +54 +55 +57 +61 +77 +89 +99 +109 +122 +143 +153 +156 +154 +147 +131 +117 +104 +93 +85 +79 +77 +76 +76 +77 +77 +78 +78 +80 +82 +87 +91 +95 +98 +102 +106 +109 +112 +116 +119 +124 +127 +129 +132 +134 +137 +138 +140 +141 +142 +143 +143 +144 +145 +146 +147 +148 +149 +150 +151 +153 +154 +155 +156 +157 +159 +160 +161 +163 +164 +167 +169 +171 +173 +176 +181 +182 +182 +182 +181 +180 +179 +173 +154 +117 +100 +104 +130 +162 +184 +181 +177 +166 +140 +91 +26 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +212 +212 +212 +212 +212 +212 +212 +212 +211 +211 +210 +209 +207 +206 +205 +202 +200 +198 +196 +194 +191 +188 +186 +184 +182 +180 +179 +178 +177 +177 +177 +176 +176 +176 +177 +177 +178 +179 +181 +182 +185 +187 +189 +190 +192 +194 +196 +198 +199 +201 +204 +207 +209 +212 +215 +218 +218 +209 +189 +149 +128 +134 +153 +175 +189 +190 +187 +181 +176 +171 +171 +175 +182 +190 +199 +208 +212 +215 +216 +217 +215 +206 +195 +186 +182 +182 +184 +186 +187 +186 +180 +169 +165 +166 +171 +203 +220 +227 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +227 +226 +224 +221 +217 +207 +199 +193 +189 +188 +188 +188 +189 +189 +188 +184 +176 +166 +154 +139 +118 +104 +90 +78 +68 +59 +56 +54 +53 +52 +51 +50 +50 +49 +48 +47 +47 +47 +47 +48 +48 +49 +50 +52 +53 +54 +54 +56 +62 +71 +87 +97 +106 +118 +133 +156 +162 +163 +158 +147 +127 +112 +100 +90 +83 +78 +77 +77 +77 +78 +79 +80 +83 +85 +88 +93 +96 +99 +102 +106 +110 +113 +117 +120 +124 +128 +131 +134 +136 +138 +140 +142 +143 +144 +145 +146 +147 +148 +149 +151 +152 +154 +155 +156 +158 +159 +160 +162 +163 +164 +165 +167 +168 +169 +170 +172 +174 +175 +176 +178 +182 +184 +184 +184 +183 +182 +181 +175 +159 +123 +105 +109 +134 +164 +184 +181 +176 +164 +137 +86 +24 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +221 +221 +221 +222 +222 +222 +222 +222 +221 +221 +220 +218 +217 +215 +214 +211 +209 +207 +205 +203 +200 +197 +195 +192 +190 +187 +186 +184 +183 +183 +182 +182 +182 +182 +182 +183 +185 +186 +188 +190 +193 +195 +197 +199 +200 +202 +204 +205 +207 +208 +211 +213 +215 +216 +218 +219 +214 +192 +162 +132 +130 +150 +171 +187 +191 +188 +182 +176 +171 +169 +173 +181 +190 +199 +206 +212 +215 +216 +217 +217 +216 +207 +196 +186 +182 +182 +184 +185 +186 +185 +179 +168 +164 +165 +172 +206 +221 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +228 +226 +224 +223 +220 +213 +205 +198 +192 +189 +188 +188 +189 +190 +190 +190 +187 +182 +174 +164 +147 +133 +119 +105 +92 +77 +70 +64 +59 +56 +53 +52 +51 +51 +50 +50 +50 +50 +50 +50 +51 +51 +52 +53 +54 +55 +57 +62 +71 +83 +97 +105 +116 +130 +148 +168 +171 +168 +159 +144 +121 +106 +95 +86 +81 +78 +78 +78 +79 +81 +83 +86 +88 +91 +94 +98 +101 +104 +107 +110 +115 +119 +122 +126 +129 +133 +135 +138 +140 +142 +144 +145 +146 +148 +149 +151 +152 +153 +155 +157 +159 +160 +162 +163 +165 +166 +168 +169 +170 +171 +172 +173 +174 +175 +176 +177 +178 +179 +180 +181 +184 +185 +186 +186 +185 +183 +182 +178 +162 +129 +110 +114 +137 +166 +184 +181 +176 +163 +133 +81 +21 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +231 +231 +231 +231 +232 +232 +232 +232 +231 +231 +230 +229 +227 +225 +223 +220 +218 +215 +213 +210 +207 +205 +203 +200 +198 +195 +193 +192 +190 +189 +189 +188 +188 +188 +189 +191 +192 +194 +197 +199 +202 +204 +205 +207 +208 +210 +211 +212 +213 +214 +216 +217 +218 +219 +219 +217 +201 +169 +138 +127 +143 +170 +185 +190 +189 +184 +176 +171 +168 +170 +179 +189 +198 +205 +210 +214 +216 +217 +218 +218 +216 +208 +197 +187 +182 +181 +183 +184 +184 +184 +178 +168 +163 +165 +172 +208 +222 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +229 +228 +226 +225 +223 +222 +217 +211 +204 +197 +191 +188 +188 +189 +189 +190 +192 +192 +190 +188 +183 +171 +160 +147 +134 +120 +103 +91 +81 +73 +66 +60 +57 +55 +53 +52 +52 +52 +51 +52 +52 +52 +53 +54 +54 +55 +58 +64 +73 +83 +94 +105 +114 +128 +145 +165 +179 +178 +170 +157 +138 +114 +100 +89 +83 +79 +78 +79 +81 +83 +85 +89 +92 +95 +97 +100 +103 +106 +109 +112 +116 +121 +124 +128 +131 +134 +137 +140 +142 +144 +145 +148 +149 +151 +152 +154 +156 +158 +160 +162 +164 +166 +168 +169 +171 +172 +174 +175 +175 +176 +177 +178 +179 +179 +180 +181 +182 +182 +183 +183 +183 +185 +186 +187 +187 +186 +185 +184 +180 +166 +135 +115 +119 +141 +168 +183 +181 +176 +161 +129 +75 +18 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +240 +241 +241 +241 +242 +242 +241 +241 +241 +241 +241 +240 +239 +237 +235 +231 +227 +223 +219 +215 +212 +209 +207 +206 +204 +202 +200 +199 +198 +197 +196 +196 +196 +197 +197 +199 +201 +203 +205 +207 +209 +210 +211 +212 +213 +214 +214 +215 +216 +217 +218 +219 +219 +220 +219 +213 +173 +142 +127 +130 +170 +186 +191 +189 +186 +179 +170 +167 +168 +173 +189 +196 +203 +208 +212 +216 +217 +218 +218 +218 +216 +209 +198 +187 +181 +181 +182 +183 +183 +183 +178 +167 +163 +164 +171 +208 +222 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +230 +229 +227 +225 +224 +223 +221 +216 +209 +202 +195 +190 +188 +188 +188 +189 +191 +193 +194 +194 +193 +188 +181 +171 +161 +148 +131 +118 +106 +95 +85 +74 +68 +63 +59 +56 +54 +54 +53 +54 +54 +55 +55 +55 +56 +57 +66 +77 +87 +97 +104 +114 +127 +144 +163 +182 +187 +182 +169 +151 +129 +105 +93 +85 +80 +79 +80 +82 +85 +88 +91 +95 +98 +100 +102 +105 +108 +111 +115 +118 +122 +127 +130 +134 +137 +139 +142 +144 +146 +148 +150 +152 +154 +155 +157 +160 +163 +165 +168 +170 +172 +174 +176 +177 +178 +179 +180 +181 +182 +182 +183 +183 +184 +184 +184 +185 +185 +185 +186 +186 +186 +187 +187 +188 +188 +187 +186 +185 +181 +169 +141 +121 +124 +145 +170 +183 +181 +176 +159 +125 +70 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +252 +251 +249 +246 +244 +241 +240 +239 +239 +240 +241 +241 +242 +243 +243 +242 +241 +240 +237 +233 +226 +221 +216 +212 +210 +207 +206 +205 +204 +204 +203 +203 +203 +204 +204 +206 +208 +210 +212 +214 +215 +215 +216 +216 +217 +217 +218 +219 +220 +221 +221 +221 +221 +219 +214 +162 +133 +125 +136 +166 +192 +191 +189 +185 +181 +166 +164 +166 +172 +185 +195 +201 +207 +212 +216 +218 +219 +219 +219 +219 +217 +209 +199 +189 +182 +181 +181 +182 +182 +182 +178 +168 +163 +163 +168 +206 +222 +228 +229 +229 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +230 +230 +229 +227 +226 +224 +223 +222 +220 +216 +210 +202 +194 +191 +189 +188 +188 +189 +191 +193 +195 +197 +197 +195 +191 +185 +177 +163 +152 +140 +128 +117 +104 +95 +87 +81 +75 +69 +66 +64 +62 +61 +61 +62 +65 +70 +78 +90 +97 +103 +110 +118 +135 +153 +172 +187 +196 +192 +177 +157 +134 +112 +91 +84 +82 +81 +82 +87 +91 +95 +98 +100 +103 +105 +107 +110 +113 +117 +120 +124 +128 +131 +135 +138 +141 +143 +146 +148 +150 +152 +154 +157 +160 +162 +165 +168 +171 +174 +176 +178 +180 +182 +183 +185 +186 +186 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +187 +188 +188 +188 +188 +189 +188 +187 +186 +183 +172 +147 +127 +131 +150 +172 +183 +180 +175 +155 +118 +62 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +180 +181 +182 +185 +190 +194 +199 +200 +200 +198 +196 +198 +201 +205 +211 +220 +227 +233 +236 +235 +233 +230 +226 +221 +217 +213 +210 +209 +208 +207 +207 +207 +207 +208 +209 +213 +215 +216 +216 +216 +215 +215 +215 +215 +215 +217 +218 +219 +219 +216 +203 +192 +178 +161 +143 +124 +124 +141 +165 +186 +192 +189 +186 +181 +173 +162 +162 +168 +177 +188 +198 +205 +211 +215 +218 +219 +219 +219 +219 +219 +217 +211 +201 +191 +184 +180 +181 +181 +181 +181 +178 +169 +163 +161 +165 +200 +220 +227 +228 +228 +228 +228 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +229 +230 +230 +230 +230 +230 +230 +230 +229 +227 +226 +224 +223 +222 +222 +219 +214 +208 +199 +194 +191 +189 +188 +188 +190 +191 +194 +196 +198 +199 +198 +195 +190 +180 +170 +160 +149 +139 +125 +115 +107 +99 +92 +85 +81 +78 +76 +76 +78 +81 +85 +90 +96 +102 +107 +114 +125 +138 +158 +175 +189 +198 +200 +187 +165 +140 +117 +99 +86 +84 +83 +85 +89 +94 +98 +100 +103 +105 +108 +110 +113 +116 +119 +124 +128 +131 +135 +138 +142 +144 +147 +149 +151 +154 +157 +159 +162 +164 +168 +171 +174 +177 +179 +182 +184 +186 +187 +188 +188 +189 +189 +189 +189 +189 +189 +189 +189 +189 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +188 +189 +189 +189 +189 +188 +187 +184 +174 +150 +132 +136 +154 +175 +183 +180 +174 +151 +112 +56 +10 +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 +148 +162 +177 +189 +197 +202 +206 +207 +207 +205 +204 +204 +204 +204 +204 +208 +214 +220 +226 +232 +235 +234 +232 +228 +224 +219 +216 +213 +212 +211 +210 +211 +212 +214 +216 +219 +218 +217 +212 +202 +197 +198 +201 +203 +203 +198 +187 +175 +160 +145 +132 +128 +125 +121 +115 +121 +140 +164 +184 +193 +190 +186 +182 +176 +164 +159 +162 +170 +180 +190 +202 +209 +214 +217 +219 +219 +219 +219 +219 +219 +218 +212 +204 +194 +186 +181 +180 +180 +181 +180 +178 +170 +163 +160 +162 +193 +216 +226 +228 +228 +228 +228 +228 +229 +229 +229 +229 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +229 +227 +226 +224 +223 +223 +222 +221 +218 +212 +203 +197 +193 +190 +189 +188 +189 +190 +192 +194 +198 +200 +201 +201 +198 +192 +185 +176 +167 +157 +144 +134 +126 +118 +111 +103 +99 +97 +95 +95 +96 +99 +102 +105 +108 +114 +122 +133 +146 +160 +179 +192 +201 +203 +198 +173 +146 +122 +103 +90 +85 +86 +88 +92 +97 +101 +104 +106 +108 +110 +114 +117 +120 +124 +127 +132 +136 +139 +142 +145 +148 +151 +153 +155 +158 +161 +164 +167 +170 +173 +177 +180 +183 +185 +187 +189 +189 +190 +191 +191 +192 +192 +192 +192 +192 +191 +191 +191 +191 +191 +190 +190 +190 +190 +190 +189 +189 +189 +189 +189 +189 +189 +189 +189 +189 +188 +188 +185 +176 +153 +137 +140 +158 +177 +183 +180 +173 +147 +105 +49 +9 +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 +152 +178 +200 +216 +224 +226 +226 +226 +226 +226 +226 +225 +222 +217 +211 +207 +206 +209 +214 +223 +232 +234 +234 +232 +230 +225 +222 +219 +216 +215 +215 +216 +218 +220 +222 +217 +205 +194 +182 +165 +154 +155 +156 +157 +153 +140 +123 +105 +86 +71 +71 +80 +94 +108 +119 +141 +168 +185 +194 +193 +186 +184 +178 +169 +157 +157 +163 +172 +183 +193 +206 +213 +216 +218 +219 +219 +219 +219 +219 +219 +219 +214 +207 +197 +189 +182 +180 +180 +180 +180 +178 +171 +164 +160 +160 +184 +211 +224 +228 +228 +228 +228 +228 +228 +228 +229 +229 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +228 +227 +225 +224 +223 +223 +223 +222 +220 +215 +207 +200 +195 +192 +190 +189 +188 +189 +190 +193 +197 +200 +203 +204 +204 +200 +195 +188 +181 +172 +160 +151 +143 +136 +129 +122 +118 +116 +114 +113 +113 +114 +115 +118 +121 +131 +143 +156 +170 +182 +197 +204 +206 +201 +188 +151 +124 +105 +92 +87 +88 +91 +95 +100 +104 +108 +110 +112 +114 +117 +121 +125 +128 +132 +136 +141 +144 +147 +149 +152 +155 +157 +160 +163 +166 +170 +173 +177 +180 +183 +186 +188 +190 +192 +193 +193 +194 +194 +194 +194 +195 +195 +195 +195 +195 +194 +194 +194 +194 +194 +193 +193 +192 +192 +192 +192 +191 +191 +191 +191 +191 +190 +190 +190 +190 +189 +188 +186 +177 +156 +141 +145 +162 +179 +183 +180 +171 +143 +98 +43 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +186 +210 +221 +226 +227 +227 +226 +226 +225 +225 +225 +225 +225 +225 +224 +217 +210 +207 +207 +210 +225 +231 +234 +234 +234 +230 +228 +225 +222 +220 +221 +223 +224 +224 +222 +202 +160 +129 +109 +98 +83 +72 +62 +50 +36 +23 +23 +28 +39 +54 +80 +99 +114 +128 +143 +177 +190 +195 +193 +189 +184 +181 +172 +161 +153 +154 +162 +173 +184 +196 +210 +215 +217 +218 +218 +219 +219 +219 +219 +219 +219 +217 +210 +202 +192 +184 +181 +180 +179 +179 +178 +172 +165 +160 +158 +174 +205 +222 +228 +228 +228 +228 +227 +227 +228 +228 +229 +229 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +230 +229 +228 +226 +225 +224 +223 +223 +223 +223 +221 +218 +209 +203 +198 +194 +191 +189 +189 +189 +190 +192 +197 +200 +203 +205 +206 +205 +201 +196 +190 +184 +174 +166 +159 +152 +145 +139 +134 +131 +127 +125 +123 +123 +126 +132 +141 +159 +171 +181 +190 +199 +208 +210 +205 +192 +165 +123 +103 +92 +88 +88 +93 +98 +103 +107 +109 +112 +114 +117 +120 +124 +129 +133 +137 +141 +145 +149 +151 +154 +156 +159 +163 +166 +169 +173 +176 +181 +184 +187 +190 +192 +194 +195 +195 +196 +196 +197 +198 +198 +199 +199 +199 +199 +199 +199 +199 +199 +199 +199 +198 +198 +197 +197 +196 +196 +196 +195 +195 +194 +193 +193 +192 +192 +191 +191 +190 +189 +189 +187 +178 +159 +145 +150 +165 +180 +183 +179 +170 +138 +91 +37 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +197 +216 +224 +226 +226 +224 +223 +223 +223 +224 +224 +224 +224 +225 +225 +224 +218 +212 +207 +207 +211 +220 +228 +233 +234 +233 +232 +229 +227 +227 +230 +230 +218 +184 +115 +59 +41 +27 +18 +11 +8 +5 +4 +6 +10 +28 +49 +73 +97 +118 +135 +141 +152 +166 +185 +196 +196 +193 +189 +184 +182 +174 +162 +152 +150 +152 +160 +172 +186 +201 +214 +216 +217 +217 +217 +218 +219 +219 +219 +220 +220 +219 +215 +208 +199 +188 +183 +180 +179 +179 +178 +174 +167 +161 +158 +162 +190 +212 +226 +228 +228 +227 +227 +227 +227 +227 +228 +228 +229 +229 +229 +229 +230 +230 +230 +230 +229 +229 +229 +228 +226 +225 +224 +224 +224 +223 +223 +223 +222 +218 +210 +203 +198 +194 +191 +189 +189 +189 +190 +193 +198 +201 +204 +207 +209 +209 +207 +204 +199 +192 +183 +176 +169 +163 +157 +149 +145 +143 +141 +141 +146 +153 +162 +171 +180 +188 +194 +200 +206 +211 +211 +204 +182 +151 +117 +95 +92 +92 +94 +99 +107 +111 +114 +116 +118 +122 +125 +129 +133 +138 +143 +147 +151 +154 +157 +160 +163 +166 +169 +173 +178 +181 +185 +188 +191 +194 +196 +197 +198 +199 +200 +200 +201 +202 +203 +204 +204 +204 +205 +205 +205 +206 +206 +206 +206 +206 +206 +205 +205 +204 +204 +203 +202 +202 +201 +200 +200 +199 +198 +197 +196 +195 +194 +193 +192 +190 +189 +187 +179 +161 +151 +156 +170 +182 +183 +179 +166 +130 +80 +29 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +205 +219 +225 +226 +225 +223 +223 +223 +223 +224 +224 +224 +224 +224 +225 +225 +222 +216 +210 +207 +211 +219 +227 +232 +234 +234 +233 +232 +231 +231 +226 +189 +138 +87 +47 +24 +17 +12 +8 +6 +4 +5 +13 +27 +50 +83 +103 +120 +133 +141 +152 +162 +175 +186 +194 +197 +194 +189 +185 +183 +181 +167 +156 +149 +148 +150 +158 +172 +188 +205 +216 +216 +216 +216 +216 +217 +219 +219 +219 +220 +220 +220 +218 +214 +206 +193 +186 +182 +179 +179 +177 +175 +169 +163 +158 +159 +177 +200 +220 +227 +228 +227 +227 +227 +227 +227 +227 +227 +227 +228 +228 +228 +228 +228 +228 +228 +228 +227 +227 +226 +225 +225 +224 +224 +224 +224 +224 +223 +220 +216 +207 +201 +196 +193 +190 +189 +190 +191 +194 +197 +202 +206 +209 +211 +212 +212 +210 +207 +204 +198 +190 +184 +178 +173 +168 +164 +163 +163 +164 +167 +172 +177 +183 +188 +192 +199 +204 +209 +211 +212 +199 +171 +142 +116 +101 +94 +95 +98 +103 +108 +114 +116 +119 +122 +125 +131 +135 +140 +144 +148 +154 +157 +161 +164 +168 +173 +176 +180 +184 +187 +191 +193 +196 +197 +199 +200 +201 +202 +203 +203 +204 +205 +205 +205 +206 +206 +206 +207 +207 +207 +207 +207 +208 +208 +208 +208 +208 +208 +207 +207 +207 +207 +206 +205 +205 +204 +203 +202 +201 +200 +199 +197 +196 +195 +193 +191 +190 +187 +180 +162 +154 +160 +172 +183 +183 +178 +162 +123 +72 +24 +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 +207 +220 +225 +226 +225 +222 +222 +223 +224 +225 +224 +224 +224 +224 +225 +225 +223 +217 +211 +209 +211 +219 +227 +233 +234 +234 +234 +233 +230 +222 +171 +117 +70 +34 +16 +8 +6 +5 +4 +3 +6 +19 +39 +65 +92 +120 +134 +145 +153 +159 +171 +181 +190 +196 +197 +195 +190 +186 +184 +183 +176 +160 +151 +147 +147 +149 +157 +172 +191 +209 +217 +216 +215 +213 +213 +216 +218 +219 +220 +220 +220 +221 +220 +217 +212 +200 +191 +185 +180 +179 +177 +176 +172 +166 +159 +157 +166 +187 +210 +225 +228 +227 +227 +227 +227 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +225 +225 +224 +224 +224 +224 +224 +223 +221 +217 +211 +203 +197 +194 +191 +191 +192 +194 +197 +200 +204 +208 +210 +212 +214 +214 +213 +211 +209 +206 +202 +197 +192 +188 +184 +181 +180 +179 +180 +182 +184 +189 +192 +195 +199 +203 +207 +210 +211 +206 +194 +161 +134 +114 +101 +97 +99 +104 +108 +113 +117 +121 +124 +128 +132 +136 +143 +148 +152 +156 +160 +165 +170 +174 +178 +182 +186 +190 +192 +195 +197 +199 +200 +201 +202 +203 +204 +204 +204 +205 +205 +206 +206 +206 +207 +207 +207 +207 +207 +207 +208 +208 +208 +208 +208 +209 +209 +209 +209 +209 +209 +209 +209 +209 +208 +208 +207 +206 +205 +204 +204 +202 +200 +199 +197 +194 +191 +190 +188 +180 +164 +158 +164 +175 +183 +183 +177 +158 +115 +64 +19 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +206 +220 +225 +225 +225 +222 +221 +222 +224 +225 +224 +224 +224 +224 +225 +224 +222 +217 +212 +210 +214 +222 +229 +233 +235 +234 +233 +227 +210 +180 +95 +48 +22 +11 +6 +4 +4 +4 +4 +5 +18 +45 +75 +104 +126 +143 +151 +159 +166 +175 +187 +194 +198 +198 +196 +193 +187 +185 +184 +183 +170 +155 +148 +147 +147 +148 +156 +173 +194 +213 +216 +215 +212 +211 +211 +215 +217 +219 +219 +220 +220 +221 +221 +220 +217 +207 +197 +189 +183 +179 +177 +176 +173 +169 +161 +157 +159 +173 +195 +218 +226 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +225 +224 +224 +224 +224 +224 +223 +221 +217 +211 +205 +197 +193 +191 +190 +191 +195 +199 +202 +206 +209 +212 +213 +214 +215 +214 +213 +211 +209 +206 +204 +201 +198 +196 +194 +193 +192 +192 +193 +194 +196 +199 +201 +203 +206 +209 +211 +208 +199 +183 +159 +121 +106 +100 +100 +102 +108 +114 +118 +122 +125 +130 +134 +139 +145 +150 +157 +161 +166 +170 +174 +179 +183 +187 +191 +194 +198 +200 +201 +202 +203 +203 +203 +203 +204 +204 +204 +204 +204 +204 +204 +204 +204 +205 +205 +205 +206 +206 +207 +207 +207 +208 +208 +208 +208 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +209 +209 +208 +207 +206 +205 +203 +201 +199 +196 +192 +191 +188 +180 +165 +161 +168 +177 +184 +182 +176 +152 +106 +55 +15 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +205 +219 +225 +225 +225 +222 +221 +221 +222 +224 +225 +225 +225 +225 +225 +222 +218 +215 +213 +212 +219 +228 +233 +235 +235 +234 +230 +207 +161 +88 +28 +15 +7 +4 +3 +3 +3 +3 +5 +10 +44 +81 +110 +130 +144 +157 +166 +174 +183 +191 +198 +199 +199 +197 +194 +188 +185 +184 +184 +183 +162 +151 +147 +147 +147 +148 +156 +174 +197 +214 +216 +213 +210 +207 +208 +213 +216 +217 +219 +220 +220 +221 +221 +221 +221 +215 +205 +195 +187 +180 +177 +176 +174 +171 +165 +157 +156 +161 +176 +203 +224 +226 +227 +227 +227 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +225 +225 +225 +225 +225 +224 +224 +224 +224 +224 +222 +216 +209 +202 +196 +190 +188 +188 +190 +192 +197 +200 +204 +207 +210 +212 +213 +214 +214 +213 +212 +210 +208 +205 +203 +201 +200 +199 +198 +197 +197 +198 +199 +201 +203 +206 +208 +210 +211 +212 +208 +193 +166 +136 +111 +102 +102 +104 +108 +114 +119 +122 +125 +128 +133 +140 +146 +152 +158 +163 +170 +176 +181 +187 +191 +196 +199 +200 +201 +202 +202 +203 +203 +204 +204 +204 +203 +203 +202 +202 +201 +201 +201 +200 +200 +199 +199 +199 +200 +201 +202 +203 +204 +205 +206 +207 +207 +208 +208 +208 +209 +209 +209 +210 +210 +210 +210 +211 +211 +211 +211 +211 +210 +209 +209 +207 +206 +204 +201 +198 +193 +192 +188 +180 +166 +164 +172 +180 +184 +182 +175 +145 +97 +47 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +198 +216 +224 +225 +226 +222 +221 +221 +221 +221 +221 +221 +221 +220 +219 +217 +217 +217 +220 +225 +232 +234 +234 +234 +232 +216 +166 +106 +52 +21 +8 +4 +3 +2 +2 +3 +3 +5 +15 +39 +91 +117 +137 +152 +166 +180 +187 +193 +197 +199 +200 +199 +197 +193 +191 +186 +185 +185 +184 +180 +155 +149 +147 +147 +147 +148 +155 +176 +200 +216 +216 +210 +205 +202 +203 +208 +211 +214 +216 +218 +219 +220 +221 +221 +222 +220 +215 +207 +197 +187 +179 +177 +175 +173 +171 +161 +157 +156 +160 +171 +205 +219 +225 +227 +227 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +225 +225 +225 +224 +224 +224 +223 +222 +220 +216 +207 +200 +194 +190 +187 +186 +186 +187 +189 +191 +195 +197 +199 +201 +202 +204 +204 +204 +204 +204 +203 +203 +202 +202 +202 +201 +201 +201 +201 +202 +204 +206 +207 +208 +208 +209 +209 +207 +201 +186 +149 +125 +111 +105 +104 +106 +111 +116 +121 +125 +132 +137 +144 +150 +157 +165 +171 +177 +182 +188 +194 +197 +199 +200 +201 +201 +202 +202 +202 +201 +199 +198 +196 +194 +192 +188 +184 +181 +177 +174 +171 +170 +169 +168 +168 +168 +169 +171 +173 +176 +180 +184 +187 +191 +195 +200 +202 +205 +206 +208 +209 +209 +209 +210 +210 +210 +210 +211 +212 +212 +212 +212 +212 +211 +211 +210 +208 +207 +204 +200 +194 +192 +188 +180 +168 +167 +176 +182 +184 +182 +171 +134 +84 +36 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +189 +211 +221 +224 +226 +224 +223 +222 +221 +221 +221 +221 +221 +221 +221 +221 +223 +226 +228 +230 +233 +232 +227 +215 +191 +127 +80 +45 +21 +9 +4 +2 +2 +2 +2 +2 +4 +14 +36 +73 +117 +139 +157 +171 +182 +191 +194 +197 +199 +200 +199 +197 +195 +193 +190 +186 +186 +186 +183 +176 +152 +150 +149 +149 +148 +149 +156 +178 +203 +216 +215 +208 +202 +198 +198 +202 +206 +209 +211 +214 +216 +218 +220 +220 +221 +221 +219 +214 +207 +196 +184 +179 +176 +174 +172 +166 +160 +157 +157 +160 +178 +201 +215 +223 +226 +226 +226 +225 +225 +225 +225 +225 +225 +225 +224 +224 +224 +223 +223 +222 +219 +216 +212 +208 +202 +196 +192 +189 +187 +186 +186 +186 +188 +189 +191 +193 +195 +196 +198 +199 +200 +201 +201 +202 +202 +202 +202 +203 +203 +203 +204 +205 +206 +206 +207 +207 +207 +207 +207 +206 +200 +187 +171 +153 +136 +120 +114 +111 +112 +116 +121 +126 +130 +134 +139 +146 +152 +159 +166 +174 +183 +188 +191 +194 +196 +199 +200 +200 +199 +198 +196 +192 +188 +184 +179 +172 +167 +162 +158 +154 +151 +149 +147 +145 +143 +141 +140 +139 +139 +139 +141 +142 +144 +146 +149 +154 +158 +163 +169 +175 +184 +189 +195 +199 +203 +206 +208 +209 +210 +210 +210 +210 +211 +211 +212 +213 +213 +212 +212 +212 +211 +210 +208 +206 +201 +195 +193 +187 +179 +169 +170 +179 +183 +184 +181 +168 +124 +73 +29 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +175 +202 +215 +221 +225 +224 +224 +223 +223 +222 +222 +222 +223 +223 +224 +225 +226 +228 +229 +228 +222 +205 +181 +149 +111 +56 +30 +14 +6 +3 +2 +1 +2 +2 +2 +3 +8 +30 +64 +104 +141 +160 +174 +185 +192 +196 +198 +199 +200 +199 +198 +196 +194 +192 +190 +186 +187 +187 +183 +173 +152 +152 +152 +151 +149 +149 +157 +180 +205 +216 +214 +205 +198 +194 +192 +195 +199 +202 +205 +208 +212 +215 +217 +218 +220 +221 +220 +218 +214 +206 +193 +185 +180 +176 +173 +170 +164 +159 +156 +155 +162 +178 +196 +211 +221 +225 +225 +225 +225 +224 +224 +223 +223 +222 +221 +220 +219 +218 +216 +214 +210 +207 +203 +199 +195 +191 +189 +188 +187 +186 +187 +188 +189 +191 +192 +195 +196 +198 +199 +200 +202 +202 +203 +204 +205 +206 +206 +206 +207 +207 +208 +208 +208 +208 +207 +205 +202 +197 +189 +180 +164 +151 +138 +126 +117 +113 +115 +117 +120 +125 +132 +138 +144 +150 +157 +167 +173 +179 +184 +189 +194 +196 +197 +198 +197 +193 +190 +185 +180 +175 +168 +163 +158 +154 +149 +144 +140 +137 +134 +132 +130 +129 +128 +128 +127 +126 +125 +125 +125 +125 +125 +126 +127 +129 +131 +134 +138 +142 +148 +154 +164 +172 +180 +188 +194 +201 +204 +207 +209 +210 +210 +210 +211 +211 +212 +213 +213 +213 +213 +213 +212 +211 +210 +207 +202 +195 +193 +187 +179 +171 +173 +181 +184 +184 +180 +163 +113 +63 +23 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +157 +188 +204 +212 +220 +222 +223 +223 +223 +223 +223 +223 +224 +224 +224 +223 +221 +217 +210 +199 +176 +145 +108 +69 +34 +11 +6 +3 +1 +1 +1 +1 +1 +1 +1 +4 +19 +54 +95 +131 +161 +177 +187 +194 +197 +198 +199 +200 +199 +199 +197 +195 +194 +193 +190 +188 +188 +188 +183 +170 +154 +155 +155 +154 +150 +149 +158 +183 +207 +216 +213 +203 +195 +190 +186 +187 +191 +193 +196 +200 +204 +209 +212 +215 +217 +220 +220 +220 +219 +215 +204 +194 +186 +180 +175 +172 +168 +163 +158 +155 +153 +160 +173 +190 +207 +220 +222 +223 +224 +223 +222 +221 +220 +219 +218 +216 +214 +212 +210 +207 +203 +200 +197 +195 +193 +191 +191 +190 +190 +191 +192 +193 +195 +197 +198 +201 +202 +203 +205 +206 +207 +207 +208 +208 +209 +209 +210 +210 +209 +209 +207 +206 +203 +200 +196 +188 +181 +171 +159 +145 +129 +122 +118 +116 +117 +120 +124 +129 +134 +139 +148 +154 +162 +170 +178 +187 +191 +195 +196 +197 +195 +193 +190 +186 +181 +173 +166 +159 +152 +145 +138 +133 +130 +127 +125 +124 +123 +123 +122 +122 +121 +121 +121 +121 +121 +121 +121 +121 +121 +120 +119 +119 +119 +119 +120 +122 +124 +127 +130 +135 +145 +154 +163 +173 +182 +192 +198 +203 +206 +209 +209 +210 +210 +211 +212 +213 +213 +214 +214 +214 +213 +212 +211 +208 +202 +196 +193 +186 +178 +173 +175 +183 +185 +183 +179 +155 +102 +53 +17 +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 +138 +167 +185 +197 +209 +215 +218 +220 +220 +221 +221 +221 +221 +220 +218 +212 +202 +183 +157 +123 +72 +42 +22 +10 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +8 +40 +83 +125 +154 +179 +190 +195 +197 +197 +199 +199 +199 +199 +198 +197 +196 +195 +194 +191 +189 +190 +189 +183 +168 +157 +158 +159 +157 +151 +150 +160 +185 +209 +215 +211 +201 +192 +186 +180 +179 +181 +182 +185 +189 +194 +200 +204 +208 +212 +217 +218 +220 +220 +219 +215 +206 +196 +187 +179 +174 +172 +168 +163 +156 +153 +152 +154 +162 +179 +206 +215 +221 +224 +223 +223 +221 +220 +219 +217 +214 +212 +210 +208 +206 +202 +200 +198 +196 +195 +195 +195 +197 +199 +201 +205 +207 +209 +211 +212 +213 +214 +214 +214 +214 +213 +213 +213 +212 +211 +210 +210 +209 +207 +205 +201 +195 +186 +176 +163 +146 +135 +127 +122 +119 +117 +117 +118 +120 +124 +133 +140 +148 +157 +165 +176 +183 +189 +193 +195 +197 +197 +197 +196 +193 +184 +174 +163 +152 +142 +133 +128 +126 +124 +123 +122 +122 +122 +121 +121 +121 +122 +122 +122 +123 +123 +123 +123 +123 +123 +123 +122 +122 +121 +121 +120 +119 +118 +118 +117 +117 +117 +118 +120 +122 +128 +136 +145 +156 +166 +180 +189 +196 +202 +206 +209 +209 +210 +211 +212 +213 +213 +214 +214 +214 +214 +213 +212 +209 +203 +197 +193 +186 +178 +174 +179 +185 +185 +182 +177 +146 +89 +43 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +114 +131 +144 +154 +166 +173 +177 +180 +180 +178 +172 +165 +154 +139 +121 +92 +70 +50 +34 +21 +10 +6 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +23 +78 +122 +155 +176 +193 +195 +196 +197 +197 +199 +199 +199 +199 +198 +198 +198 +197 +195 +192 +191 +192 +191 +184 +169 +163 +164 +164 +160 +151 +150 +164 +188 +210 +215 +209 +198 +189 +182 +173 +169 +167 +166 +167 +170 +175 +181 +187 +193 +199 +207 +211 +215 +218 +219 +219 +216 +211 +203 +193 +181 +176 +173 +170 +167 +158 +154 +151 +150 +150 +158 +174 +191 +206 +217 +220 +221 +221 +220 +219 +218 +216 +215 +214 +213 +212 +211 +211 +212 +213 +214 +214 +215 +215 +216 +216 +216 +215 +215 +215 +214 +213 +213 +212 +210 +208 +205 +202 +198 +193 +185 +177 +169 +161 +153 +141 +135 +130 +127 +125 +124 +124 +125 +126 +128 +133 +138 +144 +149 +154 +159 +165 +171 +178 +185 +191 +194 +197 +197 +196 +188 +177 +164 +151 +139 +129 +125 +123 +122 +121 +121 +121 +121 +121 +122 +124 +126 +128 +130 +132 +136 +138 +141 +143 +146 +148 +148 +148 +148 +146 +144 +141 +139 +135 +132 +127 +124 +122 +120 +118 +116 +115 +115 +115 +115 +117 +121 +127 +135 +145 +161 +172 +183 +192 +200 +205 +207 +209 +210 +211 +212 +213 +214 +214 +215 +214 +214 +213 +210 +203 +197 +193 +185 +178 +176 +182 +186 +185 +181 +174 +130 +72 +31 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +110 +115 +119 +123 +125 +122 +120 +115 +109 +100 +94 +86 +77 +67 +54 +44 +34 +25 +17 +9 +5 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +7 +48 +105 +144 +170 +186 +195 +195 +196 +196 +197 +199 +199 +199 +199 +199 +200 +200 +198 +196 +193 +193 +194 +192 +186 +172 +168 +168 +167 +161 +150 +150 +166 +191 +211 +214 +208 +197 +188 +180 +170 +163 +159 +156 +155 +156 +158 +163 +169 +175 +182 +192 +199 +205 +211 +215 +218 +217 +215 +211 +206 +195 +186 +179 +174 +171 +166 +161 +157 +153 +150 +150 +155 +160 +167 +179 +194 +203 +210 +214 +215 +216 +216 +215 +215 +214 +214 +213 +213 +213 +213 +213 +213 +213 +212 +212 +210 +208 +205 +202 +198 +192 +187 +183 +178 +173 +167 +163 +158 +154 +150 +146 +143 +140 +137 +134 +131 +130 +128 +128 +127 +128 +130 +132 +136 +140 +146 +153 +161 +169 +177 +187 +191 +195 +197 +198 +194 +186 +175 +164 +153 +142 +136 +131 +127 +124 +122 +121 +121 +122 +123 +126 +129 +134 +139 +144 +152 +157 +162 +167 +171 +175 +178 +179 +180 +181 +182 +182 +181 +180 +179 +176 +173 +169 +164 +159 +151 +145 +138 +131 +125 +120 +117 +114 +113 +113 +113 +115 +119 +124 +133 +147 +159 +171 +182 +192 +201 +204 +207 +208 +210 +212 +213 +214 +215 +215 +215 +214 +213 +210 +203 +198 +191 +184 +178 +178 +185 +186 +184 +179 +170 +115 +59 +23 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +97 +98 +97 +95 +92 +88 +84 +80 +75 +69 +65 +61 +56 +51 +47 +42 +35 +28 +21 +12 +6 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +13 +76 +130 +162 +180 +192 +195 +195 +195 +196 +197 +199 +199 +199 +199 +200 +201 +201 +199 +197 +194 +195 +195 +194 +189 +177 +172 +172 +169 +161 +150 +150 +169 +193 +211 +214 +208 +196 +187 +178 +168 +159 +154 +148 +145 +144 +144 +147 +151 +157 +163 +174 +181 +190 +198 +205 +213 +215 +216 +215 +213 +206 +198 +190 +182 +176 +171 +168 +164 +159 +155 +151 +149 +148 +149 +154 +165 +171 +178 +183 +187 +193 +195 +197 +198 +199 +200 +199 +199 +198 +196 +194 +192 +190 +187 +184 +180 +176 +172 +169 +165 +160 +157 +153 +150 +146 +142 +140 +137 +135 +133 +132 +131 +130 +130 +130 +131 +132 +133 +135 +137 +142 +148 +154 +161 +167 +176 +182 +187 +192 +196 +197 +193 +187 +179 +171 +161 +152 +144 +135 +128 +123 +121 +120 +120 +121 +124 +128 +132 +138 +144 +152 +159 +165 +171 +176 +182 +186 +190 +193 +196 +198 +199 +200 +200 +201 +201 +201 +200 +200 +199 +197 +195 +192 +188 +184 +177 +169 +161 +152 +142 +131 +124 +118 +114 +112 +111 +111 +113 +117 +123 +135 +147 +159 +172 +184 +195 +200 +204 +207 +209 +211 +213 +214 +215 +215 +215 +215 +213 +209 +203 +198 +190 +183 +179 +180 +187 +186 +183 +176 +163 +99 +47 +17 +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 +1 +89 +89 +89 +87 +83 +75 +71 +68 +66 +65 +64 +64 +63 +62 +61 +58 +54 +47 +39 +30 +16 +8 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +8 +22 +104 +151 +175 +187 +195 +195 +194 +194 +195 +198 +200 +199 +199 +200 +201 +203 +202 +200 +197 +196 +197 +197 +196 +191 +181 +176 +175 +169 +160 +149 +150 +172 +195 +212 +214 +208 +196 +186 +178 +168 +157 +151 +144 +138 +135 +132 +133 +136 +139 +144 +153 +161 +169 +179 +189 +201 +208 +212 +214 +214 +213 +209 +203 +195 +186 +178 +174 +170 +167 +163 +157 +153 +150 +147 +145 +145 +146 +148 +151 +156 +163 +167 +170 +172 +173 +174 +174 +173 +171 +169 +166 +163 +160 +156 +152 +147 +144 +141 +139 +137 +135 +134 +133 +133 +132 +132 +132 +132 +132 +133 +133 +134 +135 +136 +137 +141 +144 +148 +153 +159 +167 +174 +182 +189 +196 +201 +201 +199 +195 +191 +181 +170 +158 +145 +133 +124 +120 +118 +118 +118 +120 +122 +125 +129 +134 +142 +149 +158 +166 +174 +184 +191 +196 +199 +202 +205 +206 +207 +207 +208 +208 +209 +209 +209 +209 +209 +209 +209 +209 +209 +208 +207 +206 +204 +202 +197 +191 +184 +175 +164 +149 +137 +127 +119 +114 +110 +109 +110 +112 +115 +125 +135 +148 +161 +174 +188 +196 +201 +205 +207 +210 +212 +214 +215 +215 +215 +215 +213 +209 +203 +197 +188 +182 +180 +182 +188 +186 +182 +173 +154 +82 +36 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +86 +86 +85 +83 +74 +70 +67 +65 +65 +69 +73 +77 +80 +82 +78 +72 +64 +54 +41 +22 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +12 +36 +129 +164 +182 +190 +196 +194 +192 +193 +195 +198 +200 +199 +199 +200 +202 +204 +203 +200 +198 +198 +199 +199 +197 +193 +185 +179 +176 +168 +158 +149 +150 +174 +197 +212 +213 +208 +196 +187 +178 +168 +157 +150 +142 +135 +131 +126 +124 +124 +125 +127 +132 +138 +146 +155 +165 +182 +194 +204 +212 +214 +215 +214 +213 +210 +204 +190 +181 +175 +171 +168 +166 +163 +160 +157 +152 +147 +145 +143 +142 +142 +141 +142 +142 +142 +142 +142 +142 +141 +141 +140 +139 +138 +137 +136 +136 +136 +135 +135 +135 +134 +134 +134 +134 +134 +134 +135 +135 +136 +137 +138 +141 +144 +147 +151 +155 +163 +171 +179 +187 +195 +203 +207 +210 +212 +211 +201 +185 +169 +153 +140 +128 +123 +119 +116 +115 +115 +115 +116 +117 +119 +125 +133 +143 +155 +167 +182 +191 +197 +201 +204 +206 +207 +208 +208 +209 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +208 +206 +201 +195 +186 +171 +157 +142 +129 +119 +111 +108 +108 +108 +110 +116 +126 +137 +150 +164 +181 +190 +198 +202 +206 +209 +212 +214 +215 +215 +215 +215 +213 +208 +203 +195 +187 +182 +182 +184 +189 +185 +180 +168 +142 +66 +26 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +84 +85 +85 +84 +77 +73 +71 +71 +74 +94 +102 +106 +106 +105 +95 +86 +74 +60 +45 +25 +12 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +19 +55 +150 +175 +187 +192 +196 +193 +191 +192 +194 +198 +198 +198 +199 +201 +204 +205 +203 +201 +201 +201 +202 +202 +199 +194 +187 +178 +173 +164 +155 +148 +150 +176 +198 +212 +213 +209 +200 +190 +180 +172 +160 +152 +144 +137 +131 +126 +122 +120 +119 +118 +119 +120 +122 +126 +131 +143 +155 +170 +184 +199 +210 +213 +214 +214 +214 +212 +206 +198 +188 +179 +172 +169 +166 +165 +163 +160 +158 +156 +153 +151 +149 +147 +146 +145 +144 +143 +142 +142 +141 +140 +140 +140 +140 +140 +140 +140 +140 +141 +142 +143 +143 +144 +145 +147 +149 +152 +154 +157 +161 +167 +175 +182 +189 +195 +201 +208 +211 +213 +214 +213 +199 +180 +162 +146 +136 +129 +124 +121 +118 +116 +114 +113 +113 +113 +114 +117 +124 +134 +146 +161 +180 +190 +197 +202 +205 +207 +207 +208 +208 +209 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +211 +211 +211 +211 +211 +211 +211 +210 +210 +208 +204 +194 +182 +167 +150 +134 +117 +110 +107 +106 +106 +109 +116 +126 +138 +151 +170 +183 +192 +199 +204 +208 +211 +213 +215 +216 +216 +215 +212 +207 +202 +192 +185 +183 +183 +187 +189 +184 +177 +159 +121 +45 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +85 +86 +87 +86 +82 +79 +78 +81 +91 +112 +116 +117 +116 +111 +99 +87 +72 +57 +40 +23 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +23 +64 +157 +177 +187 +192 +196 +193 +191 +191 +192 +195 +196 +197 +200 +203 +206 +206 +204 +203 +203 +204 +204 +202 +198 +191 +182 +172 +167 +160 +153 +148 +150 +175 +197 +211 +213 +210 +203 +196 +188 +179 +167 +158 +150 +143 +137 +130 +126 +123 +121 +119 +118 +118 +118 +119 +121 +125 +130 +138 +149 +163 +183 +195 +205 +211 +214 +214 +212 +209 +205 +200 +191 +184 +177 +172 +168 +164 +162 +160 +159 +157 +155 +153 +152 +151 +150 +149 +149 +149 +149 +148 +148 +148 +148 +148 +148 +149 +149 +150 +151 +153 +156 +159 +163 +168 +173 +180 +185 +190 +195 +199 +203 +205 +207 +208 +206 +188 +171 +159 +152 +149 +144 +139 +133 +128 +123 +119 +115 +112 +111 +111 +111 +113 +119 +128 +139 +157 +169 +179 +187 +193 +200 +203 +205 +207 +208 +208 +209 +209 +209 +210 +210 +211 +211 +211 +212 +212 +212 +213 +213 +213 +213 +213 +213 +213 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +211 +211 +211 +210 +210 +208 +203 +195 +182 +167 +149 +126 +115 +108 +105 +104 +106 +111 +119 +130 +142 +163 +177 +188 +196 +202 +207 +211 +213 +215 +216 +216 +215 +211 +206 +201 +190 +185 +183 +185 +189 +188 +182 +172 +148 +101 +31 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +86 +89 +90 +90 +87 +85 +85 +91 +107 +124 +126 +126 +122 +114 +99 +83 +66 +50 +35 +18 +9 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +24 +68 +158 +177 +187 +192 +196 +194 +192 +191 +191 +193 +196 +198 +202 +206 +207 +207 +205 +205 +206 +206 +204 +199 +191 +181 +170 +164 +161 +156 +151 +147 +149 +173 +194 +209 +211 +210 +206 +201 +195 +189 +178 +170 +162 +155 +148 +139 +134 +130 +126 +123 +120 +118 +117 +117 +117 +117 +119 +122 +127 +135 +150 +163 +177 +190 +201 +209 +212 +213 +213 +211 +205 +200 +195 +190 +185 +178 +174 +171 +169 +166 +164 +162 +161 +160 +159 +158 +157 +157 +156 +157 +157 +158 +159 +161 +162 +166 +169 +172 +175 +178 +183 +186 +190 +193 +197 +201 +204 +205 +202 +193 +173 +167 +165 +164 +163 +153 +142 +135 +129 +126 +123 +120 +116 +113 +110 +109 +107 +108 +112 +118 +131 +142 +154 +164 +175 +188 +195 +201 +204 +206 +208 +208 +209 +209 +210 +210 +211 +211 +212 +213 +213 +214 +214 +214 +215 +215 +215 +215 +215 +216 +216 +216 +215 +215 +215 +215 +214 +214 +213 +213 +212 +212 +212 +211 +211 +211 +211 +211 +211 +210 +208 +203 +194 +181 +164 +137 +121 +111 +105 +103 +104 +108 +114 +123 +135 +155 +171 +184 +194 +201 +207 +210 +213 +215 +216 +216 +215 +210 +205 +199 +188 +185 +184 +186 +190 +186 +180 +165 +135 +82 +20 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +89 +93 +95 +96 +93 +92 +94 +103 +122 +132 +133 +131 +124 +113 +93 +74 +56 +41 +28 +14 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +23 +66 +156 +175 +185 +191 +196 +196 +193 +192 +192 +194 +197 +201 +205 +208 +208 +208 +208 +208 +207 +206 +199 +188 +175 +163 +154 +154 +155 +154 +150 +146 +147 +168 +190 +206 +209 +209 +208 +205 +202 +199 +191 +185 +178 +171 +165 +154 +148 +142 +137 +132 +126 +123 +120 +118 +117 +116 +116 +116 +117 +118 +123 +132 +144 +159 +174 +191 +200 +206 +210 +212 +213 +213 +211 +208 +203 +197 +192 +188 +184 +182 +178 +177 +175 +174 +173 +172 +171 +171 +172 +172 +174 +176 +178 +180 +183 +187 +192 +196 +200 +204 +207 +206 +203 +199 +194 +189 +186 +183 +176 +162 +132 +125 +122 +122 +122 +124 +124 +123 +121 +117 +113 +109 +106 +103 +103 +108 +114 +122 +133 +145 +165 +180 +191 +199 +203 +206 +207 +208 +208 +209 +210 +210 +211 +211 +212 +213 +214 +214 +215 +216 +216 +217 +217 +217 +217 +218 +218 +218 +218 +218 +218 +218 +217 +217 +217 +217 +217 +216 +216 +215 +214 +214 +213 +212 +212 +211 +211 +211 +211 +210 +210 +208 +203 +193 +177 +149 +129 +115 +106 +102 +102 +105 +110 +118 +128 +149 +166 +181 +192 +200 +206 +210 +213 +215 +216 +217 +214 +209 +203 +196 +186 +185 +185 +188 +191 +184 +177 +156 +119 +62 +12 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +84 +93 +99 +102 +102 +99 +98 +105 +117 +134 +139 +138 +132 +121 +107 +80 +60 +44 +31 +18 +10 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +20 +58 +150 +171 +182 +189 +197 +198 +197 +195 +195 +196 +202 +206 +209 +210 +210 +210 +210 +209 +207 +203 +185 +165 +149 +138 +132 +144 +150 +151 +149 +145 +145 +162 +184 +203 +207 +208 +208 +207 +206 +206 +203 +201 +197 +192 +186 +176 +168 +160 +153 +146 +138 +132 +128 +124 +120 +117 +116 +115 +115 +115 +115 +116 +118 +123 +132 +152 +169 +184 +197 +206 +212 +214 +214 +214 +214 +214 +213 +211 +208 +204 +200 +198 +196 +195 +195 +197 +198 +200 +201 +202 +205 +207 +209 +210 +211 +212 +213 +213 +212 +212 +208 +198 +181 +160 +138 +117 +110 +108 +111 +119 +129 +136 +138 +138 +133 +126 +118 +109 +100 +96 +93 +94 +95 +99 +106 +127 +149 +169 +186 +197 +203 +205 +207 +207 +208 +208 +209 +209 +210 +211 +212 +213 +214 +215 +216 +217 +217 +217 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +218 +217 +217 +216 +215 +214 +213 +212 +211 +211 +211 +211 +210 +210 +207 +201 +189 +162 +139 +121 +108 +102 +100 +103 +107 +113 +122 +143 +163 +179 +191 +199 +206 +211 +214 +215 +216 +217 +213 +207 +201 +193 +186 +185 +187 +189 +191 +182 +173 +145 +101 +43 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +99 +106 +109 +109 +108 +110 +120 +133 +143 +144 +138 +128 +111 +87 +55 +42 +29 +19 +10 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +14 +43 +133 +160 +173 +181 +192 +199 +200 +201 +202 +204 +209 +210 +211 +211 +211 +211 +209 +205 +194 +176 +141 +120 +108 +103 +103 +128 +142 +148 +148 +144 +142 +150 +172 +193 +201 +204 +206 +207 +207 +207 +207 +207 +207 +207 +206 +202 +197 +190 +183 +175 +165 +157 +150 +143 +136 +130 +125 +121 +119 +116 +115 +114 +114 +114 +114 +117 +120 +127 +136 +149 +167 +180 +192 +201 +208 +213 +216 +218 +220 +221 +221 +220 +219 +218 +217 +215 +215 +215 +215 +215 +214 +213 +212 +209 +205 +193 +175 +156 +137 +122 +106 +105 +108 +116 +129 +144 +148 +149 +149 +145 +137 +124 +111 +99 +92 +90 +89 +89 +90 +93 +102 +118 +139 +162 +183 +197 +202 +205 +206 +207 +208 +208 +209 +209 +210 +211 +213 +214 +215 +216 +217 +217 +217 +218 +218 +218 +218 +218 +218 +218 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +219 +218 +218 +218 +218 +217 +216 +215 +214 +212 +212 +211 +211 +210 +210 +210 +207 +200 +176 +151 +130 +113 +102 +99 +101 +104 +108 +116 +139 +160 +177 +190 +199 +207 +211 +214 +216 +217 +216 +211 +205 +197 +190 +186 +186 +189 +190 +189 +178 +163 +124 +73 +23 +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 +1 +1 +1 +1 +86 +102 +110 +113 +114 +115 +121 +131 +141 +147 +145 +134 +116 +94 +72 +53 +39 +25 +15 +8 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +9 +29 +114 +148 +163 +169 +177 +196 +202 +204 +206 +209 +211 +212 +212 +212 +211 +209 +202 +187 +166 +140 +116 +105 +98 +95 +95 +110 +132 +142 +145 +144 +140 +142 +159 +179 +191 +196 +201 +204 +205 +205 +207 +207 +208 +208 +208 +207 +205 +202 +198 +192 +183 +176 +169 +161 +154 +145 +140 +135 +130 +127 +122 +119 +117 +115 +114 +114 +115 +117 +119 +123 +129 +135 +142 +150 +159 +169 +176 +183 +188 +193 +196 +199 +200 +202 +202 +201 +198 +192 +184 +174 +160 +152 +144 +137 +130 +125 +124 +127 +131 +136 +142 +144 +145 +146 +149 +149 +141 +131 +120 +109 +101 +97 +93 +90 +89 +89 +94 +102 +114 +131 +158 +172 +184 +193 +200 +204 +206 +207 +208 +208 +209 +210 +212 +213 +214 +215 +216 +216 +217 +217 +218 +218 +218 +218 +218 +219 +219 +219 +220 +221 +222 +222 +223 +223 +224 +224 +224 +224 +224 +224 +223 +222 +221 +221 +220 +220 +219 +219 +219 +219 +219 +218 +218 +218 +217 +215 +214 +213 +212 +211 +210 +210 +210 +208 +205 +185 +160 +137 +118 +104 +99 +101 +102 +106 +113 +137 +159 +177 +191 +200 +208 +212 +215 +216 +217 +215 +209 +202 +195 +188 +186 +187 +190 +190 +185 +174 +150 +104 +53 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +105 +114 +117 +118 +122 +131 +141 +147 +150 +143 +126 +106 +87 +71 +57 +44 +30 +17 +9 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +16 +89 +134 +152 +156 +160 +180 +196 +203 +207 +210 +211 +212 +212 +211 +209 +198 +182 +160 +138 +121 +106 +99 +95 +92 +91 +98 +117 +133 +143 +144 +138 +137 +147 +162 +176 +182 +189 +194 +197 +198 +202 +204 +206 +207 +208 +208 +209 +208 +206 +203 +196 +191 +184 +176 +169 +159 +153 +147 +142 +139 +134 +130 +126 +123 +120 +117 +116 +114 +114 +113 +114 +116 +119 +123 +128 +134 +139 +143 +146 +149 +151 +153 +154 +154 +152 +149 +146 +143 +138 +132 +127 +127 +128 +128 +127 +129 +133 +139 +146 +152 +157 +157 +154 +148 +139 +125 +115 +107 +98 +91 +87 +87 +88 +91 +96 +107 +122 +138 +155 +171 +190 +198 +202 +205 +206 +207 +208 +209 +210 +211 +213 +214 +215 +216 +216 +217 +217 +218 +218 +218 +218 +218 +219 +220 +220 +221 +222 +223 +224 +225 +227 +227 +228 +229 +229 +230 +229 +229 +229 +229 +228 +227 +226 +225 +224 +223 +222 +221 +220 +219 +219 +219 +219 +219 +218 +217 +216 +214 +212 +211 +210 +210 +210 +209 +207 +192 +168 +144 +122 +106 +99 +100 +101 +104 +110 +137 +160 +179 +192 +201 +209 +213 +215 +216 +216 +213 +206 +199 +192 +187 +187 +189 +191 +189 +181 +169 +133 +83 +36 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +88 +109 +118 +121 +122 +130 +141 +148 +151 +151 +138 +118 +102 +90 +83 +73 +60 +45 +31 +18 +7 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +59 +115 +140 +146 +145 +157 +180 +194 +202 +207 +209 +209 +208 +205 +199 +178 +155 +135 +120 +114 +108 +104 +101 +98 +93 +93 +104 +122 +138 +143 +137 +133 +135 +143 +156 +163 +170 +176 +180 +182 +189 +193 +196 +200 +203 +205 +207 +209 +209 +208 +205 +201 +196 +190 +182 +173 +166 +159 +153 +149 +145 +142 +138 +135 +131 +126 +123 +120 +118 +117 +115 +114 +114 +114 +114 +114 +114 +115 +115 +115 +114 +114 +114 +113 +112 +111 +111 +112 +113 +115 +123 +132 +140 +148 +153 +159 +161 +163 +163 +162 +156 +149 +140 +129 +114 +96 +90 +87 +86 +86 +88 +91 +96 +105 +117 +140 +160 +177 +192 +200 +205 +206 +207 +208 +208 +209 +210 +212 +213 +214 +216 +217 +217 +217 +217 +218 +218 +218 +218 +219 +219 +220 +221 +222 +223 +225 +226 +227 +229 +230 +231 +232 +232 +233 +233 +233 +233 +233 +233 +233 +232 +231 +231 +230 +228 +227 +225 +224 +222 +221 +220 +219 +219 +219 +219 +218 +217 +215 +213 +212 +211 +210 +210 +210 +209 +197 +175 +150 +127 +107 +99 +99 +100 +103 +109 +138 +162 +180 +194 +203 +210 +214 +216 +216 +216 +211 +203 +196 +190 +187 +187 +190 +191 +187 +177 +160 +112 +62 +22 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +90 +112 +121 +124 +126 +138 +148 +153 +153 +150 +130 +113 +106 +105 +106 +105 +89 +76 +60 +39 +16 +6 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +25 +92 +127 +139 +137 +132 +149 +172 +192 +198 +204 +204 +200 +192 +178 +148 +130 +122 +118 +116 +117 +121 +121 +114 +100 +93 +95 +109 +126 +139 +140 +132 +128 +128 +133 +140 +144 +148 +153 +154 +160 +167 +174 +181 +189 +196 +202 +206 +209 +210 +211 +210 +208 +203 +196 +187 +178 +169 +161 +155 +151 +149 +147 +146 +144 +141 +138 +135 +132 +130 +126 +123 +120 +118 +116 +115 +114 +114 +113 +113 +114 +115 +117 +121 +126 +135 +141 +145 +148 +151 +155 +159 +161 +163 +165 +166 +166 +165 +163 +159 +143 +124 +108 +96 +89 +86 +85 +85 +86 +87 +95 +102 +116 +133 +154 +184 +195 +202 +205 +206 +207 +207 +208 +209 +210 +213 +215 +216 +217 +217 +217 +217 +218 +218 +218 +218 +218 +219 +220 +221 +222 +223 +224 +225 +226 +228 +229 +230 +230 +231 +232 +233 +233 +234 +234 +234 +234 +234 +234 +233 +233 +233 +232 +232 +231 +230 +229 +228 +226 +224 +221 +220 +220 +219 +219 +219 +218 +217 +215 +212 +211 +210 +210 +210 +209 +201 +180 +156 +131 +109 +99 +99 +100 +103 +109 +141 +165 +183 +196 +204 +212 +215 +216 +216 +216 +208 +200 +193 +189 +187 +188 +192 +190 +184 +173 +146 +89 +42 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +116 +126 +128 +131 +145 +153 +156 +154 +146 +124 +120 +121 +124 +125 +119 +110 +103 +92 +73 +49 +27 +12 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +38 +90 +133 +139 +119 +117 +124 +137 +152 +159 +162 +159 +151 +136 +126 +124 +123 +125 +134 +147 +150 +152 +150 +144 +114 +100 +98 +108 +132 +140 +137 +130 +122 +121 +119 +118 +118 +118 +117 +117 +119 +122 +127 +134 +149 +164 +180 +194 +204 +211 +214 +216 +216 +213 +208 +202 +193 +183 +172 +161 +156 +152 +150 +149 +148 +147 +146 +145 +145 +144 +144 +143 +143 +143 +143 +143 +143 +144 +144 +145 +147 +149 +151 +153 +155 +155 +157 +159 +163 +167 +170 +173 +174 +174 +170 +165 +155 +142 +125 +105 +97 +91 +88 +86 +85 +87 +89 +94 +103 +118 +139 +161 +182 +197 +204 +206 +207 +207 +208 +209 +210 +212 +214 +216 +217 +217 +217 +217 +217 +218 +218 +218 +218 +219 +220 +221 +222 +223 +224 +224 +225 +226 +226 +227 +228 +229 +230 +231 +232 +232 +233 +233 +233 +233 +233 +232 +232 +232 +232 +232 +232 +232 +232 +231 +231 +230 +229 +229 +228 +225 +223 +221 +220 +220 +219 +219 +218 +216 +214 +211 +210 +210 +210 +210 +204 +186 +161 +135 +112 +100 +99 +99 +103 +112 +148 +171 +187 +199 +207 +213 +216 +217 +216 +214 +203 +195 +191 +188 +188 +191 +192 +185 +175 +166 +115 +58 +22 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +118 +129 +131 +133 +148 +155 +157 +153 +142 +128 +129 +132 +136 +137 +131 +123 +115 +105 +91 +72 +52 +32 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +14 +51 +97 +135 +130 +117 +113 +117 +126 +138 +140 +138 +134 +129 +126 +126 +130 +137 +144 +150 +152 +154 +154 +154 +142 +122 +106 +101 +112 +137 +138 +132 +124 +120 +117 +114 +113 +112 +112 +110 +110 +110 +110 +111 +114 +122 +134 +149 +166 +188 +200 +207 +212 +214 +213 +211 +207 +201 +194 +179 +171 +164 +158 +154 +152 +150 +149 +148 +148 +147 +147 +146 +146 +146 +146 +147 +147 +148 +149 +150 +152 +154 +157 +159 +163 +166 +169 +172 +174 +176 +177 +177 +175 +171 +161 +149 +137 +124 +112 +99 +93 +89 +87 +86 +88 +93 +100 +110 +124 +152 +173 +188 +198 +204 +206 +207 +208 +208 +210 +212 +214 +215 +216 +217 +217 +217 +217 +217 +218 +218 +218 +219 +220 +221 +222 +222 +223 +223 +224 +224 +225 +225 +225 +226 +227 +228 +229 +229 +230 +230 +230 +230 +229 +229 +229 +229 +228 +228 +229 +229 +229 +230 +230 +230 +230 +230 +230 +229 +228 +227 +225 +223 +221 +220 +220 +219 +219 +217 +214 +212 +211 +210 +210 +210 +205 +188 +164 +137 +113 +100 +99 +99 +104 +117 +155 +176 +191 +202 +209 +214 +216 +216 +215 +210 +199 +193 +189 +188 +189 +192 +192 +182 +168 +153 +85 +38 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +120 +131 +133 +135 +149 +156 +158 +153 +141 +133 +136 +140 +144 +144 +141 +135 +128 +118 +105 +85 +70 +52 +32 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +22 +56 +105 +134 +125 +115 +110 +112 +120 +126 +128 +129 +128 +128 +132 +137 +143 +148 +150 +152 +154 +156 +157 +155 +142 +123 +106 +101 +122 +134 +135 +129 +121 +117 +114 +112 +111 +110 +108 +106 +105 +103 +102 +100 +101 +105 +112 +122 +145 +167 +184 +198 +207 +213 +214 +213 +211 +207 +197 +188 +179 +171 +165 +160 +157 +156 +154 +153 +152 +151 +151 +151 +151 +151 +152 +153 +154 +155 +158 +160 +163 +165 +168 +171 +174 +177 +179 +180 +181 +179 +176 +172 +165 +151 +139 +127 +115 +104 +94 +90 +88 +88 +89 +95 +103 +116 +132 +152 +180 +194 +201 +205 +206 +207 +208 +210 +211 +213 +215 +216 +217 +217 +217 +217 +217 +217 +218 +218 +219 +220 +220 +221 +222 +223 +223 +223 +223 +223 +223 +223 +223 +224 +225 +226 +227 +228 +228 +228 +228 +228 +228 +227 +227 +227 +227 +227 +227 +227 +227 +227 +228 +228 +229 +229 +229 +229 +229 +228 +228 +226 +225 +223 +221 +220 +220 +219 +218 +215 +212 +211 +210 +210 +210 +206 +189 +165 +138 +114 +101 +99 +100 +107 +123 +163 +182 +195 +204 +211 +216 +216 +216 +213 +207 +195 +191 +189 +189 +190 +193 +188 +177 +159 +132 +58 +23 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +93 +121 +132 +135 +137 +149 +156 +158 +153 +141 +137 +142 +147 +149 +150 +149 +145 +139 +130 +117 +95 +81 +67 +50 +27 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +20 +58 +117 +128 +123 +114 +109 +108 +117 +123 +128 +130 +131 +137 +142 +145 +147 +149 +151 +153 +155 +157 +158 +156 +142 +121 +100 +103 +124 +135 +136 +126 +119 +116 +113 +112 +110 +109 +108 +106 +104 +102 +97 +94 +91 +89 +88 +101 +125 +149 +171 +189 +207 +212 +213 +214 +214 +209 +203 +195 +187 +178 +170 +166 +164 +161 +160 +158 +157 +156 +156 +156 +156 +157 +158 +160 +162 +166 +168 +171 +173 +176 +179 +180 +182 +183 +183 +182 +179 +174 +167 +158 +143 +132 +120 +109 +99 +90 +89 +89 +90 +94 +105 +119 +137 +158 +180 +199 +204 +206 +207 +207 +209 +210 +212 +214 +216 +217 +217 +217 +217 +217 +217 +217 +218 +218 +219 +220 +221 +221 +222 +222 +222 +222 +222 +221 +221 +221 +221 +222 +223 +224 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +227 +228 +228 +229 +229 +228 +228 +227 +226 +224 +222 +220 +220 +219 +218 +215 +212 +211 +210 +210 +210 +206 +190 +165 +138 +115 +101 +99 +101 +110 +133 +171 +187 +199 +207 +212 +216 +216 +215 +210 +202 +192 +190 +189 +190 +191 +192 +181 +169 +146 +106 +34 +12 +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 +1 +1 +1 +1 +1 +1 +1 +91 +121 +133 +137 +138 +149 +156 +157 +153 +142 +141 +148 +152 +154 +154 +153 +152 +148 +141 +129 +104 +88 +75 +63 +50 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +65 +114 +131 +128 +117 +106 +107 +115 +125 +132 +137 +140 +142 +144 +145 +146 +148 +150 +154 +157 +159 +158 +155 +142 +111 +93 +107 +127 +140 +137 +123 +120 +117 +114 +113 +113 +112 +112 +110 +108 +100 +95 +90 +85 +81 +77 +85 +105 +130 +157 +191 +205 +211 +213 +215 +213 +211 +207 +201 +192 +182 +176 +171 +169 +167 +164 +163 +162 +161 +161 +161 +162 +163 +165 +167 +169 +171 +174 +177 +179 +183 +185 +186 +187 +186 +183 +178 +172 +163 +153 +138 +125 +112 +101 +94 +90 +90 +92 +96 +102 +119 +140 +162 +183 +200 +205 +206 +207 +208 +209 +211 +214 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +219 +219 +220 +221 +221 +221 +222 +221 +221 +220 +219 +219 +219 +220 +221 +222 +223 +225 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +227 +227 +228 +228 +228 +227 +226 +225 +223 +221 +220 +220 +218 +215 +212 +211 +210 +210 +210 +206 +189 +165 +138 +115 +101 +100 +103 +116 +144 +179 +193 +203 +209 +215 +216 +216 +213 +207 +197 +190 +189 +189 +191 +193 +191 +174 +157 +129 +74 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +118 +133 +137 +139 +148 +156 +157 +153 +146 +146 +152 +155 +155 +155 +154 +154 +153 +152 +150 +127 +101 +82 +68 +61 +35 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +34 +81 +121 +133 +127 +115 +111 +113 +118 +127 +134 +138 +139 +139 +139 +141 +145 +151 +157 +160 +160 +159 +156 +149 +99 +91 +100 +119 +141 +139 +130 +125 +122 +120 +122 +125 +127 +129 +129 +124 +117 +106 +93 +82 +74 +69 +67 +73 +91 +137 +167 +190 +204 +212 +215 +213 +213 +211 +207 +198 +189 +182 +176 +172 +169 +167 +165 +164 +163 +164 +165 +166 +169 +171 +176 +179 +182 +184 +186 +188 +188 +188 +188 +187 +182 +176 +169 +159 +148 +131 +118 +107 +98 +93 +91 +93 +97 +105 +118 +147 +170 +189 +202 +206 +207 +207 +209 +210 +212 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +219 +219 +220 +220 +220 +220 +220 +219 +218 +217 +218 +218 +219 +219 +220 +222 +223 +225 +225 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +227 +227 +227 +227 +226 +225 +224 +222 +221 +220 +218 +215 +212 +211 +210 +210 +210 +206 +187 +161 +135 +114 +101 +102 +109 +128 +162 +189 +199 +207 +213 +216 +216 +215 +208 +200 +192 +189 +189 +190 +192 +192 +182 +165 +136 +94 +37 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +84 +113 +130 +137 +140 +147 +155 +157 +154 +148 +149 +154 +155 +155 +154 +154 +154 +154 +155 +154 +146 +120 +93 +71 +62 +47 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +10 +28 +56 +94 +119 +122 +123 +123 +123 +124 +126 +128 +128 +128 +130 +136 +142 +148 +155 +161 +161 +160 +159 +156 +132 +102 +91 +97 +114 +139 +137 +134 +130 +127 +128 +130 +132 +133 +133 +132 +131 +126 +117 +103 +81 +71 +64 +62 +63 +83 +114 +146 +177 +202 +213 +213 +213 +212 +210 +206 +202 +195 +188 +181 +176 +173 +171 +169 +168 +168 +168 +170 +172 +174 +179 +181 +184 +186 +188 +189 +189 +190 +189 +187 +182 +175 +167 +157 +145 +127 +114 +104 +97 +93 +93 +97 +105 +119 +138 +168 +187 +199 +205 +207 +208 +209 +211 +213 +215 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +219 +219 +219 +220 +220 +219 +218 +217 +217 +217 +217 +217 +218 +219 +220 +222 +224 +225 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +227 +227 +226 +226 +225 +224 +222 +222 +220 +218 +215 +211 +211 +210 +210 +210 +204 +184 +158 +132 +112 +102 +103 +118 +142 +175 +195 +203 +210 +215 +216 +216 +211 +204 +196 +191 +190 +190 +191 +192 +191 +169 +152 +113 +64 +19 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +82 +107 +126 +137 +140 +147 +155 +157 +154 +149 +152 +155 +155 +155 +154 +154 +154 +155 +157 +158 +156 +138 +108 +77 +60 +52 +33 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +18 +42 +70 +94 +109 +118 +123 +128 +130 +131 +131 +132 +134 +139 +144 +149 +154 +160 +161 +162 +161 +159 +150 +123 +100 +87 +92 +117 +132 +137 +137 +134 +133 +133 +134 +135 +135 +136 +136 +136 +132 +124 +103 +84 +69 +58 +52 +54 +71 +98 +133 +171 +204 +210 +213 +213 +212 +210 +208 +203 +198 +191 +183 +179 +176 +174 +172 +170 +171 +171 +173 +176 +180 +184 +186 +188 +190 +190 +191 +190 +190 +188 +181 +174 +165 +154 +142 +123 +111 +102 +96 +93 +95 +103 +116 +134 +156 +184 +198 +204 +207 +208 +209 +211 +213 +215 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +218 +219 +219 +219 +219 +218 +217 +216 +216 +216 +216 +217 +218 +219 +221 +223 +225 +225 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +226 +226 +225 +224 +223 +222 +220 +217 +214 +211 +211 +210 +210 +209 +201 +179 +154 +129 +109 +104 +107 +129 +159 +185 +199 +207 +213 +216 +216 +214 +207 +199 +193 +190 +190 +191 +192 +190 +184 +160 +133 +87 +39 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +102 +121 +135 +141 +147 +154 +157 +155 +151 +154 +155 +155 +154 +153 +153 +154 +156 +159 +161 +161 +153 +125 +89 +58 +51 +42 +22 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +19 +48 +70 +87 +101 +117 +125 +130 +135 +139 +143 +147 +150 +153 +155 +159 +161 +162 +162 +160 +158 +145 +120 +94 +80 +89 +113 +129 +138 +140 +137 +137 +136 +136 +136 +136 +137 +139 +139 +139 +128 +106 +83 +64 +51 +43 +44 +58 +85 +124 +180 +199 +210 +214 +214 +212 +210 +208 +205 +200 +191 +186 +181 +178 +175 +173 +172 +173 +174 +177 +182 +185 +188 +191 +191 +191 +191 +191 +190 +188 +181 +173 +163 +152 +139 +120 +109 +100 +96 +94 +100 +111 +128 +149 +172 +196 +204 +207 +208 +209 +210 +213 +215 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +218 +218 +219 +218 +218 +217 +216 +215 +215 +215 +215 +216 +218 +219 +221 +223 +225 +226 +226 +226 +226 +226 +226 +226 +226 +226 +225 +225 +225 +225 +226 +226 +226 +226 +226 +227 +227 +227 +227 +227 +227 +227 +226 +226 +226 +226 +226 +226 +226 +225 +225 +223 +223 +222 +219 +216 +213 +211 +210 +210 +210 +209 +197 +173 +148 +126 +108 +106 +115 +144 +175 +193 +203 +211 +215 +216 +216 +211 +201 +195 +191 +190 +190 +192 +191 +186 +173 +151 +107 +59 +20 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +80 +96 +115 +132 +142 +147 +154 +157 +155 +152 +155 +156 +155 +153 +153 +153 +154 +158 +162 +165 +166 +162 +143 +108 +57 +43 +43 +26 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +39 +72 +91 +109 +124 +138 +151 +155 +157 +157 +157 +159 +160 +162 +162 +162 +160 +157 +144 +120 +82 +72 +79 +103 +128 +141 +142 +140 +139 +137 +136 +136 +138 +139 +141 +142 +142 +133 +110 +82 +54 +41 +37 +37 +44 +65 +133 +177 +202 +213 +215 +214 +211 +210 +208 +206 +199 +192 +187 +182 +178 +175 +174 +175 +176 +178 +183 +187 +190 +191 +192 +192 +192 +191 +190 +187 +180 +172 +162 +150 +136 +117 +106 +99 +96 +96 +105 +122 +142 +164 +186 +205 +207 +208 +209 +210 +212 +214 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +218 +218 +218 +218 +217 +216 +215 +215 +214 +214 +215 +215 +217 +220 +223 +225 +226 +226 +226 +226 +226 +226 +225 +225 +224 +224 +224 +224 +224 +224 +224 +224 +225 +225 +225 +226 +226 +226 +227 +227 +227 +227 +227 +226 +226 +226 +225 +225 +225 +225 +225 +224 +223 +223 +222 +219 +215 +212 +210 +210 +210 +210 +209 +192 +167 +142 +120 +108 +108 +131 +162 +188 +198 +208 +214 +216 +216 +215 +205 +196 +192 +190 +190 +192 +192 +190 +181 +161 +135 +77 +33 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +91 +109 +129 +143 +149 +155 +157 +156 +154 +155 +155 +154 +153 +153 +153 +155 +161 +168 +174 +175 +171 +161 +135 +85 +37 +39 +29 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +7 +15 +29 +48 +72 +106 +127 +141 +151 +155 +157 +159 +160 +161 +162 +161 +160 +158 +150 +130 +77 +67 +66 +80 +113 +141 +142 +143 +142 +140 +138 +139 +140 +142 +144 +145 +143 +135 +117 +85 +44 +36 +32 +30 +31 +52 +103 +156 +197 +215 +216 +214 +212 +210 +209 +206 +202 +196 +191 +185 +180 +177 +176 +177 +178 +184 +187 +190 +192 +192 +193 +192 +192 +190 +187 +180 +171 +160 +147 +133 +114 +104 +98 +97 +100 +117 +137 +158 +180 +199 +207 +208 +209 +210 +211 +214 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +217 +218 +217 +217 +216 +215 +214 +214 +213 +214 +214 +216 +219 +222 +225 +226 +226 +226 +226 +226 +225 +224 +224 +223 +223 +223 +223 +223 +223 +223 +222 +222 +222 +222 +222 +223 +223 +224 +225 +226 +227 +227 +227 +227 +227 +226 +225 +225 +225 +225 +225 +224 +224 +223 +223 +220 +217 +213 +211 +210 +210 +210 +208 +205 +181 +159 +133 +113 +109 +118 +159 +184 +198 +203 +214 +216 +216 +214 +210 +196 +192 +191 +191 +191 +192 +190 +179 +164 +151 +89 +38 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +89 +107 +128 +144 +150 +155 +157 +157 +155 +156 +155 +154 +153 +153 +153 +155 +162 +169 +177 +179 +177 +169 +148 +110 +34 +27 +22 +15 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +10 +18 +31 +59 +85 +108 +127 +140 +149 +153 +156 +158 +160 +161 +160 +159 +156 +149 +113 +79 +62 +59 +71 +115 +135 +143 +144 +143 +142 +142 +143 +144 +146 +147 +146 +140 +128 +107 +63 +41 +30 +27 +26 +33 +55 +98 +149 +196 +216 +216 +215 +213 +210 +207 +204 +200 +195 +189 +183 +180 +178 +178 +179 +184 +188 +191 +192 +193 +193 +193 +192 +190 +187 +179 +170 +159 +145 +130 +111 +102 +98 +99 +106 +126 +147 +169 +189 +203 +208 +209 +210 +211 +213 +215 +216 +216 +217 +217 +217 +217 +217 +217 +217 +217 +217 +217 +217 +216 +215 +214 +213 +213 +213 +214 +216 +219 +222 +225 +226 +226 +226 +226 +225 +224 +223 +223 +223 +223 +223 +223 +223 +222 +222 +221 +221 +220 +220 +220 +221 +221 +222 +223 +224 +225 +226 +227 +227 +227 +227 +226 +225 +225 +224 +224 +224 +224 +223 +223 +222 +219 +215 +212 +210 +210 +210 +209 +206 +199 +175 +145 +124 +113 +112 +146 +177 +193 +202 +209 +215 +216 +215 +211 +202 +193 +191 +191 +191 +192 +191 +183 +170 +151 +127 +52 +19 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +87 +106 +129 +145 +151 +156 +157 +157 +155 +156 +155 +154 +153 +153 +154 +155 +161 +169 +179 +182 +180 +175 +160 +129 +38 +22 +17 +14 +3 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +10 +25 +46 +68 +91 +112 +129 +138 +145 +150 +154 +157 +158 +159 +158 +157 +139 +105 +74 +51 +45 +76 +112 +133 +144 +145 +145 +145 +146 +147 +149 +150 +149 +145 +136 +122 +81 +49 +31 +23 +22 +25 +32 +57 +97 +152 +205 +213 +216 +215 +212 +210 +206 +203 +199 +194 +187 +183 +181 +181 +181 +184 +189 +191 +192 +193 +193 +193 +192 +190 +187 +179 +169 +157 +144 +128 +109 +101 +99 +102 +111 +135 +157 +178 +195 +206 +209 +209 +210 +212 +214 +216 +216 +216 +216 +216 +216 +217 +217 +217 +217 +217 +217 +217 +216 +215 +214 +213 +212 +213 +213 +216 +219 +222 +224 +226 +226 +226 +225 +224 +223 +222 +222 +223 +223 +223 +223 +223 +222 +221 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +223 +225 +226 +227 +227 +227 +226 +225 +225 +224 +224 +224 +224 +223 +223 +222 +220 +217 +213 +211 +210 +210 +209 +208 +203 +194 +161 +133 +119 +117 +126 +171 +190 +200 +206 +213 +216 +216 +212 +205 +196 +191 +191 +191 +191 +192 +187 +173 +158 +134 +91 +25 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +81 +86 +106 +130 +146 +152 +156 +158 +157 +155 +156 +154 +154 +154 +154 +154 +155 +160 +167 +178 +183 +182 +180 +169 +144 +49 +22 +13 +10 +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 +2 +6 +16 +32 +52 +75 +99 +114 +126 +135 +142 +149 +153 +155 +157 +158 +154 +132 +97 +60 +34 +39 +77 +111 +136 +145 +147 +148 +149 +150 +152 +153 +152 +149 +142 +131 +98 +61 +35 +20 +17 +20 +22 +31 +54 +98 +177 +203 +214 +217 +215 +212 +209 +206 +203 +199 +192 +187 +184 +183 +183 +184 +189 +191 +193 +193 +193 +193 +192 +190 +187 +179 +169 +156 +142 +126 +108 +101 +100 +106 +117 +143 +165 +185 +200 +208 +209 +210 +211 +213 +215 +216 +216 +216 +216 +216 +216 +216 +217 +217 +217 +217 +216 +216 +215 +214 +212 +212 +212 +213 +214 +218 +221 +224 +225 +226 +225 +224 +223 +222 +221 +221 +222 +223 +223 +223 +223 +222 +221 +220 +220 +220 +220 +220 +220 +220 +220 +220 +221 +221 +223 +225 +226 +227 +227 +227 +226 +225 +224 +224 +224 +223 +223 +223 +222 +221 +218 +214 +212 +210 +210 +209 +209 +206 +199 +184 +143 +125 +119 +126 +149 +189 +198 +205 +210 +215 +216 +213 +206 +198 +192 +191 +191 +191 +191 +190 +178 +162 +142 +108 +52 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +82 +87 +108 +132 +147 +153 +157 +158 +157 +156 +156 +155 +155 +155 +155 +155 +155 +157 +162 +173 +181 +182 +181 +174 +159 +69 +25 +8 +5 +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 +3 +7 +16 +31 +58 +78 +94 +108 +120 +133 +142 +149 +154 +156 +156 +151 +126 +86 +35 +18 +34 +73 +116 +143 +147 +149 +151 +152 +154 +156 +155 +153 +148 +140 +114 +78 +44 +19 +12 +13 +18 +23 +31 +48 +130 +182 +208 +217 +216 +215 +212 +209 +205 +201 +196 +191 +187 +186 +186 +187 +190 +191 +193 +193 +193 +193 +192 +190 +187 +178 +168 +155 +140 +124 +106 +101 +102 +110 +124 +150 +172 +191 +204 +209 +210 +211 +212 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +212 +212 +213 +216 +220 +223 +225 +226 +226 +224 +223 +221 +221 +220 +221 +222 +223 +224 +224 +223 +221 +220 +220 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +223 +225 +226 +227 +227 +227 +226 +225 +224 +223 +223 +223 +222 +222 +221 +220 +216 +212 +210 +210 +209 +209 +208 +204 +192 +167 +125 +121 +125 +143 +179 +199 +204 +209 +214 +216 +215 +208 +200 +193 +191 +191 +191 +191 +190 +185 +164 +152 +118 +70 +19 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +83 +90 +113 +136 +147 +154 +157 +158 +157 +156 +156 +155 +156 +157 +157 +155 +155 +155 +157 +162 +178 +182 +182 +178 +165 +86 +31 +8 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +12 +23 +38 +54 +72 +95 +114 +130 +143 +151 +155 +154 +148 +124 +71 +14 +10 +22 +54 +106 +142 +147 +151 +153 +155 +156 +155 +153 +151 +147 +126 +99 +64 +32 +11 +7 +9 +14 +21 +28 +56 +122 +175 +208 +217 +216 +215 +213 +210 +206 +201 +198 +194 +191 +190 +190 +191 +192 +193 +193 +193 +193 +192 +190 +187 +178 +167 +153 +138 +121 +105 +102 +105 +115 +131 +158 +179 +196 +206 +210 +211 +211 +213 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +212 +213 +215 +218 +222 +224 +225 +225 +224 +222 +220 +219 +219 +220 +222 +223 +224 +224 +224 +222 +221 +220 +220 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +224 +226 +226 +227 +227 +226 +225 +223 +223 +222 +222 +222 +221 +221 +220 +216 +212 +210 +209 +209 +209 +208 +205 +191 +167 +134 +125 +127 +150 +179 +198 +205 +211 +214 +215 +215 +208 +198 +193 +192 +191 +191 +191 +189 +181 +167 +153 +119 +69 +23 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +84 +95 +117 +139 +148 +155 +158 +158 +157 +156 +156 +156 +157 +158 +159 +157 +156 +155 +155 +158 +172 +180 +182 +179 +171 +98 +37 +10 +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 +2 +4 +8 +14 +23 +36 +60 +83 +106 +127 +141 +151 +153 +150 +134 +97 +22 +9 +9 +23 +52 +108 +133 +145 +151 +154 +155 +154 +152 +150 +146 +129 +103 +71 +38 +13 +6 +6 +9 +13 +22 +40 +79 +136 +187 +212 +216 +216 +215 +213 +210 +204 +201 +198 +195 +193 +193 +193 +193 +194 +194 +194 +193 +192 +190 +187 +178 +166 +153 +137 +120 +105 +103 +108 +119 +135 +162 +183 +198 +208 +210 +211 +212 +213 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +211 +211 +212 +213 +215 +219 +223 +224 +224 +224 +223 +220 +219 +218 +219 +220 +223 +224 +224 +224 +224 +222 +221 +221 +220 +220 +220 +220 +220 +220 +220 +220 +221 +222 +224 +225 +226 +226 +226 +226 +225 +223 +222 +222 +221 +221 +221 +221 +219 +216 +212 +210 +209 +209 +208 +208 +206 +193 +169 +146 +132 +129 +151 +174 +194 +204 +210 +213 +215 +214 +211 +199 +194 +192 +192 +191 +191 +188 +180 +169 +159 +128 +76 +35 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +85 +99 +122 +142 +149 +157 +159 +159 +157 +156 +156 +157 +158 +159 +159 +159 +157 +155 +155 +156 +166 +177 +182 +180 +174 +106 +42 +12 +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 +2 +4 +8 +14 +30 +51 +77 +103 +127 +144 +148 +148 +137 +109 +28 +10 +3 +7 +19 +61 +97 +124 +141 +149 +152 +152 +150 +146 +142 +127 +105 +75 +42 +14 +6 +5 +6 +8 +13 +27 +52 +98 +151 +199 +214 +216 +215 +214 +213 +208 +204 +201 +199 +197 +195 +195 +195 +194 +194 +194 +194 +193 +190 +187 +177 +166 +152 +136 +119 +105 +104 +110 +122 +138 +165 +185 +200 +208 +211 +211 +212 +213 +214 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +212 +213 +216 +219 +223 +223 +223 +223 +221 +218 +217 +217 +218 +220 +224 +224 +224 +224 +224 +223 +222 +222 +221 +220 +220 +220 +220 +220 +221 +222 +223 +224 +225 +226 +226 +226 +225 +224 +223 +221 +221 +221 +221 +221 +220 +218 +215 +212 +210 +208 +208 +208 +208 +206 +194 +172 +152 +138 +133 +148 +174 +192 +203 +208 +213 +214 +213 +210 +203 +194 +192 +192 +192 +192 +189 +181 +171 +158 +141 +86 +40 +13 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +104 +126 +144 +150 +158 +159 +159 +157 +156 +156 +157 +159 +160 +160 +159 +159 +157 +155 +155 +161 +174 +181 +181 +175 +111 +46 +14 +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 +2 +3 +10 +24 +45 +71 +100 +126 +135 +137 +129 +107 +31 +10 +2 +2 +3 +20 +54 +87 +116 +136 +143 +145 +144 +141 +137 +122 +104 +75 +44 +14 +5 +5 +4 +5 +6 +17 +34 +65 +112 +175 +210 +214 +216 +215 +214 +212 +207 +205 +202 +200 +197 +197 +196 +195 +195 +194 +194 +193 +191 +187 +178 +166 +151 +135 +117 +106 +106 +112 +124 +141 +167 +187 +200 +209 +211 +212 +212 +213 +214 +215 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +212 +213 +216 +219 +222 +222 +222 +221 +219 +216 +216 +216 +217 +220 +224 +225 +225 +225 +225 +224 +223 +223 +222 +222 +221 +221 +221 +222 +222 +224 +225 +225 +226 +226 +226 +225 +224 +222 +221 +220 +220 +220 +220 +219 +217 +214 +211 +209 +208 +208 +208 +207 +204 +198 +174 +152 +142 +140 +144 +174 +193 +203 +209 +212 +214 +213 +210 +204 +196 +192 +192 +192 +191 +190 +182 +171 +159 +140 +109 +41 +14 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +87 +110 +131 +147 +151 +158 +160 +159 +157 +156 +156 +158 +159 +160 +160 +160 +159 +158 +156 +155 +158 +171 +179 +181 +177 +115 +48 +14 +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 +2 +5 +14 +30 +54 +94 +107 +111 +105 +92 +29 +10 +2 +1 +1 +3 +13 +37 +71 +108 +126 +133 +134 +132 +129 +116 +98 +73 +43 +13 +4 +4 +4 +4 +4 +7 +21 +45 +81 +134 +201 +211 +215 +216 +215 +214 +211 +207 +204 +203 +199 +198 +198 +197 +196 +195 +194 +193 +191 +187 +178 +166 +151 +134 +117 +107 +108 +114 +126 +143 +169 +187 +201 +209 +211 +212 +213 +213 +214 +215 +215 +216 +216 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +212 +213 +216 +219 +221 +221 +221 +220 +218 +215 +215 +215 +216 +220 +224 +225 +225 +225 +225 +225 +225 +224 +224 +224 +224 +224 +224 +225 +225 +225 +226 +226 +226 +226 +225 +223 +222 +221 +220 +220 +220 +219 +217 +216 +212 +210 +208 +208 +208 +208 +207 +205 +196 +178 +149 +144 +142 +148 +168 +197 +205 +209 +212 +214 +214 +210 +203 +196 +192 +192 +192 +191 +189 +184 +171 +162 +144 +111 +58 +9 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +89 +118 +138 +149 +152 +159 +161 +159 +157 +157 +157 +158 +159 +160 +160 +160 +160 +159 +157 +155 +157 +169 +178 +181 +177 +117 +48 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +4 +7 +24 +36 +39 +37 +30 +10 +4 +2 +1 +1 +1 +2 +6 +16 +39 +80 +97 +106 +108 +106 +95 +80 +55 +29 +7 +2 +2 +3 +3 +3 +4 +7 +21 +47 +88 +169 +200 +213 +216 +216 +215 +214 +210 +207 +205 +203 +201 +199 +198 +197 +195 +194 +193 +191 +188 +178 +166 +151 +134 +117 +108 +109 +116 +127 +143 +168 +186 +200 +209 +211 +212 +213 +213 +214 +214 +215 +215 +215 +216 +216 +216 +216 +216 +216 +216 +215 +214 +213 +211 +211 +211 +211 +213 +215 +218 +220 +220 +219 +218 +216 +214 +213 +213 +215 +219 +224 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +226 +225 +225 +224 +222 +220 +220 +219 +218 +217 +215 +214 +212 +210 +208 +208 +208 +208 +207 +205 +198 +183 +166 +152 +147 +148 +161 +180 +199 +209 +211 +213 +213 +213 +208 +200 +195 +192 +192 +192 +191 +186 +180 +172 +160 +136 +94 +48 +11 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +91 +124 +143 +151 +153 +160 +161 +159 +157 +157 +157 +158 +159 +160 +160 +160 +160 +159 +157 +155 +157 +169 +178 +181 +177 +114 +46 +13 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +8 +12 +13 +12 +10 +4 +2 +1 +1 +1 +1 +1 +3 +6 +14 +37 +59 +74 +81 +82 +74 +61 +41 +20 +5 +2 +2 +2 +3 +3 +3 +5 +13 +30 +61 +133 +182 +206 +214 +216 +216 +215 +213 +210 +206 +204 +202 +201 +200 +199 +196 +195 +193 +191 +188 +179 +167 +152 +135 +118 +109 +110 +117 +128 +143 +166 +184 +198 +208 +211 +212 +213 +213 +214 +214 +215 +215 +215 +215 +216 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +211 +212 +214 +217 +218 +218 +218 +217 +215 +212 +212 +212 +213 +216 +223 +224 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +225 +224 +224 +222 +221 +220 +218 +217 +216 +215 +214 +213 +212 +210 +210 +209 +208 +208 +207 +205 +203 +190 +176 +165 +157 +152 +155 +168 +184 +199 +208 +211 +212 +213 +212 +208 +199 +195 +193 +192 +192 +189 +185 +179 +172 +163 +133 +90 +50 +19 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +94 +129 +147 +153 +154 +160 +161 +160 +158 +157 +157 +158 +159 +159 +160 +160 +160 +159 +157 +156 +157 +169 +178 +181 +176 +108 +43 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +13 +28 +41 +51 +56 +51 +41 +27 +13 +4 +1 +1 +1 +2 +3 +3 +4 +7 +18 +39 +101 +158 +194 +212 +215 +216 +216 +215 +212 +209 +206 +204 +203 +201 +200 +197 +195 +194 +192 +188 +180 +168 +153 +136 +119 +110 +111 +117 +127 +141 +163 +181 +196 +206 +211 +212 +213 +213 +214 +214 +215 +215 +215 +215 +215 +216 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +211 +212 +213 +215 +217 +217 +217 +216 +215 +212 +211 +211 +211 +213 +220 +223 +224 +225 +225 +225 +225 +225 +224 +224 +224 +224 +223 +223 +222 +221 +220 +218 +217 +216 +215 +214 +213 +212 +212 +210 +210 +209 +208 +208 +207 +205 +201 +195 +187 +174 +165 +159 +157 +159 +174 +189 +201 +208 +211 +212 +212 +210 +206 +201 +195 +193 +192 +191 +189 +184 +179 +171 +159 +139 +89 +48 +21 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +98 +133 +150 +155 +156 +161 +161 +160 +158 +157 +157 +158 +158 +159 +160 +160 +160 +159 +157 +156 +157 +170 +179 +181 +174 +100 +38 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +7 +16 +24 +30 +28 +23 +15 +8 +3 +1 +1 +1 +1 +2 +2 +3 +4 +9 +22 +72 +128 +175 +206 +214 +215 +216 +216 +215 +212 +208 +207 +205 +203 +201 +198 +196 +194 +192 +189 +181 +170 +155 +138 +120 +111 +112 +117 +127 +139 +160 +177 +192 +204 +210 +212 +213 +213 +214 +214 +214 +214 +215 +215 +215 +215 +216 +216 +216 +216 +215 +214 +213 +212 +211 +211 +211 +211 +212 +214 +216 +216 +216 +215 +214 +211 +210 +209 +209 +210 +216 +221 +223 +224 +225 +225 +224 +224 +223 +223 +222 +222 +221 +220 +219 +217 +216 +215 +214 +213 +212 +211 +211 +210 +210 +209 +208 +208 +207 +206 +202 +197 +190 +181 +171 +163 +161 +162 +166 +175 +195 +205 +210 +212 +212 +212 +209 +205 +200 +195 +193 +192 +191 +188 +185 +178 +171 +157 +134 +99 +42 +17 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +102 +136 +151 +156 +157 +161 +161 +160 +158 +157 +157 +157 +158 +159 +159 +159 +159 +159 +157 +156 +158 +172 +180 +180 +171 +87 +32 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +5 +8 +9 +7 +5 +3 +2 +1 +1 +1 +1 +1 +2 +2 +3 +4 +7 +44 +98 +154 +197 +212 +215 +216 +216 +216 +216 +211 +209 +207 +205 +202 +200 +196 +194 +192 +190 +182 +171 +157 +140 +122 +113 +113 +117 +125 +137 +156 +172 +188 +200 +208 +211 +213 +213 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +215 +215 +215 +215 +214 +213 +212 +211 +211 +211 +212 +213 +214 +215 +215 +214 +214 +211 +209 +208 +208 +208 +210 +216 +220 +223 +224 +224 +224 +223 +222 +222 +220 +219 +218 +217 +216 +214 +213 +212 +212 +211 +211 +210 +210 +209 +209 +208 +207 +206 +204 +200 +190 +181 +174 +168 +164 +163 +164 +172 +184 +200 +210 +211 +212 +212 +212 +209 +203 +198 +195 +193 +192 +190 +187 +183 +179 +172 +159 +130 +91 +45 +9 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +108 +137 +152 +157 +158 +162 +162 +161 +159 +157 +157 +157 +158 +158 +159 +159 +159 +158 +157 +156 +160 +175 +181 +177 +162 +65 +22 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +5 +19 +58 +113 +168 +206 +214 +215 +216 +217 +217 +215 +212 +210 +208 +205 +201 +198 +195 +193 +191 +184 +174 +160 +144 +126 +114 +114 +117 +124 +133 +149 +164 +180 +193 +203 +209 +211 +213 +213 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +215 +215 +214 +214 +213 +212 +211 +211 +211 +212 +213 +213 +213 +213 +213 +211 +209 +208 +206 +206 +205 +207 +211 +215 +218 +221 +222 +221 +221 +220 +219 +218 +217 +215 +214 +213 +212 +211 +211 +210 +210 +209 +208 +207 +206 +202 +197 +192 +185 +179 +173 +170 +169 +168 +167 +176 +189 +200 +207 +211 +212 +212 +211 +209 +206 +199 +196 +194 +193 +192 +188 +184 +180 +176 +170 +145 +105 +63 +28 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +111 +138 +152 +158 +159 +162 +162 +161 +159 +158 +157 +158 +158 +158 +159 +159 +159 +158 +157 +157 +164 +178 +182 +173 +146 +47 +15 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +3 +12 +38 +83 +138 +194 +212 +214 +215 +216 +217 +216 +214 +212 +210 +206 +202 +198 +196 +193 +192 +185 +176 +163 +148 +130 +116 +115 +117 +123 +131 +144 +157 +172 +186 +197 +205 +209 +212 +213 +213 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +215 +215 +214 +213 +212 +212 +211 +211 +212 +212 +212 +212 +212 +212 +211 +209 +208 +206 +205 +204 +204 +205 +207 +209 +212 +214 +216 +216 +217 +216 +215 +215 +214 +213 +211 +210 +209 +208 +207 +205 +203 +200 +197 +194 +188 +184 +181 +178 +175 +172 +172 +174 +179 +185 +196 +203 +208 +210 +211 +211 +209 +207 +204 +200 +196 +194 +192 +189 +187 +183 +180 +173 +161 +140 +92 +54 +27 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +115 +139 +152 +159 +160 +163 +163 +161 +160 +158 +158 +158 +158 +158 +158 +159 +158 +158 +157 +157 +169 +180 +181 +165 +124 +31 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +23 +57 +107 +171 +208 +212 +214 +215 +217 +217 +216 +214 +211 +208 +203 +199 +196 +194 +192 +186 +178 +166 +152 +134 +118 +116 +118 +122 +128 +139 +151 +164 +178 +190 +200 +206 +209 +212 +213 +213 +214 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +215 +214 +214 +213 +212 +212 +212 +212 +212 +212 +212 +212 +212 +211 +209 +208 +207 +205 +203 +203 +202 +203 +203 +205 +206 +207 +208 +209 +209 +208 +208 +207 +206 +205 +204 +202 +200 +199 +196 +193 +191 +188 +185 +181 +179 +177 +176 +176 +178 +181 +187 +193 +200 +207 +210 +211 +211 +210 +208 +205 +202 +199 +196 +193 +190 +188 +185 +182 +178 +169 +152 +127 +93 +45 +22 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +118 +139 +152 +159 +161 +163 +163 +162 +160 +158 +158 +158 +158 +158 +158 +159 +158 +158 +157 +159 +175 +181 +178 +154 +96 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +12 +36 +77 +139 +200 +209 +213 +214 +216 +217 +216 +215 +213 +209 +204 +200 +197 +195 +193 +188 +180 +170 +156 +139 +121 +118 +118 +121 +126 +135 +144 +156 +168 +181 +194 +200 +205 +209 +212 +213 +213 +213 +213 +214 +214 +214 +214 +214 +214 +215 +215 +215 +215 +214 +214 +213 +213 +212 +212 +212 +212 +212 +212 +211 +211 +210 +209 +207 +206 +204 +203 +202 +201 +200 +200 +200 +200 +200 +200 +200 +200 +200 +199 +198 +197 +195 +194 +192 +190 +187 +185 +183 +182 +181 +179 +179 +179 +181 +183 +189 +195 +201 +206 +210 +212 +211 +210 +209 +207 +204 +200 +197 +195 +193 +189 +186 +184 +180 +177 +165 +145 +116 +81 +45 +13 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +120 +140 +152 +159 +161 +164 +164 +163 +161 +158 +158 +158 +158 +158 +158 +159 +158 +157 +158 +161 +181 +182 +173 +138 +64 +8 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +19 +49 +102 +187 +204 +212 +214 +214 +216 +216 +215 +213 +211 +205 +201 +198 +196 +194 +189 +182 +173 +161 +145 +124 +120 +119 +121 +125 +132 +138 +147 +158 +171 +185 +193 +200 +205 +209 +212 +213 +213 +213 +213 +213 +213 +214 +214 +214 +214 +214 +214 +214 +214 +214 +214 +213 +213 +212 +212 +212 +212 +211 +211 +211 +210 +209 +208 +207 +204 +203 +202 +201 +200 +198 +198 +197 +196 +195 +194 +194 +193 +192 +191 +190 +189 +188 +187 +186 +184 +184 +183 +182 +181 +182 +184 +187 +192 +198 +205 +209 +211 +211 +212 +211 +209 +207 +205 +202 +199 +196 +193 +190 +187 +184 +182 +180 +175 +167 +138 +101 +63 +31 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +123 +140 +152 +159 +162 +164 +164 +164 +162 +160 +158 +158 +158 +158 +159 +159 +158 +158 +161 +170 +183 +181 +152 +100 +29 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +25 +59 +145 +188 +207 +213 +214 +215 +215 +215 +214 +211 +207 +203 +200 +197 +195 +191 +186 +178 +167 +154 +132 +124 +121 +121 +124 +129 +133 +138 +146 +156 +170 +180 +188 +195 +201 +207 +210 +211 +212 +213 +213 +213 +213 +213 +213 +213 +214 +214 +214 +214 +214 +214 +214 +213 +213 +213 +212 +212 +212 +211 +211 +210 +210 +209 +208 +207 +205 +204 +202 +200 +199 +198 +197 +196 +195 +194 +193 +192 +192 +191 +190 +189 +188 +187 +187 +186 +187 +188 +191 +194 +199 +203 +207 +209 +210 +211 +211 +211 +210 +208 +206 +204 +202 +199 +197 +193 +190 +186 +184 +182 +179 +174 +164 +145 +114 +65 +34 +14 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +124 +139 +151 +159 +162 +165 +165 +164 +163 +161 +159 +159 +159 +159 +159 +159 +158 +159 +164 +177 +181 +171 +124 +64 +12 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +5 +15 +36 +103 +165 +198 +211 +213 +214 +215 +215 +214 +212 +208 +205 +201 +199 +196 +192 +188 +181 +173 +162 +141 +129 +124 +122 +124 +128 +131 +134 +139 +146 +158 +167 +176 +184 +192 +200 +204 +207 +210 +211 +212 +212 +212 +212 +213 +213 +213 +213 +213 +214 +214 +214 +214 +213 +213 +213 +213 +213 +212 +212 +212 +211 +211 +210 +210 +209 +208 +206 +205 +204 +202 +201 +200 +198 +197 +196 +195 +195 +194 +194 +193 +194 +194 +195 +195 +197 +199 +201 +203 +205 +207 +209 +209 +210 +210 +210 +209 +208 +206 +205 +202 +200 +197 +194 +190 +186 +184 +182 +180 +177 +168 +150 +124 +93 +60 +26 +13 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +125 +139 +150 +158 +162 +165 +165 +165 +164 +162 +160 +159 +159 +160 +160 +158 +158 +162 +170 +180 +179 +148 +91 +35 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +18 +68 +134 +180 +207 +213 +214 +214 +214 +214 +213 +209 +206 +203 +200 +197 +194 +190 +185 +178 +169 +150 +137 +128 +124 +124 +127 +129 +132 +135 +139 +148 +156 +164 +172 +180 +190 +196 +201 +205 +208 +210 +211 +212 +212 +212 +212 +212 +212 +212 +213 +213 +213 +213 +213 +213 +213 +213 +213 +213 +213 +212 +212 +212 +212 +211 +210 +210 +209 +208 +207 +206 +205 +204 +203 +203 +202 +201 +201 +201 +201 +201 +202 +202 +203 +204 +206 +207 +208 +209 +210 +210 +210 +209 +209 +209 +207 +206 +204 +203 +200 +197 +194 +191 +187 +184 +181 +179 +176 +170 +161 +135 +107 +77 +48 +25 +7 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +126 +139 +149 +157 +162 +165 +165 +165 +164 +163 +161 +161 +161 +161 +160 +158 +160 +167 +175 +181 +170 +115 +57 +14 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +7 +39 +98 +155 +197 +211 +213 +214 +214 +214 +213 +210 +207 +204 +201 +199 +195 +192 +188 +182 +175 +160 +146 +135 +128 +126 +126 +129 +131 +133 +135 +140 +146 +152 +160 +167 +178 +185 +191 +197 +201 +206 +208 +210 +211 +211 +211 +211 +212 +212 +212 +212 +212 +213 +213 +213 +213 +213 +213 +213 +213 +213 +213 +212 +212 +212 +212 +211 +211 +211 +211 +210 +209 +209 +209 +208 +208 +208 +208 +208 +208 +208 +209 +209 +209 +210 +210 +210 +210 +210 +210 +209 +209 +208 +207 +206 +204 +202 +200 +198 +195 +190 +187 +184 +181 +179 +176 +172 +163 +149 +128 +89 +59 +34 +16 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +138 +148 +156 +161 +164 +165 +165 +165 +164 +163 +163 +162 +161 +159 +159 +163 +172 +179 +178 +149 +72 +25 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +14 +61 +122 +177 +208 +213 +213 +214 +214 +214 +211 +209 +206 +203 +200 +196 +194 +190 +185 +180 +168 +156 +144 +134 +128 +128 +129 +130 +132 +133 +135 +138 +143 +148 +154 +164 +171 +179 +185 +192 +199 +203 +206 +208 +210 +210 +211 +211 +211 +211 +211 +211 +211 +212 +212 +212 +212 +212 +213 +213 +213 +213 +212 +212 +212 +212 +212 +212 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +211 +211 +211 +210 +210 +210 +210 +210 +209 +209 +208 +207 +206 +206 +204 +203 +201 +198 +194 +191 +187 +182 +180 +178 +177 +175 +169 +157 +136 +109 +76 +39 +18 +7 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +138 +147 +155 +160 +163 +164 +165 +165 +164 +164 +163 +161 +159 +159 +161 +170 +174 +172 +160 +76 +28 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +7 +24 +70 +130 +191 +211 +213 +213 +214 +214 +212 +210 +208 +205 +202 +199 +196 +193 +189 +185 +178 +169 +158 +148 +138 +132 +131 +131 +132 +133 +135 +135 +137 +139 +142 +148 +154 +160 +167 +173 +182 +188 +193 +198 +202 +206 +208 +209 +209 +210 +210 +210 +210 +210 +210 +210 +211 +211 +211 +211 +211 +212 +212 +212 +212 +212 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +211 +210 +210 +210 +209 +209 +209 +208 +207 +207 +207 +206 +206 +204 +203 +200 +197 +194 +189 +185 +182 +179 +177 +176 +174 +171 +166 +156 +128 +100 +70 +42 +23 +5 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +138 +147 +153 +158 +163 +164 +164 +165 +164 +164 +162 +161 +160 +161 +167 +173 +171 +154 +111 +39 +15 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +13 +43 +89 +153 +204 +211 +213 +213 +213 +213 +211 +209 +207 +204 +201 +198 +195 +192 +188 +183 +176 +168 +159 +150 +140 +137 +135 +134 +134 +135 +136 +137 +138 +140 +143 +146 +150 +154 +160 +167 +173 +179 +184 +190 +196 +200 +203 +205 +207 +208 +209 +209 +209 +209 +209 +209 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +210 +209 +209 +209 +209 +209 +208 +208 +208 +207 +207 +206 +205 +204 +202 +200 +197 +194 +190 +187 +183 +179 +177 +175 +174 +172 +169 +162 +150 +133 +111 +77 +51 +31 +18 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +139 +147 +152 +157 +161 +163 +164 +164 +164 +162 +161 +160 +161 +162 +170 +171 +156 +123 +73 +23 +10 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +6 +23 +56 +111 +185 +204 +212 +213 +213 +213 +212 +210 +208 +206 +203 +200 +197 +194 +191 +186 +182 +177 +170 +162 +152 +146 +143 +140 +138 +137 +138 +138 +139 +139 +141 +143 +145 +148 +151 +156 +161 +165 +170 +176 +183 +188 +192 +196 +199 +202 +204 +206 +207 +207 +208 +208 +208 +208 +208 +208 +208 +209 +209 +209 +209 +209 +209 +209 +209 +209 +209 +209 +208 +208 +208 +208 +207 +207 +207 +206 +206 +205 +204 +203 +200 +198 +196 +193 +190 +186 +183 +180 +177 +175 +173 +171 +169 +166 +161 +147 +131 +111 +89 +65 +36 +20 +11 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +129 +140 +147 +152 +155 +160 +162 +163 +164 +163 +161 +160 +161 +162 +164 +171 +162 +132 +91 +49 +19 +9 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +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 +31 +69 +153 +190 +207 +212 +213 +213 +213 +211 +210 +208 +205 +202 +199 +197 +194 +190 +187 +183 +178 +173 +164 +158 +153 +149 +145 +142 +141 +141 +140 +141 +141 +142 +143 +145 +146 +149 +152 +155 +159 +163 +169 +174 +178 +183 +187 +193 +196 +199 +201 +203 +204 +205 +206 +206 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +207 +206 +206 +206 +205 +205 +204 +203 +202 +200 +199 +197 +195 +191 +188 +185 +182 +179 +176 +173 +172 +170 +169 +166 +163 +157 +148 +136 +111 +88 +66 +45 +28 +9 +5 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +141 +147 +151 +154 +159 +162 +163 +162 +160 +160 +161 +161 +163 +167 +169 +144 +107 +70 +44 +23 +11 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +12 +32 +108 +166 +198 +211 +213 +213 +213 +212 +211 +209 +207 +204 +201 +199 +196 +192 +190 +187 +185 +182 +175 +170 +166 +162 +158 +153 +150 +147 +145 +143 +142 +142 +143 +144 +145 +146 +149 +150 +152 +154 +158 +161 +165 +169 +172 +178 +182 +186 +190 +193 +197 +199 +201 +203 +204 +204 +205 +205 +205 +205 +205 +205 +205 +204 +204 +204 +204 +203 +203 +202 +201 +200 +199 +197 +196 +193 +190 +188 +185 +182 +178 +175 +173 +171 +169 +168 +167 +166 +165 +163 +157 +147 +132 +114 +91 +61 +41 +26 +15 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +131 +142 +148 +151 +153 +159 +160 +159 +159 +160 +161 +159 +159 +162 +170 +155 +117 +90 +70 +52 +25 +12 +5 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +48 +109 +163 +200 +211 +212 +213 +213 +212 +211 +209 +207 +204 +202 +199 +196 +193 +191 +190 +188 +185 +182 +179 +177 +175 +172 +169 +166 +163 +159 +154 +151 +148 +146 +146 +146 +148 +149 +150 +152 +154 +155 +157 +158 +160 +162 +165 +167 +169 +172 +175 +178 +181 +184 +186 +189 +191 +192 +194 +194 +195 +195 +195 +195 +194 +194 +192 +191 +190 +188 +186 +184 +182 +180 +178 +175 +173 +171 +169 +167 +166 +165 +164 +164 +163 +161 +158 +153 +144 +131 +107 +87 +68 +49 +31 +13 +9 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +131 +143 +149 +151 +153 +158 +158 +159 +160 +161 +159 +157 +161 +167 +168 +131 +108 +95 +83 +65 +32 +16 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +24 +68 +121 +170 +203 +211 +212 +212 +212 +212 +210 +209 +206 +204 +202 +198 +196 +194 +192 +191 +190 +188 +186 +184 +183 +181 +180 +178 +176 +174 +171 +168 +164 +161 +157 +152 +151 +150 +150 +151 +153 +154 +155 +156 +158 +160 +161 +162 +164 +165 +167 +168 +169 +170 +172 +173 +174 +175 +177 +177 +178 +179 +179 +180 +180 +179 +179 +178 +177 +176 +174 +173 +171 +170 +168 +166 +165 +164 +163 +163 +162 +161 +159 +156 +152 +141 +129 +115 +100 +83 +60 +45 +32 +20 +10 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +133 +144 +149 +151 +153 +157 +158 +159 +160 +160 +156 +156 +164 +168 +158 +120 +113 +110 +105 +92 +52 +27 +11 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +9 +35 +79 +130 +180 +207 +210 +212 +212 +212 +211 +210 +208 +206 +204 +201 +199 +196 +194 +193 +192 +191 +191 +190 +188 +188 +187 +186 +186 +185 +183 +181 +178 +176 +172 +167 +163 +160 +157 +155 +155 +155 +155 +156 +157 +158 +159 +160 +161 +162 +163 +163 +164 +164 +165 +165 +166 +166 +166 +167 +167 +167 +168 +168 +167 +167 +167 +166 +166 +165 +164 +163 +163 +162 +161 +160 +159 +159 +158 +157 +153 +148 +142 +134 +123 +105 +90 +73 +57 +43 +27 +19 +12 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +134 +145 +149 +151 +153 +157 +159 +161 +161 +157 +154 +160 +168 +166 +144 +121 +127 +130 +130 +123 +84 +49 +23 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +12 +41 +85 +143 +194 +206 +211 +212 +212 +212 +211 +210 +208 +207 +204 +202 +199 +197 +195 +194 +193 +193 +193 +192 +192 +192 +192 +191 +191 +191 +190 +189 +188 +186 +183 +179 +175 +171 +166 +162 +161 +159 +159 +158 +159 +159 +160 +161 +161 +162 +162 +163 +163 +163 +163 +163 +162 +162 +162 +162 +161 +161 +161 +160 +160 +159 +159 +159 +158 +158 +158 +157 +157 +157 +156 +155 +154 +151 +148 +138 +128 +116 +102 +86 +65 +49 +35 +24 +15 +7 +5 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +136 +146 +150 +151 +153 +157 +163 +163 +159 +153 +154 +169 +172 +160 +131 +135 +145 +150 +150 +148 +127 +82 +43 +15 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +13 +42 +92 +166 +195 +208 +211 +212 +212 +212 +211 +210 +209 +207 +204 +202 +200 +197 +195 +195 +194 +194 +194 +195 +195 +195 +195 +195 +195 +195 +194 +194 +193 +193 +192 +191 +189 +186 +181 +177 +172 +168 +165 +162 +161 +161 +161 +162 +162 +163 +163 +163 +163 +163 +163 +163 +162 +162 +162 +161 +161 +160 +160 +159 +159 +158 +158 +158 +157 +156 +156 +155 +154 +153 +151 +147 +141 +133 +114 +99 +83 +66 +49 +29 +18 +11 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +137 +146 +150 +151 +154 +162 +164 +161 +156 +155 +168 +177 +163 +144 +135 +153 +155 +155 +153 +151 +146 +127 +86 +41 +10 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +10 +30 +96 +151 +187 +207 +211 +211 +212 +212 +211 +210 +209 +208 +206 +204 +202 +199 +197 +196 +195 +195 +195 +196 +196 +196 +196 +196 +196 +197 +197 +197 +197 +197 +197 +197 +196 +195 +193 +192 +190 +187 +184 +181 +179 +176 +174 +172 +171 +171 +170 +170 +170 +169 +169 +169 +168 +167 +167 +166 +166 +165 +164 +163 +163 +162 +161 +160 +159 +157 +156 +154 +150 +144 +134 +120 +102 +77 +60 +44 +30 +18 +8 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +146 +150 +153 +158 +167 +164 +160 +158 +162 +179 +179 +159 +140 +144 +157 +157 +156 +153 +150 +147 +139 +110 +69 +22 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +4 +12 +49 +97 +145 +185 +206 +211 +211 +212 +212 +212 +210 +209 +208 +207 +205 +203 +201 +199 +198 +197 +196 +196 +196 +196 +196 +196 +197 +197 +197 +198 +198 +198 +198 +198 +198 +198 +197 +197 +196 +196 +194 +193 +191 +190 +189 +187 +185 +184 +183 +183 +182 +181 +181 +180 +180 +179 +178 +178 +177 +177 +175 +174 +172 +170 +169 +165 +162 +159 +156 +152 +144 +132 +115 +96 +76 +52 +37 +24 +14 +7 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +139 +147 +150 +154 +162 +169 +163 +161 +164 +174 +184 +174 +154 +140 +151 +160 +160 +157 +153 +149 +146 +143 +125 +91 +38 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +20 +53 +97 +143 +183 +207 +210 +211 +212 +212 +211 +211 +210 +209 +208 +206 +205 +203 +201 +200 +199 +199 +198 +198 +197 +197 +197 +198 +198 +198 +199 +199 +199 +199 +199 +199 +199 +199 +199 +200 +199 +199 +198 +198 +198 +197 +196 +195 +194 +193 +192 +191 +191 +190 +189 +188 +187 +186 +185 +184 +181 +179 +177 +174 +171 +167 +162 +157 +150 +141 +123 +105 +86 +67 +50 +31 +20 +11 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +141 +147 +151 +156 +166 +170 +163 +164 +171 +185 +186 +166 +149 +142 +156 +163 +162 +157 +152 +147 +145 +143 +134 +107 +54 +9 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +21 +51 +92 +141 +189 +202 +209 +211 +211 +212 +211 +211 +210 +210 +209 +207 +206 +205 +204 +203 +202 +201 +200 +200 +199 +199 +199 +199 +200 +200 +200 +201 +201 +201 +200 +200 +201 +201 +201 +201 +201 +202 +202 +202 +202 +202 +202 +201 +201 +200 +199 +198 +197 +196 +194 +193 +191 +189 +186 +182 +179 +176 +172 +167 +159 +151 +142 +131 +116 +91 +72 +54 +39 +26 +15 +9 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +143 +148 +152 +158 +170 +169 +164 +168 +177 +188 +186 +157 +145 +147 +159 +164 +163 +157 +151 +145 +143 +142 +137 +117 +70 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +5 +19 +44 +82 +147 +184 +203 +210 +210 +211 +212 +211 +211 +211 +210 +210 +209 +208 +207 +206 +205 +204 +203 +202 +202 +202 +202 +202 +202 +203 +203 +203 +203 +202 +202 +202 +202 +202 +201 +201 +202 +202 +203 +203 +204 +204 +204 +204 +204 +204 +203 +201 +200 +198 +195 +193 +190 +187 +184 +179 +175 +169 +162 +154 +137 +123 +107 +90 +73 +52 +37 +25 +15 +8 +5 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +144 +148 +155 +163 +173 +166 +165 +173 +184 +189 +181 +150 +141 +147 +160 +161 +155 +149 +144 +143 +143 +142 +138 +122 +83 +19 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +10 +26 +68 +110 +150 +183 +204 +210 +211 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +210 +210 +210 +209 +209 +208 +208 +208 +207 +207 +207 +206 +206 +205 +204 +203 +203 +202 +202 +202 +202 +203 +203 +203 +204 +204 +205 +205 +203 +201 +198 +195 +191 +185 +180 +172 +164 +154 +140 +128 +115 +102 +88 +71 +58 +44 +32 +23 +14 +10 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +144 +149 +157 +166 +173 +164 +165 +176 +187 +190 +173 +147 +141 +146 +155 +151 +147 +144 +143 +142 +141 +140 +137 +123 +88 +21 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +9 +32 +60 +93 +127 +159 +189 +200 +206 +209 +211 +211 +212 +212 +212 +212 +212 +211 +211 +211 +211 +211 +211 +210 +210 +210 +209 +209 +208 +208 +207 +206 +205 +205 +204 +203 +202 +202 +202 +202 +203 +203 +202 +202 +201 +198 +191 +185 +178 +170 +161 +148 +138 +127 +116 +105 +89 +78 +67 +56 +45 +35 +26 +19 +13 +8 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +146 +150 +159 +167 +170 +162 +167 +179 +189 +189 +164 +144 +139 +143 +146 +144 +142 +142 +141 +141 +139 +139 +136 +123 +90 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +11 +27 +48 +74 +104 +140 +161 +177 +189 +198 +204 +206 +208 +209 +209 +210 +210 +210 +210 +210 +210 +210 +210 +210 +209 +209 +209 +208 +208 +207 +206 +205 +204 +203 +202 +201 +201 +201 +201 +200 +199 +196 +192 +186 +178 +164 +154 +143 +131 +119 +103 +91 +80 +70 +60 +48 +39 +31 +24 +19 +13 +8 +6 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +147 +151 +159 +166 +166 +160 +170 +181 +190 +188 +156 +141 +138 +139 +139 +140 +141 +141 +140 +139 +138 +137 +135 +122 +90 +23 +8 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +7 +18 +33 +52 +83 +106 +128 +147 +163 +176 +183 +188 +192 +195 +197 +199 +200 +201 +201 +202 +202 +202 +203 +203 +203 +203 +203 +203 +203 +202 +201 +201 +200 +199 +197 +196 +195 +193 +190 +184 +177 +168 +157 +144 +126 +112 +99 +86 +74 +59 +49 +40 +32 +25 +19 +14 +9 +6 +5 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +147 +152 +160 +165 +162 +159 +174 +184 +189 +184 +148 +139 +136 +136 +137 +141 +141 +140 +139 +137 +137 +136 +133 +120 +87 +22 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +3 +8 +17 +34 +50 +66 +81 +96 +115 +128 +139 +149 +157 +165 +169 +172 +175 +178 +180 +182 +184 +186 +188 +189 +190 +191 +192 +192 +192 +192 +191 +190 +189 +187 +184 +179 +174 +166 +153 +140 +126 +112 +98 +80 +67 +55 +43 +33 +24 +18 +12 +8 +5 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +147 +152 +157 +159 +155 +159 +180 +187 +183 +172 +142 +137 +136 +138 +141 +141 +141 +140 +138 +137 +136 +136 +132 +115 +77 +17 +6 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +6 +11 +18 +24 +31 +37 +41 +45 +50 +54 +60 +64 +67 +71 +74 +78 +81 +85 +89 +93 +100 +104 +108 +112 +115 +119 +121 +122 +122 +121 +117 +112 +106 +99 +91 +79 +70 +60 +50 +41 +30 +23 +17 +11 +6 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +145 +151 +154 +154 +152 +168 +183 +184 +176 +163 +141 +139 +139 +141 +142 +142 +141 +140 +140 +138 +137 +136 +130 +110 +67 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +4 +6 +9 +11 +14 +15 +17 +18 +20 +22 +23 +25 +26 +28 +30 +31 +33 +35 +38 +41 +44 +47 +50 +53 +56 +58 +60 +61 +61 +59 +56 +53 +49 +45 +38 +33 +27 +22 +17 +11 +8 +6 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +142 +148 +150 +150 +153 +177 +183 +178 +167 +154 +141 +141 +142 +143 +142 +142 +142 +142 +142 +141 +139 +137 +128 +103 +55 +9 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +3 +3 +4 +4 +4 +4 +5 +5 +6 +6 +7 +8 +8 +9 +10 +11 +12 +14 +15 +17 +18 +20 +21 +22 +23 +23 +23 +22 +20 +19 +17 +14 +11 +9 +7 +5 +3 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +144 +147 +150 +158 +182 +179 +169 +157 +148 +143 +144 +143 +143 +143 +143 +145 +145 +145 +143 +141 +137 +123 +93 +43 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +2 +2 +2 +2 +3 +3 +3 +3 +4 +4 +4 +5 +5 +5 +5 +4 +4 +3 +2 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +142 +145 +153 +171 +181 +171 +159 +150 +145 +145 +144 +143 +143 +143 +146 +148 +149 +148 +146 +143 +138 +117 +81 +31 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +139 +143 +151 +162 +175 +168 +157 +150 +146 +145 +145 +143 +144 +146 +150 +156 +157 +155 +153 +149 +145 +136 +104 +62 +18 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +142 +148 +158 +167 +170 +157 +150 +147 +146 +145 +143 +144 +148 +153 +157 +159 +158 +156 +153 +150 +146 +130 +92 +47 +12 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +145 +153 +161 +165 +159 +149 +147 +146 +145 +144 +143 +149 +154 +158 +160 +160 +159 +157 +154 +152 +146 +120 +78 +35 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +148 +157 +160 +158 +148 +145 +145 +145 +145 +144 +146 +155 +158 +159 +159 +159 +158 +157 +155 +153 +143 +108 +64 +24 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +148 +157 +154 +147 +143 +144 +145 +145 +145 +144 +155 +158 +157 +156 +155 +157 +157 +157 +156 +153 +139 +93 +49 +15 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +148 +148 +143 +138 +143 +144 +145 +144 +145 +148 +159 +153 +151 +150 +151 +153 +155 +156 +155 +151 +118 +68 +30 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +143 +139 +137 +138 +143 +144 +145 +145 +147 +153 +155 +151 +149 +149 +150 +151 +152 +152 +149 +141 +92 +47 +18 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +138 +134 +135 +138 +143 +145 +145 +145 +148 +154 +152 +150 +149 +149 +149 +149 +149 +147 +138 +121 +65 +29 +10 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +134 +131 +134 +138 +143 +145 +145 +145 +148 +153 +151 +150 +149 +149 +148 +147 +145 +138 +123 +94 +40 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +130 +134 +139 +143 +145 +144 +145 +148 +151 +150 +150 +149 +149 +148 +146 +140 +126 +101 +64 +19 +7 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +144 +145 +144 +146 +149 +150 +151 +150 +150 +149 +148 +144 +129 +101 +67 +31 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +144 +145 +144 +146 +149 +150 +151 +151 +150 +148 +147 +141 +115 +81 +46 +17 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +144 +145 +144 +146 +148 +150 +151 +150 +149 +148 +146 +135 +99 +61 +29 +8 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +145 +145 +144 +146 +148 +150 +151 +150 +148 +147 +145 +126 +82 +44 +16 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +140 +145 +145 +145 +146 +148 +150 +150 +149 +148 +146 +143 +112 +64 +28 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +130 +134 +139 +145 +145 +145 +146 +147 +149 +149 +148 +146 +143 +137 +87 +39 +13 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +129 +133 +139 +145 +145 +145 +146 +147 +149 +148 +146 +144 +140 +129 +62 +25 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +129 +133 +139 +145 +146 +146 +147 +148 +148 +147 +145 +143 +134 +112 +39 +14 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +128 +132 +138 +145 +146 +147 +147 +148 +147 +145 +144 +140 +124 +88 +21 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +128 +131 +137 +145 +146 +147 +147 +147 +145 +143 +142 +135 +111 +58 +7 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +127 +130 +136 +143 +146 +146 +145 +144 +142 +142 +139 +118 +78 +22 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +127 +130 +134 +139 +144 +143 +142 +142 +142 +141 +130 +93 +46 +9 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +127 +127 +130 +133 +137 +140 +140 +141 +141 +141 +137 +108 +64 +22 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +128 +129 +132 +135 +138 +139 +140 +140 +139 +123 +76 +35 +7 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +128 +128 +129 +132 +135 +136 +139 +140 +139 +136 +94 +39 +11 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +129 +130 +131 +132 +134 +138 +139 +138 +129 +107 +29 +9 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +130 +131 +132 +133 +136 +139 +138 +127 +101 +52 +10 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +132 +133 +134 +136 +138 +137 +126 +97 +59 +18 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +135 +135 +136 +137 +137 +125 +97 +57 +20 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +137 +137 +137 +137 +134 +94 +44 +16 +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 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +136 +134 +125 +104 +66 +18 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +105 +88 +67 +45 +22 +6 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +55 +41 +26 +13 +4 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +13 +7 +4 +2 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 +1 diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/pal_rgb.h b/privatemodules/nc4/share/hdf5_examples/hl/c/pal_rgb.h new file mode 100644 index 0000000000000000000000000000000000000000..606137e67d947a0e28d4ce0a5e4736350d6c8f32 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/pal_rgb.h @@ -0,0 +1,279 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +const unsigned char pal_rgb[256*3] = {255,255,255, +0,0,131, +0,0,135, +0,0,139, +0,0,143, +0,0,147, +0,0,151, +0,0,155, +0,0,159, +0,0,163, +0,0,167, +0,0,171, +0,0,175, +0,0,179, +0,0,183, +0,0,187, +0,0,191, +0,0,195, +0,0,199, +0,0,203, +0,0,207, +0,0,211, +0,0,215, +0,0,219, +0,0,223, +0,0,227, +0,0,231, +0,0,235, +0,0,239, +0,0,243, +0,0,247, +0,0,251, +0,0,255, +0,0,255, +0,3,255, +0,7,255, +0,11,255, +0,15,255, +0,19,255, +0,23,255, +0,27,255, +0,31,255, +0,35,255, +0,39,255, +0,43,255, +0,47,255, +0,51,255, +0,55,255, +0,59,255, +0,63,255, +0,67,255, +0,71,255, +0,75,255, +0,79,255, +0,83,255, +0,87,255, +0,91,255, +0,95,255, +0,99,255, +0,103,255, +0,107,255, +0,111,255, +0,115,255, +0,119,255, +0,123,255, +0,127,255, +0,131,255, +0,135,255, +0,139,255, +0,143,255, +0,147,255, +0,151,255, +0,155,255, +0,159,255, +0,163,255, +0,167,255, +0,171,255, +0,175,255, +0,179,255, +0,183,255, +0,187,255, +0,191,255, +0,195,255, +0,199,255, +0,203,255, +0,207,255, +0,211,255, +0,215,255, +0,219,255, +0,223,255, +0,227,255, +0,231,255, +0,235,255, +0,239,255, +0,243,255, +0,247,255, +0,251,255, +0,255,255, +0,255,255, +3,255,251, +7,255,247, +11,255,243, +15,255,239, +19,255,235, +23,255,231, +27,255,227, +31,255,223, +35,255,219, +39,255,215, +43,255,211, +47,255,207, +51,255,203, +55,255,199, +59,255,195, +63,255,191, +67,255,187, +71,255,183, +75,255,179, +79,255,175, +83,255,171, +87,255,167, +91,255,163, +95,255,159, +99,255,155, +103,255,151, +107,255,147, +111,255,143, +115,255,139, +119,255,135, +123,255,131, +127,255,127, +131,255,123, +135,255,119, +139,255,115, +143,255,111, +147,255,107, +151,255,103, +155,255,99, +159,255,95, +163,255,91, +167,255,87, +171,255,83, +175,255,79, +179,255,75, +183,255,71, +187,255,67, +191,255,63, +195,255,59, +199,255,55, +203,255,51, +207,255,47, +211,255,43, +215,255,39, +219,255,35, +223,255,31, +227,255,27, +231,255,23, +235,255,19, +239,255,15, +243,255,11, +247,255,7, +251,255,3, +255,255,0, +255,251,0, +255,247,0, +255,243,0, +255,239,0, +255,235,0, +255,231,0, +255,227,0, +255,223,0, +255,219,0, +255,215,0, +255,211,0, +255,207,0, +255,203,0, +255,199,0, +255,195,0, +255,191,0, +255,187,0, +255,183,0, +255,179,0, +255,175,0, +255,171,0, +255,167,0, +255,163,0, +255,159,0, +255,155,0, +255,151,0, +255,147,0, +255,143,0, +255,139,0, +255,135,0, +255,131,0, +255,127,0, +255,123,0, +255,119,0, +255,115,0, +255,111,0, +255,107,0, +255,103,0, +255,99,0, +255,95,0, +255,91,0, +255,87,0, +255,83,0, +255,79,0, +255,75,0, +255,71,0, +255,67,0, +255,63,0, +255,59,0, +255,55,0, +255,51,0, +255,47,0, +255,43,0, +255,39,0, +255,35,0, +255,31,0, +255,27,0, +255,23,0, +255,19,0, +255,15,0, +255,11,0, +255,7,0, +255,3,0, +255,0,0, +250,0,0, +246,0,0, +241,0,0, +237,0,0, +233,0,0, +228,0,0, +224,0,0, +219,0,0, +215,0,0, +211,0,0, +206,0,0, +202,0,0, +197,0,0, +193,0,0, +189,0,0, +184,0,0, +180,0,0, +175,0,0, +171,0,0, +167,0,0, +162,0,0, +158,0,0, +153,0,0, +149,0,0, +145,0,0, +140,0,0, +136,0,0, +131,0,0, +127,0,0 +}; + + + + + + + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/ptExampleFL.c b/privatemodules/nc4/share/hdf5_examples/hl/c/ptExampleFL.c new file mode 100644 index 0000000000000000000000000000000000000000..bbd0bf6a9876f5bf87b8fe3f09844780e0ea714a --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/ptExampleFL.c @@ -0,0 +1,107 @@ +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * 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 files COPYING and Copyright.html. COPYING can be found at the root * + * of the source code distribution tree; Copyright.html can be found at the * + * root level of an installed copy of the electronic HDF5 document set and * + * is linked from the top-level documents page. It can also be found at * + * http://hdfgroup.org/HDF5/doc/Copyright.html. If you do not have * + * access to either file, you may request a copy from help@hdfgroup.org. * + * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ + +#include "hdf5.h" +#include "hdf5_hl.h" +#include <stdlib.h> + +/*------------------------------------------------------------------------- + * Packet Table Fixed-Length Example + * + * Example program that creates a packet table and performs + * writes and reads. + * + *------------------------------------------------------------------------- + */ + +int main(void) +{ + hid_t fid; /* File identifier */ + hid_t ptable; /* Packet table identifier */ + + herr_t err; /* Function return status */ + hsize_t count; /* Number of records in the table */ + + int x; /* Loop variable */ + + /* Buffers to hold data */ + int writeBuffer[5]; + int readBuffer[5]; + + /* Initialize buffers */ + for(x=0; x<5; x++) + { + writeBuffer[x]=x; + readBuffer[x] = -1; + } + + /* Create a file using default properties */ + fid=H5Fcreate("packet_table_FLexample.h5",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 + * level 5. */ + ptable = H5PTcreate_fl(fid, "Packet Test Dataset", H5T_NATIVE_INT, (hsize_t)100, 5); + if(ptable == H5I_INVALID_HID) + goto out; + + /* Write one packet to the packet table */ + err = H5PTappend(ptable, (hsize_t)1, &(writeBuffer[0]) ); + if(err < 0) + goto out; + + /* Write several packets to the packet table */ + err = H5PTappend(ptable, (hsize_t)4, &(writeBuffer[1]) ); + if(err < 0) + goto out; + + /* Get the number of packets in the packet table. This should be five. */ + err = H5PTget_num_packets(ptable, &count); + if(err < 0) + goto out; + + printf("Number of packets in packet table after five appends: %d\n", (int)count); + + /* Initialize packet table's "current record" */ + err = H5PTcreate_index(ptable); + if(err < 0) + goto out; + + /* Iterate through packets, read each one back */ + for(x=0; x<5; x++) + { + err = H5PTget_next(ptable, (hsize_t)1, &(readBuffer[x]) ); + if(err < 0) + goto out; + + printf("Packet %d's value is %d\n", x, readBuffer[x]); + } + + /* Close the packet table */ + err = H5PTclose(ptable); + if(err < 0) + goto out; + + /* Close the file */ + H5Fclose(fid); + + return 0; + + out: /* An error has occurred. Clean up and exit. */ + H5PTclose(ptable); + H5Fclose(fid); + return -1; +} + diff --git a/privatemodules/nc4/share/hdf5_examples/hl/c/run-hlc-ex.sh b/privatemodules/nc4/share/hdf5_examples/hl/c/run-hlc-ex.sh new file mode 100755 index 0000000000000000000000000000000000000000..ae3bac11fc6f6ab688df32bb30de0f9cc2a64c8e --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/c/run-hlc-ex.sh @@ -0,0 +1,121 @@ +#! /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 files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. 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 .../share/hdf5_examples/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 + +# Where the tool is installed. +# default is relative path to installed location of the tools +prefix="${prefix:-../../../../}" +PARALLEL=no # 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/privatemodules/nc4/share/hdf5_examples/hl/run-hl-ex.sh b/privatemodules/nc4/share/hdf5_examples/hl/run-hl-ex.sh new file mode 100755 index 0000000000000000000000000000000000000000..5fa97c09590fa85f856e1822006b93d8c88f4fb4 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/hl/run-hl-ex.sh @@ -0,0 +1,40 @@ +#! /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 files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. 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/privatemodules/nc4/share/hdf5_examples/run-all-ex.sh b/privatemodules/nc4/share/hdf5_examples/run-all-ex.sh new file mode 100755 index 0000000000000000000000000000000000000000..4ff2c55ec1c461d0927921e44d638c646d6ea948 --- /dev/null +++ b/privatemodules/nc4/share/hdf5_examples/run-all-ex.sh @@ -0,0 +1,46 @@ +#! /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 files COPYING and Copyright.html. COPYING can be found at the root +# of the source code distribution tree; Copyright.html can be found at the +# root level of an installed copy of the electronic HDF5 document set and +# is linked from the top-level documents page. It can also be found at +# http://hdfgroup.org/HDF5/doc/Copyright.html. 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 installed hdf5 # +# examples. # +# # +# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # + +echo "Run c examples" +if ((cd c; sh ./run-c-ex.sh) && \ + (if test -d fortran; then + echo "Run fortran examples" + cd fortran; sh ./run-fortran-ex.sh + fi) + (if test -d c++; then + echo "Run c++ examples" + cd c++; sh ./run-c++-ex.sh + fi) + (if test -d hl; then + echo "Run hl examples." + cd hl; sh ./run-hl-ex.sh + fi)); then + echo "Done" + exit 0 +else + exit 1 +fi + diff --git a/privatemodules/nc4/share/man/man1/nccopy.1 b/privatemodules/nc4/share/man/man1/nccopy.1 new file mode 100644 index 0000000000000000000000000000000000000000..7a462a5e945fcec5af6c3dc9a94469063a2b7aa6 --- /dev/null +++ b/privatemodules/nc4/share/man/man1/nccopy.1 @@ -0,0 +1,332 @@ +.\" $Id: nccopy.1 400 2010-08-27 21:02:52Z russ $ +.TH NCCOPY 1 "2012-03-08" "Release 4.2" "UNIDATA UTILITIES" +.SH NAME +nccopy \- Copy a netCDF file, optionally changing format, compression, or chunking in the output. +.SH SYNOPSIS +.ft B +.HP +nccopy +.nh +\%[\-k \fI kind_name \fP] +\%[\-\fIkind_code\fP] +\%[\-d \fI n \fP] +\%[\-s] +\%[\-c \fI chunkspec \fP] +\%[\-u] +\%[\-w] +\%[\-[v|V] var1,...] +\%[\-[g|G] grp1,...] +\%[\-m \fI bufsize \fP] +\%[\-h \fI chunk_cache \fP] +\%[\-e \fI cache_elems \fP] +\%[\-r] +\%\fI infile \fP +\%\fI outfile \fP +.hy +.ft +.SH DESCRIPTION +.LP +The \fBnccopy\fP utility copies an input netCDF file in any supported +format variant to an output netCDF file, optionally converting the +output to any compatible netCDF format variant, compressing the data, +or rechunking the data. For example, if built with the netCDF-3 +library, a netCDF classic file may be copied to a netCDF 64-bit offset +file, permitting larger variables. If built with the netCDF-4 +library, a netCDF classic file may be copied to a netCDF-4 file or to +a netCDF-4 classic model file as well, permitting data compression, +efficient schema changes, larger variable sizes, and use of other +netCDF-4 features. +.LP +If no output format is specified, with either \-k \fIkind_name\fP +or \fI-kind_code\fP, then the output will use the same +format as the input, unless the input is classic or 64-bit offset +and either chunking or compression is specified, in which case the +output will be netCDF-4 classic model format. Attempting +some kinds of format conversion will result in an error, if the +conversion is not possible. For example, an attempt to copy a +netCDF-4 file that uses features of the enhanced model, such as +groups or variable-length strings, to any of the other kinds of netCDF +formats that use the classic model will result in an error. +.LP +\fBnccopy\fP also serves as an example of a generic netCDF-4 program, +with its ability to read any valid netCDF file and handle nested +groups, strings, and user-defined types, including arbitrarily +nested compound types, variable-length types, and data of any valid +netCDF-4 type. +.LP +If DAP support was enabled when \fBnccopy\fP was built, the file name may +specify a DAP URL. This may be used to convert data on DAP servers to +local netCDF files. +.SH OPTIONS +.IP "\fB \-k \fP \fI kind_name \fP" +Use format name to specify the kind of file to be created +and, by inference, the data model (i.e. netcdf-3 (classic) or +netcdf-4 (enhanced)). The possible arguments are: +.RS +.RS +.IP "'nc3' or 'classic' => netCDF classic format" +.IP "'nc6' or '64-bit offset' => netCDF 64-bit format" +.IP "'nc4' or 'netCDF-4' => netCDF-4 format (enhanced data model)" +.IP "'nc7' or 'netCDF-4 classic model' => netCDF-4 classic model format" +.RE +.RE +.IP +Note: The old format numbers '1', '2', '3', '4', equivalent +to the format names 'nc3', 'nc6', 'nc4', or 'nc7' respectively, are +also still accepted but deprecated, due to easy confusion between +format numbers and format names. +.IP "[\fB-\fP\fIkind_code\fP]" +Use format numeric code (instead of format name) to specify the kind of file to be created +and, by inference, the data model (i.e. netcdf-3 (classic) versus +netcdf-4 (enhanced)). The numeric codes are: +.RS +.RS +.IP "3 => netcdf classic format" +.IP "6 => netCDF 64-bit format" +.IP "4 => netCDF-4 format (enhanced data model)" +.IP "7 => netCDF-4 classic model format" +.RE +.RE +The numeric code "7" is used because "7=3+4", specifying the format +that uses the netCDF-3 data model for compatibility with the netCDF-4 +storage format for performance. Credit is due to NCO for use of these +numeric codes instead of the old and confusing format numbers. +.IP "\fB \-d \fP \fI n \fP" +For netCDF-4 output, including netCDF-4 classic model, specify +deflation level (level of compression) for variable data output. 0 +corresponds to no compression and 9 to maximum compression, with +higher levels of compression requiring marginally more time to +compress or uncompress than lower levels. Compression achieved may +also depend on output chunking parameters. If this option is +specified for a classic format or 64-bit offset format input file, it +is not necessary to also specify that the output should be netCDF-4 +classic model, as that will be the default. If this option is not +specified and the input file has compressed variables, the compression +will still be preserved in the output, using the same chunking as in +the input by default. +.IP +Note that \fBnccopy\fP requires all variables to be compressed using the +same compression level, but the API has no such restriction. With +a program you can customize compression for each variable independently. +.IP "\fB \-s \fP" +For netCDF-4 output, including netCDF-4 classic model, specify +shuffling of variable data bytes before compression or after +decompression. Shuffling refers to interlacing of bytes in a chunk so +that the first bytes of all values are contiguous in storage, followed +by all the second bytes, and so on, which often improves compression. +This option is ignored unless a non-zero deflation level is specified. +Using \-d0 to specify no deflation on input data that has been +compressed and shuffled turns off both compression and shuffling in +the output. +.IP "\fB \-u \fP" +Convert any unlimited size dimensions in the input to fixed size +dimensions in the output. This can speed up variable-at-a-time +access, but slow down record-at-a-time access to multiple variables +along an unlimited dimension. +.IP "\fB \-w \fP" +Keep output in memory (as a diskless netCDF file) until output is +closed, at which time output file is written to disk. This can +greatly speedup operations such as converting unlimited dimension to +fixed size (\-u option), chunking, rechunking, or compressing the +input. It requires that available memory is large enough to hold the +output file. This option may provide a larger speedup than careful +tuning of the \-m, \-h, or \-e options, and it's certainly a lot simpler. +.IP "\fB \-c \fP \fIchunkspec\fP" +For netCDF-4 output, including netCDF-4 classic model, specify +chunking (multidimensional tiling) for variable data in the output. +This is useful to specify the units of disk access, compression, or +other filters such as checksums. Changing the chunking in a netCDF +file can also greatly speedup access, by choosing chunk shapes that +are appropriate for the most common access patterns. +.IP +The \fIchunkspec\fP argument is a string of comma-separated associations, +each specifying a dimension name, a '/' character, and optionally the +corresponding chunk length for that dimension. No blanks should +appear in the chunkspec string, except possibly escaped blanks that +are part of a dimension name. A chunkspec names at least one +dimension, and may omit dimensions which are not to be chunked or for +which the default chunk length is desired. If a dimension name is +followed by a '/' character but no subsequent chunk length, the actual +dimension length is assumed. If copying a classic model file to a +netCDF-4 output file and not naming all dimensions in the chunkspec, +unnamed dimensions will also use the actual dimension length for the +chunk length. An example of a chunkspec for variables that use 'm' +and 'n' dimensions might be 'm/100,n/200' to specify 100 by 200 +chunks. To see the chunking resulting from copying with a chunkspec, +use the '\-s' option of ncdump on the output file. +.IP +The chunkspec '/' that omits all dimension names and +corresponding chunk lengths specifies that no chunking is to occur in +the output, so can be used to unchunk all the chunked variables. +To see the chunking resulting from copying with a chunkspec, +use the '\-s' option of ncdump on the output file. +.IP +As an I/O optimization, \fBnccopy\fP has a threshold for the minimum size of +non-record variables that get chunked, currently 8192 bytes. In the future, +use of this threshold and its size may be settable in an option. +.IP +Note that \fBnccopy\fP requires variables that share a dimension to also +share the chunk size associated with that dimension, but the +programming interface has no such restriction. If you need to +customize chunking for variables independently, you will need to use +the library API in a custom utility program. +.IP "\fB \-v \fP \fI var1,... \fP" +The output will include data values for the specified variables, in +addition to the declarations of all dimensions, variables, and +attributes. One or more variables must be specified by name in the +comma-delimited list following this option. The list must be a single +argument to the command, hence cannot contain unescaped blanks or +other white space characters. The named variables must be valid netCDF +variables in the input-file. A variable within a group in a netCDF-4 +file may be specified with an absolute path name, such as +"/GroupA/GroupA2/var". Use of a relative path name such as 'var' or +"grp/var" specifies all matching variable names in the file. The +default, without this option, is to include data values for \fI all \fP variables +in the output. +.IP "\fB \-V \fP \fI var1,... \fP" +The output will include the specified variables only but all dimensions and +global or group attributes. One or more variables must be specified by name in the +comma-delimited list following this option. The list must be a single argument +to the command, hence cannot contain unescaped blanks or other white space +characters. The named variables must be valid netCDF variables in the +input-file. A variable within a group in a netCDF-4 file may be specified with +an absolute path name, such as '/GroupA/GroupA2/var'. Use of a relative path +name such as 'var' or 'grp/var' specifies all matching variable names in the +file. The default, without this option, is to include \fI all \fP variables in the +output. +.IP "\fB \-g \fP \fI grp1,... \fP" +The output will include data values only for the specified groups. +One or more groups must be specified by name in the comma-delimited +list following this option. The list must be a single argument to the +command. The named groups must be valid netCDF groups in the +input-file. The default, without this option, is to include data values for all +groups in the output. +.IP "\fB \-G \fP \fI grp1,... \fP" +The output will include only the specified groups. +One or more groups must be specified by name in the comma-delimited +list following this option. The list must be a single argument to the +command. The named groups must be valid netCDF groups in the +input-file. The default, without this option, is to include all groups in the +output. +.IP "\fB \-m \fP \fI bufsize \fP" +An integer or floating-point number that specifies the size, in bytes, +of the copy buffer used to copy large variables. A suffix of K, M, G, +or T multiplies the copy buffer size by one thousand, million, +billion, or trillion, respectively. The default is 5 Mbytes, +but will be increased if necessary to hold at least one chunk of +netCDF-4 chunked variables in the input file. You may want to specify +a value larger than the default for copying large files over high +latency networks. Using the '\-w' option may provide better +performance, if the output fits in memory. +.IP "\fB \-h \fP \fI chunk_cache \fP" +For netCDF-4 output, including netCDF-4 classic model, an integer or +floating-point number that specifies the size in bytes of chunk cache +allocated for each chunked variable. This is not a property of the file, but merely +a performance tuning parameter for avoiding compressing or +decompressing the same data multiple times while copying and changing +chunk shapes. A suffix of K, M, G, or T multiplies the chunk cache +size by one thousand, million, billion, or trillion, respectively. +The default is 4.194304 Mbytes (or whatever was specified for the +configure-time constant CHUNK_CACHE_SIZE when the netCDF library was +built). Ideally, the \fBnccopy\fP utility should accept only one memory +buffer size and divide it optimally between a copy buffer and chunk +cache, but no general algorithm for computing the optimum chunk cache +size has been implemented yet. Using the '\-w' option may provide +better performance, if the output fits in memory. +.IP "\fB \-e \fP \fI cache_elems \fP" +For netCDF-4 output, including netCDF-4 classic model, specifies +number of chunks that the chunk cache can hold. A suffix of K, M, G, +or T multiplies the number of chunks that can be held in the cache +by one thousand, million, billion, or trillion, respectively. This is not a +property of the file, but merely a performance tuning parameter for +avoiding compressing or decompressing the same data multiple times +while copying and changing chunk shapes. The default is 1009 (or +whatever was specified for the configure-time constant +CHUNK_CACHE_NELEMS when the netCDF library was built). Ideally, the +\fBnccopy\fP utility should determine an optimum value for this parameter, +but no general algorithm for computing the optimum number of chunk +cache elements has been implemented yet. +.IP "\fB \-r \fP" +Read netCDF classic or 64-bit offset input file into a diskless netCDF +file in memory before copying. Requires that input file be small +enough to fit into memory. For \fBnccopy\fP, this doesn't seem to provide +any significant speedup, so may not be a useful option. +.SH EXAMPLES +.LP +Make a copy of foo1.nc, a netCDF file of any type, to foo2.nc, a +netCDF file of the same type: +.RS +.HP +nccopy foo1.nc foo2.nc +.RE +.LP +Note that the above copy will not be as fast as use of cp or other +simple copy utility, because the file is copied using only the netCDF +API. If the input file has extra bytes after the end of the netCDF +data, those will not be copied, because they are not accessible +through the netCDF interface. If the original file was generated in +"No fill" mode so that fill values are not stored for padding for data +alignment, the output file may have different padding bytes. +.LP +Convert a netCDF-4 classic model file, compressed.nc, that uses compression, +to a netCDF-3 file classic.nc: +.RS +.HP +nccopy \-k classic compressed.nc classic.nc +.RE +.LP +Note that 'nc3' could be used instead of 'classic'. +.LP +Download the variable 'time_bnds' and its associated attributes from +an OPeNDAP server and copy the result to a netCDF file named 'tb.nc': +.RS +.HP +nccopy 'http://test.opendap.org/opendap/data/nc/sst.mnmean.nc.gz?time_bnds' tb.nc +.RE +.LP +Note that URLs that name specific variables as command-line arguments +should generally be quoted, to avoid the shell interpreting special +characters such as '?'. +.LP +Compress all the variables in the input file foo.nc, a netCDF file of any +type, to the output file bar.nc: +.RS +.HP +nccopy \-d1 foo.nc bar.nc +.RE +.LP +If foo.nc was a classic or 64-bit offset netCDF file, bar.nc will be a +netCDF-4 classic model netCDF file, because the classic and 64-bit +offset format variants don't support compression. If foo.nc was a +netCDF-4 file with some variables compressed using various deflation +levels, the output will also be a netCDF-4 file of the same type, but +all the variables, including any uncompressed variables in the input, +will now use deflation level 1. +.LP +Assume the input data includes gridded variables that use time, lat, +lon dimensions, with 1000 times by 1000 latitudes by 1000 longitudes, +and that the time dimension varies most slowly. Also assume that +users want quick access to data at all times for a small set of +lat-lon points. Accessing data for 1000 times would typically require +accessing 1000 disk blocks, which may be slow. +.LP +Reorganizing the data into chunks on disk that have all the time in +each chunk for a few lat and lon coordinates would greatly speed up +such access. To chunk the data in the input file slow.nc, a netCDF +file of any type, to the output file fast.nc, you could use; +.RS +.HP +nccopy \-c time/1000,lat/40,lon/40 slow.nc fast.nc +.RE +.LP +to specify data chunks of 1000 times, 40 latitudes, and 40 longitudes. +If you had enough memory to contain the output file, you could speed +up the rechunking operation significantly by creating the output in +memory before writing it to disk on close: +.RS +.HP +nccopy \-w \-c time/1000,lat/40,lon/40 slow.nc fast.nc +.RE +.SH "SEE ALSO" +.LP +.BR ncdump(1), ncgen(1), netcdf(3) diff --git a/privatemodules/nc4/share/man/man1/ncdump.1 b/privatemodules/nc4/share/man/man1/ncdump.1 new file mode 100644 index 0000000000000000000000000000000000000000..9e241bb887273ad2a0f2a280fffd729ecd2d6c9e --- /dev/null +++ b/privatemodules/nc4/share/man/man1/ncdump.1 @@ -0,0 +1,278 @@ +.\" $Header: /upc/share/CVS/netcdf-3/ncdump/ncdump.1,v 1.10 2009/07/28 14:48:36 russ Exp $ +.TH NCDUMP 1 "2012-03-08" "Release 4.2" "UNIDATA UTILITIES" +.SH NAME +ncdump \- Convert netCDF file to text form (CDL) +.SH SYNOPSIS +.ft B +.HP +ncdump +.nh +\%[\-chistxw] +\%[\-v \fIvar1,...\fP] +\%[\-b \fIlang\fP] +\%[\-f \fIlang\fP] +\%[\-l \fIlen\fP] +\%[\-n \fIname\fP] +\%[\-p \fIf_digits[,d_digits]\fP] +\%[\-g \fIgrp1,...\fP] +\%\fIfile\fP +.br +.ft B +.HP +ncdump +.nh +\%-k +\%\fIfile\fP +.hy +.ft +.SH DESCRIPTION +.LP +The \fBncdump\fP utility generates a text representation of a +specified netCDF file on standard output, optionally excluding some or +all of the variable data in the output. The text representation is in +a form called CDL (network Common Data form Language) that can be +viewed, edited, or serve as input to \fBncgen\fP, a companion program +that can generate a binary netCDF file from a CDL file. Hence +\fBncgen\fP and \fBncdump\fP can be used as inverses to transform the +data representation between binary and text representations. See +\fBncgen\fP documentation for a description of CDL and netCDF +representations. +.LP +\fBncdump\fP may also be used to determine what kind of netCDF file is used +(which variant of the netCDF file format) with the \-k option. +.LP +If DAP support was enabled when \fBncdump\fP was built, the file name +may specify a DAP URL. This allows \fBncdump\fP to access data sources +from DAP servers, including data in other formats than netCDF. When +used with DAP URLs, \fBncdump\fP shows the translation from the DAP +data model to the netCDF data model. +.LP +\fBncdump\fP may also be used as a simple browser for netCDF data +files, to display the dimension names and lengths; variable names, types, +and shapes; attribute names and values; and optionally, the values of +data for all variables or selected variables in a netCDF file. For +netCDF-4 files, groups and user-defined types are also included in +ncdump output. +.LP +\fBncdump\fP uses `_' to represent data values that are equal to the +`_FillValue' attribute for a variable, intended to represent data that +has not yet been written. If a variable has no `_FillValue' +attribute, the default fill value for the variable type is used unless +the variable is of byte type. +.LP +\fBncdump\fP defines a default display format used for each type of +netCDF data, but this can be changed if a `C_format' attribute is +defined for a netCDF variable. In this case, \fBncdump\fP will use +the `C_format' attribute to format each value. For example, if +floating-point data for the netCDF variable `Z' is known to be +accurate to only three significant digits, it would be appropriate to +use the variable attribute + +.RS +.HP +Z:C_format = "%.3g" +.RE +.SH OPTIONS +.IP "\fB-c\fP" +Show the values of \fIcoordinate\fP variables (1D variables with the +same names as dimensions) as well as the declarations of all +dimensions, variables, attribute values, groups, and user-defined +types. Data values of non-coordinate variables are not included in +the output. This is usually the most suitable option to use for a brief look +at the structure and contents of a netCDF file. +.IP "\fB-h\fP" +Show only the \fIheader\fP information in the output, that is, output only +the declarations for the dimensions, variables, attributes, +groups, and user-defined types of the input file, but no data values for +any variables. The output is identical to using the \fB-c\fP option except +that the values of coordinate variables are not included. (At most one of +\fB-c\fP or \fB-h\fP options may be present.) +.IP "\fB-v\fP \fIvar1,...\fP" +The output will include data values for the specified variables, in +addition to the declarations of all dimensions, variables, and +attributes. One or more variables must be specified by name in the +comma-delimited list following this option. The list must be a single +argument to the command, hence cannot contain unescaped blanks or +other white space characters. The named variables must be valid +netCDF variables in the input-file. A variable within a group in a +netCDF-4 file may be specified with an absolute path name, such as +`/GroupA/GroupA2/var'. Use of a relative path name such as `var' or +`grp/var' specifies all matching variable names in the file. The +default, without this option and in the absence of the \fB-c\fP or +\fB-h\fP options, is to include data values for \fIall\fP variables in +the output. +.IP "\fB-b\fP \fI[c|f]\fP" +A brief annotation in the form of a CDL comment (text beginning with the +characters ``//'') will be included in the data section of the output for +each `row' of data, to help identify data values for multidimensional +variables. If \fIlang\fP begins with `C' or `c', then C language +conventions will be used (zero-based indices, last dimension varying +fastest). If \fIlang\fP begins with `F' or `f', then Fortran language +conventions will be used (one-based indices, first dimension varying +fastest). In either case, the data will be presented in the same order; +only the annotations will differ. This option may be useful for browsing +through large volumes of multidimensional data. +.IP "\fB-f\fP \fI[c|f]\fP" +Full annotations in the form of trailing CDL comments (text beginning +with the characters ``//'') for every data value (except individual +characters in character arrays) will be included in the data section. +If \fIlang\fP begins with `C' or `c', then C language conventions will +be used. If \fIlang\fP begins with `F' or `f', then Fortran language +conventions will be used. In either case, the data will be presented +in the same order; only the annotations will differ. This option may +be useful for piping data into other filters, since each data value +appears on a separate line, fully identified. (At most one of '\-b' or '\-f' options may be present.) +.IP "\fB-l\fP \fIlength\fP" +Changes the default maximum line length (80) used in formatting lists of +non-character data values. +.IP "\fB-n\fP \fIname\fP" +CDL requires a name for a netCDF file, for use by \fBncgen \-b\fP in +generating a default netCDF file name. By default, \fIncdump\fP constructs +this name from the last component of the file name of the input netCDF file +by stripping off any extension it has. Use the \fB-n\fP option to specify a +different name. Although the output file name used by \fBncgen \-b\fP can be +specified, it may be wise to have \fIncdump\fP change the default name to +avoid inadvertently overwriting a valuable netCDF file when using +\fBncdump\fP, editing the resulting CDL file, and using \fBncgen \-b\fP to +generate a new netCDF file from the edited CDL file. +.IP "\fB-p\fP \fIfloat_digits[,double_digits]\fP" +Specifies default precision (number of significant digits) to use in +displaying floating-point or double precision data values for +attributes and variables. If specified, this value overrides the +value of the C_format attribute, if any, for a variable. +Floating-point data will be displayed with \fIfloat_digits\fP +significant digits. If \fIdouble_digits\fP is also specified, +double-precision values will be displayed with that many significant +digits. In the absence of any \fB-p\fP specifications, floating-point +and double-precision data are displayed with 7 and 15 significant +digits respectively. CDL files can be made smaller if less precision +is required. If both floating-point and double precisions are +specified, the two values must appear separated by a comma (no blanks) +as a single argument to the command. (To represent every last bit of +precision in a CDL file for all possible floating-point values +would require \fB-p 9,17\fP.) +.IP "\fB-k\fP" +Show kind of netCDF file the pathname references, one of +`classic', `64-bit offset',`netCDF-4', or `netCDF-4 classic model'. Before version +3.6, there was only one kind of netCDF file, designated as `classic' +(also know as format variant 1). Large file support introduced +another variant of the format, designated as `64-bit offset' (known as +format variant 2). NetCDF-4, uses a third variant of the format, +`netCDF-4' (format variant 3). Another format variant, designated +`netCDF-4 classic model' (format variant 4), is restricted +to features supported by the netCDF-3 data model but represented using +the HDF5 format, so that an unmodified netCDF-3 program can read or +write the file just by relinking with the netCDF-4 library. +The string output by using the `\-k' option may be provided as the +value of the `\-k' option to ncgen(1) to +specify exactly what kind of netCDF file to generate, when you want to +override the default inferred from the CDL. +.IP "\fB-s\fP" +Output special virtual attributes that provide performance-related +information about the file format and variable properties for netCDF-4 +data. These special virtual attributes are not actually part of the +data, they are merely a convenient way to display miscellaneous +properties of the data in CDL (and eventually NcML). They include +`_ChunkSizes', +`_DeflateLevel', +`_Endianness', +`_Fletcher32', +`_Format', +`_NoFill', +`_Shuffle', and +`_Storage'. +`_ChunkSizes' is a list of chunk sizes for each dimension of the variable. +`_DeflateLevel' is an +integer between 0 and 9 inclusive if compression has been specified +for the variable. +`_Endianness' is either `little' or `big', depending on +how the variable was stored when first written. +`_Fletcher32' is `true' if the checksum property was set for +the variable. +`_Format' is a global attribute specifying the netCDF format +variant, one of `classic', `64-bit offset', `netCDF-4', or `netCDF-4 +classic model'. +`_NoFill' is `true' if the persistent NoFill property was set for the +variable when it was defined. +`_Shuffle' is `true' if use of the shuffle filter was specified for the variable. +`_Storage' is `contiguous' or `chunked', depending on how the +variable's data is stored. +.IP "\fB-t\fP" +Controls display of time data, if stored in a variable that uses +a udunits compliant time representation such as `days since +1970-01-01' or `seconds since 2009-03-15 12:01:17', a variable +identified in a "bounds" attribute of such a time variable, or a numeric +attribute of a time variable. If this option is +specified, time data values are displayed as human-readable date-time +strings rather than numerical values, interpreted in terms of a +`calendar' variable attribute, if specified. For numeric attributes +of time variables, the human-readable time value is displayed after the +actual value, in an associated CDL comment. Calendar attribute +values interpreted with this option include the CF Conventions values +`gregorian' or `standard', `proleptic_gregorian', `noleap' or `365_day', +`all_leap' or `366_day', `360_day', and `julian'. +.IP "\fB-i\fP" +Same as the '\-t' option, except output time data as date-time strings +with ISO-8601 standard 'T' separator, instead of a blank. +.IP "\fB-g\fP \fIgrp1,...\fP" +For netCDF-4 files, the output will include data values only for the +specified groups. One or more groups must be specified by name in the +comma-delimited list following this option. The list must be a single +argument to the command. The named groups must be valid netCDF groups +in the input-file. A group in a netCDF-4 file may be specified with +an absolute or relative path name. Use of a relative path name +specifies all matching group names in the file. The default, without +this option and in the absence of the \fB-c\fP or \fB-h\fP options, is +to include data values for \fIall\fP groups in the output. +.IP "\fB-w\fP" +For file names that request remote access using DAP URLs, access data +with client-side caching of entire variables. +.IP "\fB-x\fP" +Output XML (NcML) instead of CDL. The NcML does not include data values. +The NcML output option currently only works for netCDF classic model data. +.SH EXAMPLES +.LP +Look at the structure of the data in the netCDF file `\fBfoo.nc\fP': +.RS +.HP +ncdump \-c foo.nc +.RE +.LP +Produce an annotated CDL version of the structure and data in the +netCDF file `\fBfoo.nc\fP', using C-style indexing for the annotations: +.RS +.HP +ncdump \-b c foo.nc > foo.cdl +.RE +.LP +Output data for only the variables `uwind' and `vwind' from the netCDF file +`\fBfoo.nc\fP', and show the floating-point data with only three significant +digits of precision: +.RS +.HP +ncdump \-v uwind,vwind \-p 3 foo.nc +.RE +.LP +Produce a fully-annotated (one data value per line) listing of the data for +the variable `omega', using Fortran conventions for indices, and changing the +netCDF dataset name in the resulting CDL file to `omega': +.RS +.HP +ncdump \-v omega \-f fortran \-n omega foo.nc > Z.cdl +.RE +.SH "SEE ALSO" +.LP +.BR ncgen (1), +.BR netcdf (3) +.SH BUGS +.LP +Character arrays that contain a null-byte are treated like C strings, so no +characters after the null byte appear in the output. +.LP +Multidimensional character string arrays are not handled well, since the CDL +syntax for breaking a long character string into several shorter lines is +weak. +.LP +There should be a way to specify that the data should be displayed in +`record' order, that is with the all the values for `record' variables +together that have the same value of the record dimension. diff --git a/privatemodules/nc4/share/man/man1/ncgen.1 b/privatemodules/nc4/share/man/man1/ncgen.1 new file mode 100644 index 0000000000000000000000000000000000000000..77a87c247ddcc37fc931ed553bec82c3b91f1824 --- /dev/null +++ b/privatemodules/nc4/share/man/man1/ncgen.1 @@ -0,0 +1,1240 @@ +.\" $Header: /upc/share/CVS/netcdf-3/ncgen/ncgen.1,v 1.10 2010/04/29 16:38:55 dmh Exp $ +.TH NCGEN 1 "$Date: 2010/04/29 16:38:55 $" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA UTILITIES" +.SH NAME +ncgen \- From a CDL file generate a netCDF-3 file, a netCDF-4 file or a C program +.SH SYNOPSIS +.HP +ncgen +.nh +\%[\-b] +\%[\-c] +\%[\-f] +\%[\-k \fIformat_name\fP] +\%[\-\fIformat_code\fP] +\%[\-l \fIoutput language\fP] +\%[\-n] +\%[\-o \fInetcdf_filename\fP] +\%[\-x] +\%[\fIinput_file\fP] +.hy +.ft +.SH DESCRIPTION +\fBncgen\fP generates either a netCDF-3 (i.e. classic) binary .nc file, +a netCDF-4 (i.e. enhanced) binary .nc file +or a file in some source language that when executed will +construct the corresponding binary .nc file. +The input to \fBncgen\fP is a description of a netCDF +file in a small language known as CDL (network Common Data form Language), +described below. Input is read from standard input if no input_file +is specified. +If no options are specified in invoking \fBncgen\fP, it merely checks the +syntax of the input CDL file, producing error messages for +any violations of CDL syntax. Other options can be used, for example, +to create the corresponding netCDF file, +or to generate a C program that uses the netCDF C +interface to create the netCDF file. +.LP +Note that this version of ncgen was originally called ncgen4. +The older ncgen program has been renamed to ncgen3. +.LP +\fBncgen\fP may be used with the companion program \fBncdump\fP to perform +some simple operations on netCDF files. For example, to rename a dimension +in a netCDF file, use \fBncdump\fP to get a CDL version of the netCDF file, +edit the CDL file to change the name of the dimensions, and use \fBncgen\fP +to generate the corresponding netCDF file from the edited CDL file. +.SH OPTIONS +.IP "\fB-b\fP" +Create a (binary) netCDF file. If the \fB-o\fP option is absent, a +default file name will be constructed from the basename of the CDL +file, with any suffix replaced by the `.nc' extension. If a +file already exists with the specified name, it will be overwritten. +.IP "\fB-c\fP" +Generate +.B C +source code that will create a netCDF file +matching the netCDF specification. The C source code is written to +standard output; equivalent to \-lc. +.IP "\fB-f\fP" +Generate +.B FORTRAN 77 +source code that will create a netCDF file +matching the netCDF specification. +The source code is written to +standard output; equivalent to \-lf77. +.IP "\fB-o\fP \fRnetcdf_file\fP" +Name of the file to pass to calls to "nc_create()". +If this option is specified it implies +(in the absence of any explicit \-l flag) the "\fB-b\fP" option. +This option is necessary because netCDF files +cannot be written directly to standard output, since standard output is not +seekable. +.IP "\fB-k \fIformat_name\fP" +.IP "\fB-\fIformat_code\fP" +The \-k flag specifies the format of the file to be created and, by inference, +the data model accepted by ncgen (i.e. netcdf-3 (classic) versus +netcdf-4 vs netcdf-5). As a shortcut, a numeric \fIformat_code\fP may be specified instead. +The possible \fIformat_name\fP values for the \-k option are: +.RS +.RS +.IP "'classic' or 'nc3' => netCDF classic format" +.IP "'64-bit offset' or 'nc6' => netCDF 64-bit format" +.IP "'64-bit data or 'nc5' => netCDF-5 (64-bit data) format" +.IP "'netCDF-4' 0r 'nc4' => netCDF-4 format (enhanced data model)" +.IP "'netCDF-4 classic model' or 'nc7' => netCDF-4 classic model format" +.RE +.RE +Accepted \fIformat_number\fP arguments, just shortcuts for format_names, are: +.RS +.RS +.IP "3 => netcdf classic format" +.IP "5 => netcdf 5 format" +.IP "6 => netCDF 64-bit format" +.IP "4 => netCDF-4 format (enhanced data model)" +.IP "7 => netCDF-4 classic model format" +.RE +.RE +The numeric code "7" is used because "7=3+4", a mnemonic for the format +that uses the netCDF-3 data model for compatibility with the netCDF-4 +storage format for performance. Credit is due to NCO for use of these +numeric codes instead of the old and confusing format numbers. +.LP +Note: The old version format numbers '1', '2', '3', '4', equivalent +to the format names 'nc3', 'nc6', 'nc4', or 'nc7' respectively, are +also still accepted but deprecated, due to easy confusion between +format numbers and format names. Various old format name aliases are +also accepted but deprecated, e.g. 'hdf5', 'enhanced-nc3', etc. +Also, note that \-v is accepted to mean the same thing as +\-k for backward compatibility. +.IP "\fB-x\fP" +Don't initialize data with fill values. This can speed up creation of +large netCDF files greatly, but later attempts to read unwritten data +from the generated file will not be easily detectable. +.IP "\fB-l \fRoutput_language\fP" +The \-l flag specifies the output language to use +when generating source code that will create or define a netCDF file +matching the netCDF specification. +The output is written to standard output. +The currently supported languages have the following flags. +.RS +.RS +.IP "c|C' => C language output." +.IP "f77|fortran77' => FORTRAN 77 language output" +; note that currently only the classic model is supported. +.IP "j|java' => (experimental) Java language output" +; targets the existing Unidata Java interface, which means that +only the classic model is supported. +.RE +.RE +.SH Choosing the output format +The choice of output format is determined by three flags. +.IP "\fB-k flag.\fP" +.IP "\fB_Format attribute (see below).\fP" +.IP "\fBOccurrence of CDF-5 (64-bit data) or +netcdf-4 constructs in the input CDL.\fP" +The term "netCDF-4 constructs" means +constructs from the enhanced data model, +not just special performance-related attributes such as + _ChunkSizes, _DeflateLevel, _Endianness, etc. +The term "CDF-5 constructs" means +extended unsigned integer types allowed in the 64-bit data model. +.LP +Note that there is an ambiguity between the netCDF-4 case +and the CDF-5 case is only an unsigned type is seen in the input. +.LP +The rules are as follows, in order of application. +.IP "\fB1.\fP" +If either Fortran or Java output is specified, +then \-k flag value of 1 (classic model) will be used. +Conflicts with the use of enhanced constructs +in the CDL will report an error. +.IP "\fB2.\fP" +If both the \-k flag and _Format attribute are specified, +the _Format flag will be ignored. +If no \-k flag is specified, and a _Format attribute value +is specified, then the \-k flag value +will be set to that of the _Format attribute. +Otherwise the \-k flag is undefined. +.IP "\fB3.\fP" +If the \-k option is defined and is consistent with the CDL, +ncgen will output a file in the requested form, +else an error will be reported. +.IP "\fB4.\fP" +If the \-k flag is undefined, +and if there are CDF-5 constructs, only, in the CDL, +a \-k flag value of 5 (64-bit data model) will be used. +If there are true netCDF-4 constructs in the CDL, +a \-k flag value of 3 (enhanced model) will be used. +.IP "\fB5.\fP" +If special performance-related attributes are specified in the CDL, +a \-k flag value of 4 (netCDF-4 classic model) will be used. +.IP "\fB6.\fP" +Otherwise ncgen will set the \-k flag to 1 (classic model). +.RE +.SH EXAMPLES +.LP +Check the syntax of the CDL file `\fBfoo.cdl\fP': +.RS +.HP +ncgen foo.cdl +.RE +.LP +From the CDL file `\fBfoo.cdl\fP', generate an equivalent binary netCDF file +named `\fBx.nc\fP': +.RS +.HP +ncgen \-o x.nc foo.cdl +.RE +.LP +From the CDL file `\fBfoo.cdl\fP', generate a C program containing the +netCDF function invocations necessary to create an equivalent binary netCDF +file named `\fBx.nc\fP': +.RS +.HP +ncgen \-lc foo.cdl >x.c +.RE +.LP +.SH USAGE +.SS "CDL Syntax Overview" +.LP +Below is an example of CDL syntax, describing a netCDF file with several +named dimensions (lat, lon, and time), variables (Z, t, p, rh, lat, lon, +time), variable attributes (units, long_name, valid_range, _FillValue), +and some data. CDL keywords are in boldface. (This example is intended to +illustrate the syntax; a real CDL file would have a more complete set of +attributes so that the data would be more completely self-describing.) +.RS +.nf +netcdf foo { // an example netCDF specification in CDL + +\fBtypes\fP: + \fIubyte\fP \fIenum\fP enum_t {Clear = 0, Cumulonimbus = 1, Stratus = 2}; + \fIopaque\fP(11) opaque_t; + \fIint\fP(*) vlen_t; + +\fBdimensions\fP: + lat = 10, lon = 5, time = \fIunlimited\fP ; + +\fBvariables\fP: + \fIlong\fP lat(lat), lon(lon), time(time); + \fIfloat\fP Z(time,lat,lon), t(time,lat,lon); + \fIdouble\fP p(time,lat,lon); + \fIlong\fP rh(time,lat,lon); + + \fIstring\fP country(time,lat,lon); + \fIubyte\fP tag; + + // variable attributes + lat:long_name = "latitude"; + lat:units = "degrees_north"; + lon:long_name = "longitude"; + lon:units = "degrees_east"; + time:units = "seconds since 1992-1-1 00:00:00"; + + // typed variable attributes + \fIstring\fP Z:units = "geopotential meters"; + \fIfloat\fP Z:valid_range = 0., 5000.; + \fIdouble\fP p:_FillValue = \-9999.; + \fIlong\fP rh:_FillValue = \-1; + \fIvlen_t\fP :globalatt = {17, 18, 19}; +\fBdata\fP: + lat = 0, 10, 20, 30, 40, 50, 60, 70, 80, 90; + lon = \-140, \-118, \-96, \-84, \-52; +\fBgroup\fP: g { +\fBtypes\fP: + \fIcompound\fP cmpd_t { \fIvlen_t\fP f1; \fIenum_t\fP f2;}; +} // group g +\fBgroup\fP: h { +\fBvariables\fP: + /g/\fIcmpd_t\fP compoundvar; +\fBdata\fP: + compoundvar = { {3,4,5}, enum_t.Stratus } ; +} // group h +} +.fi +.RE +.LP +All CDL statements are terminated by a semicolon. Spaces, tabs, +and newlines can be used freely for readability. +Comments may follow the characters `//' on any line. +.LP +A CDL description consists of five optional parts: +\fItypes\fP, +\fIdimensions\fP, +\fIvariables\fP, +\fIdata\fP, +beginning with the keyword +.BR `types:' , +.BR `dimensions:' , +.BR `variables:' , +and +.BR `data:', +respectively. +Note several things: +(1) the keyword includes the trailing colon, so there must not be any space before the colon character, +and (2) the keywords are required to be lower case. +.LP +The \fBvariables:\fP section may contain \fIvariable declarations\fP +and \fIattribute assignments\fP. +All sections may contain global attribute assignments. +.LP +In addition, after the \fBdata:\fP section, the user +may define a series of groups (see the example above). +Groups themselves can contain types, dimensions, variables, +data, and other (nested) groups. +.LP +The netCDF \fBtypes:\fP section declares the user defined types. +These may be constructed using any of the following types: +\fBenum\fP, \fBvlen\fP, \fBopaque\fP, or \fBcompound\fP. +.LP +A netCDF \fIdimension\fP is used to define the shape of one or more of the +multidimensional variables contained in the netCDF file. A netCDF +dimension has a name and a size. A dimension +can have the \fBunlimited\fP size, which means a variable using this +dimension can grow to any length in that dimension. +.LP +A \fIvariable\fP represents a multidimensional array of values of the +same type. A variable has a name, a data type, and a shape described +by its list of dimensions. Each variable may also have associated +\fIattributes\fP (see below) as well as data values. The name, data +type, and shape of a variable are specified by its declaration in the +\fIvariable\fP section of a CDL description. A variable may have the same +name as a dimension; by convention such a variable is one-dimensional +and contains coordinates of the dimension it names. Dimensions need +not have corresponding variables. +.LP +A netCDF \fIattribute\fP contains information about a netCDF variable or +about the whole netCDF dataset. Attributes are used +to specify such properties as units, special values, maximum and +minimum valid values, scaling factors, offsets, and parameters. Attribute +information is represented by single values or arrays of values. For +example, "units" is an attribute represented by a character array such +as "celsius". An attribute has an associated variable, a name, +a data type, a length, and a value. In contrast to variables that are +intended for data, attributes are intended for metadata (data about +data). +Unlike netCDF-3, attribute types can be any user defined type +as well as the usual built-in types. +.LP +In CDL, an attribute is designated by a +a type, a variable, a ':', and then an attribute name. +The type is optional and if missing, it will be inferred from the values +assigned to the attribute. +It is possible to assign \fIglobal\fP attributes +not associated with any variable to the netCDF as a whole by omitting +the variable name in the attribute declaration. +Notice that there is a potential ambiguity in a specification such as +.nf +x : a = ... +.fi +In this situation, x could be either a type for a global attribute, +or the variable name for an attribute. Since there could both be a type named +x and a variable named x, there is an ambiguity. +The rule is that in this situation, x will be interpreted as a +type if possible, and otherwise as a variable. +.LP +If not specified, the data type of an attribute in CDL +is derived from the type of the value(s) assigned to it. The length of +an attribute is the number of data values assigned to it, or the +number of characters in the character string assigned to it. Multiple +values are assigned to non-character attributes by separating the +values with commas. All values assigned to an attribute must be of +the same type. +.LP +The names for CDL dimensions, variables, attributes, types, and groups +may contain any non-control utf-8 character +except the forward slash character (`/'). +However, certain characters must escaped if they are used in a name, +where the escape character is the backward slash `\\'. +In particular, if the leading character off the name is a digit (0-9), +then it must be preceded by the escape character. +In addition, the characters ` !"#$%&()*,:;<=>?[]^`\'{}|~\\' +must be escaped if they occur anywhere in a name. +Note also that attribute names that begin with an underscore (`_') +are reserved for the use of Unidata and should not be used in user +defined attributes. +.LP +Note also that the words +`variable', +`dimension', +`data', +`group', +and `types' +are legal CDL names, but be careful that there is a space +between them and any following colon character when used as a variable name. +This is mostly an issue with attribute declarations. +For example, consider this. +.HP +.RS +.nf + netcdf ... { + ... + variables: + int dimensions; + dimensions: attribute=0 ; // this will cause an error + dimensions : attribute=0 ; // this is ok. + ... + } +.fi +.RE +.LP +The optional \fBdata:\fP section of a CDL specification is where +netCDF variables may be initialized. The syntax of an initialization +is simple: a variable name, an equals sign, and a +comma-delimited list of constants (possibly separated by spaces, tabs +and newlines) terminated with a semicolon. For multi-dimensional +arrays, the last dimension varies fastest. Thus row-order rather than +column order is used for matrices. If fewer values are supplied than +are needed to fill a variable, it is extended with a type-dependent +`fill value', which can be overridden by supplying a value for a +distinguished variable attribute named `_FillValue'. The +types of constants need not match the type declared for a variable; +coercions are done to convert integers to floating point, for example. +The constant `_' can be used to designate the fill value for a variable. +If the type of the variable is explicitly `string', then the special +constant `NIL` can be used to represent a nil string, which is not the +same as a zero length string. +.SS "Primitive Data Types" +.LP +.RS +.nf +\fBchar\fP characters +\fBbyte\fP 8-bit data +\fBshort\fP 16-bit signed integers +\fBint\fP 32-bit signed integers +\fBlong\fP (synonymous with \fBint\fP) +\fBint64\fP 64-bit signed integers +\fBfloat\fP IEEE single precision floating point (32 bits) +\fBreal\fP (synonymous with \fBfloat\fP) +\fBdouble\fP IEEE double precision floating point (64 bits) +\fBubyte\fP unsigned 8-bit data +\fBushort\fP 16-bit unsigned integers +\fBuint\fP 32-bit unsigned integers +\fBuint64\fP 64-bit unsigned integers +\fBstring\fP arbitrary length strings +.fi +.RE +.LP +CDL supports a superset of the primitive data types of C. +The names for the primitive data types are reserved words in CDL, +so the names of variables, dimensions, and attributes must not be +primitive type names. In declarations, type names may be specified +in either upper or lower case. +.LP +Bytes are intended to hold a full eight +bits of data, and the zero byte has no special significance, as it +mays for character data. +\fBncgen\fP converts \fBbyte\fP declarations to \fBchar\fP +declarations in the output C code and to the nonstandard \fBBYTE\fP +declaration in output Fortran code. +.LP +Shorts can hold values between \-32768 and 32767. +\fBncgen\fP converts \fBshort\fP declarations to \fBshort\fP +declarations in the output C code and to the nonstandard \fBINTEGER*2\fP +declaration in output Fortran code. +.LP +Ints can hold values between \-2147483648 and 2147483647. +\fBncgen\fP converts \fBint\fP declarations to \fBint\fP +declarations in the output C code and to \fBINTEGER\fP +declarations in output Fortran code. \fBlong\fP +is accepted as a synonym for \fBint\fP in CDL declarations, but is +deprecated since there are now platforms with 64-bit representations +for C longs. +.LP +Int64 can hold values between \-9223372036854775808 +and 9223372036854775807. +\fBncgen\fP converts \fBint64\fP declarations to \fBlonglong\fP +declarations in the output C code. +.\" and to \fBINTEGER\fP declarations in output Fortran code. +.LP +Floats can hold values between about \-3.4+38 and 3.4+38. Their +external representation is as 32-bit IEEE normalized single-precision +floating point numbers. \fBncgen\fP converts \fBfloat\fP +declarations to \fBfloat\fP declarations in the output C code and to +\fBREAL\fP declarations in output Fortran code. \fBreal\fP is accepted +as a synonym for \fBfloat\fP in CDL declarations. +.LP +Doubles can hold values between about \-1.7+308 and 1.7+308. Their +external representation is as 64-bit IEEE standard normalized +double-precision floating point numbers. \fBncgen\fP converts +\fBdouble\fP declarations to \fBdouble\fP declarations in the output C +code and to \fBDOUBLE PRECISION\fP declarations in output Fortran +code. +.LP +The unsigned counterparts of the above integer types +are mapped to the corresponding unsigned C types. +Their ranges are suitably modified to start at zero. +.LP +The technical interpretation of the char type is that it is an unsigned +8-bit value. The encoding of the 256 possible values +is unspecified by default. A variable of char type +may be marked with an "_Encoding" attribute to indicate +the character set to be used: US-ASCII, ISO-8859-1, etc. +Note that specifying the encoding of UTF-8 is equivalent to +specifying US-ASCII +This is because multi-byte UTF-8 characters cannot +be stored in an 8-bit character. The only legal +single byte UTF-8 values are by definition +the 7-bit US-ASCII encoding with the top bit set to zero. +.LP +Strings are assumed by default to be encoded using UTF-8. +Note that this means that multi-byte UTF-8 encodings may +be present in the string, so it is possible that the number +of distinct UTF-8 characters in a string is smaller than +the number of 8-bit bytes used to store the string. +.LP +.SS "CDL Constants" +.LP +Constants assigned to attributes or variables may be of any of the +basic netCDF types. The syntax for constants is similar to C syntax, +except that type suffixes must be appended to shorts and floats to +distinguish them from longs and doubles. +.LP +A \fIbyte\fP constant is represented by +an integer constant with a `b' (or +`B') appended. In the old netCDF-2 API, byte constants could also be +represented using single characters or standard C character escape +sequences such as `a' or `\n'. This is still supported for backward +compatibility, but deprecated to make the distinction clear between +the numeric byte type and the textual char type. Example byte +constants include: +.RS +.nf + 0b // a zero byte + \-1b // \-1 as an 8-bit byte + 255b // also \-1 as a signed 8-bit byte +.fi +.RE +.LP +\fIshort\fP integer constants are intended for representing 16-bit +signed quantities. The form of a \fIshort\fP constant is an integer +constant with an `s' or `S' appended. If a \fIshort\fP constant +begins with `0', it is interpreted as octal, except that if it begins with +`0x', it is interpreted as a hexadecimal constant. For example: +.RS +.nf +\-2s // a short \-2 +0123s // octal +0x7ffs //hexadecimal +.fi +.RE +.LP +\fIint\fP integer constants are intended for representing 32-bit signed +quantities. The form of an \fIint\fP constant is an ordinary integer +constant, although it is acceptable to optionally append a single `l' or +`L' (again, deprecated). Be careful, though, the L suffix is interpreted +as a 32 bit integer, and never as a 64 bit integer. This can be confusing +since the C long type can ambigously be either 32 bit or 64 bit. +.LP +If an \fIint\fP constant begins with `0', it is interpreted as +octal, except that if it begins with `0x', it is interpreted as a hexadecimal +constant (but see opaque constants below). +Examples of valid \fIint\fP constants include: +.RS +.nf +\-2 +1234567890L +0123 // octal +0x7ff // hexadecimal +.fi +.RE +.LP +\fIint64\fP integer constants are intended for representing 64-bit +signed quantities. The form of an \fIint64\fP constant is an integer +constant with an `ll' or `LL' appended. If an \fIint64\fP constant +begins with `0', it is interpreted as octal, except that if it begins with +`0x', it is interpreted as a hexadecimal constant. For example: +.RS +.nf +\-2ll // an unsigned \-2 +0123LL // octal +0x7ffLL //hexadecimal +.fi +.RE +.LP +Floating point constants of type \fIfloat\fP are appropriate for representing +floating point data with about seven significant digits of precision. +The form of a \fIfloat\fP constant is the same as a C floating point +constant with an `f' or `F' appended. For example the following +are all acceptable \fIfloat\fP constants: +.RS +.nf +\-2.0f +3.14159265358979f // will be truncated to less precision +1.f + +.fi +.RE +.LP +Floating point constants of type \fIdouble\fP are appropriate for +representing floating point data with about sixteen significant digits +of precision. The form of a \fIdouble\fP constant is the same as a C +floating point constant. An optional `d' or `D' may be appended. +For example the following are all acceptable \fIdouble\fP constants: +.RS +.nf +\-2.0 +3.141592653589793 +1.0e-20 +1.d +.fi +.RE +.LP +Unsigned integer constants can be created by appending +the character 'U' or 'u' between the constant and any trailing +size specifier, or immediately at the end of the size specifier. +Thus one could say +10U, 100su, 100000ul, or 1000000llu, for example. +.LP +Single character constants may be enclosed in single quotes. +If a sequence of one or more characters is enclosed +in double quotes, then its interpretation must be inferred +from the context. If the dataset is created using the netCDF +classic model, then all such constants are interpreted +as a character array, so each character in the constant +is interpreted as if it were a single character. +If the dataset is netCDF extended, then the constant may +be interpreted as for the classic model or as a true string +(see below) depending on the type of the attribute or variable +into which the string is contained. +.LP +The interpretation of char constants is that those +that are in the printable ASCII range (' '..'~') are assumed to +be encoded as the 1-byte subset ofUTF-8, which is equivalent to US-ASCII. +In all cases, the usual C string escape conventions are honored +for values from 0 thru 127. Values greater than 127 are allowed, +but their encoding is undefined. +For netCDF extended, the use of the char type is deprecated +in favor of the string type. +.LP +Some character constant examples are as follows. +.RS +.nf + 'a' // ASCII `a' + "a" // equivalent to 'a' + "Two\\nlines\\n" // a 10-character string with two embedded newlines + "a bell:\\007" // a string containing an ASCII bell +.fi +.RE +Note that the netCDF character array "a" would fit in a one-element +variable, since no terminating NULL character is assumed. However, a zero +byte in a character array is interpreted as the end of the significant +characters by the \fBncdump\fP program, following the C convention. +Therefore, a NULL byte should not be embedded in a character string unless +at the end: use the \fIbyte\fP data type instead for byte arrays that +contain the zero byte. +.LP +\fIString\fP constants are, like character constants, +represented using double quotes. This represents a potential +ambiguity since a multi-character string may also indicate +a dimensioned character value. Disambiguation usually occurs +by context, but care should be taken to specify the\fIstring\fP +type to ensure the proper choice. +String constants are assumed to always be UTF-8 encoded. This +specifically means that the string constant may actually +contain multi-byte UTF-8 characters. +The special constant `NIL` can be used to represent a nil string, which is not the +same as a zero length string. +.LP +\fIOpaque\fP constants are represented as +sequences of hexadecimal digits preceded by 0X or 0x: 0xaa34ffff, +for example. +These constants can still be used as integer constants +and will be either truncated or extended as necessary. +.SS "Compound Constant Expressions" +.LP +In order to assign values to variables (or attributes) +whose type is user-defined type, the constant notation has been +extended to include sequences of constants enclosed in curly +brackets (e.g. "{"..."}"). +Such a constant is called a compound constant, and compound constants +can be nested. +.LP +Given a type "T(*) vlen_t", where T is some other arbitrary base type, +constants for this should be specified as follows. +.nf + vlen_t var[2] = {t11,t12,...t1N}, {t21,t22,...t2m}; +.fi +The values tij, are assumed to be constants of type T. +.LP +Given a type "compound cmpd_t {T1 f1; T2 f2...Tn fn}", +where the Ti are other arbitrary base types, +constants for this should be specified as follows. +.nf + cmpd_t var[2] = {t11,t12,...t1N}, {t21,t22,...t2n}; +.fi +The values tij, are assumed to be constants of type Ti. +If the fields are missing, then they will be set using any +specified or default fill value for the field's base type. +.LP +The general set of rules for using braces are defined in the +.B Specifying +.B Datalists +section below. +.LP +.SS "Scoping Rules" +.LP +With the addition of groups, the name space for defined objects +is no longer flat. References (names) +of any type, dimension, or variable may be prefixed +with the absolute path specifying a specific declaration. +Thus one might say +.nf + variables: + /g1/g2/t1 v1; +.fi +The type being referenced (t1) is the one within group g2, which in +turn is nested in group g1. +The similarity of this notation to Unix file paths is deliberate, +and one can consider groups as a form of directory structure. +.LP +When name is not prefixed, then scope rules are applied to locate the +specified declaration. Currently, there are three rules: one for dimensions, +one for types and enumeration constants, and one for all others. +.HP +When an unprefixed name of a dimension is used (as in a +variable declaration), ncgen first looks in the immediately +enclosing group for the dimension. If it is not found +there, then it looks in the group enclosing this group. +This continues up the group hierarchy until the dimension is +found, or there are no more groups to search. +.HP +2. When an unprefixed name of a type or an enumeration constant +is used, ncgen searches the group tree using a pre-order depth-first +search. This essentially means that it will find the matching declaration +that precedes the reference textually in the cdl file and that +is "highest" in the group hierarchy. +.HP +3. For all other names, only the immediately enclosing group is searched. +.LP +One final note. Forward references are not allowed. +This means that specifying, for example, +/g1/g2/t1 will fail if this reference occurs before g1 and/or g2 are defined. +.SS "Specifying Enumeration Constants" +.LP +References to Enumeration constants (in data lists) can be ambiguous +since the same enumeration constant name can be defined in more than +one enumeration. If a cdl file specified an ambiguous constant, +then ncgen will signal an error. Such constants can be disambiguated +in two ways. +.IP "\fB1.\fP" +Prefix the enumeration constant with the name of the enumeration separated +by a dot: \fIenum.econst\fP, for example. +.IP "\fB2.\fP" +If case one is not sufficient to disambiguate the enumeration constant, +then one must specify the precise enumeration type using +a group path: \fI/g1/g2/enum.econst\fP, for example. +.SS "Special Attributes" +.LP +Special, virtual, attributes can be specified to provide +performance-related information about the file format and +about variable properties. +The file must be a netCDF-4 file for these to take effect. +.LP +These special virtual attributes are not actually part of the file, +they are merely a convenient way to set miscellaneous +properties of the data in CDL +.LP +The special attributes currently supported are as follows: +`_Format', +`_Fletcher32, +`_ChunkSizes', +`_Endianness', +`_DeflateLevel', +`_Shuffle', and +`_Storage'. +.LP +`_Format' is a global attribute specifying the netCDF format +variant. Its value must be a single string +matching one of `classic', `64-bit offset', `64-bit data', `netCDF-4', or +`netCDF-4 classic model'. +.LP +The rest of the special attributes are all variable attributes. +Essentially all of then map to some corresponding `nc_def_var_XXX' +function as defined in the netCDF-4 API. +For the attributes that are essentially boolean (_Fletcher32, _Shuffle, +and _NOFILL), the value true can be specified by using the strings +`true' or `1', or by using the integer 1. +The value false expects either `false', `0', or the integer 0. +The actions associated with these attributes are as follows. +.IP 1. 3 +`_Fletcher32 sets the `fletcher32' property for a variable. +.IP 2. 3 +`_Endianness' is either `little' or `big', depending on +how the variable is stored when first written. +.IP 3. 3 +`_DeflateLevel' is an +integer between 0 and 9 inclusive if compression has been specified +for the variable. +.IP 4. 3 +`_Shuffle' specifies if the the shuffle filter should be used. +.IP 5. 3 +`_Storage' is `contiguous' or `chunked'. +.IP 6. 3 +`_ChunkSizes' is a list of chunk sizes for each dimension of +the variable +.LP +Note that attributes such as "add_offset" or "scale_factor" +have no special meaning to ncgen. These attributes are +currently conventions, handled above the library layer by +other utility packages, for example NCO. +.LP +.SS "Specifying Datalists" +.LP +Specifying datalists for variables in the `data:` section can be somewhat +complicated. There are some rules that must be followed +to ensure that datalists are parsed correctly by ncgen. +.LP +First, the top level is automatically assumed to be a list of items, so it should not be inside {...}. +That means that if the variable is a scalar, there will be a single top-level element +and if the variable is an array, there will be N top-level elements. +For each element of the top level list, the following rules should be applied. +.IP 1. 3 +Instances of UNLIMITED dimensions (other than the first dimension) must be surrounded by {...} in order to specify the size. +.IP 2. 3 +Compound instances must be embedded in {...} +.IP 3. 3 +Non-scalar fields of compound instances must be embedded in {...}. +.IP 4. 3 +Instances of vlens must be surrounded by {...} in order to specify the size. +.LP +Datalists associated with attributes are implicitly a vector (i.e., a list) of values of the type of the attribute and the above rules must apply with that in mind. +.IP 7. 3 +No other use of braces is allowed. +.LP +Note that one consequence of these rules is that +arrays of values cannot have subarrays within braces. +Consider, for example, int var(d1)(d2)...(dn), +where none of d2...dn are unlimited. +A datalist for this variable must be a single list of integers, +where the number of integers is no more than D=d1*d2*...dn values; +note that the list can be less than D, in which case fill values +will be used to pad the list. +.LP +Rule 6 about attribute datalist has the following consequence. +If the type of the attribute is a compound (or vlen) type, and if +the number of entries in the list is one, then the compound instances +must be enclosed in braces. +.LP +.SS "Specifying Character Datalists" +.LP +Specifying datalists for variables of type char also has some +complications. consider, for example +.RS +.nf +dimensions: u=UNLIMITED; d1=1; d2=2; d3=3; + d4=4; d5=5; u2=UNLIMITED; +variables: char var(d4,d5); +datalist: var="1", "two", "three"; +.fi +.RE +.LP +We have twenty elements of var to fill (d5 X d4) +and we have three strings of length 1, 3, 5. +How do we assign the characters in the strings to the +twenty elements? +.LP +This is challenging because it is desirable to mimic +the original ncgen (ncgen3). +The core algorithm is notionally as follows. +.IP 1. 3 +Assume we have a set of dimensions D1..Dn, +where D1 may optionally be an Unlimited dimension. +It is assumed that the sizes of the Di are all known +(including unlimited dimensions). +.IP 2. 3 +Given a sequence of string or character constants +C1..Cm, our goal is to construct a single string +whose length is the cross product of D1 thru Dn. +Note that for purposes of this algorithm, character constants +are treated as strings of size 1. +.IP 3. 3 +Construct Dx = cross product of D1 thru D(n-1). +.IP 4. 3 +For each constant Ci, add fill characters as needed +so that its length is a multiple of Dn. +.IP 5. 3 +Concatenate the modified C1..Cm to produce string S. +.IP 6. 3 +Add fill characters to S to make its length be a multiple of Dn. +.IP 8. 3 +If S is longer than the Dx * Dn, then truncate +and generate a warning. +.LP +There are three other cases of note. +.IP 1. 3 +If there is only a single, unlimited dimension, +then all of the constants are concatenated +and fill characters are added to the +end of the resulting string to make its +length be that of the unlimited dimension. +If the length is larger than +the unlimited dimension, then it is truncated +with a warning. +.IP 2. 3 +For the case of character typed vlen, "char(*) vlen_t" for example. +we simply concatenate all the constants with no filling at all. +.IP 3. 3 +For the case of a character typed attribute, +we simply concatenate all the constants. +.LP +In netcdf-4, dimensions other than the first can be unlimited. +Of course by the rules above, the interior unlimited instances +must be delimited by {...}. For example. +.in +5 +.nf +variables: char var(u,u2); +datalist: var={"1", "two"}, {"three"}; +.fi +.in -5 +In this case u will have the effective length of two. +Within each instance of u2, the rules above will apply, leading +to this. +.in +5 +datalist: var={"1","t","w","o"}, {"t","h","r","e","e"}; +.in -5 +The effective size of u2 will be the max of the two instance lengths +(five in this case) +and the shorter will be padded to produce this. +.in +5 +datalist: var={"1","t","w","o","\\0"}, {"t","h","r","e","e"}; +.in -5 +.LP +Consider an even more complicated case. +.in +5 +.nf +variables: char var(u,u2,u3); +datalist: var={{"1", "two"}}, {{"three"},{"four","xy"}}; +.fi +.in -5 +In this case u again will have the effective length of two. +The u2 dimensions will have a size = max(1,2) = 2; +Within each instance of u2, the rules above will apply, leading to this. +.in +5 +.nf +datalist: var={{"1","t","w","o"}}, {{"t","h","r","e","e"},{"f","o","u","r","x","y"}}; +.fi +.in -5 +The effective size of u3 will be the max of the two instance lengths +(six in this case) and the shorter ones will be padded to produce this. +.in +5 +.nf +datalist: var={{"1","t","w","o","\0","\0"}}, {{"t","h","r","e","e","\0"},{"f","o","u","r","x","y"}}; +.fi +.in -5 +Note however that the first instance of u2 is less than the max length +of u2, so we need to add a filler for another instance of u2, producing this. +.in +5 +.nf +datalist: var={{"1","t","w","o","\0","\0"},{"\0","\0","\0","\0","\0","\0"}}, {{"t","h","r","e","e","\0"},{"f","o","u","r","x","y"}}; +.fi +.in -5 + +.SH BUGS +.LP +The programs generated by \fBncgen\fP when using the \fB-c\fP flag +use initialization statements to store data in variables, and will fail to +produce compilable programs if you try to use them for large datasets, since +the resulting statements may exceed the line length or number of +continuation statements permitted by the compiler. +.LP +The CDL syntax makes it easy to assign what looks like an array of +variable-length strings to a netCDF variable, but the strings may simply be +concatenated into a single array of characters. +Specific use of the \fIstring\fP type specifier may solve the problem + +.SH "CDL Grammar" +.LP +The file ncgen.y is the definitive grammar for CDL, but a stripped +down version is included here for completeness. +.RS +.nf +ncdesc: NETCDF + datasetid + rootgroup + ; + +datasetid: DATASETID + +rootgroup: '{' + groupbody + subgrouplist + '}'; + +groupbody: + attrdecllist + typesection + dimsection + vasection + datasection + ; + +subgrouplist: + /*empty*/ + | subgrouplist namedgroup + ; + +namedgroup: GROUP ident '{' + groupbody + subgrouplist + '}' + attrdecllist + ; + +typesection: /* empty */ + | TYPES + | TYPES typedecls + ; + +typedecls: + type_or_attr_decl + | typedecls type_or_attr_decl + ; + +typename: ident ; + +type_or_attr_decl: + typedecl + | attrdecl ';' + ; + +typedecl: + enumdecl optsemicolon + | compounddecl optsemicolon + | vlendecl optsemicolon + | opaquedecl optsemicolon + ; + +optsemicolon: + /*empty*/ + | ';' + ; + +enumdecl: primtype ENUM typename ; + +enumidlist: enumid + | enumidlist ',' enumid + ; + +enumid: ident '=' constint ; + +opaquedecl: OPAQUE '(' INT_CONST ')' typename ; + +vlendecl: typeref '(' '*' ')' typename ; + +compounddecl: COMPOUND typename '{' fields '}' ; + +fields: field ';' + | fields field ';' + ; + +field: typeref fieldlist ; + +primtype: CHAR_K + | BYTE_K + | SHORT_K + | INT_K + | FLOAT_K + | DOUBLE_K + | UBYTE_K + | USHORT_K + | UINT_K + | INT64_K + | UINT64_K + ; + +dimsection: /* empty */ + | DIMENSIONS + | DIMENSIONS dimdecls + ; + +dimdecls: dim_or_attr_decl ';' + | dimdecls dim_or_attr_decl ';' + ; + +dim_or_attr_decl: dimdeclist | attrdecl ; + +dimdeclist: dimdecl + | dimdeclist ',' dimdecl + ; + +dimdecl: + dimd '=' UINT_CONST + | dimd '=' INT_CONST + | dimd '=' DOUBLE_CONST + | dimd '=' NC_UNLIMITED_K + ; + +dimd: ident ; + +vasection: /* empty */ + | VARIABLES + | VARIABLES vadecls + ; + +vadecls: vadecl_or_attr ';' + | vadecls vadecl_or_attr ';' + ; + +vadecl_or_attr: vardecl | attrdecl ; + +vardecl: typeref varlist ; + +varlist: varspec + | varlist ',' varspec + ; + +varspec: ident dimspec ; + +dimspec: /* empty */ + | '(' dimlist ')' + ; + +dimlist: dimref + | dimlist ',' dimref + ; + +dimref: path ; + +fieldlist: + fieldspec + | fieldlist ',' fieldspec + ; + +fieldspec: ident fielddimspec ; + +fielddimspec: /* empty */ + | '(' fielddimlist ')' + ; + +fielddimlist: + fielddim + | fielddimlist ',' fielddim + ; + +fielddim: + UINT_CONST + | INT_CONST + ; + +/* Use this when referencing defined objects */ +varref: type_var_ref ; + +typeref: type_var_ref ; + +type_var_ref: + path + | primtype + ; + +/* Use this for all attribute decls */ +/* Watch out; this is left recursive */ +attrdecllist: /*empty*/ | attrdecl ';' attrdecllist ; + +attrdecl: + ':' ident '=' datalist + | typeref type_var_ref ':' ident '=' datalist + | type_var_ref ':' ident '=' datalist + | type_var_ref ':' _FILLVALUE '=' datalist + | typeref type_var_ref ':' _FILLVALUE '=' datalist + | type_var_ref ':' _STORAGE '=' conststring + | type_var_ref ':' _CHUNKSIZES '=' intlist + | type_var_ref ':' _FLETCHER32 '=' constbool + | type_var_ref ':' _DEFLATELEVEL '=' constint + | type_var_ref ':' _SHUFFLE '=' constbool + | type_var_ref ':' _ENDIANNESS '=' conststring + | type_var_ref ':' _NOFILL '=' constbool + | ':' _FORMAT '=' conststring + ; + +path: + ident + | PATH + ; + +datasection: /* empty */ + | DATA + | DATA datadecls + ; + +datadecls: + datadecl ';' + | datadecls datadecl ';' + ; + +datadecl: varref '=' datalist ; +datalist: + datalist0 + | datalist1 + ; + +datalist0: + /*empty*/ + ; + +/* Must have at least 1 element */ +datalist1: + dataitem + | datalist ',' dataitem + ; + +dataitem: + constdata + | '{' datalist '}' + ; + +constdata: + simpleconstant + | OPAQUESTRING + | FILLMARKER + | NIL + | econstref + | function + ; + +econstref: path ; + +function: ident '(' arglist ')' ; + +arglist: + simpleconstant + | arglist ',' simpleconstant + ; + +simpleconstant: + CHAR_CONST /* never used apparently*/ + | BYTE_CONST + | SHORT_CONST + | INT_CONST + | INT64_CONST + | UBYTE_CONST + | USHORT_CONST + | UINT_CONST + | UINT64_CONST + | FLOAT_CONST + | DOUBLE_CONST + | TERMSTRING + ; + +intlist: + constint + | intlist ',' constint + ; + +constint: + INT_CONST + | UINT_CONST + | INT64_CONST + | UINT64_CONST + ; + +conststring: TERMSTRING ; + +constbool: + conststring + | constint + ; + +/* Push all idents thru here for tracking */ +ident: IDENT ; +.fi +.RE diff --git a/privatemodules/nc4/share/man/man1/ncgen3.1 b/privatemodules/nc4/share/man/man1/ncgen3.1 new file mode 100644 index 0000000000000000000000000000000000000000..fe36727489dbd865ce685d74c89011a4749a1f3e --- /dev/null +++ b/privatemodules/nc4/share/man/man1/ncgen3.1 @@ -0,0 +1,373 @@ +.\" $Header: /upc/share/CVS/netcdf-3/ncgen3/ncgen3.1,v 1.1 2009/09/24 18:19:10 dmh Exp $ +.TH NCGEN3 1 "$Date: 2009/09/24 18:19:10 $" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA UTILITIES" +.SH NAME +ncgen3 \- From a CDL file generate a netCDF classic or 64 bit classicfile, +a C program, or a Fortran program +.SH SYNOPSIS +.HP +ncgen3 +.nh +\%[\-b] +\%[\-c] +\%[\-f] +\%[\-k \fIkind_of_file\fP] +\%[\-x] +\%[\-n] +\%[\-o \fInetcdf_filename\fP] +\%\fIinput_file\fP +.hy +.ft +.SH DESCRIPTION +\fBncgen3\fP generates either a netCDF file, or C or Fortran source code to +create a netCDF file. The input to \fBncgen3\fP is a description of a netCDF +file in a small language known as CDL (network Common Data form Language), +described below. +If no options are specified in invoking \fBncgen3\fP, it merely checks the +syntax of the input CDL file, producing error messages for +any violations of CDL syntax. Other options can be used to create the +corresponding netCDF file, to generate a C program that uses the netCDF C +interface to create the netCDF file, or to generate a Fortran program that +uses the netCDF Fortran interface to create the same netCDF file. +.LP +\fBncgen3\fP may be used with the companion program \fBncdump\fP to perform +some simple operations on netCDF files. For example, to rename a dimension +in a netCDF file, use \fBncdump\fP to get a CDL version of the netCDF file, +edit the CDL file to change the name of the dimensions, and use \fBncgen3\fP +to generate the corresponding netCDF file from the edited CDL file. +.SH OPTIONS +.IP "\fB-b\fP" +Create a (binary) netCDF file. If the \fB-o\fP option is absent, a default +file name will be constructed from the netCDF name (specified after the +\fBnetcdf\fP keyword in the input) by appending the `.nc' extension. If a +file already exists with the specified name, it will be overwritten. +.IP "\fB-c\fP" +Generate +.B C +source code that will create a netCDF file +matching the netCDF specification. The C source code is written to +standard output. +.IP "\fB-f\fP" +Generate +.B Fortran +source code that will create a netCDF file +matching the netCDF specification. The Fortran source code is written +to standard output. +.IP "\fB-o\fP \fRnetcdf_file\fP" +Name for the binary netCDF file created. If this option is specified, it implies +the "\fB-b\fP" option. (This option is necessary because netCDF files +cannot be written directly to standard output, since standard output is not +seekable.) +.IP "\fB-k \fRkind_of_file\fP" +Using \-k2 or \-k "64-bit offset" specifies that +generated file (or program) should use version 2 of format that +employs 64-bit file offsets. The default is to use version 1 +("classic") format with 32-bit file offsets, although this limits the +size of the netCDF file, variables, and records to the sizes supported +by the classic format. (NetCDF-4 will support additional kinds of +netCDF files, "netCDF-4" and "netCDF-4 classic model".) +Note: \-v is also accepted to mean the same thing as +\-k for backward compatibility, but \-k is preferred, to match +the corresponding ncdump option. +.IP "\fB-x\fP" +Don't initialize data with fill values. This can speed up creation of +large netCDF files greatly, but later attempts to read unwritten data +from the generated file will not be easily detectable. +.SH EXAMPLES +.LP +Check the syntax of the CDL file `\fBfoo.cdl\fP': +.RS +.HP +ncgen3 foo.cdl +.RE +.LP +From the CDL file `\fBfoo.cdl\fP', generate an equivalent binary netCDF file +named `\fBx.nc\fP': +.RS +.HP +ncgen3 \-o x.nc foo.cdl +.RE +.LP +From the CDL file `\fBfoo.cdl\fP', generate a C program containing the +netCDF function invocations necessary to create an equivalent binary netCDF +file named `\fBx.nc\fP': +.RS +.HP +ncgen3 \-c \-o x.nc foo.cdl +.RE +.LP +.SH USAGE +.SS "CDL Syntax Summary" +.LP +Below is an example of CDL syntax, describing a netCDF file with several +named dimensions (lat, lon, and time), variables (Z, t, p, rh, lat, lon, +time), variable attributes (units, long_name, valid_range, _FillValue), and +some data. CDL keywords are in boldface. (This example is intended to +illustrate the syntax; a real CDL file would have a more complete set of +attributes so that the data would be more completely self-describing.) + +.RS +.nf +\fBnetcdf\fP foo { // an example netCDF specification in CDL + +\fBdimensions\fP: + lat = 10, lon = 5, time = \fBunlimited\fP ; + +\fBvariables\fP: + \fBlong\fP lat(lat), lon(lon), time(time); + \fBfloat\fP Z(time,lat,lon), t(time,lat,lon); + \fBdouble\fP p(time,lat,lon); + \fBlong\fP rh(time,lat,lon); + + // variable attributes + lat:long_name = "latitude"; + lat:units = "degrees_north"; + lon:long_name = "longitude"; + lon:units = "degrees_east"; + time:units = "seconds since 1992-1-1 00:00:00"; + Z:units = "geopotential meters"; + Z:valid_range = 0., 5000.; + p:_FillValue = \-9999.; + rh:_FillValue = \-1; + +\fBdata\fP: + lat = 0, 10, 20, 30, 40, 50, 60, 70, 80, 90; + lon = \-140, \-118, \-96, \-84, \-52; +} +.fi +.RE +.LP +All CDL statements are terminated by a semicolon. Spaces, tabs, +and newlines can be used freely for readability. +Comments may follow the characters `//' on any line. +.LP +A CDL description consists of three optional parts: \fIdimensions\fP, +\fIvariables\fP, and \fIdata\fP, beginning with the keyword +.BR dimensions: , +.BR variables: , +and +.BR data , +respectively. +The variable part may contain \fIvariable +declarations\fP and \fIattribute assignments\fP. +.LP +A netCDF \fIdimension\fP is used to define the shape of one or more of the +multidimensional variables contained in the netCDF file. A netCDF +dimension has a name and a size. At most one dimension in a netCDF file +can have the \fBunlimited\fP size, which means a variable using this +dimension can grow to any length (like a record number in a file). +.LP +A \fIvariable\fP represents a multidimensional array of values of the +same type. A variable has a name, a data type, and a shape described +by its list of dimensions. Each variable may also have associated +\fIattributes\fP (see below) as well as data values. The name, data +type, and shape of a variable are specified by its declaration in the +\fIvariable\fP section of a CDL description. A variable may have the same +name as a dimension; by convention such a variable is one-dimensional +and contains coordinates of the dimension it names. Dimensions need +not have corresponding variables. +.LP +A netCDF \fIattribute\fP contains information about a netCDF variable or +about the whole netCDF dataset. Attributes are used +to specify such properties as units, special values, maximum and +minimum valid values, scaling factors, offsets, and parameters. Attribute +information is represented by single values or arrays of values. For +example, "units" is an attribute represented by a character array such +as "celsius". An attribute has an associated variable, a name, +a data type, a length, and a value. In contrast to variables that are +intended for data, attributes are intended for metadata (data about +data). +.LP +In CDL, an attribute is designated by a variable and attribute name, +separated by `:'. It is possible to assign \fIglobal\fP attributes +not associated with any variable to the netCDF as a whole by using +`:' before the attribute name. The data type of an attribute in CDL +is derived from the type of the value assigned to it. The length of +an attribute is the number of data values assigned to it, or the +number of characters in the character string assigned to it. Multiple +values are assigned to non-character attributes by separating the +values with commas. All values assigned to an attribute must be of +the same type. +.LP +The names for CDL dimensions, variables, and attributes must begin with an +alphabetic character or `_', and subsequent characters may be alphanumeric +or `_' or `-'. +.LP +The optional \fIdata\fP section of a CDL specification is where +netCDF variables may be initialized. The syntax of an initialization +is simple: a variable name, an equals sign, and a +comma-delimited list of constants (possibly separated by spaces, tabs +and newlines) terminated with a semicolon. For multi-dimensional +arrays, the last dimension varies fastest. Thus row-order rather than +column order is used for matrices. If fewer values are supplied than +are needed to fill a variable, it is extended with a type-dependent +`fill value', which can be overridden by supplying a value for a +distinguished variable attribute named `_FillValue'. The +types of constants need not match the type declared for a variable; +coercions are done to convert integers to floating point, for example. +The constant `_' can be used to designate the fill value for a variable. +.SS "Primitive Data Types" +.LP +.RS +.nf +\fBchar\fP characters +\fBbyte\fP 8-bit data +\fBshort\fP 16-bit signed integers +\fBlong\fP 32-bit signed integers +\fBint\fP (synonymous with \fBlong\fP) +\fBfloat\fP IEEE single precision floating point (32 bits) +\fBreal\fP (synonymous with \fBfloat\fP) +\fBdouble\fP IEEE double precision floating point (64 bits) +.fi +.RE +.LP +Except for the added data-type \fBbyte\fP and the lack of +\fBunsigned\fP, +CDL supports the same primitive data types as C. +The names for the primitive data types are reserved words in CDL, +so the names of variables, dimensions, and attributes must not be +type names. In declarations, type names may be specified +in either upper or lower case. +.LP +Bytes differ from characters in that they are intended to hold a full eight +bits of data, and the zero byte has no special significance, as it +does for character data. +\fBncgen3\fP converts \fBbyte\fP declarations to \fBchar\fP +declarations in the output C code and to the nonstandard \fBBYTE\fP +declaration in output Fortran code. +.LP +Shorts can hold values between \-32768 and 32767. +\fBncgen3\fP converts \fBshort\fP declarations to \fBshort\fP +declarations in the output C code and to the nonstandard \fBINTEGER*2\fP +declaration in output Fortran code. +.LP +Longs can hold values between \-2147483648 and 2147483647. +\fBncgen3\fP converts \fBlong\fP declarations to \fBlong\fP +declarations in the output C code and to \fBINTEGER\fP +declarations in output Fortran code. \fBint\fP and \fBinteger\fP are +accepted as synonyms for \fBlong\fP in CDL declarations. +Now that there are platforms with 64-bit representations for C longs, it may +be better to use the \fBint\fP synonym to avoid confusion. +.LP +Floats can hold values between about \-3.4+38 and 3.4+38. Their +external representation is as 32-bit IEEE normalized single-precision +floating point numbers. \fBncgen3\fP converts \fBfloat\fP +declarations to \fBfloat\fP declarations in the output C code and to +\fBREAL\fP declarations in output Fortran code. \fBreal\fP is accepted +as a synonym for \fBfloat\fP in CDL declarations. +.LP +Doubles can hold values between about \-1.7+308 and 1.7+308. Their +external representation is as 64-bit IEEE standard normalized +double-precision floating point numbers. \fBncgen3\fP converts +\fBdouble\fP declarations to \fBdouble\fP declarations in the output C +code and to \fBDOUBLE PRECISION\fP declarations in output Fortran +code. +.LP +.SS "CDL Constants" +.LP +Constants assigned to attributes or variables may be of any of the +basic netCDF types. The syntax for constants is similar to C syntax, +except that type suffixes must be appended to shorts and floats to +distinguish them from longs and doubles. +.LP +A \fIbyte\fP constant is represented by a single character or multiple +character escape sequence enclosed in single quotes. For example, +.RS +.nf + 'a' // ASCII `a' + '\\0' // a zero byte + '\\n' // ASCII newline character + '\\33' // ASCII escape character (33 octal) + '\\x2b' // ASCII plus (2b hex) + '\\377' // 377 octal = 255 decimal, non-ASCII +.fi +.RE +.LP +Character constants are enclosed in double quotes. A character array +may be represented as a string enclosed in double quotes. The usual C +string escape conventions are honored. For example +.RS +.nf +"a" // ASCII `a' +"Two\\nlines\\n" // a 10-character string with two embedded newlines +"a bell:\\007" // a string containing an ASCII bell +.fi +.RE +Note that the netCDF character array "a" would fit in a one-element +variable, since no terminating NULL character is assumed. However, a zero +byte in a character array is interpreted as the end of the significant +characters by the \fBncdump\fP program, following the C convention. +Therefore, a NULL byte should not be embedded in a character string unless +at the end: use the \fIbyte\fP data type instead for byte arrays that +contain the zero byte. NetCDF and CDL have no string type, but only +fixed-length character arrays, which may be multi-dimensional. +.LP +\fIshort\fP integer constants are intended for representing 16-bit +signed quantities. The form of a \fIshort\fP constant is an integer +constant with an `s' or `S' appended. If a \fIshort\fP constant +begins with `0', it is interpreted as octal, except that if it begins with +`0x', it is interpreted as a hexadecimal constant. For example: +.RS +.nf +\-2s // a short \-2 +0123s // octal +0x7ffs //hexadecimal +.fi +.RE +.LP +\fILong\fP integer constants are intended for representing 32-bit signed +quantities. The form of a \fIlong\fP constant is an ordinary integer +constant, although it is acceptable to append an optional `l' or +`L'. If a \fIlong\fP constant begins with `0', it is interpreted as +octal, except that if it begins with `0x', it is interpreted as a hexadecimal +constant. Examples of valid \fIlong\fP constants include: +.RS +.nf +\-2 +1234567890L +0123 // octal +0x7ff // hexadecimal +.fi +.RE +.LP +Floating point constants of type \fIfloat\fP are appropriate for representing +floating point data with about seven significant digits of precision. +The form of a \fIfloat\fP constant is the same as a C floating point +constant with an `f' or `F' appended. For example the following +are all acceptable \fIfloat\fP constants: +.RS +.nf +\-2.0f +3.14159265358979f // will be truncated to less precision +1.f + +.fi +.RE +.LP +Floating point constants of type \fIdouble\fP are appropriate for +representing floating point data with about sixteen significant digits +of precision. The form of a \fIdouble\fP constant is the same as a C +floating point constant. An optional `d' or `D' may be appended. +For example the following are all acceptable \fIdouble\fP constants: +.RS +.nf +\-2.0 +3.141592653589793 +1.0e-20 +1.d +.fi +.RE + +.SH BUGS +.LP +The programs generated by \fBncgen3\fP when using the \fB-c\fP or \fB-f\fP +use initialization statements to store data in variables, and will fail to +produce compilable programs if you try to use them for large datasets, since +the resulting statements may exceed the line length or number of +continuation statements permitted by the compiler. +.LP +The CDL syntax makes it easy to assign what looks like an array of +variable-length strings to a netCDF variable, but the strings will simply be +concatenated into a single array of characters, since netCDF cannot +represent an array of variable-length strings in one netCDF variable. +.LP +NetCDF and CDL do not yet support a type corresponding to a 64-bit integer. diff --git a/privatemodules/nc4/share/man/man3/netcdf.3 b/privatemodules/nc4/share/man/man3/netcdf.3 new file mode 100644 index 0000000000000000000000000000000000000000..89985eda96174003e6ea1db7a1851292bad06a67 --- /dev/null +++ b/privatemodules/nc4/share/man/man3/netcdf.3 @@ -0,0 +1,1405 @@ +.nr yr \n(yr+1900 +.af mo 01 +.af dy 01 +.TH NETCDF 3 "1997-04-18" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA LIBRARY FUNCTIONS" +.SH NAME +netcdf \- Unidata's Network Common Data Form (netCDF) library interface +.SH SYNOPSIS +.ft B +.na +.nh +#include "netcdf.h" +.sp + +cc ... \-lnetcdf \-lhdf5_hl \-lhdf5 \-lz \-lm + +.ad +.hy +Complete documentation for the netCDF libraries can be found at the netCDF website: http://www.unidata.ucar.edu/software/netcdf/. +.sp +.SH "LIBRARY VERSION" +.LP +This document describes versions 3 and 4 +of Unidata netCDF data-access interface +for the C programming language. +.HP +\fBconst char* nc_inq_libvers()\fR +.sp +Returns a string identifying the version of the netCDF library, and +when it was built, like: "3.1a of Aug 22 1996 12:57:47 $". +.LP +The RCS \fBident(1)\fP command will find a string like +"$\|Id: @\|(#) netcdf library version 3.1a of Sep 6 1996 15:56:26 $" +in the library. The SCCS \fBwhat(1)\fP command will find a string like +"netcdf library version 3.1a of Aug 23 1996 16:07:40 $". +.SH "RETURN VALUES" +.LP +All netCDF functions (except +\fBnc_inq_libvers(\|)\fR and \fBnc_strerror(\|)\fR) return an integer status. + +If this returned status value is not equal to +\fBNC_NOERR\fR (zero), it +indicates that an error occurred. The possible status values are defined in +system include file <errno.h> and in "netcdf.h". +.HP +\fBconst char* nc_strerror(int \fIstatus\fP)\fR +.sp +Returns a string textual translation of the \fIstatus\fP +value, like "Attribute or variable name contains illegal characters" +or "No such file or directory". +.sp +.SH "FILE OPERATIONS" +.LP +.HP +\fBint nc_create(const char \fIpath\fP[], int \fIcmode\fP, int* \fIncid\fP)\fR +.sp +Creates a new netCDF dataset at \fIpath\fP, +returning a netCDF ID in \fIncid\fP. +The argument \fIcmode\fP may include the bitwise-or +of the following flags: +\fBNC_NOCLOBBER\fR +to protect existing datasets (default +silently blows them away), +\fBNC_SHARE\fR +for synchronous dataset updates for classic format files +(default is to buffer accesses), +.sp +When a netCDF dataset is created, is is opened +\fBNC_WRITE\fR. +The new netCDF dataset is in define mode. +\fBNC_64BIT_OFFSET\fR. +to create a file in the 64-bit offset format +(as opposed to classic format, the default). +\fBNC_TRUE\fR to create a netCDF-4/HDF5 file, +and \fBNC_CLASSIC_MODEL\fR to guarantee that netCDF-4/HDF5 files maintain compatibility +with the netCDF classic data model. +.HP +\fBint nc__create(const char \fIpath\fP[], int \fIcmode\fP, size_t \fIinitialsize\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR +.sp +Like \fBnc_create(\|)\fR but has additional performance tuning parameters. +.sp +The argument \fIinitialsize\fP sets the initial size of the file at +creation time. +.sp +See \fBnc__open(\|)\fR below for an explanation of the \fIchunksize\fP +parameter. +.HP +\fBint nc_open(const char \fIpath\fP[], int \fImode\fP, int* \fIncid\fP)\fR +.sp +(Corresponds to \fBncopen(\|)\fR in version 2) +.sp +Opens a existing netCDF dataset at \fIpath\fP +returning a netCDF ID +in \fIncid\fP. +The type of access is described by the \fImode\fP parameter, +which may include the bitwise-or +of the following flags: +\fBNC_WRITE\fR +for read-write access (default +read-only), +\fBNC_SHARE\fR +for synchronous dataset updates (default is +to buffer accesses), and +\fBNC_LOCK\fR +(not yet implemented). +.sp +As of NetCDF version 4.1, and if TRUE support was enabled +when the NetCDF library was built, the path parameter +may specify a TRUE URL. In this case, the access mode is +forced to be read-only. +.HP +\fBint nc__open(const char \fIpath\fP[], int \fImode\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR +.sp +Like \fBnc_open(\|)\fR but has an additional performance tuning parameter. +.sp +The argument referenced by \fIchunksize\fP controls a space versus time +tradeoff, memory allocated in the netcdf library versus number of system +calls. +Because of internal requirements, the value may not be set to exactly +the value requested. +The actual value chosen is returned by reference. +Using the value \fBNC_SIZEHINT_DEFAULT\fR causes the library to choose a +default. +How the system choses the default depends on the system. +On many systems, the "preferred I/O block size" is available from the +\fBstat()\fR system call, \fBstruct stat\fR member \fBst_blksize\fR. +If this is available it is used. Lacking that, twice the system pagesize +is used. +Lacking a call to discover the system pagesize, we just set default +chunksize to 8192. +.sp +The chunksize is a property of a given open netcdf descriptor +\fIncid\fP, it is not a persistent property of the netcdf dataset. +.sp +As with \fBnc__open(\|)\fR, the path parameter +may specify a TRUE URL, but the tuning parameters are ignored. +.HP +\fBint nc_redef(int \fIncid\fP)\fR +.sp +(Corresponds to \fBncredef(\|)\fR in version 2) +.sp +Puts an open netCDF dataset into define mode, +so dimensions, variables, and attributes can be added or renamed and +attributes can be deleted. +.HP +\fBint nc_enddef(int \fIncid\fP)\fR +.sp +(Corresponds to \fBncendef(\|)\fR in version 2) +.sp +Takes an open netCDF dataset out of define mode. +The changes made to the netCDF dataset +while it was in define mode are checked and committed to disk if no +problems occurred. Some data values may be written as well, +see "VARIABLE PREFILLING" below. +After a successful call, variable data can be read or written to the dataset. +.HP +\fBint nc__enddef(int \fIncid\fP, size_t \fIh_minfree\fP, size_t \fIv_align\fP, size_t \fIv_minfree\fP, size_t \fIr_align\fP)\fR +.sp +Like \fBnc_enddef(\|)\fR but has additional performance tuning parameters. +.sp +Caution: this function exposes internals of the netcdf version 1 file +format. +It may not be available on future netcdf implementations. +.sp +The current netcdf file format has three sections, +the "header" section, the data section for fixed size variables, and +the data section for variables which have an unlimited dimension (record +variables). +The header begins at the beginning of the file. The index +(offset) of the beginning of the other two sections is contained in the +header. Typically, there is no space between the sections. This causes +copying overhead to accrue if one wishes to change the size of the +sections, +as may happen when changing names of things, text attribute values, +adding +attributes or adding variables. Also, for buffered i/o, there may be +advantages +to aligning sections in certain ways. +.sp +The minfree parameters allow one to control costs of future calls +to \fBnc_redef(\|)\fR, \fBnc_enddef(\|)\fR by requesting that \fIminfree\fP bytes be +available at the end of the section. +The \fIh_minfree\fP parameter sets the pad +at the end of the "header" section. The \fIv_minfree\fP parameter sets +the pad at the end of the data section for fixed size variables. +.sp +The align parameters allow one to set the alignment of the beginning of +the corresponding sections. The beginning of the section is rounded up +to an index which is a multiple of the align parameter. The flag value +\fBNC_ALIGN_CHUNK\fR tells the library to use the chunksize (see above) +as the align parameter. +The \fIv_align\fP parameter controls the alignment of the beginning of +the data section for fixed size variables. +The \fIr_align\fP parameter controls the alignment of the beginning of +the data section for variables which have an unlimited dimension (record +variables). +.sp +The file format requires mod 4 alignment, so the align parameters +are silently rounded up to multiples of 4. The usual call, +\fBnc_enddef(\fIncid\fP)\fR +is equivalent to +\fBnc__enddef(\fIncid\fP, 0, 4, 0, 4)\fR. +.sp +The file format does not contain a "record size" value, this is +calculated from the sizes of the record variables. This unfortunate fact +prevents us from providing minfree and alignment control of the +"records" +in a netcdf file. If you add a variable which has an unlimited +dimension, +the third section will always be copied with the new variable added. +.HP +\fBint nc_sync(int \fIncid\fP)\fR +.sp +(Corresponds to \fBncsync(\|)\fR in version 2) +.sp +Unless the +\fBNC_SHARE\fR +bit is set in +\fBnc_open(\|)\fR or \fBnc_create(\|)\fR, +accesses to the underlying netCDF dataset are +buffered by the library. This function synchronizes the state of +the underlying dataset and the library. +This is done automatically by +\fBnc_close(\|)\fR and \fBnc_enddef(\|)\fR. +.HP +\fBint nc_abort(int \fIncid\fP)\fR +.sp +(Corresponds to \fBncabort(\|)\fR in version 2) +.sp +You don't need to call this function. +This function is called automatically by +\fBnc_close(\|)\fR +if the netCDF was in define mode and something goes wrong with the commit. +If the netCDF dataset isn't in define mode, then this function is equivalent to +\fBnc_close(\|)\fR. +If it is called after +\fBnc_redef(\|)\fR, +but before +\fBnc_enddef(\|)\fR, +the new definitions are not committed and the dataset is closed. +If it is called after +\fBnc_create(\|)\fR +but before +\fBnc_enddef(\|)\fR, +the dataset disappears. +.HP +\fBint nc_close(int \fIncid\fP)\fR +.sp +(Corresponds to +\fBncclose(\|)\fR in version 2) +.sp +Closes an open netCDF dataset. +If the dataset is in define mode, +\fBnc_enddef(\|)\fR +will be called before closing. +After a dataset is closed, its ID may be reassigned to another dataset. +.HP +\fBint nc_inq(int \fIncid\fP, int* \fIndims\fP, int* \fInvars\fP, +int* \fInatts\fP, int* \fIunlimdimid\fP)\fR +.HP +\fBint nc_inq_ndims(int \fIncid\fP, int* \fIndims\fP)\fR +.HP +\fBint nc_inq_nvars(int \fIncid\fP, int* \fInvars\fP)\fR +.HP +\fBint nc_inq_natts(int \fIncid\fP, int* \fInatts\fP)\fR +.HP +\fBint nc_inq_unlimdim(int \fIncid\fP, int* \fIunlimdimid\fP)\fR +.HP +\fBint nc_inq_format(int \fIncid\fP, int* \fIformatn\fP)\fR +.sp +Use these functions to find out what is in a netCDF dataset. +Upon successful return, +\fIndims\fP will contain the +number of dimensions defined for this netCDF dataset, +\fInvars\fP will contain the number of variables, +\fInatts\fP will contain the number of attributes, and +\fIunlimdimid\fP will contain the +dimension ID of the unlimited dimension if one exists, or +\-1 otherwise. +\fIformatn\fP will contain the version number of the dataset <format>, one of +\fBNC_FORMAT_CLASSIC\fR, \fBNC_FORMAT_64BIT_OFFSET\fR, \fBNC_FORMAT_NETCDF4\fR, or +\fBNC_FORMAT_NETCDF4_CLASSIC\fR. +If any of the +return parameters is a \fBNULL\fR pointer, then the corresponding information +will not be returned; hence, no space need be allocated for it. +.HP +\fBint nc_def_dim(int \fIncid\fP, const char \fIname\fP[], size_t \fIlen\fP, int* \fIdimid\fP)\fR +.sp +(Corresponds to \fBncdimdef(\|)\fR in version 2) +.sp +Adds a new dimension to an open netCDF dataset, which must be +in define mode. +\fIname\fP is the dimension name. +If \fIdimid\fP is not a \fBNULL\fR pointer then upon successful completion \fIdimid\fP will contain the dimension ID of the newly created dimension. + +.SH "USER DEFINED TYPES" +.LP +Users many define types for a netCDF-4/HDF5 file (unless the +\fBNC_CLASSIC_MODEL\fR was used when the file was creates). Users may +define compound types, variable length arrays, enumeration types, and +opaque types. +.sp + +.HP +\fBint nc_def_compound(int \fIncid\fP, size_t \fIsize\fP, const char \fIname\fP[], int* \fItypeidp\fP)\fR +.sp +Define a compound type. +.HP +\fBint nc_insert_compound(int \fIncid\fP, nc_type \fI\fP, const char \fIname\fP[], size_t \fIoffset\fP, nc_type \fIfield_typeid\fP)\fR +.sp +Insert an element into a compound type. May not be done after type has been used, or after the type has been written by an enddef. +.HP +\fBint nc_insert_array_compound(int \fIncid\fP, nc_type \fI\fP, const char \fIname\fP[], size_t \fIoffset\fP, nc_type \fIfield_typeid\fP, int \fIndims\fP, const int \fIdim_sizes\fP[])\fR +.sp +Insert an array into a compound type. +.HP +\fBint nc_inq_type(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fIsizep\fP)\fR +.sp +Learn about a type. +.HP +\fBint nc_inq_compound(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fIsizep\fP, size_t* \fInfieldsp\fP)\fR +.HP +\fBint nc_inq_compound_name(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[])\fR +.HP +\fBint nc_inq_compound_size(int \fIncid\fP, nc_type \fI\fP, size_t* \fIsizep\fP)\fR +.HP +\fBint nc_inq_compound_nfields(int \fIncid\fP, nc_type \fI\fP, size_t* \fInfieldsp\fP)\fR +.HP +\fBint nc_inq_compound_fieldname(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, char \fIname\fP[])\fR +.HP +\fBint nc_inq_compound_fieldindex(int \fIncid\fP, nc_type \fI\fP, const char \fIname\fP[], int* \fIfieldidp\fP)\fR +.HP +\fBint nc_inq_compound_fieldoffset(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, size_t* \fIoffsetp\fP)\fR +.HP +\fBint nc_inq_compound_fieldtype(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, nc_type* \fIfield_typeid\fP)\fR +.HP +\fBint nc_inq_compound_fieldndims(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, int* \fIndims\fP)\fR +.HP +\fBint nc_inq_compound_fielddim_sizes(int \fIncid\fP, nc_type \fI\fP, int \fIfieldid\fP, int \fIdim_sizes\fP[])\fR +.sp +Learn about a compound type. +.HP +\fBint nc_def_vlen(int \fIncid\fP, const char \fIname\fP[], nc_type \fIbase_typeid\fP, nc_type* \fIxtypep\fP)\fR +.sp +Create a variable length array type. +.HP +\fBint nc_inq_vlen(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fIdatum_sizep\fP, nc_type* \fIbase_nc_typep\fP)\fR +.sp +Learn about a variable length array type. +.HP +\fBint nc_free_vlen(nc_vlen_t *vl)\fR +.sp +Free memory comsumed by reading data of a variable length array type. +.HP +\fBint nc_put_vlen_element(int \fIncid\fP, nc_type \fI\fP, void * \fIvlen_element\fP, size_t \fIlen\fP, void * \fIdata\fP)\fR +.sp +Write one VLEN. +.HP +\fBint nc_get_vlen_element(int \fIncid\fP, nc_type \fI\fP, void ** \fIvlen_element\fP, size_t \fIlen\fP, void ** \fIdata\fP)\fR +.sp +Read one VLEN. +.HP +\fBint nc_free_string(size_t \fIlen\fP, char **data)\fR +.sp +Free memory comsumed by reading data of a string type. +.HP +\fBint nc_inq_user_type(int \fIncid\fP, nc_type \fI\fP, char \fIname\fP[], size_t* \fI\fP, nc_type* \fI\fP, size_t* \fI\fP, int* \fI\fP)\fR +.sp +Learn about a user define type. +.HP +\fBint nc_def_enum(int \fIncid\fP, nc_type \fIbase_typeid\fP, const char \fIname\fP[], nc_type* \fItypeidp\fP)\fR +.sp +Define an enumeration type. +.HP +\fBint nc_insert_enum(int \fIncid\fP, nc_type \fIbase_typeid\fP, const char \fIname\fP[], const void *value)\fR +.sp +Insert a name-value pair into enumeration type. +.HP +\fBint nc_inq_enum_member(int \fIncid\fP, nc_type \fIxtype\fP, int \fIidx\fP, char \fIname\fP[], void *value)\fR +.HP +\fBint nc_inq_enum_ident(int \fIncid\fP, nc_type \fIxtype\fP, int \fIidx\fP, long long \fIvalue\fP, char \fIidentifier\fP[])\fR +.sp +Learn about a name-value pair into enumeration type. +.HP +\fBint nc_def_opaque(int \fIncid\fP, size_t \fIsize\fP, const char \fIname\fP[], nc_type* \fIxtypep\fP)\fR +.sp +Create an opaque type. +.HP +\fBint nc_inq_opaque(int \fIncid\fP, nc_type \fIxtype\fP, char \fIname\fP[], size_t* \fIsizep\fP)\fR +.sp +Learn about opaque type. +.HP +.SH "GROUPS" +.sp +Users may organize data into hierarchical groups in netCDF-4/HDF5 files (unless \fBNC_CLASSIC_MODEL\fR was used when creating the file). +.HP +\fBint nc_inq_grps(int \fIncid\fP, int* \fInumgrps\fP, int \fIncids\fP[])\fR +.sp +Learn how many groups (and their ncids) are available from the group represented by ncid. +.HP +\fBint nc_inq_grpname(int \fIncid\fP, char \fIname\fP[])\fR +.HP +\fBint nc_inq_grpname_full(int \fIncid\fP, size_t* \fIlen\fP, char \fIname\fP[])\fR +.HP +\fBint nc_inq_grpname_len(int \fIncid\fP, size_t* \fIlen\fP)\fR +.HP +\fBint nc_inq_grp_parent(int \fIncid\fP, int* \fIncid\fP)\fR +.HP +\fBint nc_inq_grp_ncid(int \fIncid\fP, char \fIname\fP[], int* \fIncid\fP)\fR +.HP +\fBint nc_inq_full_ncid(int \fIncid\fP, char \fIname\fP[], int* \fIncid\fP)\fR +.sp +Learn about a group. +.HP +\fBint nc_inq_varids(int \fIncid\fP, int* \fInvars\fP, int* \fI\fP)\fR +.sp +Get the varids in a group. +.HP +\fBint nc_inq_dimids(int \fIncid\fP, int* \fIndims\fP, int* \fIdimids\fP, int \fIinclude_parents\fP)\fR +.sp +Get the dimids in a group and (potentially) its parents. +.HP +\fBint nc_inq_typeids(int \fIncid\fP, int* \fIntypes\fP, int \fItypeids\fP[])\fR +.sp +Get the typeids of user-defined types in a group. +.HP +\fBint nc_def_grp(int \fIncid\fP, char \fIname\fP[], int* \fIncid\fP)\fR +.sp +Create a group. +.LP + +.SH "DIMENSIONS" +.LP +.HP +\fBint nc_inq_dimid(int \fIncid\fP, const char \fIname\fP[], int* \fIdimid\fP)\fR +.sp +(Corresponds to \fBncdimid(\|)\fR in version 2) +.sp +Given a dimension name, returns the ID of a netCDF dimension in \fIdimid\fP. +.HP +\fBint nc_inq_dim(int \fIncid\fP, int \fIdimid\fP, char \fIname\fP[], size_t* \fIlen\fP)\fR +.HP +\fBint nc_inq_dimname(int \fIncid\fP, int \fIdimid\fP, char \fIname\fP[])\fR +.HP +\fBint nc_inq_dimlen(int \fIncid\fP, int \fIdimid\fP, size_t* \fIlen\fP)\fR +.sp +Use these functions to find out about a dimension. +If either the \fIname\fP +argument or \fIlen\fP argument is a \fBNULL\fR pointer, then +the associated information will not be returned. Otherwise, +\fIname\fP should be big enough (\fBNC_MAX_NAME\fR) +to hold the dimension name as the name will be copied into your storage. +The length return parameter, \fIlen\fP +will contain the size of the dimension. +For the unlimited dimension, the returned length is the current +maximum value used for writing into any of the variables which use +the dimension. +.HP +\fBint nc_rename_dim(int \fIncid\fP, int \fIdimid\fP, const char \fIname\fP[])\fR +.sp +(Corresponds to \fBncdimrename(\|)\fR in version 2) +.sp +Renames an existing dimension in an open netCDF dataset. +If the new name is longer than the old name, the netCDF dataset must be in +define mode. +You cannot rename a dimension to have the same name as another dimension. +.SH "VARIABLES" +.LP +.HP +\fBint nc_def_var(int \fIncid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, int \fIndims\fP, const int \fIdimids\fP[], int* \fIvarid\fP)\fR +.sp +(Corresponds to \fBncvardef(\|)\fR in version 2) +.sp +Adds a new variable to a netCDF dataset. The netCDF must be in define mode. +If not \fBNULL\fR, then \fIvarid\fP will be set to the netCDF variable ID. +.HP +\fBint nc_inq_varid(int \fIncid\fP, const char \fIname\fP[], int* \fIvarid\fP)\fR +.sp +(Corresponds to \fBncvarid(\|)\fR in version 2) +.sp +Returns the ID of a netCDF variable in \fIvarid\fP given its name. +.HP +\fBint nc_inq_var(int \fIncid\fP, int \fIvarid\fP, char \fIname\fP[], nc_type* \fIxtype\fP, int* \fIndims\fP, int \fIdimids\fP[], +int* \fInatts\fP)\fR +.HP +\fBint nc_inq_varname(int \fIncid\fP, int \fIvarid\fP, char \fIname\fP[])\fR +.HP +\fBint nc_inq_vartype(int \fIncid\fP, int \fIvarid\fP, nc_type* \fIxtype\fP)\fR +.HP +\fBint nc_inq_varndims(int \fIncid\fP, int \fIvarid\fP, int* \fIndims\fP)\fR +.HP +\fBint nc_inq_vardimid(int \fIncid\fP, int \fIvarid\fP, int \fIdimids\fP[])\fR +.HP +\fBint nc_inq_varnatts(int \fIncid\fP, int \fIvarid\fP, int* \fInatts\fP)\fR +.sp +Returns information about a netCDF variable, given its ID. +If any of the +return parameters (\fIname\fP, \fIxtype\fP, \fIndims\fP, \fIdimids\fP, or +\fInatts\fP) is a \fBNULL\fR pointer, then the corresponding information +will not be returned; hence, no space need be allocated for it. +.HP +\fBint nc_rename_var(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[])\fR +.sp +(Corresponds to \fBncvarrename(\|)\fR in version 2) +.sp +Changes the name of a netCDF variable. +If the new name is longer than the old name, the netCDF must be in define mode. +You cannot rename a variable to have the name of any existing variable. + +.SH "VARIABLES \fIin\fP NETCDF-4 FILES" +.LP +The following functions may only be used on variables in a +netCDF-4/HDF5 data file. These functions must be called after the +variable is defined, but before an enddef call. +.sp +\fBint nc_def_var_deflate(int \fIncid\fP, int \fIvarid\fP, int \fIshuffle\fP, int \fIdeflate\fP, int \fIdeflate_level\fP)\fR +.sp +Turn on compression and/or shuffle filter. (Shuffle filter is only useful for integer data.) +.HP +\fBint nc_inq_var_deflate(int \fIncid\fP, int \fIvarid\fP, int* \fIshufflep\fP, int* \fIdeflatep\fP, int* \fIdeflate_levelp\fP)\fR +.sp +Learn about a variable's deflate settings. +.HP +\fBint nc_def_var_fletcher32(int \fIncid\fP, int \fIvarid\fP, int \fIfletcher32\fP)\fR +.sp +Turn on checksumming for a variable. +.HP +\fBint nc_inq_var_fletcher32(int \fIncid\fP, int \fIvarid\fP, int* \fIfletcher32\fP)\fR +.sp +Learn about checksumming for a variable. +.HP +\fBint nc_def_var_chunking(int \fIncid\fP, int \fIvarid\fP, int \fIstorage\fP, const size_t \fIchunksizesp\fP[])\fR +.sp +Set chunksizes for a variable. +.HP +\fBint nc_inq_var_chunking(int \fIncid\fP, int \fIvarid\fP, int* \fIstoragep\fP, size_t \fIchunksizesp\fP[])\fR +.sp +Learn about chunksizes for a variable. +.HP +\fBint nc_def_var_fill(int \fIncid\fP, int \fIvarid\fP, int \fIno_fill\fP, const size_t \fIchunksizesp\fP[])\fR +.sp +Set a fill value for a variable. +.HP +\fBint nc_inq_var_fill(int \fIncid\fP, int \fIvarid\fP, int* \fIstoragep\fP, size_t \fIchunksizesp\fP[])\fR +.sp +Learn the fill value for a variable. +.HP +\fBint nc_def_var_endian(int \fIncid\fP, int \fIvarid\fP, int \fIendian\fP)\fR +.sp +Set endianness of variable. +.HP +\fBint nc_inq_var_endian(int \fIncid\fP, int \fIvarid\fP, int* \fIendianp\fP)\fR +.sp +Learn the endianness of a variable. +.HP + +.SH "WRITING AND READING WHOLE VARIABLES" +.LP +.HP +\fBint nc_put_var_text(int \fIncid\fP, int \fIvarid\fP, const char \fIout\fP[])\fR +.HP +\fBint nc_put_var_uchar(int \fIncid\fP, int \fIvarid\fP, const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_var_schar(int \fIncid\fP, int \fIvarid\fP, const signed char \fIout\fP[])\fR +.HP +\fBint nc_put_var_short(int \fIncid\fP, int \fIvarid\fP, const short \fIout\fP[])\fR +.HP +\fBint nc_put_var_int(int \fIncid\fP, int \fIvarid\fP, const int \fIout\fP[])\fR +.HP +\fBint nc_put_var_long(int \fIncid\fP, int \fIvarid\fP, const long \fIout\fP[])\fR +.HP +\fBint nc_put_var_float(int \fIncid\fP, int \fIvarid\fP, const float \fIout\fP[])\fR +.HP +\fBint nc_put_var_double(int \fIncid\fP, int \fIvarid\fP, const double \fIout\fP[])\fR +.HP +\fBint nc_put_var_ubyte(int \fIncid\fP, int \fIvarid\fP, const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_var_ushort(int \fIncid\fP, int \fIvarid\fP, const unsigned short \fIout\fP[])\fR +.HP +\fBint nc_put_var_uint(int \fIncid\fP, int \fIvarid\fP, const unsigned int \fIout\fP[])\fR +.HP +\fBint nc_put_var_int64(int \fIncid\fP, int \fIvarid\fP, const long long \fIout\fP[])\fR +.HP +\fBint nc_put_var_uint64(int \fIncid\fP, int \fIvarid\fP, const unsigned long long \fIout\fP[])\fR +.HP +\fBint nc_put_var_string(int \fIncid\fP, int \fIvarid\fP, const char * \fIout\fP[])\fR + + +.sp +Writes an entire netCDF variable (i.e. all the values). The netCDF +dataset must be open and in data mode. The type of the data is +specified in the function name, and it is converted to the external +type of the specified variable, if possible, otherwise an +\fBNC_ERANGE\fR error is returned. Note that rounding is not performed +during the conversion. Floating point numbers are truncated when +converted to integers. +.HP +\fBint nc_get_var_text(int \fIncid\fP, int \fIvarid\fP, char \fIin\fP[])\fR +.HP +\fBint nc_get_var_uchar(int \fIncid\fP, int \fIvarid\fP, unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_var_schar(int \fIncid\fP, int \fIvarid\fP, signed char \fIin\fP[])\fR +.HP +\fBint nc_get_var_short(int \fIncid\fP, int \fIvarid\fP, short \fIin\fP[])\fR +.HP +\fBint nc_get_var_int(int \fIncid\fP, int \fIvarid\fP, int \fIin\fP[])\fR +.HP +\fBint nc_get_var_long(int \fIncid\fP, int \fIvarid\fP, long \fIin\fP[])\fR +.HP +\fBint nc_get_var_float(int \fIncid\fP, int \fIvarid\fP, float \fIin\fP[])\fR +.HP +\fBint nc_get_var_double(int \fIncid\fP, int \fIvarid\fP, double \fIin\fP[])\fR +.HP +\fBint nc_get_var_ubyte(int \fIncid\fP, int \fIvarid\fP, unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_var_ushort(int \fIncid\fP, int \fIvarid\fP, unsigned short \fIin\fP[])\fR +.HP +\fBint nc_get_var_uint(int \fIncid\fP, int \fIvarid\fP, unsigned int \fIin\fP[])\fR +.HP +\fBint nc_get_var_int64(int \fIncid\fP, int \fIvarid\fP, long long \fIin\fP[])\fR +.HP +\fBint nc_get_var_uint64(int \fIncid\fP, int \fIvarid\fP, unsigned long long \fIin\fP[])\fR +.HP +\fBint nc_get_var_string(int \fIncid\fP, int \fIvarid\fP, char * \fIin\fP[])\fR + + +.sp +Reads an entire netCDF variable (i.e. all the values). +The netCDF dataset must be open and in data mode. +The data is converted from the external type of the specified variable, +if necessary, to the type specified in the function name. If conversion is +not possible, an \fBNC_ERANGE\fR error is returned. +.SH "WRITING AND READING ONE DATUM" +.LP +.HP +\fBint nc_put_var1_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char \fI*out\fP)\fR +.HP +\fBint nc_put_var1_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char \fI*out\fP)\fR +.HP +\fBint nc_put_var1_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], signed char \fI*out\fP)\fR +.HP +\fBint nc_put_var1_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], short \fI*out\fP)\fR +.HP +\fBint nc_put_var1_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], int \fI*out\fP)\fR +.HP +\fBint nc_put_var1_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long \fI*out\fP)\fR +.HP +\fBint nc_put_var1_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], float \fI*out\fP)\fR +.HP +\fBint nc_put_var1_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], double \fI*out\fP)\fR +.HP +\fBint nc_put_var1_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char \fI*out\fP)\fR +.HP +\fBint nc_put_var1_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned short \fI*out\fP)\fR +.HP +\fBint nc_put_var1_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned int \fI*out\fP)\fR +.HP +\fBint nc_put_var1_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long long \fI*out\fP)\fR +.HP +\fBint nc_put_var1_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned long long \fI*out\fP)\fR +.HP +\fBint nc_put_var1_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char * \fI*out\fP)\fR + + +.sp +Puts a single data value into a variable at the position \fIindex\fP of an +open netCDF dataset that is in data mode. The type of the data is +specified in the function name, and it is converted to the external type +of the specified variable, if possible, otherwise an \fBNC_ERANGE\fR +error is returned. +.HP +\fBint nc_get_var1_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char* \fIin\fP)\fR +.HP +\fBint nc_get_var1_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char* \fIin\fP)\fR +.HP +\fBint nc_get_var1_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], signed char* \fIin\fP)\fR +.HP +\fBint nc_get_var1_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], short* \fIin\fP)\fR +.HP +\fBint nc_get_var1_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], int* \fIin\fP)\fR +.HP +\fBint nc_get_var1_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long* \fIin\fP)\fR +.HP +\fBint nc_get_var1_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], float* \fIin\fP)\fR +.HP +\fBint nc_get_var1_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], double* \fIin\fP)\fR +.HP +\fBint nc_get_var1_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned char* \fIin\fP)\fR +.HP +\fBint nc_get_var1_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned short* \fIin\fP)\fR +.HP +\fBint nc_get_var1_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned int* \fIin\fP)\fR +.HP +\fBint nc_get_var1_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], long long* \fIin\fP)\fR +.HP +\fBint nc_get_var1_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], unsigned long long* \fIin\fP)\fR +.HP +\fBint nc_get_var1_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIindex\fP[], char ** \fIin\fP)\fR + + +.sp +Gets a single data value from a variable at the position \fIindex\fP +of an open netCDF dataset that is in data mode. +The data is converted from the external type of the specified variable, +if necessary, to the type specified in the function name. If conversion is +not possible, an \fBNC_ERANGE\fR error is returned. +.SH "WRITING AND READING AN ARRAY" +.LP +.HP +\fBint nc_put_vara_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const char \fIout\fP[])\fR +.HP +\fBint nc_put_vara_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_vara_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const signed char \fIout\fP[])\fR +.HP +\fBint nc_put_vara_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const short \fIout\fP[])\fR +.HP +\fBint nc_put_vara_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const int \fIout\fP[])\fR +.HP +\fBint nc_put_vara_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const long \fIout\fP[])\fR +.HP +\fBint nc_put_vara_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const float \fIout\fP[])\fR +.HP +\fBint nc_put_vara_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const double \fIout\fP[])\fR +.HP +\fBint nc_put_vara_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_vara_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned short \fIout\fP[])\fR +.HP +\fBint nc_put_vara_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned int \fIout\fP[])\fR +.HP +\fBint nc_put_vara_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const long long \fIout\fP[])\fR +.HP +\fBint nc_put_vara_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const unsigned long long \fIout\fP[])\fR +.HP +\fBint nc_put_vara_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const char * \fIout\fP[])\fR + + +.sp +Writes an array section of values into a netCDF variable of an open +netCDF dataset, which must be in data mode. The array section is specified +by the \fIstart\fP and \fIcount\fP vectors, which give the starting index +and count of values along each dimension of the specified variable. +The type of the data is +specified in the function name and is converted to the external type +of the specified variable, if possible, otherwise an \fBNC_ERANGE\fR +error is returned. +.HP +\fBint nc_get_vara_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], char \fIin\fP[])\fR +.HP +\fBint nc_get_vara_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_vara_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], signed char \fIin\fP[])\fR +.HP +\fBint nc_get_vara_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], short \fIin\fP[])\fR +.HP +\fBint nc_get_vara_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], int \fIin\fP[])\fR +.HP +\fBint nc_get_vara_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], long \fIin\fP[])\fR +.HP +\fBint nc_get_vara_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], float \fIin\fP[])\fR +.HP +\fBint nc_get_vara_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], double \fIin\fP[])\fR +.HP +\fBint nc_get_vara_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_vara_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned short \fIin\fP[])\fR +.HP +\fBint nc_get_vara_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned int \fIin\fP[])\fR +.HP +\fBint nc_get_vara_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], long long \fIin\fP[])\fR +.HP +\fBint nc_get_vara_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], unsigned long long \fIin\fP[])\fR +.HP +\fBint nc_get_vara_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], char * \fIin\fP[])\fR + + +.sp +Reads an array section of values from a netCDF variable of an open +netCDF dataset, which must be in data mode. The array section is specified +by the \fIstart\fP and \fIcount\fP vectors, which give the starting index +and count of values along each dimension of the specified variable. +The data is converted from the external type of the specified variable, +if necessary, to the type specified in the function name. If conversion is +not possible, an \fBNC_ERANGE\fR error is returned. +.SH "WRITING AND READING A SLICED ARRAY" +.LP +.HP +\fBint nc_put_vars_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const char \fIout\fP[])\fR +.HP +\fBint nc_put_vars_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_vars_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const signed char \fIout\fP[])\fR +.HP +\fBint nc_put_vars_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const short \fIout\fP[])\fR +.HP +\fBint nc_put_vars_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const int \fIout\fP[])\fR +.HP +\fBint nc_put_vars_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const long \fIout\fP[])\fR +.HP +\fBint nc_put_vars_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const float \fIout\fP[])\fR +.HP +\fBint nc_put_vars_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const double \fIout\fP[])\fR +.HP +\fBint nc_put_vars_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_vars_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned short \fIout\fP[])\fR +.HP +\fBint nc_put_vars_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned int \fIout\fP[])\fR +.HP +\fBint nc_put_vars_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const long long \fIout\fP[])\fR +.HP +\fBint nc_put_vars_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const unsigned long long \fIout\fP[])\fR +.HP +\fBint nc_put_vars_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], const char * \fIout\fP[])\fR + + +.sp +These functions are used for \fIstrided output\fP, which is like the +array section output described above, except that +the sampling stride (the interval between accessed values) is +specified for each dimension. +For an explanation of the sampling stride +vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.HP +\fBint nc_get_vars_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], char \fIin\fP[])\fR +.HP +\fBint nc_get_vars_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_vars_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], signed char \fIin\fP[])\fR +.HP +\fBint nc_get_vars_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], short \fIin\fP[])\fR +.HP +\fBint nc_get_vars_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], int \fIin\fP[])\fR +.HP +\fBint nc_get_vars_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], long \fIin\fP[])\fR +.HP +\fBint nc_get_vars_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], float \fIin\fP[])\fR +.HP +\fBint nc_get_vars_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], double \fIin\fP[])\fR +.HP +\fBint nc_get_vars_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_vars_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned short \fIin\fP[])\fR +.HP +\fBint nc_get_vars_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned int \fIin\fP[])\fR +.HP +\fBint nc_get_vars_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], long long \fIin\fP[])\fR +.HP +\fBint nc_get_vars_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], unsigned long long \fIin\fP[])\fR +.HP +\fBint nc_get_vars_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], char * \fIin\fP[])\fR + + +.sp +These functions are used for \fIstrided input\fP, which is like the +array section input described above, except that +the sampling stride (the interval between accessed values) is +specified for each dimension. +For an explanation of the sampling stride +vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.SH "WRITING AND READING A MAPPED ARRAY" +.LP +.HP +\fBint nc_put_varm_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const char \fIout\fP[])\fR +.HP +\fBint nc_put_varm_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_varm_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const signed char \fIout\fP[])\fR +.HP +\fBint nc_put_varm_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const short \fIout\fP[])\fR +.HP +\fBint nc_put_varm_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const int \fIout\fP[])\fR +.HP +\fBint nc_put_varm_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const long \fIout\fP[])\fR +.HP +\fBint nc_put_varm_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const float \fIout\fP[])\fR +.HP +\fBint nc_put_varm_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const double \fIout\fP[])\fR +.HP +\fBint nc_put_varm_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_varm_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned short \fIout\fP[])\fR +.HP +\fBint nc_put_varm_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned int \fIout\fP[])\fR +.HP +\fBint nc_put_varm_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const long long \fIout\fP[])\fR +.HP +\fBint nc_put_varm_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const unsigned long long \fIout\fP[])\fR +.HP +\fBint nc_put_varm_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, const char * \fIout\fP[])\fR + + +.sp +These functions are used for \fImapped output\fP, which is like +strided output described above, except that an additional index mapping +vector is provided to specify the in-memory arrangement of the data +values. +For an explanation of the index +mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.HP +\fBint nc_get_varm_text(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, char \fIin\fP[])\fR +.HP +\fBint nc_get_varm_uchar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_varm_schar(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, signed char \fIin\fP[])\fR +.HP +\fBint nc_get_varm_short(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, short \fIin\fP[])\fR +.HP +\fBint nc_get_varm_int(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, int \fIin\fP[])\fR +.HP +\fBint nc_get_varm_long(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, long \fIin\fP[])\fR +.HP +\fBint nc_get_varm_float(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, float \fIin\fP[])\fR +.HP +\fBint nc_get_varm_double(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, double \fIin\fP[])\fR +.HP +\fBint nc_get_varm_ubyte(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_varm_ushort(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned short \fIin\fP[])\fR +.HP +\fBint nc_get_varm_uint(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned int \fIin\fP[])\fR +.HP +\fBint nc_get_varm_int64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, long long \fIin\fP[])\fR +.HP +\fBint nc_get_varm_uint64(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, unsigned long long \fIin\fP[])\fR +.HP +\fBint nc_get_varm_string(int \fIncid\fP, int \fIvarid\fP, const size_t \fIstart\fP[], const size_t \fIcount\fP[], const size_t \fIstride\fP[], \fIimap\fP, char * \fIin\fP[])\fR + + +.sp +These functions are used for \fImapped input\fP, which is like +strided input described above, except that an additional index mapping +vector is provided to specify the in-memory arrangement of the data +values. +For an explanation of the index +mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.SH "ATTRIBUTES" +.LP +.HP +\fBint nc_put_att_text(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const char \fIout\fP[])\fR +.HP +\fBint nc_put_att_uchar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_att_schar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const signed char \fIout\fP[])\fR +.HP +\fBint nc_put_att_short(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const short \fIout\fP[])\fR +.HP +\fBint nc_put_att_int(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const int \fIout\fP[])\fR +.HP +\fBint nc_put_att_long(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const long \fIout\fP[])\fR +.HP +\fBint nc_put_att_float(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const float \fIout\fP[])\fR +.HP +\fBint nc_put_att_double(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const double \fIout\fP[])\fR +.HP +\fBint nc_put_att_ubyte(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned char \fIout\fP[])\fR +.HP +\fBint nc_put_att_ushort(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned short \fIout\fP[])\fR +.HP +\fBint nc_put_att_uint(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned int \fIout\fP[])\fR +.HP +\fBint nc_put_att_int64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const long long \fIout\fP[])\fR +.HP +\fBint nc_put_att_uint64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const unsigned long long \fIout\fP[])\fR +.HP +\fBint nc_put_att_string(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, const char * \fIout\fP[])\fR + + +.HP +\fBint nc_put_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type \fIxtype\fP, size_t \fIlen\fP, void * \fIip\fP)\fR +.HP +\fBint nc_get_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], void ** \fIip\fP)\fR +.sp +Unlike variables, attributes do not have +separate functions for defining and writing values. +This family of functions defines a new attribute with a value or changes +the value of an existing attribute. +If the attribute is new, or if the space required to +store the attribute value is greater than before, +the netCDF dataset must be in define mode. +The parameter \fIlen\fP is the number of values from \fIout\fP to transfer. +It is often one, except that for +\fBnc_put_att_text(\|)\fR it will usually be +\fBstrlen(\fIout\fP)\fR. +.sp +For these functions, the type component of the function name refers to +the in-memory type of the value, whereas the \fIxtype\fP argument refers to the +external type for storing the value. An \fBNC_ERANGE\fR +error results if +a conversion between these types is not possible. In this case the value +is represented with the appropriate fill-value for the associated +external type. +.HP +\fBint nc_inq_attname(int \fIncid\fP, int \fIvarid\fP, int \fIattnum\fP, char \fIname\fP[])\fR +.sp +Gets the +name of an attribute, given its variable ID and attribute number. +This function is useful in generic applications that +need to get the names of all the attributes associated with a variable, +since attributes are accessed by name rather than number in all other +attribute functions. The number of an attribute is more volatile than +the name, since it can change when other attributes of the same variable +are deleted. The attributes for each variable are numbered +from 0 (the first attribute) to +\fInvatts\fP-1, +where \fInvatts\fP is +the number of attributes for the variable, as returned from a call to +\fBnc_inq_varnatts(\|)\fR. +If the \fIname\fP parameter is a \fBNULL\fR pointer, no name will be +returned and no space need be allocated. +.HP +\fBint nc_inq_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type* \fIxtype\fP, size_t* \fIlen\fP)\fR +.HP +\fBint nc_inq_attid(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], int* \fIattnum\fP)\fR +.HP +\fBint nc_inq_atttype(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], nc_type* \fIxtype\fP)\fR +.HP +\fBint nc_inq_attlen(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], size_t* \fIlen\fP)\fR +.sp +These functions return information about a netCDF attribute, +given its variable ID and name. The information returned is the +external type in \fIxtype\fP +and the number of elements in the attribute as \fIlen\fP. +If any of the return arguments is a \fBNULL\fR pointer, +the specified information will not be returned. +.HP +\fBint nc_copy_att(int \fIncid\fP, int \fIvarid_in\fP, const char \fIname\fP[], int \fIncid_out\fP, int \fIvarid_out\fP)\fR +.sp +Copies an +attribute from one netCDF dataset to another. It can also be used to +copy an attribute from one variable to another within the same netCDF. +\fIncid_in\fP is the netCDF ID of an input netCDF dataset from which the +attribute will be copied. +\fIvarid_in\fP +is the ID of the variable in the input netCDF dataset from which the +attribute will be copied, or \fBNC_GLOBAL\fR +for a global attribute. +\fIname\fP +is the name of the attribute in the input netCDF dataset to be copied. +\fIncid_out\fP +is the netCDF ID of the output netCDF dataset to which the attribute will be +copied. +It is permissible for the input and output netCDF ID's to be the same. The +output netCDF dataset should be in define mode if the attribute to be +copied does not already exist for the target variable, or if it would +cause an existing target attribute to grow. +\fIvarid_out\fP +is the ID of the variable in the output netCDF dataset to which the attribute will +be copied, or \fBNC_GLOBAL\fR to copy to a global attribute. +.HP +\fBint nc_rename_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], const char \fInewname\fP[])\fR +.sp +Changes the +name of an attribute. If the new name is longer than the original name, +the netCDF must be in define mode. You cannot rename an attribute to +have the same name as another attribute of the same variable. +\fIname\fP is the original attribute name. +\fInewname\fP +is the new name to be assigned to the specified attribute. If the new name +is longer than the old name, the netCDF dataset must be in define mode. +.HP +\fBint nc_del_att(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[])\fR +.sp +Deletes an attribute from a netCDF dataset. The dataset must be in +define mode. +.HP +\fBint nc_get_att_text(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], char \fIin\fP[])\fR +.HP +\fBint nc_get_att_uchar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_att_schar(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], signed char \fIin\fP[])\fR +.HP +\fBint nc_get_att_short(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], short \fIin\fP[])\fR +.HP +\fBint nc_get_att_int(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], int \fIin\fP[])\fR +.HP +\fBint nc_get_att_long(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], long \fIin\fP[])\fR +.HP +\fBint nc_get_att_float(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], float \fIin\fP[])\fR +.HP +\fBint nc_get_att_double(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], double \fIin\fP[])\fR +.HP +\fBint nc_get_att_ubyte(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned char \fIin\fP[])\fR +.HP +\fBint nc_get_att_ushort(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned short \fIin\fP[])\fR +.HP +\fBint nc_get_att_uint(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned int \fIin\fP[])\fR +.HP +\fBint nc_get_att_int64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], long long \fIin\fP[])\fR +.HP +\fBint nc_get_att_uint64(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], unsigned long long \fIin\fP[])\fR +.HP +\fBint nc_get_att_string(int \fIncid\fP, int \fIvarid\fP, const char \fIname\fP[], char * \fIin\fP[])\fR + + +.sp +Gets the value(s) of a netCDF attribute, given its +variable ID and name. Converts from the external type to the type +specified in +the function name, if possible, otherwise returns an \fBNC_ERANGE\fR +error. +All elements of the vector of attribute +values are returned, so you must allocate enough space to hold +them. If you don't know how much space to reserve, call +\fBnc_inq_attlen(\|)\fR +first to find out the length of the attribute. +.SH "COMMON ARGUMENT DESCRIPTIONS" +.LP +In this section we define some common arguments which are used in the +"FUNCTION DESCRIPTIONS" section. +.TP +int \fIncid\fP +is the netCDF ID returned from a previous, successful call to +\fBnc_open(\|)\fR or \fBnc_create(\|)\fR +.TP +char \fIname\fP[] +is the name of a dimension, variable, or attribute. The names of +dimensions, variables and attributes consist of arbitrary +sequences of alphanumeric characters (as well as underscore '_', +period '.' and hyphen '-'), beginning with a letter or +underscore. (However names commencing with underscore are reserved for +system use.) Case is significant in netCDF names. A zero-length name +is not allowed. +As an input argument, +it shall be a pointer to a 0-terminated string; as an output argument, it +shall be the address of a buffer in which to hold such a string. +The maximum allowable number of characters +(excluding the terminating 0) is \fBNC_MAX_NAME\fR. +.TP +nc_type \fIxtype\fP +specifies the external data type of a netCDF variable or attribute and +is one of the following: +\fBNC_BYTE\fR, \fBNC_CHAR\fR, \fBNC_SHORT\fR, \fBNC_INT\fR, +\fBNC_FLOAT\fR, or \fBNC_DOUBLE\fR. +These are used to specify 8-bit integers, +characters, 16-bit integers, 32-bit integers, 32-bit IEEE floating point +numbers, and 64-bit IEEE floating-point numbers, respectively. +(\fBNC_INT\fR corresponds to \fBNC_LONG\fR in version 2, to specify a +32-bit integer). +.TP +int \fIdimids\fP[] +is a vector of dimension ID's and defines the shape of a netCDF variable. +The size of the vector shall be greater than or equal to the +rank (i.e. the number of dimensions) of the variable (\fIndims\fP). +The vector shall be ordered by the speed with which a dimension varies: +\fIdimids\fP[\fIndims\fP-1] +shall be the dimension ID of the most rapidly +varying dimension and +\fIdimids\fP[0] +shall be the dimension ID of the most slowly +varying dimension. +The maximum possible number of +dimensions for a variable is given by the symbolic constant +\fBNC_MAX_VAR_DIMS\fR. +.TP +int \fIdimid\fP +is the ID of a netCDF dimension. +netCDF dimension ID's are allocated sequentially from the +non-negative +integers beginning with 0. +.TP +int \fIndims\fP +is either the total number of dimensions in a netCDF dataset or the rank +(i.e. the number of dimensions) of a netCDF variable. +The value shall not be negative or greater than the symbolic constant +\fBNC_MAX_VAR_DIMS\fR. +.TP +int \fIvarid\fP +is the ID of a netCDF variable or (for the attribute-access functions) +the symbolic constant +\fBNC_GLOBAL\fR, +which is used to reference global attributes. +netCDF variable ID's are allocated sequentially from the +non-negative +integers beginning with 0. +.TP +int* \fInatts\fP +is the number of global attributes in a netCDF dataset for the +\fBnc_inquire(\|)\fR +function or the number +of attributes associated with a netCDF variable for the +\fBnc_varinq(\|)\fR +function. +.TP +const size_t \fIindex\fP[] +specifies the indicial coordinates of the netCDF data value to be accessed. +The indices start at 0; +thus, for example, the first data value of a +two-dimensional variable is (0,0). +The size of the vector shall be at least the rank of the associated +netCDF variable and its elements shall correspond, in order, to the +variable's dimensions. +.TP +const size_t \fIstart\fP[] +specifies the starting point +for accessing a netCDF variable's data values +in terms of the indicial coordinates of +the corner of the array section. +The indices start at 0; +thus, the first data +value of a variable is (0, 0, ..., 0). +The size of the vector shall be at least the rank of the associated +netCDF variable and its elements shall correspond, in order, to the +variable's dimensions. +.TP +const size_t \fIcount\fP[] +specifies the number of indices selected along each dimension of the +array section. +Thus, to access a single value, for example, specify \fIcount\fP as +(1, 1, ..., 1). +Note that, for strided I/O, this argument must be adjusted +to be compatible with the \fIstride\fP and \fIstart\fP arguments so that +the interaction of the +three does not attempt to access an invalid data co-ordinate. +The elements of the +\fIcount\fP vector correspond, in order, to the variable's dimensions. +.TP +const size_t \fIstride\fP[] +specifies the sampling interval along each dimension of the netCDF +variable. The elements of the stride vector correspond, in order, +to the netCDF variable's dimensions (\fIstride\fP[0]) +gives the sampling interval along the most slowly +varying dimension of the netCDF variable). Sampling intervals are +specified in type-independent units of elements (a value of 1 selects +consecutive elements of the netCDF variable along the corresponding +dimension, a value of 2 selects every other element, etc.). +A \fBNULL\fR stride argument is treated as (1, 1, ... , 1). +.TP +\fIimap\fP +specifies the mapping between the dimensions of a netCDF variable and +the in-memory structure of the internal data array. The elements of +the index mapping vector correspond, in order, to the netCDF variable's +dimensions (\fIimap\fP[0] gives the distance +between elements of the internal array corresponding to the most +slowly varying dimension of the netCDF variable). +Distances between elements are specified in type-independent units of +elements (the distance between internal elements that occupy adjacent +memory locations is 1 and not the element's byte-length as in netCDF 2). +A \fBNULL\fR pointer means the memory-resident values have +the same structure as the associated netCDF variable. +.SH "VARIABLE PREFILLING" +.LP +By default, the netCDF interface sets the values of +all newly-defined variables of finite length (i.e. those that do not have +an unlimited, dimension) to the type-dependent fill-value associated with each +variable. This is done when \fBnc_enddef(\|)\fR +is called. The +fill-value for a variable may be changed from the default value by +defining the attribute `\fB_FillValue\fR' for the variable. This +attribute must have the same type as the variable and be of length one. +.LP +Variables with an unlimited dimension are also prefilled, but on +an `as needed' basis. For example, if the first write of such a +variable is to position 5, then +positions +0 through 4 +(and no others) +would be set to the fill-value at the same time. +.LP +This default prefilling of data values may be disabled by +or'ing the +\fBNC_NOFILL\fR +flag into the mode parameter of \fBnc_open(\|)\fR or \fBnc_create(\|)\fR, +or, by calling the function \fBnc_set_fill(\|)\fR +with the argument \fBNC_NOFILL\fR. +For variables that do not use the unlimited dimension, +this call must +be made before +\fBnc_enddef(\|)\fR. +For variables that +use the unlimited dimension, this call +may be made at any time. +.LP +One can obtain increased performance of the netCDF interface by using +this feature, but only at the expense of requiring the application to set +every single data value. The performance +enhancing behavior of this function is dependent on the particulars of +the implementation and dataset format. +The flag value controlled by \fBnc_set_fill(\|)\fR +is per netCDF ID, +not per variable or per write. +Allowing this to change affects the degree to which +a program can be effectively parallelized. +Given all of this, we state that the use +of this feature may not be available (or even needed) in future +releases. Programmers are cautioned against heavy reliance upon this +feature. +.HP +\fBint nc_setfill(int \fIncid\fP, int \fIfillmode\fP, int* \fIold_fillemode\fP)\fR +.sp +(Corresponds to \fBncsetfill(\|)\fR in version 2) +.sp +Determines whether or not variable prefilling will be done (see +above). +The netCDF dataset shall be writable. +\fIfillmode\fP is either \fBNC_FILL\fR +to enable prefilling (the +default) or \fBNC_NOFILL\fR +to disable prefilling. +This function returns the previous setting in \fIold_fillmode\fP. + +.HP +.SH "MPP FUNCTION DESCRIPTIONS" +.LP +Additional functions for use on SGI/Cray MPP machines (_CRAYMPP). +These are used to set and inquire which PE is the base for MPP +for a particular netCDF. These are only relevant when +using the SGI/Cray ``global'' +Flexible File I/O layer and desire to have +only a subset of PEs to open the specific netCDF file. +For technical reasons, these functions are available on all platforms. +On a platform other than SGI/Cray MPP, it is as if +only processor available were processor 0. +.LP +To use this feature, you need to specify a communicator group and call +\fBglio_group_mpi(\|)\fR or \fBglio_group_shmem(\|)\fR prior to the netCDF +\fBnc_open(\|)\fR and \fBnc_create(\|)\fR calls. +.HP +\fBint nc__create_mp(const char \fIpath\fP[], int \fIcmode\fP, size_t \fIinitialsize\fP, int \fIpe\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR +.sp +Like \fBnc__create(\|)\fR but allows the base PE to be set. +.sp +The argument \fIpe\fP sets the base PE at creation time. In the MPP +environment, \fBnc__create(\|)\fR and \fBnc_create(\|)\fR set the base PE to processor +zero by default. +.HP +\fBint nc__open_mp(const char \fIpath\fP[], int \fImode\fP, int \fIpe\fP, size_t* \fIchunksize\fP, int* \fIncid\fP)\fR +.sp +Like \fBnc__open(\|)\fR but allows the base PE to be set. +The argument \fIpe\fP sets the base PE at creation time. In the MPP +environment, \fBnc__open(\|)\fR and \fBnc_open(\|)\fR set the base PE to processor +zero by default. +.HP +\fBint nc_inq_base_pe(int \fIncid\fP, int* \fIpe\fP)\fR +.sp +Inquires of the netCDF dataset which PE is being used as the base for MPP use. +This is safe to use at any time. +.HP +\fBint nc_set_base_pe(int \fIncid\fP, int \fIpe\fP)\fR +.sp +Resets the base PE for the netCDF dataset. +Only perform this operation when the affected communicator group +synchronizes before and after the call. +This operation is very risky and should only be contemplated +under only the most extreme cases. +.SH "ENVIRONMENT VARIABLES" +.TP 4 +.B NETCDF_FFIOSPEC +Specifies the Flexible File I/O buffers for netCDF I/O when executing +under the UNICOS operating system (the variable is ignored on other +operating systems). +An appropriate specification can greatly increase the efficiency of +netCDF I/O -- to the extent that it can actually surpass FORTRAN binary +I/O. +This environment variable has been made a little more generalized, +such that other FFIO option specifications can now be added. +The default specification is \fBbufa:336:2\fP, +unless a current FFIO specification is in operation, +which will be honored. +See UNICOS Flexible File I/O for more information. +.SH "MAILING-LISTS" +.LP +Both a mailing list and a digest are available for +discussion of the netCDF interface and announcements about netCDF bugs, +fixes, and enhancements. +To begin or change your subscription to either the mailing-list or the +digest, send one of the following in the body (not +the subject line) of an email message to "majordomo@unidata.ucar.edu". +Use your email address in place of \fIjdoe@host.inst.domain\fP. +.sp +To subscribe to the netCDF mailing list: +.RS +\fBsubscribe netcdfgroup \fIjdoe@host.inst.domain\fR +.RE +To unsubscribe from the netCDF mailing list: +.RS +\fBunsubscribe netcdfgroup \fIjdoe@host.inst.domain\fR +.RE +To subscribe to the netCDF digest: +.RS +\fBsubscribe netcdfdigest \fIjdoe@host.inst.domain\fR +.RE +To unsubscribe from the netCDF digest: +.RS +\fBunsubscribe netcdfdigest \fIjdoe@host.inst.domain\fR +.RE +To retrieve the general introductory information for the mailing list: +.RS +\fBinfo netcdfgroup\fR +.RE +To get a synopsis of other majordomo commands: +.RS +\fBhelp\fR +.RE +.SH "SEE ALSO" +.LP +.BR ncdump (1), +.BR ncgen (1), +.BR netcdf (3). +.LP +\fInetCDF User's Guide\fP, published +by the Unidata Program Center, University Corporation for Atmospheric +Research, located in Boulder, Colorado. + +NetCDF home page at http:/www.unidata.ucar.edu/netcdf. diff --git a/privatemodules/nc4/share/man/man3/netcdf_fortran.3 b/privatemodules/nc4/share/man/man3/netcdf_fortran.3 new file mode 100644 index 0000000000000000000000000000000000000000..b420e4c4770bc82b65d84e152dce52168f156ae9 --- /dev/null +++ b/privatemodules/nc4/share/man/man3/netcdf_fortran.3 @@ -0,0 +1,1370 @@ +.nr yr \n(yr+1900 +.af mo 01 +.af dy 01 +.TH NETCDF 3 "1997-04-18" "Printed: \n(yr-\n(mo-\n(dy" "UNIDATA LIBRARY FUNCTIONS" +.SH NAME +netcdf \- Unidata's Network Common Data Form (netCDF) library interface +.SH SYNOPSIS +.ft B +.na +.nh +include netcdf.inc +.sp +.SS Most Systems: +f77 ... \-lnetcdf \-lhdf5_hl \-lhdf5 \-lz \-lm +.sp +.SS CRAY PVP Systems: +f90 \-dp \-i64 ... \-lnetcdf + +.ad +.hy +Complete documentation for the netCDF libraries can be found at the netCDF website: http://www.unidata.ucar.edu/software/netcdf/. +.sp +.SH "LIBRARY VERSION" +.LP +This document describes versions 3 and 4 +of Unidata netCDF data-access interface +for the FORTRAN programming language. +.HP +\fBcharacter*80 nf_inq_libvers(void)\fR +.sp +Returns a string identifying the version of the netCDF library, and +when it was built, like: "3.1a of Aug 22 1996 12:57:47 $". +.LP +The RCS \fBident(1)\fP command will find a string like +"$\|Id: @\|(#) netcdf library version 3.1a of Sep 6 1996 15:56:26 $" +in the library. The SCCS \fBwhat(1)\fP command will find a string like +"netcdf library version 3.1a of Aug 23 1996 16:07:40 $". +.SH "RETURN VALUES" +.LP +All netCDF functions (except +\fBnf_inq_libvers(\|)\fR and \fBnf_strerror(\|)\fR) return an integer status. + +If this returned status value is not equal to +\fBNF_NOERR\fR (zero), it +indicates that an error occurred. The possible status values are defined in +netcdf.inc. +.HP +\fBcharacter*80 nf_strerror(integer \fIstatus\fP)\fR +.sp +Returns a string textual translation of the \fIstatus\fP +value, like "Attribute or variable name contains illegal characters" +or "No such file or directory". +.sp +.SH "FILE OPERATIONS" +.LP +.HP +\fBinteger function nf_create(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIncid\fP)\fR +.sp +Creates a new netCDF dataset at \fIpath\fP, +returning a netCDF ID in \fIncid\fP. +The argument \fIcmode\fP may include the bitwise-or +of the following flags: +\fBNF_NOCLOBBER\fR +to protect existing datasets (default +silently blows them away), +\fBNF_SHARE\fR +for synchronous dataset updates for classic format files +(default is to buffer accesses), +.sp +When a netCDF dataset is created, is is opened +\fBNF_WRITE\fR. +The new netCDF dataset is in define mode. +\fBNF_64BIT_OFFSET\fR. +to create a file in the 64-bit offset format +(as opposed to classic format, the default). +\fBNF_TRUE\fR to create a netCDF-4/HDF5 file, +and \fBNF_CLASSIC_MODEL\fR to guarantee that netCDF-4/HDF5 files maintain compatibility +with the netCDF classic data model. +.HP +\fBinteger function nf__create(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIinitialsize\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR +.sp +Like \fBnf_create(\|)\fR but has additional performance tuning parameters. +.sp +The argument \fIinitialsize\fP sets the initial size of the file at +creation time. +.sp +See \fBnf__open(\|)\fR below for an explanation of the \fIchunksize\fP +parameter. +.HP +\fBinteger function nf_open(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIncid\fP)\fR +.sp +(Corresponds to \fBncopn(\|)\fR in version 2) +.sp +Opens a existing netCDF dataset at \fIpath\fP +returning a netCDF ID +in \fIncid\fP. +The type of access is described by the \fImode\fP parameter, +which may include the bitwise-or +of the following flags: +\fBNF_WRITE\fR +for read-write access (default +read-only), +\fBNF_SHARE\fR +for synchronous dataset updates (default is +to buffer accesses), and +\fBNF_LOCK\fR +(not yet implemented). +.sp +As of NetCDF version 4.1, and if TRUE support was enabled +when the NetCDF library was built, the path parameter +may specify a TRUE URL. In this case, the access mode is +forced to be read-only. +.HP +\fBinteger function nf__open(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR +.sp +Like \fBnf_open(\|)\fR but has an additional performance tuning parameter. +.sp +The argument referenced by \fIchunksize\fP controls a space versus time +tradeoff, memory allocated in the netcdf library versus number of system +calls. +Because of internal requirements, the value may not be set to exactly +the value requested. +The actual value chosen is returned by reference. +Using the value \fBNF_SIZEHINT_DEFAULT\fR causes the library to choose a +default. +How the system choses the default depends on the system. +On many systems, the "preferred I/O block size" is available from the +\fBstat()\fR system call, \fBstruct stat\fR member \fBst_blksize\fR. +If this is available it is used. Lacking that, twice the system pagesize +is used. +Lacking a call to discover the system pagesize, we just set default +chunksize to 8192. +.sp +The chunksize is a property of a given open netcdf descriptor +\fIncid\fP, it is not a persistent property of the netcdf dataset. +.sp +As with \fBnf__open(\|)\fR, the path parameter +may specify a TRUE URL, but the tuning parameters are ignored. +.HP +\fBinteger function nf_redef(integer \fIncid\fP)\fR +.sp +(Corresponds to \fBncredf(\|)\fR in version 2) +.sp +Puts an open netCDF dataset into define mode, +so dimensions, variables, and attributes can be added or renamed and +attributes can be deleted. +.HP +\fBinteger function nf_enddef(integer \fIncid\fP)\fR +.sp +(Corresponds to \fBncendf(\|)\fR in version 2) +.sp +Takes an open netCDF dataset out of define mode. +The changes made to the netCDF dataset +while it was in define mode are checked and committed to disk if no +problems occurred. Some data values may be written as well, +see "VARIABLE PREFILLING" below. +After a successful call, variable data can be read or written to the dataset. +.HP +\fBinteger function nf__enddef(integer \fIncid\fP, integer \fIh_minfree\fP, integer \fIv_align\fP, integer \fIv_minfree\fP, integer \fIr_align\fP)\fR +.sp +Like \fBnf_enddef(\|)\fR but has additional performance tuning parameters. +.sp +Caution: this function exposes internals of the netcdf version 1 file +format. +It may not be available on future netcdf implementations. +.sp +The current netcdf file format has three sections, +the "header" section, the data section for fixed size variables, and +the data section for variables which have an unlimited dimension (record +variables). +The header begins at the beginning of the file. The index +(offset) of the beginning of the other two sections is contained in the +header. Typically, there is no space between the sections. This causes +copying overhead to accrue if one wishes to change the size of the +sections, +as may happen when changing names of things, text attribute values, +adding +attributes or adding variables. Also, for buffered i/o, there may be +advantages +to aligning sections in certain ways. +.sp +The minfree parameters allow one to control costs of future calls +to \fBnf_redef(\|)\fR, \fBnf_enddef(\|)\fR by requesting that \fIminfree\fP bytes be +available at the end of the section. +The \fIh_minfree\fP parameter sets the pad +at the end of the "header" section. The \fIv_minfree\fP parameter sets +the pad at the end of the data section for fixed size variables. +.sp +The align parameters allow one to set the alignment of the beginning of +the corresponding sections. The beginning of the section is rounded up +to an index which is a multiple of the align parameter. The flag value +\fBNF_ALIGN_CHUNK\fR tells the library to use the chunksize (see above) +as the align parameter. +The \fIv_align\fP parameter controls the alignment of the beginning of +the data section for fixed size variables. +The \fIr_align\fP parameter controls the alignment of the beginning of +the data section for variables which have an unlimited dimension (record +variables). +.sp +The file format requires mod 4 alignment, so the align parameters +are silently rounded up to multiples of 4. The usual call, +\fBnf_enddef(\fIncid\fP)\fR +is equivalent to +\fBnf__enddef(\fIncid\fP, 0, 4, 0, 4)\fR. +.sp +The file format does not contain a "record size" value, this is +calculated from the sizes of the record variables. This unfortunate fact +prevents us from providing minfree and alignment control of the +"records" +in a netcdf file. If you add a variable which has an unlimited +dimension, +the third section will always be copied with the new variable added. +.HP +\fBinteger function nf_sync(integer \fIncid\fP)\fR +.sp +(Corresponds to \fBncsnc(\|)\fR in version 2) +.sp +Unless the +\fBNF_SHARE\fR +bit is set in +\fBnf_open(\|)\fR or \fBnf_create(\|)\fR, +accesses to the underlying netCDF dataset are +buffered by the library. This function synchronizes the state of +the underlying dataset and the library. +This is done automatically by +\fBnf_close(\|)\fR and \fBnf_enddef(\|)\fR. +.HP +\fBinteger function nf_abort(integer \fIncid\fP)\fR +.sp +(Corresponds to \fBncabor(\|)\fR in version 2) +.sp +You don't need to call this function. +This function is called automatically by +\fBnf_close(\|)\fR +if the netCDF was in define mode and something goes wrong with the commit. +If the netCDF dataset isn't in define mode, then this function is equivalent to +\fBnf_close(\|)\fR. +If it is called after +\fBnf_redef(\|)\fR, +but before +\fBnf_enddef(\|)\fR, +the new definitions are not committed and the dataset is closed. +If it is called after +\fBnf_create(\|)\fR +but before +\fBnf_enddef(\|)\fR, +the dataset disappears. +.HP +\fBinteger function nf_close(integer \fIncid\fP)\fR +.sp +(Corresponds to +\fBncclos(\|)\fR in version 2) +.sp +Closes an open netCDF dataset. +If the dataset is in define mode, +\fBnf_enddef(\|)\fR +will be called before closing. +After a dataset is closed, its ID may be reassigned to another dataset. +.HP +\fBinteger function nf_inq(integer \fIncid\fP, integer \fIndims\fP, integer \fInvars\fP, +integer \fInatts\fP, integer \fIunlimdimid\fP)\fR +.HP +\fBinteger function nf_inq_ndims(integer \fIncid\fP, integer \fIndims\fP)\fR +.HP +\fBinteger function nf_inq_nvars(integer \fIncid\fP, integer \fInvars\fP)\fR +.HP +\fBinteger function nf_inq_natts(integer \fIncid\fP, integer \fInatts\fP)\fR +.HP +\fBinteger function nf_inq_unlimdim(integer \fIncid\fP, integer \fIunlimdimid\fP)\fR +.HP +\fBinteger function nf_inq_format(integer \fIncid\fP, integer \fIformatn\fP)\fR +.sp +Use these functions to find out what is in a netCDF dataset. +Upon successful return, +\fIndims\fP will contain the +number of dimensions defined for this netCDF dataset, +\fInvars\fP will contain the number of variables, +\fInatts\fP will contain the number of attributes, and +\fIunlimdimid\fP will contain the +dimension ID of the unlimited dimension if one exists, or +0 otherwise. +\fIformatn\fP will contain the version number of the dataset <format>, one of +\fBNF_FORMAT_CLASSIC\fR, \fBNF_FORMAT_64BIT\fR, \fBNF_FORMAT_NETCDF4\fR, or +\fBNF_FORMAT_NETCDF4_CLASSIC\fR. + +.HP +\fBinteger function nf_def_dim(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIlen\fP, integer \fIdimid\fP)\fR +.sp +(Corresponds to \fBncddef(\|)\fR in version 2) +.sp +Adds a new dimension to an open netCDF dataset, which must be +in define mode. +\fIname\fP is the dimension name. +\fIdimid\fP will contain the dimension ID of the newly created dimension. + +.SH "USER DEFINED TYPES" +.LP +Users many define types for a netCDF-4/HDF5 file (unless the +\fBNF_CLASSIC_MODEL\fR was used when the file was creates). Users may +define compound types, variable length arrays, enumeration types, and +opaque types. +.sp + +.HP +\fBinteger function nf_def_compound(integer \fIncid\fP, integer \fIsize\fP, character*(*) \fIname\fP, integer \fItypeidp\fP)\fR +.sp +Define a compound type. +.HP +\fBinteger function nf_insert_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIoffset\fP, integer \fIfield_typeid\fP)\fR +.sp +Insert an element into a compound type. May not be done after type has been used, or after the type has been written by an enddef. +.HP +\fBinteger function nf_insert_array_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIoffset\fP, integer \fIfield_typeid\fP, integer \fIndims\fP, integer \fIdim_sizes\fP(1))\fR +.sp +Insert an array into a compound type. +.HP +\fBinteger function nf_inq_type(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIsizep\fP)\fR +.sp +Learn about a type. +.HP +\fBinteger function nf_inq_compound(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIsizep\fP, integer \fInfieldsp\fP)\fR +.HP +\fBinteger function nf_inq_compound_name(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP)\fR +.HP +\fBinteger function nf_inq_compound_size(integer \fIncid\fP, integer \fI\fP, integer \fIsizep\fP)\fR +.HP +\fBinteger function nf_inq_compound_nfields(integer \fIncid\fP, integer \fI\fP, integer \fInfieldsp\fP)\fR +.HP +\fBinteger function nf_inq_compound_fieldname(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, character*(*) \fIname\fP)\fR +.HP +\fBinteger function nf_inq_compound_fieldindex(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIfieldidp\fP)\fR +.HP +\fBinteger function nf_inq_compound_fieldoffset(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIoffsetp\fP)\fR +.HP +\fBinteger function nf_inq_compound_fieldtype(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIfield_typeid\fP)\fR +.HP +\fBinteger function nf_inq_compound_fieldndims(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIndims\fP)\fR +.HP +\fBinteger function nf_inq_compound_fielddim_sizes(integer \fIncid\fP, integer \fI\fP, integer \fIfieldid\fP, integer \fIdim_sizes\fP(1))\fR +.sp +Learn about a compound type. +.HP +\fBinteger function nf_def_vlen(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIbase_typeid\fP, integer \fIxtypep\fP)\fR +.sp +Create a varaible length array type. +.HP +\fBinteger function nf_inq_vlen(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fIdatum_sizep\fP, integer \fIbase_nc_typep\fP)\fR +.sp +Learn about a varaible length array type. +.HP +\fBinteger function nf_free_vlen(nc_vlen_t *vl)\fR +.sp +Free memory comsumed by reading data of a varaible length array type. +.HP +\fBinteger function nf_put_vlen_element(integer \fIncid\fP, integer \fI\fP, void * \fIvlen_element\fP, integer \fIlen\fP, void * \fIdata\fP)\fR +.sp +Write one VLEN. +.HP +\fBinteger function nf_get_vlen_element(integer \fIncid\fP, integer \fI\fP, void * \fIvlen_element\fP, integer \fIlen\fP, void * \fIdata\fP)\fR +.sp +Read one VLEN. +.HP +\fBinteger function nf_free_string(integer \fIlen\fP, char **data)\fR +.sp +Free memory comsumed by reading data of a string type. +.HP +\fBinteger function nf_inq_user_type(integer \fIncid\fP, integer \fI\fP, character*(*) \fIname\fP, integer \fI\fP, integer \fI\fP, integer \fI\fP, integer \fI\fP)\fR +.sp +Learn about a user define type. +.HP +\fBinteger function nf_def_enum(integer \fIncid\fP, integer \fIbase_typeid\fP, character*(*) \fIname\fP, integer \fItypeidp\fP)\fR +.sp +Define an enumeration type. +.HP +\fBinteger function nf_insert_enum(integer \fIncid\fP, integer \fIbase_typeid\fP, character*(*) \fIname\fP, const void *value)\fR +.sp +Insert a name-value pair into enumeration type. +.HP +\fBinteger function nf_inq_enum_member(integer \fIncid\fP, integer \fIxtype\fP, integer \fIidx\fP, character*(*) \fIname\fP, void *value)\fR +.HP +\fBinteger function nf_inq_enum_ident(integer \fIncid\fP, integer \fIxtype\fP, integer \fIidx\fP, integer*8 \fIvalue\fP, character*(*) \fIidentifier\fP)\fR +.sp +Learn about a name-value pair into enumeration type. +.HP +\fBinteger function nf_def_opaque(integer \fIncid\fP, integer \fIsize\fP, character*(*) \fIname\fP, integer \fIxtypep\fP)\fR +.sp +Create an opaque type. +.HP +\fBinteger function nf_inq_opaque(integer \fIncid\fP, integer \fIxtype\fP, character*(*) \fIname\fP, integer \fIsizep\fP)\fR +.sp +Learn about opaque type. +.HP +.SH "GROUPS" +.sp +Users may organize data into hierarchical groups in netCDF-4/HDF5 files (unless \fBNF_CLASSIC_MODEL\fR was used when creating the file). +.HP +\fBinteger function nf_inq_grps(integer \fIncid\fP, integer \fInumgrps\fP, integer \fIncids\fP(1))\fR +.sp +Learn how many groups (and their ncids) are available from the group represented by ncid. +.HP +\fBinteger function nf_inq_grpname(integer \fIncid\fP, character*(*) \fIname\fP)\fR +.HP +\fBinteger function nf_inq_grpname_full(integer \fIncid\fP, integer \fIlen\fP, character*(*) \fIname\fP)\fR +.HP +\fBinteger function nf_inq_grpname_len(integer \fIncid\fP, integer \fIlen\fP)\fR +.HP +\fBinteger function nf_inq_grp_parent(integer \fIncid\fP, integer \fIncid\fP)\fR +.HP +\fBinteger function nf_inq_grp_ncid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR +.HP +\fBinteger function nf_inq_full_ncid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR +.sp +Learn about a group. +.HP +\fBinteger function nf_inq_varids(integer \fIncid\fP, integer \fInvars\fP, integer \fI\fP)\fR +.sp +Get the varids in a group. +.HP +\fBinteger function nf_inq_dimids(integer \fIncid\fP, integer \fIndims\fP, integer \fIdimids\fP, integer \fIinclude_parents\fP)\fR +.sp +Get the dimids in a group and (potentially) its parents. +.HP +\fBinteger function nf_inq_typeids(integer \fIncid\fP, integer \fIntypes\fP, integer \fItypeids\fP(1))\fR +.sp +Get the typeids of user-defined types in a group. +.HP +\fBinteger function nf_def_grp(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIncid\fP)\fR +.sp +Create a group. +.LP + +.SH "DIMENSIONS" +.LP +.HP +\fBinteger function nf_inq_dimid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIdimid\fP)\fR +.sp +(Corresponds to \fBncdid(\|)\fR in version 2) +.sp +Given a dimension name, returns the ID of a netCDF dimension in \fIdimid\fP. +.HP +\fBinteger function nf_inq_dim(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP, integer \fIlen\fP)\fR +.HP +\fBinteger function nf_inq_dimname(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP)\fR +.HP +\fBinteger function nf_inq_dimlen(integer \fIncid\fP, integer \fIdimid\fP, integer \fIlen\fP)\fR +.sp +Use these functions to find out about a dimension. + +\fIname\fP should be big enough (\fBNF_MAX_NAME\fR) +to hold the dimension name as the name will be copied into your storage. +The length return parameter, \fIlen\fP +will contain the size of the dimension. +For the unlimited dimension, the returned length is the current +maximum value used for writing into any of the variables which use +the dimension. +.HP +\fBinteger function nf_rename_dim(integer \fIncid\fP, integer \fIdimid\fP, character*(*) \fIname\fP)\fR +.sp +(Corresponds to \fBncdren(\|)\fR in version 2) +.sp +Renames an existing dimension in an open netCDF dataset. +If the new name is longer than the old name, the netCDF dataset must be in +define mode. +You cannot rename a dimension to have the same name as another dimension. +.SH "VARIABLES" +.LP +.HP +\fBinteger function nf_def_var(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIndims\fP, integer \fIdimids\fP(1), integer \fIvarid\fP)\fR +.sp +(Corresponds to \fBncvdef(\|)\fR in version 2) +.sp +Adds a new variable to a netCDF dataset. The netCDF must be in define mode. +\fIvarid\fP will be set to the netCDF variable ID. +.HP +\fBinteger function nf_inq_varid(integer \fIncid\fP, character*(*) \fIname\fP, integer \fIvarid\fP)\fR +.sp +(Corresponds to \fBncvid(\|)\fR in version 2) +.sp +Returns the ID of a netCDF variable in \fIvarid\fP given its name. +.HP +\fBinteger function nf_inq_var(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIndims\fP, integer \fIdimids\fP(1), +integer \fInatts\fP)\fR +.HP +\fBinteger function nf_inq_varname(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR +.HP +\fBinteger function nf_inq_vartype(integer \fIncid\fP, integer \fIvarid\fP, integer \fIxtype\fP)\fR +.HP +\fBinteger function nf_inq_varndims(integer \fIncid\fP, integer \fIvarid\fP, integer \fIndims\fP)\fR +.HP +\fBinteger function nf_inq_vardimid(integer \fIncid\fP, integer \fIvarid\fP, integer \fIdimids\fP(1))\fR +.HP +\fBinteger function nf_inq_varnatts(integer \fIncid\fP, integer \fIvarid\fP, integer \fInatts\fP)\fR +.sp +Returns information about a netCDF variable, given its ID. + +.HP +\fBinteger function nf_rename_var(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR +.sp +(Corresponds to \fBncvren(\|)\fR in version 2) +.sp +Changes the name of a netCDF variable. +If the new name is longer than the old name, the netCDF must be in define mode. +You cannot rename a variable to have the name of any existing variable. + +.SH "VARIABLES \fIin\fP NETCDF-4 FILES" +.LP +The following functions may only be used on variables in a +netCDF-4/HDF5 data file. These functions must be called after the +variable is defined, but before an enddef call. +.sp +\fBinteger function nf_def_var_deflate(integer \fIncid\fP, integer \fIvarid\fP, integer \fIshuffle\fP, integer \fIdeflate\fP, integer \fIdeflate_level\fP)\fR +.sp +Turn on compression and/or shuffle filter. (Shuffle filter is only useful for integer data.) +.HP +\fBinteger function nf_inq_var_deflate(integer \fIncid\fP, integer \fIvarid\fP, integer \fIshufflep\fP, integer \fIdeflatep\fP, integer \fIdeflate_levelp\fP)\fR +.sp +Learn about a variable's deflate settings. +.HP +\fBinteger function nf_def_var_fletcher32(integer \fIncid\fP, integer \fIvarid\fP, integer \fIfletcher32\fP)\fR +.sp +Turn on checksumming for a variable. +.HP +\fBinteger function nf_inq_var_fletcher32(integer \fIncid\fP, integer \fIvarid\fP, integer \fIfletcher32\fP)\fR +.sp +Learn about checksumming for a variable. +.HP +\fBinteger function nf_def_var_chunking(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstorage\fP, integer \fIchunksizesp\fP(1))\fR +.sp +Set chunksizes for a variable. +.HP +\fBinteger function nf_inq_var_chunking(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstoragep\fP, integer \fIchunksizesp\fP(1))\fR +.sp +Learn about chunksizes for a variable. +.HP +\fBinteger function nf_def_var_fill(integer \fIncid\fP, integer \fIvarid\fP, integer \fIno_fill\fP, integer \fIchunksizesp\fP(1))\fR +.sp +Set a fill value for a variable. +.HP +\fBinteger function nf_inq_var_fill(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstoragep\fP, integer \fIchunksizesp\fP(1))\fR +.sp +Learn the fill value for a variable. +.HP +\fBinteger function nf_def_var_endian(integer \fIncid\fP, integer \fIvarid\fP, integer \fIendian\fP)\fR +.sp +Set endianness of variable. +.HP +\fBinteger function nf_inq_var_endian(integer \fIncid\fP, integer \fIvarid\fP, integer \fIendianp\fP)\fR +.sp +Learn the endianness of a variable. +.HP + +.SH "WRITING AND READING WHOLE VARIABLES" +.LP +.HP +\fBinteger function nf_put_var_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIout\fP)\fR + +.HP +\fBinteger function nf_put_var_int1(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_int2(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIout\fP(1))\fR + +.HP +\fBinteger function nf_put_var_real(integer \fIncid\fP, integer \fIvarid\fP, real \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_double(integer \fIncid\fP, integer \fIvarid\fP, doubleprecision \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_uint(integer \fIncid\fP, integer \fIvarid\fP, integer*4 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_var_string(integer \fIncid\fP, integer \fIvarid\fP, character* \fIout\fP(1))\fR + + +.sp +Writes an entire netCDF variable (i.e. all the values). The netCDF +dataset must be open and in data mode. The type of the data is +specified in the function name, and it is converted to the external +type of the specified variable, if possible, otherwise an +\fBNF_ERANGE\fR error is returned. Note that rounding is not performed +during the conversion. Floating point numbers are truncated when +converted to integers. +.HP +\fBinteger function nf_get_var_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIin\fP)\fR + +.HP +\fBinteger function nf_get_var_int1(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_int2(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIin\fP(1))\fR + +.HP +\fBinteger function nf_get_var_real(integer \fIncid\fP, integer \fIvarid\fP, real \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_double(integer \fIncid\fP, integer \fIvarid\fP, doubleprecision \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_uint(integer \fIncid\fP, integer \fIvarid\fP, integer*4 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_var_string(integer \fIncid\fP, integer \fIvarid\fP, character* \fIin\fP(1))\fR + + +.sp +Reads an entire netCDF variable (i.e. all the values). +The netCDF dataset must be open and in data mode. +The data is converted from the external type of the specified variable, +if necessary, to the type specified in the function name. If conversion is +not possible, an \fBNF_ERANGE\fR error is returned. +.SH "WRITING AND READING ONE DATUM" +.LP +.HP +\fBinteger function nf_put_var1_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character*1 \fI*out\fP)\fR + +.HP +\fBinteger function nf_put_var1_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer \fI*out\fP)\fR + +.HP +\fBinteger function nf_put_var1_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), real \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), doubleprecision \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*4 \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fI*out\fP)\fR +.HP +\fBinteger function nf_put_var1_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character* \fI*out\fP)\fR + + +.sp +Puts a single data value into a variable at the position \fIindex\fP of an +open netCDF dataset that is in data mode. The type of the data is +specified in the function name, and it is converted to the external type +of the specified variable, if possible, otherwise an \fBNF_ERANGE\fR +error is returned. +.HP +\fBinteger function nf_get_var1_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character*1 \fIin\fP)\fR + +.HP +\fBinteger function nf_get_var1_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer \fIin\fP)\fR + +.HP +\fBinteger function nf_get_var1_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), real \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), doubleprecision \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*1 \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*2 \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*4 \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), integer*8 \fIin\fP)\fR +.HP +\fBinteger function nf_get_var1_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIindex\fP(1), character* \fIin\fP)\fR + + +.sp +Gets a single data value from a variable at the position \fIindex\fP +of an open netCDF dataset that is in data mode. +The data is converted from the external type of the specified variable, +if necessary, to the type specified in the function name. If conversion is +not possible, an \fBNF_ERANGE\fR error is returned. +.SH "WRITING AND READING AN ARRAY" +.LP +.HP +\fBinteger function nf_put_vara_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character*(*) \fIout\fP)\fR + +.HP +\fBinteger function nf_put_vara_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIout\fP(1))\fR + +.HP +\fBinteger function nf_put_vara_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), real \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), doubleprecision \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*4 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vara_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character* \fIout\fP(1))\fR + + +.sp +Writes an array section of values into a netCDF variable of an open +netCDF dataset, which must be in data mode. The array section is specified +by the \fIstart\fP and \fIcount\fP vectors, which give the starting index +and count of values along each dimension of the specified variable. +The type of the data is +specified in the function name and is converted to the external type +of the specified variable, if possible, otherwise an \fBNF_ERANGE\fR +error is returned. +.HP +\fBinteger function nf_get_vara_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character*(*) \fIin\fP)\fR + +.HP +\fBinteger function nf_get_vara_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIin\fP(1))\fR + +.HP +\fBinteger function nf_get_vara_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), real \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), doubleprecision \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*4 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vara_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), character* \fIin\fP(1))\fR + + +.sp +Reads an array section of values from a netCDF variable of an open +netCDF dataset, which must be in data mode. The array section is specified +by the \fIstart\fP and \fIcount\fP vectors, which give the starting index +and count of values along each dimension of the specified variable. +The data is converted from the external type of the specified variable, +if necessary, to the type specified in the function name. If conversion is +not possible, an \fBNF_ERANGE\fR error is returned. +.SH "WRITING AND READING A SLICED ARRAY" +.LP +.HP +\fBinteger function nf_put_vars_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character*(*) \fIout\fP)\fR + +.HP +\fBinteger function nf_put_vars_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer \fIout\fP(1))\fR + +.HP +\fBinteger function nf_put_vars_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), real \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), doubleprecision \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*4 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_vars_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character* \fIout\fP(1))\fR + + +.sp +These functions are used for \fIstrided output\fP, which is like the +array section output described above, except that +the sampling stride (the interval between accessed values) is +specified for each dimension. +For an explanation of the sampling stride +vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.HP +\fBinteger function nf_get_vars_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character*(*) \fIin\fP)\fR + +.HP +\fBinteger function nf_get_vars_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer \fIin\fP(1))\fR + +.HP +\fBinteger function nf_get_vars_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), real \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), doubleprecision \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*4 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_vars_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), character* \fIin\fP(1))\fR + + +.sp +These functions are used for \fIstrided input\fP, which is like the +array section input described above, except that +the sampling stride (the interval between accessed values) is +specified for each dimension. +For an explanation of the sampling stride +vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.SH "WRITING AND READING A MAPPED ARRAY" +.LP +.HP +\fBinteger function nf_put_varm_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character*(*) \fIout\fP)\fR + +.HP +\fBinteger function nf_put_varm_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer \fIout\fP(1))\fR + +.HP +\fBinteger function nf_put_varm_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, real \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, doubleprecision \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*4 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_varm_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character* \fIout\fP(1))\fR + + +.sp +These functions are used for \fImapped output\fP, which is like +strided output described above, except that an additional index mapping +vector is provided to specify the in-memory arrangement of the data +values. +For an explanation of the index +mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.HP +\fBinteger function nf_get_varm_text(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character*(*) \fIin\fP)\fR + +.HP +\fBinteger function nf_get_varm_int1(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_int2(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_int(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer \fIin\fP(1))\fR + +.HP +\fBinteger function nf_get_varm_real(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, real \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_double(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, doubleprecision \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_ubyte(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_ushort(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_uint(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*4 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_uint64(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_varm_string(integer \fIncid\fP, integer \fIvarid\fP, integer \fIstart\fP(1), integer \fIcount\fP(1), integer \fIstride\fP(1), \fIimap\fP, character* \fIin\fP(1))\fR + + +.sp +These functions are used for \fImapped input\fP, which is like +strided input described above, except that an additional index mapping +vector is provided to specify the in-memory arrangement of the data +values. +For an explanation of the index +mapping vector, see COMMON ARGUMENTS DESCRIPTIONS below. +.SH "ATTRIBUTES" +.LP +.HP +\fBinteger function nf_put_att_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, character*(*) \fIout\fP)\fR + +.HP +\fBinteger function nf_put_att_int1(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_int2(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_int(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer \fIout\fP(1))\fR + +.HP +\fBinteger function nf_put_att_real(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, real \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_double(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, doubleprecision \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_ubyte(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*1 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_ushort(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*2 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_uint(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*4 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_uint64(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, integer*8 \fIout\fP(1))\fR +.HP +\fBinteger function nf_put_att_string(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, character* \fIout\fP(1))\fR + + +.HP +\fBinteger function nf_put_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP, void * \fIip\fP)\fR +.HP +\fBinteger function nf_get_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, void * \fIip\fP)\fR +.sp +Unlike variables, attributes do not have +separate functions for defining and writing values. +This family of functions defines a new attribute with a value or changes +the value of an existing attribute. +If the attribute is new, or if the space required to +store the attribute value is greater than before, +the netCDF dataset must be in define mode. +The parameter \fIlen\fP is the number of values from \fIout\fP to transfer. +It is often one, except that for +\fBnf_put_att_text(\|)\fR it will usually be +\fBlen_trim(\fIout\fP)\fR. +.sp +For these functions, the type component of the function name refers to +the in-memory type of the value, whereas the \fIxtype\fP argument refers to the +external type for storing the value. An \fBNF_ERANGE\fR +error results if +a conversion between these types is not possible. In this case the value +is represented with the appropriate fill-value for the associated +external type. +.HP +\fBinteger function nf_inq_attname(integer \fIncid\fP, integer \fIvarid\fP, integer \fIattnum\fP, character*(*) \fIname\fP)\fR +.sp +Gets the +name of an attribute, given its variable ID and attribute number. +This function is useful in generic applications that +need to get the names of all the attributes associated with a variable, +since attributes are accessed by name rather than number in all other +attribute functions. The number of an attribute is more volatile than +the name, since it can change when other attributes of the same variable +are deleted. The attributes for each variable are numbered +from 1 (the first attribute) to +\fInvatts\fP, +where \fInvatts\fP is +the number of attributes for the variable, as returned from a call to +\fBnf_inq_varnatts(\|)\fR. + +.HP +\fBinteger function nf_inq_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP, integer \fIlen\fP)\fR +.HP +\fBinteger function nf_inq_attid(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIattnum\fP)\fR +.HP +\fBinteger function nf_inq_atttype(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIxtype\fP)\fR +.HP +\fBinteger function nf_inq_attlen(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIlen\fP)\fR +.sp +These functions return information about a netCDF attribute, +given its variable ID and name. The information returned is the +external type in \fIxtype\fP +and the number of elements in the attribute as \fIlen\fP. + +.HP +\fBinteger function nf_copy_att(integer \fIncid\fP, integer \fIvarid_in\fP, character*(*) \fIname\fP, integer \fIncid_out\fP, integer \fIvarid_out\fP)\fR +.sp +Copies an +attribute from one netCDF dataset to another. It can also be used to +copy an attribute from one variable to another within the same netCDF. +\fIncid_in\fP is the netCDF ID of an input netCDF dataset from which the +attribute will be copied. +\fIvarid_in\fP +is the ID of the variable in the input netCDF dataset from which the +attribute will be copied, or \fBNF_GLOBAL\fR +for a global attribute. +\fIname\fP +is the name of the attribute in the input netCDF dataset to be copied. +\fIncid_out\fP +is the netCDF ID of the output netCDF dataset to which the attribute will be +copied. +It is permissible for the input and output netCDF ID's to be the same. The +output netCDF dataset should be in define mode if the attribute to be +copied does not already exist for the target variable, or if it would +cause an existing target attribute to grow. +\fIvarid_out\fP +is the ID of the variable in the output netCDF dataset to which the attribute will +be copied, or \fBNF_GLOBAL\fR to copy to a global attribute. +.HP +\fBinteger function nf_rename_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character*(*) \fInewname\fP)\fR +.sp +Changes the +name of an attribute. If the new name is longer than the original name, +the netCDF must be in define mode. You cannot rename an attribute to +have the same name as another attribute of the same variable. +\fIname\fP is the original attribute name. +\fInewname\fP +is the new name to be assigned to the specified attribute. If the new name +is longer than the old name, the netCDF dataset must be in define mode. +.HP +\fBinteger function nf_del_att(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP)\fR +.sp +Deletes an attribute from a netCDF dataset. The dataset must be in +define mode. +.HP +\fBinteger function nf_get_att_text(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character*(*) \fIin\fP)\fR + +.HP +\fBinteger function nf_get_att_int1(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_int2(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_int(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer \fIin\fP(1))\fR + +.HP +\fBinteger function nf_get_att_real(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, real \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_double(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, doubleprecision \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_ubyte(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*1 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_ushort(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*2 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_uint(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*4 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_uint64(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, integer*8 \fIin\fP(1))\fR +.HP +\fBinteger function nf_get_att_string(integer \fIncid\fP, integer \fIvarid\fP, character*(*) \fIname\fP, character* \fIin\fP(1))\fR + + +.sp +Gets the value(s) of a netCDF attribute, given its +variable ID and name. Converts from the external type to the type +specified in +the function name, if possible, otherwise returns an \fBNF_ERANGE\fR +error. +All elements of the vector of attribute +values are returned, so you must allocate enough space to hold +them. If you don't know how much space to reserve, call +\fBnf_inq_attlen(\|)\fR +first to find out the length of the attribute. +.SH "COMMON ARGUMENT DESCRIPTIONS" +.LP +In this section we define some common arguments which are used in the +"FUNCTION DESCRIPTIONS" section. +.TP +integer \fIncid\fP +is the netCDF ID returned from a previous, successful call to +\fBnf_open(\|)\fR or \fBnf_create(\|)\fR +.TP +character*(*) \fIname\fP +is the name of a dimension, variable, or attribute. The names of +dimensions, variables and attributes consist of arbitrary +sequences of alphanumeric characters (as well as underscore '_', +period '.' and hyphen '-'), beginning with a letter or +underscore. (However names commencing with underscore are reserved for +system use.) Case is significant in netCDF names. A zero-length name +is not allowed. + +The maximum allowable number of characters + is \fBNF_MAX_NAME\fR. +.TP +integer \fIxtype\fP +specifies the external data type of a netCDF variable or attribute and +is one of the following: +\fBNF_BYTE\fR, \fBNF_CHAR\fR, \fBNF_SHORT\fR, \fBNF_INT\fR, +\fBNF_FLOAT\fR, or \fBNF_DOUBLE\fR. +These are used to specify 8-bit integers, +characters, 16-bit integers, 32-bit integers, 32-bit IEEE floating point +numbers, and 64-bit IEEE floating-point numbers, respectively. + +.TP +integer \fIdimids\fP(1) +is a vector of dimension ID's and defines the shape of a netCDF variable. +The size of the vector shall be greater than or equal to the +rank (i.e. the number of dimensions) of the variable (\fIndims\fP). +The vector shall be ordered by the speed with which a dimension varies: +\fIdimids\fP(1) +shall be the dimension ID of the most rapidly +varying dimension and +\fIdimids\fP(\fIndims\fP) +shall be the dimension ID of the most slowly +varying dimension. +The maximum possible number of +dimensions for a variable is given by the symbolic constant +\fBNF_MAX_VAR_DIMS\fR. +.TP +integer \fIdimid\fP +is the ID of a netCDF dimension. +netCDF dimension ID's are allocated sequentially from the +positive +integers beginning with 1. +.TP +integer \fIndims\fP +is either the total number of dimensions in a netCDF dataset or the rank +(i.e. the number of dimensions) of a netCDF variable. +The value shall not be negative or greater than the symbolic constant +\fBNF_MAX_VAR_DIMS\fR. +.TP +integer \fIvarid\fP +is the ID of a netCDF variable or (for the attribute-access functions) +the symbolic constant +\fBNF_GLOBAL\fR, +which is used to reference global attributes. +netCDF variable ID's are allocated sequentially from the +positive +integers beginning with 1. +.TP +integer \fInatts\fP +is the number of global attributes in a netCDF dataset for the +\fBnf_inquire(\|)\fR +function or the number +of attributes associated with a netCDF variable for the +\fBnf_varinq(\|)\fR +function. +.TP +integer \fIindex\fP(1) +specifies the indicial coordinates of the netCDF data value to be accessed. +The indices start at 1; +thus, for example, the first data value of a +two-dimensional variable is (1,1). +The size of the vector shall be at least the rank of the associated +netCDF variable and its elements shall correspond, in order, to the +variable's dimensions. +.TP +integer \fIstart\fP(1) +specifies the starting point +for accessing a netCDF variable's data values +in terms of the indicial coordinates of +the corner of the array section. +The indices start at 1; +thus, the first data +value of a variable is (1, 1, ..., 1). +The size of the vector shall be at least the rank of the associated +netCDF variable and its elements shall correspond, in order, to the +variable's dimensions. +.TP +integer \fIcount\fP(1) +specifies the number of indices selected along each dimension of the +array section. +Thus, to access a single value, for example, specify \fIcount\fP as +(1, 1, ..., 1). +Note that, for strided I/O, this argument must be adjusted +to be compatible with the \fIstride\fP and \fIstart\fP arguments so that +the interaction of the +three does not attempt to access an invalid data co-ordinate. +The elements of the +\fIcount\fP vector correspond, in order, to the variable's dimensions. +.TP +integer \fIstride\fP(1) +specifies the sampling interval along each dimension of the netCDF +variable. The elements of the stride vector correspond, in order, +to the netCDF variable's dimensions (\fIstride\fP(1)) +gives the sampling interval along the most rapidly +varying dimension of the netCDF variable). Sampling intervals are +specified in type-independent units of elements (a value of 1 selects +consecutive elements of the netCDF variable along the corresponding +dimension, a value of 2 selects every other element, etc.). + +.TP +\fIimap\fP +specifies the mapping between the dimensions of a netCDF variable and +the in-memory structure of the internal data array. The elements of +the index mapping vector correspond, in order, to the netCDF variable's +dimensions (\fIimap\fP(1) gives the distance +between elements of the internal array corresponding to the most +rapidly varying dimension of the netCDF variable). +Distances between elements are specified in type-independent units of +elements (the distance between internal elements that occupy adjacent +memory locations is 1 and not the element's byte-length as in netCDF 2). + +.SH "VARIABLE PREFILLING" +.LP +By default, the netCDF interface sets the values of +all newly-defined variables of finite length (i.e. those that do not have +an unlimited, dimension) to the type-dependent fill-value associated with each +variable. This is done when \fBnf_enddef(\|)\fR +is called. The +fill-value for a variable may be changed from the default value by +defining the attribute `\fB_FillValue\fR' for the variable. This +attribute must have the same type as the variable and be of length one. +.LP +Variables with an unlimited dimension are also prefilled, but on +an `as needed' basis. For example, if the first write of such a +variable is to position 5, then +positions +1 through 4 +(and no others) +would be set to the fill-value at the same time. +.LP +This default prefilling of data values may be disabled by +or'ing the +\fBNF_NOFILL\fR +flag into the mode parameter of \fBnf_open(\|)\fR or \fBnf_create(\|)\fR, +or, by calling the function \fBnf_set_fill(\|)\fR +with the argument \fBNF_NOFILL\fR. +For variables that do not use the unlimited dimension, +this call must +be made before +\fBnf_enddef(\|)\fR. +For variables that +use the unlimited dimension, this call +may be made at any time. +.LP +One can obtain increased performance of the netCDF interface by using +this feature, but only at the expense of requiring the application to set +every single data value. The performance +enhancing behavior of this function is dependent on the particulars of +the implementation and dataset format. +The flag value controlled by \fBnf_set_fill(\|)\fR +is per netCDF ID, +not per variable or per write. +Allowing this to change affects the degree to which +a program can be effectively parallelized. +Given all of this, we state that the use +of this feature may not be available (or even needed) in future +releases. Programmers are cautioned against heavy reliance upon this +feature. +.HP +\fBinteger function nf_setfill(integer \fIncid\fP, integer \fIfillmode\fP, integer \fIold_fillemode\fP)\fR + +.sp +Determines whether or not variable prefilling will be done (see +above). +The netCDF dataset shall be writable. +\fIfillmode\fP is either \fBNF_FILL\fR +to enable prefilling (the +default) or \fBNF_NOFILL\fR +to disable prefilling. +This function returns the previous setting in \fIold_fillmode\fP. + +.HP +.SH "MPP FUNCTION DESCRIPTIONS" +.LP +Additional functions for use on SGI/Cray MPP machines (_CRAYMPP). +These are used to set and inquire which PE is the base for MPP +for a particular netCDF. These are only relevant when +using the SGI/Cray ``global'' +Flexible File I/O layer and desire to have +only a subset of PEs to open the specific netCDF file. +For technical reasons, these functions are available on all platforms. +On a platform other than SGI/Cray MPP, it is as if +only processor available were processor 0. +.LP +To use this feature, you need to specify a communicator group and call +\fBglio_group_mpi(\|)\fR or \fBglio_group_shmem(\|)\fR prior to the netCDF +\fBnf_open(\|)\fR and \fBnf_create(\|)\fR calls. +.HP +\fBinteger function nf__create_mp(character*(*) \fIpath\fP, integer \fIcmode\fP, integer \fIinitialsize\fP, integer \fIpe\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR +.sp +Like \fBnf__create(\|)\fR but allows the base PE to be set. +.sp +The argument \fIpe\fP sets the base PE at creation time. In the MPP +environment, \fBnf__create(\|)\fR and \fBnf_create(\|)\fR set the base PE to processor +zero by default. +.HP +\fBinteger function nf__open_mp(character*(*) \fIpath\fP, integer \fImode\fP, integer \fIpe\fP, integer \fIchunksize\fP, integer \fIncid\fP)\fR +.sp +Like \fBnf__open(\|)\fR but allows the base PE to be set. +The argument \fIpe\fP sets the base PE at creation time. In the MPP +environment, \fBnf__open(\|)\fR and \fBnf_open(\|)\fR set the base PE to processor +zero by default. +.HP +\fBinteger function nf_inq_base_pe(integer \fIncid\fP, integer \fIpe\fP)\fR +.sp +Inquires of the netCDF dataset which PE is being used as the base for MPP use. +This is safe to use at any time. +.HP +\fBinteger function nf_set_base_pe(integer \fIncid\fP, integer \fIpe\fP)\fR +.sp +Resets the base PE for the netCDF dataset. +Only perform this operation when the affected communicator group +synchronizes before and after the call. +This operation is very risky and should only be contemplated +under only the most extreme cases. +.SH "ENVIRONMENT VARIABLES" +.TP 4 +.B NETCDF_FFIOSPEC +Specifies the Flexible File I/O buffers for netCDF I/O when executing +under the UNICOS operating system (the variable is ignored on other +operating systems). +An appropriate specification can greatly increase the efficiency of +netCDF I/O -- to the extent that it can actually surpass FORTRAN binary +I/O. +This environment variable has been made a little more generalized, +such that other FFIO option specifications can now be added. +The default specification is \fBbufa:336:2\fP, +unless a current FFIO specification is in operation, +which will be honored. +See UNICOS Flexible File I/O for more information. +.SH "MAILING-LISTS" +.LP +Both a mailing list and a digest are available for +discussion of the netCDF interface and announcements about netCDF bugs, +fixes, and enhancements. +To begin or change your subscription to either the mailing-list or the +digest, send one of the following in the body (not +the subject line) of an email message to "majordomo@unidata.ucar.edu". +Use your email address in place of \fIjdoe@host.inst.domain\fP. +.sp +To subscribe to the netCDF mailing list: +.RS +\fBsubscribe netcdfgroup \fIjdoe@host.inst.domain\fR +.RE +To unsubscribe from the netCDF mailing list: +.RS +\fBunsubscribe netcdfgroup \fIjdoe@host.inst.domain\fR +.RE +To subscribe to the netCDF digest: +.RS +\fBsubscribe netcdfdigest \fIjdoe@host.inst.domain\fR +.RE +To unsubscribe from the netCDF digest: +.RS +\fBunsubscribe netcdfdigest \fIjdoe@host.inst.domain\fR +.RE +To retrieve the general introductory information for the mailing list: +.RS +\fBinfo netcdfgroup\fR +.RE +To get a synopsis of other majordomo commands: +.RS +\fBhelp\fR +.RE +.SH "SEE ALSO" +.LP +.BR ncdump (1), +.BR ncgen (1), +.BR netcdf (3f). +.LP +\fInetCDF User's Guide\fP, published +by the Unidata Program Center, University Corporation for Atmospheric +Research, located in Boulder, Colorado. + +NetCDF home page at http:/www.unidata.ucar.edu/netcdf. diff --git a/privatemodules/nc4/share/man/man3/zlib.3 b/privatemodules/nc4/share/man/man3/zlib.3 new file mode 100644 index 0000000000000000000000000000000000000000..0160e62b69f419e1eb903cf1d323c07e1ec19936 --- /dev/null +++ b/privatemodules/nc4/share/man/man3/zlib.3 @@ -0,0 +1,151 @@ +.TH ZLIB 3 "28 Apr 2013" +.SH NAME +zlib \- compression/decompression library +.SH SYNOPSIS +[see +.I zlib.h +for full description] +.SH DESCRIPTION +The +.I zlib +library is a general purpose data compression library. +The code is thread safe, assuming that the standard library functions +used are thread safe, such as memory allocation routines. +It provides in-memory compression and decompression functions, +including integrity checks of the uncompressed data. +This version of the library supports only one compression method (deflation) +but other algorithms may be added later +with the same stream interface. +.LP +Compression can be done in a single step if the buffers are large enough +or can be done by repeated calls of the compression function. +In the latter case, +the application must provide more input and/or consume the output +(providing more output space) before each call. +.LP +The library also supports reading and writing files in +.IR gzip (1) +(.gz) format +with an interface similar to that of stdio. +.LP +The library does not install any signal handler. +The decoder checks the consistency of the compressed data, +so the library should never crash even in the case of corrupted input. +.LP +All functions of the compression library are documented in the file +.IR zlib.h . +The distribution source includes examples of use of the library +in the files +.I test/example.c +and +.IR test/minigzip.c, +as well as other examples in the +.IR examples/ +directory. +.LP +Changes to this version are documented in the file +.I ChangeLog +that accompanies the source. +.LP +.I zlib +is available in Java using the java.util.zip package: +.IP +http://java.sun.com/developer/technicalArticles/Programming/compression/ +.LP +A Perl interface to +.IR zlib , +written by Paul Marquess (pmqs@cpan.org), +is available at CPAN (Comprehensive Perl Archive Network) sites, +including: +.IP +http://search.cpan.org/~pmqs/IO-Compress-Zlib/ +.LP +A Python interface to +.IR zlib , +written by A.M. Kuchling (amk@magnet.com), +is available in Python 1.5 and later versions: +.IP +http://docs.python.org/library/zlib.html +.LP +.I zlib +is built into +.IR tcl: +.IP +http://wiki.tcl.tk/4610 +.LP +An experimental package to read and write files in .zip format, +written on top of +.I zlib +by Gilles Vollant (info@winimage.com), +is available at: +.IP +http://www.winimage.com/zLibDll/minizip.html +and also in the +.I contrib/minizip +directory of the main +.I zlib +source distribution. +.SH "SEE ALSO" +The +.I zlib +web site can be found at: +.IP +http://zlib.net/ +.LP +The data format used by the zlib library is described by RFC +(Request for Comments) 1950 to 1952 in the files: +.IP +http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format) +.br +http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format) +.br +http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format) +.LP +Mark Nelson wrote an article about +.I zlib +for the Jan. 1997 issue of Dr. Dobb's Journal; +a copy of the article is available at: +.IP +http://marknelson.us/1997/01/01/zlib-engine/ +.SH "REPORTING PROBLEMS" +Before reporting a problem, +please check the +.I zlib +web site to verify that you have the latest version of +.IR zlib ; +otherwise, +obtain the latest version and see if the problem still exists. +Please read the +.I zlib +FAQ at: +.IP +http://zlib.net/zlib_faq.html +.LP +before asking for help. +Send questions and/or comments to zlib@gzip.org, +or (for the Windows DLL version) to Gilles Vollant (info@winimage.com). +.SH AUTHORS +Version 1.2.8 +Copyright (C) 1995-2013 Jean-loup Gailly (jloup@gzip.org) +and Mark Adler (madler@alumni.caltech.edu). +.LP +This software is provided "as-is," +without any express or implied warranty. +In no event will the authors be held liable for any damages +arising from the use of this software. +See the distribution directory with respect to requirements +governing redistribution. +The deflate format used by +.I zlib +was defined by Phil Katz. +The deflate and +.I zlib +specifications were written by L. Peter Deutsch. +Thanks to all the people who reported problems and suggested various +improvements in +.IR zlib ; +who are too numerous to cite here. +.LP +UNIX manual page by R. P. C. Rodgers, +U.S. National Library of Medicine (rodgers@nlm.nih.gov). +.\" end of man page diff --git a/privatemodules/null b/privatemodules/null new file mode 100644 index 0000000000000000000000000000000000000000..892eb49719b9f0a176e75befb4a19dc56481077d --- /dev/null +++ b/privatemodules/null @@ -0,0 +1,19 @@ +#%Module######################################################################## +## +## null modulefile +## +proc ModulesHelp { } { + global version + + puts stderr " This module does absolutely nothing." + puts stderr " It's meant simply as a place holder in your" + puts stderr " dot file initialization." + puts stderr " + Version $version +" +} + +module-whatis "does absolutely nothing" + +# for Tcl script use only +set version 3.2.10 diff --git a/privatemodules/python/wp b/privatemodules/python/wp new file mode 100644 index 0000000000000000000000000000000000000000..a6d8c8a98ca072762a9ecab66b18386ecbf7c6b9 --- /dev/null +++ b/privatemodules/python/wp @@ -0,0 +1,17 @@ +#%Module###################################### +# note that this is read by a Tcl interpretor +# +proc ModulesHelp { } { +} + +module-whatis "loads the environment for python2.7" + +set pyver 2.7.5 + +# These two conflict because MacPorts makes gcc libraries available for dynamic linking + +module load python/$pyver +conflict python/2.7.8 + +set-alias "ipy" "ipython --pylab" + diff --git a/privatemodules/tm5/mpi b/privatemodules/tm5/mpi new file mode 100644 index 0000000000000000000000000000000000000000..eff9b2865a44ed257395e03477e1c93ebec6adbe --- /dev/null +++ b/privatemodules/tm5/mpi @@ -0,0 +1,54 @@ +#%Module###################################### +# note that this is read by a Tcl interpretor +# + +module-whatis "loads the Intel Compiler + MPI environment for use with TM5 parallel" + +set iccver [module-info version icc] +set ifortver [module-info version ifort] + +set mod_intel fortran/intel/14.0.2 +set mod_hdf4 hdf4/intel/4.2.9 +set mod_szip szip/intel +set mod_hdf5 hdf5/serial/intel/1.8.10-patch1 +set mod_cdf netcdf/impi/intel/4.1.3 +set mod_cdff netcdf-fortran/serial/intel +set mod_hdf5_par hdf5/impi/intel/1.8.9 +#set mod_cdf_par netcdf-c/impi/intel/4.3.1.1 +#set mod_cdff_par netcdf-fortran/impi/intel +setenv SURFSARA_NETCDFC_ROOT /hpc/sw/netcdf-4.1.3-intel-impi-par/ +setenv SURFSARA_NETCDFC_INCLUDE /hpc/sw/netcdf-4.1.3-intel-impi-par/include/ +setenv SURFSARA_NETCDFC_LIB /hpc/sw/netcdf-4.1.3-intel-impi-par/lib/ +setenv SURFSARA_NETCDFF_ROOT /hpc/sw/netcdf-4.1.3-intel-impi-par/ +setenv SURFSARA_NETCDFF_INCLUDE /hpc/sw/netcdf-4.1.3-intel-impi-par/include/ +setenv SURFSARA_NETCDFF_LIB /hpc/sw/netcdf-4.1.3-intel-impi-par/lib/ + +if { [ expr [module-info mode load] || [module-info mode display] || [module-info mode switch] ] } { + module load $mod_intel + module load $mod_hdf4 + + if [ is-loaded $mod_cdf ] { + module unload $mod_cdf +} + + if [ is-loaded $mod_hdf5 ] { + module unload $mod_hdf5 +} + +module load $mod_szip +module load $mod_hdf5_par +#module load $mod_cdff_par +#module load $mod_cdf_par +setenv UDUNITS_PATH /home/ivdvelde/local/udunits/etc/udunits.dat +prepend-path PATH /home/ivdvelde/local + +} + +if [ module-info mode remove ] { + module del $mod_intel + module del $mod_hdf4 + module del $mod_szip + module del $mod_hdf5_par + #module del $mod_cdf_par + #module del $mod_cdff_par +} diff --git a/privatemodules/tm5/serial b/privatemodules/tm5/serial new file mode 100644 index 0000000000000000000000000000000000000000..c57e98483abd80dd881404c63b37656fcbbeb341 --- /dev/null +++ b/privatemodules/tm5/serial @@ -0,0 +1,49 @@ +#%Module###################################### +# note that this is read by a Tcl interpretor +# + +module-whatis "loads the Intel Compiler environment for use with TM5 in serial mode" + +set iccver [module-info version icc] +set ifortver [module-info version ifort] + +set mod_intel fortran/intel/14.0.2 +set mod_hdf4 hdf4/intel/4.2.9 +set mod_szip szip/intel +#set mod_hdf5 hdf5/serial/intel +set mod_hdf5 hdf5/serial/intel/1.8.10-patch1 +set mod_cdf netcdf/serial/intel/4.1.3 +set mod_cdff netcdf-fortran/serial/intel +#set mod_hdf5_par hdf5/impi/intel +set mod_hdf5_par hdf5/impi/intel/1.8.10-patch1 +set mod_cdf_par netcdf/impi/intel + +if { [ expr [module-info mode load] || [module-info mode display] || [module-info mode switch] ] } { + module load $mod_intel + module load $mod_hdf4 + if [ is-loaded $mod_cdf_par ] { + module unload $mod_cdf_par +} + + if [ is-loaded $mod_hdf5_par ] { + module unload $mod_hdf5_par +} + module unload python + module load $mod_szip + module load $mod_hdf5 + module load $mod_cdf + module load $mod_cdff + module load python/wp + setenv UDUNITS_PATH /home/ivdvelde/local/udunits/etc/udunits.dat + prepend-path PATH /home/ivdvelde/local +} + +if [ module-info mode remove ] { + module del $mod_intel + module del $mod_cdf + module del $mod_cdff + module del $mod_hdf4 + module del $mod_szip + module del $mod_hdf5 + module del python/wp +} diff --git a/sib4v2 b/sib4v2 new file mode 160000 index 0000000000000000000000000000000000000000..ecdb7f22918de1252ae129e454781371110b9ac1 --- /dev/null +++ b/sib4v2 @@ -0,0 +1 @@ +Subproject commit ecdb7f22918de1252ae129e454781371110b9ac1